jquery core: Patch from #2619 applied, making makeArray more flexible and faster...
[jquery.git] / src / core.js
index d8526d7..072642f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * jQuery @VERSION - New Wave Javascript
  *
- * Copyright (c) 2007 John Resig (jquery.com)
+ * Copyright (c) 2008 John Resig (jquery.com)
  * Dual licensed under the MIT (MIT-LICENSE.txt)
  * and GPL (GPL-LICENSE.txt) licenses.
  *
@@ -477,6 +477,31 @@ jQuery.fn = jQuery.prototype = {
        andSelf: function() {
                return this.add( this.prevObject );
        },
+
+       data: function( key, value ){
+               var parts = key.split(".");
+               parts[1] = parts[1] ? "." + parts[1] : "";
+
+               if ( value == null ) {
+                       var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+                       
+                       if ( data == undefined && this.length )
+                               data = jQuery.data( this[0], key );
+
+                       return data == null && parts[1] ?
+                               this.data( parts[0] ) :
+                               data;
+               } else
+                       return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
+                               jQuery.data( this, key, value );
+                       });
+       },
+
+       removeData: function( key ){
+               return this.each(function(){
+                       jQuery.removeData( this, key );
+               });
+       },
        
        domManip: function( args, table, reverse, callback ) {
                var clone = this.length > 1, elems; 
@@ -570,7 +595,7 @@ jQuery.extend = jQuery.fn.extend = function() {
 
                                // Recurse if we're merging object values
                                if ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )
-                                       target[ name ] = jQuery.extend( target[ name ], options[ name ] );
+                                       target[ name ] = jQuery.extend( deep, target[ name ], options[ name ] );
 
                                // Don't bring in undefined values
                                else if ( options[ name ] != undefined )
@@ -586,6 +611,8 @@ var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {};
 
 // exclude the following css properties to add px
 var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
+// cache getComputedStyle
+var getComputedStyle = document.defaultView && document.defaultView.getComputedStyle;
 
 jQuery.extend({
        noConflict: function( deep ) {
@@ -812,8 +839,9 @@ jQuery.extend({
                function color( elem ) {
                        if ( !jQuery.browser.safari )
                                return false;
-
-                       var ret = document.defaultView.getComputedStyle( elem, null );
+                       
+                       // getComputedStyle is cached
+                       var ret = getComputedStyle( elem, null );
                        return !ret || ret.getPropertyValue("color") == "";
                }
 
@@ -827,9 +855,9 @@ jQuery.extend({
                }
                // Opera sometimes will give the wrong display answer, this fixes it, see #2037
                if ( jQuery.browser.opera && name == "display" ) {
-                       var save = elem.style.display;
-                       elem.style.display = "block";
-                       elem.style.display = save;
+                       var save = elem.style.outline;
+                       elem.style.outline = "0 solid black";
+                       elem.style.outline = save;
                }
                
                // Make sure we're using the right name for getting the float value
@@ -839,7 +867,7 @@ jQuery.extend({
                if ( !force && elem.style && elem.style[ name ] )
                        ret = elem.style[ name ];
 
-               else if ( document.defaultView && document.defaultView.getComputedStyle ) {
+               else if ( getComputedStyle ) {
 
                        // Only "float" is needed here
                        if ( name.match( /float/i ) )
@@ -847,10 +875,10 @@ jQuery.extend({
 
                        name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
 
-                       var getComputedStyle = document.defaultView.getComputedStyle( elem, null );
+                       var computedStyle = getComputedStyle( elem, null );
 
-                       if ( getComputedStyle && !color( elem ) )
-                               ret = getComputedStyle.getPropertyValue( name );
+                       if ( computedStyle && !color( elem ) )
+                               ret = computedStyle.getPropertyValue( name );
 
                        // If the element isn't reporting its values properly in Safari
                        // then some display: none elements are involved
@@ -873,7 +901,7 @@ jQuery.extend({
                                // one special, otherwise get the value
                                ret = name == "display" && swap[ stack.length - 1 ] != null ?
                                        "none" :
-                                       ( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || "";
+                                       ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
 
                                // Finally, revert the display styles back
                                for ( var i = 0; i < swap.length; i++ )
@@ -1095,12 +1123,13 @@ jQuery.extend({
        makeArray: function( array ) {
                var ret = [];
 
-               // Need to use typeof to fight Safari childNodes crashes
-               if ( typeof array != "array" )
-                       for ( var i = 0, length = array.length; i < length; i++ )
-                               ret.push( array[ i ] );
-               else
-                       ret = array.slice( 0 );
+               if( array != undefined )
+                       //strings and functions also have 'length'
+                       if( array.length != undefined && !array.split && !array.call )
+                               for( var i = array.length; i; )
+                                       ret[--i] = array[i];
+                       else
+                               ret[0] = array;
 
                return ret;
        },