Integration of Mike Alsup's excellent form serialization code. The benefits are as...
[jquery.git] / src / jquery / jquery.js
index 338df7f..d5a32e2 100644 (file)
@@ -228,8 +228,7 @@ jQuery.fn = jQuery.prototype = {
                        jQuery.unique( data ) : data );
        },
 
-       clone: function(deep) {
-               deep = deep != undefined ? deep : true;
+       clone: function() {
                var $this = this.add(this.find("*"));
                if (jQuery.browser.msie) {
                        // Need to remove events on the element and its descendants
@@ -242,7 +241,7 @@ jQuery.fn = jQuery.prototype = {
 
                // Do the clone
                var r = this.pushStack( jQuery.map( this, function(a){
-                       return a.cloneNode( deep );
+                       return a.cloneNode( true );
                }) );
 
                if (jQuery.browser.msie) {
@@ -257,15 +256,13 @@ jQuery.fn = jQuery.prototype = {
                }
 
                // copy form values over
-               if (deep) {
-                       var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]');
-                       $this.filter('select,input[@type=checkbox]').each(function(i) {
-                               if (this.selectedIndex)
-                                       inputs[i].selectedIndex = this.selectedIndex;
-                               if (this.checked)
-                                       inputs[i].checked = true;
-                       });
-               }
+               var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]');
+               $this.filter('select,input[@type=checkbox]').each(function(i) {
+                       if (this.selectedIndex)
+                               inputs[i].selectedIndex = this.selectedIndex;
+                       if (this.checked)
+                               inputs[i].checked = true;
+               });
 
                // Return the cloned set
                return r;
@@ -309,9 +306,32 @@ jQuery.fn = jQuery.prototype = {
        },
        
        val: function( val ) {
-               return val == undefined ?
-                       ( this.length ? this[0].value : null ) :
-                       this.attr( "value", val );
+               if ( val == undefined ) {
+                   if ( this.length ) {
+                       var elem = this[0];
+                       
+                       // We need to handle select boxes special\r                              if ( jQuery.nodeName(elem, "select") ) {\r                                       var index = elem.selectedIndex,
+                                               a = [],
+                                               options = elem.options,
+                                               one = elem.type == "select-one";
+                                       
+                                       // Nothing was selected\r                                        if ( index < 0 )
+                                               return null;\r
+
+                                       // Loop through all the selected options\r                                       for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
+                                               var option = options[i];\r                                               if ( option.selected ) {\r                                                       // Get the specifc value for the option\r                                                        var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
+                                                       
+                                                       // We don't need an array for one selects\r                                                      if ( one )
+                                                               return val;
+                                                       
+                                                       // Multi-Selects return an array\r                                                       a.push(val);\r                                           }\r                                      }
+                                       \r                                       return a;
+                                       
+                               // Everything else, we just grab the value\r                             } else
+                                       return this[0].value.replace(/\r/g, "");
+                       }
+               } else
+                       return this.attr( "value", val );
        },
        
        html: function( val ) {
@@ -328,13 +348,17 @@ jQuery.fn = jQuery.prototype = {
                return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
        },
 
-       map: function(fn){
+       map: function(fn) {
                return this.pushStack(jQuery.map( this, function(elem,i){
                        return fn.call( elem, i, elem );
                }));
        },
+
+       andSelf: function() {
+               return this.add( this.prevObject );
+       },
        
-       domManip: function(args, table, dir, fn){
+       domManip: function(args, table, dir, fn) {
                var clone = this.length > 1, a; 
 
                return this.each(function(){
@@ -636,6 +660,11 @@ jQuery.extend({
                        
                        // Convert html string into DOM nodes
                        if ( typeof arg == "string" ) {
+                               // Fix "XHTML"-style tags in all browsers
+                               arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
+                                       return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
+                               });
+
                                // Trim whitespace, otherwise indexOf won't work as expected
                                var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
 
@@ -731,9 +760,15 @@ jQuery.extend({
                // IE elem.getAttribute passes even for style
                else if ( elem.tagName ) {
 
-                       if ( value != undefined ) elem.setAttribute( name, value );
+                       if ( value != undefined ) {
+                               if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
+                                       throw "type property can't be changed";
+                               elem.setAttribute( name, value );
+                       }
+
                        if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
                                return elem.getAttribute( name, 2 );
+
                        return elem.getAttribute( name );
 
                // elem is actually elem.style ... set the style
@@ -955,13 +990,6 @@ jQuery.each( {
        };
 });
 
-// DEPRECATED
-jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){
-       jQuery.fn[ n ] = function(num,fn) {
-               return this.filter( ":" + n + "(" + num + ")", fn );
-       };
-});
-
 jQuery.each( [ "height", "width" ], function(i,n){
        jQuery.fn[ n ] = function(h) {
                return h == undefined ?