//
// Start von descent
//
// Funktionen: LadeModul, httpRequest[prototype], xml2dom[?],...

// Pfad zurückrechnen
var path = 'descent/'; // ???

var lightboardactivity = false; // Ist Lightboard aktiv?

// ... Script erst nach dem Laden der Seite starten ...

loadStylesheet(path+'styles.css'); // Vorladen des Desktops

loadScript(path+'configuration.js', main0); // Start des Script (main wie c)
loadScript(path+'modules/desktop/lightboard.js', ''); // Vorladen des Desktops
function main0(){
loadScript(path+'prototype.js', main); // Prototype laden}

function main()
{

    // Installationsabschnitt
    if(installed==false || installed==0 || installed=='no')
    {
	    // Lade Modul: Desktop
        loadScript(path+'modules/desktop/lightboard.js', function () { 
        	// Desktop initialisieren
    	    initLightBoard();
    	    // Entwicklermodus: Öffnet den Desktop beim Start
    	    if(developermode==true || developermode==1 || developermode=='yes')
    	    {
    	    	// Desktop anzeigen
                showLightBoard(this);
            }
        });
    
	
        // Lade Modul: Installation
        //     -> Benutzername, Passwort, FTP
        //     -> Autom. nach Head-Bereich in HTML und PHP Dateien suchen und descent einsetzen
        loadScript(path+'modules/install/install.js', function () { 
            initInstallView();
        });

    }
    // Laden
    else
    {
	    // Lade Modul: Desktop
        loadScript(path+'modules/desktop/lightboard.js', function () { 
        	if(lightboardactivity==false) {
    	        initLightBoard();
    	        lightboardactivity = true;
    	    
    	        // Entwicklermodus: Öffnet den Desktop beim Start
    	        if(developermode==true || developermode==1 || developermode=='yes')
    	        {
                    showLightBoard(this);
                }
            }
        });

        // Lade Modul: Installation
        //     -> Benutzername, Passwort, FTP
        //     -> Autom. nach Head-Bereich in HTML und PHP Dateien suchen und descent einsetzen
        loadScript(path+'modules/account/login.js', function () { 
        	if(checkLoginStatus()) {
        		loadScript(path+'modules/dock/dock.js', function () { initDockView(); });
        	}
        	else {
        		initLoginView();
        	}
        });

    }

}




// ########## ########## ########## ########## ########## ########## ########## ##########


/**
 * Initialisiere normales Applikationsfenster
 */
function initAppView(appname, appid, appicon)
{
	
	strAppView = '<div id="'+appid+'AppView" style="display:block;position:absolute;color:silver;font-family:Arial;font-size:0.8em;top:100px;left:50%;z-Index:110;width:500px;margin-top:-1em;margin-left:-250px;"><div id="'+appid+'TitleView" style="background:black;text-shadow:#C0C0C0 3px 3px 2px;"><img src="'+appicon+'" width="20" height="20" style="vertical-align:middle;" alt="" />'+appname+'<span id="'+appid+'TitleAnnexView" style="display:none;">&nbsp;</span></div><div id="'+appid+'MenuView" style="display:none;border-left:1px solid black;border-right:1px solid black;background:gray;">&nbsp</div><div id="'+appid+'TextView" style="overflow:auto;max-height:300px;border-left:1px solid black;border-right:1px solid black;">&nbsp;</div><div id="'+appid+'StatusView" style="display:none;background:grey;border-left:1px solid black;border-right:1px solid black;">&nbsp;</div><div id="'+appid+'ShadowView" style="background-image:url('+path+'modules/system/shadow.png);">&nbsp;</div></div>';
	
	var objInit = $('init');
	var objAppView = document.createElement("div");
    objAppView.setAttribute('id', appid);
    objAppView.onclick = function () {noHide=1;}
    objInit.insertBefore(objAppView, objInit.firstChild);
    
    objAppView.innerHTML = strAppView; //xml2dom.createDomBy(strAppView, 'appViewView');

}





/**
 * Growl-Prototype
 */
pGrowl = new Growl();
function Growl() {

    this.defaultTime = 10; // Sekunden
    this.defaultIcon = path+'modules/growl/growl.png'; // Icon
    
    this.holdId = false; // Wenn false dann alle redrawen. Wenn Zahl, dann alle danach redrawen ab holdId-Position
    //this. //
    
    this.interval = '';
    
    this.id = 0; // ID des Growl-Fensters
    this.count = 0;
    this.activearr = new Array();


}

Growl.prototype.add = function(param) {
	text = (param.text!=undefined) ? param.text: '';
	icon = (param.icon!=undefined) ? param.icon: this.defaultIcon;
	time = (param.time!=undefined) ? param.time: this.defaultTime;
	
	this.addMessage(text, icon, time);
}

Growl.prototype.addMessage = function(text, icon, time) {
	
	id = this.id;
	this.count++;
	appid  = 'growl'+id;
	this.activearr[this.id] = new Array(id, appid, time, time); // ID, AppID, GanzeAnzeigeZeit, ÜbrigeAnzeigeZeit, IntervalRef

	appicon = icon;
	


	strAppView = '<div id="'+appid+'AppView" style="display:block;position:absolute;background:black;-moz-border-radius:10px;border-radius:10px;color:silver;font-family:Arial;font-size:0.8em;right:20px;width:200px;margin-left:-250px;"><div id="'+appid+'TextView" style="padding:5px;height:35px;vertical-align:middle;"><img src="'+appicon+'" height="30px" alt="" style="margin-right:5px;float:left;vertical-align:middle;" /> <div style="overflow:auto;max-height:32px;height:30px;">'+text+'</div></div>';
	
	var objInit = $('init');
	var objAppView = document.createElement("div");
    objAppView.setAttribute('id', appid);
    objAppView.style.position = 'relative';
    toppos = (this.count - 1) * 50 + 30;
    objAppView.style.top = toppos+'px';
    //objAppView.style.backgroundColor = 'black';
    //objAppView.style.padding = '5px';
    objAppView.style.zIndex = '200';
    var self = this;
    var id = id;
    var appid = appid;
    objAppView.onmouseover = function() {self.pauseInterval(id, appid);} // Pause
    objAppView.onmouseout = function() {self.continueInterval(id);} // Continue
    objAppView.onclick = function() {noHide=1;self.deleteInterval(id, appid);} // Remove
    objInit.insertBefore(objAppView, objInit.firstChild);
    
    objAppView.innerHTML = strAppView; //xml2dom.createDomBy(strAppView, 'appViewView');
    
    this.addInterval(id);

	this.id++;
}

Growl.prototype.addInterval = function(id) {
    var self = this;
    //var id = id;
	this.activearr[id][4] = window.setInterval(function(){self.countdown(id);}, 1000);
}
Growl.prototype.pauseInterval = function(id, appid) {
	window.clearInterval(this.activearr[id][4]);
	this.activearr[id][3] = this.activearr[id][2];
	opac = 1;
    $(appid).style.filter = "Alpha(opacity="+(opac*100)+")"; // Spezifisch: IE
    $(appid).style.MozOpacity = opac; // Spezifisch: Mozilla
    $(appid).style.opacity = opac;
    
    this.holdId = id; // Halte...

}
Growl.prototype.continueInterval = function(id) {
    var self = this;
    var id = id;
	this.activearr[id][4] = window.setInterval(function(){self.countdown(id);}, 1000);
	
	this.holdId = false; // Starte...
    this.redrawPositions();
}
Growl.prototype.deleteInterval = function(id, appid) { // Löschen
	window.clearInterval(this.activearr[id][4]);



    // Array-Wert löschen und Array neu erzeugen
	var result = [];
    for (var i in this.activearr) {
    	var elem = this.activearr[i];
    	if(elem[0] != id && elem[0] != undefined) {
            result[elem[0]] = elem; // Aktives Growl-Fenster

    	}
    }
    this.activearr = result;

    $(appid).removeNode(true);
	this.count--;


	this.redrawPositions();
}
Growl.prototype.countdown = function(id) {
	appid = this.activearr[id][1]; // AppID
	time = this.activearr[id][2]; // Komplette Anzeigezeit
	this.activearr[id][3] = this.activearr[id][3] - 1; // Übrige Anzeigezeit runterzählen
	timeleft = this.activearr[id][3]; // Übrige Anzeigezeit

	if(timeleft>=1) {
		if(timeleft>=(time/2)) {
		    opac = 1;
		}
		else {
		    opac = Math.pow(timeleft*2/time, 0.2);
		}
        $(appid).style.filter = "Alpha(opacity="+(opac*100)+")"; // Spezifisch: IE
        $(appid).style.MozOpacity = opac; // Spezifisch: Mozilla
        $(appid).style.opacity = opac;
	}
	else {
		this.deleteInterval(id, appid);
	}
}
Growl.prototype.redrawPositions = function() {

    // Redraw (Versetzen der Fenster)
    var count = 0;
    var HoldPos = 0;
    for (var i in this.activearr) {
    	var elem = this.activearr[i];

        if(elem[0] != undefined) {
        	
        	if(this.holdId==false){ // onmouseover ist nicht aktiv.
        	
                pos = (count-1) * 50 + 30 + 50;
                $(elem[1]).style.top =  pos+'px';    		
        		
        	}
            else if(this.holdId==elem[0]) { // onmouseover ist aktiv.
            	pos = $('growl'+this.holdId).style.top;
            	arr = pos.split('p');
            	countt = (count - 1) * 50 + 30 +50;
            	
            	index = count;
            	while(countt < arr[0]){countt = (index - 1) * 50 + 30 +50;index++;}
            	
            	HoldPos = countt;
            	count = index-1; // Aktuelle Position ermittelt
            	
            }
            else if(this.holdId<elem[0]) { // WENN nicht over OR holdId(2) < id(3,4,...) DANN poswechsel
                pos = (count-1) * 50 + 30 + 50;
                $(elem[1]).style.top =  pos+'px';

            }

            
            count++; // Nächste Position

    	}
    }



}






/**
 * Node.prototype.removeNode
 * Node.prototype.insertAfter
 */
Node.prototype.removeNode = function(removeChildren){	var self = this;	if (Boolean(removeChildren))	{		return this.parentNode.removeChild(self);	}	else	{		var range = document.createRange();		range.selectNodeContents(self);		return this.parentNode.replaceChild(range.extractContents(), self);	}}
Node.prototype.insertAfter = function(newNode)
{
    return this.parentNode.appendChild(newNode);
}




/* Lade Module...
 * von: http://design-noir.de/webdev/JS/loadScript/
 */
function loadScript(url, callback) {
	var f = arguments.callee;
	if (!("queue" in f))
		f.queue = {};
	var queue =  f.queue;
	if (url in queue) { // script is already in the document
		if (callback) {
			if (queue[url]) // still loading
				queue[url].push(callback);
			else // loaded
				callback();
		}
		return;
	}
	queue[url] = callback ? [callback] : [];
	var script = document.createElement("script");
	script.type = "text/javascript";
	script.onload = script.onreadystatechange = function() {
		if (script.readyState && script.readyState != "loaded" && script.readyState != "complete")
			return;
		script.onreadystatechange = script.onload = null;
		while (queue[url].length)
			queue[url].shift()();
		queue[url] = null;
	};
	script.src = url;
	document.getElementsByTagName("head")[0].appendChild(script);
}


/* Lade Module...
 * von: http://design-noir.de/webdev/JS/loadScript/
 */
function loadStylesheet(url) {
	var style = document.createElement("link");
	style.setAttribute('rel','stylesheet');
	style.type = "text/css";
	style.href = url;
	document.getElementsByTagName("head")[0].appendChild(style);
}







/** * Klasse: XML2DOM * Beschreibung: *    Erzeugt aus einer XML-Zeichenkette ein DOM-Objekt. * Beispielnutzung: *    xml2dom.createDomBy(xmlString, domNodeId); * * Geschrieben von Aurelian Hermand (xml2dom@devone.de) * URL: http://renegat.org/xml2dom * Herzlichen Dank geht an e-voc aus #javascript.de im Quakenet * * Version 1.2.0 (14.09.2006 19:40Uhr) */ var xml2dom = new function(){	this.xmlString = ''; // XML-Zeichenkette	this.domNodeId = ''; // DOM-ID	// Initialisierung    this.load = function()    {    }       // Erstellen der DOM Struktur aus der XML Zeichenkette    this.createDom = function()    {		this.createDomBy(this.xmlString, this.domNodeId);    }        // Erstellen des DOMs per ID    this.createDomById = function(domid)    {    	this.domNodeId = domid;    	this.createDomBy(this.xmlString, this.domNodeId);    }        // Erstellen des DOMs per String    this.createDomByString = function(xmlstr)    {    	this.xmlString = xmlstr;    	this.createDomBy(this.xmlString, this.domNodeId);    }        // Erstellen des DOMs per String und ID    this.createDomBy = function(xmlstr, domid)    {    	this.xmlString = xmlstr;    	this.domNodeId = domid;    			// Aufteilung in Tags und Text		var arr = new Array();		var whres = this.xmlString;		var xsplit = "";		var i = 0;		var xopen = 0;					while((xopen = whres.indexOf("<"))==0 || (xopen = whres.indexOf("<"))!=-1) {			if(xopen==-1) {break;}			if(xopen!=0) {				arr[i] = whres.substr(0, xopen);				i=i+1;				whres.substr(xopen, whres.length-xopen);			}						xclose = whres.indexOf(">"); // Position des Schliessen Tag			xsplit = whres.substr(xopen, xclose-xopen+1); // Elementinhalt mit < und >			whres = whres.substr(xclose+1, whres.length-xclose-1); // Rest			arr[i] = xsplit;			i++;		}		if(whres!="") {			arr[i] = whres;		}								// DOM Erstellung innerhalb des vorgegebenen Elementes		var domobj = new Object();		domobj = this.clearElem(domobj); // Elementinhalt leeren		domobj = document.getElementById(this.domNodeId); // Element wo alles rein soll		domobj = this.rekCreateDom(arr, domobj); // Elementarray, Position, ElemObj    }        // Rekursive Erstellung der DOM Elemente und Textknoten    this.rekCreateDom = function(arr, elem)    {    	if(arr.length<=0) { // Rekursion beenden    		return elem;    	}    	if(this.isText(arr[0])==true) { // Textknoten    		txt = document.createTextNode(arr[0]);    		elem.appendChild(txt);    		restarr = new Array();b=0;for(i=1;i<arr.length;i++){restarr[b] = arr[i];b++;}    		if(restarr.length==0) {return elem;}    		elem = this.rekCreateDom(restarr, elem);    		return elem;    	}    	else if(this.isSingleTag(arr[0])==true) { // isSingleTag    		tag = this.getTagName(arr[0]);    		newtag = document.createElement(tag);			singelem = elem.appendChild(newtag);			this.createAttributes(singelem, arr[0]);			restarr = new Array();b=0;for(i=1;i<arr.length;i++){restarr[b] = arr[i];b++;}    		if(restarr.length==0) {return elem;}    		elem = this.rekCreateDom(restarr, elem);			return elem;    	}    	else { // Start und Endtag rekursiv erstellen    		tag = this.getTagName(arr[0]);    		newtag = document.createElement(tag);			multelem = elem.appendChild(newtag);			this.createAttributes(multelem, arr[0]);						// Endtag zum Starttag finden			endTagPosition = this.getEndTagFromStartTag(arr, 0); // endTagPosition			// Ermitteln des Array Inhalts fÃ¼r den Rek.-Aufr. und fuer den Rest			var rekarr = new Array();			a=0;for(i=1;i<endTagPosition;i++) {rekarr[a] = arr[i];a++;}			var restarr = new Array();			a=0;for(i=endTagPosition+1;i<arr.length;i++) {restarr[a] = arr[i];a++;}			if(rekarr.length>0) {				this.rekCreateDom(rekarr, multelem); // Innereien erstellen. Muss nichts zurÃ¼ckgeben -> Rekursion			}			if(restarr.length>0) {				elem = this.rekCreateDom(restarr, elem); // Weitere Elemente danach hinzufÃ¼gen			}			return elem;    	}    }        // Ermitteln des EndTag anhand des Starttags    this.getEndTagFromStartTag = function(arr, startTagPosition)    {    	var startTagPosition = startTagPosition;    	var endTagPosition = 0;    			var counter = 0; // DurchlÃ¤ufe bis zum richtigen Endtag		var start = 0;		var end = 0;		for(var i=start; i<arr.length; i++) {			counter++;			if(this.isText(arr[i])==false) {				if(this.isSingleTag(arr[i])) {} // isSingleTag				else if(this.isEndTag(arr[i])==false) {start = start+1;}				else if(this.isEndTag(arr[i])==true) {end = end+1;if(start==end){break;}}			}		}        	endTagPosition = counter-1;    	return endTagPosition;    }        // ÃœberprÃ¼fen ob es ein Text ist    this.isText = function(txtortag)    {    	if(txtortag.slice(0, 1)!="<") return true;    	return false;    }        // ÃœberprÃ¼fen ob es ein einzelnes Element ist, wie <img />    this.isSingleTag = function(tag)    {    	if(tag.slice(0, 1)=="<" && tag[tag.length-2]=="/") return true;    	return false;    }        // ÃœberprÃ¼fen ob es ein einzelnes Element ist, wie <img />    this.isEndTag = function(tag)    {    	if(tag.slice(0, 1)=="<" && tag[1]=="/") return true;    	return false;    }        // Erstellen der Attributen    this.createAttributes = function(obj, tag)    {    	tagName = this.getTagName(tag);    	isST = this.isSingleTag(tag);    	    	// Attribute ausschneiden aus dem Tag    	rest = tag;    	rest = rest.substr(tagName.length+1, rest.length-tagName.length-1);    	if(this.isSingleTag(tag)==true) { // isSingleTag    		rest = rest.substr(0, rest.length-2);    	}    	else {    		rest = rest.substr(0, rest.length-1);    	}    	attrString = this.trim(rest);    	    	if(attrString=="") return false;    	    	// Attributname und -werte in ein Array legen    	var arr = new Array();    	var rest = attrString;    	var i = 0;    	while(attr = rest.indexOf('=')) {			if(attr==-1) { // Kein Attribut vorhanden				break;			}			if(attr!=0) {				attrname = rest.substr(0, attr); 					// AttrName ausschneiden				attrname = this.trim(attrname); 					// AttrName trimmen				rest = rest.substr(attr+1, rest.length-attr-1); 	// Rest ermitteln				rest = this.trim(rest); 							// Rest trimmen				val1 = rest.indexOf('"'); 							// 1. AnfÃ¼hrungszeichen				rest = rest.substr(val1+1, rest.length-val1-1); 	// Rest ermitteln ab 1. AnfÃ¼hrungszeichen 				val2 = rest.indexOf('"'); 							// 2. AnfÃ¼hrungszeichen				valname = rest.substr(val1, val2); 					// ValName zwischen 1. und 2. Anf.zeichen				rest = rest.substr(val2+1, rest.length-val2-1); 	// Rest ermitteln				rest = this.trim(rest);								// Rest trimmen								arr[i] = new Array(); 								// Beide Werte in ein Array schreiben				arr[i][0] = attrname;				arr[i][1] = valname;    		}    		    		i++;    	}    	// Attribute im DOM Format erstellen		for(i=0; i<arr.length; i++) {			attr = arr[i][0];			val = arr[i][1];			obj.setAttribute(attr, val);		}    }        // Erstellen eines Tagnamen aus <a> oder <a href=""> oder </a> oder </a>    this.getTagName = function(tagName)    {    	tagName = tagName.slice(1, (tagName.length-1));    	tagName = tagName.split(" ");    	return tagName[0];    }    	// Elementinhalt entfernen	this.clearElem = function(domObj)	{		domObj = document.getElementById(this.domNodeId);		while(domObj.firstChild!=null) {			domObj.removeChild(domObj.firstChild);		}		return domObj;    }        // Entfernen von Leerzeichen am Anfang und Ende    this.trim = function(str)    {		if(!str || str=="") return ""; 		while ((str.charAt(0)==' ') || (str.charAt(0)=='\n') || (str.charAt(0)=='\r')) {			str = str.substring(1, str.length);		}		while ((str.charAt(str.length-1)==' ') || (str.charAt(str.length-1)=='\n') || (str.charAt(str.length-1)=='\r')) {			str = str.substring(0, str.length-1);		}		return str;    		} }