/*

	MyWindowManagar 0.3.1
	Copyright (c)2006 Carsten Ruppert - carsten.ruppert-at-web.de

	>> You are not allowed to use, modify or distribute this code in any way without the permission of the author! <<
	
	Für tegos...
	
	0.3.1
	Fixes:
		- XML Connector wurde vernichtet, bevor die Serverantwort verarbeitet wurde
		- Safari konnte Fenster die geschlossen werden nicht identifizieren. Overlay wurde 	
	
	Browser:
	- Firefox und vermutl. alle anderen Mozilla Browser und Klone
	- Internet Explorer 6
	- Vieleicht Mac Safari 2.x
	
	Das geht:
	- Mehrere Fenster oeffnen und bewegen
		- BUG: Die Buttons verhalten sich etwas merkwuerdig - GEFIXT!
	- Verschieben auf der z-Achse durch anklicken der Titelleiste.
	- Content wird mit AJAX geladen. Oder in einem Iframe sollte das nicht funktionieren.
*/
function mywinman(){

	var winman = this;
	this.stack = new Array();
	this.active = null;
	this.order = new Array();
	this.qbox;
	this.xc = null;
	this.overlay = false;
	this.lastYPos = 0;
	
	this.initConnector = function(){
		if(window.XMLHttpRequest){ // Standart
			winman.xc = new XMLHttpRequest();
			return true;
			}
		else if(window.ActiveXObject){ // Microsoft
			try{
				winman.xc = new ActiveXObject("Msxml2.XMLHTTP");
				return true;
	            }catch(err){
					try{
						winman.xc = new ActiveXObject("Microsoft.XMLHTTP");
						return true;
					}catch(err){
					return false;
					}
				}
			}else{
			return false;
			}
		}

	this.destructConnector = function(){
		delete(winman.xc);
		return true;
		}

	this.buildQBox = function() {
		return;
		}
	
	this.appendOverlay = function(){
		var overlay = document.createElement('div');
		overlay.id="overlay";
		overlay.style.position = 'absolute';
		overlay.style.background = '#000000';
		overlay.style.top = '0';
		overlay.style.left = '0';
		overlay.style.width = '100%';
		if(document.body.offsetHeight){
			overlay.style.height = document.body.offsetHeight + 'px';
			}else{
			overlay.style.height = '100%';
			}
		overlay.style.zIndex = 99;
		overlay.style.display = 'none';
		
		// Store last Y Position
		if(document.documentElement.scrollTop){
			winman.lastYPos = document.documentElement.scrollTop;
			}else{
			winman.lastYPos = window.pageYOffset;		
			}

		window.scrollTo(0,0);
		document.body.style.height = '100%';
		document.body.style.width = '100%';
		document.body.appendChild(overlay);
		document.body.style.overflow = 'hidden';
		
		var overlayFade = new Effect.Appear(overlay,{duration: 0.3, to: 0.7});
		return overlay;
		}
	this.detachOverlay = function(){
		document.body.removeChild(winman.overlay);
		document.body.style.overflow = '';
		window.scrollTo(0,winman.lastYPos);
		winman.overlay = false;
		return;		
		}

	this.addWindow = function(uri,windowname,scrollbars,moveable,resizeable,closeable,basics,classprefix) {
		if(!this.overlay){
			this.overlay = this.appendOverlay();
			}

		var windowW = (window.innerWidth ? window.innerWidth : document.documentElement.clientWidth);
		var windowH = (window.innerHeight ? window.innerHeight : document.documentElement.clientHeight);

		if(this.overlay){
			var w = windowW - (windowW * 0.1);
			var h = windowH - (windowH * 0.1);
			var x = (windowW * 0.1) / 2;
			var y = (windowH * 0.1) / 2;
			var z = 100 * (winman.stack.length + 1);
		
		
			var winid = winman.stack.length;
		
			var container = document.createElement('div');
			container.style.display = "none";
			container.id = 'content'+winid;
			document.body.appendChild(container);
			
			
			var connector = winman.initConnector();					
			if(connector){	
				winman.xc.onreadystatechange = function () {
					if (winman.xc.readyState == 4 && winman.xc.status == 200) {
						container.innerHTML = winman.xc.responseText;
						void winman.destructConnector();
						}
					}
				winman.xc.open('GET',uri,true);
				winman.xc.send(null);
				}
	
			var win = new mywindow(container.id,w,h,x,y,z,windowname,scrollbars,moveable,resizeable,closeable,basics,classprefix);
			win.win.style.display = 'none';
			
			winman.stack[winman.stack.length] = win;
			win.win.id = winid;
			win._mclipzone.id = 'mclip'+winid;
			
			if(win.basics){
				win._btnreset.id = 'btres'+winid;
				win._btnmax.id = 'btmax'+winid;
				win._btnmin.id = 'btmin'+winid;
				}
			win._btnclose.id = 'btcls'+winid;

			var winAppear = new Effect.Appear(win.win,{duration: 0.5, from: 0.0, to: 1.0});
			
			if ( win.win.attachEvent ) {
				//win.win.attachEvent('onclick',winman.activate);	<--- Das gibt einen boesen bug mit dem Stack!!!
				win._mclipzone.attachEvent('onclick',winman.activate);
				if(win.basics){
					win._btnreset.attachEvent('onclick',winman.activate);
					win._btnmax.attachEvent('onclick',winman.activate);
					win._btnmin.attachEvent('onclick',winman.activate);
					}
				win._btnclose.attachEvent('onclick',winman.windowClosed);
				}
			else {		
				//win.win.addEventListener('click',winman.activate,false);	<--- Das gibt einen boesen bug mit dem Stack!!!
				win._mclipzone.addEventListener('click',winman.activate,false);		
				if(win.basics){
					win._btnreset.addEventListener('click',winman.activate,false);		
					win._btnmax.addEventListener('click',winman.activate,false);		
					win._btnmin.addEventListener('click',winman.activate,false);
					}
				win._btnclose.addEventListener('click',winman.windowClosed,false);
				}
			
			winman.active = win;
			//return win;
			}
		}

	this.getWindowId = function(ev){
		var winno;
		if(ev.srcElement){ // Safari & IExplore
			if(navigator.appVersion.indexOf("MSIE") > -1){
				winno = ev.srcElement.parentNode.id; // IExplore
				if ( winno == '' ) {
					winno = ev.srcElement.id.substring(5,ev.srcElement.id.length);
					}
				}else{// Safari Workaround:
				winno = ev.srcElement.id;
				// Get Window Id:
				winno = winno.substring(5,winno.length);
				}
			}
		else{// Alle anderen
			if(ev.target.parentNode){
				winno = ev.target.parentNode.id;
				}
			if(winno == '' || winno == null){
				winno = ev.target.id.substring(5,ev.target.id.length);
				}
			}
		return winno;
		}

	this.resetIds = function(){
		var tmpw;
		for ( i = 0; i < winman.stack.length; i++ ) {
			tmpw = winman.stack[i];
			tmpw.win.id = i;
			tmpw._mclipzone.id = 'mclip'+i;
			if(tmpw.basics){
				tmpw._btnreset.id = 'btres'+i;
				tmpw._btnmax.id = 'btmax'+i;
				tmpw._btnmin.id = 'btmin'+i;
				}
			tmpw._btnclose.id = 'btcls'+i;
			tmpw.setZ(((i + 1) * 100));
			}
		}
		
	this.windowClosed = function(ev){
		var affected = winman.getWindowId(ev);
		// Content Container loeschen
		var container = document.getElementById("content"+affected);
		var parent = container.parentNode;
		try{
			parent.removeChild(container);
			}
		catch(err){
			alert(err.description);
			}
		// Fenster vom Stapel loeschen:
		winman.stack.splice(affected,1);
		if(winman.stack.length > 0){
			// Es sind noch Fenster offen -> Ids neu setzen...		
			winman.resetIds();
			}else{
			// Keine weiteren Fenster offen...
			var overlayFade = new Effect.Appear(winman.overlay,{duration: 0.3, to: 0.0});
			winman.tout = window.setTimeout("winman.detachOverlay()",400);			
			}
		}
	

	
	
	this.activate = function (ev) {
		var winno = winman.getWindowId(ev);
		if ( winno == winman.stack.length -1 ) {
			return;
			}
		else {
			var win = winman.stack[winno];
			var nstck = new Array();
			for ( i = 0; i < winman.stack.length; i++ ) {
				if ( i == winno && (i + 1) < winman.stack.length ) {
					++i;
					nstck[nstck.length] = winman.stack[i];
					}
				else if (i != winno) {
					nstck[nstck.length] = winman.stack[i];
					}
				}
			nstck[nstck.length] = winman.stack[winno];
			winman.stack = nstck;
			void(delete(nstck));
			winman.resetIds();
			winman.active = winman.stack[winman.stack.length -1];
			return;
			}
		}
}

// Helper function to open a Window:
var winman = new mywinman();
function openMyWindow(par1,par2,scroll,skin){
	if (!scroll){
		scroll = false;
		}
	winman.addWindow(par1,par2,scroll,true,true,true,false,skin);
	}