Completely reworked the evalScripts() code, fixing bugs #1332, #975, and #777.
[jquery.git] / src / jquery / jquery.js
index 1be9c91..f54ee30 100644 (file)
@@ -24,7 +24,7 @@ window.undefined = window.undefined;
  */
 var jQuery = function(a,c) {
        // If the context is global, return a new object
-       if ( window == this )
+       if ( window == this || !this.init )
                return new jQuery(a,c);
        
        return this.init(a,c);
@@ -176,7 +176,7 @@ jQuery.fn = jQuery.prototype = {
 
                        // HANDLE: $(arraylike)
                        // Watch for when an array-like object is passed as the selector
-                       (a.jquery || a.length && a != window && (!a.nodeType || (jQuery.browser.msie && a.elements)) && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
+                       (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
 
                        // HANDLE: $(*)
                        [ a ] );
@@ -565,7 +565,7 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Attributes
         */
        text: function(e) {
-               if ( typeof e == "string" )
+               if ( typeof e != "object" && e != null )
                        return this.empty().append( document.createTextNode( e ) );
 
                var t = "";
@@ -811,7 +811,7 @@ jQuery.fn = jQuery.prototype = {
 
        /**
         * Searches for all elements that match the specified expression.
-        
+        * 
         * This method is a good way to find additional descendant
         * elements with which to process.
         *
@@ -830,9 +830,9 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Traversing
         */
        find: function(t) {
-               return this.pushStack( jQuery.unique( jQuery.map( this, function(a){
-                       return jQuery.find(t,a);
-               }) ), t );
+               var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
+               return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
+                       jQuery.unique( data ) : data );
        },
 
        /**
@@ -1171,9 +1171,14 @@ jQuery.fn = jQuery.prototype = {
                                obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
 
                        jQuery.each( a, function(){
-                               fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
+                               if ( jQuery.nodeName(this, "script") ) {
+                                       if ( this.src )
+                                               jQuery.ajax({ url: this.src, async: false, dataType: "script" });
+                                       else
+                                               (new Function( this.text || this.textContent || this.innerHTML || "" ))();
+                               } else
+                                       fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
                        });
-
                });
        }
 };
@@ -1443,7 +1448,7 @@ jQuery.extend({
                }
                
                if (prop.match(/float/i))
-                       prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
+                       prop = jQuery.styleFloat;
 
                if (!force && elem.style[prop])
                        ret = elem.style[prop];
@@ -1539,7 +1544,7 @@ jQuery.extend({
                                arg = jQuery.makeArray( div.childNodes );
                        }
 
-                       if ( 0 === arg.length && !jQuery(arg).is("form, select") )
+                       if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
                                return;
 
                        if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
@@ -1553,37 +1558,7 @@ jQuery.extend({
        },
        
        attr: function(elem, name, value){
-               var fix = jQuery.isXMLDoc(elem) ? {} : {
-                       "for": "htmlFor",
-                       "class": "className",
-                       "float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
-                       cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
-                       styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
-                       innerHTML: "innerHTML",
-                       className: "className",
-                       value: "value",
-                       disabled: "disabled",
-                       checked: "checked",
-                       readonly: "readOnly",
-                       selected: "selected",
-                       maxlength: "maxLength"
-               };
-               
-               // IE actually uses filters for opacity ... elem is actually elem.style
-               if ( name == "opacity" && jQuery.browser.msie ) {
-                       if ( value != undefined ) {
-                               // IE has trouble with opacity if it does not have layout
-                               // Force it by setting the zoom level
-                               elem.zoom = 1; 
-
-                               // Set the alpha filter to set the opacity
-                               elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
-                                       (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
-                       }
-
-                       return elem.filter ? 
-                               (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
-               }
+               var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
                
                // Certain attributes only work when accessed via the old DOM 0 way
                if ( fix[name] ) {
@@ -1595,6 +1570,8 @@ jQuery.extend({
 
                // IE elem.getAttribute passes even for style
                else if ( elem.tagName ) {
+                       
+
                        if ( value != undefined ) elem.setAttribute( name, value );
                        if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
                                return elem.getAttribute( name, 2 );
@@ -1602,6 +1579,21 @@ jQuery.extend({
 
                // elem is actually elem.style ... set the style
                } else {
+                       // IE actually uses filters for opacity
+                       if ( name == "opacity" && jQuery.browser.msie ) {
+                               if ( value != undefined ) {
+                                       // IE has trouble with opacity if it does not have layout
+                                       // Force it by setting the zoom level
+                                       elem.zoom = 1; 
+       
+                                       // Set the alpha filter to set the opacity
+                                       elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
+                                               (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
+                               }
+       
+                               return elem.filter ? 
+                                       (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
+                       }
                        name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
                        if ( value != undefined ) elem[name] = value;
                        return elem[name];
@@ -1620,7 +1612,7 @@ jQuery.extend({
         * @cat JavaScript
         */
        trim: function(t){
-               return t.replace(/^\s+|\s+$/g, "");
+               return (t||"").replace(/^\s+|\s+$/g, "");
        },
 
        makeArray: function( a ) {
@@ -1679,11 +1671,15 @@ jQuery.extend({
        unique: function(first) {
                var r = [], num = jQuery.mergeNum++;
 
-               for ( var i = 0, fl = first.length; i < fl; i++ )
-                       if ( num != first[i].mergeNum ) {
-                               first[i].mergeNum = num;
-                               r.push(first[i]);
-                       }
+               try {
+                       for ( var i = 0, fl = first.length; i < fl; i++ )
+                               if ( num != first[i].mergeNum ) {
+                                       first[i].mergeNum = num;
+                                       r.push(first[i]);
+                               }
+               } catch(e) {
+                       r = first;
+               }
 
                return r;
        },
@@ -1824,7 +1820,7 @@ new function() {
 
        // Figure out what browser is being used
        jQuery.browser = {
-               version: b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)[1],
+               version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
                safari: /webkit/.test(b),
                opera: /opera/.test(b),
                msie: /msie/.test(b) && !/opera/.test(b),
@@ -1833,6 +1829,24 @@ new function() {
 
        // 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 = {
+               "for": "htmlFor",
+               "class": "className",
+               "float": jQuery.styleFloat,
+               cssFloat: jQuery.styleFloat,
+               styleFloat: jQuery.styleFloat,
+               innerHTML: "innerHTML",
+               className: "className",
+               value: "value",
+               disabled: "disabled",
+               checked: "checked",
+               readonly: "readOnly",
+               selected: "selected",
+               maxlength: "maxLength"
+       };
 };
 
 /**