// ### Wenn noch Fenster offen sind, confirm auf Hauptmenue der Seite legen (war 146)

// ### INIT ### Globale Inits
var lastZIndex	= 1000;
var x,y;
window.onresize = winXY; // initialisiert im Markup, für die Größe neuer layOver-Divs
//$('navBlock').onclick = confirmBrowse;

// ### Funktionen ###

// ### neues Element erzeugen und in div 'showArea' einhängen ###
var makeLayer = function (element,snippet) {
	
	// ::: ID + _item für 'Anfasser' erzeugen - Mehrfachelemente haben ein _\d+ hinten dran
	var oldid = element.id.replace(/_\d+$/,"") + "_item";
	// ::: ID für neues Element generieren
	var newid = "id" + parseInt( Math.random() * Math.pow(10,15) );
	
		/* ::: snippet in Pseudo-Hash aufnehmen, wenn ein solches Snippet noch nicht
		als DIV geöffnet und nicht aus dem DOM (und in removeLayer auch
		aus snipWindows) entfernt wurde ... */
		if (!snipWindows[snippet]) {
		snipWindows[snippet] = newid;
		} else {
			// ... sonst das DIV nicht neu erzeugen, sondern wieder sichtbar ...
			if ($(snipWindows[snippet]).style.display == 'none') {
			Effect.Grow(snipWindows[snippet], { direction: 'top-left', duration: 0.7, afterFinish: doAfterFinish } );
			} else {
				// ... oder unsichtbar machen oder ...
				if ($(snipWindows[snippet]).style.zIndex >= lastZIndex) {
				Effect.Shrink(snipWindows[snippet], { direction: 'bottom-left', duration: 0.7, afterFinish: doAfterFinish } );
				} else {
				// ... einfach wieder in den Vordergrund holen.
				lastZIndex++;
				$(snipWindows[snippet]).style.zIndex = lastZIndex;
				}
			}
			// ::: z-index für das Element erhöhen
			incZIndex(snipWindows[snippet]);
			return;
		}
		
		function doAfterFinish () {
			updateStorer(snipWindows[snippet]);
		}

		
	// ::: DIV erzeugen und einhängen.
	$('showArea').appendChild( Builder.node('div',{className:'layOver',style:'display: block; top:' + layoverTop + '; left: ' + layoverLeft + '',id:newid}) );
	
	// ### AJAX ### Ajax-Updater den angeforderten Schnipsel holen und in das neue DIV schreiben lassen 
	var requestString = requestPath + "?snip=" + snippet + "&id=" + newid; 
	var ajax =  new Ajax.Updater(
		newid,			// DIV id
		requestString,	// URL mit GET-Vars
			{			// options
				method:'get',
				onComplete:printSnippet
			}
		);

	// ### HANDLER ### Dinge mit dem eingefügtem Schnipsel tun
	function printSnippet (t) {
		//... Das neuen DIV draggable machen
		$(newid).dragg = new Draggable(newid,{starteffect:false,endeffect:false,handle:oldid,zindex:lastZIndex});
		
		// ::: Dem neuen DIV eine zum Fenster passende Höhe geben (Jans Idee! Ich war's nicht!)
		var divHeight = y - layoverTop.replace(/px$/,"") - 100;
		var targetDiv = newid + "_scroll";
		$(targetDiv).style.height = divHeight + "px";
		//$(targetDiv).style.height = "100%";
		//alert("Größen: FensterY: " + arrXY.Y + " / layoverTop: " + layoverTop + " / Höhe: " + divHeight);
		
		// ... den Focus auf den Fake-Link in der Überschrift setzen
		//setFocus(newid);
		// ::: Die 'Taskbar' aktualisieren
		updateStorer(newid);
		// ::: generell das neue Fenster nach vorne bringen
		$(newid).style.zIndex 	= lastZIndex++;
		// ::: z-index-Maushandler für DIV zuweisen ...
		$(newid).onmousedown 	= setZIndex;
		$(oldid).onmousedown 	= setZIndex;
	}
	
	//### HANDLER ### z-index des generierten Div auf Mausklick erhöhen
	function setZIndex (e) {
		// ::: Anfasser ...
		if (this.id.match(/_item$/)) {
		incZIndex($(this.id).parentNode.id);
		} else {
		// ... oder DIV angeklickt
		incZIndex(this.id);
		}
	}
	
	//### FUNC ### z-index des generierten Div auf Mausklick erhöhen
	function incZIndex (id) {
		// ::: z-index erhöhen und zuweisen;
		lastZIndex++;
		$(id).style.zIndex = lastZIndex;
			// ::: focus neu setzen
			if($(id).style.display != 'none') {
			//setFocus(id);
			}
			// ::: Index auch für Drag-Objekt erhöhen
			if ($(id).dragg) {
			$(id).dragg.options.zindex = lastZIndex;
			}
	}
	
	// ### FUNC ### Focus auf akives Element setzen
	function setFocus (id) {
		var focID = id + "foc";
			if($(focID)) {
			$(focID).focus();
			}
		return;
	}
	
	//### HANDLER ### Fehler als alert ausgeben, damit der Client informiert ist
	function printError (t) {
		Element.remove(newid);
		alert("Fehler beim Ajax-Call: " + t.responseText );
	}
	
}

// ### FUNC ### DIV aus dem DOM entfernen, snipWindows updaten
var removeLayer = function (id) {
	Element.remove(id);
		// snipWindows wieder putzen!
		for (var i in snipWindows) {
			if (snipWindows[i] == id) {
			delete snipWindows[i];
			}
		}
	updateStorer(id);
}

// ### FUNC ### DIV minimieren (= unsichtbar machen)
var minimiLayer = function (id) {
	var eff = new Effect.Shrink(id, { direction: 'bottom-left', duration: 0.7, afterFinish: doAfterFinish1 } );

		function doAfterFinish1 () {
		updateStorer(id);
		}
}

// ### FUNC ### Pseudo-Taskbar befüllen / aufräumen
var updateStorer = function (id) {
	// ::: Länge des Pseudo-Hash lesen:
	var snipWindowsLength = 0;
		for (var i in snipWindows) {
		snipWindowsLength++;
		}
	
		// ::: Taskbar sichtbar / unsichtbar machen
		if (snipWindowsLength > 0) {
		// Solange außer Betrieb ... $('globalStorer').style.display = "block";
			if (snipWindowsLength == 1) {
			//Effect.Appear('globalStorer', { from: 0.0, to: 0.8 } );
			Effect.Appear('globalStorer');
			} else {
			$('globalStorer').style.display 	= "block"; 
			}
		
			// ::: 'taskbar' immer vorne:
			var storerIndex = lastZIndex;
				storerIndex++;
			$('globalStorer').style.zIndex	= storerIndex;
		} else {
		Effect.Fade('globalStorer');
		}

	// ::: HTML-Schnipsel für die 'Taskbar' bereitstellen, mit 'Task-Schnipseln' füllen, einhängen.
	
	// ::: lokale Inits
	var html1	= "";
	var html2	= "";	
	var counter	= 0;

		// ::: Absatz: Items in der Taskbar
	    html1 += "<p id\=\"innerStorerTaskbar\">";
			for (var i in snipWindows) {
			var titID 	= snipWindows[i] + "tit";
				if ($(titID)) {
				var titTxt = $(titID).firstChild.data;
				html1 += "\<span onclick\=\"makeLayer\(this\,\'" + i + "\'\)\">" + "&bull; " + titTxt + "\<\/span\>";
					// ::: Mitzählen, wieviele Items offen (=sichtbar) sind
					if ($(snipWindows[i]).style.display != 'none') {
					counter++
					}
				}
			}
		//html1 += "<span>Anzahl offen: " + counter + "</span>";
		html1 += "<span></span>"; 
		html1 += "</p>";
		
		// ::: Absatz: Thumbnail (default: sichtbar)
	    html2 += "<p id\=\"innerStorerThumbnail\">";
	    html2 += "<img id\=\"tnProd\" src\=\"../IMG/tn_produkte.jpg\" ";
		html2 += "style\=\"width: 140px\; height: 60px\; cursor: pointer\;\" ";
		// ::: onclick-Funktion togglen
		counter > 0 ? 
			html2 += "onclick\=\"minAll()\" title\=\"Alle aufgerufenen Fenster minimieren\" " : 
			html2 += "onclick\=\"showAll()\" title\=\"Alle aufgerufenen Fenster maximieren\" ";
		html2 += "alt\=\"\" \/>";
		html2 += "<\/p>";
		
	// ::: Absätze zusammenbasteln
	var html = html2 + html1;	
			
	// ::: Absätze einhängen
	Element.update('innerStorer',html);
	
	if (counter > 0) {
	setOpaque('tnProd','1.0');
	} else {
	setOpaque('tnProd','0.2');
	}
}

var setOpaque = function (id,opaque1) {
	opaque2 = opaque1 * 100;
	//alert("Opacity: " + opaque1 + " / " + opaque2);
	$(id).style.opacity	= opaque1;
	$(id).style.filter = "Alpha(opacity=" + opaque2 + ")"; // Hrrgt ...!
}

var minAll = function minAll () {
	
	for (var i in snipWindows) {
		if ($(snipWindows[i]).style.display != 'none') {
		$(snipWindows[i]).style.display = 'none';
		updateStorer(snipWindows[i]);
		}
	}
}

var delAll = function () {
	for (var i in snipWindows) {
	removeLayer(snipWindows[i]);
	}
}

var showAll = function () {
	for (var i in snipWindows) {
		if ($(snipWindows[i]).style.display == 'none') {
		$(snipWindows[i]).style.display = 'block';
		updateStorer(snipWindows[i]);
		}
	}
}

/*var countOpen = function () {
	var counter = 0;
	for (var i in snipWindows) {
		if ($(snipWindows[i]).style.display != 'none') {
		counter++
		}
	}
return counter;
}*/

// ### FUNC ### originale Style-Values der Produkte-Liste onload holen
var getOldValues = function (cssClass) {
	// alle Elemente mit ClassName 'cssClass' in ein Array holen:
	var divList = document.getElementsByClassName(cssClass);
	
	// Pseudo-Hash für alte Style-Werte _global_ initialisieren
	hashOldVals = new Object();
	
	for (var i = 0; i < divList.length; i++) {

		// ... alte Werte speichern (Reihenfolge in 'hl/dl' beachten!) ...
		var arrOldVals = new Array();
		arrOldVals = [	divList[i].style.fontWeight,
						divList[i].style.fontSize,
						divList[i].style.color,
						divList[i].style.backgroundColor
						];
		// ... dem Hash hinzufügen ...
		hashOldVals[divList[i].id] = arrOldVals;
	}
}

// ### FUNC ### Highlighting von Gruppen der Übersichts'tabelle'
var hl = function (arrIds) {
	// ::: Liste der übergebenen IDs durchgehen ...
	for (var i = 0; i < arrIds.length; i++) {
	
		// ::: (erstes Element ist das omo-Element: onmouseout-Handler registrieren)
		if (i == 0) {
		$(arrIds[0]).onmouseout = dl;
		}
		
		// ::: evtl. nicht existierende IDs Übergehen
		if (!$(arrIds[i])) {
		continue;
		}
		
		// ::: ... und alte Werte verändern.
		if (i == 0) {
		$(arrIds[i]).style.fontWeight 		= "bold";
		$(arrIds[i]).style.fontSize	 		= "1em";
		$(arrIds[i]).style.color 			= "#FFD700";
		$(arrIds[i]).style.backgroundColor 	= "#5078AA";
		} else {
		$(arrIds[i]).style.fontWeight 		= "normal";
		$(arrIds[i]).style.fontSize	 		= "1em";
		$(arrIds[i]).style.color 			= "#FFF";
		$(arrIds[i]).style.backgroundColor 	= "#5078AA";
		}
	}
}

// ### FUNC ### onmouseout-Handler: alles retour.
var dl = function () {
		for (var i in hashOldVals) {
			// 'i' ist ID
			$(i).style.fontWeight 		= hashOldVals[i][0];
			$(i).style.fontSize 		= hashOldVals[i][1];
			$(i).style.color  			= hashOldVals[i][2];
			$(i).style.backgroundColor  = hashOldVals[i][3];
		}
}


// ### HANDLER ### Fensterdimensionen einlesen
function winXY () {
	var arrPos = new Array();
	//var x,y;
	// all except Explorer
	if (self.innerHeight) {
	x = self.innerWidth;
	y = self.innerHeight;
	// Explorer 6 Strict Mode
	} else if (document.documentElement && document.documentElement.clientHeight) {
	x = document.documentElement.clientWidth;
	y = document.documentElement.clientHeight;
	// other Explorers
	} else if (document.body) {
	x = document.body.clientWidth;
	y = document.body.clientHeight;
	}
//	this.X = x;
//	this.Y = y;
//	arrPos[0] = x;
//	arrPos[1] = y;
//return arrPos;
}

// ### FUNC ### Elementdimensionen einlesen
var elmXY = function (id) {
	var arrPos = new Array();
	var x,y;
	var xy = Element.getDimensions($(id));
	arrPos[0] = xy.width;
	arrPos[1] = xy.height;
return arrPos;
}

// ### FUNC ### Navigation beim Laden der Seite speichern.
function confirmBrowse (id) {
	var arrLinks = $(id).getElementsByTagName('a');
		for (var i = 0; i < arrLinks.length; i++) {
		// ID für jeden Link bauen
		var linkID = "linkid_" + i;
		// ID jedem Link zuweisen
		arrLinks[i].id = linkID;
		// Link-ID in Pseudo-Hash tun, als Value das Original-Ziel speichern
		navLinks[linkID] = arrLinks[i].href;
		// jedem Link einen onclick-Handler zuweisen
		arrLinks[i].onclick = checkWindows; // Handler für Click-Abfrage
		}
}

// ### HANDLER ### Zu anderer Seite wechseln oder nicht?
function checkWindows (e) {
	// ::: Länge des Pseudo-Hash lesen:
	var snipWindowsLength = 0;
	for (var i in snipWindows) {
		snipWindowsLength++;
	}
	
	// ::: Wenn noch Fenster offen sind ...
	if (snipWindowsLength > 0) {
		//alert(this.href);
		
		// ::: Text: Plural/Singular
		var txt1;
		snipWindowsLength == 1 ? txt1 = "virtuelles" : txt1 = "virtuelle";
		var txt2;
		snipWindowsLength == 1 ? txt2 = "wird dieses Fenster" : txt2 = "werden diese Fenster";
		// ::: Abfragen, ob zu anderer Seite wechseln:
		var goOn = confirm("Sie haben noch " + snipWindowsLength + " " + txt1 + " Fenster geöffnet. Beim Wechsel auf einen anderen Menüpunkt " + txt2 + " aus dem Speicher gelöscht. Wollen Sie dennoch fortfahren?");
			// Bei Abbruch den angeklickten Link auf die Adresse der aktuellen Seite ändern ('#' = aktuelle Seite + '#')
			if (goOn == false) {
				this.href = "#";
				//alert("Bleibe bei " + this.href);
				// Bei OK den richtigen Link aus dem Pseudo-Hash holen und dorthin wechseln.
				} else {
				//alert("Gehe zu " + navLinks[this.id]);
				window.location.href = navLinks[this.id];
			}
	}
}
