In r1576 on 2007-03-24 the merge() method was split into merge() and
[jquery.git] / src / jquery / jquery.js
index 61a190e..5c9dcf3 100644 (file)
@@ -852,11 +852,30 @@ jQuery.fn = jQuery.prototype = {
         * @cat DOM/Manipulation
         */
        clone: function(deep) {
-               return this.pushStack( jQuery.map( this, function(a){
-                       a = a.cloneNode( deep != undefined ? deep : true );
-                       a.$events = null; // drop $events expando to avoid firing incorrect events
-                       return a;
+               // Need to remove events on the element and its descendants
+               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();
+
+               // Do the clone
+               var r = this.pushStack( jQuery.map( this, function(a){
+                       return a.cloneNode( deep != undefined ? deep : true );
                }) );
+
+               // 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;
+               });
+
+               // Return the cloned set
+               return r;
        },
 
        /**
@@ -1423,7 +1442,7 @@ jQuery.extend({
                        return ret == "" ? "1" : ret;
                }
                
-               if (prop == "float" || prop == "cssFloat")
+               if (prop.match(/float/i))
                        prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
 
                if (!force && elem.style[prop])
@@ -1431,7 +1450,7 @@ jQuery.extend({
 
                else if (document.defaultView && document.defaultView.getComputedStyle) {
 
-                       if (prop == "cssFloat" || prop == "styleFloat")
+                       if (prop.match(/float/i))
                                prop = "float";
 
                        prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
@@ -1465,13 +1484,13 @@ jQuery.extend({
                        if ( arg.constructor == Number )
                                arg = arg.toString();
                        
-                        // Convert html string into DOM nodes
+                       // Convert html string into DOM nodes
                        if ( typeof arg == "string" ) {
                                // Trim whitespace, otherwise indexOf won't work as expected
                                var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
 
                                var wrap =
-                                        // option or optgroup
+                                       // option or optgroup
                                        !s.indexOf("<opt") &&
                                        [1, "<select>", "</select>"] ||
                                        
@@ -1539,6 +1558,7 @@ jQuery.extend({
                        "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",
@@ -1624,24 +1644,16 @@ jQuery.extend({
        },
 
        /**
-        * Merge two arrays together, removing all duplicates.
-        *
-        * The result is the altered first argument with
-        * the unique elements from the second array added.
+        * Merge two arrays together by concatenating them.
         *
         * @example $.merge( [0,1,2], [2,3,4] )
-        * @result [0,1,2,3,4]
-        * @desc Merges two arrays, removing the duplicate 2
-        *
-        * @example var array = [3,2,1];
-        * $.merge( array, [4,3,2] )
-        * @result array == [3,2,1,4]
-        * @desc Merges two arrays, removing the duplicates 3 and 2
+        * @result [0,1,2,2,3,4]
+        * @desc Merges two arrays.
         *
         * @name $.merge
         * @type Array
-        * @param Array first The first array to merge, the unique elements of second added.
-        * @param Array second The second array to merge into the first, unaltered.
+        * @param Array first The first array to merge, the elements of second are added.
+        * @param Array second The second array to append to the first, unaltered.
         * @cat JavaScript
         */
        merge: function(first, second) {
@@ -1652,6 +1664,18 @@ jQuery.extend({
                return first;
        },
 
+       /**
+        * Reduce an array (of jQuery objects only) to its unique elements.
+        *
+        * @example $.unique( [x1, x2, x3, x2, x3] )
+        * @result [x1, x2, x3]
+        * @desc Reduces the arrays of jQuery objects to unique elements by removing the duplicates of x2 and x3
+        *
+        * @name $.unique
+        * @type Array
+        * @param Array array The array to reduce to its unique jQuery objects.
+        * @cat JavaScript
+        */
        unique: function(first) {
                var r = [], num = jQuery.mergeNum++;