jquery fx: removing 2 unnecessary isFunction calls, options.complete is ALWAYS a...
[jquery.git] / src / fx.js
index fb564f0..116711f 100644 (file)
--- a/src/fx.js
+++ b/src/fx.js
@@ -4,23 +4,26 @@ jQuery.fn.extend({
                        this.animate({
                                height: "show", width: "show", opacity: "show"
                        }, speed, callback) :
-                       
+
                        this.filter(":hidden").each(function(){
                                this.style.display = this.oldblock || "";
                                if ( jQuery.css(this,"display") == "none" ) {
                                        var elem = jQuery("<" + this.tagName + " />").appendTo("body");
                                        this.style.display = elem.css("display");
+                                       // handle an edge condition where css is - div { display:none; } or similar
+                                       if (this.style.display == "none")
+                                               this.style.display = "block";
                                        elem.remove();
                                }
                        }).end();
        },
-       
+
        hide: function(speed,callback){
                return speed ?
                        this.animate({
                                height: "hide", width: "hide", opacity: "hide"
                        }, speed, callback) :
-                       
+
                        this.filter(":visible").each(function(){
                                this.oldblock = this.oldblock || jQuery.css(this,"display");
                                this.style.display = "none";
@@ -29,10 +32,10 @@ jQuery.fn.extend({
 
        // Save the old toggle function
        _toggle: jQuery.fn.toggle,
-       
+
        toggle: function( fn, fn2 ){
                return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
-                       this._toggle( fn, fn2 ) :
+                       this._toggle.apply( this, arguments ) :
                        fn ?
                                this.animate({
                                        height: "toggle", width: "toggle", opacity: "toggle"
@@ -41,11 +44,11 @@ jQuery.fn.extend({
                                        jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
                                });
        },
-       
+
        slideDown: function(speed,callback){
                return this.animate({height: "show"}, speed, callback);
        },
-       
+
        slideUp: function(speed,callback){
                return this.animate({height: "hide"}, speed, callback);
        },
@@ -53,19 +56,19 @@ jQuery.fn.extend({
        slideToggle: function(speed, callback){
                return this.animate({height: "toggle"}, speed, callback);
        },
-       
+
        fadeIn: function(speed, callback){
                return this.animate({opacity: "show"}, speed, callback);
        },
-       
+
        fadeOut: function(speed, callback){
                return this.animate({opacity: "hide"}, speed, callback);
        },
-       
+
        fadeTo: function(speed,to,callback){
                return this.animate({opacity: to}, speed, callback);
        },
-       
+
        animate: function( prop, speed, easing, callback ) {
                var optall = jQuery.speed(speed, easing, callback);
 
@@ -73,12 +76,12 @@ jQuery.fn.extend({
                        if ( this.nodeType != 1)
                                return false;
 
-                       var opt = jQuery.extend({}, optall);
-                       var hidden = jQuery(this).is(":hidden"), self = this;
-                       
-                       for ( var p in prop ) {
+                       var opt = jQuery.extend({}, optall), p,
+                               hidden = jQuery(this).is(":hidden"), self = this;
+
+                       for ( p in prop ) {
                                if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
-                                       return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
+                                       return opt.complete.call(this);
 
                                if ( p == "height" || p == "width" ) {
                                        // Store display property
@@ -93,7 +96,7 @@ jQuery.fn.extend({
                                this.style.overflow = "hidden";
 
                        opt.curAnim = jQuery.extend({}, prop);
-                       
+
                        jQuery.each( prop, function(name, val){
                                var e = new jQuery.fx( self, opt, name );
 
@@ -128,7 +131,7 @@ jQuery.fn.extend({
                        return true;
                });
        },
-       
+
        queue: function(type, fn){
                if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
                        fn = type;
@@ -139,16 +142,13 @@ jQuery.fn.extend({
                        return queue( this[0], type );
 
                return this.each(function(){
-                       if ( this.nodeType != 1)
-                               return;
-
                        if ( fn.constructor == Array )
                                queue(this, type, fn);
                        else {
                                queue(this, type).push( fn );
-                       
+
                                if ( queue(this, type).length == 1 )
-                                       fn.apply(this);
+                                       fn.call(this);
                        }
                });
        },
@@ -180,17 +180,16 @@ jQuery.fn.extend({
 });
 
 var queue = function( elem, type, array ) {
-       if ( !elem )
-               return undefined;
+       if ( elem ){
 
-       type = type || "fx";
+               type = type || "fx";
 
-       var q = jQuery.data( elem, type + "queue" );
+               var q = jQuery.data( elem, type + "queue" );
 
-       if ( !q || array )
-               q = jQuery.data( elem, type + "queue", 
-                       array ? jQuery.makeArray(array) : [] );
+               if ( !q || array )
+                       q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
 
+       }
        return q;
 };
 
@@ -203,36 +202,36 @@ jQuery.fn.dequeue = function(type){
                q.shift();
 
                if ( q.length )
-                       q[0].apply( this );
+                       q[0].call( this );
        });
 };
 
 jQuery.extend({
-       
+
        speed: function(speed, easing, fn) {
                var opt = speed && speed.constructor == Object ? speed : {
-                       complete: fn || !fn && easing || 
+                       complete: fn || !fn && easing ||
                                jQuery.isFunction( speed ) && speed,
                        duration: speed,
                        easing: fn && easing || easing && easing.constructor != Function && easing
                };
 
-               opt.duration = (opt.duration && opt.duration.constructor == Number ? 
-                       opt.duration : 
-                       { slow: 600, fast: 200 }[opt.duration]) || 400;
-       
+               opt.duration = (opt.duration && opt.duration.constructor == Number ?
+                       opt.duration :
+                       jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
+
                // Queueing
                opt.old = opt.complete;
                opt.complete = function(){
                        if ( opt.queue !== false )
                                jQuery(this).dequeue();
                        if ( jQuery.isFunction( opt.old ) )
-                               opt.old.apply( this );
+                               opt.old.call( this );
                };
-       
+
                return opt;
        },
-       
+
        easing: {
                linear: function( p, n, firstNum, diff ) {
                        return firstNum + diff * p;
@@ -241,7 +240,7 @@ jQuery.extend({
                        return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
                }
        },
-       
+
        timers: [],
        timerId: null,
 
@@ -261,7 +260,7 @@ jQuery.fx.prototype = {
        // Simple function for setting a style value
        update: function(){
                if ( this.options.step )
-                       this.options.step.apply( this.elem, [ this.now, this ] );
+                       this.options.step.call( this.elem, this.now, this );
 
                (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 
@@ -281,7 +280,7 @@ jQuery.fx.prototype = {
 
        // Start an animation from one number to another
        custom: function(from, to, unit){
-               this.startTime = (new Date()).getTime();
+               this.startTime = now();
                this.start = from;
                this.end = to;
                this.unit = unit || this.unit || "px";
@@ -301,7 +300,7 @@ jQuery.fx.prototype = {
                if ( jQuery.timerId == null ) {
                        jQuery.timerId = setInterval(function(){
                                var timers = jQuery.timers;
-                               
+
                                for ( var i = 0; i < timers.length; i++ )
                                        if ( !timers[i]() )
                                                timers.splice(i--, 1);
@@ -327,7 +326,7 @@ jQuery.fx.prototype = {
                // flash of content
                if ( this.prop == "width" || this.prop == "height" )
                        this.elem.style[this.prop] = "1px";
-               
+
                // Start by showing the element
                jQuery(this.elem).show();
        },
@@ -344,7 +343,7 @@ jQuery.fx.prototype = {
 
        // Each step of an animation
        step: function(gotoEnd){
-               var t = (new Date()).getTime();
+               var t = now();
 
                if ( gotoEnd || t > this.options.duration + this.startTime ) {
                        this.now = this.end;
@@ -362,7 +361,7 @@ jQuery.fx.prototype = {
                                if ( this.options.display != null ) {
                                        // Reset the overflow
                                        this.elem.style.overflow = this.options.overflow;
-                               
+
                                        // Reset the display
                                        this.elem.style.display = this.options.display;
                                        if ( jQuery.css(this.elem, "display") == "none" )
@@ -380,9 +379,9 @@ jQuery.fx.prototype = {
                        }
 
                        // If a callback was provided, execute it
-                       if ( done && jQuery.isFunction( this.options.complete ) )
+                       if ( done )
                                // Execute the complete function
-                               this.options.complete.apply( this.elem );
+                               this.options.complete.call( this.elem );
 
                        return false;
                } else {
@@ -402,20 +401,28 @@ jQuery.fx.prototype = {
 
 };
 
-jQuery.fx.step = {
-       scrollLeft: function(fx){
-               fx.elem.scrollLeft = fx.now;
+jQuery.extend( jQuery.fx, {
+       speeds:{
+               slow: 600,
+               fast: 200,
+               // Default speed
+               def: 400
        },
+       step: {
+               scrollLeft: function(fx){
+                       fx.elem.scrollLeft = fx.now;
+               },
 
-       scrollTop: function(fx){
-               fx.elem.scrollTop = fx.now;
-       },
+               scrollTop: function(fx){
+                       fx.elem.scrollTop = fx.now;
+               },
 
-       opacity: function(fx){
-               jQuery.attr(fx.elem.style, "opacity", fx.now);
-       },
+               opacity: function(fx){
+                       jQuery.attr(fx.elem.style, "opacity", fx.now);
+               },
 
-       _default: function(fx){
-               fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+               _default: function(fx){
+                       fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+               }
        }
-};
+});