diff --git a/jquery.cycle.all.js b/jquery.cycle.all.js index e34f875..3928e7f 100644 --- a/jquery.cycle.all.js +++ b/jquery.cycle.all.js @@ -12,17 +12,22 @@ var ver = '2.9999.2'; // if $.support is not defined (pre jQuery 1.3) add what I need -if ($.support == undefined) { - $.support = { - opacity: !($.browser.msie) +if ($.support === undefined) { + $.support = { + opacity: !($.browser.msie) }; } function debug(s) { - $.fn.cycle.debug && log(s); + if(s && $.fn.cycle.debug && log) { + log(s); + } } function log() { - window.console && console.log && console.log('[cycle] ' + Array.prototype.join.call(arguments,' ')); + if(window.console && console && console.log) + { + console.log('[cycle] ' + Array.prototype.join.call(arguments,' ')); + } } $.expr[':'].paused = function(el) { return el.cyclePause; @@ -30,20 +35,20 @@ $.expr[':'].paused = function(el) { // the options arg can be... -// a number - indicates an immediate transition should occur to the given slide index -// a string - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc) -// an object - properties to control the slideshow +// a number - indicates an immediate transition should occur to the given slide index +// a string - 'pause', 'resume', 'toggle', 'next', 'prev', 'stop', 'destroy' or the name of a transition effect (ie, 'fade', 'zoom', etc) +// an object - properties to control the slideshow // // the arg2 arg can be... -// the name of an fx (only used in conjunction with a numeric value for 'options') -// the value true (only used in first arg == 'resume') and indicates -// that the resume should occur immediately (not wait for next timeout) +// the name of an fx (only used in conjunction with a numeric value for 'options') +// the value true (only used in first arg == 'resume') and indicates +// that the resume should occur immediately (not wait for next timeout) $.fn.cycle = function(options, arg2) { var o = { s: this.selector, c: this.context }; // in 1.3+ we can fix mistakes with the ready state - if (this.length === 0 && options != 'stop') { + if (this.length === 0 && options !== 'stop') { if (!$.isReady && o.s) { log('DOM not ready, queuing slideshow'); $(function() { @@ -60,13 +65,17 @@ $.fn.cycle = function(options, arg2) { return this.each(function() { var opts = handleArguments(this, options, arg2); if (opts === false) + { return; + } opts.updateActivePagerLink = opts.updateActivePagerLink || $.fn.cycle.updateActivePagerLink; // stop existing slideshow for this container (if there is one) if (this.cycleTimeout) + { clearTimeout(this.cycleTimeout); + } this.cycleTimeout = this.cyclePause = 0; var $cont = $(this); @@ -75,7 +84,9 @@ $.fn.cycle = function(options, arg2) { var opts2 = buildOptions($cont, $slides, els, opts, o); if (opts2 === false) + { return; + } if (els.length < 2) { log('terminating; too few slides: ' + els.length); @@ -88,9 +99,11 @@ $.fn.cycle = function(options, arg2) { if (startTime) { startTime += (opts2.delay || 0); if (startTime < 10) + { startTime = 10; + } debug('first timeout: ' + startTime); - this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards)}, startTime); + this.cycleTimeout = setTimeout(function(){go(els,opts2,0,!opts.backwards);}, startTime); } }); }; @@ -99,32 +112,46 @@ function triggerPause(cont, byHover, onPager) { var opts = $(cont).data('cycle.opts'); var paused = !!cont.cyclePause; if (paused && opts.paused) + { opts.paused(cont, opts, byHover, onPager); + } else if (!paused && opts.resumed) + { opts.resumed(cont, opts, byHover, onPager); + } } // process the args that were passed to the plugin fn function handleArguments(cont, options, arg2) { - if (cont.cycleStop == undefined) + if (cont.cycleStop === undefined) + { cont.cycleStop = 0; + } if (options === undefined || options === null) + { options = {}; - if (options.constructor == String) { + } + if (options.constructor === String) { switch(options) { case 'destroy': case 'stop': var opts = $(cont).data('cycle.opts'); if (!opts) + { return false; + } cont.cycleStop++; // callbacks look for change if (cont.cycleTimeout) + { clearTimeout(cont.cycleTimeout); + } cont.cycleTimeout = 0; - opts.elements && $(opts.elements).stop(); + if(opts.elements) { $(opts.elements).stop(); } $(cont).removeData('cycle.opts'); - if (options == 'destroy') + if (options === 'destroy') + { destroy(cont, opts); + } return false; case 'toggle': cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1; @@ -142,7 +169,7 @@ function handleArguments(cont, options, arg2) { return false; case 'prev': case 'next': - var opts = $(cont).data('cycle.opts'); + opts = $(cont).data('cycle.opts'); if (!opts) { log('options not found, "prev/next" ignored'); return false; @@ -151,10 +178,10 @@ function handleArguments(cont, options, arg2) { return false; default: options = { fx: options }; - }; + } return options; } - else if (options.constructor == Number) { + else if (options.constructor === Number) { // go to the requested slide var num = options; options = $(cont).data('cycle.opts'); @@ -171,8 +198,10 @@ function handleArguments(cont, options, arg2) { clearTimeout(cont.cycleTimeout); cont.cycleTimeout = 0; } - if (typeof arg2 == 'string') + if (typeof arg2 === 'string') + { options.oneTimeFx = arg2; + } go(options.elements, options, 1, num >= options.currSlide); return false; } @@ -192,31 +221,39 @@ function handleArguments(cont, options, arg2) { go(options.elements, options, 1, !options.backwards); } } -}; +} function removeFilter(el, opts) { if (!$.support.opacity && opts.cleartype && el.style.filter) { try { el.style.removeAttribute('filter'); } catch(smother) {} // handle old opera versions } -}; +} // unbind event handlers function destroy(cont, opts) { if (opts.next) + { $(opts.next).unbind(opts.prevNextEvent); + } if (opts.prev) + { $(opts.prev).unbind(opts.prevNextEvent); + } if (opts.pager || opts.pagerAnchorBuilder) + { $.each(opts.pagerAnchors || [], function() { this.unbind().remove(); }); + } opts.pagerAnchors = null; $(cont).unbind('mouseenter.cycle mouseleave.cycle'); if (opts.destroy) // callback + { opts.destroy(opts); -}; + } +} // one-time initialization function buildOptions($cont, $slides, els, options, o) { @@ -225,9 +262,13 @@ function buildOptions($cont, $slides, els, options, o) { var opts = $.extend({}, $.fn.cycle.defaults, options || {}, $.metadata ? $cont.metadata() : $.meta ? $cont.data() : {}); var meta = $.isFunction($cont.data) ? $cont.data(opts.metaAttr) : null; if (meta) + { opts = $.extend(opts, meta); + } if (opts.autostop) + { opts.countdown = opts.autostopCount || els.length; + } var cont = $cont[0]; $cont.data('cycle.opts', opts); @@ -239,46 +280,68 @@ function buildOptions($cont, $slides, els, options, o) { // push some after callbacks if (!$.support.opacity && opts.cleartype) + { opts.after.push(function() { removeFilter(this, opts); }); + } if (opts.continuous) + { opts.after.push(function() { go(els,opts,0,!opts.backwards); }); + } saveOriginalOpts(opts); // clearType corrections if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + { clearTypeFix($slides); + } // container requires non-static position so that slides can be position within - if ($cont.css('position') == 'static') + if ($cont.css('position') === 'static') + { $cont.css('position', 'relative'); + } if (opts.width) + { $cont.width(opts.width); - if (opts.height && opts.height != 'auto') + } + if (opts.height && opts.height !== 'auto') + { $cont.height(opts.height); + } - if (opts.startingSlide != undefined) { + if (opts.startingSlide !== undefined) { opts.startingSlide = parseInt(opts.startingSlide,10); if (opts.startingSlide >= els.length || opts.startSlide < 0) + { opts.startingSlide = 0; // catch bogus input + } else + { startingSlideSpecified = true; + } } else if (opts.backwards) + { opts.startingSlide = els.length - 1; + } else + { opts.startingSlide = 0; + } // if random, mix up the slide array if (opts.random) { opts.randomMap = []; for (var i = 0; i < els.length; i++) + { opts.randomMap.push(i); + } opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); if (startingSlideSpecified) { // try to find the specified starting slide and if found set start slide index in the map accordingly for ( var cnt = 0; cnt < els.length; cnt++ ) { - if ( opts.startingSlide == opts.randomMap[cnt] ) { + if ( opts.startingSlide === opts.randomMap[cnt] ) { opts.randomIndex = cnt; } } @@ -289,7 +352,9 @@ function buildOptions($cont, $slides, els, options, o) { } } else if (opts.startingSlide >= els.length) + { opts.startingSlide = 0; // catch bogus input + } opts.currSlide = opts.startingSlide || 0; var first = opts.startingSlide; @@ -297,9 +362,13 @@ function buildOptions($cont, $slides, els, options, o) { $slides.css({position: 'absolute', top:0, left:0}).hide().each(function(i) { var z; if (opts.backwards) + { z = first ? i <= first ? els.length + (i-first) : first-i : els.length-i; + } else + { z = first ? i >= first ? els.length - (i-first) : first-i : els.length-i; + } $(this).css('z-index', z); }); @@ -310,15 +379,19 @@ function buildOptions($cont, $slides, els, options, o) { // stretch slides if (opts.fit) { if (!opts.aspect) { - if (opts.width) - $slides.width(opts.width); - if (opts.height && opts.height != 'auto') - $slides.height(opts.height); + if (opts.width) + { + $slides.width(opts.width); + } + if (opts.height && opts.height !== 'auto') + { + $slides.height(opts.height); + } } else { $slides.each(function(){ var $slide = $(this); var ratio = (opts.aspect === true) ? $slide.width()/$slide.height() : opts.aspect; - if( opts.width && $slide.width() != opts.width ) { + if( opts.width && $slide.width() !== opts.width ) { $slide.width( opts.width ); $slide.height( opts.width / ratio ); } @@ -346,14 +419,14 @@ function buildOptions($cont, $slides, els, options, o) { } if (opts.center && !opts.fit && !opts.slideResize) { - $slides.each(function(){ - var $slide = $(this); - $slide.css({ - "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0, - "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0 - }); - }); - } + $slides.each(function(){ + var $slide = $(this); + $slide.css({ + "margin-left": opts.width ? ((opts.width - $slide.width()) / 2) + "px" : 0, + "margin-top": opts.height ? ((opts.height - $slide.height()) / 2) + "px" : 0 + }); + }); + } // stretch container var reshape = opts.containerResize && !$cont.innerHeight(); @@ -361,28 +434,34 @@ function buildOptions($cont, $slides, els, options, o) { var maxw = 0, maxh = 0; for(var j=0; j < els.length; j++) { var $e = $(els[j]), e = $e[0], w = $e.outerWidth(), h = $e.outerHeight(); - if (!w) w = e.offsetWidth || e.width || $e.attr('width'); - if (!h) h = e.offsetHeight || e.height || $e.attr('height'); - maxw = w > maxw ? w : maxw; - maxh = h > maxh ? h : maxh; + if (!w) { w = e.offsetWidth || e.width || $e.attr('width'); } + if (!h) { h = e.offsetHeight || e.height || $e.attr('height'); } + maxw = (w > maxw) ? w : maxw; + maxh = (h > maxh) ? h : maxh; } if (maxw > 0 && maxh > 0) + { $cont.css({width:maxw+'px',height:maxh+'px'}); + } } var pauseFlag = false; // https://github.com/malsup/cycle/issues/44 if (opts.pause) + { $cont.bind('mouseenter.cycle', function(){ pauseFlag = true; this.cyclePause++; triggerPause(cont, true); }).bind('mouseleave.cycle', function(){ - pauseFlag && this.cyclePause--; + if(pauseFlag && this.cyclePause) { this.cyclePause--; } triggerPause(cont, true); }); - + } + if (supportMultiTransitions(opts) === false) + { return false; + } // apparently a lot of people use image slideshows without height/width attributes on the images. // Cycle 2.50+ requires the sizing info for every slide; this block tries to deal with that. @@ -398,15 +477,15 @@ function buildOptions($cont, $slides, els, options, o) { // sigh.. sniffing, hacking, shrugging... this crappy hack tries to account for what browsers do when // an image is being downloaded and the markup did not include sizing info (height/width attributes); // there seems to be some "default" sizes used in this situation - var loadingIE = ($.browser.msie && this.cycleW == 28 && this.cycleH == 30 && !this.complete); - var loadingFF = ($.browser.mozilla && this.cycleW == 34 && this.cycleH == 19 && !this.complete); - var loadingOp = ($.browser.opera && ((this.cycleW == 42 && this.cycleH == 19) || (this.cycleW == 37 && this.cycleH == 17)) && !this.complete); - var loadingOther = (this.cycleH == 0 && this.cycleW == 0 && !this.complete); + var loadingIE = ($.browser.msie && this.cycleW === 28 && this.cycleH === 30 && !this.complete); + var loadingFF = ($.browser.mozilla && this.cycleW === 34 && this.cycleH === 19 && !this.complete); + var loadingOp = ($.browser.opera && ((this.cycleW === 42 && this.cycleH === 19) || (this.cycleW === 37 && this.cycleH === 17)) && !this.complete); + var loadingOther = (this.cycleH === 0 && this.cycleW === 0 && !this.complete); // don't requeue for images that are still loading but have a valid size if (loadingIE || loadingFF || loadingOp || loadingOther) { if (o.s && opts.requeueOnImageNotLoaded && ++options.requeueAttempts < 100) { // track retry count so we don't loop forever log(options.requeueAttempts,' - img slide not loaded, requeuing slideshow: ', this.src, this.cycleW, this.cycleH); - setTimeout(function() {$(o.s,o.c).cycle(options)}, opts.requeueTimeout); + setTimeout(function() {$(o.s,o.c).cycle(options);}, opts.requeueTimeout); requeue = true; return false; // break each loop } @@ -419,7 +498,9 @@ function buildOptions($cont, $slides, els, options, o) { }); if (requeue) + { return false; + } opts.cssBefore = opts.cssBefore || {}; opts.cssAfter = opts.cssAfter || {}; @@ -433,40 +514,60 @@ function buildOptions($cont, $slides, els, options, o) { if (opts.timeout) { opts.timeout = parseInt(opts.timeout,10); // ensure that timeout and speed settings are sane - if (opts.speed.constructor == String) + if (opts.speed.constructor === String) + { opts.speed = $.fx.speeds[opts.speed] || parseInt(opts.speed,10); + } if (!opts.sync) + { opts.speed = opts.speed / 2; + } - var buffer = opts.fx == 'none' ? 0 : opts.fx == 'shuffle' ? 500 : 250; + var buffer = (opts.fx === 'none') ? 0 : (opts.fx === 'shuffle') ? 500 : 250; while((opts.timeout - opts.speed) < buffer) // sanitize timeout + { opts.timeout += opts.speed; + } } if (opts.easing) + { opts.easeIn = opts.easeOut = opts.easing; + } if (!opts.speedIn) + { opts.speedIn = opts.speed; + } if (!opts.speedOut) + { opts.speedOut = opts.speed; + } opts.slideCount = els.length; opts.currSlide = opts.lastSlide = first; if (opts.random) { - if (++opts.randomIndex == els.length) + if (++opts.randomIndex === els.length) + { opts.randomIndex = 0; + } opts.nextSlide = opts.randomMap[opts.randomIndex]; } else if (opts.backwards) - opts.nextSlide = opts.startingSlide == 0 ? (els.length-1) : opts.startingSlide-1; + { + opts.nextSlide = (opts.startingSlide === 0) ? (els.length-1) : opts.startingSlide-1; + } else + { opts.nextSlide = opts.startingSlide >= (els.length-1) ? 0 : opts.startingSlide+1; + } // run transition init fn if (!opts.multiFx) { var init = $.fn.cycle.transitions[opts.fx]; if ($.isFunction(init)) + { init($cont, $slides, opts); - else if (opts.fx != 'custom' && !opts.multiFx) { + } + else if (opts.fx !== 'custom' && !opts.multiFx) { log('unknown transition: ' + opts.fx,'; slideshow terminating'); return false; } @@ -476,21 +577,31 @@ function buildOptions($cont, $slides, els, options, o) { var e0 = $slides[first]; if (!opts.skipInitializationCallbacks) { if (opts.before.length) + { opts.before[0].apply(e0, [e0, e0, opts, true]); + } if (opts.after.length) + { opts.after[0].apply(e0, [e0, e0, opts, true]); + } } if (opts.next) - $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1)}); + { + $(opts.next).bind(opts.prevNextEvent,function(){return advance(opts,1);}); + } if (opts.prev) - $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)}); + { + $(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0);}); + } if (opts.pager || opts.pagerAnchorBuilder) + { buildPager(els,opts); + } exposeAddSlide(opts, els); return opts; -}; +} // save off original opts so we can restore after clearing state function saveOriginalOpts(opts) { @@ -501,10 +612,10 @@ function saveOriginalOpts(opts) { opts.original.animOut = $.extend({}, opts.animOut); $.each(opts.before, function() { opts.original.before.push(this); }); $.each(opts.after, function() { opts.original.after.push(this); }); -}; +} function supportMultiTransitions(opts) { - var i, tx, txs = $.fn.cycle.transitions; + var i, p, tx, txs = $.fn.cycle.transitions; // look for multiple effects if (opts.fx.indexOf(',') > 0) { opts.multiFx = true; @@ -525,13 +636,16 @@ function supportMultiTransitions(opts) { return false; } } - else if (opts.fx == 'all') { // auto-gen the list of transitions + else if (opts.fx === 'all') { // auto-gen the list of transitions opts.multiFx = true; opts.fxs = []; - for (p in txs) { - tx = txs[p]; - if (txs.hasOwnProperty(p) && $.isFunction(tx)) + + for (p in txs) + { + if (txs.hasOwnProperty(p) && $.isFunction(txs[p])) + { opts.fxs.push(p); + } } } if (opts.multiFx && opts.randomizeEffects) { @@ -544,17 +658,21 @@ function supportMultiTransitions(opts) { debug('randomized fx sequence: ',opts.fxs); } return true; -}; +} // provide a mechanism for adding slides after the slideshow has started function exposeAddSlide(opts, els) { opts.addSlide = function(newSlide, prepend) { var $s = $(newSlide), s = $s[0]; if (!opts.autostopCount) + { opts.countdown++; + } els[prepend?'unshift':'push'](s); if (opts.els) + { opts.els[prepend?'unshift':'push'](s); // shuffle needs this + } opts.slideCount = els.length; // add the slide to the random map and resort @@ -572,24 +690,36 @@ function exposeAddSlide(opts, els) { } if (!$.support.opacity && opts.cleartype && !opts.cleartypeNoBg) + { clearTypeFix($s); + } if (opts.fit && opts.width) + { $s.width(opts.width); - if (opts.fit && opts.height && opts.height != 'auto') + } + if (opts.fit && opts.height && opts.height !== 'auto') + { $s.height(opts.height); + } s.cycleH = (opts.fit && opts.height) ? opts.height : $s.height(); s.cycleW = (opts.fit && opts.width) ? opts.width : $s.width(); $s.css(opts.cssBefore); if (opts.pager || opts.pagerAnchorBuilder) + { $.fn.cycle.createPagerAnchor(els.length-1, s, $(opts.pager), els, opts); + } if ($.isFunction(opts.onAddSlide)) + { opts.onAddSlide($s); + } else + { $s.hide(); // default behavior + } }; } @@ -608,7 +738,9 @@ $.fn.cycle.resetState = function(opts, fx) { // re-init var init = $.fn.cycle.transitions[fx]; if ($.isFunction(init)) + { init(opts.$cont, $(opts.elements), opts); + } }; // this is the main engine fn, it handles the timeouts, callbacks and slide index mgmt @@ -629,21 +761,25 @@ function go(els, opts, manual, fwd) { var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; // stop cycling if we have an outstanding stop request - if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0 && !manual) + if (p.cycleStop !== opts.stopCount || p.cycleTimeout === 0 && !manual) + { return; + } // check to see if we should stop cycling based on autostop options if (!manual && !p.cyclePause && !opts.bounce && ((opts.autostop && (--opts.countdown <= 0)) || (opts.nowrap && !opts.random && opts.nextSlide < opts.currSlide))) { if (opts.end) + { opts.end(opts); + } return; } // if slideshow is paused, only transition on a manual trigger var changed = false; - if ((manual || !p.cyclePause) && (opts.nextSlide != opts.currSlide)) { + if ((manual || !p.cyclePause) && (opts.nextSlide !== opts.currSlide)) { changed = true; var fx = opts.fx; // keep trying to get the slide size if we don't have it yet @@ -654,10 +790,14 @@ function go(els, opts, manual, fwd) { // support multiple transition types if (opts.multiFx) { - if (fwd && (opts.lastFx == undefined || ++opts.lastFx >= opts.fxs.length)) + if (fwd && (opts.lastFx === undefined || ++opts.lastFx >= opts.fxs.length)) + { opts.lastFx = 0; - else if (!fwd && (opts.lastFx == undefined || --opts.lastFx < 0)) + } + else if (!fwd && (opts.lastFx === undefined || --opts.lastFx < 0)) + { opts.lastFx = opts.fxs.length - 1; + } fx = opts.fxs[opts.lastFx]; } @@ -671,16 +811,17 @@ function go(els, opts, manual, fwd) { // run the before callbacks if (opts.before.length) + { $.each(opts.before, function(i,o) { - if (p.cycleStop != opts.stopCount) return; + if (p.cycleStop !== opts.stopCount) {return;} o.apply(next, [curr, next, opts, fwd]); }); - + } // stage the after callacks var after = function() { opts.busy = 0; $.each(opts.after, function(i,o) { - if (p.cycleStop != opts.stopCount) return; + if (p.cycleStop !== opts.stopCount) {return;} o.apply(next, [curr, next, opts, fwd]); }); if (!p.cycleStop) { @@ -694,31 +835,40 @@ function go(els, opts, manual, fwd) { // get ready to perform the transition opts.busy = 1; if (opts.fxFn) // fx function provided? + { opts.fxFn(curr, next, opts, after, fwd, manual && opts.fastOnEvent); + } else if ($.isFunction($.fn.cycle[opts.fx])) // fx plugin ? + { $.fn.cycle[opts.fx](curr, next, opts, after, fwd, manual && opts.fastOnEvent); + } else + { $.fn.cycle.custom(curr, next, opts, after, fwd, manual && opts.fastOnEvent); + } } else { queueNext(); } - if (changed || opts.nextSlide == opts.currSlide) { + if (changed || opts.nextSlide === opts.currSlide) { // calculate the next slide opts.lastSlide = opts.currSlide; + var roll = null; if (opts.random) { opts.currSlide = opts.nextSlide; - if (++opts.randomIndex == els.length) { + if (++opts.randomIndex === els.length) { opts.randomIndex = 0; opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); } opts.nextSlide = opts.randomMap[opts.randomIndex]; - if (opts.nextSlide == opts.currSlide) - opts.nextSlide = (opts.currSlide == opts.slideCount - 1) ? 0 : opts.currSlide + 1; + if (opts.nextSlide === opts.currSlide) + { + opts.nextSlide = (opts.currSlide === opts.slideCount - 1) ? 0 : opts.currSlide + 1; + } } else if (opts.backwards) { - var roll = (opts.nextSlide - 1) < 0; + roll = (opts.nextSlide - 1) < 0; if (roll && opts.bounce) { opts.backwards = !opts.backwards; opts.nextSlide = 1; @@ -730,7 +880,7 @@ function go(els, opts, manual, fwd) { } } else { // sequence - var roll = (opts.nextSlide + 1) == els.length; + roll = (opts.nextSlide + 1) === els.length; if (roll && opts.bounce) { opts.backwards = !opts.backwards; opts.nextSlide = els.length-2; @@ -743,22 +893,31 @@ function go(els, opts, manual, fwd) { } } if (changed && opts.pager) + { opts.updateActivePagerLink(opts.pager, opts.currSlide, opts.activePagerClass); + } function queueNext() { // stage the next transition var ms = 0, timeout = opts.timeout; - if (opts.timeout && !opts.continuous) { + if (opts.timeout && !opts.continuous) + { ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd); - if (opts.fx == 'shuffle') - ms -= opts.speedOut; - } - else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic - ms = 10; + if (opts.fx === 'shuffle') + { + ms -= opts.speedOut; + } + } + else if (opts.continuous && p.cyclePause) // continuous shows work off an after callback, not this timer logic + { + ms = 10; + } if (ms > 0) - p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards) }, ms); + { + p.cycleTimeout = setTimeout(function(){ go(els, opts, 0, !opts.backwards); }, ms); + } } -}; +} // invoked after transition $.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) { @@ -772,14 +931,18 @@ function getTimeout(curr, next, opts, fwd) { if (opts.timeoutFn) { // call user provided calc fn var t = opts.timeoutFn.call(curr,curr,next,opts,fwd); - while (opts.fx != 'none' && (t - opts.speed) < 250) // sanitize timeout - t += opts.speed; + while (opts.fx !== 'none' && (t - opts.speed) < 250) // sanitize timeout + { + t += opts.speed; + } debug('calculated timeout: ' + t + '; speed: ' + opts.speed); if (t !== false) + { return t; - } - return opts.timeout; -}; + } + } + return opts.timeout; +} // expose next/prev function, caller must pass in state $.fn.cycle.next = function(opts) { advance(opts,1); }; @@ -797,10 +960,14 @@ function advance(opts, moveForward) { if (opts.random && val < 0) { // move back to the previously display slide opts.randomIndex--; - if (--opts.randomIndex == -2) + if (--opts.randomIndex === -2) + { opts.randomIndex = els.length-2; - else if (opts.randomIndex == -1) + } + else if (opts.randomIndex === -1) + { opts.randomIndex = els.length-1; + } opts.nextSlide = opts.randomMap[opts.randomIndex]; } else if (opts.random) { @@ -809,21 +976,23 @@ function advance(opts, moveForward) { else { opts.nextSlide = opts.currSlide + val; if (opts.nextSlide < 0) { - if (opts.nowrap) return false; + if (opts.nowrap) {return false; } opts.nextSlide = els.length - 1; } else if (opts.nextSlide >= els.length) { - if (opts.nowrap) return false; + if (opts.nowrap) {return false;} opts.nextSlide = 0; } } var cb = opts.onPrevNextEvent || opts.prevNextClick; // prevNextClick is deprecated if ($.isFunction(cb)) + { cb(val > 0, opts.nextSlide, els[opts.nextSlide]); + } go(els, opts, 1, moveForward); return false; -}; +} function buildPager(els, opts) { var $p = $(opts.pager); @@ -831,7 +1000,7 @@ function buildPager(els, opts) { $.fn.cycle.createPagerAnchor(i,o,$p,els,opts); }); opts.updateActivePagerLink(opts.pager, opts.startingSlide, opts.activePagerClass); -}; +} $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { var a; @@ -840,15 +1009,19 @@ $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { debug('pagerAnchorBuilder('+i+', el) returned: ' + a); } else + { a = ''+(i+1)+''; + } if (!a) + { return; + } var $a = $(a); // don't reparent if anchor is in the dom if ($a.parents('body').length === 0) { - var arr = []; - if ($p.length > 1) { + var arr = []; + if ($p.length > 1) { $p.each(function() { var $clone = $a.clone(true); $(this).append($clone); @@ -874,7 +1047,9 @@ $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { } var cb = opts.onPagerEvent || opts.pagerClick; // pagerClick is deprecated if ($.isFunction(cb)) + { cb(opts.nextSlide, els[opts.nextSlide]); + } go(els,opts,1,opts.currSlide < i); // trigger the trans // return false; // <== allow bubble }; @@ -887,7 +1062,9 @@ $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { } if ( ! /^click/.test(opts.pagerEvent) && !opts.allowPagerClickBubble) + { $a.bind('click.cycle', function(){return false;}); // suppress click + } var cont = opts.$cont[0]; var pauseFlag = false; // https://github.com/malsup/cycle/issues/44 @@ -898,7 +1075,7 @@ $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { cont.cyclePause++; triggerPause(cont,true,true); }, function() { - pauseFlag && cont.cyclePause--; + if(pauseFlag) {cont.cyclePause--;} triggerPause(cont,true,true); } ); @@ -909,9 +1086,13 @@ $.fn.cycle.createPagerAnchor = function(i, el, $p, els, opts) { $.fn.cycle.hopsFromLast = function(opts, fwd) { var hops, l = opts.lastSlide, c = opts.currSlide; if (fwd) + { hops = c > l ? c - l : opts.slideCount - l; + } else + { hops = c < l ? l - c : l + opts.slideCount - c; + } return hops; }; @@ -919,35 +1100,43 @@ $.fn.cycle.hopsFromLast = function(opts, fwd) { // (otherwise text slides look horrible during a fade transition) function clearTypeFix($slides) { debug('applying clearType background-color hack'); - function hex(s) { + var hex = function(s) { s = parseInt(s,10).toString(16); return s.length < 2 ? '0'+s : s; - }; - function getBg(e) { - for ( ; e && e.nodeName.toLowerCase() != 'html'; e = e.parentNode) { + }, + getBg = function(e) { + for ( ; e && e.nodeName.toLowerCase() !== 'html'; e = e.parentNode) { var v = $.css(e,'background-color'); if (v && v.indexOf('rgb') >= 0 ) { var rgb = v.match(/\d+/g); return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); } - if (v && v != 'transparent') + if (v && v !== 'transparent') + { return v; + } } return '#ffffff'; }; $slides.each(function() { $(this).css('background-color', getBg(this)); }); -}; +} // reset common props before the next transition $.fn.cycle.commonReset = function(curr,next,opts,w,h,rev) { $(opts.elements).not(curr).hide(); - if (typeof opts.cssBefore.opacity == 'undefined') + if (typeof opts.cssBefore.opacity === 'undefined') + { opts.cssBefore.opacity = 1; + } opts.cssBefore.display = 'block'; if (opts.slideResize && w !== false && next.cycleW > 0) + { opts.cssBefore.width = next.cycleW; + } if (opts.slideResize && h !== false && next.cycleH > 0) + { opts.cssBefore.height = next.cycleH; + } opts.cssAfter = opts.cssAfter || {}; opts.cssAfter.display = 'none'; $(curr).css('zIndex',opts.slideCount + (rev === true ? 1 : 0)); @@ -960,10 +1149,14 @@ $.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) { var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut; $n.css(opts.cssBefore); if (speedOverride) { - if (typeof speedOverride == 'number') + if (typeof speedOverride === 'number') + { speedIn = speedOut = speedOverride; + } else + { speedIn = speedOut = 1; + } easeIn = easeOut = null; } var fn = function() { @@ -974,9 +1167,11 @@ $.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) { $l.animate(opts.animOut, speedOut, easeOut, function() { $l.css(opts.cssAfter); if (!opts.sync) + { fn(); + } }); - if (opts.sync) fn(); + if (opts.sync) { fn(); } }; // transition definitions - only fade is defined here, transition pack defines the rest @@ -987,8 +1182,8 @@ $.fn.cycle.transitions = { $.fn.cycle.commonReset(curr,next,opts); opts.cssBefore.opacity = 0; }); - opts.animIn = { opacity: 1 }; - opts.animOut = { opacity: 0 }; + opts.animIn = { opacity: 1 }; + opts.animOut = { opacity: 0 }; opts.cssBefore = { top: 0, left: 0 }; } }; @@ -998,63 +1193,63 @@ $.fn.cycle.ver = function() { return ver; }; // override these globally if you like (they are all optional) $.fn.cycle.defaults = { activePagerClass: 'activeSlide', // class name used for the active pager link - after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + after: null, // transition callback (scope set to element that was shown): function(currSlideElement, nextSlideElement, options, forwardFlag) allowPagerClickBubble: false, // allows or prevents click event on pager anchors from bubbling - animIn: null, // properties that define how the slide animates in - animOut: null, // properties that define how the slide animates out - aspect: false, // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option) - autostop: 0, // true to end slideshow after X transitions (where X == slide count) - autostopCount: 0, // number of transitions (optionally used with autostop to define X) - backwards: false, // true to start slideshow at last slide and move backwards through the stack - before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag) - center: null, // set to true to have cycle add top/left margin to each slide (use with width and height options) - cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE) - cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides) - containerResize: 1, // resize container to fit largest slide - continuous: 0, // true to start next transition immediately after current one completes - cssAfter: null, // properties that defined the state of the slide after transitioning out - cssBefore: null, // properties that define the initial state of the slide before transitioning in - delay: 0, // additional delay (in ms) for first transition (hint: can be negative) - easeIn: null, // easing for "in" transition - easeOut: null, // easing for "out" transition - easing: null, // easing method for both in and out transitions - end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options) - fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms - fit: 0, // force slides to fit container - fx: 'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle') - fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag) - height: 'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well) - manualTrump: true, // causes manual transition to stop an active transition instead of being ignored - metaAttr: 'cycle',// data- attribute that holds the option data for the slideshow - next: null, // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide - nowrap: 0, // true to prevent slideshow from wrapping - onPagerEvent: null, // callback fn for pager events: function(zeroBasedSlideIndex, slideElement) - onPrevNextEvent: null,// callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement) - pager: null, // element, jQuery object, or jQuery selector string for the element to use as pager container - pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement) - pagerEvent: 'click.cycle', // name of event which drives the pager navigation - pause: 0, // true to enable "pause on hover" - pauseOnPagerHover: 0, // true to pause when hovering over pager link - prev: null, // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide - prevNextEvent:'click.cycle',// event which drives the manual transition to the previous or next slide - random: 0, // true for random, false for sequence (not applicable to shuffle fx) - randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random - requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded - requeueTimeout: 250, // ms delay for requeue - rev: 0, // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle) - shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 } - skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition - slideExpr: null, // expression for selecting slides (if something other than all children is required) - slideResize: 1, // force slide width/height to fixed size before every transition - speed: 1000, // speed of the transition (any valid fx speed value) - speedIn: null, // speed of the 'in' transition - speedOut: null, // speed of the 'out' transition - startingSlide: undefined, // zero-based index of the first slide to be displayed - sync: 1, // true if in/out transitions should occur simultaneously - timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance) - timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag) - updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style) - width: null // container width (if the 'fit' option is true, the slides will be set to this width as well) + animIn: null, // properties that define how the slide animates in + animOut: null, // properties that define how the slide animates out + aspect: false, // preserve aspect ratio during fit resizing, cropping if necessary (must be used with fit option) + autostop: 0, // true to end slideshow after X transitions (where X == slide count) + autostopCount: 0, // number of transitions (optionally used with autostop to define X) + backwards: false, // true to start slideshow at last slide and move backwards through the stack + before: null, // transition callback (scope set to element to be shown): function(currSlideElement, nextSlideElement, options, forwardFlag) + center: null, // set to true to have cycle add top/left margin to each slide (use with width and height options) + cleartype: !$.support.opacity, // true if clearType corrections should be applied (for IE) + cleartypeNoBg: false, // set to true to disable extra cleartype fixing (leave false to force background color setting on slides) + containerResize: 1, // resize container to fit largest slide + continuous: 0, // true to start next transition immediately after current one completes + cssAfter: null, // properties that defined the state of the slide after transitioning out + cssBefore: null, // properties that define the initial state of the slide before transitioning in + delay: 0, // additional delay (in ms) for first transition (hint: can be negative) + easeIn: null, // easing for "in" transition + easeOut: null, // easing for "out" transition + easing: null, // easing method for both in and out transitions + end: null, // callback invoked when the slideshow terminates (use with autostop or nowrap options): function(options) + fastOnEvent: 0, // force fast transitions when triggered manually (via pager or prev/next); value == time in ms + fit: 0, // force slides to fit container + fx: 'fade', // name of transition effect (or comma separated names, ex: 'fade,scrollUp,shuffle') + fxFn: null, // function used to control the transition: function(currSlideElement, nextSlideElement, options, afterCalback, forwardFlag) + height: 'auto', // container height (if the 'fit' option is true, the slides will be set to this height as well) + manualTrump: true, // causes manual transition to stop an active transition instead of being ignored + metaAttr: 'cycle', // data- attribute that holds the option data for the slideshow + next: null, // element, jQuery object, or jQuery selector string for the element to use as event trigger for next slide + nowrap: 0, // true to prevent slideshow from wrapping + onPagerEvent: null, // callback fn for pager events: function(zeroBasedSlideIndex, slideElement) + onPrevNextEvent: null, // callback fn for prev/next events: function(isNext, zeroBasedSlideIndex, slideElement) + pager: null, // element, jQuery object, or jQuery selector string for the element to use as pager container + pagerAnchorBuilder: null, // callback fn for building anchor links: function(index, DOMelement) + pagerEvent: 'click.cycle', // name of event which drives the pager navigation + pause: 0, // true to enable "pause on hover" + pauseOnPagerHover: 0, // true to pause when hovering over pager link + prev: null, // element, jQuery object, or jQuery selector string for the element to use as event trigger for previous slide + prevNextEvent: 'click.cycle', // event which drives the manual transition to the previous or next slide + random: 0, // true for random, false for sequence (not applicable to shuffle fx) + randomizeEffects: 1, // valid when multiple effects are used; true to make the effect sequence random + requeueOnImageNotLoaded: true, // requeue the slideshow if any image slides are not yet loaded + requeueTimeout: 250, // ms delay for requeue + rev: 0, // causes animations to transition in reverse (for effects that support it such as scrollHorz/scrollVert/shuffle) + shuffle: null, // coords for shuffle animation, ex: { top:15, left: 200 } + skipInitializationCallbacks: false, // set to true to disable the first before/after callback that occurs prior to any transition + slideExpr: null, // expression for selecting slides (if something other than all children is required) + slideResize: 1, // force slide width/height to fixed size before every transition + speed: 1000, // speed of the transition (any valid fx speed value) + speedIn: null, // speed of the 'in' transition + speedOut: null, // speed of the 'out' transition + startingSlide: undefined, // zero-based index of the first slide to be displayed + sync: 1, // true if in/out transitions should occur simultaneously + timeout: 4000, // milliseconds between slide transitions (0 to disable auto advance) + timeoutFn: null, // callback for determining per-slide timeout value: function(currSlideElement, nextSlideElement, options, forwardFlag) + updateActivePagerLink: null, // callback fn invoked to update the active pager link (adds/removes activePagerClass style) + width: null // container width (if the 'fit' option is true, the slides will be set to this width as well) }; })(jQuery); @@ -1065,7 +1260,7 @@ $.fn.cycle.defaults = { * This script is a plugin for the jQuery Cycle Plugin * Examples and documentation at: http://malsup.com/jquery/cycle/ * Copyright (c) 2007-2010 M. Alsup - * Version: 2.73 + * Version: 2.73 * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html @@ -1089,8 +1284,8 @@ $.fn.cycle.transitions.none = function($cont, $slides, opts) { $.fn.cycle.transitions.fadeout = function($cont, $slides, opts) { $slides.not(':eq('+opts.currSlide+')').css({ display: 'block', 'opacity': 1 }); opts.before.push(function(curr,next,opts,w,h,rev) { - $(curr).css('zIndex',opts.slideCount + (!rev === true ? 1 : 0)); - $(next).css('zIndex',opts.slideCount + (!rev === true ? 0 : 1)); + $(curr).css('zIndex',opts.slideCount + ((!rev === true) ? 1 : 0)); + $(next).css('zIndex',opts.slideCount + ((!rev === true) ? 0 : 1)); }); opts.animIn.opacity = 1; opts.animOut.opacity = 0; @@ -1144,7 +1339,9 @@ $.fn.cycle.transitions.scrollHorz = function($cont, $slides, opts) { $cont.css('overflow','hidden').width(); opts.before.push(function(curr, next, opts, fwd) { if (opts.rev) + { fwd = !fwd; + } $.fn.cycle.commonReset(curr,next,opts); opts.cssBefore.left = fwd ? (next.cycleW-1) : (1-next.cycleW); opts.animOut.left = fwd ? -curr.cycleW : curr.cycleW; @@ -1158,7 +1355,9 @@ $.fn.cycle.transitions.scrollVert = function($cont, $slides, opts) { $cont.css('overflow','hidden'); opts.before.push(function(curr, next, opts, fwd) { if (opts.rev) + { fwd = !fwd; + } $.fn.cycle.commonReset(curr,next,opts); opts.cssBefore.top = fwd ? (1-next.cycleH) : (next.cycleH-1); opts.animOut.top = fwd ? curr.cycleH : -curr.cycleH; @@ -1211,25 +1410,42 @@ $.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { opts.shuffle = opts.shuffle || {left:-w, top:15}; opts.els = []; for (i=0; i < $slides.length; i++) + { opts.els.push($slides[i]); + } for (i=0; i < opts.currSlide; i++) + { opts.els.push(opts.els.shift()); + } // custom transition fn (hat tip to Benjamin Sterling for this bit of sweetness!) opts.fxFn = function(curr, next, opts, cb, fwd) { if (opts.rev) + { fwd = !fwd; + } var $el = fwd ? $(curr) : $(next); $(next).css(opts.cssBefore); var count = opts.slideCount; $el.animate(opts.shuffle, opts.speedIn, opts.easeIn, function() { var hops = $.fn.cycle.hopsFromLast(opts, fwd); for (var k=0; k < hops; k++) - fwd ? opts.els.push(opts.els.shift()) : opts.els.unshift(opts.els.pop()); + { + if(fwd) + { + opts.els.push(opts.els.shift()); + } + else + { + opts.els.unshift(opts.els.pop()); + } + } if (fwd) { for (var i=0, len=opts.els.length; i < len; i++) + { $(opts.els[i]).css('z-index', len-i+count); + } } else { var z = $(curr).css('z-index'); @@ -1237,7 +1453,10 @@ $.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { } $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() { $(fwd ? this : curr).hide(); - if (cb) cb(); + if (cb) + { + cb(); + } }); }); }; @@ -1422,14 +1641,22 @@ $.fn.cycle.transitions.cover = function($cont, $slides, opts) { var h = $cont.height(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts); - if (d == 'right') + if (d === 'right') + { opts.cssBefore.left = -w; - else if (d == 'up') + } + else if (d === 'up') + { opts.cssBefore.top = h; - else if (d == 'down') + } + else if (d === 'down') + { opts.cssBefore.top = -h; + } else + { opts.cssBefore.left = w; + } }); opts.animIn.left = 0; opts.animIn.top = 0; @@ -1444,14 +1671,22 @@ $.fn.cycle.transitions.uncover = function($cont, $slides, opts) { var h = $cont.height(); opts.before.push(function(curr, next, opts) { $.fn.cycle.commonReset(curr,next,opts,true,true,true); - if (d == 'right') + if (d === 'right') + { opts.animOut.left = w; - else if (d == 'up') + } + else if (d === 'up') + { opts.animOut.top = -h; - else if (d == 'down') + } + else if (d === 'down') + { opts.animOut.top = h; + } else + { opts.animOut.left = -w; + } }); opts.animIn.left = 0; opts.animIn.top = 0; @@ -1467,9 +1702,13 @@ $.fn.cycle.transitions.toss = function($cont, $slides, opts) { $.fn.cycle.commonReset(curr,next,opts,true,true,true); // provide default toss settings if animOut not provided if (!opts.animOut.left && !opts.animOut.top) + { $.extend(opts.animOut, { left: w*2, top: -h/2, opacity: 0 }); + } else + { opts.animOut.opacity = 0; + } }); opts.cssBefore.left = 0; opts.cssBefore.top = 0; @@ -1484,13 +1723,21 @@ $.fn.cycle.transitions.wipe = function($cont, $slides, opts) { var clip; if (opts.clip) { if (/l2r/.test(opts.clip)) + { clip = 'rect(0px 0px '+h+'px 0px)'; + } else if (/r2l/.test(opts.clip)) + { clip = 'rect(0px '+w+'px '+h+'px '+w+'px)'; + } else if (/t2b/.test(opts.clip)) + { clip = 'rect(0px '+w+'px 0px 0px)'; + } else if (/b2t/.test(opts.clip)) + { clip = 'rect('+h+'px '+w+'px '+h+'px 0px)'; + } else if (/zoom/.test(opts.clip)) { var top = parseInt(h/2,10); var left = parseInt(w/2,10); @@ -1504,7 +1751,7 @@ $.fn.cycle.transitions.wipe = function($cont, $slides, opts) { var t = parseInt(d[0],10), r = parseInt(d[1],10), b = parseInt(d[2],10), l = parseInt(d[3],10); opts.before.push(function(curr, next, opts) { - if (curr == next) return; + if (curr === next) { return; } var $curr = $(curr), $next = $(next); $.fn.cycle.commonReset(curr,next,opts,true,true,false); opts.cssAfter.display = 'block'; @@ -1516,12 +1763,19 @@ $.fn.cycle.transitions.wipe = function($cont, $slides, opts) { var bb = b < h ? b + parseInt(step * ((h-b)/count || 1),10) : h; var rr = r < w ? r + parseInt(step * ((w-r)/count || 1),10) : w; $next.css({ clip: 'rect('+tt+'px '+rr+'px '+bb+'px '+ll+'px)' }); - (step++ <= count) ? setTimeout(f, 13) : $curr.css('display', 'none'); + if(step++ <= count) + { + setTimeout(f, 13); + } + else + { + $curr.css('display', 'none'); + } })(); }); $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 }); - opts.animIn = { left: 0 }; - opts.animOut = { left: 0 }; + opts.animIn = { left: 0 }; + opts.animOut = { left: 0 }; }; })(jQuery);