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