Carousel=Class.create(Abstract,{initialize:function(a,d,b,c){this.scrolling=false;this.scroller=$(a);this.slides=d;this.controls=b;this.options=Object.extend({duration:1,auto:false,frequency:3,visibleSlides:1,controlClassName:"carousel-control",jumperClassName:"carousel-jumper",disabledClassName:"carousel-disabled",selectedClassName:"carousel-selected",circular:false,wheel:true,effect:"scroll",transition:"sinoidal",resumeAutoAfterClick:0},c||{});if(this.options.effect=="fade"){this.options.circular=true}this.slides.each(function(f,g){f._index=g});if(this.controls){this.controls.invoke("observe","click",this.click.bind(this))}if(this.options.wheel){this.scroller.observe("mousewheel",this.wheel.bindAsEventListener(this)).observe("DOMMouseScroll",this.wheel.bindAsEventListener(this))}if(this.options.auto){this.start()}if(this.options.initial){var e=this.slides.indexOf($(this.options.initial));if(e>(this.options.visibleSlides-1)&&this.options.visibleSlides>1){if(e>this.slides.length-(this.options.visibleSlides+1)){e=this.slides.length-this.options.visibleSlides}}this.moveTo(this.slides[e])}},click:function(event){this.stop();var element=event.findElement("a");if(!element.hasClassName(this.options.disabledClassName)){if(element.hasClassName(this.options.controlClassName)){eval("this."+element.rel+"()")}else{if(element.hasClassName(this.options.jumperClassName)){this.moveTo(element.rel);if(this.options.selectedClassName){this.controls.invoke("removeClassName",this.options.selectedClassName);element.addClassName(this.options.selectedClassName)}}}}if(this.options.resumeAutoAfterClick&&this.options.auto){afterClickTimer=setTimeout(this.start.bind(this),this.options.resumeAutoAfterClick*1000)}this.deactivateControls();event.stop()},moveTo:function(b){if(this.options.beforeMove&&(typeof this.options.beforeMove=="function")){this.options.beforeMove()}this.previous=this.current?this.current:this.slides[0];this.current=$(b);var c=this.scroller.cumulativeOffset();var a=this.current.cumulativeOffset();if(this.scrolling){this.scrolling.cancel()}switch(this.options.effect){case"fade":this.scrolling=new Effect.Opacity(this.scroller,{from:1,to:0,duration:this.options.duration,afterFinish:(function(){this.scroller.scrollLeft=a[0]-c[0];this.scroller.scrollTop=a[1]-c[1];new Effect.Opacity(this.scroller,{from:0,to:1,duration:this.options.duration,afterFinish:(function(){if(this.controls){this.activateControls()}if(this.options.afterMove&&(typeof this.options.afterMove=="function")){this.options.afterMove()}}).bind(this)})}).bind(this)});break;case"scroll":default:var d;switch(this.options.transition){case"spring":d=Effect.Transitions.spring;break;case"sinoidal":default:d=Effect.Transitions.sinoidal;break}this.scrolling=new Effect.SmoothScroll(this.scroller,{duration:this.options.duration,x:(a[0]-c[0]),y:(a[1]-c[1]),transition:d,afterFinish:(function(){if(this.controls){this.activateControls()}if(this.options.afterMove&&(typeof this.options.afterMove=="function")){this.options.afterMove()}this.scrolling=false}).bind(this)});break}return false},prev:function(){if(this.current){var a=this.current._index;var b=(a==0)?(this.options.circular?this.slides.length-1:0):a-1}else{var b=(this.options.circular?this.slides.length-1:0)}if(b==(this.slides.length-1)&&this.options.circular&&this.options.effect!="fade"){this.scroller.scrollLeft=(this.slides.length-1)*this.slides.first().getWidth();this.scroller.scrollTop=(this.slides.length-1)*this.slides.first().getHeight();b=this.slides.length-2}this.moveTo(this.slides[b])},next:function(){if(this.current){var b=this.current._index;var a=(this.slides.length-1==b)?(this.options.circular?0:b):b+1}else{var a=1}if(a==0&&this.options.circular&&this.options.effect!="fade"){this.scroller.scrollLeft=0;this.scroller.scrollTop=0;a=1}if(a>this.slides.length-(this.options.visibleSlides+1)){a=this.slides.length-this.options.visibleSlides}this.moveTo(this.slides[a])},first:function(){this.moveTo(this.slides[0])},last:function(){this.moveTo(this.slides[this.slides.length-1])},toggle:function(){if(this.previous){this.moveTo(this.slides[this.previous._index])}else{return false}},stop:function(){if(this.timer){clearTimeout(this.timer)}},start:function(){this.periodicallyUpdate()},pause:function(){this.stop();this.activateControls()},resume:function(a){if(a){var b=a.relatedTarget||a.toElement;if(!b||(!this.slides.include(b)&&!this.slides.any(function(c){return b.descendantOf(c)}))){this.start()}}else{this.start()}},periodicallyUpdate:function(){if(this.timer!=null){clearTimeout(this.timer);this.next()}this.timer=setTimeout(this.periodicallyUpdate.bind(this),this.options.frequency*1000)},wheel:function(a){a.cancelBubble=true;a.stop();var b=0;if(!a){a=window.event}if(a.wheelDelta){b=a.wheelDelta/120}else{if(a.detail){b=-a.detail/3}}if(!this.scrolling){this.deactivateControls();if(b>0){this.prev()}else{this.next()}}return Math.round(b)},deactivateControls:function(){this.controls.invoke("addClassName",this.options.disabledClassName)},activateControls:function(){this.controls.invoke("removeClassName",this.options.disabledClassName)}});Effect.SmoothScroll=Class.create();Object.extend(Object.extend(Effect.SmoothScroll.prototype,Effect.Base.prototype),{initialize:function(b){this.element=$(b);var a=Object.extend({x:0,y:0,mode:"absolute"},arguments[1]||{});this.start(a)},setup:function(){if(this.options.continuous&&!this.element._ext){this.element.cleanWhitespace();this.element._ext=true;this.element.appendChild(this.element.firstChild)}this.originalLeft=this.element.scrollLeft;this.originalTop=this.element.scrollTop;if(this.options.mode=="absolute"){this.options.x-=this.originalLeft;this.options.y-=this.originalTop}},update:function(a){this.element.scrollLeft=this.options.x*a+this.originalLeft;this.element.scrollTop=this.options.y*a+this.originalTop}});
