/*
*
* Copyright (c) 2006 Millstream Web Software http://www.millstream.com.au
* 
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
* * 
*/

/*
* Class: Slideshow
* Written by: Andrew Tetlaw http://tetlaw.id.au
* Displays a cross-fading slideshow
* Option:default
* 	uri : [], // an array of image URIs
*		interval : 5, // seconds for each slide to be visible
*		duration : 1, // duration of fade efefct
*		fps : 50, // frames per second of slide effect; shouldn't need to adjust this
*		crossfade : true // if you don't want a cross-fade set this to false and it'll do a fade out - fade in , instead.
*/
var Slideshow = Class.create();

Slideshow.prototype = {
	initialize : function(elm, options) {
		this.elm = $(elm);
		this.counter = 0;
		this.pausecheck = 1;
		this.loaded = false;
		this.options = Object.extend({
			uri : [],
			links : [],
			interval : 5,
			duration : 1,
			fps : 50,
			crossfade : true
		}, options || {})
		this.options.uri = $A(this.options.uri);
		if(FastInit) {
			FastInit.addOnLoad(this.start.bind(this));
		} else {
			Event.observe(window, 'load', this.start.bind(this));
		}
		
	},
	start: function() {
		//console.log('start... ' + this.options.uri.length + ' uris defined');
		var img = document.createElement('img');
		img.src = this.options.uri[0];

		this.cycle();
		if ($('homepage-slideshow')) { $('homepage-slideshow').observe('click', (function() { location.href=this.options.links[0]; }).bind(this)); }
		new PeriodicalExecuter(this.cycle.bind(this), this.options.interval); 
	},
	pause: function(value) {
		this.pausecheck = value;
	},
	cycle: function() {
	    if (this.pausecheck == 1)
		{
			var elm = this.elm;
			var opt = this.options;
			if(this.counter++ == opt.uri.length) {
				this.counter = 1
				this.loaded = true;
			}
			count = this.counter;
			var next = document.createElement('img');
			next.src = this.options.uri[count-1];
			if ($('homepage-slideshow')) {
				$('homepage-slideshow').observe('click', (function() { location.href=this.options.links[count-1]; }).bind(this));
			}
			if(!this.loaded) {
				var preload = document.createElement('img');
				preload.src = this.options.uri[count]; 
			}
			//console.log(next.src);
			if(this.options.crossfade) {
				var currentSlide;
				if(elm.firstChild) {
					currentSlide = elm.firstChild;
				} else {
					currentSlide = document.createElement('div');
					elm.appendChild(currentSlide);
				}
				var nextSlide = $(document.createElement('div'));
				nextSlide.className = 'slide-image';
				nextSlide.style.backgroundImage = 'url('+next.src+')';
				nextSlide.setOpacity(0);
				elm.appendChild(nextSlide);
				new Effect.Parallel([new Effect.Fade(currentSlide,{sync:true}),
					new Effect.Appear(nextSlide,{sync:true})],
					{duration: opt.duration, fps: opt.fps, afterFinish : function() {Element.remove(currentSlide)}}
				);
				//new Effect.BlindDown(nextSlide, {duration: 2});
				
			} else {
				new Effect.Fade(elm, { 
					duration: opt.duration, 
					fps: opt.fps, 
					afterFinish: function() {
						elm.style.backgroundImage = 'url('+next.src+')';
						new Effect.Appear(elm, {
								duration: opt.duration,
								fps: opt.fps,
								queue:'end'
						});
					} 
				})
			}
		}
		
	}
};
