// $Id$
var Slide = {
	/** Contains the slides object */
	_slides: false,
	
	/** Amount of images to load remaining */
	_loadCountRemaining: 0,
	
	/** ID of the current slide (inside the _slides.slides array) */
	_currentSlide: 0,
	
	/** Interval */
	_autoInterval: false,
	
	_fadeOutElement: false,
	_fadeInElement: false,
	
	_doRegisterEvent: function(element, event, callback, data) {
		if(element.addEventListener) {
			element.addEventListener(event, function(e) { callback(e, data); }, false);
		}
		else {
			element.attachEvent('on' + event, function(e) { if(!e) e = window.event; callback(e, data); });
		}
	},
	
	_imageLoaded: function() {
		var thisslide;
		Slide._loadCountRemaining--;
		if(Slide._loadCountRemaining == 0) {
			Slide._autoInterval = setInterval(Slide.onFadeInterval, Slide._slides.imgspeed);
			thisslide = Slide._slides.slides[0];
			thisslide.imageelement.style.display = 'block';
		}
	},
	
	_doFadeOut: function(element) {
		var interval, opacity = 1;
		Slide._fadeOutElement = element;
		interval = setInterval(function() {
			if(element == Slide._fadeOutElement) {
				opacity -= Slide._slides.fadespeed;
				if(opacity < 0) {
					Slide._fadeOutElement = false;
					opacity = 0;
				}
			}
			
			if(element != Slide._fadeOutElement || opacity == 0) {
				opacity = 0;
				element.style.display = 'none';
				clearInterval(interval);
			}
			
			element.style.opacity = opacity;
			element.style.filter = 'alpha(opacity=' + Math.round(opacity * 100) + ')';
		}, Slide._slides.faderate);
	},
	
	_doFadeIn: function(element) {
		var interval, opacity = 0;
		Slide._fadeInElement = element;
		
		element.style.opacity = 0;
		element.style.filter = 'alpha(opacity=0)';
		
		element.style.display = 'block';
		
		interval = setInterval(function() {
			if(element == Slide._fadeInElement) {
				element.style.display = 'block';
				opacity += Slide._slides.fadespeed;
				if(opacity > 1) {
					opacity = 1;
					Slide._fadeInElement = false;
				}
			}
			
			if(element != Slide._fadeInElement || opacity == 1) {
				opacity = 1;
				clearInterval(interval);
			}
			
			element.style.opacity = opacity;
			element.style.filter = 'alpha(opacity=' + Math.round(opacity * 100) + ')';
		}, Slide._slides.faderate);
	},
	
	onFadeInterval: function() {
		Slide.goNext();
	},
	
	goClick: function() {
		if(Slide._slides.slides[Slide._currentSlide].callback)
			Slide._slides.slides[Slide._currentSlide].callback();
		else
			window.location = Slide._slides.slides[Slide._currentSlide].url;
	},
	
	clickedPrevious: function() {
		clearInterval(Slide._autoInterval);
		Slide.goPrevious();
	},

	clickedNext: function() {
		clearInterval(Slide._autoInterval);
		Slide.goNext();
	},

	goPrevious: function() {
		var nextslide;
		if(Slide._loadCountRemaining != 0)
			return;
		
		nextslide = Slide._currentSlide - 1;
		if(nextslide < 0)
			nextslide = Slide._slides.slides.length - 1;
		
		Slide._doFadeOut(Slide._slides.slides[Slide._currentSlide].imageelement);
		Slide._doFadeIn(Slide._slides.slides[nextslide].imageelement);
		
		Slide._currentSlide = nextslide;
	},

	goNext: function() {
		var nextslide;
		if(Slide._loadCountRemaining != 0)
			return;
		
		nextslide = Slide._currentSlide + 1;
		if(nextslide >= Slide._slides.slides.length)
			nextslide = 0;
		
		Slide._doFadeOut(Slide._slides.slides[Slide._currentSlide].imageelement);
		Slide._doFadeIn(Slide._slides.slides[nextslide].imageelement);
		
		Slide._currentSlide = nextslide;
	},
	
	initialize: function(slides, element, leftbutton, rightbutton) {
		var slide;
		
		Slide._slides = slides;
		
		// Register events
		Slide._doRegisterEvent(element, 'click', Slide.goClick);
		
		if(leftbutton) {
			Slide._doRegisterEvent(leftbutton, 'click', Slide.clickedPrevious);
		}
		
		if(rightbutton) {
			Slide._doRegisterEvent(rightbutton, 'click', Slide.clickedNext);
		}
		
		// Create actual images
		Slide._loadCountRemaining = slides.slides.length;

		for(var i = 0; i < slides.slides.length; ++i) {
			slide = slides.slides[i];
			slide.imageelement = document.createElement('img');
			slide.imageelement.style.cursor = 'pointer';
			slide.imageelement.style.display = 'none';
			slide.imageelement.style.position = 'absolute';
			slide.imageelement.style.top = 0;
			slide.imageelement.style.left = 0;
			Slide._doRegisterEvent(slide.imageelement, 'load', Slide._imageLoaded, slide);
			slide.imageelement.setAttribute('src', slide.image);
			element.appendChild(slide.imageelement);
		}
	}
};
