﻿var Slider=new Class.create({settings:{base:{hostCSS:"cs-host",contentCSS:"cs-content",slidecontainerCSS:"cs-inner",slideCSS:"cs-image",navigationCSS:"cs-navigation"},thumbs:{hostCSS:"cs-thumbnals",contentCSS:"cs-content",slidecontainerCSS:"cs-inner",slideCSS:"cs-image",navigationCSS:"cs-navigation",effect:"scroll",transition:"sinoidal",transform:"none"}},initialize:function(host,options,flag){try{if(this.host=$(host),!this.host){return false}this.options={width:0,height:0,auto:false,pause:3,duration:1,circular:false,effect:"scroll",transition:"sinoidal",navigation:"none",transform:"resize",ratio:0.15};this.thumbnail=Boolean(flag);this.options=Object.extend(this.options,options||{});if(!this.thumbnail){Object.extend(this.options,this.settings.base);if(this.options.thumbnails){Object.extend(this.options.thumbnails,this.settings.thumbs)}}if(!this.host.hasClassName(this.options.hostCSS)){return false}if(this.content=this.host.down("."+this.options.contentCSS),!this.content){return false}this.slidecontainer=this.content.down("."+this.options.slidecontainerCSS);if(!this.slidecontainer){this.slidecontainer=new Element("div",{className:this.options.slidecontainerCSS});this.content.descendants().each(function(item){this.slidecontainer.insert(item.remove())},this);this.content.insert({top:this.slidecontainer})}this.slidecontainer.cleanWhitespace();this.dimensions={width:this.options.width||0,height:this.options.height||0};this.Slides=this.slidecontainer.descendants().inject([],function(list,item,index){if(item=new Slide(this,item,index),item){list.push(item)}return list},this);if(["show","popup"].indexOf(this.options.navigation)>=0){this.navigation={};this.navigation.prev=this.createNavigationControl(this.host,"prev"+(this.thumbnail?"page":""));this.navigation.next=this.createNavigationControl(this.host,"next"+(this.thumbnail?"page":""))}if(!this.Validate()){this.slidecontainer.update("No slides found!");return false}this.host.observe("transition::start",this.transitionStarted.bind(this));this.host.observe("transition::finish",this.transitionFinished.bind(this));this.host.observe("click",function(e){e.ctrlKey&&(this.stop())}.bindAsEventListener(this));Event.observe(window,"resize",this.Reposition.bind(this));if(this.thumbnail){this.host.observe("scroll::start",this.scrollStarted.bind(this));this.host.observe("scroll::finish",this.scrollFinished.bind(this))}if(this.options.thumbnails){this.createThumbnails(this.host,this.options.thumbnails)}this.host.setStyle({visibility:"visible"});this.select(this.options.initial||0)}catch(ex){alert(ex.message)}},Validate:function(){if(!this.Slides||!this.Slides.length){return false}this.host.setStyle({width:this.dimensions.width+"px"});this.content.setStyle({width:this.dimensions.width+"px",height:this.dimensions.height+"px"});if(this.options.effect=="fade"){this.slidecontainer.setStyle({width:"auto"})}if(this.options.effect=="scroll"){if(this.thumbnail){this.slidecontainer.setStyle({width:this.getCumulativeSize("width")*1.5+"px"})}else{this.slidecontainer.setStyle({width:this.getCumulativeSize("width")+"px"})}}this.Reposition();if(this.thumbnail){this.frames={max:this.getCumulativeSize("width")/this.dimensions.width,current:0}}return true},createNavigationControl:function(container,type){var ctrl,type,dim;ctrl=container.insert('<div href="javascript:void(0)">&nbsp;</div>').descendants().last();ctrl.writeAttribute("rel",type);ctrl.addClassName([this.options.navigationCSS,type].join(" ")).setStyle({position:"absolute"});ctrl.Reposition=function(){var d=container.getDimensions();var o=container.cumulativeOffset();this.setStyle({left:(o.left+(type.startsWith("next")?(d.width-this.getWidth()):0))+"px",top:(o.top+((d.height-this.getHeight())/2))+"px"})}.bind(ctrl);ctrl.observe("click",this.navigate.bindAsEventListener(this,this.thumbnail));if(this.options.navigation!="show"){ctrl.hide();container.observe("mouseover",function(){ctrl.show()});container.observe("mouseout",function(){ctrl.hide()})}return ctrl},createThumbnails:function(container,options){container.insert({after:'<div class="#{hostCSS}" style="visibility:hidden;"><div class="#{contentCSS}"><div class="#{slidecontainerCSS}"></div></div></div>'.interpolate(options)});container=container.next();container.writeAttribute("thumbnail",true);var thumbs=container.down("."+options.slidecontainerCSS);this.Slides.each(function(slide){var thumb;thumbs.insert(thumb=slide.GetThumbnail(options));thumb.observe("click",function(e,index){Event.stop(e);this.select(index)}.bindAsEventListener(this,slide.index))},this);options.width=this.dimensions.width;this.thumbnailSlider=new Slider(container,options,true)},Reposition:function(e){this.Slides.invoke("Reposition",this.current);if(this.navigation){[this.navigation.prev,this.navigation.next].invoke("Reposition")}},getCumulativeSize:function(dimension){return this.Slides.pluck(dimension).inject(0,function(total,n){return total+=n})},updateThumbnails:function(){if(!this.thumbnailSlider){return}this.thumbnailSlider.Slides[this.current.index].Activate()},start:function(index){this.stop();if(Object.isNumber(index)){this.move(index)}if(this.options.auto){this.timer=new PeriodicalExecuter(this.move.bind(this,"next"),this.options.pause)}},stop:function(complete){if(this.timer&&Object.isFunction(this.timer.stop)){this.timer.stop();delete this.timer}this.timer=complete},navigate:function(event){this.stop();var command=event.element().readAttribute("rel");if(!this.scrolling&&(["next","prev","nextpage","prevpage"].indexOf(command)>=0)){this.move(event.ctrlKey?(command=="next"?"last":"first"):command)}event.stop()},select:function(index){this.stop();this.move(index);this.start()},move:function(index){this.previous=this.current;if(Object.isString(index)){index=index.toLowerCase();if(index=="last"){index=this.Slides.length-1}else{if(index=="first"){index=0}else{if(index=="next"){index=this.current.index+((this.current.index==this.Slides.length-1)?(this.options.circular?this.current.index*-1:0):1)}else{if(index=="prev"){index=this.current.index+((this.current.index==0)?(this.options.circular?this.Slides.length-1:0):-1)}else{if(index=="nextpage"){if(this.frames.current<this.frames.max-1){this.frames.current+=1}this.scroll(this.frames.current);return}else{if(index=="prevpage"){if(this.frames.current>0){this.frames.current-=1}this.scroll(this.frames.current);return}}}}}}}if(Object.isUndefined(index)||index<0||index>=this.Slides.length){index=this.current.index}this.show(this.current=this.Slides[index])},transitionStarted:function(){if(this.options.beforeMove&&(typeof this.options.beforeMove=="function")){this.options.beforeMove.call(this)}this.updateThumbnails()},transitionFinished:function(){this.scrolling&&(delete this.scrolling);if(this.options.afterMove&&(typeof this.options.afterMove=="function")){this.options.afterMove.call(this)}if(this.timer&&!this.options.circular&&this.options.auto&&this.current.index==this.Slides.length-1){this.stop("complete")}this.start()},show:function(element){if(this.moving){this.scrolling.cancel()}if(this.scrolling){this.scrolling.cancel()}this.host.fire("transition::start");var scrollerOffset=this.content.cumulativeOffset();var elementOffset=this.current.item.cumulativeOffset();if(this.previous==this.current){return false}switch(this.options.effect){case"fade":if(this.previous){new Effect.Opacity(this.previous.item,{from:1,to:0,duration:this.options.duration})}this.scrolling=new Effect.Opacity(this.current.item,{from:0,to:1,duration:this.options.duration,afterFinish:function(){this.host.fire("transition::finish")}.bind(this)});break;case"scroll":default:this.scrolling=new Effect.SmoothScroll(this.content,{duration:this.options.duration,x:(elementOffset[0]-scrollerOffset[0]),y:(elementOffset[1]-scrollerOffset[1]),transition:function(transition){switch(transition){case"spring":return Effect.Transitions.spring;case"sinoidal":default:return Effect.Transitions.sinoidal}}(this.options.transition),afterFinish:function(){this.host.fire("transition::finish")}.bind(this)});break}return false},scrollStarted:function(){},scrollFinished:function(){this.scrolling&&(delete this.scrolling)},scroll:function(delta){this.host.fire("scroll::start");var scrollerOffset=this.content.cumulativeOffset();var elementOffset=[scrollerOffset[0]+this.dimensions.width*delta,scrollerOffset[1]+0];this.scrolling=new Effect.SmoothScroll(this.content,{duration:this.options.duration,x:(elementOffset[0]-scrollerOffset[0]),y:(elementOffset[1]-scrollerOffset[1]),transition:Effect.Transitions.sinoidal,afterFinish:function(){this.host.fire("scroll::finish")}.bind(this)})}});var Slide=Class.create({initialize:function(parent,item,index){if(!/img/i.test(item.tagName)){return false}this.parent=parent;this.item=item;this.index=index;this.item.className=this.parent.options.slideCSS;Object.extend(this,this.item.getDimensions());!this.parent.dimensions.width&&(this.parent.dimensions.width=this.width);!this.parent.dimensions.height&&(this.parent.dimensions.height=this.height);if(this.parent.options.transform!=="none"){this.width=this.parent.dimensions.width;this.height=this.parent.dimensions.height}if(this.parent.options.transform=="clip"){this.item.setStyle({clip:"rect(0px #{width}px #{height}px 0px)".interpolate(this)})}else{if(this.parent.options.transform=="resize"){this.item.setStyle({width:this.width+"px",height:this.height+"px"})}}},Reposition:function(active){var IsCurrent=active&&active.index==this.index;if(this.parent.options.effect=="fade"){this.item.up(1).absolutize();this.item.absolutize().clonePosition(this.item.up(1),{setWidth:false,setHeight:false}).setStyle({opacity:IsCurrent?1:0});this.item.up(1).relativize()}},CalculateThumbnailDemensions:function(){},GetThumbnail:function(options){thumb=this.item.cloneNode(true);var ratio=parseInt("0"+options.ratio,10)||0.15;thumb.writeAttribute("style","");thumb.setStyle({width:this.width*ratio+"px",height:this.height*ratio+"px"});return thumb},Activate:function(){this.parent.Slides.invoke("Deactivate");this.item.addClassName("cs-active")},Deactivate:function(){this.item.removeClassName("cs-active")},IsVisible:function(){var scrollerOffset=this.parent.content.cumulativeOffset();var elementOffset=this.item.cumulativeOffset();elementOffset[0]-=this.parent.content.scrollLeft;if(elementOffset[0]<scrollerOffset[0]){return -1}else{if(elementOffset[0]+this.item.getWidth()>this.parent.content.getWidth()+scrollerOffset[0]){return 1}}return 0}});Effect.SmoothScroll=Class.create(Effect.Base.prototype,{initialize:function(element){this.element=$(element);var options=Object.extend({x:0,y:0,mode:"absolute"},arguments[1]||{});this.start(options)},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(position){this.element.scrollLeft=this.options.x*position+this.originalLeft;this.element.scrollTop=this.options.y*position+this.originalTop}});
