

/**************************************************************



	Script		: SlideShow

	Version		: 1.3

	Authors		: Samuel Birch

	Desc		: 

	Licence		: Open Source MIT Licence



**************************************************************/



var SlideShow = new Class({

	

	getOptions: function(){

		return {

			effect: 'fade', //fade|wipe|slide|random

			duration: 2000,

			transition: Fx.Transitions.linear,

			direction: 'right', //top|right|bottom|left|random

			color: false,

			wait: 5000,

			loop: false,

			thumbnails: false,

			thumbnailCls: 'outline',

			backgroundSlider: false,

			loadingCls: 'loading',

			onClick: false

		};

	},



	initialize: function(container, images, options){

		this.setOptions(this.getOptions(), options);

		

		this.container = $(container);

		this.container.setStyles({

			position: 'relative',

			overflow: 'hidden'

		});

		if(this.options.onClick){

			this.container.addEvent('click', function(){

				this.options.onClick(this.imageLoaded);

			}.bind(this));

		}

		

		

		this.imagesHolder = new Element('div').setStyles({

			position: 'absolute',

			overflow: 'hidden',

			top: this.container.getStyle('height'),

			left: 0,

			width: '0px',

			height: '0px',

			display: 'none'

		}).injectInside(this.container);

		

		if($type(images) == 'string' && !this.options.thumbnails){

			var imageList = [];

			$$('.'+images).each(function(el){

				imageList.push(el.src);

				el.injectInside(this.imagesHolder);

			},this);

			this.images = imageList;

			

		}else if($type(images) == 'string' && this.options.thumbnails){

			var imageList = [];

			var srcList = [];

			this.thumbnails = $$('.'+images);

			this.thumbnails.each(function(el,i){

				srcList.push(el.href);

				imageList.push(el.getElement('img'));

				el.href = 'javascript:;';

				el.addEvent('click',function(){

					this.stop();

					this.play(i);				 

				}.bind(this,el,i));

			},this);

			this.images = srcList;

			this.thumbnailImages = imageList;

			

			if(this.options.backgroundSlider){

				this.bgSlider = new BackgroundSlider(this.thumbnailImages,{mouseOver: false, duration: this.options.duration, className: this.options.thumbnailCls, padding:{top:0,right:-2,bottom:-2,left:0}});

				this.bgSlider.set(this.thumbnailImages[0]);

			}

		

		}else{

			this.images = images;

		}

		

		this.loading = new Element('div').addClass(this.options.loadingCls).setStyles({

			position: 'absolute',

			top: 0,

			left: 0,

			zIndex: 3,

			display: 'none',

			width: this.container.getStyle('width'),

			height: this.container.getStyle('height')

		}).injectInside(this.container);

		

		this.oldImage = new Element('div').setStyles({

			position: 'absolute',

			overflow: 'hidden',

			top: 0,

			left: 0,

			opacity: 0,

			width: this.container.getStyle('width'),

			height: this.container.getStyle('height')

		}).injectInside(this.container);

		

		this.newImage = this.oldImage.clone();

		this.newImage.injectInside(this.container);

		

		

		

		this.timer = 0;

		this.image = -1;

		this.imageLoaded = 0;

		this.stopped = true;

		this.started = false;

		this.animating = false;

	},

	

	load: function(){

		$clear(this.timer);

		this.loading.setStyle('display','block');

		this.image++;

		var img = this.images[this.image];

		delete this.imageObj;

		

		doLoad = true;

		this.imagesHolder.getElements('img').each(function(el){

			var src = this.images[this.image];

			if(el.src == src){

				this.imageObj = el;

				doLoad = false;

				this.add = false;

				this.show();

			}

		},this);

		

		if(doLoad){

			this.add = true;

			this.imageObj = new Asset.image(img, {onload: this.show.bind(this)});

		}

		

	},



	show: function(add){

		

		if(this.add){

			this.imageObj.injectInside(this.imagesHolder);

		}

		

		this.newImage.setStyles({

			zIndex: 1,

			opacity: 0

		});

		var img = this.newImage.getElement('img');

		if(img){

			img.replaceWith(this.imageObj.clone());

		}else{

			var obj = this.imageObj.clone();

			obj.injectInside(this.newImage);

		}

		this.imageLoaded = this.image;

		this.loading.setStyle('display','none');

		if(this.options.thumbnails){

			

			if(this.options.backgroundSlider){

				var elT = this.thumbnailImages[this.image];

				this.bgSlider.move(elT);

				this.bgSlider.setStart(elT);

			}else{

				this.thumbnails.each(function(el,i){

					el.removeClass(this.options.thumbnailCls);

					if(i == this.image){

						el.addClass(this.options.thumbnailCls);

					}

				},this);

			}

		}

		this.effect();

	},

	

	wait: function(){

		this.timer = this.load.delay(this.options.wait,this);

	},

	

	play: function(num){

		if(this.stopped){

			if(num > -1){this.image = num-1};

			if(this.image < this.images.length){

				this.stopped = false;

				if(this.started){

					this.next();

				}else{

					this.load();

				}

				this.started = true;

			}

		}

	},

	

	stop: function(){

		$clear(this.timer);

		this.stopped = true;

	},

	

	next: function(wait){

		var doNext = true;

		if(wait && this.stopped){

			doNext = false;

		}

		if(this.animating){

			doNext = false;

		}

		if(doNext){

			this.cloneImage();

			$clear(this.timer);

			if(this.image < this.images.length-1){

				if(wait){

					this.wait();

				}else{

					this.load();	

				}

			}else{

				if(this.options.loop){

					this.image = -1;

					if(wait){

						this.wait();

					}else{

						this.load();	

					}

				}else{

					this.stopped = true;

				}

			}

		}

	},

	

	previous: function(){

		if(this.imageLoaded == 0){

			this.image = this.images.length-2;	

		}else{

			this.image = this.imageLoaded-2;

		}

		this.next();

	},

	

	cloneImage: function(){

		var img = this.oldImage.getElement('img');

		if(img){

			img.replaceWith(this.imageObj.clone());

		}else{

			var obj = this.imageObj.clone();

			obj.injectInside(this.oldImage);

		}

		

		this.oldImage.setStyles({

			zIndex: 0,

			top: 0,

			left: 0,

			opacity: 1

		});

		

		this.newImage.setStyles({opacity:0});

	},

	

	

	effect: function(){

		this.animating = true;

		this.effectObj = this.newImage.effects({

			duration: this.options.duration,

			transition: this.options.transition

		});

		

		var myFxTypes = ['fade','wipe','slide'];

		var myFxDir = ['top','right','bottom','left'];

		

		if(this.options.effect == 'fade'){

			this.fade();

			

		}else if(this.options.effect == 'wipe'){

			if(this.options.direction == 'random'){

				this.setup(myFxDir[Math.floor(Math.random()*(3+1))]);

			}else{

				this.setup(this.options.direction);

			}

			this.wipe();

			

		}else if(this.options.effect == 'slide'){

			if(this.options.direction == 'random'){

				this.setup(myFxDir[Math.floor(Math.random()*(3+1))]);

			}else{

				this.setup(this.options.direction);

			}

			this.slide();

			

		}else if(this.options.effect == 'random'){

			var type = myFxTypes[Math.floor(Math.random()*(2+1))];

			if(type != 'fade'){

				var dir = myFxDir[Math.floor(Math.random()*(3+1))];

				if(this.options.direction == 'random'){

					this.setup(dir);

				}else{

					this.setup(this.options.direction);

				}

			}else{

				this.setup();

			}

			this[type]();

		}

	},

	

	setup: function(dir){

		if(dir == 'top'){

			this.top = -this.container.getStyle('height').toInt();

			this.left = 0;

			this.topOut = this.container.getStyle('height').toInt();

			this.leftOut = 0;

			

		}else if(dir == 'right'){

			this.top = 0;

			this.left = this.container.getStyle('width').toInt();

			this.topOut = 0;

			this.leftOut = -this.container.getStyle('width').toInt();

			

		}else if(dir == 'bottom'){

			this.top = this.container.getStyle('height').toInt();

			this.left = 0;

			this.topOut = -this.container.getStyle('height').toInt();

			this.leftOut = 0;

			

		}else if(dir == 'left'){

			this.top = 0;

			this.left = -this.container.getStyle('width').toInt();

			this.topOut = 0;

			this.leftOut = this.container.getStyle('width').toInt();

			

		}else{

			this.top = 0;

			this.left = 0;

			this.topOut = 0;

			this.leftOut = 0;

		}

	},

	

	fade: function(){

		this.effectObj.start({

			opacity: [0,1]

		});

		this.resetAnimation.delay(this.options.duration+90,this);

		if(!this.stopped){

		this.next.delay(this.options.duration+100,this,true);

		}

	},

	

	wipe: function(){

		this.oldImage.effects({

			duration: this.options.duration,

			transition: this.options.transition

		}).start({

			top: [0,this.topOut],

			left: [0, this.leftOut]

		})

		this.effectObj.start({

			top: [this.top,0],

			left: [this.left,0],

			opacity: [1,1]

		},this);

		this.resetAnimation.delay(this.options.duration+90,this);

		if(!this.stopped){

		this.next.delay(this.options.duration+100,this,true);

		}

	},

	

	slide: function(){

		this.effectObj.start({

			top: [this.top,0],

			left: [this.left,0],

			opacity: [1,1]

		},this);

		this.resetAnimation.delay(this.options.duration+90,this);

		if(!this.stopped){

		this.next.delay(this.options.duration+100,this,true);

		}

	},

	

	resetAnimation: function(){

		this.animating = false;

	}

	

});

SlideShow.implement(new Options);

SlideShow.implement(new Events);





/*************************************************************/







 
