/*
 * Created on 24.06.2011
 *
 * SolutionOnDemand
 * Copyright by YGG-Workgroups
 * http://www.solutionondemand.com
 * 
 * Dateibeschreibung:
 * Ablaufsteuerung für SOD-Presentation
 */


// Objekt sodcms initialisieren, falls noch nicht vorhanden
if (typeof(sodcms) == "undefined") {
	sodcms = new Object();
}

// Objekt presentation initialisieren (sodcms.prt)
sodcms.prt = new Object();
// Objekt config initialisieren
sodcms.prt.config = new Object();



// SOD-Presentation initialisieren
$(document).ready(function() {	
	// Alle Präsentationen durchlaufen
	for (var index in sodcms.prt.config) {
		// Variable für den Animationsstatus initialisieren
		sodcms.prt.config[index].isChanging = false;

		// Variable elementIndex setzen
		if (sodcms.prt.config[index].firstElement > 0) {
			// elementIndex auf elementCount begrenzen
			if (sodcms.prt.config[index].firstElement > sodcms.prt.config[index].elementCount) {
				sodcms.prt.config[index].elementIndex = sodcms.prt.config[index].elementCount;
			}
			else {
				sodcms.prt.config[index].elementIndex = sodcms.prt.config[index].firstElement;
			}
		}
		else {
			// Zufallswert zwischen 1 und elementCount setzen
			if (sodcms.prt.config[index].elementCount == 1) {
				sodcms.prt.config[index].elementIndex = 1;
			}
			else {
				sodcms.prt.config[index].elementIndex = 1 + parseInt(Math.random() * sodcms.prt.config[index].elementCount);
			}
		}
		$("#" + index + "_nav-index1").html(sodcms.prt.config[index].elementIndex);

		// Variablen für die Animationseigenschaft initialisieren
		var sizeProperty = "";
		if(sodcms.prt.config[index].animation == "horizontal") {
			sodcms.prt.config[index].animationProperty = "left";
			sizeProperty = "width";
			sodcms.prt.initSlider(index, sizeProperty);
		}
		else if (sodcms.prt.config[index].animation == "vertical") {
			sodcms.prt.config[index].animationProperty = "top";
			sizeProperty = "height";
			sodcms.prt.initSlider(index, sizeProperty);
		}
		else {
			// Fade
			sodcms.prt.initFader(index);
		}			
	}
		
});



// Funktion zum Initialisieren des Sliders
sodcms.prt.initSlider = function(index, sizeProperty) {
	// Prüfen, ob es mehr Elemente gibt als angezeigt werden
	if (sodcms.prt.config[index].elementCount > sodcms.prt.config[index].view) {
		// Eigenschaft "slide" begrenzen
		if (sodcms.prt.config[index].slide > sodcms.prt.config[index].view) {
			sodcms.prt.config[index].slide = sodcms.prt.config[index].view;
		}

		// Elemente vorne und hinten anfügen (unterbrechungsfreier Durchlauf)		
		// vorne anfügen
		for (var vi = 1; vi <= sodcms.prt.config[index].view; vi++) {
			var bgrClass = index + "_id_bgr_" + (sodcms.prt.config[index].elementCount - vi + 1);
			var contentClass = index + "_id_content_" + (sodcms.prt.config[index].elementCount - vi + 1);
			var linkClass = index + "_id_link_" + (sodcms.prt.config[index].elementCount - vi + 1);
			$("." + bgrClass).clone().removeClass(bgrClass).prependTo("#" + index + "_id_bgr");
			$("." + contentClass).clone().removeClass(contentClass).prependTo("#" + index + "_id_content");
			$("." + linkClass).clone().removeClass(linkClass).prependTo("#" + index + "_id_link");							
		}
		// hinten anfügen
		for (var vi = 1; vi <= sodcms.prt.config[index].view; vi++) {
			var bgrClass = index + "_id_bgr_" + vi;
			var contentClass = index + "_id_content_" + vi;
			var linkClass = index + "_id_link_" + vi;
			$("." + bgrClass).clone().removeClass(bgrClass).appendTo("#" + index + "_id_bgr");
			$("." + contentClass).clone().removeClass(contentClass).appendTo("#" + index + "_id_content");
			$("." + linkClass).clone().removeClass(linkClass).appendTo("#" + index + "_id_link");
		}
		
		// Größe der Elementleiste zuweisen
		$("." + index + "_animator").css(sizeProperty, 
				(sodcms.prt.config[index].elementSize * sodcms.prt.config[index].elementCount + 
				 sodcms.prt.config[index].elementSize * sodcms.prt.config[index].view * 2) + "px");

		// Startposition der Elementleiste berechnen
		sodcms.prt.config[index].startPos = -(sodcms.prt.config[index].elementSize * sodcms.prt.config[index].view);
		// Abweichende Startposition berechnen
		sodcms.prt.config[index].deltaStartPos = sodcms.prt.config[index].startPos - sodcms.prt.config[index].elementSize * (sodcms.prt.config[index].elementIndex - 1);
		// Startposition der Elementleiste setzen
		$("." + index + "_animator").css(sodcms.prt.config[index].animationProperty, sodcms.prt.config[index].deltaStartPos + "px");

		// Endposition berechnen
		sodcms.prt.config[index].endPos = sodcms.prt.config[index].startPos - sodcms.prt.config[index].elementSize * sodcms.prt.config[index].elementCount;

		// Buttonereignisse zuweisen
		$("#" + index + "_nav-next1").click(sodcms.prt.moveNext);	
		$("#" + index + "_nav-prev1").click(sodcms.prt.movePrev);
		$("#" + index + "_nav-pause1").click(sodcms.prt.loopControl);
		
		// Prüfen, ob der automatische Durchlauf gestartet werden soll
		sodcms.prt.startLoop(index);
	}
	else {
		// Größe der Elementleiste zuweisen
		$("." + index + "_animator").css(sizeProperty, sodcms.prt.config[index].elementSize * sodcms.prt.config[index].elementCount + "px");
		
		// Buttons deaktivieren
		sodcms.prt.disableButtons(index);
	}		
};


// Funktion zum Initialisieren des Faders
sodcms.prt.initFader = function(index) {
	// Prüfen, ob es mehr Elemente gibt als angezeigt werden
	if (sodcms.prt.config[index].elementCount > 1) {		
		// Transparenz aller Elementbilder <= elementIndex auf 1 setzen
		for (var vi = 1; vi <= sodcms.prt.config[index].elementIndex; vi++) {
			$("#" + index + "_id_bgr_" + vi).css("opacity", 1);				
			$("#" + index + "_id_bgr_" + vi).css("filter", "alpha(opacity=100)");
		}
		// Link für elementIndex aktivieren
		$("#" + index + "_id_link_" + sodcms.prt.config[index].elementIndex).css("display", "block");
		// Content (Text) für elementIndex einblenden
		$("." + index + "_id_content_" + sodcms.prt.config[index].elementIndex).css("opacity", 1);				
		$("." + index + "_id_content_" + sodcms.prt.config[index].elementIndex).css("filter", "alpha(opacity=100)");
		
		// Buttonereignisse zuweisen
		$("#" + index + "_nav-next1").click(sodcms.prt.fadeNext);	
		$("#" + index + "_nav-prev1").click(sodcms.prt.fadePrev);
		$("#" + index + "_nav-pause1").click(sodcms.prt.loopControl);
		
		// Prüfen, ob der automatische Durchlauf gestartet werden soll
		sodcms.prt.startLoop(index);
	}
	else {
		// Transparenz des einzigen Elementes auf 1 setzen
		$("#" + index + "_id_bgr_1").css("opacity", 1);				
		$("#" + index + "_id_bgr_1").css("filter", "alpha(opacity=100)");
		// Link für das einzige Element aktivieren
		$("#" + index + "_id_link_1").css("display", "block");
		// Content (Text) für das einzige Element einblenden
		$("." + index + "_id_content_1").css("opacity", 1);				
		$("." + index + "_id_content_1").css("filter", "alpha(opacity=100)");

		// Buttons deaktivieren
		sodcms.prt.disableButtons(index);
	}		
};


// Funktion zum Starten des automatischen Durchlaufs
sodcms.prt.startLoop = function(index) {
	// Timer abhängig von der Eigenschaft slideshow starten
	if (sodcms.prt.config[index].slideshow > 0) {
		sodcms.prt.loop(index);
	}
	// Button anpassen (Pause oder Play) 
	sodcms.prt.loopButton(index);
};


// Funktion für die Next-Bewegung
sodcms.prt.moveNext = function() {
	var id = this.id.split("_");
	var index = id[0];

	if (sodcms.prt.config[index].isChanging) return;
	sodcms.prt.config[index].isChanging = true;

	// Wert für elementIndex ermitteln und setzen
	sodcms.prt.incIndex(index);

	// Aktuelle Position ohne px ermitteln
	var pos = $("." + index + "_animator").css(sodcms.prt.config[index].animationProperty);
	pos = pos.substr(0, pos.length - 2);

	// Prüfen, ob die aktuelle Position - sichtbarer Bereich kleiner als die Endposition ist
	if ((pos - sodcms.prt.config[index].elementSize * sodcms.prt.config[index].view) < sodcms.prt.config[index].endPos) {
		$("." + index + "_animator").css(sodcms.prt.config[index].animationProperty, sodcms.prt.config[index].startPos + (pos - sodcms.prt.config[index].endPos) + "px");
	}

	// Animationseigenschaft festlegen und Animation starten
	var animationObject = new Object();
	animationObject[sodcms.prt.config[index].animationProperty] = "-=" + sodcms.prt.config[index].elementSize * sodcms.prt.config[index].slide + "px"; 
	$("." + index + "_animator").animate(animationObject, sodcms.prt.config[index].tweenTime, "", sodcms.prt.complete);	
};


// Funktion für den Next-Fade
sodcms.prt.fadeNext = function() {
	var id = this.id.split("_");
	var index = id[0];

	if (sodcms.prt.config[index].isChanging) return;
	sodcms.prt.config[index].isChanging = true;
	
	// Link deaktivieren
	$("#" + index + "_id_link_" + sodcms.prt.config[index].elementIndex).css("display", "none");
	// Content ausblenden
	$("." + index + "_id_content_" + sodcms.prt.config[index].elementIndex).animate(
		{opacity: 0},
		{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime / 2, complete: sodcms.prt.fadeOutContentComplete}
	);

	if (sodcms.prt.config[index].elementIndex >= sodcms.prt.config[index].elementCount)	{
		// Transparenz aller Elemente zwischen 1 und elementCount auf 0 setzen
		if (sodcms.prt.config[index].elementCount > 2) {
			for (var vi = 2; vi < sodcms.prt.config[index].elementCount; vi++) {
				$("#" + index + "_id_bgr_" + vi).css("opacity", 0);
				$("#" + index + "_id_bgr_" + vi).css("filter", "alpha(opacity=0)");
			}
		}

		// Wert für elementIndex ermitteln und setzen
		sodcms.prt.incIndex(index);

		// elementCount ausblenden
		$("#" + index + "_id_bgr_" + sodcms.prt.config[index].elementCount).animate(
			{opacity: 0},
			{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime, complete: sodcms.prt.complete}
		);
	}
	else {
		// Wert für elementIndex ermitteln und setzen
		sodcms.prt.incIndex(index);

		// elementIndex einblenden
		$("#" + index + "_id_bgr_" + sodcms.prt.config[index].elementIndex).animate(
			{opacity: 1},
			{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime, complete: sodcms.prt.complete}
		);	
	}
};


// Eigenschaft elementIndex erhöhen
sodcms.prt.incIndex = function(index) {
	if (sodcms.prt.config[index].elementIndex >= sodcms.prt.config[index].elementCount) {
		sodcms.prt.config[index].elementIndex = 1;
	}
	else {
		sodcms.prt.config[index].elementIndex += 1;
	}
	$("#" + index + "_nav-index1").html(sodcms.prt.config[index].elementIndex);
};


// Funktion für die Previews-Bewegung
sodcms.prt.movePrev = function() {
	var id = this.id.split("_");
	var index = id[0];

	if (sodcms.prt.config[index].isChanging) return;
	sodcms.prt.config[index].isChanging = true;

	// Wert für elementIndex ermitteln und setzen
	sodcms.prt.decIndex(index);

	// Aktuelle Position ohne px ermitteln
	var pos = $("." + index + "_animator").css(sodcms.prt.config[index].animationProperty);
	pos = pos.substr(0, pos.length - 2);
					
	// Prüfen, ob die aktuelle Position größer oder gleich der Startposition ist
	if (pos >= sodcms.prt.config[index].startPos) {
		$("." + index + "_animator").css(sodcms.prt.config[index].animationProperty, sodcms.prt.config[index].endPos + (pos - sodcms.prt.config[index].startPos) + "px");
	}

	// Animationseigenschaft festlegen und Animation starten
	var animationObject = new Object();
	animationObject[sodcms.prt.config[index].animationProperty] = "+=" + sodcms.prt.config[index].elementSize * sodcms.prt.config[index].slide + "px";
	$("." + index + "_animator").animate(animationObject, sodcms.prt.config[index].tweenTime, "", sodcms.prt.complete);	
};


// Funktion für den Previews-Fade
sodcms.prt.fadePrev = function() {
	var id = this.id.split("_");
	var index = id[0];

	if (sodcms.prt.config[index].isChanging) return;
	sodcms.prt.config[index].isChanging = true;

	// Link deaktivieren
	$("#" + index + "_id_link_" + sodcms.prt.config[index].elementIndex).css("display", "none");
	// Content ausblenden
	$("." + index + "_id_content_" + sodcms.prt.config[index].elementIndex).animate(
		{opacity: 0},
		{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime / 2, complete: sodcms.prt.fadeOutContentComplete}
	);
	
	if (sodcms.prt.config[index].elementIndex <= 1)	{
		// elementCount einblenden
		$("#" + index + "_id_bgr_" + sodcms.prt.config[index].elementCount).animate(
			{opacity: 1},
			{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime, complete: sodcms.prt.fadePrevChangeComplete}
		);
	}
	else {
		// elementIndex ausblenden
		$("#" + index + "_id_bgr_" + sodcms.prt.config[index].elementIndex).animate(
			{opacity: 0},
			{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime, complete: sodcms.prt.complete}
		);	
	}

	// Wert für elementIndex ermitteln und setzen
	sodcms.prt.decIndex(index);
};


// Eigenschaft elementIndex verringern
sodcms.prt.decIndex = function(index) {
	if (sodcms.prt.config[index].elementIndex <= 1) {
		sodcms.prt.config[index].elementIndex = sodcms.prt.config[index].elementCount;
	}
	else {
		sodcms.prt.config[index].elementIndex -= 1;
	}
	$("#" + index + "_nav-index1").html(sodcms.prt.config[index].elementIndex);
};


// Funktion zum Setzen von alpha(opacity=x) abhängig vom Animationsverlauf
sodcms.prt.animateAlpha = function(now, fx) {
	var ao = now * 100;
	$(fx.elem).css("filter", "alpha(opacity=" + ao + ")");
};


// Nachricht über abgeschlossenes Ausfaden von Content (Text) auswerten
sodcms.prt.fadeOutContentComplete = function() {
	var id = this.id.split("_");
	var index = id[0];
	var element = id[2];
	if (element == "headline") {
		// Link aktivieren
		$("#" + index + "_id_link_" + sodcms.prt.config[index].elementIndex).css("display", "block");
		// Content einblenden
		$("." + index + "_id_content_" + sodcms.prt.config[index].elementIndex).animate(
			{opacity: 1},
			{step: sodcms.prt.animateAlpha, duration: sodcms.prt.config[index].tweenTime / 2}
		);
	}
};


// Nachricht über abgeschlossene Fade-Animation auswerten
// Übergang von element 1 auf elementCount
sodcms.prt.fadePrevChangeComplete = function() {
	var id = this.id.split("_");
	var index = id[0];
	
	// Transparenz aller Elemente zwischen 1 und elementCount auf 1 setzen
	if (sodcms.prt.config[index].elementCount > 2) {
		for (var vi = 2; vi < sodcms.prt.config[index].elementCount; vi++) {
			$("#" + index + "_id_bgr_" + vi).css("opacity", 1);
			$("#" + index + "_id_bgr_" + vi).css("filter", "alpha(opacity=100)");
		}
	}		
	
	sodcms.prt.config[index].isChanging = false;
};


// Nachricht über abgeschlossene Animation auswerten
sodcms.prt.complete = function() {
	var id = this.id.split("_");
	var index = id[0];
	var element = id[2];
	if (element == "bgr") {
		sodcms.prt.config[index].isChanging = false;
	}
};


// Slideshow - Automatisches wechseln der Elemente 
sodcms.prt.loop = function(index) {

	setTimeout(function() {
		if (sodcms.prt.config[index].isSlideshow) {
			// Prüfen, ob die Elementleiste nach links oder rechts verschoben werden soll
			if (sodcms.prt.config[index].slideshow == 1) {
				$("#" + index + "_nav-next1").click();
			}
			else if (sodcms.prt.config[index].slideshow == 2) {
				$("#" + index + "_nav-prev1").click();
			}
		}
			
		// Rekursiver Aufruf von loop
		sodcms.prt.loop(index);

	}, sodcms.prt.config[index].continueTime);

}; 


// Slideshow anhalten oder fortsetzen
sodcms.prt.loopControl = function() {
	var id = this.id.split("_");
	var index = id[0];

	sodcms.prt.config[index].isSlideshow = !sodcms.prt.config[index].isSlideshow;
	sodcms.prt.loopButton(index);
};


// Button anpassen (Pause oder Play) 
sodcms.prt.loopButton = function(index) {
	if (sodcms.prt.config[index].isSlideshow) {
		$("#" + index + "_nav-pause1").removeClass(index + "_nav-play");
		$("#" + index + "_nav-pause1").addClass(index + "_nav-pause");
	}
	else {
		$("#" + index + "_nav-pause1").removeClass(index + "_nav-pause");
		$("#" + index + "_nav-pause1").addClass(index + "_nav-play");
	}
};


// Buttons deaktivieren
sodcms.prt.disableButtons = function(index) {
	$("#" + index + "_nav-next1").removeClass(index + "_nav-next");
	$("#" + index + "_nav-next1").addClass(index + "_nav-next-inactive");
	$("#" + index + "_nav-prev1").removeClass(index + "_nav-prev");
	$("#" + index + "_nav-prev1").addClass(index + "_nav-prev-inactive");
	$("#" + index + "_nav-pause1").removeClass(index + "_nav-pause");
	$("#" + index + "_nav-pause1").addClass(index + "_nav-pauseplay-inactive");
};


