selectedIndex is now cloned cross-browser (#1294)
[jquery.git] / src / jquery / jquery.js
index 5940df3..8a2c6b2 100644 (file)
@@ -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.
         *
@@ -852,27 +852,43 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Manipulation
         */
        clone: function(deep) {
-               // Need to remove events on the element and its descendants
+               deep = deep != undefined ? deep : true
                var $this = this.add(this.find("*"));
-               $this.each(function() {
-                       this._$events = {};
-                       for (var type in this.$events)
-                               this._$events[type] = jQuery.extend({},this.$events[type]);
-               }).unbind();
+               if (jQuery.browser.msie) {
+                       // Need to remove events on the element and its descendants
+                       $this.each(function() {
+                               this._$events = {};
+                               for (var type in this.$events)
+                                       this._$events[type] = jQuery.extend({},this.$events[type]);
+                       }).unbind();
+               }
 
                // Do the clone
                var r = this.pushStack( jQuery.map( this, function(a){
-                       return a.cloneNode( deep != undefined ? deep : true );
+                       return a.cloneNode( deep );
                }) );
 
-               // Add the events back to the original and its descendants
-               $this.each(function() {
-                       var events = this._$events;
-                       for (var type in events)
-                               for (var handler in events[type])
-                                       jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
-                       this._$events = null;
-               });
+               if (jQuery.browser.msie) {
+                       $this.each(function() {
+                               // Add the events back to the original and its descendants
+                               var events = this._$events;
+                               for (var type in events)
+                                       for (var handler in events[type])
+                                               jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
+                               this._$events = null;
+                       });
+               }
+
+               // copy form values over
+               if (deep) {
+                       var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]');
+                       $this.filter('select,input[@type=checkbox]').each(function(i) {
+                               if (this.selectedIndex)
+                                       inputs[i].selectedIndex = this.selectedIndex;
+                               if (this.checked)
+                                       inputs[i].checked = true;
+                       });
+               }
 
                // Return the cloned set
                return r;
@@ -1171,9 +1187,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 ] );
                        });
-
                });
        }
 };
@@ -1360,7 +1381,7 @@ jQuery.extend({
        className: {
                // internal only, use addClass("class")
                add: function( elem, c ){
-                       jQuery.each( c.split(/\s+/), function(i, cur){
+                       jQuery.each( (c || "").split(/\s+/), function(i, cur){
                                if ( !jQuery.className.has( elem.className, cur ) )
                                        elem.className += ( elem.className ? " " : "" ) + cur;
                        });
@@ -1443,7 +1464,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];
@@ -1466,6 +1487,9 @@ jQuery.extend({
                                    ret = c && c.getPropertyValue(prop) || "";
                                });
 
+                       if ( prop == "opacity" && ret == "" )
+                               ret = "1";
+
                } else if (elem.currentStyle) {
                        var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
                        ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
@@ -1559,13 +1583,23 @@ jQuery.extend({
                if ( fix[name] ) {
                        if ( value != undefined ) elem[fix[name]] = value;
                        return elem[fix[name]];
+               } else if ( jQuery.browser.msie && name == "style" )
+                       return jQuery.attr( elem.style, "cssText", value );
 
-               } else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "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 ) {
-                       // IE actually uses filters for opacity ... elem is actually elem.style
+
+                       if ( value != undefined ) elem.setAttribute( name, value );
+                       if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
+                               return elem.getAttribute( name, 2 );
+                       return elem.getAttribute( name );
+
+               // 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
@@ -1580,14 +1614,6 @@ jQuery.extend({
                                return elem.filter ? 
                                        (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
                        }
-
-                       if ( value != undefined ) elem.setAttribute( name, value );
-                       if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
-                               return elem.getAttribute( name, 2 );
-                       return elem.getAttribute( name );
-
-               // elem is actually elem.style ... set the style
-               } else {
                        name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
                        if ( value != undefined ) elem[name] = value;
                        return elem[name];
@@ -1606,7 +1632,7 @@ jQuery.extend({
         * @cat JavaScript
         */
        trim: function(t){
-               return t.replace(/^\s+|\s+$/g, "");
+               return (t||"").replace(/^\s+|\s+$/g, "");
        },
 
        makeArray: function( a ) {
@@ -1665,11 +1691,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;
        },
@@ -1810,7 +1840,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),
@@ -1820,12 +1850,14 @@ 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.browser.msie ? "styleFloat" : "cssFloat",
-               cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
-               styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
+               "float": jQuery.styleFloat,
+               cssFloat: jQuery.styleFloat,
+               styleFloat: jQuery.styleFloat,
                innerHTML: "innerHTML",
                className: "className",
                value: "value",
@@ -1835,6 +1867,7 @@ new function() {
                selected: "selected",
                maxlength: "maxLength"
        };
+
 };
 
 /**