﻿/*  ProtoShow JavaScript slide show, 
 *	v 1.0 - March 18, 2010
 *  Copyright(c) 2010 David Smith (web: http://www.aheadcreative.com; twitter: @get_dave)
 *
 *  This work is licenced under the Creative Commons Attribution-No Derivative Works 3.0 Unported License. 
 *	http://creativecommons.org/licenses/by-nd/3.0/ 
 *  
 *	For more information on this project visit:
 *	http://www.protoshow.net
 *
 *--------------------------------------------------------------------------*/
var protoShow=Class.create({initialize:function(element,options){this.options=Object.extend({selector:".slide",interval:3000,initialSlide:1,mode:'forward',autoplay:true,autoRestart:true,transitionTime:1.5,manTransitionTime:0.5,stopText:"Pause",playText:"Play",forwardText:"Next",previousText:"Previous",buildNavigation:true,navElements:".proto-navigation li",buildControls:false,stopOnHover:false,captions:false,captionsElement:'.slide-caption'},options||{});this.element=$(element);this.slides=this.element.select(this.options.selector);this.interval=this.options.interval;this.slideID=this.options.initialSlide-1;this.initialElement=this.slides[this.slideID];this.autoplay=this.options.autoplay;this.autoRestart=this.options.autoRestart;this.restart=false;this.mode=this[this.options.mode];this.transitionTime=this.options.transitionTime;this.manTransitionTime=this.options.manTransitionTime;this.stopOnHover=this.options.stopOnHover;this.stopText=this.options.stopText;this.playText=this.options.playText;this.captions=this.options.captions;this.captionsElement=$$(this.options.captionsElement)[0];this.navElements=this.options.navElements;if((this.slides.size()>1)){this.slidesLength=this.slides.size();this.animating=false;this.createControls();this.createNavigation();this.slides.invoke('hide');this.initialElement.show().addClassName('active-slide');this.createCaptions();this.pauseOnHover();this.isPlaying=false;this.updateControls();if(this.autoplay){this.play(this.mode);}}},clearTimer:function(){clearTimeout(this.runShow);},play:function(){if(this.runShow){this.clearTimer();}
this.runShow=setTimeout(this.mode.bind(this),this.interval);this.isPlaying=true;this.updateControls(true);},stop:function(){document.fire("protoShow:stopped");this.clearTimer();this.isPlaying=false;this.updateControls(false);},forward:function(){this.goMaster(this.slideID+1);},backward:function(){this.goMaster(this.slideID-1);},random:function(){var randomnumber=Math.floor(Math.random()*this.slidesLength);if(randomnumber==this.slideID){randomnumber++;}
this.goMaster(randomnumber);},goForward:function(){this.clearTimer();var storeTransition=this.transitionTime;this.transitionTime=this.manTransitionTime;if(!this.autoRestart){this.noRestart=true;this.forward();this.stop();}else{this.forward();}
if(this.options.mode!="random"){this.mode=this.forward;}
this.transitionTime=storeTransition;},goBackward:function(){this.clearTimer();var storeTransition=this.transitionTime;this.transitionTime=this.manTransitionTime;if(!this.autoRestart){this.noRestart=true;this.backward();this.stop();}else{this.backward();}
if(this.options.mode!="random"){this.mode=this.backward;}
this.transitionTime=storeTransition;},goToSlide:function(slide){this.clearTimer();var storeTransition=this.transitionTime;this.transitionTime=this.manTransitionTime;var targetSlide=slide;this.goMaster(targetSlide);this.transitionTime=storeTransition;},goMaster:function(imageShow){var imageShow=imageShow;var imageHide=this.slideID;if((imageShow!=imageHide)&&(!this.animating)){if(imageShow>=this.slidesLength){this.swapSlide(imageHide,0);this.slideID=0;}else if(imageShow<0){this.swapSlide(imageHide,this.slidesLength-1);this.slideID=this.slidesLength-1;}else{this.swapSlide(imageHide,imageShow);this.slideID=imageShow;}}},swapSlide:function(x,y){var activeSlide=this.slides[x];var nextSlide=this.slides[y];this.animating=true;nextSlide.show();activeSlide.fade({beforeStart:function(){document.fire("protoShow:transitionStarted");this.element.addClassName("animating");}.bind(this),duration:this.transitionTime,afterFinish:this.cleanup.bind(this,activeSlide,nextSlide)});this.updateNav(x,y);this.updateCaptions(y);},cleanup:function(active,next){document.fire("protoShow:transitionFinished");$(active).removeClassName('active-slide');$(next).addClassName('active-slide');this.element.removeClassName("animating");this.animating=false;if((!this.noRestart)&&(this.isPlaying!=false)){this.play();}},updateNav:function(active,next){if(this.protoNav!=undefined){this.protoNav[active].removeClassName('current-slide');this.protoNav[next].addClassName('current-slide');}},updateControls:function(status){if(status!==true)status=false;var startStop=this.protoControls.down('.start-stop a');if(status){startStop.update(this.stopText).writeAttribute('title','Pause the slide show').addClassName('pause').removeClassName('play');}else{startStop.update(this.playText).writeAttribute('title','Play the slide show').addClassName('play').removeClassName('pause');}},createNavigation:function(){if((this.options.buildNavigation)&&(!this.element.select('.proto-navigation').length)){var navOL=new Element('ol',{'class':'proto-navigation'});this.element.insert(navOL,'bottom');var navTemplate=new Template('<li><a href="##{number}" title="Skip to Slide #{number}">#{number}</a></li>');this.slides.each(function(e,index){var li=navTemplate.evaluate({number:index+1});navOL.insert(li,'bottom');});}
if(this.element.select(this.navElements).length){this.protoNav=this.element.select(this.navElements);this.protoNav[this.slideID].addClassName('current-slide');this.protoNav.each(function(e,index){this.navObserve(e,index);}.bind(this));}},createControls:function(){this.protoControls=this.element.down('.proto-controls');var startStop=this.protoControls.down('.start-stop');var forward=this.protoControls.down('.forward');var backward=this.protoControls.down('.backward');startStop.observe('click',function(e){e.stop();if(this.isPlaying!==true)this.isPlaying=false;if(this.isPlaying){this.stop();}else{this.play();}}.bind(this));forward.observe('click',function(e){e.stop();this.goForward();}.bind(this));backward.observe('click',function(e){e.stop();this.goBackward();}.bind(this));},navObserve:function(e,index){var i=index;e.observe('click',function(event){if(!event.element().hasClassName('allow-click')){event.stop();this.goToSlide(i);}}.bind(this));},pauseOnHover:function(){if(this.stopOnHover){var hoverDelay;this.element.down('.show').observe('mouseenter',function(){hoverDelay=setTimeout(this.stop.bind(this),1000);}.bind(this)).observe('mouseleave',function(){if(this.autoRestart){clearTimeout(hoverDelay);this.play();}}.bind(this));}},createCaptions:function(){if(this.captions){if(!this.captionsElement){var captionEle=new Element('p',{'class':'slide-caption'});captionEle.addClassName('slide-caption');this.element.insert(captionEle,'bottom');this.captionsElement=captionEle;}
this.updateCaptions(this.slideID);}},updateCaptions:function(next){if(this.captions){var nextCaption=this.slides[next].down('img').readAttribute('alt');if(nextCaption.replace(/^\s*|\s*$/g,'').length){if(!this.captionsElement.visible()){this.captionsElement.show();}
this.captionsElement.update(nextCaption);}else{this.captionsElement.hide();}}}});
