- this.find("input[@type='submit'],input[@type='hidden'],textarea,input[@checked],input[@type='password'],input[@type='text'],option[@selected]").filter(":enabled").each(function() {
- o = {};
- o.name = this.name || this.id || this.parentNode.name || this.parentNode.id;
- o.value = this.value;
- a.push(o);
+ 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 });
+ });
+
+ // Add submit button if needed
+ if (sButton && (sButton !== null)) {
+ var el = $(sButton).get(0);
+ a.push({
+ name: el.name || el.id || el.parentNode.name || el.parentNode.id,
+ value: el.value