(no commit message)
[jquery.git] / ajax / ajax.js
index fef1e22..f7c858a 100644 (file)
@@ -133,52 +133,113 @@ $.fn.load = function(a,o,f) {
 };
 
 /**
- * function: $.fn.formValues
- * usage: $('#frmLogin').formValues()
- * docs: Gets form values and creates a key=>value array of the found values (for ENABLED elements!)
+ * name:       $.fn.formValues
+ * example:    $('#frmLogin').formValues('sButton')
+ * docs:       Gets form values and creates a key=>value array of the found values.
+ *             Optionally adds the button which is clicked if you provide it.
+ *             Only does this for ENABLED elements in the order of the form.
  */
-$.fn.formValues = function() {
+$.fn.formValues = function(sButton) {
        var a = [];
-       $("input,textarea,option",this).filter(":enabled").each(function(){
-               // Skip selects with options which are not selected
-               if ((this.parentNode.type == 'select-one' || this.parentNode.type == 'select-multiple') && !this.selected) {
-                       return null;
-               }
+       var elp = {INPUT:true, TEXTAREA:true, OPTION:true};
 
-               // Skip radio and checkbox elements which are not checked
-               if ((this.type == 'radio' || this.type == 'checkbox') && !this.checked) {
-                       return null;
-               }
+       // Loop the shite
+       $('*', this).each(function() {
+               // Skip disabled elements
+               if (this.disabled)
+                       return;
+
+               // Skip elements not of the types in elp
+               if (!elp[this.tagName.toUpperCase()])
+                       return;
+
+               // Skip submit buttons and image elements
+               if ((this.type == 'submit') || (this.type == 'image'))
+                       return;
+
+
+               // Skip non-selected options
+               var sP = this.parentNode.nodeName.toUpperCase();
+               if (((sP == 'SELECT') || (sP == 'OPTGROUP')) && (!this.selected))
+                       return;
 
-               // All other elements are valid
+               // Skip non-checked nodes
+               if (((this.type == 'radio') || (this.type == 'checkbox')) && (!this.checked))
+                       return;
+
+               // If we come here, everything is fine
+               var sN = this.name || this.id || this.parentNode.name || this.parentNode.id;
+               var sV = this.value;
+               if ((!sN) && (sP == 'OPTGROUP'))
+                       sN = this.parentNode.parentNode.name || this.parentNode.parentNode.id;
+
+               // Add the data
+               a.push({ name: sN, value: sV });
+       });
+
+       // Add submit button if needed
+       if (sButton && (sButton !== null)) {
+               var el = $(sButton).get(0);
                a.push({
-                       name: this.name || this.id || this.parentNode.name || this.parentNode.id,
-                       value: this.value
+                       name: el.name || el.id || el.parentNode.name || el.parentNode.id,
+                       value: el.value
                });
-       });
+       }
+
+       // Done
        return a;
 };
 
 /**
- * function: $.update
- * usage: $.update('someJQueryObject', 'someurl', 'array');
- * docs: Mimics the ajaxUpdater from prototype. Posts the key=>value array to the url and
- * puts the results from that call in the jQuery object specified.
- * --> If you set the blnNoEval to true, the script tags are NOT evaluated.
+ * name:       $.fn.update
+ * example:    $('someJQueryObject').update('sURL', 'sAction', 'aValues', 'fCallback');
+ * docs:       Calls sURL with sAction and sends the aValues
+ *                 Puts the results from that call in the jQuery object and calls fCallback
  */
-$.update = function(objElement, strURL, arrValues, fncCallback) {
-       $.post(strURL, arrValues, function(strHTML) {
-               // Update the element with the new HTML
-               objElement.html(strHTML);
-
-               // Evaluate the scripts
-               objElement.html(strHTML).find("script").each(function(){
-                       try {
-                               $.eval( this.text || this.textContent || this.innerHTML );
-                       } catch(e) { }
-               });
+$.fn.update = function(sURL, sMethod, aValues, fCallback) {
+       var el = this;
+
+       // Process
+       $.xml(
+               sMethod || "GET",
+               sURL || "",
+               $.param(aValues),
+               function(sResult) {
+                       sResult = $.httpData(sResult);
+
+                       // Update the element with the new HTML
+                       el.html(sResult);
+
+                       // Evaluate the scripts AFTER this (so you can allready modify the new HTML!)
+                       el.html(sResult).find("script").each(function(){
+                               try { $.eval( this.text || this.textContent || this.innerHTML ); } catch(e) { }
+                       });
+
+                       // And call the callback handler :)
+                       if (fCallback && (fCallback.constructor == Function))
+                               fCallback();
+               }
+       );
+};
 
-               // Callback handler
-               if (fncCallback) { fncCallback(); }
-       });
+/**
+ * name:                       $.fn.serialize
+ * example:    $('someJQueryObject').serialize('sButton', 'fCallback');
+ * docs:       Calls the form's action with the correct method and the serialized values.
+ *             Optionally adds the button which is clicked if you provide it.
+ *             When there are results, the fCallback function is called.
+ */
+$.fn.serialize = function(sButton, fCallback) {
+       var el = this.get(0);
+
+       // Process
+       $.xml(
+               el.method || "GET",
+               el.action || "",
+               $.param(this.formValues(sButton)),
+               function(sResult) {
+                       if (fCallback && (fCallback.constructor == Function))
+                               fCallback($.httpData(sResult));
+               }
+       );
 };