/*
 * Klasse Banner ist für das Banner Management auf Possmann zuständig.
 * Aufgaben sind Aufklappen, Zuklappen und Slideshow.
 * Author: Philippe Skolka
 */

function Banner() {
		
	var bannerId = null;
	var bannerState = "closed";
	var bannerElement = null;
	var effectDuration = 1;
	var slideShow = 0;
	var slideShowDuration = 8;
	var slideShowCounter = 0;
	var slideShowParamString = "";
	
	var wrapperReady = false;
	var bannerReady = true;
	var firstRun = true;
	
	/* Öffentliche Methoden */
	
	this.show = function () { 
		var params = this.show.arguments;
		
		if (params.length < 2) {
			var id = params[0];

			if (wrapperReady) {
				
				if (bannerId == null) {
					
					if (!bannerReady)
					{ return null; }
					
					document.getElementById(id).style.display = "block";
					bannerState = "open";
					Effect.SlideDown(document.getElementById("banner-wrapper"), {
						duration: effectDuration
					});
					
					bannerReady = false;
				}
				else {
					var oldBanner = document.getElementById(bannerId);
					var newBanner = document.getElementById(id);
					
					oldBanner.style.display = "none";
					newBanner.style.display = "block";
					scrollTo(0, 0);
				}
				
				bannerId = id;
				
				wrapperReady = false;
			}
			else {
				
				if (!firstRun) {
					this.removeFromWrapper()
					_addToWrapper(id)
				}
				else {
					setTimeout("_addToWrapper('" + id + "')", 500);
					firstRun = false;
				}
				 
			}
		}
		else {
			for (i = 0; i < params.length; i++) {
				
				if (i == (params.length - 1))
					slideShowParamString += params[i];
				else
					slideShowParamString += params[i] + ",";
			}
			this.startSlideShow(slideShowParamString);
			slideShow = setInterval("_startSlideShowCallback('" + slideShowParamString + "')", slideShowDuration * 1000);
		}
	}
	
	/* Beendet Slideshow oder blendet aktuellen Banner aus */
	this.close = function () { 
		bannerState = "closed";
		
		clearInterval(slideShow);
		this.clearSlideShowCache(); 
		
		Effect.SlideUp(document.getElementById("banner-wrapper"), { duration: effectDuration });
		
		setTimeout(function() { 
			document.getElementById(bannerId).style.display = "none"; 
			_removeFromWrapper(); 
			bannerId = null; 
			bannerReady = true; //alert("bannerReady ======= true")
		}, (0.5 + effectDuration) * 1000);
		
	}
	
	/* Blendet einen neuen Banner ein und beendet eine laufende Slideshow */
	this.showAssured = function () {
		var params = this.showAssured.arguments;
		clearInterval(slideShow);
		this.clearSlideShowCache();
		
		var str = "this.show(";
		for (i = 0; i < params.length; i++) {
			if (i == params.length - 1)
				str += "params[" + i + "]"
			else
				str += "params[" + i + "],";
		}
		str += ");";
		
		eval(str)
		
	}
	
	/* Setzt Cookie, damit der Banner nur einmal eingeblendet wird */
	this.showOnce = function (id) { 
		if (!document.cookie) {
			document.cookie = "Banner";
		
			this.show(id);
		}
	}
	
	/* Zählt alle Banner einer Slideshow ab */
	this.startSlideShow = function (params) { 
		var params = params.split(",");
		
		this.show(params[slideShowCounter]);
		
		if (params[slideShowCounter + 1] != null) {
			slideShowCounter++;
		}
		else {
			slideShowCounter = 0;
		}
	}
	
	/* Setzt eine Slideshow fort oder pausiert sie */
	this.pauseSlideShow = function (switcher) { 
		if (bannerState == "closed") {
			return false;
		}
		
		if (slideShow == null) {
			return false;
		}
	
		if (switcher) {
			clearInterval(slideShow);
		}
		else {
			slideShow = setInterval("_startSlideShowCallback('" + slideShowParamString + "')", slideShowDuration * 1000);
		}
	}
	
	/* Setzt alle slideShow Memberattribute auf ihre Default-Werte */
	this.clearSlideShowCache = function() {
		slideShow = null;
		slideShowCounter = 0;
		slideShowParamString = "";
	}
	
	/* Öffentliche Getter und Setter Methoden */
	
	/* Länge des Ein-/Ausblendeeffektes einstellen */
	this.setEffectDuration = function (duration) {
		effectDuration = duration;
	}
	
	/* Wechselintervall festlegen */
	this.setSlideShowDuration = function (duration) {
		slideShowDuration = duration;
	}
	
	this.setWrapperReady = function(ready) {
		wrapperReady = ready;
	}
	
	/* Verschiebung der Banner(s) zwischen 2 Containern */
	
	this.addToWrapper = function (id) { //alert("this.addToWrapper()");
		var bannerData = document.getElementById("banner-data");
		var bannerWrapper = document.getElementById("banner-wrapper");
		
		var idInnerHTML = document.getElementById(id).innerHTML;
		var idElement = document.getElementById(id).tagName;
		var idAttrs = document.getElementById(id).attributes;
		
		// Element manuell bauen
		var self = document.createElement(idElement);
		// Dem Element alle seine Attribute und die dazugehörigen Werte übergeben
		for (i = 0; i < idAttrs.length; i++) {
			self.setAttribute(idAttrs[i].nodeName, idAttrs[i].nodeValue);
		}
		// Inner-Html
		self.innerHTML = idInnerHTML;
		
		bannerData.removeChild(document.getElementById(id));
		
		bannerWrapper.appendChild(self);
		
		bannerElement = self;
	}
	
	this.removeFromWrapper = function () {
		if (bannerElement == null)
		{ return null; }
		
		var bannerData = document.getElementById("banner-data");
		var bannerWrapper = document.getElementById("banner-wrapper");
		
		bannerWrapper.removeChild(bannerElement);
		bannerData.appendChild(bannerElement);

		bannerElement = null;		

	}
}

// TODO: Unelegante Lösung, da setInterval ohne weiteres keine Objektmethoden
//       aufrufen kann.
function _startSlideShowCallback (params) {
	Banner.startSlideShow(params)
}
function _addToWrapper (id) { 
	Banner.addToWrapper(id);
	Banner.setWrapperReady(true);
	Banner.show(id)
}
function _removeFromWrapper() {
	Banner.removeFromWrapper()
}

Banner = new Banner();
