svn commit: r1652852 [16/22] - in /ofbiz/trunk: applications/content/src/org/ofbiz/content/cms/ applications/content/src/org/ofbiz/content/content/ applications/content/src/org/ofbiz/content/data/ applications/content/src/org/ofbiz/content/output/ appl...

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1652852 [16/22] - in /ofbiz/trunk: applications/content/src/org/ofbiz/content/cms/ applications/content/src/org/ofbiz/content/content/ applications/content/src/org/ofbiz/content/data/ applications/content/src/org/ofbiz/content/output/ appl...

adrianc
Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/renderer/html/HtmlFormRenderer.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,2823 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *******************************************************************************/
+package org.ofbiz.widget.renderer.html;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilCodec;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilHttp;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
+import org.ofbiz.base.util.template.FreeMarkerWorker;
+import org.ofbiz.entity.Delegator;
+import org.ofbiz.webapp.control.RequestHandler;
+import org.ofbiz.webapp.taglib.ContentUrlTag;
+import org.ofbiz.widget.WidgetWorker;
+import org.ofbiz.widget.model.CommonWidgetModels;
+import org.ofbiz.widget.model.ModelForm;
+import org.ofbiz.widget.model.ModelFormField;
+import org.ofbiz.widget.model.ModelFormField.CheckField;
+import org.ofbiz.widget.model.ModelFormField.ContainerField;
+import org.ofbiz.widget.model.ModelFormField.DateFindField;
+import org.ofbiz.widget.model.ModelFormField.DateTimeField;
+import org.ofbiz.widget.model.ModelFormField.DisplayEntityField;
+import org.ofbiz.widget.model.ModelFormField.DisplayField;
+import org.ofbiz.widget.model.ModelFormField.DropDownField;
+import org.ofbiz.widget.model.ModelFormField.FieldInfoWithOptions;
+import org.ofbiz.widget.model.ModelFormField.FileField;
+import org.ofbiz.widget.model.ModelFormField.HiddenField;
+import org.ofbiz.widget.model.ModelFormField.HyperlinkField;
+import org.ofbiz.widget.model.ModelFormField.IgnoredField;
+import org.ofbiz.widget.model.ModelFormField.ImageField;
+import org.ofbiz.widget.model.ModelFormField.LookupField;
+import org.ofbiz.widget.model.ModelFormField.PasswordField;
+import org.ofbiz.widget.model.ModelFormField.RadioField;
+import org.ofbiz.widget.model.ModelFormField.RangeFindField;
+import org.ofbiz.widget.model.ModelFormField.ResetField;
+import org.ofbiz.widget.model.ModelFormField.SubmitField;
+import org.ofbiz.widget.model.ModelFormField.TextField;
+import org.ofbiz.widget.model.ModelFormField.TextFindField;
+import org.ofbiz.widget.model.ModelFormField.TextareaField;
+import org.ofbiz.widget.model.ModelWidget;
+import org.ofbiz.widget.renderer.FormRenderer;
+import org.ofbiz.widget.renderer.FormStringRenderer;
+import org.ofbiz.widget.renderer.Paginator;
+import org.ofbiz.widget.renderer.UtilHelpText;
+import org.ofbiz.widget.renderer.macro.MacroFormRenderer;
+
+import freemarker.template.TemplateException;
+
+/**
+ * Widget Library - HTML Form Renderer implementation
+ */
+public class HtmlFormRenderer extends HtmlWidgetRenderer implements FormStringRenderer {
+
+    public static final String module = HtmlFormRenderer.class.getName();
+
+    protected HttpServletRequest request;
+    protected HttpServletResponse response;
+    protected RequestHandler rh;
+    protected String lastFieldGroupId = "";
+    protected boolean renderPagination = true;
+    protected boolean javaScriptEnabled = false;
+    private UtilCodec.SimpleEncoder internalEncoder;
+
+    protected HtmlFormRenderer() {}
+
+    public HtmlFormRenderer(HttpServletRequest request, HttpServletResponse response) {
+        this.request = request;
+        this.response = response;
+        ServletContext ctx = (ServletContext) request.getAttribute("servletContext");
+        this.rh = (RequestHandler) ctx.getAttribute("_REQUEST_HANDLER_");
+        this.javaScriptEnabled = UtilHttp.isJavaScriptEnabled(request);
+        internalEncoder = UtilCodec.getEncoder("string");
+    }
+
+    public boolean getRenderPagination() {
+        return this.renderPagination;
+    }
+
+    public void setRenderPagination(boolean renderPagination) {
+        this.renderPagination = renderPagination;
+    }
+
+    public void appendOfbizUrl(Appendable writer, String location) throws IOException {
+        writer.append(this.rh.makeLink(this.request, this.response, location));
+    }
+
+    public void appendContentUrl(Appendable writer, String location) throws IOException {
+        ContentUrlTag.appendContentPrefix(this.request, writer);
+        writer.append(location);
+    }
+
+    public void appendTooltip(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        // render the tooltip, in other methods too
+        String tooltip = modelFormField.getTooltip(context);
+        if (UtilValidate.isNotEmpty(tooltip)) {
+            writer.append("<span class=\"");
+            String tooltipStyle = modelFormField.getTooltipStyle();
+            if (UtilValidate.isNotEmpty(tooltipStyle)) {
+                writer.append(tooltipStyle);
+            } else {
+                writer.append("tooltip");
+            }
+            writer.append("\">");
+            writer.append(tooltip);
+            writer.append("</span>");
+        }
+    }
+
+    public void addAsterisks(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+
+        boolean requiredField = modelFormField.getRequiredField();
+        if (requiredField) {
+            String requiredStyle = modelFormField.getRequiredFieldStyle();
+
+            if (UtilValidate.isEmpty(requiredStyle)) {
+               writer.append("*");
+            }
+        }
+    }
+
+    public void appendClassNames(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        String className = modelFormField.getWidgetStyle();
+        if (UtilValidate.isNotEmpty(className) || modelFormField.shouldBeRed(context)) {
+            writer.append(" class=\"");
+            writer.append(className);
+            // add a style of red if redWhen is true
+            if (modelFormField.shouldBeRed(context)) {
+                writer.append(" alert");
+            }
+            writer.append('"');
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderDisplayField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.DisplayField)
+     */
+    public void renderDisplayField(Appendable writer, Map<String, Object> context, DisplayField displayField) throws IOException {
+        ModelFormField modelFormField = displayField.getModelFormField();
+
+        StringBuilder str = new StringBuilder();
+
+        String idName = modelFormField.getCurrentContainerId(context);
+
+        if (UtilValidate.isNotEmpty(modelFormField.getWidgetStyle()) || modelFormField.shouldBeRed(context)) {
+            str.append("<span class=\"");
+            str.append(modelFormField.getWidgetStyle());
+            // add a style of red if this is a date/time field and redWhen is true
+            if (modelFormField.shouldBeRed(context)) {
+                str.append(" alert");
+            }
+            str.append('"');
+            if (UtilValidate.isNotEmpty(idName)) {
+                str.append(" id=\"");
+                str.append(idName+"_sp");
+                str.append('"');
+            }
+            str.append('>');
+        }
+
+        if (str.length() > 0) {
+            writer.append(str.toString());
+        }
+        String description = displayField.getDescription(context);
+        //Replace new lines with <br/>
+        description = description.replaceAll("\n", "<br/>");
+
+        if (UtilValidate.isEmpty(description)) {
+            this.renderFormatEmptySpace(writer, context, modelFormField.getModelForm());
+        } else {
+            writer.append(description);
+        }
+
+        if (str.length() > 0) {
+            writer.append("</span>");
+        }
+
+        ModelFormField.InPlaceEditor inPlaceEditor = displayField.getInPlaceEditor();
+        boolean ajaxEnabled = inPlaceEditor != null && this.javaScriptEnabled;
+
+        if (ajaxEnabled) {
+            writer.append("<script language=\"JavaScript\" type=\"text/javascript\">");
+            StringBuilder url = new StringBuilder(inPlaceEditor.getUrl(context));
+            Map<String, Object> fieldMap = inPlaceEditor.getFieldMap(context);
+            if (fieldMap != null) {
+                url.append('?');
+                int count = 0;
+                for (Entry<String, Object> field: fieldMap.entrySet()) {
+                    count++;
+                    url.append(field.getKey()).append('=').append(field.getValue());
+                    if (count < fieldMap.size()) {
+                        url.append('&');
+                    }
+                }
+            }
+            writer.append("ajaxInPlaceEditDisplayField('");
+            writer.append(idName).append("', '").append(url).append("', {");
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getParamName())) {
+                writer.append("name: '").append(inPlaceEditor.getParamName()).append("'");
+            } else {
+                writer.append("name: '").append(modelFormField.getFieldName()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getCancelControl())) {
+                writer.append(", cancelControl: ");
+                if (!"false".equals(inPlaceEditor.getCancelControl())) {
+                    writer.append("'");
+                }
+                writer.append(inPlaceEditor.getCancelControl());
+                if (!"false".equals(inPlaceEditor.getCancelControl())) {
+                    writer.append("'");
+                }
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getCancelText())) {
+                writer.append(", cancel: '").append(inPlaceEditor.getCancelText()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getClickToEditText())) {
+                writer.append(", tooltip: '").append(inPlaceEditor.getClickToEditText()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getFieldPostCreation())) {
+                writer.append(", fieldPostCreation: ");
+                if (!"false".equals(inPlaceEditor.getFieldPostCreation())) {
+                    writer.append("'");
+                }
+                writer.append(inPlaceEditor.getFieldPostCreation());
+                if (!"false".equals(inPlaceEditor.getFieldPostCreation())) {
+                    writer.append("'");
+                }
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getFormClassName())) {
+                writer.append(", cssclass: '").append(inPlaceEditor.getFormClassName()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getHighlightColor())) {
+                writer.append(", highlightColor: '").append(inPlaceEditor.getHighlightColor()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getHighlightEndColor())) {
+                writer.append(", highlightEndColor: '").append(inPlaceEditor.getHighlightEndColor()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getHoverClassName())) {
+                writer.append(", hoverClassName: '").append(inPlaceEditor.getHoverClassName()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getHtmlResponse())) {
+                writer.append(", htmlResponse: ").append(inPlaceEditor.getHtmlResponse());
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getLoadingClassName())) {
+                writer.append(", loadingClassName: '").append(inPlaceEditor.getLoadingClassName()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getLoadingText())) {
+                writer.append(", indicator: '").append(inPlaceEditor.getLoadingText()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getOkControl())) {
+                writer.append(", submit: ");
+                if (!"false".equals(inPlaceEditor.getOkControl())) {
+                    writer.append("'");
+                }
+                writer.append(inPlaceEditor.getOkControl());
+                if (!"false".equals(inPlaceEditor.getOkControl())) {
+                    writer.append("'");
+                }
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getOkText())) {
+                writer.append(", okText: '").append(inPlaceEditor.getOkText()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getSavingClassName())) {
+                writer.append(", savingClassName: '").append(inPlaceEditor.getSavingClassName()).append("', ");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getSavingText())) {
+                writer.append(", savingText: '").append(inPlaceEditor.getSavingText()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getSubmitOnBlur())) {
+                writer.append(", submitOnBlur: ").append(inPlaceEditor.getSubmitOnBlur());
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getTextBeforeControls())) {
+                writer.append(", textBeforeControls: '").append(inPlaceEditor.getTextBeforeControls()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getTextAfterControls())) {
+                writer.append(", textAfterControls: '").append(inPlaceEditor.getTextAfterControls()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getTextBetweenControls())) {
+                writer.append(", textBetweenControls: '").append(inPlaceEditor.getTextBetweenControls()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getUpdateAfterRequestCall())) {
+                writer.append(", updateAfterRequestCall: ").append(inPlaceEditor.getUpdateAfterRequestCall());
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getRows())) {
+                writer.append(", rows: '").append(inPlaceEditor.getRows()).append("'");
+            }
+            if (UtilValidate.isNotEmpty(inPlaceEditor.getCols())) {
+                writer.append(", cols: '").append(inPlaceEditor.getCols()).append("'");
+            }
+            writer.append("});");
+            writer.append("</script>");
+        }
+
+        if (displayField instanceof DisplayEntityField) {
+            this.makeHyperlinkString(writer, ((DisplayEntityField) displayField).getSubHyperlink(), context);
+        }
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderHyperlinkField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.HyperlinkField)
+     */
+    public void renderHyperlinkField(Appendable writer, Map<String, Object> context, HyperlinkField hyperlinkField) throws IOException {
+        this.request.setAttribute("image", hyperlinkField.getImageLocation(context));
+        ModelFormField modelFormField = hyperlinkField.getModelFormField();
+        String description = encode(hyperlinkField.getDescription(context), modelFormField, context);
+        String confirmation = encode(hyperlinkField.getConfirmation(context), modelFormField, context);
+        WidgetWorker.makeHyperlinkByType(writer, hyperlinkField.getLinkType(), modelFormField.getWidgetStyle(), hyperlinkField.getUrlMode(), hyperlinkField.getTarget(context),
+                hyperlinkField.getParameterMap(context), description, hyperlinkField.getTargetWindow(context), confirmation, modelFormField,
+                this.request, this.response, context);
+        this.appendTooltip(writer, context, modelFormField);
+        //appendWhitespace(writer);
+    }
+
+    public void makeHyperlinkString(Appendable writer, ModelFormField.SubHyperlink subHyperlink, Map<String, Object> context) throws IOException {
+        if (subHyperlink == null) {
+            return;
+        }
+        if (subHyperlink.shouldUse(context)) {
+            writer.append(' ');
+            String description = encode(subHyperlink.getDescription(context), subHyperlink.getModelFormField(), context);
+            WidgetWorker.makeHyperlinkByType(writer, subHyperlink.getLinkType(), subHyperlink.getStyle(context), subHyperlink.getUrlMode(), subHyperlink.getTarget(context),
+                    subHyperlink.getParameterMap(context), description, subHyperlink.getTargetWindow(context), null, subHyperlink.getModelFormField(),
+                    this.request, this.response, context);
+        }
+    }
+
+    private String encode(String value, ModelFormField modelFormField, Map<String, Object> context) {
+        if (UtilValidate.isEmpty(value)) {
+            return value;
+        }
+        UtilCodec.SimpleEncoder encoder = (UtilCodec.SimpleEncoder)context.get("simpleEncoder");
+        if (modelFormField.getEncodeOutput() && encoder != null) {
+            value = encoder.encode(value);
+        } else {
+            value = internalEncoder.encode(value);
+        }
+        return value;
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderTextField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.TextField)
+     */
+    public void renderTextField(Appendable writer, Map<String, Object> context, TextField textField) throws IOException {
+        ModelFormField modelFormField = textField.getModelFormField();
+
+        writer.append("<input type=\"text\"");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append('"');
+
+        String value = modelFormField.getEntry(context, textField.getDefaultValue(context));
+        if (UtilValidate.isNotEmpty(value)) {
+            writer.append(" value=\"");
+            writer.append(value);
+            writer.append('"');
+        }
+
+        writer.append(" size=\"");
+        writer.append(Integer.toString(textField.getSize()));
+        writer.append('"');
+
+        Integer maxlength = textField.getMaxlength();
+        if (maxlength != null) {
+            writer.append(" maxlength=\"");
+            writer.append(maxlength.toString());
+            writer.append('"');
+        }
+
+        String idName = modelFormField.getCurrentContainerId(context);
+        if (UtilValidate.isNotEmpty(idName)) {
+            writer.append(" id=\"");
+            writer.append(idName);
+            writer.append('"');
+        }
+
+        String event = modelFormField.getEvent();
+        String action = modelFormField.getAction(context);
+        if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
+            writer.append(" ");
+            writer.append(event);
+            writer.append("=\"");
+            writer.append(action);
+            writer.append('"');
+        }
+
+        List<ModelForm.UpdateArea> updateAreas = modelFormField.getOnChangeUpdateAreas();
+        boolean ajaxEnabled = updateAreas != null && this.javaScriptEnabled;
+        if (!textField.getClientAutocompleteField() || ajaxEnabled) {
+            writer.append(" autocomplete=\"off\"");
+        }
+
+        writer.append("/>");
+
+        this.addAsterisks(writer, context, modelFormField);
+
+        this.makeHyperlinkString(writer, textField.getSubHyperlink(), context);
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        if (ajaxEnabled) {
+            appendWhitespace(writer);
+            writer.append("<script language=\"JavaScript\" type=\"text/javascript\">");
+            appendWhitespace(writer);
+            writer.append("ajaxAutoCompleter('").append(createAjaxParamsFromUpdateAreas(updateAreas, null, context)).append("');");
+            appendWhitespace(writer);
+            writer.append("</script>");
+        }
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderTextareaField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.TextareaField)
+     */
+    public void renderTextareaField(Appendable writer, Map<String, Object> context, TextareaField textareaField) throws IOException {
+        ModelFormField modelFormField = textareaField.getModelFormField();
+
+        writer.append("<textarea");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append('"');
+
+        writer.append(" cols=\"");
+        writer.append(Integer.toString(textareaField.getCols()));
+        writer.append('"');
+
+        writer.append(" rows=\"");
+        writer.append(Integer.toString(textareaField.getRows()));
+        writer.append('"');
+
+        String idName = modelFormField.getCurrentContainerId(context);
+        if (UtilValidate.isNotEmpty(idName)) {
+            writer.append(" id=\"");
+            writer.append(idName);
+            writer.append('"');
+        } else if (textareaField.getVisualEditorEnable()) {
+            writer.append(" id=\"");
+            writer.append("htmlEditArea");
+            writer.append('"');
+        }
+
+        if (textareaField.isReadOnly()) {
+            writer.append(" readonly");
+        }
+
+        writer.append('>');
+
+        String value = modelFormField.getEntry(context, textareaField.getDefaultValue(context));
+        if (UtilValidate.isNotEmpty(value)) {
+            writer.append(value);
+        }
+
+        writer.append("</textarea>");
+
+        if (textareaField.getVisualEditorEnable()) {
+            writer.append("<script language=\"javascript\" src=\"/images/jquery/plugins/elrte-1.3/js/elrte.min.js\" type=\"text/javascript\"></script>");
+            writer.append("<link href=\"/images/jquery/plugins/elrte-1.3/css/elrte.min.css\" rel=\"stylesheet\" type=\"text/css\">");
+            writer.append("<script language=\"javascript\" type=\"text/javascript\"> var opts = { cssClass : 'el-rte', toolbar : ");
+            // define the toolsbar
+            String buttons = textareaField.getVisualEditorButtons(context);
+            if (UtilValidate.isNotEmpty(buttons)) {
+                writer.append(buttons);
+            } else {
+                writer.append("maxi");
+            }
+            writer.append(", doctype  : '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">', //'<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\">'");
+            writer.append(", cssfiles : ['/images/jquery/plugins/elrte-1.3/css/elrte-inner.css'] ");
+            writer.append("}");
+            // load the wysiwyg editor
+            writer.append("jQuery('#");
+            if (UtilValidate.isNotEmpty(idName)) {
+                writer.append(idName);
+            } else {
+                writer.append("htmlEditArea");
+            }
+            writer.append("').elrte(opts);");
+            writer.append("</script>");
+        }
+
+        this.addAsterisks(writer, context, modelFormField);
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderDateTimeField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.DateTimeField)
+     */
+    public void renderDateTimeField(Appendable writer, Map<String, Object> context, DateTimeField dateTimeField) throws IOException {
+        String macroLibraryPath = UtilProperties.getPropertyValue("widget", "screen.formrenderer");
+        try {
+            MacroFormRenderer macroFormRenderer = new MacroFormRenderer(macroLibraryPath, this.request, this.response);
+            macroFormRenderer.renderDateTimeField(writer, context, dateTimeField);
+        } catch (TemplateException e) {
+            Debug.logError(e, "Error rendering screen thru ftl macro: renderDateTimeField", module);
+        } catch (IOException e) {
+            Debug.logError(e, "Error rendering screen thru ftl, macro: renderDateTimeField", module);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderDropDownField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.DropDownField)
+     */
+    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<ModelFormField.OptionValue> allOptionValues = dropDownField.getAllOptionValues(context, WidgetWorker.getDelegator(context));
+
+        String event = modelFormField.getEvent();
+        String action = modelFormField.getAction(context);
+
+        String currentValue = modelFormField.getEntry(context);
+        // Get the current value's description from the option value. If there
+        // is a localized version it will be there.
+        String currentDescription = null;
+        if (UtilValidate.isNotEmpty(currentValue)) {
+            for (ModelFormField.OptionValue optionValue : allOptionValues) {
+                if (encode(optionValue.getKey(), modelFormField, context).equals(currentValue)) {
+                    currentDescription = optionValue.getDescription();
+                    break;
+                }
+            }
+        }
+
+        if (ajaxEnabled) {
+            writer.append("<input type=\"text\"");
+        } else {
+            writer.append("<select");
+        }
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+
+        String idName = modelFormField.getCurrentContainerId(context);
+
+        if (ajaxEnabled) {
+            writer.append("_description\"");
+
+            String textFieldIdName = idName;
+            if (UtilValidate.isNotEmpty(textFieldIdName)) {
+                textFieldIdName += "_description";
+                writer.append(" id=\"");
+                writer.append(textFieldIdName);
+                writer.append('"');
+            }
+
+            if (UtilValidate.isNotEmpty(currentValue)) {
+                writer.append(" value=\"");
+                String explicitDescription = null;
+                if (currentDescription != null) {
+                    explicitDescription = currentDescription;
+                } else {
+                    explicitDescription = dropDownField.getCurrentDescription(context);
+                }
+                if (UtilValidate.isEmpty(explicitDescription)) {
+                    explicitDescription = FieldInfoWithOptions.getDescriptionForOptionKey(currentValue, allOptionValues);
+                }
+                explicitDescription = encode(explicitDescription, modelFormField, context);
+                writer.append(explicitDescription);
+                writer.append('"');
+            }
+            writer.append("/>");
+
+            appendWhitespace(writer);
+            writer.append("<input type=\"hidden\" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append('"');
+            if (UtilValidate.isNotEmpty(idName)) {
+                writer.append(" id=\"");
+                writer.append(idName);
+                writer.append('"');
+            }
+
+            if (UtilValidate.isNotEmpty(currentValue)) {
+                writer.append(" value=\"");
+                //String explicitDescription = dropDownField.getCurrentDescription(context);
+                writer.append(currentValue);
+                writer.append('"');
+            }
+
+            writer.append("/>");
+
+            appendWhitespace(writer);
+            writer.append("<script language=\"JavaScript\" type=\"text/javascript\">");
+            appendWhitespace(writer);
+            writer.append("var data = {");
+            int count = 0;
+            for (ModelFormField.OptionValue optionValue: allOptionValues) {
+                count++;
+                writer.append(optionValue.getKey()).append(": ");
+                writer.append(" '").append(optionValue.getDescription()).append("'");
+                if (count != allOptionValues.size()) {
+                    writer.append(", ");
+                }
+            }
+            writer.append("};");
+            appendWhitespace(writer);
+            writer.append("ajaxAutoCompleteDropDown('").append(textFieldIdName).append("', '").append(idName).append("', data, {autoSelect: ").append(
+                    autoComplete.getAutoSelect()).append(", frequency: ").append(autoComplete.getFrequency()).append(", minChars: ").append(autoComplete.getMinChars()).append(
+                    ", choices: ").append(autoComplete.getChoices()).append(", partialSearch: ").append(autoComplete.getPartialSearch()).append(
+                    ", partialChars: ").append(autoComplete.getPartialChars()).append(", ignoreCase: ").append(autoComplete.getIgnoreCase()).append(
+                    ", fullSearch: ").append(autoComplete.getFullSearch()).append("});");
+            appendWhitespace(writer);
+            writer.append("</script>");
+        } else {
+            writer.append('"');
+
+            if (UtilValidate.isNotEmpty(idName)) {
+                writer.append(" id=\"");
+                writer.append(idName);
+                writer.append('"');
+            }
+
+            if (dropDownField.getAllowMultiple()) {
+                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=\"").append(dropDownField.getSize()).append("\">");
+
+            // 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 = (currentDescription != null ? currentDescription : dropDownField.getCurrentDescription(context));
+                if (UtilValidate.isNotEmpty(explicitDescription)) {
+                    writer.append(encode(explicitDescription, modelFormField, context));
+                } else {
+                    String description = FieldInfoWithOptions.getDescriptionForOptionKey(currentValue, allOptionValues);
+                    writer.append(encode(description, modelFormField, context));
+                }
+                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.getAllowEmpty()) {
+                writer.append("<option value=\"\">&nbsp;</option>");
+            }
+
+            // list out all options according to the option list
+            for (ModelFormField.OptionValue optionValue: allOptionValues) {
+                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(encode(optionValue.getKey(), modelFormField, context));
+                writer.append("\">");
+                writer.append(encode(optionValue.getDescription(), modelFormField, context));
+                writer.append("</option>");
+            }
+
+            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<String, Object> dataMap = UtilGenerics.checkMap(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);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderCheckField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.CheckField)
+     */
+    public void renderCheckField(Appendable writer, Map<String, Object> context, CheckField checkField) throws IOException {
+        ModelFormField modelFormField = checkField.getModelFormField();
+        String currentValue = modelFormField.getEntry(context);
+        Boolean allChecked = checkField.isAllChecked(context);
+
+        List<ModelFormField.OptionValue> allOptionValues = checkField.getAllOptionValues(context, WidgetWorker.getDelegator(context));
+        String event = modelFormField.getEvent();
+        String action = modelFormField.getAction(context);
+
+        // list out all options according to the option list
+        for (ModelFormField.OptionValue optionValue: allOptionValues) {
+
+            writer.append("<input type=\"checkbox\"");
+
+            appendClassNames(writer, context, modelFormField);
+
+            // if current value should be selected in the list, select it
+            if (Boolean.TRUE.equals(allChecked)) {
+                writer.append(" checked=\"checked\"");
+            } else if (Boolean.FALSE.equals(allChecked)) {
+                // do nothing
+            } else if (UtilValidate.isNotEmpty(currentValue) && currentValue.equals(optionValue.getKey())) {
+                writer.append(" checked=\"checked\"");
+            }
+            writer.append(" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append('"');
+            writer.append(" value=\"");
+            writer.append(encode(optionValue.getKey(), modelFormField, context));
+            writer.append("\"");
+
+            if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
+                writer.append(" ");
+                writer.append(event);
+                writer.append("=\"");
+                writer.append(action);
+                writer.append('"');
+            }
+
+            writer.append("/>");
+
+            writer.append(encode(optionValue.getDescription(), modelFormField, context));
+        }
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderRadioField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.RadioField)
+     */
+    public void renderRadioField(Appendable writer, Map<String, Object> context, RadioField radioField) throws IOException {
+        ModelFormField modelFormField = radioField.getModelFormField();
+        List<ModelFormField.OptionValue> allOptionValues = radioField.getAllOptionValues(context, WidgetWorker.getDelegator(context));
+        String currentValue = modelFormField.getEntry(context);
+        String event = modelFormField.getEvent();
+        String action = modelFormField.getAction(context);
+
+        // list out all options according to the option list
+        for (ModelFormField.OptionValue optionValue: allOptionValues) {
+
+            writer.append("<span");
+
+            appendClassNames(writer, context, modelFormField);
+
+            writer.append("><input type=\"radio\"");
+
+            // if current value should be selected in the list, select it
+            String noCurrentSelectedKey = radioField.getNoCurrentSelectedKey(context);
+            if (UtilValidate.isNotEmpty(currentValue) && currentValue.equals(optionValue.getKey())) {
+                writer.append(" checked=\"checked\"");
+            } else if (UtilValidate.isEmpty(currentValue) && noCurrentSelectedKey != null && noCurrentSelectedKey.equals(optionValue.getKey())) {
+                writer.append(" checked=\"checked\"");
+            }
+            writer.append(" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append('"');
+            writer.append(" value=\"");
+            writer.append(encode(optionValue.getKey(), modelFormField, context));
+            writer.append("\"");
+
+            if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
+                writer.append(" ");
+                writer.append(event);
+                writer.append("=\"");
+                writer.append(action);
+                writer.append('"');
+            }
+
+            writer.append("/>");
+
+            writer.append(encode(optionValue.getDescription(), modelFormField, context));
+            writer.append("</span>");
+        }
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderSubmitField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.SubmitField)
+     */
+    public void renderSubmitField(Appendable writer, Map<String, Object> context, SubmitField submitField) throws IOException {
+        ModelFormField modelFormField = submitField.getModelFormField();
+        ModelForm modelForm = modelFormField.getModelForm();
+        String event = null;
+        String action = null;
+        String confirmation =  encode(submitField.getConfirmation(context), modelFormField, context);
+
+        if ("text-link".equals(submitField.getButtonType())) {
+            writer.append("<a");
+
+            appendClassNames(writer, context, modelFormField);
+            if (UtilValidate.isNotEmpty(confirmation)) {
+                writer.append(" onclick=\"return confirm('");
+                writer.append(confirmation);
+                writer.append("'); \" ");
+            }
+
+            writer.append(" href=\"javascript:document.");
+            writer.append(FormRenderer.getCurrentFormName(modelForm, context));
+            writer.append(".submit()\">");
+
+            writer.append(encode(modelFormField.getTitle(context), modelFormField, context));
+
+            writer.append("</a>");
+        } else if ("image".equals(submitField.getButtonType())) {
+            writer.append("<input type=\"image\"");
+
+            appendClassNames(writer, context, modelFormField);
+
+            writer.append(" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append('"');
+
+            String title = modelFormField.getTitle(context);
+            if (UtilValidate.isNotEmpty(title)) {
+                writer.append(" alt=\"");
+                writer.append(encode(title, modelFormField, context));
+                writer.append('"');
+            }
+
+            writer.append(" src=\"");
+            this.appendContentUrl(writer, submitField.getImageLocation(context));
+            writer.append('"');
+
+            event = modelFormField.getEvent();
+            action = modelFormField.getAction(context);
+            if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
+                writer.append(" ");
+                writer.append(event);
+                writer.append("=\"");
+                writer.append(action);
+                writer.append('"');
+            }
+
+            if (UtilValidate.isNotEmpty(confirmation)) {
+                writer.append("onclick=\" return confirm('");
+                writer.append(confirmation);
+                writer.append("); \" ");
+            }
+
+            writer.append("/>");
+        } else {
+            // default to "button"
+
+            String formId = modelForm.getContainerId();
+            List<ModelForm.UpdateArea> updateAreas = modelForm.getOnSubmitUpdateAreas();
+            // This is here for backwards compatibility. Use on-event-update-area
+            // elements instead.
+            String backgroundSubmitRefreshTarget = submitField.getBackgroundSubmitRefreshTarget(context);
+            if (UtilValidate.isNotEmpty(backgroundSubmitRefreshTarget)) {
+                if (updateAreas == null) {
+                    updateAreas = new LinkedList<ModelForm.UpdateArea>();
+                }
+                updateAreas.add(new ModelForm.UpdateArea("submit", formId, backgroundSubmitRefreshTarget));
+            }
+
+            boolean ajaxEnabled = (UtilValidate.isNotEmpty(updateAreas) || UtilValidate.isNotEmpty(backgroundSubmitRefreshTarget)) && this.javaScriptEnabled;
+            if (ajaxEnabled) {
+                writer.append("<input type=\"button\"");
+            } else {
+                writer.append("<input type=\"submit\"");
+            }
+
+            appendClassNames(writer, context, modelFormField);
+
+            writer.append(" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append('"');
+
+            String title = modelFormField.getTitle(context);
+            if (UtilValidate.isNotEmpty(title)) {
+                writer.append(" value=\"");
+                writer.append(encode(title, modelFormField, context));
+                writer.append('"');
+            }
+
+
+            event = modelFormField.getEvent();
+            action = modelFormField.getAction(context);
+            if (UtilValidate.isNotEmpty(event) && UtilValidate.isNotEmpty(action)) {
+                writer.append(" ");
+                writer.append(event);
+                writer.append("=\"");
+                writer.append(action);
+                writer.append('"');
+            } else {
+                //add single click JS onclick
+                // disabling for now, using form onSubmit action instead: writer.append(singleClickAction);
+            }
+
+            if (ajaxEnabled) {
+                writer.append(" onclick=\"");
+                if (UtilValidate.isNotEmpty(confirmation)) {
+                    writer.append("if  (confirm('");
+                    writer.append(confirmation);
+                    writer.append(");) ");
+                }
+                writer.append("ajaxSubmitFormUpdateAreas('");
+                writer.append(formId);
+                writer.append("', '").append(createAjaxParamsFromUpdateAreas(updateAreas, null, context));
+                writer.append("')\"");
+            }
+
+            writer.append("/>");
+        }
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderResetField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.ResetField)
+     */
+    public void renderResetField(Appendable writer, Map<String, Object> context, ResetField resetField) throws IOException {
+        ModelFormField modelFormField = resetField.getModelFormField();
+
+        writer.append("<input type=\"reset\"");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append('"');
+
+        String title = modelFormField.getTitle(context);
+        if (UtilValidate.isNotEmpty(title)) {
+            writer.append(" value=\"");
+            writer.append(encode(title, modelFormField, context));
+            writer.append('"');
+        }
+
+        writer.append("/>");
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderHiddenField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.HiddenField)
+     */
+    public void renderHiddenField(Appendable writer, Map<String, Object> context, HiddenField hiddenField) throws IOException {
+        ModelFormField modelFormField = hiddenField.getModelFormField();
+        String value = hiddenField.getValue(context);
+        this.renderHiddenField(writer, context, modelFormField, value);
+    }
+
+    public void renderHiddenField(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, String value) throws IOException {
+        writer.append("<input type=\"hidden\"");
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append('"');
+
+        if (UtilValidate.isNotEmpty(value)) {
+            writer.append(" value=\"");
+            writer.append(value);
+            writer.append('"');
+        }
+
+        writer.append("/>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderIgnoredField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.IgnoredField)
+     */
+    public void renderIgnoredField(Appendable writer, Map<String, Object> context, IgnoredField ignoredField) throws IOException {
+        // do nothing, it's an ignored field; could add a comment or something if we wanted to
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFieldTitle(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFieldTitle(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        String tempTitleText = modelFormField.getTitle(context);
+        String titleText = UtilHttp.encodeAmpersands(tempTitleText);
+
+        if (UtilValidate.isNotEmpty(titleText)) {
+            // copied from MacroFormRenderer renderFieldTitle
+            String displayHelpText = UtilProperties.getPropertyValue("widget.properties", "widget.form.displayhelpText");
+            String helpText = null;
+            if ("Y".equals(displayHelpText)) {
+                Delegator delegator = WidgetWorker.getDelegator(context);
+                Locale locale = (Locale)context.get("locale");
+                String entityName = modelFormField.getEntityName();
+                String fieldName = modelFormField.getFieldName();
+                helpText = UtilHelpText.getEntityFieldDescription(entityName, fieldName, delegator, locale);
+            }
+            if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle()) || UtilValidate.isNotEmpty(helpText)) {
+                writer.append("<span");
+                if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle())){
+                    writer.append(" class=\"");
+                    writer.append(modelFormField.getTitleStyle());
+                }
+                if (UtilValidate.isNotEmpty(helpText)){
+                    writer.append(" title=\"");
+                    writer.append(FreeMarkerWorker.encodeDoubleQuotes(helpText));
+                }
+                writer.append("\">");
+            }
+            if (" ".equals(titleText)) {
+                // If the title content is just a blank then render it colling renderFormatEmptySpace:
+                // the method will set its content to work fine in most browser
+                this.renderFormatEmptySpace(writer, context, modelFormField.getModelForm());
+            } else {
+                renderHyperlinkTitle(writer, context, modelFormField, titleText);
+            }
+
+            if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle())) {
+                writer.append("</span>");
+            }
+
+            //appendWhitespace(writer);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFieldTitle(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderSingleFormFieldTitle(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        boolean requiredField = modelFormField.getRequiredField();
+        if (requiredField) {
+
+            String requiredStyle = modelFormField.getRequiredFieldStyle();
+            if (UtilValidate.isEmpty(requiredStyle)) {
+                requiredStyle = modelFormField.getTitleStyle();
+            }
+
+            if (UtilValidate.isNotEmpty(requiredStyle)) {
+                writer.append("<span class=\"");
+                writer.append(requiredStyle);
+                writer.append("\">");
+            }
+            renderHyperlinkTitle(writer, context, modelFormField, modelFormField.getTitle(context));
+            if (UtilValidate.isNotEmpty(requiredStyle)) {
+                writer.append("</span>");
+            }
+
+            //appendWhitespace(writer);
+        } else {
+            renderFieldTitle(writer, context, modelFormField);
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        this.widgetCommentsEnabled = ModelWidget.widgetBoundaryCommentsEnabled(context);
+        renderBeginningBoundaryComment(writer, "Form Widget - Form Element", modelForm);
+        writer.append("<form method=\"post\" ");
+        String targetType = modelForm.getTargetType();
+        String targ = modelForm.getTarget(context, targetType);
+        // The 'action' attribute is mandatory in a form definition,
+        // even if it is empty.
+        writer.append(" action=\"");
+        if (UtilValidate.isNotEmpty(targ)) {
+            //this.appendOfbizUrl(writer, "/" + targ);
+            WidgetWorker.buildHyperlinkUrl(writer, targ, targetType, null, null, false, false, true, request, response, context);
+        }
+        writer.append("\" ");
+
+        String formType = modelForm.getType();
+        if (formType.equals("upload")) {
+            writer.append(" enctype=\"multipart/form-data\"");
+        }
+
+        String targetWindow = modelForm.getTargetWindow(context);
+        if (UtilValidate.isNotEmpty(targetWindow)) {
+            writer.append(" target=\"");
+            writer.append(targetWindow);
+            writer.append("\"");
+        }
+
+        String containerId = FormRenderer.getCurrentContainerId(modelForm, context);
+        if (UtilValidate.isNotEmpty(containerId)) {
+            writer.append(" id=\"");
+            writer.append(containerId);
+            writer.append("\"");
+        }
+
+        writer.append(" class=\"");
+        String containerStyle =  modelForm.getContainerStyle();
+        if (UtilValidate.isNotEmpty(containerStyle)) {
+            writer.append(containerStyle);
+        } else {
+            writer.append("basic-form");
+        }
+        writer.append("\"");
+
+        writer.append(" onsubmit=\"javascript:submitFormDisableSubmits(this)\"");
+
+        if (!modelForm.getClientAutocompleteFields()) {
+            writer.append(" autocomplete=\"off\"");
+        }
+
+        writer.append(" name=\"");
+        writer.append(FormRenderer.getCurrentContainerId(modelForm, context));
+        writer.append("\">");
+
+        boolean useRowSubmit = modelForm.getUseRowSubmit();
+        if (useRowSubmit) {
+            writer.append("<input type=\"hidden\" name=\"_useRowSubmit\" value=\"Y\"/>");
+        }
+
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("</form>");
+        String focusFieldName = FormRenderer.getFocusFieldName(modelForm, context);
+        if (UtilValidate.isNotEmpty(focusFieldName)) {
+            appendWhitespace(writer);
+            writer.append("<script language=\"JavaScript\" type=\"text/javascript\">");
+            appendWhitespace(writer);
+            writer.append("document.").append(FormRenderer.getCurrentFormName(modelForm, context)).append(".");
+            writer.append(focusFieldName).append(".focus();");
+            appendWhitespace(writer);
+            writer.append("</script>");
+        }
+        appendWhitespace(writer);
+        renderEndingBoundaryComment(writer, "Form Widget - Form Element", modelForm);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderMultiFormClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        for (ModelFormField submitField: modelForm.getMultiSubmitFields()) {
+            if (submitField != null) {
+
+                // Threw this in that as a hack to keep the submit button from expanding the first field
+                // Needs a more rugged solution
+                // WARNING: this method (renderMultiFormClose) must be called after the
+                // table that contains the list has been closed (to avoid validation errors) so
+                // we cannot call here the methods renderFormatItemRowCell*: for this reason
+                // they are now commented.
+
+                // this.renderFormatItemRowCellOpen(writer, context, modelForm, submitField);
+                // this.renderFormatItemRowCellClose(writer, context, modelForm, submitField);
+
+                // this.renderFormatItemRowCellOpen(writer, context, modelForm, submitField);
+
+                submitField.renderFieldString(writer, context, this);
+
+                // this.renderFormatItemRowCellClose(writer, context, modelForm, submitField);
+
+            }
+        }
+        writer.append("</form>");
+        appendWhitespace(writer);
+
+        // see if there is anything that needs to be added outside of the multi-form
+        Map<String, Object> wholeFormContext = UtilGenerics.checkMap(context.get("wholeFormContext"));
+        Appendable postMultiFormWriter = wholeFormContext != null ? (Appendable) wholeFormContext.get("postMultiFormWriter") : null;
+        if (postMultiFormWriter != null) {
+            writer.append(postMultiFormWriter.toString());
+            appendWhitespace(writer);
+        }
+
+        renderEndingBoundaryComment(writer, "Form Widget - Form Element (Multi)", modelForm);
+    }
+
+    public void renderFormatListWrapperOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+
+        Map<String, Object> inputFields = UtilGenerics.checkMap(context.get("requestParameters"));
+        Map<String, Object> queryStringMap = UtilGenerics.toMap(context.get("queryStringMap"));
+        if (UtilValidate.isNotEmpty(queryStringMap)) {
+            inputFields.putAll(queryStringMap);
+        }
+        if (modelForm.getType().equals("multi")) {
+            inputFields = UtilHttp.removeMultiFormParameters(inputFields);
+        }
+        String queryString = UtilHttp.urlEncodeArgs(inputFields);
+        context.put("_QBESTRING_", queryString);
+
+        this.widgetCommentsEnabled = ModelWidget.widgetBoundaryCommentsEnabled(context);
+        renderBeginningBoundaryComment(writer, "Form Widget", modelForm);
+
+        if (this.renderPagination) {
+            this.renderNextPrev(writer, context, modelForm);
+        }
+        writer.append(" <table cellspacing=\"0\" class=\"");
+        if (UtilValidate.isNotEmpty(modelForm.getDefaultTableStyle())) {
+            writer.append(FlexibleStringExpander.expandString(modelForm.getDefaultTableStyle(), context));
+        } else {
+            writer.append("basic-table form-widget-table dark-grid");
+        }
+        writer.append("\">");
+        appendWhitespace(writer);
+    }
+
+    public void renderFormatListWrapperClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append(" </table>");
+
+        appendWhitespace(writer);
+        if (this.renderPagination) {
+            this.renderNextPrev(writer, context, modelForm);
+        }
+        renderEndingBoundaryComment(writer, "Form Widget - Formal List Wrapper", modelForm);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatHeaderRowOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatHeaderRowOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("  <tr");
+        String headerStyle = FlexibleStringExpander.expandString(modelForm.getHeaderRowStyle(), context);
+        writer.append(" class=\"");
+        if (UtilValidate.isNotEmpty(headerStyle)) {
+            writer.append(headerStyle);
+        } else {
+            writer.append("header-row");
+        }
+        writer.append("\">");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatHeaderRowClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatHeaderRowClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("  </tr>");
+
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatHeaderRowCellOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm, org.ofbiz.widget.model.ModelFormField, int positionSpan)
+     */
+    public void renderFormatHeaderRowCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField, int positionSpan) throws IOException {
+        writer.append("   <td");
+        String areaStyle = modelFormField.getTitleAreaStyle();
+        if (positionSpan > 1) {
+            writer.append(" colspan=\"");
+            writer.append(Integer.toString(positionSpan));
+            writer.append("\"");
+        }
+        if (UtilValidate.isNotEmpty(areaStyle)) {
+            writer.append(" class=\"");
+            writer.append(areaStyle);
+            writer.append("\"");
+        }
+        writer.append(">");
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatHeaderRowCellClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFormatHeaderRowCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField) throws IOException {
+        writer.append("</td>");
+        appendWhitespace(writer);
+    }
+
+    public void renderFormatHeaderRowFormCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("   <td");
+        String areaStyle = modelForm.getFormTitleAreaStyle();
+        if (UtilValidate.isNotEmpty(areaStyle)) {
+            writer.append(" class=\"");
+            writer.append(areaStyle);
+            writer.append("\"");
+        }
+        writer.append(">");
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatHeaderRowFormCellClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatHeaderRowFormCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("</td>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatHeaderRowFormCellTitleSeparator(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm, boolean)
+     */
+    public void renderFormatHeaderRowFormCellTitleSeparator(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField, boolean isLast) throws IOException {
+
+        String titleStyle = modelFormField.getTitleStyle();
+        if (UtilValidate.isNotEmpty(titleStyle)) {
+            writer.append("<span class=\"");
+            writer.append(titleStyle);
+            writer.append("\">");
+        }
+        if (isLast) {
+            writer.append(" - ");
+        } else {
+            writer.append(" - ");
+        }
+        if (UtilValidate.isNotEmpty(titleStyle)) {
+            writer.append("</span>");
+        }
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatItemRowOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatItemRowOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        Integer itemIndex = (Integer)context.get("itemIndex");
+
+        writer.append("  <tr");
+        if (itemIndex!=null) {
+
+            String altRowStyles = modelForm.getStyleAltRowStyle(context);
+            if (itemIndex.intValue() % 2 == 0) {
+                String evenRowStyle = modelForm.getEvenRowStyle();
+                if (UtilValidate.isNotEmpty(evenRowStyle)) {
+                    writer.append(" class=\"");
+                    writer.append(evenRowStyle);
+                    if (UtilValidate.isNotEmpty(altRowStyles)) {
+                        writer.append(altRowStyles);
+                    }
+                    writer.append("\"");
+                } else {
+                    if (UtilValidate.isNotEmpty(altRowStyles)) {
+                        writer.append(" class=\"");
+                        writer.append(altRowStyles);
+                        writer.append("\"");
+                    }
+                }
+            } else {
+                String oddRowStyle = FlexibleStringExpander.expandString(modelForm.getOddRowStyle(), context);
+                if (UtilValidate.isNotEmpty(oddRowStyle)) {
+                    writer.append(" class=\"");
+                    writer.append(oddRowStyle);
+                    if (UtilValidate.isNotEmpty(altRowStyles)) {
+                        writer.append(altRowStyles);
+                    }
+                    writer.append("\"");
+                } else {
+                    if (UtilValidate.isNotEmpty(altRowStyles)) {
+                        writer.append(" class=\"");
+                        writer.append(altRowStyles);
+                        writer.append("\"");
+                    }
+                }
+            }
+        }
+        writer.append(">");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatItemRowClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatItemRowClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("  </tr>");
+
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatItemRowCellOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFormatItemRowCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField, int positionSpan) throws IOException {
+        writer.append("   <td");
+        String areaStyle = modelFormField.getWidgetAreaStyle();
+        if (positionSpan > 1) {
+            writer.append(" colspan=\"");
+            writer.append(Integer.toString(positionSpan));
+            writer.append("\"");
+        }
+        if (UtilValidate.isNotEmpty(areaStyle)) {
+            writer.append(" class=\"");
+            writer.append(areaStyle);
+            writer.append("\"");
+        }
+        writer.append(">");
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatItemRowCellClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFormatItemRowCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm, ModelFormField modelFormField) throws IOException {
+        writer.append("</td>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatItemRowFormCellOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatItemRowFormCellOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("   <td");
+        String areaStyle = modelForm.getFormWidgetAreaStyle();
+        if (UtilValidate.isNotEmpty(areaStyle)) {
+            writer.append(" class=\"");
+            writer.append(areaStyle);
+            writer.append("\"");
+        }
+        writer.append(">");
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatItemRowFormCellClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatItemRowFormCellClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("</td>");
+        appendWhitespace(writer);
+    }
+
+    public void renderFormatSingleWrapperOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append(" <table cellspacing=\"0\"");
+        if (UtilValidate.isNotEmpty(modelForm.getDefaultTableStyle())) {
+            writer.append(" class=\"").append(FlexibleStringExpander.expandString(modelForm.getDefaultTableStyle(), context)).append("\"");
+        }
+        writer.append(">");
+        appendWhitespace(writer);
+    }
+
+    public void renderFormatSingleWrapperClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append(" </table>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatFieldRowOpen(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("  <tr>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowClose(java.io.Writer, java.util.Map, org.ofbiz.widget.form.model.ModelForm)
+     */
+    public void renderFormatFieldRowClose(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("  </tr>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowTitleCellOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFormatFieldRowTitleCellOpen(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        writer.append("   <td");
+        String areaStyle = modelFormField.getTitleAreaStyle();
+        if (UtilValidate.isNotEmpty(areaStyle)) {
+            writer.append(" class=\"");
+            writer.append(areaStyle);
+            writer.append("\"");
+        } else {
+            writer.append(" class=\"label\"");
+        }
+        writer.append(">");
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowTitleCellClose(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFormatFieldRowTitleCellClose(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        writer.append("</td>");
+        appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowSpacerCell(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField)
+     */
+    public void renderFormatFieldRowSpacerCell(Appendable writer, Map<String, Object> context, ModelFormField modelFormField) throws IOException {
+        // Embedded styling - bad idea
+        //writer.append("<td>&nbsp;</td>");
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowWidgetCellOpen(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField, int)
+     */
+    public void renderFormatFieldRowWidgetCellOpen(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, int positions, int positionSpan, Integer nextPositionInRow) throws IOException {
+//        writer.append("<td width=\"");
+//        if (nextPositionInRow != null || modelFormField.getPosition() > 1) {
+//            writer.append("30");
+//        } else {
+//            writer.append("80");
+//        }
+//        writer.append("%\"");
+        writer.append("   <td");
+        if (positionSpan > 0) {
+            writer.append(" colspan=\"");
+            // do a span of 1 for this column, plus 3 columns for each spanned
+            //position or each blank position that this will be filling in
+            writer.append(Integer.toString(1 + (positionSpan * 3)));
+            writer.append("\"");
+        }
+        String areaStyle = modelFormField.getWidgetAreaStyle();
+        if (UtilValidate.isNotEmpty(areaStyle)) {
+            writer.append(" class=\"");
+            writer.append(areaStyle);
+            writer.append("\"");
+        }
+        writer.append(">");
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderFormatFieldRowWidgetCellClose(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField, int)
+     */
+    public void renderFormatFieldRowWidgetCellClose(Appendable writer, Map<String, Object> context, ModelFormField modelFormField, int positions, int positionSpan, Integer nextPositionInRow) throws IOException {
+        writer.append("</td>");
+        appendWhitespace(writer);
+    }
+
+    public void renderFormatEmptySpace(Appendable writer, Map<String, Object> context, ModelForm modelForm) throws IOException {
+        writer.append("&nbsp;");
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderTextFindField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.TextFindField)
+     */
+    public void renderTextFindField(Appendable writer, Map<String, Object> context, TextFindField textFindField) throws IOException {
+
+        ModelFormField modelFormField = textFindField.getModelFormField();
+
+        String defaultOption = textFindField.getDefaultOption();
+        Locale locale = (Locale)context.get("locale");
+        if (!textFindField.getHideOptions()) {
+            String opEquals = UtilProperties.getMessage("conditional", "equals", locale);
+            String opBeginsWith = UtilProperties.getMessage("conditional", "begins_with", locale);
+            String opContains = UtilProperties.getMessage("conditional", "contains", locale);
+            String opIsEmpty = UtilProperties.getMessage("conditional", "is_empty", locale);
+            String opNotEqual = UtilProperties.getMessage("conditional", "not_equal", locale);
+            writer.append(" <select name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append("_op\" class=\"selectBox\">");
+            writer.append("<option value=\"equals\"").append(("equals".equals(defaultOption)? " selected": "")).append(">").append(opEquals).append("</option>");
+            writer.append("<option value=\"like\"").append(("like".equals(defaultOption)? " selected": "")).append(">").append(opBeginsWith).append("</option>");
+            writer.append("<option value=\"contains\"").append(("contains".equals(defaultOption)? " selected": "")).append(">").append(opContains).append("</option>");
+            writer.append("<option value=\"empty\"").append(("empty".equals(defaultOption)? " selected": "")).append(">").append(opIsEmpty).append("</option>");
+            writer.append("<option value=\"notEqual\"").append(("notEqual".equals(defaultOption)? " selected": "")).append(">").append(opNotEqual).append("</option>");
+            writer.append("</select>");
+        } else {
+            writer.append(" <input type=\"hidden\" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append("_op\" value=\"").append(defaultOption).append("\"/>");
+        }
+
+        writer.append("<input type=\"text\"");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append('"');
+
+        String value = modelFormField.getEntry(context, textFindField.getDefaultValue(context));
+        if (UtilValidate.isNotEmpty(value)) {
+            writer.append(" value=\"");
+            writer.append(value);
+            writer.append('"');
+        }
+
+        writer.append(" size=\"");
+        writer.append(Integer.toString(textFindField.getSize()));
+        writer.append('"');
+
+        Integer maxlength = textFindField.getMaxlength();
+        if (maxlength != null) {
+            writer.append(" maxlength=\"");
+            writer.append(maxlength.toString());
+            writer.append('"');
+        }
+
+        if (!textFindField.getClientAutocompleteField()) {
+            writer.append(" autocomplete=\"off\"");
+        }
+
+        writer.append("/>");
+
+        if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle())) {
+            writer.append(" <span class=\"");
+            writer.append(modelFormField.getTitleStyle());
+            writer.append("\">");
+        }
+
+        String ignoreCase = UtilProperties.getMessage("conditional", "ignore_case", locale);
+        boolean ignCase = textFindField.getIgnoreCase();
+
+        if (!textFindField.getHideIgnoreCase()) {
+            writer.append(" <input type=\"checkbox\" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append("_ic\" value=\"Y\"").append((ignCase ? " checked=\"checked\"" : "")).append("/>");
+            writer.append(ignoreCase);
+        } else {
+            writer.append("<input type=\"hidden\" name=\"");
+            writer.append(modelFormField.getParameterName(context));
+            writer.append("_ic\" value=\"").append((ignCase ? "Y" : "")).append("\"/>");
+        }
+
+        if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle())) {
+            writer.append("</span>");
+        }
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderRangeFindField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.RangeFindField)
+     */
+    public void renderRangeFindField(Appendable writer, Map<String, Object> context, RangeFindField rangeFindField) throws IOException {
+
+        ModelFormField modelFormField = rangeFindField.getModelFormField();
+        Locale locale = (Locale)context.get("locale");
+        String opEquals = UtilProperties.getMessage("conditional", "equals", locale);
+        String opGreaterThan = UtilProperties.getMessage("conditional", "greater_than", locale);
+        String opGreaterThanEquals = UtilProperties.getMessage("conditional", "greater_than_equals", locale);
+        String opLessThan = UtilProperties.getMessage("conditional", "less_than", locale);
+        String opLessThanEquals = UtilProperties.getMessage("conditional", "less_than_equals", locale);
+        //String opIsEmpty = UtilProperties.getMessage("conditional", "is_empty", locale);
+
+        writer.append("<input type=\"text\"");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append("_fld0_value\"");
+
+        String value = modelFormField.getEntry(context, rangeFindField.getDefaultValue(context));
+        if (UtilValidate.isNotEmpty(value)) {
+            writer.append(" value=\"");
+            writer.append(value);
+            writer.append('"');
+        }
+
+        writer.append(" size=\"");
+        writer.append(Integer.toString(rangeFindField.getSize()));
+        writer.append('"');
+
+        Integer maxlength = rangeFindField.getMaxlength();
+        if (maxlength != null) {
+            writer.append(" maxlength=\"");
+            writer.append(maxlength.toString());
+            writer.append('"');
+        }
+
+        if (!rangeFindField.getClientAutocompleteField()) {
+            writer.append(" autocomplete=\"off\"");
+        }
+
+        writer.append("/>");
+
+        if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle())) {
+            writer.append(" <span class=\"");
+            writer.append(modelFormField.getTitleStyle());
+            writer.append("\">");
+        }
+
+        String defaultOptionFrom = rangeFindField.getDefaultOptionFrom();
+        writer.append(" <select name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append("_fld0_op\" class=\"selectBox\">");
+        writer.append("<option value=\"equals\"").append(("equals".equals(defaultOptionFrom)? " selected": "")).append(">").append(opEquals).append("</option>");
+        writer.append("<option value=\"greaterThan\"").append(("greaterThan".equals(defaultOptionFrom)? " selected": "")).append(">").append(opGreaterThan).append("</option>");
+        writer.append("<option value=\"greaterThanEqualTo\"").append(("greaterThanEqualTo".equals(defaultOptionFrom)? " selected": "")).append(">").append(opGreaterThanEquals).append("</option>");
+        writer.append("</select>");
+
+        writer.append("</span>");
+
+        writer.append(" <br/> ");
+
+        writer.append("<input type=\"text\"");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append("_fld1_value\"");
+
+        value = modelFormField.getEntry(context);
+        if (UtilValidate.isNotEmpty(value)) {
+            writer.append(" value=\"");
+            writer.append(value);
+            writer.append('"');
+        }
+
+        writer.append(" size=\"");
+        writer.append(Integer.toString(rangeFindField.getSize()));
+        writer.append('"');
+
+        if (maxlength != null) {
+            writer.append(" maxlength=\"");
+            writer.append(maxlength.toString());
+            writer.append('"');
+        }
+
+        if (!rangeFindField.getClientAutocompleteField()) {
+            writer.append(" autocomplete=\"off\"");
+        }
+
+        writer.append("/>");
+
+        String defaultOptionThru = rangeFindField.getDefaultOptionThru();
+        writer.append(" <select name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append("_fld1_op\" class=\"selectBox\">");
+        writer.append("<option value=\"lessThan\"").append(("lessThan".equals(defaultOptionThru)? " selected": "")).append(">").append(opLessThan).append("</option>");
+        writer.append("<option value=\"lessThanEqualTo\"").append(("lessThanEqualTo".equals(defaultOptionThru)? " selected": "")).append(">").append(opLessThanEquals).append("</option>");
+        writer.append("</select>");
+
+        if (UtilValidate.isNotEmpty(modelFormField.getTitleStyle())) {
+            writer.append("</span>");
+        }
+
+        this.appendTooltip(writer, context, modelFormField);
+
+        //appendWhitespace(writer);
+    }
+
+    /* (non-Javadoc)
+     * @see org.ofbiz.widget.form.FormStringRenderer#renderDateFindField(java.io.Writer, java.util.Map, org.ofbiz.widget.model.ModelFormField.DateFindField)
+     */
+    public void renderDateFindField(Appendable writer, Map<String, Object> context, DateFindField dateFindField) throws IOException {
+        ModelFormField modelFormField = dateFindField.getModelFormField();
+
+        Locale locale = (Locale)context.get("locale");
+        String opEquals = UtilProperties.getMessage("conditional", "equals", locale);
+        String opGreaterThan = UtilProperties.getMessage("conditional", "greater_than", locale);
+        String opSameDay = UtilProperties.getMessage("conditional", "same_day", locale);
+        String opGreaterThanFromDayStart = UtilProperties.getMessage("conditional",
+                                                "greater_than_from_day_start", locale);
+        String opLessThan = UtilProperties.getMessage("conditional", "less_than", locale);
+        String opUpToDay = UtilProperties.getMessage("conditional", "up_to_day", locale);
+        String opUpThruDay = UtilProperties.getMessage("conditional", "up_thru_day", locale);
+        String opIsEmpty = UtilProperties.getMessage("conditional", "is_empty", locale);
+
+        Map<String, String> uiLabelMap = UtilGenerics.checkMap(context.get("uiLabelMap"));
+        if (uiLabelMap == null) {
+            Debug.logWarning("Could not find uiLabelMap in context", module);
+        }
+        String localizedInputTitle = "", localizedIconTitle = "";
+
+        writer.append("<input type=\"text\"");
+
+        appendClassNames(writer, context, modelFormField);
+
+        writer.append(" name=\"");
+        writer.append(modelFormField.getParameterName(context));
+        writer.append("_fld0_value\"");
+
+        // the default values for a timestamp
+        int size = 25;
+        int maxlength = 30;
+
+        if ("date".equals(dateFindField.getType())) {
+            size = maxlength = 10;
+            if (uiLabelMap != null) {

[... 955 lines stripped ...]