Changed core.js from CRLF to LF eol style to match the rest of the source files....
[jquery.git] / src / core.js
index 0cf0444..d27dcb9 100644 (file)
@@ -10,8 +10,8 @@
  */
 
 // Map over jQuery in case of overwrite
-if ( typeof jQuery != "undefined" )
-       var _jQuery = jQuery;
+if ( window.jQuery )
+       var _jQuery = window.jQuery;
 
 var jQuery = window.jQuery = function( selector, context ) {
        // If the context is a namespace object, return a new object
@@ -21,8 +21,8 @@ var jQuery = window.jQuery = function( selector, context ) {
 };
 
 // Map over the $ in case of overwrite
-if ( typeof $ != "undefined" )
-       var _$ = $;
+if ( window.$ )
+       var _$ = window.$;
        
 // Map the jQuery namespace to the '$' one
 window.$ = jQuery;
@@ -331,7 +331,12 @@ jQuery.fn = jQuery.prototype = {
        },
 
        add: function( selector ) {
-               return this.pushStack( jQuery.merge( this.get(), jQuery( selector ) ) );
+               return this.pushStack( jQuery.merge( 
+                       this.get(),
+                       selector.constructor == String ? 
+                               jQuery( selector ).get() :
+                               selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ?
+                                       selector : [selector] ) );
        },
 
        is: function( selector ) {
@@ -402,7 +407,7 @@ jQuery.fn = jQuery.prototype = {
                                                        jQuery.inArray( this.text, values ) >= 0);
                                        });
 
-                                       if ( !tmp.length )
+                                       if ( !values.length )
                                                this.selectedIndex = -1;
 
                                } else
@@ -456,39 +461,51 @@ jQuery.fn = jQuery.prototype = {
                        if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
                                obj = this.getElementsByTagName("tbody")[0] || this.appendChild( document.createElement("tbody") );
 
+                       var scripts = jQuery( [] );
+
                        jQuery.each(elems, function(){
                                var elem = clone ?
                                        this.cloneNode( true ) :
                                        this;
 
-                               if ( !evalScript( 0, elem ) )
+                               if ( jQuery.nodeName( elem, "script" ) ) {
+
+                                       // If scripts are waiting to be executed, wait on this script as well
+                                       if ( scripts.length )
+                                               scripts = scripts.add( elem );
+
+                                       // If nothing is waiting to be executed, run immediately
+                                       else
+                                               evalScript( 0, elem );
+
+                               } else {
+                                       // Remove any inner scripts for later evaluation
+                                       if ( elem.nodeType == 1 )
+                                               scripts = scripts.add( jQuery( "script", elem ).remove() );
+
+                                       // Inject the elements into the document
                                        callback.call( obj, elem );
+                               }
                        });
+
+                       scripts.each( evalScript );
                });
        }
 };
 
 function evalScript( i, elem ) {
-       var script = jQuery.nodeName( elem, "script" );
-
-       if ( script ) {
-               if ( elem.src )
-                       jQuery.ajax({
-                               url: elem.src,
-                               async: false,
-                               dataType: "script"
-                       });
-
-               else
-                       jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
-       
-               if ( elem.parentNode )
-                       elem.parentNode.removeChild( elem );
+       if ( elem.src )
+               jQuery.ajax({
+                       url: elem.src,
+                       async: false,
+                       dataType: "script"
+               });
 
-       } else if ( elem.nodeType == 1 )
-               jQuery( "script", elem ).each( evalScript );
+       else
+               jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
 
-       return script;
+       if ( elem.parentNode )
+               elem.parentNode.removeChild( elem );
 }
 
 jQuery.extend = jQuery.fn.extend = function() {
@@ -499,8 +516,14 @@ jQuery.extend = jQuery.fn.extend = function() {
        if ( target.constructor == Boolean ) {
                deep = target;
                target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
        }
 
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target != "object" )
+               target = {};
+
        // extend jQuery itself if only one argument is passed
        if ( length == 1 ) {
                target = this;
@@ -513,12 +536,12 @@ jQuery.extend = jQuery.fn.extend = function() {
                        // Extend the base object
                        for ( var name in options ) {
                                // Prevent never-ending loop
-                               if ( target == options[ name ] )
+                               if ( target === options[ name ] )
                                        continue;
 
                                // Recurse if we're merging object values
-                               if ( deep && typeof options[ name ] == "object" && target[ name ] )
-                                       jQuery.extend( target[ name ], options[ name ] );
+                               if ( deep && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
+                                       target[ name ] = jQuery.extend( target[ name ], options[ name ] );
 
                                // Don't bring in undefined values
                                else if ( options[ name ] != undefined )
@@ -748,7 +771,7 @@ jQuery.extend({
                                // Otherwise, we need to flip out more values
                                } else {
                                        elem = jQuery( elem.cloneNode(true) )
-                                               .find(":radio").removeAttr("checked").end()
+                                               .find(":radio").removeAttr("checked").removeAttr("defaultChecked").end()
                                                .css({
                                                        visibility: "hidden",
                                                        position: "absolute",
@@ -841,7 +864,7 @@ jQuery.extend({
                                // one special, otherwise get the value
                                ret = name == "display" && swap[ stack.length - 1 ] != null ?
                                        "none" :
-                                       document.defaultView.getComputedStyle( elem, null ).getPropertyValue( name ) || "";
+                                       ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || "";
 
                                // Finally, revert the display styles back
                                for ( var i = 0; i < swap.length; i++ )
@@ -948,18 +971,18 @@ jQuery.extend({
                                                div.firstChild && div.firstChild.childNodes :
                                                
                                                // String was a bare <thead> or <tfoot>
-                                               wrap[1] == "<table>" && s.indexOf("<tbody") < 0 ?
+                                               wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
                                                        div.childNodes :
                                                        [];
-
+                               
                                        for ( var i = tbody.length - 1; i >= 0 ; --i )
                                                if ( jQuery.nodeName( tbody[ i ], "tbody" ) && !tbody[ i ].childNodes.length )
                                                        tbody[ i ].parentNode.removeChild( tbody[ i ] );
-       
+                                       
                                        // IE completely kills leading whitespace when innerHTML is used        
                                        if ( /^\s/.test( elem ) )       
                                                div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
-
+                               
                                }
                                
                                elem = jQuery.makeArray( div.childNodes );
@@ -1182,7 +1205,8 @@ jQuery.extend({
                readonly: "readOnly",
                selected: "selected",
                maxlength: "maxLength",
-               selectedIndex: "selectedIndex"
+               selectedIndex: "selectedIndex",
+               defaultValue: "defaultValue"
        }
 });
 
@@ -1246,17 +1270,21 @@ jQuery.each({
 
        remove: function( selector ) {
                if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
-                       jQuery.removeData( this );
-                       this.parentNode.removeChild( this );
+                       // Prevent memory leaks
+                       jQuery( "*", this ).add(this).each(function(){
+                               jQuery.event.remove(this);
+                               jQuery.removeData(this);
+                       });
+                       if (this.parentNode)
+                               this.parentNode.removeChild( this );
                }
        },
 
        empty: function() {
-               // Clean up the cache
-               jQuery( "*", this ).each(function(){
-                       jQuery.removeData(this);
-               });
-
+               // Remove element nodes and prevent memory leaks
+               jQuery( ">*", this ).remove();
+               
+               // Remove any remaining nodes
                while ( this.firstChild )
                        this.removeChild( this.firstChild );
        }
@@ -1276,7 +1304,7 @@ jQuery.each([ "Height", "Width" ], function(i, name){
                        jQuery.browser.opera && document.body[ "client" + name ] || 
                        
                        // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
-                       jQuery.browser.safari && self[ "inner" + name ] ||
+                       jQuery.browser.safari && window[ "inner" + name ] ||
                        
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
                        document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :