3 // overwrite the old show method
7 * The effects module overloads the show method to now allow
8 * for a speed to the show operation. What actually happens is
9 * that the height, width, and opacity to the matched elements
10 * are changed dynamically. The only three current speeds are
11 * "slow", "normal", and "fast". For example:
12 * $("p").show("slow");
13 * Note: You should not run the show method on things
14 * that are already shown. This can be circumvented by doing this:
15 * $("p:hidden").show("slow");
17 show: function(speed,callback){
18 return speed ? this.animate({
19 height: "show", width: "show", opacity: "show"
20 }, speed, callback) : this._show();
23 // Overwrite the old hide method
24 _hide: jQuery.fn.hide,
27 * The hide function behaves very similary to the show function,
28 * but is just the opposite.
29 * $("p:visible").hide("slow");
31 hide: function(speed,callback){
32 return speed ? this.animate({
33 height: "hide", width: "hide", opacity: "hide"
34 }, speed, callback) : this._hide();
38 * This function increases the height and opacity for all matched
39 * elements. This is very similar to 'show', but does not change
40 * the width - creating a neat sliding effect.
41 * $("p:hidden").slideDown("slow");
43 slideDown: function(speed,callback){
44 return this.animate({height: "show"}, speed, callback);
48 * Just like slideDown, only it hides all matched elements.
49 * $("p:visible").slideUp("slow");
51 slideUp: function(speed,callback){
52 return this.animate({height: "hide"}, speed, callback);
56 * Adjusts the opacity of all matched elements from a hidden,
57 * to a fully visible, state.
58 * $("p:hidden").fadeIn("slow");
60 fadeIn: function(speed,callback){
61 return this.animate({opacity: "show"}, speed, callback);
65 * Same as fadeIn, but transitions from a visible, to a hidden state.
66 * $("p:visible").fadeOut("slow");
68 fadeOut: function(speed,callback){
69 return this.animate({opacity: "hide"}, speed, callback);
75 fadeTo: function(speed,to,callback){
76 return this.animate({opacity: to}, speed, callback);
82 animate: function(prop,speed,callback) {
83 return this.queue(function(){
85 for ( var p in prop ) {
86 var e = new jQuery.fx( this, jQuery.speed(speed,callback,i++), p );
87 if ( prop[p].constructor == Number )
88 e.custom( e.cur(), prop[p] );
99 queue: function(type,fn){
105 return this.each(function(){
109 if ( !this.queue[type] )
110 this.queue[type] = [];
112 this.queue[type].push( fn );
114 if ( this.queue[type].length == 1 )
123 setAuto: function(e,p) {
125 var o = jQuery.css(e,p);
127 var n = jQuery.css(e,p);
132 speed: function(s,o,i) {
135 if ( o.constructor == Function )
138 var ss = { slow: 600, fast: 200 };
139 o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
142 o.oldComplete = o.complete;
143 o.complete = function(){
144 jQuery.dequeue(this, "fx");
145 if ( o.oldComplete && o.oldComplete.constructor == Function )
146 o.oldComplete.apply( this );
157 dequeue: function(elem,type){
160 if ( elem.queue && elem.queue[type] ) {
162 elem.queue[type].shift();
165 var f = elem.queue[type][0];
173 * I originally wrote fx() as a clone of moo.fx and in the process
174 * of making it small in size the code became illegible to sane
175 * people. You've been warned.
178 fx: function( elem, options, prop ){
184 duration: options.duration || 400,
185 complete: options.complete
194 // Simple function for setting a style value
196 if ( prop == "opacity" ) {
197 if (z.now == 1) z.now = 0.9999;
198 if (window.ActiveXObject)
199 y.filter = "alpha(opacity=" + z.now*100 + ")";
202 y[prop] = z.now+"px";
205 // Figure out the maximum number to run to
207 return parseFloat( jQuery.css(z.el,prop) );
210 // Get the current size
212 return parseFloat( jQuery.curCSS(z.el,prop) ) || z.max();
215 // Start an animation from one number to another
216 z.custom = function(from,to){
217 z.startTime = (new Date()).getTime();
221 z.timer = setInterval(function(){
226 // Simple 'show' function
228 if ( !z.el.orig ) z.el.orig = {};
230 // Remember where we started, so that we can go back to it later
231 z.el.orig[prop] = this.cur();
233 if ( !y[prop] ) z.o.auto = true;
238 // Simple 'hide' function
240 if ( !z.el.orig ) z.el.orig = {};
242 // Remember where we started, so that we can go back to it later
243 z.el.orig[prop] = this.cur();
246 // Begin the animation
250 // IE has trouble with opacity if it does not have layout
251 if ( jQuery.browser.msie && !z.el.currentStyle.hasLayout )
254 // Remember the overflow of the element
255 z.oldOverflow = y.overflow;
257 // Make sure that nothing sneaks out
258 y.overflow = "hidden";
260 // Each step of an animation
261 z.step = function(firstNum, lastNum){
262 var t = (new Date()).getTime();
264 if (t > z.o.duration + z.startTime) {
266 clearInterval(z.timer);
272 // Reset the overflow
273 y.overflow = z.oldOverflow;
275 // If the element was shown, and not using a custom number,
276 // set its height and/or width to auto
277 if ( (prop == "height" || prop == "width") && z.o.auto )
278 jQuery.setAuto( z.el, prop );
280 // If a callback was provided, execute it
281 if( z.o.complete && z.o.complete.constructor == Function ) {
283 // Yes, this is a weird place for this, but it needs to be executed
284 // only once per cluster of effects.
285 // If the element is, effectively, hidden - hide it
286 if ( z.o.hide ) y.display = "none";
288 // Execute the complete function
289 z.o.complete.apply( z.el );
292 // Reset the property, if the item has been hidden
294 y[ prop ] = z.el.orig[ prop ].constructor == Number && prop != "opacity" ? z.el.orig[prop] + "px" : z.el.orig[prop];
296 // Figure out where in the animation we are and set the number
297 var p = (t - this.startTime) / z.o.duration;
298 z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
300 // Perform the next step of the animation