Removed unnecessary instances of === or !==.
[jquery.git] / ajax / ajax.js
index fef1e22..87a90b3 100644 (file)
@@ -115,7 +115,7 @@ $.fn.load = function(a,o,f) {
                f = o;
                o = null;
        }
-       if (o !== null) {
+       if (typeof o !== 'undefined') {
                o = $.param(o);
                t = "POST";
        }
@@ -124,7 +124,7 @@ $.fn.load = function(a,o,f) {
                h = h.responseText;
                self.html(h).find("script").each(function(){
                        try {
-                               $.eval( this.text || this.textContent || this.innerHTML );
+                               $.eval( this.text || this.textContent || this.innerHTML || "");
                        } catch(e){}
                });
                if(f){f(h);}
@@ -133,52 +133,116 @@ $.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;
-               }
-
-               // Skip radio and checkbox elements which are not checked
-               if ((this.type == 'radio' || this.type == 'checkbox') && !this.checked) {
-                       return null;
-               }
+       var ok = {INPUT:true, TEXTAREA:true, OPTION:true};
+
+       // Loop the shite
+       $('*', this).each(function() {
+               // Skip elements not of the types in ok
+               if (!ok[this.tagName.toUpperCase()])
+                       return;
+
+               // Skip disabled elements
+               if (this.disabled)
+                       return;
+
+               // Skip submit buttons and image elements
+               if ((this.type == 'submit') || (this.type == 'image'))
+                       return;
+
+               // Skip non-selected options
+               var oParent = this.parentNode;
+               var sNn = oParent.nodeName.toUpperCase();
+               if (((sNn == 'SELECT') || (sNn == 'OPTGROUP')) && (!this.selected))
+                       return;
+
+               // Skip non-checked nodes
+               if (((this.type == 'radio') || (this.type == 'checkbox')) && (!this.checked))
+                       return;
+
+               // If we come here, everything is fine
+               var sKey = this.name || this.id || oParent.name || oParent.id;
+               var sValue = this.value;
+
+               // If we don't have an ID, and the parent is an OPTGROUP,
+               // get the NAME or ID of the OPTGROUP's parent
+               if ((!sKey) && (sNn == 'OPTGROUP') && (oParent = oParent.parentNode))
+                       sKey = oParent.name || oParent.id;
+
+               // Add the data
+               a.push({ name: sKey, value: sValue });
+       });
 
-               // All other elements are valid
+       // 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));
+               }
+       );
 };