Fix for #907
[jquery.git] / src / jquery / jquery.js
index 38c8da3..e58f895 100644 (file)
@@ -32,14 +32,13 @@ var jQuery = function(a,c) {
        
        // HANDLE: $(function)
        // Shortcut for document ready
-       // Safari reports typeof on DOM NodeLists as a function
-       if ( jQuery.isFunction(a) && !a.nodeType && a[0] == undefined )
+       if ( jQuery.isFunction(a) )
                return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
        
        // Handle HTML strings
        if ( typeof a  == "string" ) {
                // HANDLE: $(html) -> $(array)
-               var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
+               var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
                if ( m )
                        a = jQuery.clean( [ m[1] ] );
                
@@ -258,9 +257,9 @@ jQuery.fn = jQuery.prototype = {
         * @cat Core
         */
        pushStack: function( a ) {
-               var ret = jQuery(this);
+               var ret = jQuery(a);
                ret.prevObject = this;
-               return ret.setArray( a );
+               return ret;
        },
        
        /**
@@ -804,7 +803,7 @@ jQuery.fn = jQuery.prototype = {
        find: function(t) {
                return this.pushStack( jQuery.map( this, function(a){
                        return jQuery.find(t,a);
-               }) );
+               }), t );
        },
 
        /**
@@ -928,14 +927,14 @@ jQuery.fn = jQuery.prototype = {
        not: function(t) {
                return this.pushStack(
                        t.constructor == String &&
-                       jQuery.multiFilter(t,this,true) ||
-
-                       jQuery.grep(this,function(a){
-                                       if ( t.constructor == Array || t.jquery )
-                                               return jQuery.inArray( t, a ) < 0;
-                                       else
-                                               return a != t;
-                       }) );
+                       jQuery.multiFilter(t, this, true) ||
+
+                       jQuery.grep(this, function(a) {
+                               return ( t.constructor == Array || t.jquery )
+                                       ? jQuery.inArray( a, t ) < 0
+                                       : a != t;
+                       })
+               );
        },
 
        /**
@@ -987,7 +986,7 @@ jQuery.fn = jQuery.prototype = {
                        this.get(),
                        t.constructor == String ?
                                jQuery(t).get() :
-                               t.length != undefined && !t.nodeName ?
+                               t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ?
                                        t : [t] )
                );
        },
@@ -1101,7 +1100,7 @@ jQuery.fn = jQuery.prototype = {
                return this.each(function(){
                        var obj = this;
 
-                       if ( table && this.nodeName.toUpperCase() == "TABLE" && a[0].nodeName.toUpperCase() == "TR" )
+                       if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
                                obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
 
                        jQuery.each( a, function(){
@@ -1220,10 +1219,23 @@ jQuery.extend({
        noConflict: function() {
                if ( jQuery._$ )
                        $ = jQuery._$;
+               return jQuery;
        },
 
+       // This may seem like some crazy code, but trust me when I say that this
+       // is the only cross-browser way to do this. --John
        isFunction: function( fn ) {
-               return fn && typeof fn == "function";
+               return !!fn && typeof fn != "string" &&
+                       typeof fn[0] == "undefined" && /function/i.test( fn + "" );
+       },
+       
+       // check if an element is in a XML document
+       isXMLDoc: function(elem) {
+               return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+       },
+
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
        },
 
        /**
@@ -1274,10 +1286,9 @@ jQuery.extend({
                        var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
 
                        // Handle passing in a number to a CSS property
-                       if ( value.constructor == Number && type == "curCSS" && !exclude.test(prop) )
-                               return value + "px";
-
-                       return value;
+                       return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
+                               value + "px" :
+                               value;
        },
 
        className: {
@@ -1448,7 +1459,7 @@ jQuery.extend({
                                                tb = div.childNodes;
 
                                        for ( var n = tb.length-1; n >= 0 ; --n )
-                                               if ( tb[n].nodeName.toUpperCase() == "TBODY" && !tb[n].childNodes.length )
+                                               if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
                                                        tb[n].parentNode.removeChild(tb[n]);
                                        
                                }
@@ -1470,7 +1481,7 @@ jQuery.extend({
        },
        
        attr: function(elem, name, value){
-               var fix = {
+               var fix = jQuery.isXMLDoc(elem) ? {} : {
                        "for": "htmlFor",
                        "class": "className",
                        "float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
@@ -1501,18 +1512,21 @@ jQuery.extend({
                // Mozilla doesn't play well with opacity 1
                if ( name == "opacity" && jQuery.browser.mozilla && value == 1 )
                        value = 0.9999;
+                       
+               // 
 
                // Certain attributes only work when accessed via the old DOM 0 way
                if ( fix[name] ) {
                        if ( value != undefined ) elem[fix[name]] = value;
                        return elem[fix[name]];
 
-               } else if ( value == undefined && jQuery.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == "FORM" && (name == "action" || name == "method") )
+               } else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
                        return elem.getAttributeNode(name).nodeValue;
 
                // IE elem.getAttribute passes even for style
                else if ( elem.tagName ) {
-                       if ( value != undefined ) elem.setAttribute( name, value );
+                       if ( value != undefined ) 
+                               elem.setAttribute( name, value );
                        return elem.getAttribute( name );
 
                } else {