You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by sy...@apache.org on 2006/02/20 12:15:34 UTC

svn commit: r379087 - in /cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms: formmodel/ resources/ resources/css/ resources/js/ resources/mattkruse-lib/

Author: sylvain
Date: Mon Feb 20 03:15:25 2006
New Revision: 379087

URL: http://svn.apache.org/viewcvs?rev=379087&view=rev
Log:
Migration of Ajax stuff to Dojo, orderable repeater and inline-edit styling

Added:
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js   (with props)
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js   (with props)
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js   (with props)
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js   (with props)
Removed:
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/cforms.js
Modified:
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Form.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Repeater.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterAction.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinitionBuilder.java
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/css/forms.css
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-advanced-field-styling.xsl
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-field-styling.xsl
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/forms-lib.js
    cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/mattkruse-lib/PopupWindow.js

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/AbstractWidget.java Mon Feb 20 03:15:25 2006
@@ -426,14 +426,11 @@
         // top-level widget-containers like forms will have their id set to ""
         // for those the @id should not be included.
         if (getId().length() != 0) {
-        	attrs.addCDATAAttribute("id", getRequestParameterName());
+            attrs.addCDATAAttribute("id", getRequestParameterName());
         }
 
-        // Add the "state" attribute if different from active (the default state)
-        WidgetState state = getCombinedState();
-        if (state != WidgetState.ACTIVE) {
-            attrs.addCDATAAttribute("state", getCombinedState().getName());
-        }
+        // Add the "state" attribute
+        attrs.addCDATAAttribute("state", getCombinedState().getName());
         
         // Add the "listening" attribute is the value has change listeners
         if (this instanceof ValueChangedListenerEnabled &&

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Form.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Form.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Form.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Form.java Mon Feb 20 03:15:25 2006
@@ -314,17 +314,23 @@
             // Find the submit widget, if not an action
             // This has to occur after reading from the request, to handle stateless forms
             // where the submit widget is recreated when the request is read (e.g. a row-action).
-            String submitId = formContext.getRequest().getParameter(SUBMIT_ID_PARAMETER);
-            if (!StringUtils.isEmpty(submitId)) {
-                // if the form has an ID, it is used as part of the submitId too and must be removed
-                if(!StringUtils.isEmpty(this.getId())) {
-                    submitId = submitId.substring(submitId.indexOf('.')+1);
+            
+            // Note that we don't check this if the submit widget was already set, as it can cause problems
+            // if the user triggers submit with an input (which sets 'forms_submit_id'), then clicks back
+            // and submits using a regular submit button.
+            if (getSubmitWidget() == null) {
+                String submitId = formContext.getRequest().getParameter(SUBMIT_ID_PARAMETER);
+                if (!StringUtils.isEmpty(submitId)) {
+                    // if the form has an ID, it is used as part of the submitId too and must be removed
+                    if(!StringUtils.isEmpty(this.getId())) {
+                        submitId = submitId.substring(submitId.indexOf('.')+1);
+                    }
+                    Widget submit = this.lookupWidget(submitId.replace('.', '/'));
+                    if (submit == null) {
+                        throw new IllegalArgumentException("Invalid submit id (no such widget): " + submitId);
+                    }
+                    setSubmitWidget(submit);
                 }
-                Widget submit = this.lookupWidget(submitId.replace('.', '/'));
-                if (submit == null) {
-                    throw new IllegalArgumentException("Invalid submit id (no such widget): " + submitId);
-                }
-                setSubmitWidget(submit);
             }
 
             // Fire events, still buffering them: this ensures they will be handled in the same

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Repeater.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Repeater.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Repeater.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/Repeater.java Mon Feb 20 03:15:25 2006
@@ -16,12 +16,15 @@
 package org.apache.cocoon.forms.formmodel;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.forms.FormsConstants;
 import org.apache.cocoon.forms.FormContext;
+import org.apache.cocoon.forms.FormsRuntimeException;
 import org.apache.cocoon.forms.util.I18nMessage;
 import org.apache.cocoon.forms.event.WidgetEvent;
 import org.apache.cocoon.forms.validation.ValidationError;
@@ -56,7 +59,8 @@
     private final RepeaterDefinition definition;
     protected final List rows = new ArrayList();
     protected ValidationError validationError;
-
+    private boolean selectable = false;
+    private boolean orderable = false;
 
     public Repeater(RepeaterDefinition repeaterDefinition) {
         super(repeaterDefinition);
@@ -66,6 +70,9 @@
         for (int i = 0; i < this.definition.getInitialSize(); i++) {
             rows.add(new RepeaterRow(definition));
         }
+        
+        this.selectable = this.definition.getSelectable();
+        this.orderable = this.definition.getOrderable();
     }
 
     public WidgetDefinition getDefinition() {
@@ -235,7 +242,6 @@
      */
     public void removeRows() {
         clear();
-        getForm().addWidgetUpdate(this);
     }
 
     /**
@@ -267,7 +273,10 @@
             return;
 
         // read number of rows from request, and make an according number of rows
-        String sizeParameter = formContext.getRequest().getParameter(getRequestParameterName() + ".size");
+        Request req = formContext.getRequest();
+        String paramName = getRequestParameterName();
+        
+        String sizeParameter = req.getParameter(paramName + ".size");
         if (sizeParameter != null) {
             int size = 0;
             try {
@@ -299,6 +308,55 @@
             RepeaterRow row = (RepeaterRow)rowIt.next();
             row.readFromRequest(formContext);
         }
+        
+        // Handle selection
+        if (this.selectable) {
+            String[] selectedIds = req.getParameterValues(paramName + ".select");
+            BitSet selection = new BitSet(getSize());
+            
+            // Create selection bitmask
+            if (selectedIds != null) {
+                for (int i = 0; i < selectedIds.length; i++) {
+                    int rowId = Integer.parseInt(selectedIds[i]);
+                    selection.set(rowId);
+                }
+            }
+            
+            // And update the selected state of all rows
+            for (int i = 0; i < getSize(); i++) {
+                getRow(i).setSelected(selection.get(i));
+            }
+        }
+        
+        // Handle repeater-level actions
+        String action = req.getParameter(paramName + ".action");
+        if (action == null) {
+            return;
+        }
+
+        // Handle row move. It's important for this to happen *after* row.readFromRequest,
+        // as reordering rows changes their IDs and therefore their child widget's ID too.
+        if (action.equals("move")) {
+            if (!this.orderable) {
+                throw new FormsRuntimeException(this + " is not orderable", getLocation());
+            }
+            int from = Integer.parseInt(req.getParameter(paramName + ".from"));
+            int before = Integer.parseInt(req.getParameter(paramName + ".before"));
+            
+            Object row = this.rows.get(from);
+            // Add to the new location
+            this.rows.add(before, row);
+            // Remove from the previous one, taking into account potential location change
+            // because of the previous add()
+            if (before < from) from++;
+            this.rows.remove(from);
+            
+            // Needs refresh
+            getForm().addWidgetUpdate(this);
+            
+        } else {
+            throw new FormsRuntimeException("Unknown action " + action + " for " + this, getLocation());
+        }
     }
 
     /**
@@ -446,6 +504,7 @@
 
         private int cachedPosition = -100;
         private String cachedId = "--undefined--";
+        private boolean selected = false;
 
         public String getId() {
             int pos = rows.indexOf(this);
@@ -479,6 +538,17 @@
             Iterator it = this.getChildren();
             while(it.hasNext()) {
               ((Widget)it.next()).initialize();
+            }
+        }
+        
+        public boolean getSelected() {
+            return this.selected;
+        }
+        
+        public void setSelected(boolean selected) {
+            if (selected != this.selected) {
+                this.selected = selected;
+                getForm().addWidgetUpdate(this);
             }
         }
 

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterAction.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterAction.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterAction.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterAction.java Mon Feb 20 03:15:25 2006
@@ -15,8 +15,6 @@
  */
 package org.apache.cocoon.forms.formmodel;
 
-import org.apache.cocoon.forms.FormContext;
-
 /**
  * An action that acts on a repeater.
  * 
@@ -57,35 +55,5 @@
         }
         
         return this.repeater;
-    }
-    
-    public static class Move extends RepeaterAction {
-        private int from;
-        private int to;
-        
-        public Move(RepeaterActionDefinition definition) {
-            super(definition);
-        }
-        
-        public void readFromRequest(FormContext formContext) {
-            String fullName = getFullName();
-            String fromStr = formContext.getRequest().getParameter(fullName + ".from");
-            if (fromStr != null) {
-                from = Integer.parseInt(fromStr);
-                to = Integer.parseInt(formContext.getRequest().getParameter(fullName + ".to"));
-            } else {
-                from = -1;
-                to = -1;
-            }
-            super.readFromRequest(formContext);
-        }
-        
-        public int getFrom() {
-            return from;
-        }
-        
-        public int getTo() {
-            return to;
-        }
     }
 }

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterActionDefinition.java Mon Feb 20 03:15:25 2006
@@ -198,21 +198,4 @@
             });
         }
     }
-
-    public static class MoveRowActionDefinition extends RepeaterActionDefinition {
-
-        public MoveRowActionDefinition(String repeaterName) {
-            super(repeaterName);
-            this.addActionListener(new ActionListener() {
-                public void actionPerformed(ActionEvent event) {
-                    RepeaterAction.Move move = (RepeaterAction.Move)event.getSource();
-                    Repeater repeater = move.getRepeater();
-                    repeater.moveRow(move.getFrom(), move.getTo());              
-                }
-            });
-        }
-        public Widget createInstance() {
-            return new RepeaterAction.Move(this);
-        }
-    }
 }

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinition.java Mon Feb 20 03:15:25 2006
@@ -24,12 +24,16 @@
     private int initialSize = 0;
     private int minSize;
     private int maxSize;
+    private boolean selectable;
+    private boolean orderable;
 
-    public RepeaterDefinition(int initialSize, int minSize, int maxSize) {
+    public RepeaterDefinition(int initialSize, int minSize, int maxSize, boolean selectable, boolean orderable) {
         super();
         this.initialSize = initialSize;
         this.minSize = minSize;
         this.maxSize = maxSize;
+        this.selectable = selectable;
+        this.orderable = orderable;
     }
     
     /**
@@ -62,5 +66,13 @@
 
     public int getMinSize() {
         return this.minSize;
+    }
+    
+    public boolean getOrderable() {
+        return this.orderable;
+    }
+
+    public boolean getSelectable() {
+        return this.selectable;
     }
 }

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinitionBuilder.java
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinitionBuilder.java?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinitionBuilder.java (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/formmodel/RepeaterDefinitionBuilder.java Mon Feb 20 03:15:25 2006
@@ -47,8 +47,11 @@
 
         // initial size is at least the min size
         initialSize = minSize > initialSize ? minSize : initialSize;
-                
-        RepeaterDefinition repeaterDefinition = new RepeaterDefinition(initialSize, minSize, maxSize);
+        
+        boolean orderable = DomHelper.getAttributeAsBoolean(repeaterElement, "orderable", false);
+        boolean selectable = DomHelper.getAttributeAsBoolean(repeaterElement, "selectable", false);
+
+        RepeaterDefinition repeaterDefinition = new RepeaterDefinition(initialSize, minSize, maxSize, selectable, orderable);
         super.setupDefinition(repeaterElement, repeaterDefinition);
         setDisplayData(repeaterElement, repeaterDefinition);
 

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/css/forms.css
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/css/forms.css?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/css/forms.css (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/css/forms.css Mon Feb 20 03:15:25 2006
@@ -73,3 +73,8 @@
 .forms-doubleList input {
     width: 40px;
 }
+
+/** Style for drag'n drop indicator */
+.forms-dropIndicator {
+	border-top: 4px solid black;
+}
\ No newline at end of file

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-advanced-field-styling.xsl
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-advanced-field-styling.xsl?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-advanced-field-styling.xsl (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-advanced-field-styling.xsl Mon Feb 20 03:15:25 2006
@@ -223,4 +223,31 @@
     </div>
   </xsl:template>
 
+  <!--+
+      | Field with in-place editing
+      +-->
+  <xsl:template match="fi:field[fi:styling/@type='inplace' and @state='active']">
+    <xsl:choose>
+      <xsl:when test="fi:value">
+        <span id="{@id}">
+          <script type="text/javascript">dojo.require("dojo.widget.InlineEditBox")</script>
+          <span dojoType="InlineEditBox" onSave="dojo.byId('{@id}:input').value = arguments[0]">
+            <xsl:attribute name="onSave">
+              <xsl:text>dojo.byId('{@id}:input').value = arguments[0];</xsl:text>
+              <xsl:if test="@listening = 'true' and not(fi:styling/@submit-on-change = 'false') and not(fi:styling/@onchange)">
+                <xsl:text>forms_submitForm(dojo.byId('{@id}:input'))</xsl:text>
+              </xsl:if>
+            </xsl:attribute>
+            <xsl:value-of select="fi:value"/>
+          </span>
+          <input id="{@id}:input" type="hidden" name="{@id}" value="{fi:value}"/>
+        </span>
+      </xsl:when>
+      <xsl:otherwise>
+        <!-- Produce a regular input -->
+        <xsl:apply-imports/>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
 </xsl:stylesheet>

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-field-styling.xsl
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-field-styling.xsl?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-field-styling.xsl (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/forms-field-styling.xsl Mon Feb 20 03:15:25 2006
@@ -27,21 +27,25 @@
                 exclude-result-prefixes="fi">
 
   <xsl:template match="head" mode="forms-field">
+    <!-- copy any pre-initialization code which can be used e.g. to setup dojo debugging with
+         <script> djConfig = {isDebug: true} </script> -->
+    <xsl:copy-of select="fi:init/node()"/>
+    <script src="{$resources-uri}/dojo/dojo.js" type="text/javascript"/>
+    <script src="{$resources-uri}/ajax/js/cocoon.js" type="text/javascript"/>
     <script src="{$resources-uri}/forms/js/forms-lib.js" type="text/javascript"/>
-    <script src="{$resources-uri}/ajax/js/cocoon-ajax.js" type="text/javascript"/>
-    <script src="{$resources-uri}/forms/js/cforms.js" type="text/javascript"/>
+    <script type="text/javascript">
+        dojo.addOnLoad(forms_onload);
+        dojo.require("cocoon.forms.*");
+    </script>
     <link rel="stylesheet" type="text/css" href="{$resources-uri}/forms/css/forms.css"/>
   </xsl:template>
+  
+  <xsl:template match="fi:init">
+    <!-- ignore, was handled above -->
+  </xsl:template>
 
   <xsl:template match="body" mode="forms-field">
     <xsl:copy-of select="@*"/>
-    <xsl:attribute name="onload">forms_onload();<xsl:value-of select="@onload"/></xsl:attribute>
-  </xsl:template>
-
-  <xsl:template match="body" mode="forms-afterload">
-    <script language="Javascript">
-       forms_afterLoad();
-    </script>
   </xsl:template>
 
   <!--+
@@ -378,7 +382,7 @@
       | fi:action
       +-->
   <xsl:template match="fi:action">
-    <input id="{@id}" type="submit" name="{@id}" title="{fi:hint}" onclick="forms_submitForm(this, '{@id}'); return false">
+    <input id="{@id}" type="submit" name="{@id}" title="{fi:hint}">
       <xsl:attribute name="value"><xsl:value-of select="fi:label/node()"/></xsl:attribute>
       <xsl:apply-templates select="." mode="styling"/>
     </input>
@@ -554,12 +558,19 @@
   <xsl:template match="fi:form-template|fi:form-generated">
     <form>
       <xsl:copy-of select="@*"/>
-      <xsl:attribute name="onsubmit">forms_onsubmit(); <xsl:value-of select="@onsubmit"/></xsl:attribute>
+      <xsl:choose>
+        <xsl:when test="@ajax = 'true'">
+          <xsl:attribute name="dojoType">CFormsForm</xsl:attribute>
+          <xsl:if test="@ajax = 'true'">
+            <script type="text/javascript">cocoon.forms.ajax = true;</script>
+          </xsl:if>
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:attribute name="onsubmit">forms_onsubmit(); <xsl:value-of select="@onsubmit"/></xsl:attribute>
+        </xsl:otherwise>
+      </xsl:choose>
       <!-- hidden field to store the submit id -->
       <div><input type="hidden" name="forms_submit_id"/></div>
-      <xsl:if test="@ajax = 'true'">
-        <script type="text/javascript">cocoon.forms.ajax = true;</script>
-      </xsl:if>
       <xsl:apply-templates/>
 
       <!-- TODO: consider putting this in the xml stream from the generator? -->

Added: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js?rev=379087&view=auto
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js (added)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js Mon Feb 20 03:15:25 2006
@@ -0,0 +1,174 @@
+/*
+ * Copyright 1999-2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+dojo.provide("cocoon.forms.CFormsForm");
+dojo.require("dojo.event");
+dojo.require("dojo.widget.DomWidget");
+dojo.require("cocoon.ajax.BUHandler");
+
+/**
+ * Dojo widget for forms, that handles the Ajax interaction with the server.
+ *
+ * @version $Id$
+ */
+// Extends the base DomWidget class. We don't need all the HtmlWidget stuff
+// but need traversal of the DOM to build child widgets
+cocoon.forms.CFormsForm = function() {
+	dojo.widget.DomWidget.call(this);
+};
+
+dojo.inherits(cocoon.forms.CFormsForm, dojo.widget.DomWidget);
+
+dojo.lang.extend(cocoon.forms.CFormsForm, {
+	// Properties
+	
+	// Widget definition
+	widgetType: "CFormsForm",
+    isContainer: true,
+    buildRendering: function(args, parserFragment, parentWidget) {
+	
+        // Magical statement to get the dom node, stolen in DomWidget
+	    this.domNode = parserFragment["dojo:"+this.widgetType.toLowerCase()].nodeRef;
+
+        this.id = this.domNode.getAttribute("id");
+
+        this.domNode.setAttribute("dojoWidgetId", this.widgetId);
+
+        dojo.event.connect("around", this.domNode, "onsubmit", this, "_browserSubmit");
+        dojo.event.connect(this.domNode, "onclick", this, "_grabClickTarget");
+    },
+
+    _grabClickTarget: function(event) {
+        // Keep targets of onclick so that we can know what input triggered the submit
+        // (the event in onsubmit() is the HTMLFormElement).
+        this.lastClickTarget = dojo.html.getEventTarget(event);
+    },
+
+    /** Connected to the forms 'onsubmit' event, called when the user clicks a submit input */
+    _browserSubmit: function(invocation) {
+        if (invocation.proceed() == false) {
+            // onsubmit handlers stopped submission
+            return false;
+        }
+
+        var event = invocation.args[0] || window.event;
+        // Interestingly, FF provides the explicitOriginalTarget property that can avoid
+        // grabClickTarget above, but avoid browser specifics for now.
+        var target = /*event.explicitOriginalTarget ||*/ this.lastClickTarget;
+
+        this.submit(target.name);
+        // If real submit has to occur, it's taken care of in submit()
+        return false;
+    },
+
+    /**
+     * Submit the form, choosing automatically Ajax or fullpage mode depending on the
+     * widgets in the form.
+     *
+     * @param name the name of the widget that triggered the submit (if any)
+     * @param params an object containing additional parameters to be added to the
+     *        query string (optional)
+     */
+    submit: function(name, params) {
+        var form = this.domNode;
+        
+        var query = cocoon.forms.buildQueryString(form, name);
+        if (!query) {
+            if (params) alert("FIXME: handle additional params in CFormsForm.submit()");
+            // Some inputs are not ajax-compatible. Fall back to full page reload
+            form["forms_submit_id"].value = name;
+            form.submit();
+            return;
+        }
+        
+        query += cocoon.forms.encodeParams(params, true);
+
+        // Provide feedback that something is happening.
+        document.body.style.cursor = "wait";
+
+        // The "ajax-action" attribute specifies an alternate submit location used in Ajax mode.
+        // This allows to use Ajax in the portal where forms are normally posted to the portal URL.
+        var uri = form.getAttribute("ajax-action");
+        if (!uri) uri = form.action;
+        if (uri == "") uri = document.location;
+        
+        // FIXME: revisit with dojo.io.bind(), but need to see what happens if we say
+        // mimetype="text/xml" and no XML is sent back
+        var req = dojo.hostenv.getXmlhttpObject()
+
+        req.open("POST", uri, true);
+        req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
+        var thisWidget = this;
+        req.onreadystatechange = function() {
+            if (req.readyState == 4) {
+                thisWidget._handleBrowserUpdate(req);
+            }
+        }
+        req.send(query);
+    },
+    
+    /**
+     * Handle the server response
+     */
+    _handleBrowserUpdate: function(request) {
+	    // Restore normal cursor
+	    document.body.style.cursor = "auto";
+        var updater = new cocoon.ajax.BUHandler();
+	    if (request.status == 200) {
+            // Handle browser update directives
+            var doc = request.responseXML;
+            if (!doc) {
+                cocoon.ajax.BUHandler.handleError("No xml answer", request);
+                return;
+            }
+            
+            var thisWidget = this;
+            updater.handlers['continue'] = function() { thisWidget._continue(); }
+            updater.processResponse(doc, request);
+	    } else {
+	        updater.handleError("Request failed - status=" + request.status, request);
+	    }
+	},
+	
+	_continue: function() {
+	    var form = this.domNode;
+	    if (form.method.toLowerCase() == "post") {
+	        // Create a fake form and post it
+	        var div = document.createElement("div");
+	        var content = "<form action='" + form.action + "' method='POST'>" +
+	                  "<input type='hidden' name='cocoon-ajax-continue' value='true'/>";
+		    if (form.elements["continuation-id"]) {
+		        content += "<input type='hidden' name='continuation-id' value='" +
+		            form.elements["continuation-id"].value + "'/>";
+		    }
+		    content += "</form>";
+		    div.innerHTML = content;
+		    document.body.appendChild(div);
+		    div.firstChild.submit();
+	    } else {	    
+	        // Redirect to the form's action URL
+		    var contParam = '?cocoon-ajax-continue=true';
+		    if (form.elements["continuation-id"]) {
+		        contParam += "&continuation-id=" + form.elements["continuation-id"].value;
+		    }
+		    window.location.href = form.action + contParam;
+		}
+	}
+});
+
+dojo.widget.tags.addParseTreeHandler("dojo:CFormsForm");
+// Register this module as a widget package
+dojo.widget.manager.registerWidgetPackage("cocoon.forms");
+

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsForm.js
------------------------------------------------------------------------------
    svn:keywords = Id

Added: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js?rev=379087&view=auto
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js (added)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js Mon Feb 20 03:15:25 2006
@@ -0,0 +1,152 @@
+/*
+ * Copyright 1999-2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+dojo.provide("cocoon.forms.CFormsRepeater");
+dojo.require("dojo.dnd.HtmlDragAndDrop");
+dojo.require("dojo.event");
+dojo.require("dojo.widget.DomWidget");
+
+/**
+ * Dojo widget for repeaters, that handles drag'n drop reordering and selection
+ * by clicking in the rows.
+ * <p>
+ * The drop indicator can be styled with the "forms-dropIndicator" CSS class.
+ *
+ * @version $Id$
+ */
+// Extends the base DomWidget class. We don't need all the HtmlWidget stuff
+// but need traversal of the DOM to build child widgets
+cocoon.forms.CFormsRepeater = function() {
+	dojo.widget.DomWidget.call(this);
+};
+
+dojo.inherits(cocoon.forms.CFormsRepeater, dojo.widget.DomWidget);
+
+dojo.lang.extend(cocoon.forms.CFormsRepeater, {
+	// Properties
+	orderable: false,
+	select: "none",
+	
+	// Widget definition
+	widgetType: "CFormsRepeater",
+    isContainer: true,
+    buildRendering: function(args, parserFragment, parentWidget) {
+	    // FIXME: we should destroy all drag sources and drop targets when the widget is destroyed
+        // Magical statement to get the dom node, stolen in DomWidget
+	    this.domNode = parserFragment["dojo:"+this.widgetType.toLowerCase()].nodeRef;
+	    
+        this.id = this.domNode.getAttribute("id");
+        dojo.debug("Creating repeater " + this.id);
+        if (!this.orderable && this.select == "none") {
+            dojo.debug("CFormsRepeater '" + this.id + "' is not orderable nor selectable");
+        }
+
+        if (this.orderable) {
+	        // Get the parent of the first repeater row (may be different from this.domNode)
+	        var firstRow = dojo.byId(this.id + ".0");
+	        if (!firstRow) return;
+
+            // Check that TR's are in TBODY otherwise it doesn't work
+	        if (firstRow.tagName.toLowerCase() == "tr" && firstRow.parentNode.tagName.toLowerCase() != "tbody") {
+	            throw "CFormsRepeater requires TR's to be in a TBODY (check '" + this.id + "')";
+	        }
+
+			var type = "cforms-" + this.id;
+			var dropTarget = new dojo.dnd.HtmlDropTarget(firstRow.parentNode, [type]);
+
+			dropTarget.createDropIndicator = function() {
+				this.dropIndicator = document.createElement("div");
+				this.dropIndicator.className = "forms-dropIndicator";
+				with (this.dropIndicator.style) {
+					position = "absolute";
+					zIndex = 1;
+					width = dojo.style.getInnerWidth(this.domNode) + "px";
+					left = dojo.style.getAbsoluteX(this.domNode) + "px";
+				}
+			};
+			dojo.event.connect(dropTarget, "insert", this, "afterInsert");
+		
+			var row;
+			for (var idx = 0; row = dojo.byId(this.id + "." + idx); idx++) {
+				var dragSource = new dojo.dnd.HtmlDragSource(row, type);
+				row.style.cursor = "move";
+            }
+        }
+
+        if (true || this.select == "single" || this.select == "multiple") {
+	        var row;
+	        var widget = this;
+	        for (var idx = 0; row = dojo.byId(this.id + "." + idx); idx++) {
+		        (function() {
+		            var localIdx = idx; // to use it in the closure
+		            var localRow = row;
+		            dojo.event.connect(row, "onclick", function(e) { widget.selectRow(e, localRow, localIdx) })
+			    })()
+            }
+        }
+    },
+
+    /**
+     * Called after a dropped node has been inserted at its target position
+     * @param e the event (has a "dragObject" property)
+     * @param refNode the reference node for the insertion
+     * @param the insertion position relative to refNode ("before" or "after")
+     */
+    afterInsert: function(e, refNode, position) {
+	    var parts = e.dragObject.domNode.getAttribute("id").split('.');
+	    var source = parseInt(parts[parts.length - 1]);
+	    parts = refNode.getAttribute("id").split('.');
+	    var before = parseInt(parts[parts.length - 1]);
+	    // Compute the row number before which to place the moved row
+	    if (position == "after") before++;
+	    if (before == source || before == source + 1) return; // no change needed
+	
+//		dojo.debug("moving row " + source + " before " + before + " (" + position + ")");
+
+		// submit the form to update server-side model
+		var form = cocoon.forms.getForm(this.domNode);
+		var params = {};
+		params[this.id + ".action"] = "move";
+		params[this.id + ".from"]   = source;
+		params[this.id + ".before"] = before;
+		dojo.widget.byId(form.getAttribute("dojoWidgetId")).submit(this.id, params);
+    },
+
+    isValidEvent: function(e) {
+	    var elt = dojo.html.getEventTarget(e);
+	    if (!elt) return true;
+	    if (elt.onclick) return false;
+	    var name = elt.tagName.toLowerCase();
+	    return (name != "input" && name != "a");
+    },
+
+    selectRow: function(e, row, idx) {
+	    if (this.isValidEvent(e)) {
+	        if (row.getAttribute("selected") == "true") {
+	            row.setAttribute("selected", "false");
+	            row.style.background = "none";
+	        } else {
+	            row.setAttribute("selected", "true");
+	            row.style.background = "green";
+	        }
+		    dojo.debug("clic " + idx); //+ " from " + elt.tagName + " onclick=" + elt.onclick);
+	    }
+	}
+});
+
+dojo.widget.tags.addParseTreeHandler("dojo:CFormsRepeater");
+// Register this module as a widget package
+dojo.widget.manager.registerWidgetPackage("cocoon.forms");
+

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/CFormsRepeater.js
------------------------------------------------------------------------------
    svn:keywords = Id

Added: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js?rev=379087&view=auto
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js (added)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js Mon Feb 20 03:15:25 2006
@@ -0,0 +1,24 @@
+/*
+ * Copyright 1999-2006 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+dojo.hostenv.conditionalLoadModule({
+        common: [
+                "cocoon.forms.common",
+                "cocoon.forms.CFormsForm",
+                "cocoon.forms.CFormsRepeater"
+        ]
+});
+
+dojo.hostenv.moduleLoaded("cocoon.forms.*");

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/__package__.js
------------------------------------------------------------------------------
    svn:keywords = Id

Added: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js?rev=379087&view=auto
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js (added)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js Mon Feb 20 03:15:25 2006
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2005 The Apache Software Foundation.
+ *
+ * Licensed 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.
+ */
+
+/**
+ * Utility functions for form handling.
+ *
+ * @version $Id$
+ */
+// Can be loaded either through "cocoon.forms" or "cocoon.forms.common"
+// or individually out of Dojo.
+if (dojo) {
+    dojo.provide("cocoon.forms");
+    dojo.provide("cocoon.forms.common");
+} else {
+    cocoon = cocoon || {};
+    cocoon.forms = cocoon.forms || {};
+}
+
+/**
+ * Get the form of an element
+ */
+cocoon.forms.getForm = function(element) {
+    while(element != null && element.tagName != "FORM") {
+        element = element.parentNode;
+    }
+    return element;
+}
+
+/**
+ * Submits a form. If ajax mode is on and the browser is ajax-aware, the page isn't reloaded
+ */
+cocoon.forms.submitForm = function(element, name) {
+    var form = this.getForm(element);
+    if (form == null) {
+        alert("Cannot find form for " + element);
+        return;
+    }
+
+    if (!name) name = element.name;
+
+	var dojoId = form.getAttribute("dojoWidgetId");
+    if (dojoId) {
+        // Delegate to the CFormsForm widget
+        dojo.widget.byId(dojoId).submit(name);
+
+    } else {
+        // Regular submit. How old-fashioned :-)
+        
+        // Send the identifier of the widget that triggered the submit
+        form["forms_submit_id"].value = name;
+
+        // A form's onsubmit is only called when submit is triggered by user action, but not when
+        // called by a script. So don't forget to call it, cancelling the submit if (and only if)
+        // it returns false
+	    if (!form.onsubmit || form.onsubmit() != false) {
+	        form.submit();
+	    }
+	}
+}
+
+// Override the default forms_submitForm
+forms_submitForm = function() { cocoon.forms.submitForm.apply(cocoon.forms, arguments) };
+
+/**
+ * Build a query string with all form inputs.
+ *
+ * @parameter form the form element
+ * @parameter submitId the ID of the widget that submitted the form
+ * @return the query string for the form, or null if some inputs cannot be
+ *         send in Ajax mode (e.g. file inputs)
+ */
+cocoon.forms.buildQueryString = function(form, submitId) {
+    // Indicate to the server that we're in ajax mode
+    var result = "cocoon-ajax=true";
+    
+    // If the form has a forms_submit_id input, use it to avoid sending the value twice
+    if (form["forms_submit_id"]) {
+        form["forms_submit_id"].value = submitId;
+    } else {
+        if (submitId) result += "&forms_submit_id=" + submitId;
+    }
+
+    // Iterate on all form controls
+    for (var i = 0; i < form.elements.length; i++) {
+        input = form.elements[i];
+        if (typeof(input.type) == "undefined") {
+        	    // Skip fieldset
+            continue;
+        }
+        if (input.type == "submit" || input.type == "image" || input.type == "button") {
+            // Skip buttons
+            continue;
+        }
+        if ((input.type == "checkbox" || input.type == "radio") && !input.checked) {
+            // Skip unchecked checkboxes and radio buttons
+            continue;
+        }
+        if (input.type == "file") {
+            // Can't send files in Ajax mode. Fall back to full page
+            return null;
+        }
+        if (input.tagName.toLowerCase() == "select" && input.multiple) {
+            var name = encodeURIComponent(input.name);
+            var options = input.options;
+            for (var zz = 0; zz < options.length; zz++) {
+                if (options[zz].selected) {
+                    result += "&" + name + "=" + encodeURIComponent(options[zz].value);
+                }
+            }
+            // don't use the default fallback
+            continue;
+        }
+        
+        // text, passwod, textarea, hidden, single select
+        result += "&" + encodeURIComponent(input.name) + "=" + encodeURIComponent(input.value);
+    }
+    return result;
+}
+
+/**
+ * Encode an object as querystring parameters.
+ *
+ * @parameter params the object to encode
+ * @isAppending if true, "&" is prepended to the result
+ * @return the querystring
+ */
+cocoon.forms.encodeParams = function(params, isAppending) {
+    if (!params) return "";
+    var result = "";
+    var sep = isAppending ? "&" : "";
+    for (var name in params) {
+        result += sep + encodeURIComponent(name) + "=" + encodeURIComponent(params[name]);
+        sep = "&";
+    }
+    return result;
+}

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/common.js
------------------------------------------------------------------------------
    svn:keywords = Id

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/forms-lib.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/forms-lib.js?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/forms-lib.js (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/js/forms-lib.js Mon Feb 20 03:15:25 2006
@@ -15,6 +15,10 @@
 */
 /**
  * Runtime JavaScript library for Cocoon forms.
+ * NOTE: This file will be trimmed down to contain only the necessary
+ *       features for dynamic behaviour on non Ajax-capable browsers.
+ *       Advanced widgets such as double selection list and multivalue
+ *       field will be refactored as Dojo widgets.
  *
  * @version $Id$
  */
@@ -58,18 +62,14 @@
  * 'forms_submit_id' field the name of the element which triggered the submit.
  */
 function oldforms_submitForm(element, name) {
-    // Mac IE 5 doesn't recognize key word 'undefined', so use typeof and compare strings
-    if (typeof(name) == "undefined") {
-      name = element.name;
-    }
+    name = name || element.name;
     
     var form = forms_getForm(element);
     if (form == null) {
         alert("Cannot find form for " + element);
     } else {
         form["forms_submit_id"].value = name;
-        // FIXME: programmatically submitting the form doesn't trigger onsubmit ? (both in IE and Moz)
-        if (forms_onsubmit()) {
+        if (!form.onsubmit || form.onsubmit() != false) {
             form.submit();
         }
     }

Modified: cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/mattkruse-lib/PopupWindow.js
URL: http://svn.apache.org/viewcvs/cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/mattkruse-lib/PopupWindow.js?rev=379087&r1=379086&r2=379087&view=diff
==============================================================================
--- cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/mattkruse-lib/PopupWindow.js (original)
+++ cocoon/trunk/cocoon-forms/cocoon-forms-impl/src/main/java/org/apache/cocoon/forms/resources/mattkruse-lib/PopupWindow.js Mon Feb 20 03:15:25 2006
@@ -277,7 +277,11 @@
 		}
 	window.popupWindowOldEventListener = document.onmouseup;
 	if (window.popupWindowOldEventListener != null) {
-		document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
+		document.onmouseup = function(e) {
+			window.popupWindowOldEventListener(e);
+			PopupWindow_hidePopupWindows(e);
+		    }
+		//document.onmouseup = new Function("window.popupWindowOldEventListener(); PopupWindow_hidePopupWindows();");
 		}
 	else {
 		document.onmouseup = PopupWindow_hidePopupWindows;