jquery core: makeArray was parsing forms into array of elements.
[jquery.git] / src / core.js
index c5fb865..9752fb1 100644 (file)
  */
 
 // Map over jQuery in case of overwrite
-if ( window.jQuery )
-       var _jQuery = window.jQuery;
+var _jQuery = window.jQuery,
+// Map over the $ in case of overwrite 
+       _$ = window.$;
 
-var jQuery = window.jQuery = function( selector, context ) {
+var jQuery = window.jQuery = window.$ = function( selector, context ) {
        // The jQuery object is actually just the init constructor 'enhanced'
-       return new jQuery.prototype.init( selector, context );
+       return new jQuery.fn.init( selector, context );
 };
 
-// Map over the $ in case of overwrite
-if ( window.$ )
-       var _$ = window.$;
-       
-// Map the jQuery namespace to the '$' one
-window.$ = jQuery;
-
 // A simple way to check for HTML strings or ID strings
 // (both of which we optimize for)
-var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
 
 // Is it a simple selector
-var isSimple = /^.[^:#\[\.]*$/;
+       isSimple = /^.[^:#\[\.]*$/;
 
 jQuery.fn = jQuery.prototype = {
        init: function( selector, context ) {
@@ -42,9 +36,9 @@ jQuery.fn = jQuery.prototype = {
                        this[0] = selector;
                        this.length = 1;
                        return this;
-
+               }
                // Handle HTML strings
-               } else if ( typeof selector == "string" ) {
+               if ( typeof selector == "string" ) {
                        // Are we dealing with HTML string or an ID?
                        var match = quickExpr.exec( selector );
 
@@ -60,32 +54,27 @@ jQuery.fn = jQuery.prototype = {
                                        var elem = document.getElementById( match[3] );
 
                                        // Make sure an element was located
-                                       if ( elem )
+                                       if ( elem ){
                                                // Handle the case where IE and Opera return items
                                                // by name instead of ID
                                                if ( elem.id != match[3] )
                                                        return jQuery().find( selector );
 
                                                // Otherwise, we inject the element directly into the jQuery object
-                                               else {
-                                                       this[0] = elem;
-                                                       this.length = 1;
-                                                       return this;
-                                               }
-
-                                       else
-                                               selector = [];
+                                               return jQuery( elem );
+                                       }
+                                       selector = [];
                                }
 
                        // HANDLE: $(expr, [context])
                        // (which is just equivalent to: $(content).find(expr)
                        } else
-                               return new jQuery( context ).find( selector );
+                               return jQuery( context ).find( selector );
 
                // HANDLE: $(function)
                // Shortcut for document ready
                } else if ( jQuery.isFunction( selector ) )
-                       return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
+                       return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
                
                return this.setArray(jQuery.makeArray(selector));
        },
@@ -359,9 +348,7 @@ jQuery.fn = jQuery.prototype = {
        },
 
        is: function( selector ) {
-               return selector ?
-                       jQuery.multiFilter( selector, this ).length > 0 :
-                       false;
+               return !!selector && jQuery.multiFilter( selector, this ).length > 0;
        },
 
        hasClass: function( selector ) {
@@ -473,13 +460,13 @@ jQuery.fn = jQuery.prototype = {
                var parts = key.split(".");
                parts[1] = parts[1] ? "." + parts[1] : "";
 
-               if ( value == null ) {
+               if ( value === undefined ) {
                        var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
                        
-                       if ( data == undefined && this.length )
+                       if ( data === undefined && this.length )
                                data = jQuery.data( this[0], key );
 
-                       return data == null && parts[1] ?
+                       return data === undefined && parts[1] ?
                                this.data( parts[0] ) :
                                data;
                } else
@@ -536,7 +523,7 @@ jQuery.fn = jQuery.prototype = {
 };
 
 // Give the init function the jQuery prototype for later instantiation
-jQuery.prototype.init.prototype = jQuery.prototype;
+jQuery.fn.init.prototype = jQuery.fn;
 
 function evalScript( i, elem ) {
        if ( elem.src )
@@ -553,6 +540,10 @@ function evalScript( i, elem ) {
                elem.parentNode.removeChild( elem );
 }
 
+function now(){
+       return +new Date;
+}
+
 jQuery.extend = jQuery.fn.extend = function() {
        // copy reference to target object
        var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
@@ -570,9 +561,9 @@ jQuery.extend = jQuery.fn.extend = function() {
                target = {};
 
        // extend jQuery itself if only one argument is passed
-       if ( length == 1 ) {
+       if ( length == i ) {
                target = this;
-               i = 0;
+               --i;
        }
 
        for ( ; i < length; i++ )
@@ -580,17 +571,19 @@ jQuery.extend = jQuery.fn.extend = function() {
                if ( (options = arguments[ i ]) != null )
                        // Extend the base object
                        for ( var name in options ) {
+                               var src = target[ name ], copy = options[ name ]; 
+                               
                                // Prevent never-ending loop
-                               if ( target === options[ name ] )
+                               if ( target === copy )
                                        continue;
 
                                // Recurse if we're merging object values
-                               if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
-                                       target[ name ] = jQuery.extend( deep, target[ name ], options[ name ] );
+                               if ( deep && copy && typeof copy == "object" && src && !copy.nodeType )
+                                       target[ name ] = jQuery.extend( deep, src, copy );
 
                                // Don't bring in undefined values
-                               else if ( options[ name ] != undefined )
-                                       target[ name ] = options[ name ];
+                               else if ( copy !== undefined )
+                                       target[ name ] = copy;
 
                        }
 
@@ -598,12 +591,12 @@ jQuery.extend = jQuery.fn.extend = function() {
        return target;
 };
 
-var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {};
+var expando = "jQuery" + now(), uuid = 0, windowData = {},
 
 // exclude the following css properties to add px
-var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
+       exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
 // cache getComputedStyle
-var getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
+       getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
 
 jQuery.extend({
        noConflict: function( deep ) {
@@ -671,7 +664,7 @@ jQuery.extend({
                        jQuery.cache[ id ] = {};
                
                // Prevent overriding the named cache with undefined values
-               if ( data != undefined )
+               if ( data !== undefined )
                        jQuery.cache[ id ][ name ] = data;
                
                // Return the named cache data, or the ID for the element       
@@ -722,24 +715,26 @@ jQuery.extend({
 
        // args is for internal usage only
        each: function( object, callback, args ) {
+               var name, i = 0, length = object.length;
+               
                if ( args ) {
-                       if ( object.length == undefined ) {
-                               for ( var name in object )
+                       if ( length == undefined ) {
+                               for ( name in object )
                                        if ( callback.apply( object[ name ], args ) === false )
                                                break;
                        } else
-                               for ( var i = 0, length = object.length; i < length; i++ )
-                                       if ( callback.apply( object[ i ], args ) === false )
+                               for ( ; i < length; )
+                                       if ( callback.apply( object[ i++ ], args ) === false )
                                                break;
 
                // A special, fast, case for the most common use of each
                } else {
-                       if ( object.length == undefined ) {
-                               for ( var name in object )
+                       if ( length == undefined ) {
+                               for ( name in object )
                                        if ( callback.call( object[ name ], name, object[ name ] ) === false )
                                                break;
                        } else
-                               for ( var i = 0, length = object.length, value = object[0]; 
+                               for ( var value = object[0]; 
                                        i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
                }
 
@@ -824,7 +819,7 @@ jQuery.extend({
        },
 
        curCSS: function( elem, name, force ) {
-               var ret;
+               var ret, style = elem.style;
 
                // A helper method for determining if an element's values are broken
                function color( elem ) {
@@ -838,7 +833,7 @@ jQuery.extend({
 
                // We need to handle opacity special in IE
                if ( name == "opacity" && jQuery.browser.msie ) {
-                       ret = jQuery.attr( elem.style, "opacity" );
+                       ret = jQuery.attr( style, "opacity" );
 
                        return ret == "" ?
                                "1" :
@@ -846,17 +841,17 @@ jQuery.extend({
                }
                // Opera sometimes will give the wrong display answer, this fixes it, see #2037
                if ( jQuery.browser.opera && name == "display" ) {
-                       var save = elem.style.outline;
-                       elem.style.outline = "0 solid black";
-                       elem.style.outline = save;
+                       var save = style.outline;
+                       style.outline = "0 solid black";
+                       style.outline = save;
                }
                
                // Make sure we're using the right name for getting the float value
                if ( name.match( /float/i ) )
                        name = styleFloat;
 
-               if ( !force && elem.style && elem.style[ name ] )
-                       ret = elem.style[ name ];
+               if ( !force && style && style[ name ] )
+                       ret = style[ name ];
 
                else if ( getComputedStyle ) {
 
@@ -874,15 +869,15 @@ jQuery.extend({
                        // If the element isn't reporting its values properly in Safari
                        // then some display: none elements are involved
                        else {
-                               var swap = [], stack = [];
+                               var swap = [], stack = [], a = elem, i = 0;
 
                                // Locate all of the parent display: none elements
-                               for ( var a = elem; a && color(a); a = a.parentNode )
+                               for ( ; a && color(a); a = a.parentNode )
                                        stack.unshift(a);
 
                                // Go through and make them visible, but in reverse
                                // (It would be better if we knew the exact display type that they had)
-                               for ( var i = 0; i < stack.length; i++ )
+                               for ( ; i < stack.length; i++ )
                                        if ( color( stack[ i ] ) ) {
                                                swap[ i ] = stack[ i ].style.display;
                                                stack[ i ].style.display = "block";
@@ -895,7 +890,7 @@ jQuery.extend({
                                        ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
 
                                // Finally, revert the display styles back
-                               for ( var i = 0; i < swap.length; i++ )
+                               for ( i = 0; i < swap.length; i++ )
                                        if ( swap[ i ] != null )
                                                stack[ i ].style.display = swap[ i ];
                        }
@@ -918,16 +913,16 @@ jQuery.extend({
                        // but a number that has a weird ending, we need to convert it to pixels
                        if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
                                // Remember the original values
-                               var style = elem.style.left, runtimeStyle = elem.runtimeStyle.left;
+                               var left = style.left, rsLeft = elem.runtimeStyle.left;
 
                                // Put in the new values to get a computed value out
                                elem.runtimeStyle.left = elem.currentStyle.left;
-                               elem.style.left = ret || 0;
-                               ret = elem.style.pixelLeft + "px";
+                               style.left = ret || 0;
+                               ret = style.pixelLeft + "px";
 
                                // Revert the changed values
-                               elem.style.left = style;
-                               elem.runtimeStyle.left = runtimeStyle;
+                               style.left = left;
+                               elem.runtimeStyle.left = rsLeft;
                        }
                }
 
@@ -946,7 +941,7 @@ jQuery.extend({
                                return;
 
                        if ( elem.constructor == Number )
-                               elem = elem.toString();
+                               elem += '';
                        
                        // Convert html string into DOM nodes
                        if ( typeof elem == "string" ) {
@@ -1114,14 +1109,14 @@ jQuery.extend({
        makeArray: function( array ) {
                var ret = [];
 
-               if( array != undefined ){
+               if( array != null ){
                        var i = array.length;
-                       //the window, strings and functions also have 'length'
-                       if( i != undefined && typeof array == 'object' && array != window )
+                       //the window, forms, strings and functions also have 'length'
+                       if( i == null || array.split || array.setInterval || array.call || array.elements )
+                               ret[0] = array;
+                       else
                                while( i )
                                        ret[--i] = array[i];
-                       else
-                               ret[0] = array;
                }
 
                return ret;
@@ -1138,16 +1133,16 @@ jQuery.extend({
        merge: function( first, second ) {
                // We have to loop this way because IE & Opera overwrite the length
                // expando of getElementsByTagName
-
+               var i = 0;
                // Also, we need to make sure that the correct elements are being returned
                // (IE returns comment nodes in a '*' query)
                if ( jQuery.browser.msie ) {
-                       for ( var i = 0; second[ i ]; i++ )
+                       for ( ; second[ i ]; i++ )
                                if ( second[ i ].nodeType != 8 )
                                        first.push( second[ i ] );
 
                } else
-                       for ( var i = 0; second[ i ]; i++ )
+                       for ( ; second[ i ]; i++ )
                                first.push( second[ i ] );
 
                return first;
@@ -1194,15 +1189,11 @@ jQuery.extend({
                for ( var i = 0, length = elems.length; i < length; i++ ) {
                        var value = callback( elems[ i ], i );
 
-                       if ( value !== null && value != undefined ) {
-                               if ( value.constructor != Array )
-                                       value = [ value ];
-
-                               ret = ret.concat( value );
-                       }
+                       if ( value != null )
+                               ret[ ret.length ] = value;
                }
 
-               return ret;
+               return ret.concat.apply( [], ret );
        }
 });