Made sure that .remove now uses multiFilter. Fixes bug #4205.
[jquery.git] / src / core.js
index ebad0c1..65960e2 100644 (file)
@@ -75,7 +75,9 @@ jQuery.fn = jQuery.prototype = {
                        this.context = selector.context;
                }
 
-               return this.setArray(jQuery.makeArray(selector));
+               return this.setArray(jQuery.isArray( selector ) ?
+                       selector :
+                       jQuery.makeArray(selector));
        },
 
        // Start with an empty selector
@@ -95,7 +97,7 @@ jQuery.fn = jQuery.prototype = {
                return num === undefined ?
 
                        // Return a 'clean' array
-                       jQuery.makeArray( this ) :
+                       Array.prototype.slice.call( this ) :
 
                        // Return just the object
                        this[ num ];
@@ -265,23 +267,21 @@ jQuery.fn = jQuery.prototype = {
        },
 
        // For internal use only.
-       // Behaves like an Array's .push method, not like a jQuery method.
+       // Behaves like an Array's method, not like a jQuery method.
        push: [].push,
+       sort: [].sort,
+       splice: [].splice,
 
        find: function( selector ) {
-               if ( this.length === 1 && !/,/.test(selector) ) {
+               if ( this.length === 1 ) {
                        var ret = this.pushStack( [], "find", selector );
                        ret.length = 0;
                        jQuery.find( selector, this[0], ret );
                        return ret;
                } else {
-                       var elems = jQuery.map(this, function(elem){
+                       return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){
                                return jQuery.find( selector, elem );
-                       });
-
-                       return this.pushStack( /[^+>] [^+>]/.test( selector ) ?
-                               jQuery.unique( elems ) :
-                               elems, "find", selector );
+                       })), "find", selector );
                }
        },
 
@@ -346,14 +346,18 @@ jQuery.fn = jQuery.prototype = {
        },
 
        closest: function( selector ) {
-               var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null;
+               var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null,
+                       closer = 0;
 
                return this.map(function(){
                        var cur = this;
                        while ( cur && cur.ownerDocument ) {
-                               if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) )
+                               if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) {
+                                       jQuery.data(cur, "closest", closer);
                                        return cur;
+                               }
                                cur = cur.parentNode;
+                               closer++;
                        }
                });
        },
@@ -498,13 +502,13 @@ jQuery.fn = jQuery.prototype = {
                if ( this[0] ) {
                        var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(),
                                scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ),
-                               first = fragment.firstChild,
-                               extra = this.length > 1 ? fragment.cloneNode(true) : fragment;
+                               first = fragment.firstChild;
 
                        if ( first )
                                for ( var i = 0, l = this.length; i < l; i++ )
-                                       callback.call( root(this[i], first), i > 0 ? extra.cloneNode(true) : fragment );
-                       
+                                       callback.call( root(this[i], first), this.length > 1 || i > 0 ?
+                                                       fragment.cloneNode(true) : fragment );
+               
                        if ( scripts )
                                jQuery.each( scripts, evalScript );
                }
@@ -627,9 +631,7 @@ jQuery.extend({
 
        // Evalulates a script in a global context
        globalEval: function( data ) {
-               data = jQuery.trim( data );
-
-               if ( data ) {
+               if ( data && /\S/.test(data) ) {
                        // Inspired by code by Andrea Giammarchi
                        // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
                        var head = document.getElementsByTagName("head")[0] || document.documentElement,
@@ -732,26 +734,32 @@ jQuery.extend({
                        elem.style[ name ] = old[ name ];
        },
 
-       css: function( elem, name, force ) {
+       css: function( elem, name, force, extra ) {
                if ( name == "width" || name == "height" ) {
                        var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
 
                        function getWH() {
                                val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
-                               var padding = 0, border = 0;
+
+                               if ( extra === "border" )
+                                       return;
+
                                jQuery.each( which, function() {
-                                       padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
-                                       border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
+                                       if ( !extra )
+                                               val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
+                                       if ( extra === "margin" )
+                                               val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
+                                       else
+                                               val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
                                });
-                               val -= Math.round(padding + border);
                        }
 
-                       if ( jQuery(elem).is(":visible") )
+                       if ( elem.offsetWidth !== 0 )
                                getWH();
                        else
                                jQuery.swap( elem, props, getWH );
 
-                       return Math.max(0, val);
+                       return Math.max(0, Math.round(val));
                }
 
                return jQuery.curCSS( elem, name, force );
@@ -857,7 +865,7 @@ jQuery.extend({
                                });
 
                                // Trim whitespace, otherwise indexOf won't work as expected
-                               var tags = jQuery.trim( elem ).toLowerCase();
+                               var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase();
 
                                var wrap =
                                        // option or optgroup
@@ -897,11 +905,12 @@ jQuery.extend({
                                if ( !jQuery.support.tbody ) {
 
                                        // String was a <table>, *may* have spurious <tbody>
-                                       var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
-                                               div.firstChild && div.firstChild.childNodes :
+                                       var hasBody = /<tbody/i.test(elem),
+                                               tbody = !tags.indexOf("<table") && !hasBody ?
+                                                       div.firstChild && div.firstChild.childNodes :
 
                                                // String was a bare <thead> or <tfoot>
-                                               wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
+                                               wrap[1] == "<table>" && !hasBody ?
                                                        div.childNodes :
                                                        [];
 
@@ -1180,13 +1189,16 @@ jQuery.each({
        insertAfter: "after",
        replaceAll: "replaceWith"
 }, function(name, original){
-       jQuery.fn[ name ] = function() {
-               var args = arguments;
+       jQuery.fn[ name ] = function( selector ) {
+               var ret = [], insert = jQuery( selector );
 
-               return this.each(function(){
-                       for ( var i = 0, length = args.length; i < length; i++ )
-                               jQuery( args[ i ] )[ original ]( this );
-               });
+               for ( var i = 0, l = insert.length; i < l; i++ ) {
+                       var elems = (i > 0 ? this.clone(true) : this).get();
+                       jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
+                       ret = ret.concat( elems );
+               }
+
+               return this.pushStack( ret, name, selector );
        };
 });
 
@@ -1212,7 +1224,7 @@ jQuery.each({
        },
 
        remove: function( selector ) {
-               if ( !selector || jQuery.filter( selector, [ this ] ).length ) {
+               if ( !selector || jQuery.multiFilter( selector, [ this ] ).length ) {
                        // Prevent memory leaks
                        jQuery( "*", this ).add([this]).each(function(){
                                jQuery.event.remove(this);
@@ -1225,7 +1237,7 @@ jQuery.each({
 
        empty: function() {
                // Remove element nodes and prevent memory leaks
-               jQuery( ">*", this ).remove();
+               jQuery(this).children().remove();
 
                // Remove any remaining nodes
                while ( this.firstChild )