/*! * jQuery UI Effects Bounce - v1.10.4 * http://jqueryui.com * * Copyright 2014 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 */ define([ 'jquery', 'jquery-ui-modules/effect' ], 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(); }; });