/*******************************************************************
	DA_Slideshow ist eine Klasse zum automatischen
	ein- und ausfaden der übergebenen HTML-Elemente.
	
	Benutzung:
	Binden Sie zuerst eine jquery-Version und dann die
	Slideshow.js in ihre HTML-Datei ein.
	Setzen Sie danach mit dem Aufruf der Methode
	DA_Slideshow.addSlide() die IDs der zu slidenden HTML-Elemente.
	Rufen Sie die Methode DA_Slideshow.doSlide() auf um die 
	Animation zu starten.
	
	Author: Michael Umlandt
	Datum : 23.07.2010
	Copyright: Digital Advice GmbH & Co. KG
**********************************************************************/

var DA_Slideshow = new Slideshow();

function Slideshow() {
	//Array das die zu slidenden Elemente enthält.
	this._Slides = new Array();
	//Bestimmt die Geschwindigkeit mit der gefadet wird
	this._fadeDuration = 100;
	//Hilfsvariable zum Speichern der aktuellen Transparenz
	this._currentOpacity = 1.0;
	//Gibt an, um wieviel die Transparenz beim ausfaden vermindert werden soll.
	this._fadeOutOpacityStep = 0.1;
	//Gibt an, um wieviel die Transparenz beim einfaden erhöht werden soll.
	this._fadeInOpacityStep = 0.25;
	//Gibt an, welcher Frame gerade angezeigt wird.
	this._currentFrame = 0;
	//Git an, wie lange ein Bild angezeigt bleiben soll
	this._delay = 13000;
	
	this._currentState = -1;				//Gibt an, in welchem Status sich die Slideshow befindet.
										//-1 = init
										// 0 = fadeElementOut
										// 1 = fadeElementIn
										// 2 = fadeCompleted
}

Slideshow.prototype.addSlideID = function(slideID) {
	this._Slides.push(slideID);
}

Slideshow.prototype.setFadeDuration = function(fadeDuration) {
	this._fadeDuration = 850;
}

Slideshow.prototype.printSlides = function() {
	var i = this._Slides.length;
	
	for (var j = 0; j < i; j++) {
		document.write(this._Slides[j] + ';');
	}
}

Slideshow.prototype.fadeOutElement = function(elementID) {
	//Opacity setzen
	this.setOpacity(elementID, this._currentOpacity);
	//Neuen Opacity-Wert berechnen
	this._currentOpacity -= this._fadeOutOpacityStep;
}

Slideshow.prototype.fadeInElement = function(elementID) {
	//Opacity setzen
	this.setOpacity(elementID, this._currentOpacity);
	//Neuen Opacity-Wert berechnen
	this._currentOpacity += this._fadeInOpacityStep;	
}

Slideshow.prototype.hideElement = function(elementID) {
	$('#' + elementID).css("display", "none");
}

Slideshow.prototype.showElement = function(elementID) {
	$('#' + elementID).css("display", "block");
}

Slideshow.prototype.setOpacity = function(elementID, opacity) {
	$('#' + elementID).css("opacity", opacity);
	$('#' + elementID).css("-moz-opacity", opacity);
	$('#' + elementID).css("-khtml-opacity", opacity);
}

Slideshow.prototype.nextFrame = function() {
	this._currentFrame += 1;
	if (this._currentFrame == this._Slides.length) this._currentFrame = 0;
}

Slideshow.prototype.doSlide = function() {
	//Wenn wir weniger als 2 Bilder haben, dann macht es keinen Sinn irgendetwas zu faden
	if (this._Slides.length < 2) return ;
	
	//Überprüfen in welchem Status wir uns befinden
	switch (this._currentState) {
		//Die Slideshow wurde gerade initialisiert, das erste Bild muss für die Dauer _delay angezeigt werden
		case -1:
			this._currentState = 0;
			setTimeout('DA_Slideshow.doSlide()', this._delay);
			break;
		//Wir befinden uns beim ausfaden
		case 0:
			this.fadeOutElement(this._Slides[this._currentFrame]);
			//Müssen wir weiterfaden oder sind wir fertig?
			if (this._currentOpacity >= this._fadeOutOpacityStep) {
				setTimeout('DA_Slideshow.doSlide()', this._fadeDuration);
			}
			else {
				//Aktuelles Element verstecken
				this.setOpacity(this._Slides[this._currentFrame], 0.0);
				this.hideElement(this._Slides[this._currentFrame]);
				//Element einen weitersetzen
				this.nextFrame();
				//Aktuelles Element anzeigen
				this.setOpacity(this._Slides[this._currentFrame], 0.0);
				this.showElement(this._Slides[this._currentFrame]);
				//Status einen weitersetzen
				this._currentState = 1;
				this._currentOpacity = this._fadeOutOpacityStep;
				setTimeout('DA_Slideshow.doSlide()', this._fadeDuration);
			}
			break;
		//Jetzt soll wieder eingefadet werden
		case 1:
			this.fadeInElement(this._Slides[this._currentFrame]);
			//Müssen wir weiterfaden oder sind wir fertig?
			if (this._currentOpacity <= 1.0) {
				setTimeout('DA_Slideshow.doSlide()', this._fadeDuration);
			}
			else {
				this.setOpacity(this._Slides[this._currentFrame], 1.0);
				//Status wird wieder auf 0 gesetzt
				this._currentState = 0;
				this._currentOpacity = 1.0;
				//Und nach Ablauf des Delays wird diese Funktion erneut aufgerufen.
				setTimeout('DA_Slideshow.doSlide()', this._delay);
			}
			break;
		default:
			;
	}
	
}
