Fix for a selector speed regression (calling a simple selector many times resulted...
[jquery.git] / src / jquery / jquery.js
index b7091e2..8089e4e 100644 (file)
@@ -9,9 +9,6 @@
  * $Rev$
  */
 
-// Global undefined variable
-window.undefined = window.undefined;
-
 /**
  * Create a new jQuery Object
  *
@@ -22,7 +19,7 @@ window.undefined = window.undefined;
  * @param jQuery|Element|Array<Element> c context
  * @cat Core
  */
-var jQuery = function(a,c) {
+window.jQuery = function(a,c) {
        // If the context is global, return a new object
        if ( window == this || !this.init )
                return new jQuery(a,c);
@@ -35,7 +32,7 @@ if ( typeof $ != "undefined" )
        jQuery._$ = $;
        
 // Map the jQuery namespace to the '$' one
-var $ = jQuery;
+window.$ = jQuery;
 
 /**
  * This function accepts a string containing a CSS or
@@ -301,7 +298,7 @@ jQuery.fn = jQuery.prototype = {
         */
        setArray: function( a ) {
                this.length = 0;
-               [].push.apply( this, a );
+               Array.prototype.push.apply( this, a );
                return this;
        },
 
@@ -1160,6 +1157,10 @@ jQuery.fn = jQuery.prototype = {
                        ( this.length ? this[0].innerHTML : null ) :
                        this.empty().append( val );
        },
+
+       slice: function() {
+               return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
+       },
        
        /**
         * @private
@@ -1252,7 +1253,13 @@ jQuery.fn = jQuery.prototype = {
  */
 jQuery.extend = jQuery.fn.extend = function() {
        // copy reference to target object
-       var target = arguments[0] || {}, a = 1, al = arguments.length;
+       var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
+
+       // Handle a deep copy situation
+       if ( target.constructor == Boolean ) {
+               deep = target;
+               target = arguments[1] || {};
+       }
 
        // extend jQuery itself if only one argument is passed
        if ( al == 1 ) {
@@ -1272,7 +1279,7 @@ jQuery.extend = jQuery.fn.extend = function() {
                                        continue;
 
                                // Recurse if we're merging object values
-                               if ( typeof prop[i] == 'object' && target[i] )
+                               if ( deep && typeof prop[i] == 'object' && target[i] )
                                        jQuery.extend( target[i], prop[i] );
 
                                // Don't bring in undefined values
@@ -1387,12 +1394,24 @@ jQuery.extend({
         */
        // args is for internal usage only
        each: function( obj, fn, args ) {
-               if ( obj.length == undefined )
-                       for ( var i in obj )
-                               fn.apply( obj[i], args || [i, obj[i]] );
-               else
-                       for ( var i = 0, ol = obj.length; i < ol; i++ )
-                               if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
+               if ( args ) {
+                       if ( obj.length == undefined )
+                               for ( var i in obj )
+                                       fn.apply( obj[i], args );
+                       else
+                               for ( var i = 0, ol = obj.length; i < ol; i++ )
+                                       if ( fn.apply( obj[i], args ) === false ) break;
+
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( obj.length == undefined )
+                               for ( var i in obj )
+                                       fn.call( obj[i], i, obj[i] );
+                       else
+                               for ( var i = 0, ol = obj.length, val = obj[0]; 
+                                       i < ol && fn.call(val,i,val) !== false; val = obj[++i] );
+               }
+
                return obj;
        },
        
@@ -1505,7 +1524,7 @@ jQuery.extend({
                }
                
                if (prop.match(/float/i))
-                       prop = jQuery.styleFloat;
+                       prop = styleFloat;
 
                if (!force && elem.style[prop])
                        ret = elem.style[prop];
@@ -1918,29 +1937,31 @@ jQuery.extend({
  * @type Boolean
  * @cat JavaScript
  */
-new function() {
-       var b = navigator.userAgent.toLowerCase();
-
-       // Figure out what browser is being used
-       jQuery.browser = {
-               version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
-               safari: /webkit/.test(b),
-               opera: /opera/.test(b),
-               msie: /msie/.test(b) && !/opera/.test(b),
-               mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
-       };
+var userAgent = navigator.userAgent.toLowerCase();
+
+// Figure out what browser is being used
+jQuery.browser = {
+       version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
+       safari: /webkit/.test(userAgent),
+       opera: /opera/.test(userAgent),
+       msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
+       mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
+};
 
+var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
+       
+jQuery.extend({
        // Check to see if the W3C box model is being used
-       jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
-
-       jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
-
-       jQuery.props = {
+       boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
+       
+       styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
+       
+       props: {
                "for": "htmlFor",
                "class": "className",
-               "float": jQuery.styleFloat,
-               cssFloat: jQuery.styleFloat,
-               styleFloat: jQuery.styleFloat,
+               "float": styleFloat,
+               cssFloat: styleFloat,
+               styleFloat: styleFloat,
                innerHTML: "innerHTML",
                className: "className",
                value: "value",
@@ -1949,9 +1970,8 @@ new function() {
                readonly: "readOnly",
                selected: "selected",
                maxlength: "maxLength"
-       };
-
-};
+       }
+});
 
 /**
  * Get a set of elements containing the unique parents of the matched