| /*! |
| * jQuery UI Effects Bounce 1.9.2 |
| * http://jqueryui.com |
| * |
| * Copyright 2012 jQuery Foundation and other contributors |
| * Released under the MIT license. |
| * http://jquery.org/license |
| * |
| * http://api.jqueryui.com/bounce-effect/ |
| * |
| * Depends: |
| * jquery.ui.effect.js |
| */ |
| (function( $, undefined ) { |
| |
| $.effects.effect.bounce = function( o, done ) { |
| var el = $( this ), |
| props = [ "position", "top", "bottom", "left", "right", "height", "width" ], |
| |
| // defaults: |
| mode = $.effects.setMode( el, o.mode || "effect" ), |
| hide = mode === "hide", |
| show = mode === "show", |
| direction = o.direction || "up", |
| distance = o.distance, |
| times = o.times || 5, |
| |
| // number of internal animations |
| anims = times * 2 + ( show || hide ? 1 : 0 ), |
| speed = o.duration / anims, |
| easing = o.easing, |
| |
| // utility: |
| ref = ( direction === "up" || direction === "down" ) ? "top" : "left", |
| motion = ( direction === "up" || direction === "left" ), |
| i, |
| upAnim, |
| downAnim, |
| |
| // we will need to re-assemble the queue to stack our animations in place |
| queue = el.queue(), |
| queuelen = queue.length; |
| |
| // Avoid touching opacity to prevent clearType and PNG issues in IE |
| if ( show || hide ) { |
| props.push( "opacity" ); |
| } |
| |
| $.effects.save( el, props ); |
| el.show(); |
| $.effects.createWrapper( el ); // Create Wrapper |
| |
| // default distance for the BIGGEST bounce is the outer Distance / 3 |
| if ( !distance ) { |
| distance = el[ ref === "top" ? "outerHeight" : "outerWidth" ]() / 3; |
| } |
| |
| if ( show ) { |
| downAnim = { opacity: 1 }; |
| downAnim[ ref ] = 0; |
| |
| // if we are showing, force opacity 0 and set the initial position |
| // then do the "first" animation |
| el.css( "opacity", 0 ) |
| .css( ref, motion ? -distance * 2 : distance * 2 ) |
| .animate( downAnim, speed, easing ); |
| } |
| |
| // start at the smallest distance if we are hiding |
| if ( hide ) { |
| distance = distance / Math.pow( 2, times - 1 ); |
| } |
| |
| downAnim = {}; |
| downAnim[ ref ] = 0; |
| // Bounces up/down/left/right then back to 0 -- times * 2 animations happen here |
| for ( i = 0; i < times; i++ ) { |
| upAnim = {}; |
| upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; |
| |
| el.animate( upAnim, speed, easing ) |
| .animate( downAnim, speed, easing ); |
| |
| distance = hide ? distance * 2 : distance / 2; |
| } |
| |
| // Last Bounce when Hiding |
| if ( hide ) { |
| upAnim = { opacity: 0 }; |
| upAnim[ ref ] = ( motion ? "-=" : "+=" ) + distance; |
| |
| el.animate( upAnim, speed, easing ); |
| } |
| |
| el.queue(function() { |
| if ( hide ) { |
| el.hide(); |
| } |
| $.effects.restore( el, props ); |
| $.effects.removeWrapper( el ); |
| done(); |
| }); |
| |
| // inject all the animations we just queued to be first in line (after "inprogress") |
| if ( queuelen > 1) { |
| queue.splice.apply( queue, |
| [ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) ); |
| } |
| el.dequeue(); |
| |
| }; |
| |
| })(jQuery); |