/*

	Copyright Artlogic Media - http://www.artlogic.net/
	All rights reserved.

*/


var FL_Slides = Class.create();

FL_Slides.prototype = {
	initialize: function(params) {
		this.version = "1.0.3";
		this.minorVersion = "1.0.3.070813a";
		this.params = (params) ? params : {};
		this.slides = (this.params.slides) ? this.checkSlides(this.params.slides) : [];
		this.slidesBgColor = (this.params.slidesBgColor) ? this.params.slidesBgColor : '#fff';
		this.horizontalAlign = (this.params.horizontalAlign) ? this.params.horizontalAlign : 'left'; // center, left, right
		this.verticalAlign = (this.params.verticalAlign) ? this.params.verticalAlign : 'top'; // top, middle, bottom
		this.mediaDirectory = (this.params.mediaDirectory) ? this.params.mediaDirectory : "";
		this.interval = (this.params.interval) ? this.params.interval : 4000;
		this.transitionSecs = (this.params.transitionSecs) ? this.params.transitionSecs : 1.0;
		this.width = (this.params.width) ? this.params.width : 300;
		this.height = (this.params.height) ? this.params.height : 250;
		this.rightToLeft = (this.params.rightToLeft) ? this.params.rightToLeft : false;
		this.forward = (this.rightToLeft);
		this.instance = fl_slides_instances.length;
		this.onChange = (this.params.onChange);
		this.paused = (this.params.paused) ? this.params.paused : false;
		this.randomize = (this.params.randomize) ? this.params.randomize : false;
		fl_slides_instances[fl_slides_instances.length] = this;
		this.containerObj = "fl_slides_" + this.instance;
		this.slideCount = -1;
		this.current = 0;
		this.slideLayers = [];
		this.exists = true;
		this.init();
	},
	Version: function() {
		return this.version;
	},
	containerHTML: function(n) {
		return '<style type="text/css">\r.fl_slides_slide {position: absolute; top: 0; left: 0;}\r<\/style><div id="fl_slides_' + n + '" style="position: relative; width: ' + this.width + 'px; height: ' + this.height + 'px; overflow: hidden;"><\/div>';
	},
	init: function() {
		if (this.randomize) {
			this.randomizeSlides();
		}
		if (this.slides.length > 0) {
			document.write(this.containerHTML(this.instance));
			this.getSlide(0);
		} else {
			this.exists = false; // so we can test for the existance of the slide object in external functions
		}
	},
	randomizeSlides: function(slides) {
		var randOrd = function() {
			return (Math.round(Math.random())-0.5);
		}
		this.slides.sort(randOrd);
	},
	checkSlides: function(slides) {
		//	check that all elements of the array contain a legitimate object (or a trailing comma could break it in IE)
		var newArray = [];
		for (var i = 0; i < slides.length; i ++) {
			if (slides[i]) newArray[newArray.length] = slides[i];
		}
		return newArray;
	},
	getSlide: function(n) {
		//	get new slide ID
		var currSlideID = "fl_slides_slide_" + this.slideCount;
		//	increment count
		this.slideCount ++;
		var nextSlideID = "fl_slides_slide_" + this.slideCount;
		//	get image and innerHTML
		var thisSlide = this.slides[n];
		this.currSlideDetails = [n, thisSlide, currSlideID, nextSlideID];
		if (thisSlide.image) {
			var tmpImage = document.createElement('img'); // ('new Image()' does not work in Safari as the onload handler will not trigger)
			tmpImage.id = "flSlideshowImage_" + this.instance;
			tmpImage.src = this.mediaDirectory + thisSlide.image;
			//	IEWin has a different method to other browsers
			if (document.all) {
				var imgLoaded = function() {
					/*
						071001: Arthur's hack to make image.loaded work on IE Win. This does not 
						fire correctly if the image is already in the cache, so, instead, we look
						for the image.width property. If not undefined, the image is loaded.
					*/
					if (!tmpImage.complete) return window.setTimeout(imgLoaded, 100);
					var instance = parseInt(tmpImage.id.split("_")[1]);
					var obj = fl_slides_instances[instance];
					var d = obj.currSlideDetails;
					obj.getSlideIfLoaded(d[0], d[1], d[2], d[3]);
				}
				window.setTimeout(imgLoaded, 100);
			} else {
				tmpImage.onload = function() {
					var instance = parseInt(this.id.split("_")[1]);
					var obj = fl_slides_instances[instance];
					var d = obj.currSlideDetails;
					obj.getSlideIfLoaded(d[0], d[1], d[2], d[3]);
				}
			}
		} else {
			this.getSlideIfLoaded(n, thisSlide, currSlideID, nextSlideID);
		}
	},
	getSlideIfLoaded: function(n, thisSlide, currSlideID, nextSlideID) {
		var valign = (this.verticalAlign == 'middle') ? '50%' : (this.verticalAlign == 'top') ? '0%' : '100%';
		var halign = (this.horizontalAlign == 'center') ? '50%' : (this.horizontalAlign == 'left') ? '0%' : '100%';
		var background = (thisSlide.image) ? 'background: ' + this.slidesBgColor + ' url(' + this.mediaDirectory + thisSlide.image + ') no-repeat ' + halign + ' ' + valign + '; ' : "";
		//alert(background); 
		var innerHTML = $(thisSlide.obj) ? $(thisSlide.obj).innerHTML : (thisSlide.html) ? thisSlide.html : "";
		if (this.rightToLeft) {
			var left = (this.forward) ? this.width : (0 - this.width);
			var leftStyle = 'left: ' + left + 'px;';
		} else {
			var leftStyle = '';
		}
		//	create new slide
		var html = '<div id="' + nextSlideID + '" class="fl_slides_slide" \
			style="display: none; ' + background + leftStyle + 'width: ' + this.width + 'px; \
			height: ' + this.height + 'px;">' + innerHTML + '<\/div>';
		new Insertion.Bottom(this.containerObj, html)
		if (this.slideCount == 0) {
			$(nextSlideID).style.left = "0"; // first slide appears immediately
			$(nextSlideID).style.display = "block"; // first slide appears immediately
		} else if (this.rightToLeft) {
			$(nextSlideID).style.display = "block";
			new Effect.Move(currSlideID, { x: this.moveTo(), y: 0, duration: this.transitionSecs, transition: Effect.Transitions.sinoidal});
			new Effect.Move(nextSlideID, { x: this.moveTo(), y: 0, duration: this.transitionSecs, transition: Effect.Transitions.sinoidal});
		} else {
			new Effect.Appear(nextSlideID);
		}
		//	remove oldest slides (wait until somebody has finished clicking furiously!)
		if (this.leftToRight) {
			if (this.removeOldestTimeout) {
				window.clearTimeout(this.removeOldestTimeout);
			}
			this.removeOldestTimeout = window.setTimeout("fl_slides_instances[" + this.instance + "].removeOldest()", (this.interval + 1));
		} else {
			this.removeOldest();
		}
		//	trigger external function, if present in the onChange parameter
		this.doonChange(); // the end of the previous cycle
		//	call next slide
		if (!this.paused) {
			this.nextSlide();
		}
	},
	nextSlide: function(now) {
		this.forward = true;
		if (now) {
			if (this.timeout) window.clearTimeout(this.timeout);
			this.getSlide(this.current);
		} else {
			this.current ++;
			if (this.current > (this.slides.length - 1)) {
				this.current = 0;
			}
			this.timeout = window.setTimeout("fl_slides_instances[" + this.instance + "].getSlide(" + this.current + ");", this.interval);
		}
	},
	prevSlide: function(now) {
		this.forward = false;
		if (now) {
			if (this.timeout) window.clearTimeout(this.timeout);
			this.current = this.current - 2;
			if (this.current < 0) {
				this.current = (this.slides.length + this.current); // eg. slides length - 1, slides length - 2 etc.
			}
			this.getSlide(this.current);
		} else {
			this.current = this.current - 2;
			if (this.current < 0) {
				this.current = (this.slides.length - 1);
			}
			this.timeout = window.setTimeout("fl_slides_instances[" + this.instance + "].getSlide(" + this.current + ");", this.interval);
		}
	},
	moveTo: function() {
		if (this.forward) {
			return (0 - this.width);
		} else {
			return this.width;
		}
	},
	stop: function() {
		window.clearTimeout(this.timeout);
		this.paused = true;
	},
	start: function() {
		window.clearTimeout(this.timeout);
		this.paused = false;
		this.getSlide(this.current);
	},
	toggle: function() {
		this.paused = !this.paused;
		if (this.paused) {
			this.stop();
		} else {
			this.start();
		}
	},
	gotoSlide: function(n) {
		if (this.timeout) {
			window.clearTimeout(this.timeout);
		}
		n = n - 1; // convert number to zero-based
		this.forward = (n < (this.current + 1)) ? false : true;
		this.current =	n;
		this.getSlide(this.current);
	},
	removeOldest: function() {
		//	remove oldest slides
		var slideEls = document.getElementsByClassName("fl_slides_slide", "fl_slides_" + this.instance);
		while (slideEls.length > 2) {
			Element.remove(slideEls[0]);
			slideEls = document.getElementsByClassName("fl_slides_slide", "fl_slides_" + this.instance);
		}		
	
	},
	doonChange: function() {
		if (this.onChange) this.onChange(this);
	}
}

var fl_slides_instances = new Array();
