You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ap...@apache.org on 2008/06/26 06:23:58 UTC

svn commit: r671723 - in /ofbiz/trunk/framework: example/widget/example/ images/webapp/images/ widget/dtd/ widget/src/org/ofbiz/widget/form/ widget/src/org/ofbiz/widget/html/

Author: apatel
Date: Wed Jun 25 21:23:57 2008
New Revision: 671723

URL: http://svn.apache.org/viewvc?rev=671723&view=rev
Log:
Adding Autocompleter options to form widget dropdown. More improvements to come. 

Modified:
    ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml
    ofbiz/trunk/framework/example/widget/example/ExampleForms.xml
    ofbiz/trunk/framework/images/webapp/images/selectall.js
    ofbiz/trunk/framework/widget/dtd/widget-form.xsd
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java
    ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java

Modified: ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml?rev=671723&r1=671722&r2=671723&view=diff
==============================================================================
--- ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml (original)
+++ ofbiz/trunk/framework/example/widget/example/ExampleAjaxScreens.xml Wed Jun 25 21:23:57 2008
@@ -24,6 +24,7 @@
     <screen name="AjaxExample">
         <section>
             <actions>
+                <set field="layoutSettings.styleSheets[+0]" value="/images/prototypejs/scriptaculouscontrols.css" global="true"/>
                 <set field="headerItem" value="AjaxExample"/>
                 <set field="titleProperty" value="PageTitleFindExample"/>
                 <set field="exampleCtx" from-field="parameters"/>

Modified: ofbiz/trunk/framework/example/widget/example/ExampleForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/example/widget/example/ExampleForms.xml?rev=671723&r1=671722&r2=671723&view=diff
==============================================================================
--- ofbiz/trunk/framework/example/widget/example/ExampleForms.xml (original)
+++ ofbiz/trunk/framework/example/widget/example/ExampleForms.xml Wed Jun 25 21:23:57 2008
@@ -125,6 +125,23 @@
         have these settings. -->
     <form name="EditExampleBackgroundSubmit" type="single" extends="EditExample" target="updateExampleAjax">
         <alt-target use-when="example==null" target="createExampleAjax"/>
+        <field name="exampleTypeId" title="${uiLabelMap.CommonType}" id-name="exampleTypeId">
+            <drop-down allow-empty="false">
+                <auto-complete/>
+                <entity-options entity-name="ExampleType" description="${description}">
+                    <entity-order-by field-name="description"/>
+                </entity-options>
+            </drop-down>
+        </field>
+        <field name="statusId" use-when="example==null" title="${uiLabelMap.CommonStatus}" id-name="statusId">
+            <drop-down allow-empty="false">
+                <auto-complete/>
+                <entity-options entity-name="StatusItem" description="${description}">
+                    <entity-constraint name="statusTypeId" value="EXAMPLE_STATUS"/>
+                    <entity-order-by field-name="sequenceId"/>
+                </entity-options>
+            </drop-down>
+        </field>
         <on-event-update-area event-type="submit" area-id="ListExamplesAjax" area-target="ListExampleFormOnly"/>
     </form>
 

Modified: ofbiz/trunk/framework/images/webapp/images/selectall.js
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/images/webapp/images/selectall.js?rev=671723&r1=671722&r2=671723&view=diff
==============================================================================
--- ofbiz/trunk/framework/images/webapp/images/selectall.js (original)
+++ ofbiz/trunk/framework/images/webapp/images/selectall.js Wed Jun 25 21:23:57 2008
@@ -323,6 +323,29 @@
     }
 }
 
+/** Enable auto-completion for dorp-down elements.
+  * @param areaId The id of the drop-down
+  * @param data Choices for Autocompleter.Local
+  * @param options
+*/
+
+function ajaxAutoCompleteDropDown(element, data, options) {
+    var key = [];
+    var description = [];
+    for (var i=0; i < data.length; i++) {
+        currData = data[i];
+        key[i] = currData[0];
+        description[i] = currData[1];
+    }
+	var update = element + "_autoCompleterOptions";
+    $(element).insert({after: '<div class="autocomplete"' + 'id=' + update + '></div>'});
+    new Autocompleter.Local($(element), update, description, {autoSelect: options.autoSelect, frequency: options.frequency, minChars: options.minChars, choices: options.choices, partialSearch: options.partialSearch, partialChars: options.partialChars, ignoreCase: options.ignoreCase, fullSearch: options.fullSearch, afterUpdateElement: setKeyAsParameter});
+    
+    function setKeyAsParameter() {
+        $(element).value = key[description.indexOf($F(element))];
+    }
+}
+
 /** Toggle area visibility on/off.
   * @param link The <a> element calling this function
   * @param areaId The id of the HTML container to toggle

Modified: ofbiz/trunk/framework/widget/dtd/widget-form.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/dtd/widget-form.xsd?rev=671723&r1=671722&r2=671723&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/dtd/widget-form.xsd (original)
+++ ofbiz/trunk/framework/widget/dtd/widget-form.xsd Wed Jun 25 21:23:57 2008
@@ -612,6 +612,7 @@
     <xs:element name="drop-down" substitutionGroup="AllFields">
         <xs:complexType>
             <xs:sequence>
+                <xs:element ref="auto-complete" minOccurs="0" maxOccurs="1"/>
                 <xs:choice minOccurs="0" maxOccurs="unbounded">
                     <xs:element ref="entity-options"/>
                     <xs:element ref="list-options"/>
@@ -623,15 +624,6 @@
         </xs:complexType>
     </xs:element>
     <xs:attributeGroup name="attlist.drop-down">
-        <xs:attribute name="type" default="traditional">
-            <xs:simpleType>
-                <xs:restriction base="xs:token">
-                    <xs:enumeration value="traditional"/>
-                    <xs:enumeration value="auto-complete-server"/>
-                    <!-- <xs:enumeration value="auto-complete-client"/> something to consider for the future -->
-                </xs:restriction>
-            </xs:simpleType>
-        </xs:attribute>
         <xs:attribute name="allow-empty" default="false">
             <xs:simpleType>
                 <xs:restriction base="xs:token">
@@ -1008,6 +1000,49 @@
     </xs:attributeGroup>
 
     <!-- ================== FIELD SUB-ELEMENTS ==================== -->
+    <xs:element name="auto-complete">
+        <xs:complexType>
+            <xs:attributeGroup ref="attlist.auto-complete"/>
+        </xs:complexType>
+    </xs:element>
+    <xs:attributeGroup name="attlist.auto-complete">
+        <xs:attribute name="auto-select" default="false">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:integer" name="frequency" default="0.4"/>
+        <xs:attribute type="xs:positiveInteger" name="min-chars" default="1"/>
+        <xs:attribute type="xs:positiveInteger" name="choices" default="10"/>
+        <xs:attribute name="partial-search" default="true">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute type="xs:positiveInteger" name="partial-chars" default="2"/>
+        <xs:attribute name="ignore-case" default="true">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+        <xs:attribute name="full-search" default="false">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="true"/>
+                    <xs:enumeration value="false"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
+    </xs:attributeGroup>
     <xs:element name="entity-constraint">
         <xs:complexType>
             <xs:attributeGroup ref="attlist.entity-constraint"/>

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java?rev=671723&r1=671722&r2=671723&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/form/ModelFormField.java Wed Jun 25 21:23:57 2008
@@ -2197,6 +2197,92 @@
             this.useWhen = new FlexibleStringExpander(string);
         }
     }
+    
+    public static class AutoComplete {
+    	protected String autoSelect;
+    	protected String frequency;
+    	protected String minChars;
+    	protected String choices;
+    	protected String partialSearch;
+    	protected String partialChars;
+    	protected String ignoreCase;
+    	protected String fullSearch;
+    	
+    	public AutoComplete(Element element) {
+    		this.autoSelect = element.getAttribute("auto-select");
+    		this.frequency = element.getAttribute("frequency");
+    		this.minChars = element.getAttribute("min-chars");
+    		this.choices = element.getAttribute("choices");
+    		this.partialSearch = element.getAttribute("partial-search");
+    		this.partialChars = element.getAttribute("partial-chars");
+    		this.ignoreCase = element.getAttribute("ignore-case");
+    		this.fullSearch = element.getAttribute("full-search");
+    	}
+    	
+    	public String getAutoSelect() {
+    		return this.autoSelect;
+    	}
+    	
+    	public String getFrequency() {
+    		return this.frequency;
+    	}
+    	
+    	public String getMinChars() {
+    		return this.minChars;
+    	}
+    	
+    	public String getChoices() {
+    		return this.choices;
+    	}
+    	
+    	public String getPartialSearch() {
+    		return this.partialSearch;
+    	}
+    	
+    	public String getPartialChars() {
+    		return this.partialChars;
+    	}
+    	
+    	public String getIgnoreCase() {
+    		return this.ignoreCase;
+    	}
+    	
+    	public String getFullSearch() {
+    		return this.fullSearch;
+    	}
+    	
+    	public void setAutoSelect(String string) {
+    		this.autoSelect = string;
+    	}
+    	
+    	public void setFrequency(String string) {
+    		this.frequency = string;
+    	}
+    	
+    	public void setMinChars(String string) {
+    		this.minChars = string;
+    	}
+    	
+    	public void setChoices(String string) {
+    		this.choices = string;
+    	}
+    	
+    	public void setPartialSearch(String string) {
+    		this.partialSearch = string;
+    	}
+    	
+    	public void setPartialChars(String string) {
+    		this.partialChars = string;
+    	}
+    	
+    	public void setIgnoreCase(String string) {
+    		this.ignoreCase = string;
+    	}
+    	
+    	public void setFullSearch(String string) {
+    		this.fullSearch = string;
+    	}
+    }
 
     public static class TextField extends FieldInfo {
         protected int size = 25;
@@ -2575,6 +2661,7 @@
         protected FlexibleStringExpander currentDescription;
         protected SubHyperlink subHyperlink;
         protected int otherFieldSize = 0;
+        protected AutoComplete autoComplete;
 
         protected DropDownField() {
             super();
@@ -2615,6 +2702,11 @@
             if (subHyperlinkElement != null) {
                 this.subHyperlink = new SubHyperlink(subHyperlinkElement);
             }
+            
+            Element autoCompleteElement = UtilXml.firstChildElement(element, "auto-complete");
+            if (autoCompleteElement != null) {
+            	this.autoComplete = new AutoComplete(autoCompleteElement);
+            }
         }
 
         public void renderFieldString(Appendable writer, Map<String, Object> context, FormStringRenderer formStringRenderer) throws IOException {
@@ -2663,6 +2755,14 @@
             this.subHyperlink = newSubHyperlink;
         }
         
+        public AutoComplete getAutoComplete() {
+        	return this.autoComplete;
+        }
+        
+        public void setAutoComplete(AutoComplete newAutoComplete) {
+        	this.autoComplete = newAutoComplete;
+        }
+        
         public int getOtherFieldSize() {
             return this.otherFieldSize;   
         }

Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java?rev=671723&r1=671722&r2=671723&view=diff
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java (original)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/html/HtmlFormRenderer.java Wed Jun 25 21:23:57 2008
@@ -582,11 +582,18 @@
     public void renderDropDownField(Appendable writer, Map<String, Object> context, DropDownField dropDownField) throws IOException {
         ModelFormField modelFormField = dropDownField.getModelFormField();
         ModelForm modelForm = modelFormField.getModelForm();
+        ModelFormField.AutoComplete autoComplete = dropDownField.getAutoComplete();
+        boolean ajaxEnabled = autoComplete != null && this.javaScriptEnabled;
+        List allOptionValues = dropDownField.getAllOptionValues(context, modelForm.getDelegator(context));
 
         String event = modelFormField.getEvent();
         String action = modelFormField.getAction(context);
 
-        writer.append("<select");
+        if (ajaxEnabled) {
+        	writer.append("<input type=\"text\"");
+        } else {
+        	writer.append("<select");
+        }
 
         appendClassNames(writer, context, modelFormField);
 
@@ -600,129 +607,155 @@
             writer.append(idName);
             writer.append('"');
         }
-
-        if (dropDownField.isAllowMultiple()) {
-            writer.append(" multiple=\"multiple\"");
-        }
         
-        int otherFieldSize = dropDownField.getOtherFieldSize();
-        String otherFieldName = dropDownField.getParameterNameOther(context);
-        if (otherFieldSize > 0) {
-            //writer.append(" onchange=\"alert('ONCHANGE, process_choice:' + process_choice)\"");
-            //writer.append(" onchange='test_js()' ");
-            writer.append(" onchange=\"process_choice(this,document.");
-            writer.append(modelForm.getName());
-            writer.append(".");
-            writer.append(otherFieldName);
-            writer.append(")\" "); 
-        }
-
-
-        if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
-            writer.append(" ");
-            writer.append(event);
-            writer.append("=\"");
-            writer.append(action);
-            writer.append('"');
-        }
-
-        writer.append(" size=\"" + dropDownField.getSize() + "\">");
+        if (ajaxEnabled) {
+        	writer.append("/>");
+        	
+        	appendWhitespace(writer);
+            writer.append("<script language=\"JavaScript\" type=\"text/javascript\">");
+            appendWhitespace(writer);
+            writer.append("var data = [");
+            Iterator optionValueIter = allOptionValues.iterator();
+            int count = 0;
+            while (optionValueIter.hasNext()) {
+            	count++;
+                ModelFormField.OptionValue optionValue = (ModelFormField.OptionValue) optionValueIter.next();
+                writer.append("['"+optionValue.getKey()+"',");
+                writer.append(" '"+optionValue.getDescription()+"']");
+                if (count != allOptionValues.size()) {
+                	writer.append(", ");
+                }
+            }
+            writer.append("];");
+            appendWhitespace(writer);
+            writer.append("ajaxAutoCompleteDropDown('"+idName+"', data, {autoSelect: "+autoComplete.getAutoSelect()+", frequency: "+autoComplete.getFrequency()+", minChars: "+autoComplete.getMinChars()+", choices: "+autoComplete.getChoices()+", partialSearch: "+autoComplete.getPartialSearch()+", partialChars: "+autoComplete.getPartialChars()+", ignoreCase: "+autoComplete.getIgnoreCase()+", fullSearch: "+autoComplete.getFullSearch()+"});");
+            appendWhitespace(writer);
+            writer.append("</script>");
+        } else {
+        	if (dropDownField.isAllowMultiple()) {
+                writer.append(" multiple=\"multiple\"");
+            }
+            
+            int otherFieldSize = dropDownField.getOtherFieldSize();
+            String otherFieldName = dropDownField.getParameterNameOther(context);
+            if (otherFieldSize > 0) {
+                //writer.append(" onchange=\"alert('ONCHANGE, process_choice:' + process_choice)\"");
+                //writer.append(" onchange='test_js()' ");
+                writer.append(" onchange=\"process_choice(this,document.");
+                writer.append(modelForm.getName());
+                writer.append(".");
+                writer.append(otherFieldName);
+                writer.append(")\" "); 
+            }
 
-        String currentValue = modelFormField.getEntry(context);
-        List allOptionValues = dropDownField.getAllOptionValues(context, modelForm.getDelegator(context));
 
-        // if the current value should go first, stick it in
-        if (UtilValidate.isNotEmpty(currentValue) && "first-in-list".equals(dropDownField.getCurrent())) {
-            writer.append("<option");
-            writer.append(" selected=\"selected\"");
-            writer.append(" value=\"");
-            writer.append(currentValue);
-            writer.append("\">");
-            String explicitDescription = dropDownField.getCurrentDescription(context);
-            if (UtilValidate.isNotEmpty(explicitDescription)) {
-                writer.append(explicitDescription);
-            } else {
-                writer.append(ModelFormField.FieldInfoWithOptions.getDescriptionForOptionKey(currentValue, allOptionValues));
+            if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
+                writer.append(" ");
+                writer.append(event);
+                writer.append("=\"");
+                writer.append(action);
+                writer.append('"');
             }
-            writer.append("</option>");
 
-            // add a "separator" option
-            writer.append("<option value=\"");
-            writer.append(currentValue);
-            writer.append("\">---</option>");
-        }
+            writer.append(" size=\"" + dropDownField.getSize() + "\">");
 
-        // if allow empty is true, add an empty option
-        if (dropDownField.isAllowEmpty()) {
-            writer.append("<option value=\"\">&nbsp;</option>");
-        }
+            String currentValue = modelFormField.getEntry(context);
 
-        // list out all options according to the option list
-        Iterator optionValueIter = allOptionValues.iterator();
-        while (optionValueIter.hasNext()) {
-            ModelFormField.OptionValue optionValue = (ModelFormField.OptionValue) optionValueIter.next();
-            String noCurrentSelectedKey = dropDownField.getNoCurrentSelectedKey(context);
-            writer.append("<option");
-            // if current value should be selected in the list, select it
-            if (UtilValidate.isNotEmpty(currentValue) && currentValue.equals(optionValue.getKey()) && "selected".equals(dropDownField.getCurrent())) {
-                writer.append(" selected=\"selected\"");
-            } else if (UtilValidate.isEmpty(currentValue) && noCurrentSelectedKey != null && noCurrentSelectedKey.equals(optionValue.getKey())) {
+            // if the current value should go first, stick it in
+            if (UtilValidate.isNotEmpty(currentValue) && "first-in-list".equals(dropDownField.getCurrent())) {
+                writer.append("<option");
                 writer.append(" selected=\"selected\"");
+                writer.append(" value=\"");
+                writer.append(currentValue);
+                writer.append("\">");
+                String explicitDescription = dropDownField.getCurrentDescription(context);
+                if (UtilValidate.isNotEmpty(explicitDescription)) {
+                    writer.append(explicitDescription);
+                } else {
+                    writer.append(ModelFormField.FieldInfoWithOptions.getDescriptionForOptionKey(currentValue, allOptionValues));
+                }
+                writer.append("</option>");
+
+                // add a "separator" option
+                writer.append("<option value=\"");
+                writer.append(currentValue);
+                writer.append("\">---</option>");
+            }
+
+            // if allow empty is true, add an empty option
+            if (dropDownField.isAllowEmpty()) {
+                writer.append("<option value=\"\">&nbsp;</option>");
+            }
+
+            // list out all options according to the option list
+            Iterator optionValueIter = allOptionValues.iterator();
+            while (optionValueIter.hasNext()) {
+                ModelFormField.OptionValue optionValue = (ModelFormField.OptionValue) optionValueIter.next();
+                String noCurrentSelectedKey = dropDownField.getNoCurrentSelectedKey(context);
+                writer.append("<option");
+                // if current value should be selected in the list, select it
+                if (UtilValidate.isNotEmpty(currentValue) && currentValue.equals(optionValue.getKey()) && "selected".equals(dropDownField.getCurrent())) {
+                    writer.append(" selected=\"selected\"");
+                } else if (UtilValidate.isEmpty(currentValue) && noCurrentSelectedKey != null && noCurrentSelectedKey.equals(optionValue.getKey())) {
+                    writer.append(" selected=\"selected\"");
+                }
+                writer.append(" value=\"");
+                writer.append(optionValue.getKey());
+                writer.append("\">");
+                writer.append(optionValue.getDescription());
+                writer.append("</option>");
             }
-            writer.append(" value=\"");
-            writer.append(optionValue.getKey());
-            writer.append("\">");
-            writer.append(optionValue.getDescription());
-            writer.append("</option>");
-        }
 
-        writer.append("</select>");
+            writer.append("</select>");
+            
 
-        // Adapted from work by Yucca Korpela
-        // http://www.cs.tut.fi/~jkorpela/forms/combo.html
-        if (otherFieldSize > 0) {
-        
-            String fieldName = modelFormField.getParameterName(context);
-            Map dataMap = modelFormField.getMap(context);
-            if (dataMap == null) {
-                dataMap = context;
-            }
-            Object otherValueObj = dataMap.get(otherFieldName);
-            String otherValue = (otherValueObj == null) ? "" : otherValueObj.toString();
+            // Adapted from work by Yucca Korpela
+            // http://www.cs.tut.fi/~jkorpela/forms/combo.html
+            if (otherFieldSize > 0) {
             
-            writer.append("<noscript>");
-            writer.append("<input type='text' name='");
-            writer.append(otherFieldName);
-            writer.append("'/> ");
-            writer.append("</noscript>");
-            writer.append("\n<script type='text/javascript' language='JavaScript'><!--");
-            writer.append("\ndisa = ' disabled';");
-            writer.append("\nif(other_choice(document.");
-            writer.append(modelForm.getName());
-            writer.append(".");
-            writer.append(fieldName);
-            writer.append(")) disa = '';");
-            writer.append("\ndocument.write(\"<input type=");
-            writer.append("'text' name='");
-            writer.append(otherFieldName);
-            writer.append("' value='");
-            writer.append(otherValue);
-            writer.append("' size='");
-            writer.append(Integer.toString(otherFieldSize));
-            writer.append("' ");
-            writer.append("\" +disa+ \" onfocus='check_choice(document.");
-            writer.append(modelForm.getName());
-            writer.append(".");
-            writer.append(fieldName);
-            writer.append(")'/>\");");
-            writer.append("\nif(disa && document.styleSheets)");
-            writer.append(" document.");
-            writer.append(modelForm.getName());
-            writer.append(".");
-            writer.append(otherFieldName);
-            writer.append(".style.visibility  = 'hidden';");
-            writer.append("\n//--></script>");
+                String fieldName = modelFormField.getParameterName(context);
+                Map dataMap = modelFormField.getMap(context);
+                if (dataMap == null) {
+                    dataMap = context;
+                }
+                Object otherValueObj = dataMap.get(otherFieldName);
+                String otherValue = (otherValueObj == null) ? "" : otherValueObj.toString();
+                
+                writer.append("<noscript>");
+                writer.append("<input type='text' name='");
+                writer.append(otherFieldName);
+                writer.append("'/> ");
+                writer.append("</noscript>");
+                writer.append("\n<script type='text/javascript' language='JavaScript'><!--");
+                writer.append("\ndisa = ' disabled';");
+                writer.append("\nif(other_choice(document.");
+                writer.append(modelForm.getName());
+                writer.append(".");
+                writer.append(fieldName);
+                writer.append(")) disa = '';");
+                writer.append("\ndocument.write(\"<input type=");
+                writer.append("'text' name='");
+                writer.append(otherFieldName);
+                writer.append("' value='");
+                writer.append(otherValue);
+                writer.append("' size='");
+                writer.append(Integer.toString(otherFieldSize));
+                writer.append("' ");
+                writer.append("\" +disa+ \" onfocus='check_choice(document.");
+                writer.append(modelForm.getName());
+                writer.append(".");
+                writer.append(fieldName);
+                writer.append(")'/>\");");
+                writer.append("\nif(disa && document.styleSheets)");
+                writer.append(" document.");
+                writer.append(modelForm.getName());
+                writer.append(".");
+                writer.append(otherFieldName);
+                writer.append(".style.visibility  = 'hidden';");
+                writer.append("\n//--></script>");
+            }
         }
+        	
         this.makeHyperlinkString(writer, dropDownField.getSubHyperlink(), context);
 
         this.appendTooltip(writer, context, modelFormField);