|
|
Line 320: |
Line 320: |
| * jQuery Cycle Plugin (with Transition Definitions) | | * jQuery Cycle Plugin (with Transition Definitions) |
| */ | | */ |
- | ;(function($,undefined){"use strict";var ver='2.9999.6';if($.support===undefined){$.support={opacity:!($.browser.msie)}}function debug(s){if($.fn.cycle.debug)log(s)}function log(){if(window.console)if(console.log)console.log('[cycle] '+Array.prototype.join.call(arguments,' '))}$.expr[':'].paused=function(el){return el.cyclePause};$.fn.cycle=function(options,arg2){var o={s:this.selector,c:this.context};if(this.length===0)if(options!='stop'){if(!$.isReady)if(o.s){log('DOM not ready, queuing slideshow');$(function(){$(o.s,o.c).cycle(options,arg2)});return this}log('terminating; zero elements found by selector'+($.isReady?'':' (DOM not ready)'));return this}return this.each(function(){var opts=handleArguments(this,options,arg2);if(opts===false)return;opts.updateActivePagerLink=opts.updateActivePagerLink||$.fn.cycle.updateActivePagerLink;if(this.cycleTimeout)clearTimeout(this.cycleTimeout);this.cycleTimeout=this.cyclePause=0;this.cycleStop=0;var $cont=$(this);var $slides=opts.slideExpr?$(opts.slideExpr,this):$cont.children();var els=$slides.get();if(els.length<2){log('terminating; too few slides: '+els.length);return}var opts2=buildOptions($cont,$slides,els,opts,o);if(opts2===false)return;var startTime=opts2.continuous?10:getTimeout(els[opts2.currSlide],els[opts2.nextSlide],opts2,!opts2.backwards);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)}})};function triggerPause(cont,byHover,onPager){var opts=$(cont).data('cycle.opts');var paused=!!cont.cyclePause;if(paused)if(opts.paused)opts.paused(cont,opts,byHover,onPager);else if(!paused)if(opts.resumed)opts.resumed(cont,opts,byHover,onPager)}function handleArguments(cont,options,arg2){if(cont.cycleStop===undefined)cont.cycleStop=0;if(options===undefined||options===null)options={};if(options.constructor==String){switch(options){case'destroy':case'stop':var opts=$(cont).data('cycle.opts');if(!opts)return false;cont.cycleStop++;if(cont.cycleTimeout)clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0;if(opts.elements)$(opts.elements).stop();$(cont).removeData('cycle.opts');if(options=='destroy')destroy(cont,opts);return false;case'toggle':cont.cyclePause=(cont.cyclePause===1)?0:1;checkInstantResume(cont.cyclePause,arg2,cont);triggerPause(cont);return false;case'pause':cont.cyclePause=1;triggerPause(cont);return false;case'resume':cont.cyclePause=0;checkInstantResume(false,arg2,cont);triggerPause(cont);return false;case'prev':case'next':opts=$(cont).data('cycle.opts');if(!opts){log('options not found, "prev/next" ignored');return false}$.fn.cycle[options](opts);return false;default:options={fx:options}}return options}else if(options.constructor==Number){var num=options;options=$(cont).data('cycle.opts');if(!options){log('options not found, can not advance slide');return false}if(num<0||num>=options.elements.length){log('invalid slide index: '+num);return false}options.nextSlide=num;if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0}if(typeof arg2=='string')options.oneTimeFx=arg2;go(options.elements,options,1,num>=options.currSlide);return false}return options;function checkInstantResume(isPaused,arg2,cont){if(!isPaused)if(arg2===true){var options=$(cont).data('cycle.opts');if(!options){log('options not found, can not resume');return false}if(cont.cycleTimeout){clearTimeout(cont.cycleTimeout);cont.cycleTimeout=0}go(options.elements,options,1,!options.backwards)}}}function removeFilter(el,opts){if(!$.support.opacity)if(opts.cleartype)if(el.style.filter){try{el.style.removeAttribute('filter')}catch(smother){}}}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)opts.destroy(opts)}function buildOptions($cont,$slides,els,options,o){var startingSlideSpecified;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);opts.$cont=$cont;opts.stopCount=cont.cycleStop;opts.elements=els;opts.before=opts.before?[opts.before]:[];opts.after=opts.after?[opts.after]:[];if(!$.support.opacity)if(opts.cleartype)opts.after.push(function(){removeFilter(this,opts)});if(opts.continuous)opts.after.push(function(){go(els,opts,0,!opts.backwards)});saveOriginalOpts(opts);if(!$.support.opacity)if(opts.cleartype)if(!opts.cleartypeNoBg)clearTypeFix($slides);if($cont.css('position')=='static')$cont.css('position','relative');if(opts.width)$cont.width(opts.width);if(opts.height)if(opts.height!='auto')$cont.height(opts.height);if(opts.startingSlide!==undefined){opts.startingSlide=parseInt(opts.startingSlide,10);if(opts.startingSlide>=els.length||opts.startSlide<0)opts.startingSlide=0;else startingSlideSpecified=true}else if(opts.backwards)opts.startingSlide=els.length-1;else opts.startingSlide=0;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){for(var cnt=0;cnt<els.length;cnt++){if(opts.startingSlide==opts.randomMap[cnt]){opts.randomIndex=cnt}}}else{opts.randomIndex=1;opts.startingSlide=opts.randomMap[1]}}else if(opts.startingSlide>=els.length)opts.startingSlide=0;opts.currSlide=opts.startingSlide||0;var first=opts.startingSlide;$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)});$(els[first]).css('opacity',1).show();removeFilter(els[first],opts);if(opts.fit){if(!opts.aspect){if(opts.width)$slides.width(opts.width);if(opts.height)if(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)if($slide.width()!=opts.width){$slide.width(opts.width);$slide.height(opts.width/ratio)}if(opts.height)if($slide.height()<opts.height){$slide.height(opts.height);$slide.width(opts.height*ratio)}})}}if(opts.center)if(((!opts.fit)||opts.aspect)){$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})})}if(opts.center)if(!opts.fit)if(!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})})}var reshape=!(!(opts.containerResize||opts.containerResizeHeight)||$cont.innerHeight());if(reshape){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(opts.containerResize)if(maxw>0)if(maxh>0)$cont.css({width:maxw+'px',height:maxh+'px'});if(opts.containerResizeHeight)if(maxh>0)$cont.css({height:maxh+'px'})}var pauseFlag=false;if(opts.pause)$cont.bind('mouseenter.cycle',function(){pauseFlag=true;this.cyclePause++;triggerPause(cont,true)}).bind('mouseleave.cycle',function(){if(pauseFlag)this.cyclePause--;triggerPause(cont,true)});if(supportMultiTransitions(opts)===false)return false;var requeue=false;options.requeueAttempts=options.requeueAttempts||0;$slides.each(function(){var $el=$(this);this.cycleH=(!(!opts.fit||!opts.height))?opts.height:($el.height()||this.offsetHeight||this.height||$el.attr('height')||0);this.cycleW=(!(!opts.fit||!opts.width))?opts.width:($el.width()||this.offsetWidth||this.width||$el.attr('width')||0);if($el.is('img')){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);if(loadingIE||loadingFF||loadingOp||loadingOther){if(o.s)if(opts.requeueOnImageNotLoaded)if(++options.requeueAttempts<100){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);requeue=true;return false}else{log('could not determine size of image: '+this.src,this.cycleW,this.cycleH)}}}return true});if(requeue)return false;opts.cssBefore=opts.cssBefore||{};opts.cssAfter=opts.cssAfter||{};opts.cssFirst=opts.cssFirst||{};opts.animIn=opts.animIn||{};opts.animOut=opts.animOut||{};$slides.not(':eq('+first+')').css(opts.cssBefore);$($slides[first]).css(opts.cssFirst);if(opts.timeout){opts.timeout=parseInt(opts.timeout,10);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;while((opts.timeout-opts.speed)<buffer)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)opts.randomIndex=0;opts.nextSlide=opts.randomMap[opts.randomIndex]}else if(opts.backwards)opts.nextSlide=opts.startingSlide===0?(els.length-1):opts.startingSlide-1;else opts.nextSlide=opts.startingSlide>=(els.length-1)?0:opts.startingSlide+1;if(!opts.multiFx){var init=$.fn.cycle.transitions[opts.fx];if($.isFunction(init))init($cont,$slides,opts);else if(opts.fx!='custom')if(!opts.multiFx){log('unknown transition: '+opts.fx,'; slideshow terminating');return false}}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)});if(opts.prev)$(opts.prev).bind(opts.prevNextEvent,function(){return advance(opts,0)});if(opts.pager||opts.pagerAnchorBuilder)buildPager(els,opts);exposeAddSlide(opts,els);return opts}function saveOriginalOpts(opts){opts.original={before:[],after:[]};opts.original.cssBefore=$.extend({},opts.cssBefore);opts.original.cssAfter=$.extend({},opts.cssAfter);opts.original.animIn=$.extend({},opts.animIn);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;if(opts.fx.indexOf(',')>0){opts.multiFx=true;opts.fxs=opts.fx.replace(/\s*/g,'').split(',');for(i=0;i<opts.fxs.length;i++){var fx=opts.fxs[i];tx=txs[fx];if(!tx||!txs.hasOwnProperty(fx)||!$.isFunction(tx)){log('discarding unknown transition: ',fx);opts.fxs.splice(i,1);i--}}if(!opts.fxs.length){log('No valid transitions named; slideshow terminating.');return false}}else if(opts.fx=='all'){opts.multiFx=true;opts.fxs=[];for(var p in txs){if(txs.hasOwnProperty(p)){tx=txs[p];if(txs.hasOwnProperty(p))if($.isFunction(tx))opts.fxs.push(p)}}}if(opts.multiFx)if(opts.randomizeEffects){var r1=Math.floor(Math.random()*20)+30;for(i=0;i<r1;i++){var r2=Math.floor(Math.random()*opts.fxs.length);opts.fxs.push(opts.fxs.splice(r2,1)[0])}debug('randomized fx sequence: ',opts.fxs)}return true}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);opts.slideCount=els.length;if(opts.random){opts.randomMap.push(opts.slideCount-1);opts.randomMap.sort(function(a,b){return Math.random()-0.5})}$s.css('position','absolute');$s[prepend?'prependTo':'appendTo'](opts.$cont);if(prepend){opts.currSlide++;opts.nextSlide++}if(!$.support.opacity)if(opts.cleartype)if(!opts.cleartypeNoBg)clearTypeFix($s);if(opts.fit)if(opts.width)$s.width(opts.width);if(opts.fit)if(opts.height)if(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()}}$.fn.cycle.resetState=function(opts,fx){fx=fx||opts.fx;opts.before=[];opts.after=[];opts.cssBefore=$.extend({},opts.original.cssBefore);opts.cssAfter=$.extend({},opts.original.cssAfter);opts.animIn=$.extend({},opts.original.animIn);opts.animOut=$.extend({},opts.original.animOut);opts.fxFn=null;$.each(opts.original.before,function(){opts.before.push(this)});$.each(opts.original.after,function(){opts.after.push(this)});var init=$.fn.cycle.transitions[fx];if($.isFunction(init))init(opts.$cont,$(opts.elements),opts)};function go(els,opts,manual,fwd){var p=opts.$cont[0],curr=els[opts.currSlide],next=els[opts.nextSlide];if(manual)if(opts.busy)if(opts.manualTrump){debug('manualTrump in go(), stopping active transition');$(els).stop(true,true);opts.busy=0;clearTimeout(p.cycleTimeout)}if(opts.busy){debug('transition active, ignoring new tx request');return}if(p.cycleStop!=opts.stopCount||p.cycleTimeout===0)if(!manual)return;if(!manual)if(!p.cyclePause)if(!opts.bounce)if(((opts.autostop)if((--opts.countdown<=0)||!(!opts.nowrap||opts.random||!(opts.nextSlide<opts.currSlide))){if(opts.end)opts.end(opts);return}var changed=false;if((manual||!p.cyclePause))if((opts.nextSlide!=opts.currSlide)){changed=true;var fx=opts.fx;curr.cycleH=curr.cycleH||$(curr).height();curr.cycleW=curr.cycleW||$(curr).width();next.cycleH=next.cycleH||$(next).height();next.cycleW=next.cycleW||$(next).width();if(opts.multiFx){if(fwd)if((opts.lastFx===undefined||++opts.lastFx>=opts.fxs.length))opts.lastFx=0;else if(!fwd)if((opts.lastFx===undefined||--opts.lastFx<0))opts.lastFx=opts.fxs.length-1;fx=opts.fxs[opts.lastFx]}if(opts.oneTimeFx){fx=opts.oneTimeFx;opts.oneTimeFx=null}$.fn.cycle.resetState(opts,fx);if(opts.before.length)$.each(opts.before,function(i,o){if(p.cycleStop!=opts.stopCount)return;o.apply(next,[curr,next,opts,fwd])});var after=function(){opts.busy=0;$.each(opts.after,function(i,o){if(p.cycleStop!=opts.stopCount)return;o.apply(next,[curr,next,opts,fwd])});if(!p.cycleStop){queueNext()}};debug('tx firing('+fx+'); currSlide: '+opts.currSlide+'; nextSlide: '+opts.nextSlide);opts.busy=1;if(opts.fxFn)opts.fxFn(curr,next,opts,after,fwd,!(!manual||!opts.fastOnEvent));else if($.isFunction($.fn.cycle[opts.fx]))$.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){var roll;opts.lastSlide=opts.currSlide;if(opts.random){opts.currSlide=opts.nextSlide;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}else if(opts.backwards){roll=(opts.nextSlide-1)<0;if(roll)if(opts.bounce){opts.backwards=!opts.backwards;opts.nextSlide=1;opts.currSlide=0}else{opts.nextSlide=roll?(els.length-1):opts.nextSlide-1;opts.currSlide=roll?0:opts.nextSlide+1}}else{roll=(opts.nextSlide+1)==els.length;if(roll)if(opts.bounce){opts.backwards=!opts.backwards;opts.nextSlide=els.length-2;opts.currSlide=els.length-1}else{opts.nextSlide=roll?0:opts.nextSlide+1;opts.currSlide=roll?els.length-1:opts.nextSlide-1}}}if(changed)if(opts.pager)opts.updateActivePagerLink(opts.pager,opts.currSlide,opts.activePagerClass);function queueNext(){var ms=0,timeout=opts.timeout;if(opts.timeout)if(!opts.continuous){ms=getTimeout(els[opts.currSlide],els[opts.nextSlide],opts,fwd);if(opts.fx=='shuffle')ms-=opts.speedOut}else if(opts.continuous)if(p.cyclePause)ms=10;if(ms>0)p.cycleTimeout=setTimeout(function(){go(els,opts,0,!opts.backwards)},ms)}}$.fn.cycle.updateActivePagerLink=function(pager,currSlide,clsName){$(pager).each(function(){$(this).children().removeClass(clsName).eq(currSlide).addClass(clsName)})};function getTimeout(curr,next,opts,fwd){if(opts.timeoutFn){var t=opts.timeoutFn.call(curr,curr,next,opts,fwd);while(!(!(opts.fx!='none')||!((t-opts.speed)<250)))t+=opts.speed;debug('calculated timeout: '+t+'; speed: '+opts.speed);if(t!==false)return t}return opts.timeout}$.fn.cycle.next=function(opts){advance(opts,1)};$.fn.cycle.prev=function(opts){advance(opts,0)};function advance(opts,moveForward){var val=moveForward?1:-1;var els=opts.elements;var p=opts.$cont[0],timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0}if(opts.random)if(val<0){opts.randomIndex--;if(--opts.randomIndex==-2)opts.randomIndex=els.length-2;else if(opts.randomIndex==-1)opts.randomIndex=els.length-1;opts.nextSlide=opts.randomMap[opts.randomIndex]}else if(opts.random){opts.nextSlide=opts.randomMap[opts.randomIndex]}else{opts.nextSlide=opts.currSlide+val;if(opts.nextSlide<0){if(opts.nowrap)return false;opts.nextSlide=els.length-1}else if(opts.nextSlide>=els.length){if(opts.nowrap)return false;opts.nextSlide=0}}var cb=opts.onPrevNextEvent||opts.prevNextClick;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);$.each(els,function(i,o){$.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;if($.isFunction(opts.pagerAnchorBuilder)){a=opts.pagerAnchorBuilder(i,el);debug('pagerAnchorBuilder('+i+', el) returned: '+a)}else a='<a href="#">'+(i+1)+'</a>';if(!a)return;var $a=$(a);if($a.parents('body').length===0){var arr=[];if($p.length>1){$p.each(function(){var $clone=$a.clone(true);$(this).append($clone);arr.push($clone[0])});$a=$(arr)}else{$a.appendTo($p)}}opts.pagerAnchors=opts.pagerAnchors||[];opts.pagerAnchors.push($a);var pagerFn=function(e){e.preventDefault();opts.nextSlide=i;var p=opts.$cont[0],timeout=p.cycleTimeout;if(timeout){clearTimeout(timeout);p.cycleTimeout=0}var cb=opts.onPagerEvent||opts.pagerClick;if($.isFunction(cb))cb(opts.nextSlide,els[opts.nextSlide]);go(els,opts,1,opts.currSlide<i)};if(/mouseenter|mouseover/i.test(opts.pagerEvent)){$a.hover(pagerFn,function(){})}else{$a.bind(opts.pagerEvent,pagerFn)}if(!/^click/.test(opts.pagerEvent))if(!opts.allowPagerClickBubble)$a.bind('click.cycle',function(){return false});var cont=opts.$cont[0];var pauseFlag=false;if(opts.pauseOnPagerHover){$a.hover(function(){pauseFlag=true;cont.cyclePause++;triggerPause(cont,true,true)},function(){if(pauseFlag)cont.cyclePause--;triggerPause(cont,true,true)})}};$.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};function clearTypeFix($slides){debug('applying clearType background-color hack');function hex(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){var v=$.css(e,'background-color');if(v)if(v.indexOf('rgb')>=0){var rgb=v.match(/\d+/g);return'#'+hex(rgb[0])+hex(rgb[1])+hex(rgb[2])}if(v)if(v!='transparent')return v}return'#ffffff'}$slides.each(function(){$(this).css('background-color',getBg(this))})}$.fn.cycle.commonReset=function(curr,next,opts,w,h,rev){$(opts.elements).not(curr).hide();if(typeof opts.cssBefore.opacity=='undefined')opts.cssBefore.opacity=1;opts.cssBefore.display='block';if(opts.slideResize)if(w!==false)if(next.cycleW>0)opts.cssBefore.width=next.cycleW;if(opts.slideResize)if(h!==false)if(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));$(next).css('zIndex',opts.slideCount+(rev===true?0:1))};$.fn.cycle.custom=function(curr,next,opts,cb,fwd,speedOverride){var $l=$(curr),$n=$(next);var speedIn=opts.speedIn,speedOut=opts.speedOut,easeIn=opts.easeIn,easeOut=opts.easeOut;$n.css(opts.cssBefore);if(speedOverride){if(typeof speedOverride=='number')speedIn=speedOut=speedOverride;else speedIn=speedOut=1;easeIn=easeOut=null}var fn=function(){$n.animate(opts.animIn,speedIn,easeIn,function(){cb()})};$l.animate(opts.animOut,speedOut,easeOut,function(){$l.css(opts.cssAfter);if(!opts.sync)fn()});if(opts.sync)fn()};$.fn.cycle.transitions={fade:function($cont,$slides,opts){$slides.not(':eq('+opts.currSlide+')').css('opacity',0);opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);opts.cssBefore.opacity=0});opts.animIn={opacity:1};opts.animOut={opacity:0};opts.cssBefore={top:0,left:0}}};$.fn.cycle.ver=function(){return ver};$.fn.cycle.defaults={activePagerClass:'activeSlide',after:null,allowPagerClickBubble:false,animIn:null,animOut:null,aspect:false,autostop:0,autostopCount:0,backwards:false,before:null,center:null,cleartype:!$.support.opacity,cleartypeNoBg:false,containerResize:1,containerResizeHeight:0,continuous:0,cssAfter:null,cssBefore:null,delay:0,easeIn:null,easeOut:null,easing:null,end:null,fastOnEvent:0,fit:0,fx:'fade',fxFn:null,height:'auto',manualTrump:true,metaAttr:'cycle',next:null,nowrap:0,onPagerEvent:null,onPrevNextEvent:null,pager:null,pagerAnchorBuilder:null,pagerEvent:'click.cycle',pause:0,pauseOnPagerHover:0,prev:null,prevNextEvent:'click.cycle',random:0,randomizeEffects:1,requeueOnImageNotLoaded:true,requeueTimeout:250,rev:0,shuffle:null,skipInitializationCallbacks:false,slideExpr:null,slideResize:1,speed:1000,speedIn:null,speedOut:null,startingSlide:undefined,sync:1,timeout:4000,timeoutFn:null,updateActivePagerLink:null,width:null}})(jQuery);(function($){"use strict";$.fn.cycle.transitions.none=function($cont,$slides,opts){opts.fxFn=function(curr,next,opts,after){$(next).show();$(curr).hide();after()}};$.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))});opts.animIn.opacity=1;opts.animOut.opacity=0;opts.cssBefore.opacity=1;opts.cssBefore.display='block';opts.cssAfter.zIndex=0};$.fn.cycle.transitions.scrollUp=function($cont,$slides,opts){$cont.css('overflow','hidden');opts.before.push($.fn.cycle.commonReset);var h=$cont.height();opts.cssBefore.top=h;opts.cssBefore.left=0;opts.cssFirst.top=0;opts.animIn.top=0;opts.animOut.top=-h};$.fn.cycle.transitions.scrollDown=function($cont,$slides,opts){$cont.css('overflow','hidden');opts.before.push($.fn.cycle.commonReset);var h=$cont.height();opts.cssFirst.top=0;opts.cssBefore.top=-h;opts.cssBefore.left=0;opts.animIn.top=0;opts.animOut.top=h};$.fn.cycle.transitions.scrollLeft=function($cont,$slides,opts){$cont.css('overflow','hidden');opts.before.push($.fn.cycle.commonReset);var w=$cont.width();opts.cssFirst.left=0;opts.cssBefore.left=w;opts.cssBefore.top=0;opts.animIn.left=0;opts.animOut.left=0-w};$.fn.cycle.transitions.scrollRight=function($cont,$slides,opts){$cont.css('overflow','hidden');opts.before.push($.fn.cycle.commonReset);var w=$cont.width();opts.cssFirst.left=0;opts.cssBefore.left=-w;opts.cssBefore.top=0;opts.animIn.left=0;opts.animOut.left=w};$.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});opts.cssFirst.left=0;opts.cssBefore.top=0;opts.animIn.left=0;opts.animOut.top=0};$.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});opts.cssFirst.top=0;opts.cssBefore.left=0;opts.animIn.top=0;opts.animOut.left=0};$.fn.cycle.transitions.slideX=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$(opts.elements).not(curr).hide();$.fn.cycle.commonReset(curr,next,opts,false,true);opts.animIn.width=next.cycleW});opts.cssBefore.left=0;opts.cssBefore.top=0;opts.cssBefore.width=0;opts.animIn.width='show';opts.animOut.width=0};$.fn.cycle.transitions.slideY=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$(opts.elements).not(curr).hide();$.fn.cycle.commonReset(curr,next,opts,true,false);opts.animIn.height=next.cycleH});opts.cssBefore.left=0;opts.cssBefore.top=0;opts.cssBefore.height=0;opts.animIn.height='show';opts.animOut.height=0};$.fn.cycle.transitions.shuffle=function($cont,$slides,opts){var i,w=$cont.css('overflow','visible').width();$slides.css({left:0,top:0});opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,true,true)});if(!opts.speedAdjusted){opts.speed=opts.speed/2;opts.speedAdjusted=true}opts.random=0;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());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++){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');$el.css('z-index',parseInt(z,10)+1+count)}$el.animate({left:0,top:0},opts.speedOut,opts.easeOut,function(){$(fwd?this:curr).hide();if(cb)cb()})})};$.extend(opts.cssBefore,{display:'block',opacity:1,top:0,left:0})};$.fn.cycle.transitions.turnUp=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,false);opts.cssBefore.top=next.cycleH;opts.animIn.height=next.cycleH;opts.animOut.width=next.cycleW});opts.cssFirst.top=0;opts.cssBefore.left=0;opts.cssBefore.height=0;opts.animIn.top=0;opts.animOut.height=0};$.fn.cycle.transitions.turnDown=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,false);opts.animIn.height=next.cycleH;opts.animOut.top=curr.cycleH});opts.cssFirst.top=0;opts.cssBefore.left=0;opts.cssBefore.top=0;opts.cssBefore.height=0;opts.animOut.height=0};$.fn.cycle.transitions.turnLeft=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,false,true);opts.cssBefore.left=next.cycleW;opts.animIn.width=next.cycleW});opts.cssBefore.top=0;opts.cssBefore.width=0;opts.animIn.left=0;opts.animOut.width=0};$.fn.cycle.transitions.turnRight=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,false,true);opts.animIn.width=next.cycleW;opts.animOut.left=curr.cycleW});$.extend(opts.cssBefore,{top:0,left:0,width:0});opts.animIn.left=0;opts.animOut.width=0};$.fn.cycle.transitions.zoom=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,false,false,true);opts.cssBefore.top=next.cycleH/2;opts.cssBefore.left=next.cycleW/2;$.extend(opts.animIn,{top:0,left:0,width:next.cycleW,height:next.cycleH});$.extend(opts.animOut,{width:0,height:0,top:curr.cycleH/2,left:curr.cycleW/2})});opts.cssFirst.top=0;opts.cssFirst.left=0;opts.cssBefore.width=0;opts.cssBefore.height=0};$.fn.cycle.transitions.fadeZoom=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,false,false);opts.cssBefore.left=next.cycleW/2;opts.cssBefore.top=next.cycleH/2;$.extend(opts.animIn,{top:0,left:0,width:next.cycleW,height:next.cycleH})});opts.cssBefore.width=0;opts.cssBefore.height=0;opts.animOut.opacity=0};$.fn.cycle.transitions.blindX=function($cont,$slides,opts){var w=$cont.css('overflow','hidden').width();opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);opts.animIn.width=next.cycleW;opts.animOut.left=curr.cycleW});opts.cssBefore.left=w;opts.cssBefore.top=0;opts.animIn.left=0;opts.animOut.left=w};$.fn.cycle.transitions.blindY=function($cont,$slides,opts){var h=$cont.css('overflow','hidden').height();opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);opts.animIn.height=next.cycleH;opts.animOut.top=curr.cycleH});opts.cssBefore.top=h;opts.cssBefore.left=0;opts.animIn.top=0;opts.animOut.top=h};$.fn.cycle.transitions.blindZ=function($cont,$slides,opts){var h=$cont.css('overflow','hidden').height();var w=$cont.width();opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);opts.animIn.height=next.cycleH;opts.animOut.top=curr.cycleH});opts.cssBefore.top=h;opts.cssBefore.left=w;opts.animIn.top=0;opts.animIn.left=0;opts.animOut.top=h;opts.animOut.left=w};$.fn.cycle.transitions.growX=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,false,true);opts.cssBefore.left=this.cycleW/2;opts.animIn.left=0;opts.animIn.width=this.cycleW;opts.animOut.left=0});opts.cssBefore.top=0;opts.cssBefore.width=0};$.fn.cycle.transitions.growY=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,false);opts.cssBefore.top=this.cycleH/2;opts.animIn.top=0;opts.animIn.height=this.cycleH;opts.animOut.top=0});opts.cssBefore.height=0;opts.cssBefore.left=0};$.fn.cycle.transitions.curtainX=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,false,true,true);opts.cssBefore.left=next.cycleW/2;opts.animIn.left=0;opts.animIn.width=this.cycleW;opts.animOut.left=curr.cycleW/2;opts.animOut.width=0});opts.cssBefore.top=0;opts.cssBefore.width=0};$.fn.cycle.transitions.curtainY=function($cont,$slides,opts){opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,false,true);opts.cssBefore.top=next.cycleH/2;opts.animIn.top=0;opts.animIn.height=next.cycleH;opts.animOut.top=curr.cycleH/2;opts.animOut.height=0});opts.cssBefore.height=0;opts.cssBefore.left=0};$.fn.cycle.transitions.cover=function($cont,$slides,opts){var d=opts.direction||'left';var w=$cont.css('overflow','hidden').width();var h=$cont.height();opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts);if(d=='right')opts.cssBefore.left=-w;else if(d=='up')opts.cssBefore.top=h;else if(d=='down')opts.cssBefore.top=-h;else opts.cssBefore.left=w});opts.animIn.left=0;opts.animIn.top=0;opts.cssBefore.top=0;opts.cssBefore.left=0};$.fn.cycle.transitions.uncover=function($cont,$slides,opts){var d=opts.direction||'left';var w=$cont.css('overflow','hidden').width();var h=$cont.height();opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,true,true);if(d=='right')opts.animOut.left=w;else if(d=='up')opts.animOut.top=-h;else if(d=='down')opts.animOut.top=h;else opts.animOut.left=-w});opts.animIn.left=0;opts.animIn.top=0;opts.cssBefore.top=0;opts.cssBefore.left=0};$.fn.cycle.transitions.toss=function($cont,$slides,opts){var w=$cont.css('overflow','visible').width();var h=$cont.height();opts.before.push(function(curr,next,opts){$.fn.cycle.commonReset(curr,next,opts,true,true,true);if(!opts.animOut.left)if(!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;opts.animIn.left=0};$.fn.cycle.transitions.wipe=function($cont,$slides,opts){var w=$cont.css('overflow','hidden').width();var h=$cont.height();opts.cssBefore=opts.cssBefore||{};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);clip='rect('+top+'px '+left+'px '+top+'px '+left+'px)'}}opts.cssBefore.clip=opts.cssBefore.clip||clip||'rect(0px 0px 0px 0px)';var d=opts.cssBefore.clip.match(/(\d+)/g);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;var $curr=$(curr),$next=$(next);$.fn.cycle.commonReset(curr,next,opts,true,true,false);opts.cssAfter.display='block';var step=1,count=parseInt((opts.speedIn/13),10)-1;(function f(){var tt=t?t-parseInt(step*(t/count),10):0;var ll=l?l-parseInt(step*(l/count),10):0;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')})()});$.extend(opts.cssBefore,{display:'block',opacity:1,top:0,left:0});opts.animIn={left:0};opts.animOut={left:0}}})(jQuery);
| + | /*! |
| + | * jQuery Cycle Plugin (with Transition Definitions) |
| + | * Examples and documentation at: http://jquery.malsup.com/cycle/ |
| + | * Copyright (c) 2007-2010 M. Alsup |
| + | * Version: 2.9999.6 (11-SEP-2012) |
| + | * Dual licensed under the MIT and GPL licenses. |
| + | * http://jquery.malsup.com/license.html |
| + | * Requires: jQuery v1.3.2 or later |
| + | */ |
| + | ;(function($, undefined) { |
| + | "use strict"; |
| + | |
| + | var ver = '2.9999.6'; |
| + | |
| + | // if $.support is not defined (pre jQuery 1.3) add what I need |
| + | if ($.support === undefined) { |
| + | $.support = { |
| + | opacity: !($.browser.msie) |
| + | }; |
| + | } |
| + | |
| + | function debug(s) { |
| + | if ($.fn.cycle.debug) |
| + | log(s); |
| + | } |
| + | function log() { |
| + | if (window.console) if (console.log) |
| + | console.log('[cycle] ' + Array.prototype.join.call(arguments,' ')); |
| + | } |
| + | $.expr[':'].paused = function(el) { |
| + | return el.cyclePause; |
| + | }; |
| + | |
| + | |
| + | // 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 |
| + | // |
| + | // 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) |
| + | |
| + | $.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) if (options != 'stop') { |
| + | if (!$.isReady) if (o.s) { |
| + | log('DOM not ready, queuing slideshow'); |
| + | $(function() { |
| + | $(o.s,o.c).cycle(options,arg2); |
| + | }); |
| + | return this; |
| + | } |
| + | // is your DOM ready? http://docs.jquery.com/Tutorials:Introducing_$(document).ready() |
| + | log('terminating; zero elements found by selector' + ($.isReady ? '' : ' (DOM not ready)')); |
| + | return this; |
| + | } |
| + | |
| + | // iterate the matched nodeset |
| + | 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; |
| + | this.cycleStop = 0; // issue #108 |
| + | |
| + | var $cont = $(this); |
| + | var $slides = opts.slideExpr ? $(opts.slideExpr, this) : $cont.children(); |
| + | var els = $slides.get(); |
| + | |
| + | if (els.length < 2) { |
| + | log('terminating; too few slides: ' + els.length); |
| + | return; |
| + | } |
| + | |
| + | var opts2 = buildOptions($cont, $slides, els, opts, o); |
| + | if (opts2 === false) |
| + | return; |
| + | |
| + | var startTime = opts2.continuous ? 10 : getTimeout(els[opts2.currSlide], els[opts2.nextSlide], opts2, !opts2.backwards); |
| + | |
| + | // if it's an auto slideshow, kick it off |
| + | 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); |
| + | } |
| + | }); |
| + | }; |
| + | |
| + | function triggerPause(cont, byHover, onPager) { |
| + | var opts = $(cont).data('cycle.opts'); |
| + | var paused = !!cont.cyclePause; |
| + | if (paused) if (opts.paused) |
| + | opts.paused(cont, opts, byHover, onPager); |
| + | else if (!paused) if (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) |
| + | cont.cycleStop = 0; |
| + | if (options === undefined || options === null) |
| + | options = {}; |
| + | 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; |
| + | if (opts.elements) |
| + | $(opts.elements).stop(); |
| + | $(cont).removeData('cycle.opts'); |
| + | if (options == 'destroy') |
| + | destroy(cont, opts); |
| + | return false; |
| + | case 'toggle': |
| + | cont.cyclePause = (cont.cyclePause === 1) ? 0 : 1; |
| + | checkInstantResume(cont.cyclePause, arg2, cont); |
| + | triggerPause(cont); |
| + | return false; |
| + | case 'pause': |
| + | cont.cyclePause = 1; |
| + | triggerPause(cont); |
| + | return false; |
| + | case 'resume': |
| + | cont.cyclePause = 0; |
| + | checkInstantResume(false, arg2, cont); |
| + | triggerPause(cont); |
| + | return false; |
| + | case 'prev': |
| + | case 'next': |
| + | opts = $(cont).data('cycle.opts'); |
| + | if (!opts) { |
| + | log('options not found, "prev/next" ignored'); |
| + | return false; |
| + | } |
| + | $.fn.cycle[options](opts); |
| + | return false; |
| + | default: |
| + | options = { fx: options }; |
| + | } |
| + | return options; |
| + | } |
| + | else if (options.constructor == Number) { |
| + | // go to the requested slide |
| + | var num = options; |
| + | options = $(cont).data('cycle.opts'); |
| + | if (!options) { |
| + | log('options not found, can not advance slide'); |
| + | return false; |
| + | } |
| + | if (num < 0 || num >= options.elements.length) { |
| + | log('invalid slide index: ' + num); |
| + | return false; |
| + | } |
| + | options.nextSlide = num; |
| + | if (cont.cycleTimeout) { |
| + | clearTimeout(cont.cycleTimeout); |
| + | cont.cycleTimeout = 0; |
| + | } |
| + | if (typeof arg2 == 'string') |
| + | options.oneTimeFx = arg2; |
| + | go(options.elements, options, 1, num >= options.currSlide); |
| + | return false; |
| + | } |
| + | return options; |
| + | |
| + | function checkInstantResume(isPaused, arg2, cont) { |
| + | if (!isPaused) if (arg2 === true) { // resume now! |
| + | var options = $(cont).data('cycle.opts'); |
| + | if (!options) { |
| + | log('options not found, can not resume'); |
| + | return false; |
| + | } |
| + | if (cont.cycleTimeout) { |
| + | clearTimeout(cont.cycleTimeout); |
| + | cont.cycleTimeout = 0; |
| + | } |
| + | go(options.elements, options, 1, !options.backwards); |
| + | } |
| + | } |
| + | } |
| + | |
| + | function removeFilter(el, opts) { |
| + | if (!$.support.opacity) if (opts.cleartype) if (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) { |
| + | var startingSlideSpecified; |
| + | // support metadata plugin (v1.0 and v2.0) |
| + | 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); |
| + | opts.$cont = $cont; |
| + | opts.stopCount = cont.cycleStop; |
| + | opts.elements = els; |
| + | opts.before = opts.before ? [opts.before] : []; |
| + | opts.after = opts.after ? [opts.after] : []; |
| + | |
| + | // push some after callbacks |
| + | if (!$.support.opacity) if (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) if (opts.cleartype) if (!opts.cleartypeNoBg) |
| + | clearTypeFix($slides); |
| + | |
| + | // container requires non-static position so that slides can be position within |
| + | if ($cont.css('position') == 'static') |
| + | $cont.css('position', 'relative'); |
| + | if (opts.width) |
| + | $cont.width(opts.width); |
| + | if (opts.height) if (opts.height != 'auto') |
| + | $cont.height(opts.height); |
| + | |
| + | 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] ) { |
| + | opts.randomIndex = cnt; |
| + | } |
| + | } |
| + | } |
| + | else { |
| + | opts.randomIndex = 1; |
| + | opts.startingSlide = opts.randomMap[1]; |
| + | } |
| + | } |
| + | else if (opts.startingSlide >= els.length) |
| + | opts.startingSlide = 0; // catch bogus input |
| + | opts.currSlide = opts.startingSlide || 0; |
| + | var first = opts.startingSlide; |
| + | |
| + | // set position and zIndex on all the slides |
| + | $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); |
| + | }); |
| + | |
| + | // make sure first slide is visible |
| + | $(els[first]).css('opacity',1).show(); // opacity bit needed to handle restart use case |
| + | removeFilter(els[first], opts); |
| + | |
| + | // stretch slides |
| + | if (opts.fit) { |
| + | if (!opts.aspect) { |
| + | if (opts.width) |
| + | $slides.width(opts.width); |
| + | if (opts.height) if (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) if ($slide.width() != opts.width ) { |
| + | $slide.width( opts.width ); |
| + | $slide.height( opts.width / ratio ); |
| + | } |
| + | |
| + | if ( opts.height) if ($slide.height() < opts.height ) { |
| + | $slide.height( opts.height ); |
| + | $slide.width( opts.height * ratio ); |
| + | } |
| + | }); |
| + | } |
| + | } |
| + | |
| + | if (opts.center) if (((!opts.fit) || opts.aspect)) { |
| + | $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 |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | if (opts.center) if (!opts.fit) if (!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 |
| + | }); |
| + | }); |
| + | } |
| + | |
| + | // stretch container |
| + | var reshape = !(!(opts.containerResize || opts.containerResizeHeight) || $cont.innerHeight()); |
| + | if (reshape) { // do this only if container has no size http://tinyurl.com/da2oa9 |
| + | 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 (opts.containerResize) if (maxw > 0) if (maxh > 0) |
| + | $cont.css({width:maxw+'px',height:maxh+'px'}); |
| + | if (opts.containerResizeHeight) if (maxh > 0) |
| + | $cont.css({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(){ |
| + | if (pauseFlag) |
| + | 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. |
| + | var requeue = false; |
| + | options.requeueAttempts = options.requeueAttempts || 0; |
| + | $slides.each(function() { |
| + | // try to get height/width of each slide |
| + | var $el = $(this); |
| + | this.cycleH = (!(!opts.fit || !opts.height)) ? opts.height : ($el.height() || this.offsetHeight || this.height || $el.attr('height') || 0); |
| + | this.cycleW = (!(!opts.fit || !opts.width)) ? opts.width : ($el.width() || this.offsetWidth || this.width || $el.attr('width') || 0); |
| + | |
| + | if ( $el.is('img') ) { |
| + | // 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); |
| + | // don't requeue for images that are still loading but have a valid size |
| + | if (loadingIE || loadingFF || loadingOp || loadingOther) { |
| + | if (o.s) if (opts.requeueOnImageNotLoaded) if (++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); |
| + | requeue = true; |
| + | return false; // break each loop |
| + | } |
| + | else { |
| + | log('could not determine size of image: '+this.src, this.cycleW, this.cycleH); |
| + | } |
| + | } |
| + | } |
| + | return true; |
| + | }); |
| + | |
| + | if (requeue) |
| + | return false; |
| + | |
| + | opts.cssBefore = opts.cssBefore || {}; |
| + | opts.cssAfter = opts.cssAfter || {}; |
| + | opts.cssFirst = opts.cssFirst || {}; |
| + | opts.animIn = opts.animIn || {}; |
| + | opts.animOut = opts.animOut || {}; |
| + | |
| + | $slides.not(':eq('+first+')').css(opts.cssBefore); |
| + | $($slides[first]).css(opts.cssFirst); |
| + | |
| + | if (opts.timeout) { |
| + | opts.timeout = parseInt(opts.timeout,10); |
| + | // ensure that timeout and speed settings are sane |
| + | 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; |
| + | 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) |
| + | opts.randomIndex = 0; |
| + | opts.nextSlide = opts.randomMap[opts.randomIndex]; |
| + | } |
| + | else if (opts.backwards) |
| + | 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') if (!opts.multiFx) { |
| + | log('unknown transition: ' + opts.fx,'; slideshow terminating'); |
| + | return false; |
| + | } |
| + | } |
| + | |
| + | // fire artificial events |
| + | 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);}); |
| + | if (opts.prev) |
| + | $(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) { |
| + | opts.original = { before: [], after: [] }; |
| + | opts.original.cssBefore = $.extend({}, opts.cssBefore); |
| + | opts.original.cssAfter = $.extend({}, opts.cssAfter); |
| + | opts.original.animIn = $.extend({}, opts.animIn); |
| + | 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; |
| + | // look for multiple effects |
| + | if (opts.fx.indexOf(',') > 0) { |
| + | opts.multiFx = true; |
| + | opts.fxs = opts.fx.replace(/\s*/g,'').split(','); |
| + | // discard any bogus effect names |
| + | for (i=0; i < opts.fxs.length; i++) { |
| + | var fx = opts.fxs[i]; |
| + | tx = txs[fx]; |
| + | if (!tx || !txs.hasOwnProperty(fx) || !$.isFunction(tx)) { |
| + | log('discarding unknown transition: ',fx); |
| + | opts.fxs.splice(i,1); |
| + | i--; |
| + | } |
| + | } |
| + | // if we have an empty list then we threw everything away! |
| + | if (!opts.fxs.length) { |
| + | log('No valid transitions named; slideshow terminating.'); |
| + | return false; |
| + | } |
| + | } |
| + | else if (opts.fx == 'all') { // auto-gen the list of transitions |
| + | opts.multiFx = true; |
| + | opts.fxs = []; |
| + | for (var p in txs) { |
| + | if (txs.hasOwnProperty(p)) { |
| + | tx = txs[p]; |
| + | if (txs.hasOwnProperty(p)) if ($.isFunction(tx)) |
| + | opts.fxs.push(p); |
| + | } |
| + | } |
| + | } |
| + | if (opts.multiFx) if (opts.randomizeEffects) { |
| + | // munge the fxs array to make effect selection random |
| + | var r1 = Math.floor(Math.random() * 20) + 30; |
| + | for (i = 0; i < r1; i++) { |
| + | var r2 = Math.floor(Math.random() * opts.fxs.length); |
| + | opts.fxs.push(opts.fxs.splice(r2,1)[0]); |
| + | } |
| + | 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 |
| + | if (opts.random) { |
| + | opts.randomMap.push(opts.slideCount-1); |
| + | opts.randomMap.sort(function(a,b) {return Math.random() - 0.5;}); |
| + | } |
| + | |
| + | $s.css('position','absolute'); |
| + | $s[prepend?'prependTo':'appendTo'](opts.$cont); |
| + | |
| + | if (prepend) { |
| + | opts.currSlide++; |
| + | opts.nextSlide++; |
| + | } |
| + | |
| + | if (!$.support.opacity) if (opts.cleartype) if (!opts.cleartypeNoBg) |
| + | clearTypeFix($s); |
| + | |
| + | if (opts.fit) if (opts.width) |
| + | $s.width(opts.width); |
| + | if (opts.fit) if (opts.height) if (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 |
| + | }; |
| + | } |
| + | |
| + | // reset internal state; we do this on every pass in order to support multiple effects |
| + | $.fn.cycle.resetState = function(opts, fx) { |
| + | fx = fx || opts.fx; |
| + | opts.before = []; opts.after = []; |
| + | opts.cssBefore = $.extend({}, opts.original.cssBefore); |
| + | opts.cssAfter = $.extend({}, opts.original.cssAfter); |
| + | opts.animIn = $.extend({}, opts.original.animIn); |
| + | opts.animOut = $.extend({}, opts.original.animOut); |
| + | opts.fxFn = null; |
| + | $.each(opts.original.before, function() { opts.before.push(this); }); |
| + | $.each(opts.original.after, function() { opts.after.push(this); }); |
| + | |
| + | // 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 |
| + | function go(els, opts, manual, fwd) { |
| + | var p = opts.$cont[0], curr = els[opts.currSlide], next = els[opts.nextSlide]; |
| + | |
| + | // opts.busy is true if we're in the middle of an animation |
| + | if (manual) if (opts.busy) if (opts.manualTrump) { |
| + | // let manual transitions requests trump active ones |
| + | debug('manualTrump in go(), stopping active transition'); |
| + | $(els).stop(true,true); |
| + | opts.busy = 0; |
| + | clearTimeout(p.cycleTimeout); |
| + | } |
| + | |
| + | // don't begin another timeout-based transition if there is one active |
| + | if (opts.busy) { |
| + | debug('transition active, ignoring new tx request'); |
| + | return; |
| + | } |
| + | |
| + | |
| + | // stop cycling if we have an outstanding stop request |
| + | if (p.cycleStop != opts.stopCount || p.cycleTimeout === 0) if (!manual) |
| + | return; |
| + | |
| + | // check to see if we should stop cycling based on autostop options |
| + | if (!manual) if (!p.cyclePause) if (!opts.bounce) if (((opts.autostop) if ((--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)) if ((opts.nextSlide != opts.currSlide)) { |
| + | changed = true; |
| + | var fx = opts.fx; |
| + | // keep trying to get the slide size if we don't have it yet |
| + | curr.cycleH = curr.cycleH || $(curr).height(); |
| + | curr.cycleW = curr.cycleW || $(curr).width(); |
| + | next.cycleH = next.cycleH || $(next).height(); |
| + | next.cycleW = next.cycleW || $(next).width(); |
| + | |
| + | // support multiple transition types |
| + | if (opts.multiFx) { |
| + | if (fwd) if ((opts.lastFx === undefined || ++opts.lastFx >= opts.fxs.length)) |
| + | opts.lastFx = 0; |
| + | else if (!fwd) if ((opts.lastFx === undefined || --opts.lastFx < 0)) |
| + | opts.lastFx = opts.fxs.length - 1; |
| + | fx = opts.fxs[opts.lastFx]; |
| + | } |
| + | |
| + | // one-time fx overrides apply to: $('div').cycle(3,'zoom'); |
| + | if (opts.oneTimeFx) { |
| + | fx = opts.oneTimeFx; |
| + | opts.oneTimeFx = null; |
| + | } |
| + | |
| + | $.fn.cycle.resetState(opts, fx); |
| + | |
| + | // run the before callbacks |
| + | if (opts.before.length) |
| + | $.each(opts.before, function(i,o) { |
| + | 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; |
| + | o.apply(next, [curr, next, opts, fwd]); |
| + | }); |
| + | if (!p.cycleStop) { |
| + | // queue next transition |
| + | queueNext(); |
| + | } |
| + | }; |
| + | |
| + | debug('tx firing('+fx+'); currSlide: ' + opts.currSlide + '; nextSlide: ' + opts.nextSlide); |
| + | |
| + | // 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) { |
| + | // calculate the next slide |
| + | var roll; |
| + | opts.lastSlide = opts.currSlide; |
| + | if (opts.random) { |
| + | opts.currSlide = opts.nextSlide; |
| + | 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; |
| + | } |
| + | else if (opts.backwards) { |
| + | roll = (opts.nextSlide - 1) < 0; |
| + | if (roll) if (opts.bounce) { |
| + | opts.backwards = !opts.backwards; |
| + | opts.nextSlide = 1; |
| + | opts.currSlide = 0; |
| + | } |
| + | else { |
| + | opts.nextSlide = roll ? (els.length-1) : opts.nextSlide-1; |
| + | opts.currSlide = roll ? 0 : opts.nextSlide+1; |
| + | } |
| + | } |
| + | else { // sequence |
| + | roll = (opts.nextSlide + 1) == els.length; |
| + | if (roll) if (opts.bounce) { |
| + | opts.backwards = !opts.backwards; |
| + | opts.nextSlide = els.length-2; |
| + | opts.currSlide = els.length-1; |
| + | } |
| + | else { |
| + | opts.nextSlide = roll ? 0 : opts.nextSlide+1; |
| + | opts.currSlide = roll ? els.length-1 : opts.nextSlide-1; |
| + | } |
| + | } |
| + | } |
| + | if (changed) if (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) if (!opts.continuous) { |
| + | ms = getTimeout(els[opts.currSlide], els[opts.nextSlide], opts, fwd); |
| + | if (opts.fx == 'shuffle') |
| + | ms -= opts.speedOut; |
| + | } |
| + | else if (opts.continuous) if (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); |
| + | } |
| + | } |
| + | |
| + | // invoked after transition |
| + | $.fn.cycle.updateActivePagerLink = function(pager, currSlide, clsName) { |
| + | $(pager).each(function() { |
| + | $(this).children().removeClass(clsName).eq(currSlide).addClass(clsName); |
| + | }); |
| + | }; |
| + | |
| + | // calculate timeout value for current transition |
| + | 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; |
| + | debug('calculated timeout: ' + t + '; speed: ' + opts.speed); |
| + | if (t !== false) |
| + | return t; |
| + | } |
| + | return opts.timeout; |
| + | } |
| + | |
| + | // expose next/prev function, caller must pass in state |
| + | $.fn.cycle.next = function(opts) { advance(opts,1); }; |
| + | $.fn.cycle.prev = function(opts) { advance(opts,0);}; |
| + | |
| + | // advance slide forward or back |
| + | function advance(opts, moveForward) { |
| + | var val = moveForward ? 1 : -1; |
| + | var els = opts.elements; |
| + | var p = opts.$cont[0], timeout = p.cycleTimeout; |
| + | if (timeout) { |
| + | clearTimeout(timeout); |
| + | p.cycleTimeout = 0; |
| + | } |
| + | if (opts.random) if (val < 0) { |
| + | // move back to the previously display slide |
| + | opts.randomIndex--; |
| + | if (--opts.randomIndex == -2) |
| + | opts.randomIndex = els.length-2; |
| + | else if (opts.randomIndex == -1) |
| + | opts.randomIndex = els.length-1; |
| + | opts.nextSlide = opts.randomMap[opts.randomIndex]; |
| + | } |
| + | else if (opts.random) { |
| + | opts.nextSlide = opts.randomMap[opts.randomIndex]; |
| + | } |
| + | else { |
| + | opts.nextSlide = opts.currSlide + val; |
| + | if (opts.nextSlide < 0) { |
| + | if (opts.nowrap) return false; |
| + | opts.nextSlide = els.length - 1; |
| + | } |
| + | else if (opts.nextSlide >= els.length) { |
| + | 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); |
| + | $.each(els, function(i,o) { |
| + | $.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; |
| + | if ($.isFunction(opts.pagerAnchorBuilder)) { |
| + | a = opts.pagerAnchorBuilder(i,el); |
| + | debug('pagerAnchorBuilder('+i+', el) returned: ' + a); |
| + | } |
| + | else |
| + | a = '<a href="#">'+(i+1)+'</a>'; |
| + | |
| + | 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) { |
| + | $p.each(function() { |
| + | var $clone = $a.clone(true); |
| + | $(this).append($clone); |
| + | arr.push($clone[0]); |
| + | }); |
| + | $a = $(arr); |
| + | } |
| + | else { |
| + | $a.appendTo($p); |
| + | } |
| + | } |
| + | |
| + | opts.pagerAnchors = opts.pagerAnchors || []; |
| + | opts.pagerAnchors.push($a); |
| + | |
| + | var pagerFn = function(e) { |
| + | e.preventDefault(); |
| + | opts.nextSlide = i; |
| + | var p = opts.$cont[0], timeout = p.cycleTimeout; |
| + | if (timeout) { |
| + | clearTimeout(timeout); |
| + | p.cycleTimeout = 0; |
| + | } |
| + | 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 |
| + | }; |
| + | |
| + | if ( /mouseenter|mouseover/i.test(opts.pagerEvent) ) { |
| + | $a.hover(pagerFn, function(){/* no-op */} ); |
| + | } |
| + | else { |
| + | $a.bind(opts.pagerEvent, pagerFn); |
| + | } |
| + | |
| + | if ( ! /^click/.test(opts.pagerEvent)) if (!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 |
| + | if (opts.pauseOnPagerHover) { |
| + | $a.hover( |
| + | function() { |
| + | pauseFlag = true; |
| + | cont.cyclePause++; |
| + | triggerPause(cont,true,true); |
| + | }, function() { |
| + | if (pauseFlag) |
| + | cont.cyclePause--; |
| + | triggerPause(cont,true,true); |
| + | } |
| + | ); |
| + | } |
| + | }; |
| + | |
| + | // helper fn to calculate the number of slides between the current and the next |
| + | $.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; |
| + | }; |
| + | |
| + | // fix clearType problems in ie6 by setting an explicit bg color |
| + | // (otherwise text slides look horrible during a fade transition) |
| + | function clearTypeFix($slides) { |
| + | debug('applying clearType background-color hack'); |
| + | function hex(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) { |
| + | var v = $.css(e,'background-color'); |
| + | if (v) if (v.indexOf('rgb') >= 0 ) { |
| + | var rgb = v.match(/\d+/g); |
| + | return '#'+ hex(rgb[0]) + hex(rgb[1]) + hex(rgb[2]); |
| + | } |
| + | if (v) if (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') |
| + | opts.cssBefore.opacity = 1; |
| + | opts.cssBefore.display = 'block'; |
| + | if (opts.slideResize) if (w !== false) if (next.cycleW > 0) |
| + | opts.cssBefore.width = next.cycleW; |
| + | if (opts.slideResize) if (h !== false) if (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)); |
| + | $(next).css('zIndex',opts.slideCount + (rev === true ? 0 : 1)); |
| + | }; |
| + | |
| + | // the actual fn for effecting a transition |
| + | $.fn.cycle.custom = function(curr, next, opts, cb, fwd, speedOverride) { |
| + | var $l = $(curr), $n = $(next); |
| + | var speedIn = opts.speedIn, speedOut = opts.speedOut, easeIn = opts.easeIn, easeOut = opts.easeOut; |
| + | $n.css(opts.cssBefore); |
| + | if (speedOverride) { |
| + | if (typeof speedOverride == 'number') |
| + | speedIn = speedOut = speedOverride; |
| + | else |
| + | speedIn = speedOut = 1; |
| + | easeIn = easeOut = null; |
| + | } |
| + | var fn = function() { |
| + | $n.animate(opts.animIn, speedIn, easeIn, function() { |
| + | cb(); |
| + | }); |
| + | }; |
| + | $l.animate(opts.animOut, speedOut, easeOut, function() { |
| + | $l.css(opts.cssAfter); |
| + | if (!opts.sync) |
| + | fn(); |
| + | }); |
| + | if (opts.sync) fn(); |
| + | }; |
| + | |
| + | // transition definitions - only fade is defined here, transition pack defines the rest |
| + | $.fn.cycle.transitions = { |
| + | fade: function($cont, $slides, opts) { |
| + | $slides.not(':eq('+opts.currSlide+')').css('opacity',0); |
| + | opts.before.push(function(curr,next,opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts); |
| + | opts.cssBefore.opacity = 0; |
| + | }); |
| + | opts.animIn = { opacity: 1 }; |
| + | opts.animOut = { opacity: 0 }; |
| + | opts.cssBefore = { top: 0, left: 0 }; |
| + | } |
| + | }; |
| + | |
| + | $.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) |
| + | 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 |
| + | containerResizeHeight: 0, // resize containers height to fit the largest slide but leave the width dynamic |
| + | 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); |
| + | |
| + | |
| + | /*! |
| + | * jQuery Cycle Plugin Transition Definitions |
| + | * 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 |
| + | * Dual licensed under the MIT and GPL licenses: |
| + | * http://www.opensource.org/licenses/mit-license.php |
| + | * http://www.gnu.org/licenses/gpl.html |
| + | */ |
| + | (function($) { |
| + | "use strict"; |
| + | |
| + | // |
| + | // These functions define slide initialization and properties for the named |
| + | // transitions. To save file size feel free to remove any of these that you |
| + | // don't need. |
| + | // |
| + | $.fn.cycle.transitions.none = function($cont, $slides, opts) { |
| + | opts.fxFn = function(curr,next,opts,after){ |
| + | $(next).show(); |
| + | $(curr).hide(); |
| + | after(); |
| + | }; |
| + | }; |
| + | |
| + | // not a cross-fade, fadeout only fades out the top slide |
| + | $.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)); |
| + | }); |
| + | opts.animIn.opacity = 1; |
| + | opts.animOut.opacity = 0; |
| + | opts.cssBefore.opacity = 1; |
| + | opts.cssBefore.display = 'block'; |
| + | opts.cssAfter.zIndex = 0; |
| + | }; |
| + | |
| + | // scrollUp/Down/Left/Right |
| + | $.fn.cycle.transitions.scrollUp = function($cont, $slides, opts) { |
| + | $cont.css('overflow','hidden'); |
| + | opts.before.push($.fn.cycle.commonReset); |
| + | var h = $cont.height(); |
| + | opts.cssBefore.top = h; |
| + | opts.cssBefore.left = 0; |
| + | opts.cssFirst.top = 0; |
| + | opts.animIn.top = 0; |
| + | opts.animOut.top = -h; |
| + | }; |
| + | $.fn.cycle.transitions.scrollDown = function($cont, $slides, opts) { |
| + | $cont.css('overflow','hidden'); |
| + | opts.before.push($.fn.cycle.commonReset); |
| + | var h = $cont.height(); |
| + | opts.cssFirst.top = 0; |
| + | opts.cssBefore.top = -h; |
| + | opts.cssBefore.left = 0; |
| + | opts.animIn.top = 0; |
| + | opts.animOut.top = h; |
| + | }; |
| + | $.fn.cycle.transitions.scrollLeft = function($cont, $slides, opts) { |
| + | $cont.css('overflow','hidden'); |
| + | opts.before.push($.fn.cycle.commonReset); |
| + | var w = $cont.width(); |
| + | opts.cssFirst.left = 0; |
| + | opts.cssBefore.left = w; |
| + | opts.cssBefore.top = 0; |
| + | opts.animIn.left = 0; |
| + | opts.animOut.left = 0-w; |
| + | }; |
| + | $.fn.cycle.transitions.scrollRight = function($cont, $slides, opts) { |
| + | $cont.css('overflow','hidden'); |
| + | opts.before.push($.fn.cycle.commonReset); |
| + | var w = $cont.width(); |
| + | opts.cssFirst.left = 0; |
| + | opts.cssBefore.left = -w; |
| + | opts.cssBefore.top = 0; |
| + | opts.animIn.left = 0; |
| + | opts.animOut.left = w; |
| + | }; |
| + | $.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; |
| + | }); |
| + | opts.cssFirst.left = 0; |
| + | opts.cssBefore.top = 0; |
| + | opts.animIn.left = 0; |
| + | opts.animOut.top = 0; |
| + | }; |
| + | $.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; |
| + | }); |
| + | opts.cssFirst.top = 0; |
| + | opts.cssBefore.left = 0; |
| + | opts.animIn.top = 0; |
| + | opts.animOut.left = 0; |
| + | }; |
| + | |
| + | // slideX/slideY |
| + | $.fn.cycle.transitions.slideX = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $(opts.elements).not(curr).hide(); |
| + | $.fn.cycle.commonReset(curr,next,opts,false,true); |
| + | opts.animIn.width = next.cycleW; |
| + | }); |
| + | opts.cssBefore.left = 0; |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.width = 0; |
| + | opts.animIn.width = 'show'; |
| + | opts.animOut.width = 0; |
| + | }; |
| + | $.fn.cycle.transitions.slideY = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $(opts.elements).not(curr).hide(); |
| + | $.fn.cycle.commonReset(curr,next,opts,true,false); |
| + | opts.animIn.height = next.cycleH; |
| + | }); |
| + | opts.cssBefore.left = 0; |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.height = 0; |
| + | opts.animIn.height = 'show'; |
| + | opts.animOut.height = 0; |
| + | }; |
| + | |
| + | // shuffle |
| + | $.fn.cycle.transitions.shuffle = function($cont, $slides, opts) { |
| + | var i, w = $cont.css('overflow', 'visible').width(); |
| + | $slides.css({left: 0, top: 0}); |
| + | opts.before.push(function(curr,next,opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,true,true); |
| + | }); |
| + | // only adjust speed once! |
| + | if (!opts.speedAdjusted) { |
| + | opts.speed = opts.speed / 2; // shuffle has 2 transitions |
| + | opts.speedAdjusted = true; |
| + | } |
| + | opts.random = 0; |
| + | 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++) { |
| + | 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'); |
| + | $el.css('z-index', parseInt(z,10)+1+count); |
| + | } |
| + | $el.animate({left:0, top:0}, opts.speedOut, opts.easeOut, function() { |
| + | $(fwd ? this : curr).hide(); |
| + | if (cb) cb(); |
| + | }); |
| + | }); |
| + | }; |
| + | $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 }); |
| + | }; |
| + | |
| + | // turnUp/Down/Left/Right |
| + | $.fn.cycle.transitions.turnUp = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,false); |
| + | opts.cssBefore.top = next.cycleH; |
| + | opts.animIn.height = next.cycleH; |
| + | opts.animOut.width = next.cycleW; |
| + | }); |
| + | opts.cssFirst.top = 0; |
| + | opts.cssBefore.left = 0; |
| + | opts.cssBefore.height = 0; |
| + | opts.animIn.top = 0; |
| + | opts.animOut.height = 0; |
| + | }; |
| + | $.fn.cycle.transitions.turnDown = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,false); |
| + | opts.animIn.height = next.cycleH; |
| + | opts.animOut.top = curr.cycleH; |
| + | }); |
| + | opts.cssFirst.top = 0; |
| + | opts.cssBefore.left = 0; |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.height = 0; |
| + | opts.animOut.height = 0; |
| + | }; |
| + | $.fn.cycle.transitions.turnLeft = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,false,true); |
| + | opts.cssBefore.left = next.cycleW; |
| + | opts.animIn.width = next.cycleW; |
| + | }); |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.width = 0; |
| + | opts.animIn.left = 0; |
| + | opts.animOut.width = 0; |
| + | }; |
| + | $.fn.cycle.transitions.turnRight = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,false,true); |
| + | opts.animIn.width = next.cycleW; |
| + | opts.animOut.left = curr.cycleW; |
| + | }); |
| + | $.extend(opts.cssBefore, { top: 0, left: 0, width: 0 }); |
| + | opts.animIn.left = 0; |
| + | opts.animOut.width = 0; |
| + | }; |
| + | |
| + | // zoom |
| + | $.fn.cycle.transitions.zoom = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,false,false,true); |
| + | opts.cssBefore.top = next.cycleH/2; |
| + | opts.cssBefore.left = next.cycleW/2; |
| + | $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH }); |
| + | $.extend(opts.animOut, { width: 0, height: 0, top: curr.cycleH/2, left: curr.cycleW/2 }); |
| + | }); |
| + | opts.cssFirst.top = 0; |
| + | opts.cssFirst.left = 0; |
| + | opts.cssBefore.width = 0; |
| + | opts.cssBefore.height = 0; |
| + | }; |
| + | |
| + | // fadeZoom |
| + | $.fn.cycle.transitions.fadeZoom = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,false,false); |
| + | opts.cssBefore.left = next.cycleW/2; |
| + | opts.cssBefore.top = next.cycleH/2; |
| + | $.extend(opts.animIn, { top: 0, left: 0, width: next.cycleW, height: next.cycleH }); |
| + | }); |
| + | opts.cssBefore.width = 0; |
| + | opts.cssBefore.height = 0; |
| + | opts.animOut.opacity = 0; |
| + | }; |
| + | |
| + | // blindX |
| + | $.fn.cycle.transitions.blindX = function($cont, $slides, opts) { |
| + | var w = $cont.css('overflow','hidden').width(); |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts); |
| + | opts.animIn.width = next.cycleW; |
| + | opts.animOut.left = curr.cycleW; |
| + | }); |
| + | opts.cssBefore.left = w; |
| + | opts.cssBefore.top = 0; |
| + | opts.animIn.left = 0; |
| + | opts.animOut.left = w; |
| + | }; |
| + | // blindY |
| + | $.fn.cycle.transitions.blindY = function($cont, $slides, opts) { |
| + | var h = $cont.css('overflow','hidden').height(); |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts); |
| + | opts.animIn.height = next.cycleH; |
| + | opts.animOut.top = curr.cycleH; |
| + | }); |
| + | opts.cssBefore.top = h; |
| + | opts.cssBefore.left = 0; |
| + | opts.animIn.top = 0; |
| + | opts.animOut.top = h; |
| + | }; |
| + | // blindZ |
| + | $.fn.cycle.transitions.blindZ = function($cont, $slides, opts) { |
| + | var h = $cont.css('overflow','hidden').height(); |
| + | var w = $cont.width(); |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts); |
| + | opts.animIn.height = next.cycleH; |
| + | opts.animOut.top = curr.cycleH; |
| + | }); |
| + | opts.cssBefore.top = h; |
| + | opts.cssBefore.left = w; |
| + | opts.animIn.top = 0; |
| + | opts.animIn.left = 0; |
| + | opts.animOut.top = h; |
| + | opts.animOut.left = w; |
| + | }; |
| + | |
| + | // growX - grow horizontally from centered 0 width |
| + | $.fn.cycle.transitions.growX = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,false,true); |
| + | opts.cssBefore.left = this.cycleW/2; |
| + | opts.animIn.left = 0; |
| + | opts.animIn.width = this.cycleW; |
| + | opts.animOut.left = 0; |
| + | }); |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.width = 0; |
| + | }; |
| + | // growY - grow vertically from centered 0 height |
| + | $.fn.cycle.transitions.growY = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,false); |
| + | opts.cssBefore.top = this.cycleH/2; |
| + | opts.animIn.top = 0; |
| + | opts.animIn.height = this.cycleH; |
| + | opts.animOut.top = 0; |
| + | }); |
| + | opts.cssBefore.height = 0; |
| + | opts.cssBefore.left = 0; |
| + | }; |
| + | |
| + | // curtainX - squeeze in both edges horizontally |
| + | $.fn.cycle.transitions.curtainX = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,false,true,true); |
| + | opts.cssBefore.left = next.cycleW/2; |
| + | opts.animIn.left = 0; |
| + | opts.animIn.width = this.cycleW; |
| + | opts.animOut.left = curr.cycleW/2; |
| + | opts.animOut.width = 0; |
| + | }); |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.width = 0; |
| + | }; |
| + | // curtainY - squeeze in both edges vertically |
| + | $.fn.cycle.transitions.curtainY = function($cont, $slides, opts) { |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,false,true); |
| + | opts.cssBefore.top = next.cycleH/2; |
| + | opts.animIn.top = 0; |
| + | opts.animIn.height = next.cycleH; |
| + | opts.animOut.top = curr.cycleH/2; |
| + | opts.animOut.height = 0; |
| + | }); |
| + | opts.cssBefore.height = 0; |
| + | opts.cssBefore.left = 0; |
| + | }; |
| + | |
| + | // cover - curr slide covered by next slide |
| + | $.fn.cycle.transitions.cover = function($cont, $slides, opts) { |
| + | var d = opts.direction || 'left'; |
| + | var w = $cont.css('overflow','hidden').width(); |
| + | var h = $cont.height(); |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts); |
| + | if (d == 'right') |
| + | opts.cssBefore.left = -w; |
| + | else if (d == 'up') |
| + | opts.cssBefore.top = h; |
| + | else if (d == 'down') |
| + | opts.cssBefore.top = -h; |
| + | else |
| + | opts.cssBefore.left = w; |
| + | }); |
| + | opts.animIn.left = 0; |
| + | opts.animIn.top = 0; |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.left = 0; |
| + | }; |
| + | |
| + | // uncover - curr slide moves off next slide |
| + | $.fn.cycle.transitions.uncover = function($cont, $slides, opts) { |
| + | var d = opts.direction || 'left'; |
| + | var w = $cont.css('overflow','hidden').width(); |
| + | var h = $cont.height(); |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,true,true); |
| + | if (d == 'right') |
| + | opts.animOut.left = w; |
| + | else if (d == 'up') |
| + | opts.animOut.top = -h; |
| + | else if (d == 'down') |
| + | opts.animOut.top = h; |
| + | else |
| + | opts.animOut.left = -w; |
| + | }); |
| + | opts.animIn.left = 0; |
| + | opts.animIn.top = 0; |
| + | opts.cssBefore.top = 0; |
| + | opts.cssBefore.left = 0; |
| + | }; |
| + | |
| + | // toss - move top slide and fade away |
| + | $.fn.cycle.transitions.toss = function($cont, $slides, opts) { |
| + | var w = $cont.css('overflow','visible').width(); |
| + | var h = $cont.height(); |
| + | opts.before.push(function(curr, next, opts) { |
| + | $.fn.cycle.commonReset(curr,next,opts,true,true,true); |
| + | // provide default toss settings if animOut not provided |
| + | if (!opts.animOut.left) if (!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; |
| + | opts.animIn.left = 0; |
| + | }; |
| + | |
| + | // wipe - clip animation |
| + | $.fn.cycle.transitions.wipe = function($cont, $slides, opts) { |
| + | var w = $cont.css('overflow','hidden').width(); |
| + | var h = $cont.height(); |
| + | opts.cssBefore = opts.cssBefore || {}; |
| + | 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); |
| + | clip = 'rect('+top+'px '+left+'px '+top+'px '+left+'px)'; |
| + | } |
| + | } |
| + | |
| + | opts.cssBefore.clip = opts.cssBefore.clip || clip || 'rect(0px 0px 0px 0px)'; |
| + | |
| + | var d = opts.cssBefore.clip.match(/(\d+)/g); |
| + | 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; |
| + | var $curr = $(curr), $next = $(next); |
| + | $.fn.cycle.commonReset(curr,next,opts,true,true,false); |
| + | opts.cssAfter.display = 'block'; |
| + | |
| + | var step = 1, count = parseInt((opts.speedIn / 13),10) - 1; |
| + | (function f() { |
| + | var tt = t ? t - parseInt(step * (t/count),10) : 0; |
| + | var ll = l ? l - parseInt(step * (l/count),10) : 0; |
| + | 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'); |
| + | })(); |
| + | }); |
| + | $.extend(opts.cssBefore, { display: 'block', opacity: 1, top: 0, left: 0 }); |
| + | opts.animIn = { left: 0 }; |
| + | opts.animOut = { left: 0 }; |
| + | }; |
| + | |
| + | })(jQuery); |
| </script> | | </script> |
| <script type="text/javascript"> | | <script type="text/javascript"> |
| /* jCarousel */ | | /* jCarousel */ |
- | (function($){var defaults={vertical:false,rtl:false,start:1,offset:1,size:null,scroll:3,visible:null,animation:'normal',easing:'swing',auto:0,wrap:null,initCallback:null,setupCallback:null,reloadCallback:null,itemLoadCallback:null,itemFirstInCallback:null,itemFirstOutCallback:null,itemLastInCallback:null,itemLastOutCallback:null,itemVisibleInCallback:null,itemVisibleOutCallback:null,animationStepCallback:null,buttonNextHTML:'<div></div>',buttonPrevHTML:'<div></div>',buttonNextEvent:'click',buttonPrevEvent:'click',buttonNextCallback:null,buttonPrevCallback:null,itemFallbackDimension:null},windowLoaded=false;$(window).bind('load.jcarousel',function(){windowLoaded=true});$.jcarousel=function(e,o){this.options=$.extend({},defaults,o||{});this.locked=false;this.autoStopped=false;this.container=null;this.clip=null;this.list=null;this.buttonNext=null;this.buttonPrev=null;this.buttonNextState=null;this.buttonPrevState=null;if(!o||o.rtl===undefined){this.options.rtl=($(e).attr('dir')||$('html').attr('dir')||'').toLowerCase()=='rtl'}this.wh=!this.options.vertical?'width':'height';this.lt=!this.options.vertical?(this.options.rtl?'right':'left'):'top';var skin='',split=e.className.split(' ');for(var i=0;i<split.length;i++){if(split[i].indexOf('jcarousel-skin')!=-1){$(e).removeClass(split[i]);skin=split[i];break}}if(e.nodeName.toUpperCase()=='UL'||e.nodeName.toUpperCase()=='OL'){this.list=$(e);this.clip=this.list.parents('.jcarousel-clip');this.container=this.list.parents('.jcarousel-container')}else{this.container=$(e);this.list=this.container.find('ul,ol').eq(0);this.clip=this.container.find('.jcarousel-clip')}if(this.clip.size()===0){this.clip=this.list.wrap('<div></div>').parent()}if(this.container.size()===0){this.container=this.clip.wrap('<div></div>').parent()}if(skin!=='')if(this.container.parent()[0].className.indexOf('jcarousel-skin')==-1){this.container.wrap('<div class=" '+skin+'"></div>')}this.buttonPrev=$('.jcarousel-prev',this.container);if(this.buttonPrev.size()===0)if(this.options.buttonPrevHTML!==null){this.buttonPrev=$(this.options.buttonPrevHTML).appendTo(this.container)}this.buttonPrev.addClass(this.className('jcarousel-prev'));this.buttonNext=$('.jcarousel-next',this.container);if(this.buttonNext.size()===0)if(this.options.buttonNextHTML!==null){this.buttonNext=$(this.options.buttonNextHTML).appendTo(this.container)}this.buttonNext.addClass(this.className('jcarousel-next'));this.clip.addClass(this.className('jcarousel-clip')).css({position:'relative'});this.list.addClass(this.className('jcarousel-list')).css({overflow:'hidden',position:'relative',top:0,margin:0,padding:0}).css((this.options.rtl?'right':'left'),0);this.container.addClass(this.className('jcarousel-container')).css({position:'relative'});if(!this.options.vertical)if(this.options.rtl){this.container.addClass('jcarousel-direction-rtl').attr('dir','rtl')}var di=this.options.visible!==null?Math.ceil(this.clipping()/this.options.visible):null;var li=this.list.children('li');var self=this;if(li.size()>0){var wh=0,j=this.options.offset;li.each(function(){self.format(this,j++);wh+=self.dimension(this,di)});this.list.css(this.wh,(wh+100)+'px');if(!o||o.size===undefined){this.options.size=li.size()}}this.container.css('display','block');this.buttonNext.css('display','block');this.buttonPrev.css('display','block');this.funcNext=function(){self.next()};this.funcPrev=function(){self.prev()};this.funcResize=function(){if(self.resizeTimer){clearTimeout(self.resizeTimer)}self.resizeTimer=setTimeout(function(){self.reload()},100)};if(this.options.initCallback!==null){this.options.initCallback(this,'init')}if(!windowLoaded)if($.browser.safari){this.buttons(false,false);$(window).bind('load.jcarousel',function(){self.setup()})}else{this.setup()}};var $jc=$.jcarousel;$jc.fn=$jc.prototype={jcarousel:'0.2.8'};$jc.fn.extend=$jc.extend=$.extend;$jc.fn.extend({setup:function(){this.first=null;this.last=null;this.prevFirst=null;this.prevLast=null;this.animating=false;this.timer=null;this.resizeTimer=null;this.tail=null;this.inTail=false;if(this.locked){return}this.list.css(this.lt,this.pos(this.options.offset)+'px');var p=this.pos(this.options.start,true);this.prevFirst=this.prevLast=null;this.animate(p,false);$(window).unbind('resize.jcarousel',this.funcResize).bind('resize.jcarousel',this.funcResize);if(this.options.setupCallback!==null){this.options.setupCallback(this)}},reset:function(){this.list.empty();this.list.css(this.lt,'0px');this.list.css(this.wh,'10px');if(this.options.initCallback!==null){this.options.initCallback(this,'reset')}this.setup()},reload:function(){if(this.tail!==null)if(this.inTail){this.list.css(this.lt,$jc.intval(this.list.css(this.lt))+this.tail)}this.tail=null;this.inTail=false;if(this.options.reloadCallback!==null){this.options.reloadCallback(this)}if(this.options.visible!==null){var self=this;var di=Math.ceil(this.clipping()/this.options.visible),wh=0,lt=0;this.list.children('li').each(function(i){wh+=self.dimension(this,di);if(i+1<self.first){lt=wh}});this.list.css(this.wh,wh+'px');this.list.css(this.lt,-lt+'px')}this.scroll(this.first,false)},lock:function(){this.locked=true;this.buttons()},unlock:function(){this.locked=false;this.buttons()},size:function(s){if(s!==undefined){this.options.size=s;if(!this.locked){this.buttons()}}return this.options.size},has:function(i,i2){if(i2===undefined||!i2){i2=i}if(this.options.size!==null)if(i2>this.options.size){i2=this.options.size}for(var j=i;j<=i2;j++){var e=this.get(j);if(!e.length||e.hasClass('jcarousel-item-placeholder')){return false}}return true},get:function(i){return $('>.jcarousel-item-'+i,this.list)},add:function(i,s){var e=this.get(i),old=0,n=$(s);if(e.length===0){var c,j=$jc.intval(i);e=this.create(i);while(true){c=this.get(--j);if(j<=0||c.length){if(j<=0){this.list.prepend(e)}else{c.after(e)}break}}}else{old=this.dimension(e)}if(n.get(0).nodeName.toUpperCase()=='LI'){e.replaceWith(n);e=n}else{e.empty().append(s)}this.format(e.removeClass(this.className('jcarousel-item-placeholder')),i);var di=this.options.visible!==null?Math.ceil(this.clipping()/this.options.visible):null;var wh=this.dimension(e,di)-old;if(i>0)if(i<this.first){this.list.css(this.lt,$jc.intval(this.list.css(this.lt))-wh+'px')}this.list.css(this.wh,$jc.intval(this.list.css(this.wh))+wh+'px');return e},remove:function(i){var e=this.get(i);if(!e.length||(i>=this.first)if(i<=this.last)){return}var d=this.dimension(e);if(i<this.first){this.list.css(this.lt,$jc.intval(this.list.css(this.lt))+d+'px')}e.remove();this.list.css(this.wh,$jc.intval(this.list.css(this.wh))-d+'px')},next:function(){if(this.tail!==null)if(!this.inTail){this.scrollTail(false)}else{this.scroll((!(this.options.wrap=='both'||this.options.wrap=='last')||!(this.options.size!==null)||!(this.last==this.options.size))?1:this.first+this.options.scroll)}},prev:function(){if(this.tail!==null)if(this.inTail){this.scrollTail(true)}else{this.scroll((!(this.options.wrap=='both'||this.options.wrap=='first')||!(this.options.size!==null)||!(this.first==1))?this.options.size:this.first-this.options.scroll)}},scrollTail:function(b){if(this.locked||this.animating||!this.tail){return}this.pauseAuto();var pos=$jc.intval(this.list.css(this.lt));pos=!b?pos-this.tail:pos+this.tail;this.inTail=!b;this.prevFirst=this.first;this.prevLast=this.last;this.animate(pos)},scroll:function(i,a){if(this.locked||this.animating){return}this.pauseAuto();this.animate(this.pos(i),a)},pos:function(i,fv){var pos=$jc.intval(this.list.css(this.lt));if(this.locked||this.animating){return pos}if(this.options.wrap!='circular'){i=i<1?1:((!(this.options.size)||!(i>this.options.size))?this.options.size:i)}var back=this.first>i;var f=(!(this.options.wrap!='circular')||!(this.first<=1))?1:this.first;var c=back?this.get(f):this.get(this.last);var j=back?f:f-1;var e=null,l=0,p=false,d=0,g;while(back?--j>=i:++j<i){e=this.get(j);p=!e.length;if(e.length===0){e=this.create(j).addClass(this.className('jcarousel-item-placeholder'));c[back?'before':'after'](e);if(this.first!==null)if(this.options.wrap=='circular')if(this.options.size!==null)if((j<=0||j>this.options.size)){g=this.get(this.index(j));if(g.length){e=this.add(j,g.clone(true))}}}c=e;d=this.dimension(e);if(p){l+=d}if(this.first!==null)if((this.options.wrap=='circular'||(j>=1)if((this.options.size===null||j<=this.options.size)))){pos=back?pos+d:pos-d}}var clipping=this.clipping(),cache=[],visible=0,v=0;c=this.get(i-1);j=i;while(++visible){e=this.get(j);p=!e.length;if(e.length===0){e=this.create(j).addClass(this.className('jcarousel-item-placeholder'));if(c.length===0){this.list.prepend(e)}else{c[back?'before':'after'](e)}if(this.first!==null)if(this.options.wrap=='circular')if(this.options.size!==null)if((j<=0||j>this.options.size)){g=this.get(this.index(j));if(g.length){e=this.add(j,g.clone(true))}}}c=e;d=this.dimension(e);if(d===0){throw new Error('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...');}if(this.options.wrap!='circular')if(this.options.size!==null)if(j>this.options.size){cache.push(e)}else if(p){l+=d}v+=d;if(v>=clipping){break}j++}for(var x=0;x<cache.length;x++){cache[x].remove()}if(l>0){this.list.css(this.wh,this.dimension(this.list)+l+'px');if(back){pos-=l;this.list.css(this.lt,$jc.intval(this.list.css(this.lt))-l+'px')}}var last=i+visible-1;if(this.options.wrap!='circular')if(this.options.size)if(last>this.options.size){last=this.options.size}if(j>last){visible=0;j=last;v=0;while(++visible){e=this.get(j--);if(!e.length){break}v+=this.dimension(e);if(v>=clipping){break}}}var first=last-visible+1;if(this.options.wrap!='circular')if(first<1){first=1}if(this.inTail)if(back){pos+=this.tail;this.inTail=false}this.tail=null;if(this.options.wrap!='circular')if(last==this.options.size)if((last-visible+1)>=1){var m=$jc.intval(this.get(last).css(!this.options.vertical?'marginRight':'marginBottom'));if((v-m)>clipping){this.tail=v-clipping-m}}if(fv)if(i===this.options.size)if(this.tail){pos-=this.tail;this.inTail=true}while(i-->first){pos+=this.dimension(this.get(i))}this.prevFirst=this.first;this.prevLast=this.last;this.first=first;this.last=last;return pos},animate:function(p,a){if(this.locked||this.animating){return}this.animating=true;var self=this;var scrolled=function(){self.animating=false;if(p===0){self.list.css(self.lt,0)}if(!self.autoStopped)if((self.options.wrap=='circular'||self.options.wrap=='both'||self.options.wrap=='last'||self.options.size===null||self.last<self.options.size||(self.last==self.options.size)if(self.tail!==null)if(!self.inTail))){self.startAuto()}self.buttons();self.notify('onAfterAnimation');if(self.options.wrap=='circular')if(self.options.size!==null){for(var i=self.prevFirst;i<=self.prevLast;i++){if(i!==null)if(!(i>=self.first)if(i<=self.last))if((i<1||i>self.options.size)){self.remove(i)}}}};this.notify('onBeforeAnimation');if(!this.options.animation||a===false){this.list.css(this.lt,p+'px');scrolled()}else{var o=!this.options.vertical?(this.options.rtl?{'right':p}:{'left':p}):{'top':p};var settings={duration:this.options.animation,easing:this.options.easing,complete:scrolled};if($.isFunction(this.options.animationStepCallback)){settings.step=this.options.animationStepCallback}this.list.animate(o,settings)}},startAuto:function(s){if(s!==undefined){this.options.auto=s}if(this.options.auto===0){return this.stopAuto()}if(this.timer!==null){return}this.autoStopped=false;var self=this;this.timer=window.setTimeout(function(){self.next()},this.options.auto*1000)},stopAuto:function(){this.pauseAuto();this.autoStopped=true},pauseAuto:function(){if(this.timer===null){return}window.clearTimeout(this.timer);this.timer=null},buttons:function(n,p){if(n==null){n=!(this.locked||!(this.options.size!==0)||!(!(!this.options.wrap||!(this.options.wrap!='first'))||this.options.size===null||this.last<this.options.size));if(!this.locked)if((!this.options.wrap||this.options.wrap=='first'))if(this.options.size!==null)if(this.last>=this.options.size){n=!(!(this.tail!==null)||this.inTail)}}if(p==null){p=!(this.locked||!(this.options.size!==0)||!(!(!this.options.wrap||!(this.options.wrap!='last'))||this.first>1));if(!this.locked)if((!this.options.wrap||this.options.wrap=='last'))if(this.options.size!==null)if(this.first==1){p=!(!(this.tail!==null)||!this.inTail)}}var self=this;if(this.buttonNext.size()>0){this.buttonNext.unbind(this.options.buttonNextEvent+'.jcarousel',this.funcNext);if(n){this.buttonNext.bind(this.options.buttonNextEvent+'.jcarousel',this.funcNext)}this.buttonNext[n?'removeClass':'addClass'](this.className('jcarousel-next-disabled')).attr('disabled',n?false:true);if(this.options.buttonNextCallback!==null)if(this.buttonNext.data('jcarouselstate')!=n){this.buttonNext.each(function(){self.options.buttonNextCallback(self,this,n)}).data('jcarouselstate',n)}}else{if(this.options.buttonNextCallback!==null)if(this.buttonNextState!=n){this.options.buttonNextCallback(self,null,n)}}if(this.buttonPrev.size()>0){this.buttonPrev.unbind(this.options.buttonPrevEvent+'.jcarousel',this.funcPrev);if(p){this.buttonPrev.bind(this.options.buttonPrevEvent+'.jcarousel',this.funcPrev)}this.buttonPrev[p?'removeClass':'addClass'](this.className('jcarousel-prev-disabled')).attr('disabled',p?false:true);if(this.options.buttonPrevCallback!==null)if(this.buttonPrev.data('jcarouselstate')!=p){this.buttonPrev.each(function(){self.options.buttonPrevCallback(self,this,p)}).data('jcarouselstate',p)}}else{if(this.options.buttonPrevCallback!==null)if(this.buttonPrevState!=p){this.options.buttonPrevCallback(self,null,p)}}this.buttonNextState=n;this.buttonPrevState=p},notify:function(evt){var state=this.prevFirst===null?'init':(this.prevFirst<this.first?'next':'prev');this.callback('itemLoadCallback',evt,state);if(this.prevFirst!==this.first){this.callback('itemFirstInCallback',evt,state,this.first);this.callback('itemFirstOutCallback',evt,state,this.prevFirst)}if(this.prevLast!==this.last){this.callback('itemLastInCallback',evt,state,this.last);this.callback('itemLastOutCallback',evt,state,this.prevLast)}this.callback('itemVisibleInCallback',evt,state,this.first,this.last,this.prevFirst,this.prevLast);this.callback('itemVisibleOutCallback',evt,state,this.prevFirst,this.prevLast,this.first,this.last)},callback:function(cb,evt,state,i1,i2,i3,i4){if(this.options[cb]==null||(typeof this.options[cb]!='object')if(evt!='onAfterAnimation')){return}var callback=typeof this.options[cb]=='object'?this.options[cb][evt]:this.options[cb];if(!$.isFunction(callback)){return}var self=this;if(i1===undefined){callback(self,state,evt)}else if(i2===undefined){this.get(i1).each(function(){callback(self,this,i1,state,evt)})}else{var call=function(i){self.get(i).each(function(){callback(self,this,i,state,evt)})};for(var i=i1;i<=i2;i++){if(i!==null)if(!(i>=i3)if(i<=i4)){call(i)}}}},create:function(i){return this.format('<li></li>',i)},format:function(e,i){e=$(e);var split=e.get(0).className.split(' ');for(var j=0;j<split.length;j++){if(split[j].indexOf('jcarousel-')!=-1){e.removeClass(split[j])}}e.addClass(this.className('jcarousel-item')).addClass(this.className('jcarousel-item-'+i)).css({'float':(this.options.rtl?'right':'left'),'list-style':'none'}).attr('jcarouselindex',i);return e},className:function(c){return c+' '+c+(!this.options.vertical?'-horizontal':'-vertical')},dimension:function(e,d){var el=$(e);if(d==null){return!this.options.vertical?(el.outerWidth(true)||$jc.intval(this.options.itemFallbackDimension)):(el.outerHeight(true)||$jc.intval(this.options.itemFallbackDimension))}else{var w=!this.options.vertical?d-$jc.intval(el.css('marginLeft'))-$jc.intval(el.css('marginRight')):d-$jc.intval(el.css('marginTop'))-$jc.intval(el.css('marginBottom'));$(el).css(this.wh,w+'px');return this.dimension(el)}},clipping:function(){return!this.options.vertical?this.clip[0].offsetWidth-$jc.intval(this.clip.css('borderLeftWidth'))-$jc.intval(this.clip.css('borderRightWidth')):this.clip[0].offsetHeight-$jc.intval(this.clip.css('borderTopWidth'))-$jc.intval(this.clip.css('borderBottomWidth'))},index:function(i,s){if(s==null){s=this.options.size}return Math.round((((i-1)/s)-Math.floor((i-1)/s))*s)+1}});$jc.extend({defaults:function(d){return $.extend(defaults,d||{})},intval:function(v){v=parseInt(v,10);return isNaN(v)?0:v},windowLoaded:function(){windowLoaded=true}});$.fn.jcarousel=function(o){if(typeof o=='string'){var instance=$(this).data('jcarousel'),args=Array.prototype.slice.call(arguments,1);return instance[o].apply(instance,args)}else{return this.each(function(){var instance=$(this).data('jcarousel');if(instance){if(o){$.extend(instance.options,o)}instance.reload()}else{$(this).data('jcarousel',new $jc(this,o))}})}}})(jQuery);
| + | /*! |
| + | * jCarousel - Riding carousels with jQuery |
| + | * http://sorgalla.com/jcarousel/ |
| + | * |
| + | * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com) |
| + | * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) |
| + | * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. |
| + | * |
| + | * Built on top of the jQuery library |
| + | * http://jquery.com |
| + | * |
| + | * Inspired by the "Carousel Component" by Bill Scott |
| + | * http://billwscott.com/carousel/ |
| + | */ |
| + | |
| + | /*global window, jQuery */ |
| + | (function($) { |
| + | // Default configuration properties. |
| + | var defaults = { |
| + | vertical: false, |
| + | rtl: false, |
| + | start: 1, |
| + | offset: 1, |
| + | size: null, |
| + | scroll: 3, |
| + | visible: null, |
| + | animation: 'normal', |
| + | easing: 'swing', |
| + | auto: 0, |
| + | wrap: null, |
| + | initCallback: null, |
| + | setupCallback: null, |
| + | reloadCallback: null, |
| + | itemLoadCallback: null, |
| + | itemFirstInCallback: null, |
| + | itemFirstOutCallback: null, |
| + | itemLastInCallback: null, |
| + | itemLastOutCallback: null, |
| + | itemVisibleInCallback: null, |
| + | itemVisibleOutCallback: null, |
| + | animationStepCallback: null, |
| + | buttonNextHTML: '<div></div>', |
| + | buttonPrevHTML: '<div></div>', |
| + | buttonNextEvent: 'click', |
| + | buttonPrevEvent: 'click', |
| + | buttonNextCallback: null, |
| + | buttonPrevCallback: null, |
| + | itemFallbackDimension: null |
| + | }, windowLoaded = false; |
| + | |
| + | $(window).bind('load.jcarousel', function() { windowLoaded = true; }); |
| + | |
| + | /** |
| + | * The jCarousel object. |
| + | * |
| + | * @constructor |
| + | * @class jcarousel |
| + | * @param e {HTMLElement} The element to create the carousel for. |
| + | * @param o {Object} A set of key/value pairs to set as configuration properties. |
| + | * @cat Plugins/jCarousel |
| + | */ |
| + | $.jcarousel = function(e, o) { |
| + | this.options = $.extend({}, defaults, o || {}); |
| + | |
| + | this.locked = false; |
| + | this.autoStopped = false; |
| + | |
| + | this.container = null; |
| + | this.clip = null; |
| + | this.list = null; |
| + | this.buttonNext = null; |
| + | this.buttonPrev = null; |
| + | this.buttonNextState = null; |
| + | this.buttonPrevState = null; |
| + | |
| + | // Only set if not explicitly passed as option |
| + | if (!o || o.rtl === undefined) { |
| + | this.options.rtl = ($(e).attr('dir') || $('html').attr('dir') || '').toLowerCase() == 'rtl'; |
| + | } |
| + | |
| + | this.wh = !this.options.vertical ? 'width' : 'height'; |
| + | this.lt = !this.options.vertical ? (this.options.rtl ? 'right' : 'left') : 'top'; |
| + | |
| + | // Extract skin class |
| + | var skin = '', split = e.className.split(' '); |
| + | |
| + | for (var i = 0; i < split.length; i++) { |
| + | if (split[i].indexOf('jcarousel-skin') != -1) { |
| + | $(e).removeClass(split[i]); |
| + | skin = split[i]; |
| + | break; |
| + | } |
| + | } |
| + | |
| + | if (e.nodeName.toUpperCase() == 'UL' || e.nodeName.toUpperCase() == 'OL') { |
| + | this.list = $(e); |
| + | this.clip = this.list.parents('.jcarousel-clip'); |
| + | this.container = this.list.parents('.jcarousel-container'); |
| + | } else { |
| + | this.container = $(e); |
| + | this.list = this.container.find('ul,ol').eq(0); |
| + | this.clip = this.container.find('.jcarousel-clip'); |
| + | } |
| + | |
| + | if (this.clip.size() === 0) { |
| + | this.clip = this.list.wrap('<div></div>').parent(); |
| + | } |
| + | |
| + | if (this.container.size() === 0) { |
| + | this.container = this.clip.wrap('<div></div>').parent(); |
| + | } |
| + | |
| + | if (skin !== '') if (this.container.parent()[0].className.indexOf('jcarousel-skin') == -1) { |
| + | this.container.wrap('<div class=" '+ skin + '"></div>'); |
| + | } |
| + | |
| + | this.buttonPrev = $('.jcarousel-prev', this.container); |
| + | |
| + | if (this.buttonPrev.size() === 0) if (this.options.buttonPrevHTML !== null) { |
| + | this.buttonPrev = $(this.options.buttonPrevHTML).appendTo(this.container); |
| + | } |
| + | |
| + | this.buttonPrev.addClass(this.className('jcarousel-prev')); |
| + | |
| + | this.buttonNext = $('.jcarousel-next', this.container); |
| + | |
| + | if (this.buttonNext.size() === 0) if (this.options.buttonNextHTML !== null) { |
| + | this.buttonNext = $(this.options.buttonNextHTML).appendTo(this.container); |
| + | } |
| + | |
| + | this.buttonNext.addClass(this.className('jcarousel-next')); |
| + | |
| + | this.clip.addClass(this.className('jcarousel-clip')).css({ |
| + | position: 'relative' |
| + | }); |
| + | |
| + | this.list.addClass(this.className('jcarousel-list')).css({ |
| + | overflow: 'hidden', |
| + | position: 'relative', |
| + | top: 0, |
| + | margin: 0, |
| + | padding: 0 |
| + | }).css((this.options.rtl ? 'right' : 'left'), 0); |
| + | |
| + | this.container.addClass(this.className('jcarousel-container')).css({ |
| + | position: 'relative' |
| + | }); |
| + | |
| + | if (!this.options.vertical) if (this.options.rtl) { |
| + | this.container.addClass('jcarousel-direction-rtl').attr('dir', 'rtl'); |
| + | } |
| + | |
| + | var di = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null; |
| + | var li = this.list.children('li'); |
| + | |
| + | var self = this; |
| + | |
| + | if (li.size() > 0) { |
| + | var wh = 0, j = this.options.offset; |
| + | li.each(function() { |
| + | self.format(this, j++); |
| + | wh += self.dimension(this, di); |
| + | }); |
| + | |
| + | this.list.css(this.wh, (wh + 100) + 'px'); |
| + | |
| + | // Only set if not explicitly passed as option |
| + | if (!o || o.size === undefined) { |
| + | this.options.size = li.size(); |
| + | } |
| + | } |
| + | |
| + | // For whatever reason, .show() does not work in Safari... |
| + | this.container.css('display', 'block'); |
| + | this.buttonNext.css('display', 'block'); |
| + | this.buttonPrev.css('display', 'block'); |
| + | |
| + | this.funcNext = function() { self.next(); }; |
| + | this.funcPrev = function() { self.prev(); }; |
| + | this.funcResize = function() { |
| + | if (self.resizeTimer) { |
| + | clearTimeout(self.resizeTimer); |
| + | } |
| + | |
| + | self.resizeTimer = setTimeout(function() { |
| + | self.reload(); |
| + | }, 100); |
| + | }; |
| + | |
| + | if (this.options.initCallback !== null) { |
| + | this.options.initCallback(this, 'init'); |
| + | } |
| + | |
| + | if (!windowLoaded) if ($.browser.safari) { |
| + | this.buttons(false, false); |
| + | $(window).bind('load.jcarousel', function() { self.setup(); }); |
| + | } else { |
| + | this.setup(); |
| + | } |
| + | }; |
| + | |
| + | // Create shortcut for internal use |
| + | var $jc = $.jcarousel; |
| + | |
| + | $jc.fn = $jc.prototype = { |
| + | jcarousel: '0.2.8' |
| + | }; |
| + | |
| + | $jc.fn.extend = $jc.extend = $.extend; |
| + | |
| + | $jc.fn.extend({ |
| + | /** |
| + | * Setups the carousel. |
| + | * |
| + | * @method setup |
| + | * @return undefined |
| + | */ |
| + | setup: function() { |
| + | this.first = null; |
| + | this.last = null; |
| + | this.prevFirst = null; |
| + | this.prevLast = null; |
| + | this.animating = false; |
| + | this.timer = null; |
| + | this.resizeTimer = null; |
| + | this.tail = null; |
| + | this.inTail = false; |
| + | |
| + | if (this.locked) { |
| + | return; |
| + | } |
| + | |
| + | this.list.css(this.lt, this.pos(this.options.offset) + 'px'); |
| + | var p = this.pos(this.options.start, true); |
| + | this.prevFirst = this.prevLast = null; |
| + | this.animate(p, false); |
| + | |
| + | $(window).unbind('resize.jcarousel', this.funcResize).bind('resize.jcarousel', this.funcResize); |
| + | |
| + | if (this.options.setupCallback !== null) { |
| + | this.options.setupCallback(this); |
| + | } |
| + | }, |
| + | |
| + | /** |
| + | * Clears the list and resets the carousel. |
| + | * |
| + | * @method reset |
| + | * @return undefined |
| + | */ |
| + | reset: function() { |
| + | this.list.empty(); |
| + | |
| + | this.list.css(this.lt, '0px'); |
| + | this.list.css(this.wh, '10px'); |
| + | |
| + | if (this.options.initCallback !== null) { |
| + | this.options.initCallback(this, 'reset'); |
| + | } |
| + | |
| + | this.setup(); |
| + | }, |
| + | |
| + | /** |
| + | * Reloads the carousel and adjusts positions. |
| + | * |
| + | * @method reload |
| + | * @return undefined |
| + | */ |
| + | reload: function() { |
| + | if (this.tail !== null) if (this.inTail) { |
| + | this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + this.tail); |
| + | } |
| + | |
| + | this.tail = null; |
| + | this.inTail = false; |
| + | |
| + | if (this.options.reloadCallback !== null) { |
| + | this.options.reloadCallback(this); |
| + | } |
| + | |
| + | if (this.options.visible !== null) { |
| + | var self = this; |
| + | var di = Math.ceil(this.clipping() / this.options.visible), wh = 0, lt = 0; |
| + | this.list.children('li').each(function(i) { |
| + | wh += self.dimension(this, di); |
| + | if (i + 1 < self.first) { |
| + | lt = wh; |
| + | } |
| + | }); |
| + | |
| + | this.list.css(this.wh, wh + 'px'); |
| + | this.list.css(this.lt, -lt + 'px'); |
| + | } |
| + | |
| + | this.scroll(this.first, false); |
| + | }, |
| + | |
| + | /** |
| + | * Locks the carousel. |
| + | * |
| + | * @method lock |
| + | * @return undefined |
| + | */ |
| + | lock: function() { |
| + | this.locked = true; |
| + | this.buttons(); |
| + | }, |
| + | |
| + | /** |
| + | * Unlocks the carousel. |
| + | * |
| + | * @method unlock |
| + | * @return undefined |
| + | */ |
| + | unlock: function() { |
| + | this.locked = false; |
| + | this.buttons(); |
| + | }, |
| + | |
| + | /** |
| + | * Sets the size of the carousel. |
| + | * |
| + | * @method size |
| + | * @return undefined |
| + | * @param s {Number} The size of the carousel. |
| + | */ |
| + | size: function(s) { |
| + | if (s !== undefined) { |
| + | this.options.size = s; |
| + | if (!this.locked) { |
| + | this.buttons(); |
| + | } |
| + | } |
| + | |
| + | return this.options.size; |
| + | }, |
| + | |
| + | /** |
| + | * Checks whether a list element exists for the given index (or index range). |
| + | * |
| + | * @method get |
| + | * @return bool |
| + | * @param i {Number} The index of the (first) element. |
| + | * @param i2 {Number} The index of the last element. |
| + | */ |
| + | has: function(i, i2) { |
| + | if (i2 === undefined || !i2) { |
| + | i2 = i; |
| + | } |
| + | |
| + | if (this.options.size !== null) if (i2 > this.options.size) { |
| + | i2 = this.options.size; |
| + | } |
| + | |
| + | for (var j = i; j <= i2; j++) { |
| + | var e = this.get(j); |
| + | if (!e.length || e.hasClass('jcarousel-item-placeholder')) { |
| + | return false; |
| + | } |
| + | } |
| + | |
| + | return true; |
| + | }, |
| + | |
| + | /** |
| + | * Returns a jQuery object with list element for the given index. |
| + | * |
| + | * @method get |
| + | * @return jQuery |
| + | * @param i {Number} The index of the element. |
| + | */ |
| + | get: function(i) { |
| + | return $('>.jcarousel-item-' + i, this.list); |
| + | }, |
| + | |
| + | /** |
| + | * Adds an element for the given index to the list. |
| + | * If the element already exists, it updates the inner html. |
| + | * Returns the created element as jQuery object. |
| + | * |
| + | * @method add |
| + | * @return jQuery |
| + | * @param i {Number} The index of the element. |
| + | * @param s {String} The innerHTML of the element. |
| + | */ |
| + | add: function(i, s) { |
| + | var e = this.get(i), old = 0, n = $(s); |
| + | |
| + | if (e.length === 0) { |
| + | var c, j = $jc.intval(i); |
| + | e = this.create(i); |
| + | while (true) { |
| + | c = this.get(--j); |
| + | if (j <= 0 || c.length) { |
| + | if (j <= 0) { |
| + | this.list.prepend(e); |
| + | } else { |
| + | c.after(e); |
| + | } |
| + | break; |
| + | } |
| + | } |
| + | } else { |
| + | old = this.dimension(e); |
| + | } |
| + | |
| + | if (n.get(0).nodeName.toUpperCase() == 'LI') { |
| + | e.replaceWith(n); |
| + | e = n; |
| + | } else { |
| + | e.empty().append(s); |
| + | } |
| + | |
| + | this.format(e.removeClass(this.className('jcarousel-item-placeholder')), i); |
| + | |
| + | var di = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null; |
| + | var wh = this.dimension(e, di) - old; |
| + | |
| + | if (i > 0) if (i < this.first) { |
| + | this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - wh + 'px'); |
| + | } |
| + | |
| + | this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) + wh + 'px'); |
| + | |
| + | return e; |
| + | }, |
| + | |
| + | /** |
| + | * Removes an element for the given index from the list. |
| + | * |
| + | * @method remove |
| + | * @return undefined |
| + | * @param i {Number} The index of the element. |
| + | */ |
| + | remove: function(i) { |
| + | var e = this.get(i); |
| + | |
| + | // Check if item exists and is not currently visible |
| + | if (!e.length || (i >= this.first) if (i <= this.last)) { |
| + | return; |
| + | } |
| + | |
| + | var d = this.dimension(e); |
| + | |
| + | if (i < this.first) { |
| + | this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + d + 'px'); |
| + | } |
| + | |
| + | e.remove(); |
| + | |
| + | this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) - d + 'px'); |
| + | }, |
| + | |
| + | /** |
| + | * Moves the carousel forwards. |
| + | * |
| + | * @method next |
| + | * @return undefined |
| + | */ |
| + | next: function() { |
| + | if (this.tail !== null) if (!this.inTail) { |
| + | this.scrollTail(false); |
| + | } else { |
| + | this.scroll((!(this.options.wrap == 'both' || this.options.wrap == 'last') || !(this.options.size !== null) || !(this.last == this.options.size)) ? 1 : this.first + this.options.scroll); |
| + | } |
| + | }, |
| + | |
| + | /** |
| + | * Moves the carousel backwards. |
| + | * |
| + | * @method prev |
| + | * @return undefined |
| + | */ |
| + | prev: function() { |
| + | if (this.tail !== null) if (this.inTail) { |
| + | this.scrollTail(true); |
| + | } else { |
| + | this.scroll((!(this.options.wrap == 'both' || this.options.wrap == 'first') || !(this.options.size !== null) || !(this.first == 1)) ? this.options.size : this.first - this.options.scroll); |
| + | } |
| + | }, |
| + | |
| + | /** |
| + | * Scrolls the tail of the carousel. |
| + | * |
| + | * @method scrollTail |
| + | * @return undefined |
| + | * @param b {Boolean} Whether scroll the tail back or forward. |
| + | */ |
| + | scrollTail: function(b) { |
| + | if (this.locked || this.animating || !this.tail) { |
| + | return; |
| + | } |
| + | |
| + | this.pauseAuto(); |
| + | |
| + | var pos = $jc.intval(this.list.css(this.lt)); |
| + | |
| + | pos = !b ? pos - this.tail : pos + this.tail; |
| + | this.inTail = !b; |
| + | |
| + | // Save for callbacks |
| + | this.prevFirst = this.first; |
| + | this.prevLast = this.last; |
| + | |
| + | this.animate(pos); |
| + | }, |
| + | |
| + | /** |
| + | * Scrolls the carousel to a certain position. |
| + | * |
| + | * @method scroll |
| + | * @return undefined |
| + | * @param i {Number} The index of the element to scoll to. |
| + | * @param a {Boolean} Flag indicating whether to perform animation. |
| + | */ |
| + | scroll: function(i, a) { |
| + | if (this.locked || this.animating) { |
| + | return; |
| + | } |
| + | |
| + | this.pauseAuto(); |
| + | this.animate(this.pos(i), a); |
| + | }, |
| + | |
| + | /** |
| + | * Prepares the carousel and return the position for a certian index. |
| + | * |
| + | * @method pos |
| + | * @return {Number} |
| + | * @param i {Number} The index of the element to scoll to. |
| + | * @param fv {Boolean} Whether to force last item to be visible. |
| + | */ |
| + | pos: function(i, fv) { |
| + | var pos = $jc.intval(this.list.css(this.lt)); |
| + | |
| + | if (this.locked || this.animating) { |
| + | return pos; |
| + | } |
| + | |
| + | if (this.options.wrap != 'circular') { |
| + | i = i < 1 ? 1 : ((!(this.options.size) || !(i > this.options.size)) ? this.options.size : i); |
| + | } |
| + | |
| + | var back = this.first > i; |
| + | |
| + | // Create placeholders, new list width/height |
| + | // and new list position |
| + | var f = (!(this.options.wrap != 'circular') || !(this.first <= 1)) ? 1 : this.first; |
| + | var c = back ? this.get(f) : this.get(this.last); |
| + | var j = back ? f : f - 1; |
| + | var e = null, l = 0, p = false, d = 0, g; |
| + | |
| + | while (back ? --j >= i : ++j < i) { |
| + | e = this.get(j); |
| + | p = !e.length; |
| + | if (e.length === 0) { |
| + | e = this.create(j).addClass(this.className('jcarousel-item-placeholder')); |
| + | c[back ? 'before' : 'after' ](e); |
| + | |
| + | if (this.first !== null) if (this.options.wrap == 'circular') if (this.options.size !== null) if ((j <= 0 || j > this.options.size)) { |
| + | g = this.get(this.index(j)); |
| + | if (g.length) { |
| + | e = this.add(j, g.clone(true)); |
| + | } |
| + | } |
| + | } |
| + | |
| + | c = e; |
| + | d = this.dimension(e); |
| + | |
| + | if (p) { |
| + | l += d; |
| + | } |
| + | |
| + | if (this.first !== null) if ((this.options.wrap == 'circular' || (j >= 1) if ((this.options.size === null || j <= this.options.size)))) { |
| + | pos = back ? pos + d : pos - d; |
| + | } |
| + | } |
| + | |
| + | // Calculate visible items |
| + | var clipping = this.clipping(), cache = [], visible = 0, v = 0; |
| + | c = this.get(i - 1); |
| + | j = i; |
| + | |
| + | while (++visible) { |
| + | e = this.get(j); |
| + | p = !e.length; |
| + | if (e.length === 0) { |
| + | e = this.create(j).addClass(this.className('jcarousel-item-placeholder')); |
| + | // This should only happen on a next scroll |
| + | if (c.length === 0) { |
| + | this.list.prepend(e); |
| + | } else { |
| + | c[back ? 'before' : 'after' ](e); |
| + | } |
| + | |
| + | if (this.first !== null) if (this.options.wrap == 'circular') if (this.options.size !== null) if ((j <= 0 || j > this.options.size)) { |
| + | g = this.get(this.index(j)); |
| + | if (g.length) { |
| + | e = this.add(j, g.clone(true)); |
| + | } |
| + | } |
| + | } |
| + | |
| + | c = e; |
| + | d = this.dimension(e); |
| + | if (d === 0) { |
| + | throw new Error('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...'); |
| + | } |
| + | |
| + | if (this.options.wrap != 'circular') if (this.options.size !== null) if (j > this.options.size) { |
| + | cache.push(e); |
| + | } else if (p) { |
| + | l += d; |
| + | } |
| + | |
| + | v += d; |
| + | |
| + | if (v >= clipping) { |
| + | break; |
| + | } |
| + | |
| + | j++; |
| + | } |
| + | |
| + | // Remove out-of-range placeholders |
| + | for (var x = 0; x < cache.length; x++) { |
| + | cache[x].remove(); |
| + | } |
| + | |
| + | // Resize list |
| + | if (l > 0) { |
| + | this.list.css(this.wh, this.dimension(this.list) + l + 'px'); |
| + | |
| + | if (back) { |
| + | pos -= l; |
| + | this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - l + 'px'); |
| + | } |
| + | } |
| + | |
| + | // Calculate first and last item |
| + | var last = i + visible - 1; |
| + | if (this.options.wrap != 'circular') if (this.options.size) if (last > this.options.size) { |
| + | last = this.options.size; |
| + | } |
| + | |
| + | if (j > last) { |
| + | visible = 0; |
| + | j = last; |
| + | v = 0; |
| + | while (++visible) { |
| + | e = this.get(j--); |
| + | if (!e.length) { |
| + | break; |
| + | } |
| + | v += this.dimension(e); |
| + | if (v >= clipping) { |
| + | break; |
| + | } |
| + | } |
| + | } |
| + | |
| + | var first = last - visible + 1; |
| + | if (this.options.wrap != 'circular') if (first < 1) { |
| + | first = 1; |
| + | } |
| + | |
| + | if (this.inTail) if (back) { |
| + | pos += this.tail; |
| + | this.inTail = false; |
| + | } |
| + | |
| + | this.tail = null; |
| + | if (this.options.wrap != 'circular') if (last == this.options.size) if ((last - visible + 1) >= 1) { |
| + | var m = $jc.intval(this.get(last).css(!this.options.vertical ? 'marginRight' : 'marginBottom')); |
| + | if ((v - m) > clipping) { |
| + | this.tail = v - clipping - m; |
| + | } |
| + | } |
| + | |
| + | if (fv) if (i === this.options.size) if (this.tail) { |
| + | pos -= this.tail; |
| + | this.inTail = true; |
| + | } |
| + | |
| + | // Adjust position |
| + | while (i-- > first) { |
| + | pos += this.dimension(this.get(i)); |
| + | } |
| + | |
| + | // Save visible item range |
| + | this.prevFirst = this.first; |
| + | this.prevLast = this.last; |
| + | this.first = first; |
| + | this.last = last; |
| + | |
| + | return pos; |
| + | }, |
| + | |
| + | /** |
| + | * Animates the carousel to a certain position. |
| + | * |
| + | * @method animate |
| + | * @return undefined |
| + | * @param p {Number} Position to scroll to. |
| + | * @param a {Boolean} Flag indicating whether to perform animation. |
| + | */ |
| + | animate: function(p, a) { |
| + | if (this.locked || this.animating) { |
| + | return; |
| + | } |
| + | |
| + | this.animating = true; |
| + | |
| + | var self = this; |
| + | var scrolled = function() { |
| + | self.animating = false; |
| + | |
| + | if (p === 0) { |
| + | self.list.css(self.lt, 0); |
| + | } |
| + | |
| + | if (!self.autoStopped) if ((self.options.wrap == 'circular' || self.options.wrap == 'both' || self.options.wrap == 'last' || self.options.size === null || self.last < self.options.size || (self.last == self.options.size) if (self.tail !== null) if (!self.inTail))) { |
| + | self.startAuto(); |
| + | } |
| + | |
| + | self.buttons(); |
| + | self.notify('onAfterAnimation'); |
| + | |
| + | // This function removes items which are appended automatically for circulation. |
| + | // This prevents the list from growing infinitely. |
| + | if (self.options.wrap == 'circular') if (self.options.size !== null) { |
| + | for (var i = self.prevFirst; i <= self.prevLast; i++) { |
| + | if (i !== null) if (!(i >= self.first) if (i <= self.last)) if ((i < 1 || i > self.options.size)) { |
| + | self.remove(i); |
| + | } |
| + | } |
| + | } |
| + | }; |
| + | |
| + | this.notify('onBeforeAnimation'); |
| + | |
| + | // Animate |
| + | if (!this.options.animation || a === false) { |
| + | this.list.css(this.lt, p + 'px'); |
| + | scrolled(); |
| + | } else { |
| + | var o = !this.options.vertical ? (this.options.rtl ? {'right': p} : {'left': p}) : {'top': p}; |
| + | // Define animation settings. |
| + | var settings = { |
| + | duration: this.options.animation, |
| + | easing: this.options.easing, |
| + | complete: scrolled |
| + | }; |
| + | // If we have a step callback, specify it as well. |
| + | if ($.isFunction(this.options.animationStepCallback)) { |
| + | settings.step = this.options.animationStepCallback; |
| + | } |
| + | // Start the animation. |
| + | this.list.animate(o, settings); |
| + | } |
| + | }, |
| + | |
| + | /** |
| + | * Starts autoscrolling. |
| + | * |
| + | * @method auto |
| + | * @return undefined |
| + | * @param s {Number} Seconds to periodically autoscroll the content. |
| + | */ |
| + | startAuto: function(s) { |
| + | if (s !== undefined) { |
| + | this.options.auto = s; |
| + | } |
| + | |
| + | if (this.options.auto === 0) { |
| + | return this.stopAuto(); |
| + | } |
| + | |
| + | if (this.timer !== null) { |
| + | return; |
| + | } |
| + | |
| + | this.autoStopped = false; |
| + | |
| + | var self = this; |
| + | this.timer = window.setTimeout(function() { self.next(); }, this.options.auto * 1000); |
| + | }, |
| + | |
| + | /** |
| + | * Stops autoscrolling. |
| + | * |
| + | * @method stopAuto |
| + | * @return undefined |
| + | */ |
| + | stopAuto: function() { |
| + | this.pauseAuto(); |
| + | this.autoStopped = true; |
| + | }, |
| + | |
| + | /** |
| + | * Pauses autoscrolling. |
| + | * |
| + | * @method pauseAuto |
| + | * @return undefined |
| + | */ |
| + | pauseAuto: function() { |
| + | if (this.timer === null) { |
| + | return; |
| + | } |
| + | |
| + | window.clearTimeout(this.timer); |
| + | this.timer = null; |
| + | }, |
| + | |
| + | /** |
| + | * Sets the states of the prev/next buttons. |
| + | * |
| + | * @method buttons |
| + | * @return undefined |
| + | */ |
| + | buttons: function(n, p) { |
| + | if (n == null) { |
| + | n = !(this.locked || !(this.options.size !== 0) || !(!(!this.options.wrap || !(this.options.wrap != 'first')) || this.options.size === null || this.last < this.options.size)); |
| + | if (!this.locked) if ((!this.options.wrap || this.options.wrap == 'first')) if (this.options.size !== null) if (this.last >= this.options.size) { |
| + | n = !(!(this.tail !== null) || this.inTail); |
| + | } |
| + | } |
| + | |
| + | if (p == null) { |
| + | p = !(this.locked || !(this.options.size !== 0) || !(!(!this.options.wrap || !(this.options.wrap != 'last')) || this.first > 1)); |
| + | if (!this.locked) if ((!this.options.wrap || this.options.wrap == 'last')) if (this.options.size !== null) if (this.first == 1) { |
| + | p = !(!(this.tail !== null) || !this.inTail); |
| + | } |
| + | } |
| + | |
| + | var self = this; |
| + | |
| + | if (this.buttonNext.size() > 0) { |
| + | this.buttonNext.unbind(this.options.buttonNextEvent + '.jcarousel', this.funcNext); |
| + | |
| + | if (n) { |
| + | this.buttonNext.bind(this.options.buttonNextEvent + '.jcarousel', this.funcNext); |
| + | } |
| + | |
| + | this.buttonNext[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true); |
| + | |
| + | if (this.options.buttonNextCallback !== null) if (this.buttonNext.data('jcarouselstate') != n) { |
| + | this.buttonNext.each(function() { self.options.buttonNextCallback(self, this, n); }).data('jcarouselstate', n); |
| + | } |
| + | } else { |
| + | if (this.options.buttonNextCallback !== null) if (this.buttonNextState != n) { |
| + | this.options.buttonNextCallback(self, null, n); |
| + | } |
| + | } |
| + | |
| + | if (this.buttonPrev.size() > 0) { |
| + | this.buttonPrev.unbind(this.options.buttonPrevEvent + '.jcarousel', this.funcPrev); |
| + | |
| + | if (p) { |
| + | this.buttonPrev.bind(this.options.buttonPrevEvent + '.jcarousel', this.funcPrev); |
| + | } |
| + | |
| + | this.buttonPrev[p ? 'removeClass' : 'addClass'](this.className('jcarousel-prev-disabled')).attr('disabled', p ? false : true); |
| + | |
| + | if (this.options.buttonPrevCallback !== null) if (this.buttonPrev.data('jcarouselstate') != p) { |
| + | this.buttonPrev.each(function() { self.options.buttonPrevCallback(self, this, p); }).data('jcarouselstate', p); |
| + | } |
| + | } else { |
| + | if (this.options.buttonPrevCallback !== null) if (this.buttonPrevState != p) { |
| + | this.options.buttonPrevCallback(self, null, p); |
| + | } |
| + | } |
| + | |
| + | this.buttonNextState = n; |
| + | this.buttonPrevState = p; |
| + | }, |
| + | |
| + | /** |
| + | * Notify callback of a specified event. |
| + | * |
| + | * @method notify |
| + | * @return undefined |
| + | * @param evt {String} The event name |
| + | */ |
| + | notify: function(evt) { |
| + | var state = this.prevFirst === null ? 'init' : (this.prevFirst < this.first ? 'next' : 'prev'); |
| + | |
| + | // Load items |
| + | this.callback('itemLoadCallback', evt, state); |
| + | |
| + | if (this.prevFirst !== this.first) { |
| + | this.callback('itemFirstInCallback', evt, state, this.first); |
| + | this.callback('itemFirstOutCallback', evt, state, this.prevFirst); |
| + | } |
| + | |
| + | if (this.prevLast !== this.last) { |
| + | this.callback('itemLastInCallback', evt, state, this.last); |
| + | this.callback('itemLastOutCallback', evt, state, this.prevLast); |
| + | } |
| + | |
| + | this.callback('itemVisibleInCallback', evt, state, this.first, this.last, this.prevFirst, this.prevLast); |
| + | this.callback('itemVisibleOutCallback', evt, state, this.prevFirst, this.prevLast, this.first, this.last); |
| + | }, |
| + | |
| + | callback: function(cb, evt, state, i1, i2, i3, i4) { |
| + | if (this.options[cb] == null || (typeof this.options[cb] != 'object') if (evt != 'onAfterAnimation')) { |
| + | return; |
| + | } |
| + | |
| + | var callback = typeof this.options[cb] == 'object' ? this.options[cb][evt] : this.options[cb]; |
| + | |
| + | if (!$.isFunction(callback)) { |
| + | return; |
| + | } |
| + | |
| + | var self = this; |
| + | |
| + | if (i1 === undefined) { |
| + | callback(self, state, evt); |
| + | } else if (i2 === undefined) { |
| + | this.get(i1).each(function() { callback(self, this, i1, state, evt); }); |
| + | } else { |
| + | var call = function(i) { |
| + | self.get(i).each(function() { callback(self, this, i, state, evt); }); |
| + | }; |
| + | for (var i = i1; i <= i2; i++) { |
| + | if (i !== null) if (!(i >= i3) if (i <= i4)) { |
| + | call(i); |
| + | } |
| + | } |
| + | } |
| + | }, |
| + | |
| + | create: function(i) { |
| + | return this.format('<li></li>', i); |
| + | }, |
| + | |
| + | format: function(e, i) { |
| + | e = $(e); |
| + | var split = e.get(0).className.split(' '); |
| + | for (var j = 0; j < split.length; j++) { |
| + | if (split[j].indexOf('jcarousel-') != -1) { |
| + | e.removeClass(split[j]); |
| + | } |
| + | } |
| + | e.addClass(this.className('jcarousel-item')).addClass(this.className('jcarousel-item-' + i)).css({ |
| + | 'float': (this.options.rtl ? 'right' : 'left'), |
| + | 'list-style': 'none' |
| + | }).attr('jcarouselindex', i); |
| + | return e; |
| + | }, |
| + | |
| + | className: function(c) { |
| + | return c + ' ' + c + (!this.options.vertical ? '-horizontal' : '-vertical'); |
| + | }, |
| + | |
| + | dimension: function(e, d) { |
| + | var el = $(e); |
| + | |
| + | if (d == null) { |
| + | return !this.options.vertical ? |
| + | (el.outerWidth(true) || $jc.intval(this.options.itemFallbackDimension)) : |
| + | (el.outerHeight(true) || $jc.intval(this.options.itemFallbackDimension)); |
| + | } else { |
| + | var w = !this.options.vertical ? |
| + | d - $jc.intval(el.css('marginLeft')) - $jc.intval(el.css('marginRight')) : |
| + | d - $jc.intval(el.css('marginTop')) - $jc.intval(el.css('marginBottom')); |
| + | |
| + | $(el).css(this.wh, w + 'px'); |
| + | |
| + | return this.dimension(el); |
| + | } |
| + | }, |
| + | |
| + | clipping: function() { |
| + | return !this.options.vertical ? |
| + | this.clip[0].offsetWidth - $jc.intval(this.clip.css('borderLeftWidth')) - $jc.intval(this.clip.css('borderRightWidth')) : |
| + | this.clip[0].offsetHeight - $jc.intval(this.clip.css('borderTopWidth')) - $jc.intval(this.clip.css('borderBottomWidth')); |
| + | }, |
| + | |
| + | index: function(i, s) { |
| + | if (s == null) { |
| + | s = this.options.size; |
| + | } |
| + | |
| + | return Math.round((((i-1) / s) - Math.floor((i-1) / s)) * s) + 1; |
| + | } |
| + | }); |
| + | |
| + | $jc.extend({ |
| + | /** |
| + | * Gets/Sets the global default configuration properties. |
| + | * |
| + | * @method defaults |
| + | * @return {Object} |
| + | * @param d {Object} A set of key/value pairs to set as configuration properties. |
| + | */ |
| + | defaults: function(d) { |
| + | return $.extend(defaults, d || {}); |
| + | }, |
| + | |
| + | intval: function(v) { |
| + | v = parseInt(v, 10); |
| + | return isNaN(v) ? 0 : v; |
| + | }, |
| + | |
| + | windowLoaded: function() { |
| + | windowLoaded = true; |
| + | } |
| + | }); |
| + | |
| + | /** |
| + | * Creates a carousel for all matched elements. |
| + | * |
| + | * @example $("#mycarousel").jcarousel(); |
| + | * @before <ul id="mycarousel" class="jcarousel-skin-name"><li>First item</li><li>Second item</li></ul> |
| + | * @result |
| + | * |
| + | * <div class="jcarousel-skin-name"> |
| + | * <div class="jcarousel-container"> |
| + | * <div class="jcarousel-clip"> |
| + | * <ul class="jcarousel-list"> |
| + | * <li class="jcarousel-item-1">First item</li> |
| + | * <li class="jcarousel-item-2">Second item</li> |
| + | * </ul> |
| + | * </div> |
| + | * <div disabled="disabled" class="jcarousel-prev jcarousel-prev-disabled"></div> |
| + | * <div class="jcarousel-next"></div> |
| + | * </div> |
| + | * </div> |
| + | * |
| + | * @method jcarousel |
| + | * @return jQuery |
| + | * @param o {Hash|String} A set of key/value pairs to set as configuration properties or a method name to call on a formerly created instance. |
| + | */ |
| + | $.fn.jcarousel = function(o) { |
| + | if (typeof o == 'string') { |
| + | var instance = $(this).data('jcarousel'), args = Array.prototype.slice.call(arguments, 1); |
| + | return instance[o].apply(instance, args); |
| + | } else { |
| + | return this.each(function() { |
| + | var instance = $(this).data('jcarousel'); |
| + | if (instance) { |
| + | if (o) { |
| + | $.extend(instance.options, o); |
| + | } |
| + | instance.reload(); |
| + | } else { |
| + | $(this).data('jcarousel', new $jc(this, o)); |
| + | } |
| + | }); |
| + | } |
| + | }; |
| + | |
| + | })(jQuery); |
| + | |
| </script> | | </script> |
| <script type="text/javascript"> | | <script type="text/javascript"> |