// Creation Date: 31.01.2006
// Author:		  Wolfgang Sticht

/* Das ajax-Objekt enth?lt n?tzliche Funktionen f?r das dynamische Nachladen von Daten ?ber JS

 * Dateien, die Daten dynamisch liefern, m?ssen im Modulverzeichnis unter /incs/ajax liegen!
 * Die Funktion, die die Daten auswertet, muss nicht Teil des ajax-Objekts sein! Allerdings MUSS in dieser Funktion
      ajax.connectionInUse=false gesetzt werden! Anderenfalls k?nnen keine neuen Requests ausgef?hrt werden
 * Oft benutzte Funktionen zum Auswerten der Daten bitte hier ans ajax-Objekt anf?gen
 * WARNUNG!!! Zwar ist es m?glich, ?ber createConnection weitere Connections zu erstellen; Werden aber zu viele Connections erstellt,
      h?ngt sich der Browser auf! Deswegen wird empfohlen, nur eine Connection zu benutzen. Die Funktion ajax.requestACFile 
	  verz?gert einen zweiten Request, solange der erste noch l?uft.
 * Die Target-ID, falls ben?tigt, sollte VOR dem Request-Aufruf gesetzt werden!
 
*/

//?berpr?ft, ob das Objekt schon extern inizialisiert wurde
ajax.connectionInUse = false; //Gibt an, ob die Connection gerade benutzt wird oder frei f?r neue Requests ist
ajax.targetId = ""; //Die Target-ID findet Verwendung, wenn die Daten HTML-Code sind und in ein bestimmtes HTML-Element geschrieben werden sollen.
ajax.debug=false;

//Erstellt eine neue Verbindung
ajax.createConnection = function() {	var xmlHttp = null;	// Mozilla, Opera, Safari sowie Internet Explorer 7	if (typeof(XMLHttpRequest) == 'function' || typeof(XMLHttpRequest) == 'object') {	    xmlHttp = new XMLHttpRequest;	} else {		var servers = [            "MSXML2.XMLHTTP.3.0",            "MSXML2.XMLHTTP.6.0",            "MSXML2.XMLHTTP.4.0",            "MSXML2.XMLHTTP",    // v3.0            "Microsoft.XMLHTTP"  // v2.x		];				for (var i=0; i<servers.length;i++) {						try {				xmlHttp = new ActiveXObject(servers[i]);				break;			} catch(ex) {				xmlHttp = null;			}		}				/**	    // Internet Explorer 6 und älter	    try {	        xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");	    } catch(e) {	        try {	            xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");	        } catch(e) {	            alert('Doesen\'t work');	        }	    }	  */	}
	return xmlHttp;
}

//Überprüft, ob ein Request fertig durchgeführt und ein Ergebnis vorhanden ist; gibt true oder false zurück
ajax.checkReadyState = function() {
	/*
		if(ajax.connection.readyState == 4) {
			if(ajax.connection.status == 200) {
				return true;
			} else {		
				alert('Bei dem Request ist ein Problem aufgetreten.\nStatus '+ajax.connection.status);
			}
		} else {
			return false;
		}
	*/
	try {
		var readyState;
		var conStatus;
		readyState = ajax.connection.readyState;
			
	    if (readyState == 4) {	    	
	    	conStatus = ajax.connection.status;
	    			    	
	        if (conStatus == 200) {				
	        	return true;
	        } else {	            	            
	            return false;
	        }
	    } else {	    
	    	return false;
	    }
	} catch( error ) {
	   // alert('AJAX-Aufruf fehlgeschlagen:\n\nAlle AJAX Requests wurden abgebrochen und Ajax reaktiviert\n\nBrowser Fehlermeldung: \n' + error + '');
	    
		if (ajax.connectionInUse == true) {
			ajax.connection.onreadystatechange = function () {};
			ajax.connection.abort();
			ajax.connectionInUse = false;
		}	    
	    return false;
	}
}

//Holt die Pfade der einzelnen Module und schreibt sie in ajax.modulePaths; wird nur noch gebraucht, 
//wenn die general/incs/ajax.php nicht aufgerufen wird
ajax.requestModulePath = function() {
	ajax.connectionInUse=true;
	ajax.connection.open("GET", "/core/libs/utils/ajaxmoduleinfos.php");
	ajax.connection.send(null);
	ajax.connection.onreadystatechange=ajax.getModulePath;
}

//Zweiter Teil von ajax.requestModulePath
ajax.getModulePath = function() {
	if(ajax.checkReadyState()) {
		ajax.modulePaths=new Array;
		var response=unescape(ajax.connection.responseText);
		var tmp=new Array;
		var tmp2=new Array;
		var i=0;
		tmp=response.split("\n");
		for(i=0; i<tmp.length; i++) {
			tmp2=tmp[i].split(":|:");
			ajax.modulePaths[tmp2[0]]=tmp2[1];
		}
	}
	ajax.connectionInUse=false;
}

//Startet den Request einer Ajax-File, die dynamischen Content liefern soll
//module: Modulname
//procedure: Name der gew?nschten Ajax-Datei (ohne .php)
//replyFunction: Name der JS-Funktion, die die Antwort des Requests verarbeiten soll
//vars: Assoziatives Array mit Variablen, die ?bergeben werden sollen (name => value) oder Varstring (name1=value1&name2=value2...)
ajax.requestACFile = function(module, procedure, replyFunction, vars) {
	if(typeof(vars)!="string") {
		vars=ajax.varsToVarstring(vars);
	}
	if(ajax.connectionInUse) {
		setTimeout("ajax.requestACFile('"+module+"', '"+procedure+"', '"+replyFunction+"', '"+vars+"');", 100);
	} else {
		ajax.connectionInUse=true;
		ajax.connection.open("POST", ajax.modulePaths[module]+"/incs/ajax/"+procedure+".php");
		ajax.connection.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		ajax.connection.send(vars);
		eval("ajax.connection.onreadystatechange="+replyFunction+";");
	}	
}

ajax.requestACFileViaModload = function(module, procedure, replyFunction, vars, noLoadingScreen) {	if(noLoadingScreen!==true) {		document.getElementById(ajax.targetId).innerHTML=layout.loadingScreen;	}	if(typeof(vars)!="string") {		vars=ajax.varsToVarstring(vars);	}	if(ajax.connectionInUse) {		setTimeout("ajax.requestACFileViaModload('"+module+"', '"+procedure+"', '"+replyFunction+"', '"+vars+"');", 100);	} else {		ajax.connectionInUse=true;		ajax.connection.open("POST", "/drowcrm/modload.php");		vars=ajax.varstringToVars(vars);		vars['murl']=ajax.modloadPaths[module]+"/incs/ajax/"+procedure+".php";		vars=ajax.varsToVarstring(vars);		ajax.connection.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");		ajax.connection.send(vars);			if (replyFunction != '') { 
			eval("ajax.connection.onreadystatechange="+replyFunction+";");		}	}		}ajax.requestACFileViaModloadCMS = function(module, procedure, replyFunction, vars, noLoadingScreen) {	if(noLoadingScreen!==true) {		document.getElementById(ajax.targetId).innerHTML=layout.loadingScreen;	}	if(typeof(vars)!="string") {		vars=ajax.varsToVarstring(vars);	}	if(ajax.connectionInUse) {		setTimeout("ajax.requestACFileViaModloadCMS('"+module+"', '"+procedure+"', '"+replyFunction+"', '"+vars+"');", 100);	} else {		ajax.connectionInUse=true;		ajax.connection.open("POST", "/drowadmin/modload.php");		vars=ajax.varstringToVars(vars);		vars['murl']=ajax.modloadPaths[module]+"/incs/ajax/"+procedure+".php";		vars=ajax.varsToVarstring(vars);		ajax.connection.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");		ajax.connection.send(vars);		eval("ajax.connection.onreadystatechange="+replyFunction+";");	}		}
//Get-Funktion, die den zurückgegebenen HTML-Code in das HTML-Element mit der Target-ID schreibt
ajax.getHtmlToTargetId = function() {
	if(ajax.checkReadyState()) {
		if(ajax.debug==true) {
			alert(unescape(ajax.connection.responseText));
		}
		document.getElementById(ajax.targetId).innerHTML=unescape(ajax.connection.responseText);
		ajax.connectionInUse=false;			
	}	
}

/*Verwandelt ein assoziatives Array mit Variablen in einen Varstring (name1=value1&name2=value2...) */
ajax.varsToVarstring = function(vars) {
	var varstmp=new Array();
	var result="";
	for(i in vars) {
		if(i!="" && typeof(vars[i]) != 'function') {
			varstmp[varstmp.length]=i+"="+vars[i];
		}
	}
	result=varstmp.join("&");
	return result;
}

//Verwandelt einen Varstring (name1=value1&name2=value2...) in ein assoziatives Array
ajax.varstringToVars = function(varstring) {
	var result=new Array();
	var varstmp=new Array();
	var varstmp2=new Array();
	varstmp=varstring.split("&");
	for(i in varstmp) {
		if (typeof(varstmp[i])=="string")	varstmp2=varstmp[i].split("=");
		result[varstmp2[0]]=varstmp2[1];
	}
	return result;
}

ajax.submitFormToAjax = function(formNode) {
	if(ajax.connectionInUse) {
		ajax.submitFormToAjaxTempNode = formNode;	
		setTimeout( "ajax.submitFormToAjax(ajax.submitFormToAjaxTempNode);", 100);
	} else {		
		querystring = "&";
		querystring = getFormElements(formNode, querystring);
		ajax.connection.open('POST','modload.php', true);
		ajax.connection.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		if (querystring == "&") {
			querystring = null;
		}
		ajax.connection.send(querystring);
		ajax.connection.onreadystatechange = ajax.executeCommand;
	}		
}

ajax.executeCommand = function() {	if(ajax.checkReadyState()) {	
		ergebnis = new Array;
		ergebnis = unescape(ajax.connection.responseText).split(':!!:');		if (ergebnis[0] == 'displayToElement') {
			document.getElementById(ergebnis[1]).innerHTML = ergebnis[2];	
		}
		if (ergebnis[0] == 'runScript') {
			eval(ergebnis[1]);
			eval(ergebnis[2]);
		}
		ajax.connectionInUse = false;			
	}
}

//Aufruf der SuggestionSearch:   ... onkeyup="getEntryList(this, DATEINAME);"
function getEntryList(searchfield, ss_file) {		
	ajax.entry_list_target = searchfield;
	if(ajax.connectionInUse) {			
		setTimeout("getEntryList(ajax.entry_list_target, '"+ss_file+"');", 100);
	} else {			
		ajax.connectionInUse=true;		
		ajax.connection.open("GET", ss_file+"&search="+searchfield.value);
		ajax.connection.send(null);
		ajax.connection.onreadystatechange = showSelection;
	}
}
//Zeigen der Auswahl der SuggestionSearch
function showSelection() {
	if(ajax.checkReadyState()) {
		ergebnis = unescape(ajax.connection.responseText).split(':!!:');
		if(navigator.appName == "Netscape") {
			document.getElementById(ajax.entry_list_target.id+'_selection').style.marginLeft="0px";
			document.getElementById(ajax.entry_list_target.id+'_selection').style.marginTop="1px";
			document.getElementById(ajax.entry_list_target.id+'_selection').style.width="224px";
		} else {
			document.getElementById(ajax.entry_list_target.id+'_selection').style.marginLeft="-233px";
			document.getElementById(ajax.entry_list_target.id+'_selection').style.marginTop="20px";
			document.getElementById(ajax.entry_list_target.id+'_selection').style.width="230px";
		}	
		if (ergebnis[1] >= 1) {
			document.getElementById(ajax.entry_list_target.id+'_selection').style.visibility = 'visible';
			document.getElementById(ajax.entry_list_target.id+'_selection').innerHTML = ergebnis[0];
			window.akt_entry = -1;
			window.last_entry = (parseInt(ergebnis[1]));
			for (i = 0; i < last_entry; i++) {
				//document.getElementById('entry'+i).onkeydown = findKey;
			}
		} else {
			document.getElementById(ajax.entry_list_target.id+'_selection').style.visibility = 'hidden';
			document.getElementById(ajax.entry_list_target.id+'_selection').innerHTML = '';
		}

		ajax.connectionInUse=false;	
	}
}

// function findKey stellt fest welche taste gedr?ckt wurde und entscheidet wann etwas passieren soll

function findKey(Ereignis) {
	// abfragen des browsers netscape ja/nein
	var Netscape = new Boolean();
	if(navigator.appName == "Netscape") Netscape = true; 

	if(Netscape == true) {			
		// erkennen der gedr?ckten taste im netscape
		dieserkey = Ereignis.which;
	} else {		
		// erkennen der gedr?ckten taste im IE
		Ereignis = window.event;
		dieserkey = Ereignis.keyCode;
	}

	// standardfunktion der pfeiltasten oben/unten ausschalten
	if (dieserkey == 38 || dieserkey == 40) {
		document.getElementById(ajax.entry_list_target.id).blur();
		if (Ereignis.preventDefault) {
			// f?r mozilla
			Ereignis.preventDefault();
		} else {
			// f?r IE
			Ereignis.returnValue = false;
		}
	}
	// sprung nach oben
	if (dieserkey == 38) {
		
		// festlegen was der n?chste eintrag ist
		if (akt_entry > 0) {
			// der n?chste in der liste
			window.old_entry = akt_entry;
			window.akt_entry = (parseInt(akt_entry) - 1);
		} else if (akt_entry == 0) {
			// der erste in der liste
			window.old_entry = akt_entry;
			window.akt_entry = (parseInt(last_entry) - 1);
		} else {
			// der erste in der liste
			window.akt_entry = (parseInt(last_entry) - 1);
		}
		
		//?ndern des focus und des hintergundes f?r den angesprungenen eintrag
		document.getElementById('entry'+akt_entry).focus();
		document.getElementById('entry'+akt_entry+'div').className = 'suggestion_entry_active';
		document.getElementById(ajax.entry_list_target.id).value = document.getElementById('entry'+akt_entry).innerHTML;
		
		// ?ndern des focus und des hintergundes f?r den vorhergehenden eintrag
		if (old_entry >= 0) {
			// wenn der n?chste eintrag der n?chste in der liste ist
			document.getElementById('entry'+old_entry+'div').className = 'suggestion_entry';
		}
	} 		
	
	// sprung nach unten
	if (dieserkey == 40) {
		
		// festlegen was der n?chste eintrag ist
		if (akt_entry < (parseInt(last_entry) - 1)) {
			// der n?chste in der liste
			window.old_entry = akt_entry;
			window.akt_entry = (parseInt(akt_entry) + 1);
		} else if (akt_entry == (parseInt(last_entry) - 1)) {
			// der erste in der liste
			window.old_entry = akt_entry;
			window.akt_entry = 0;
		} else {
			// der erste in der liste
			window.akt_entry = 0;
		}
		
		// ?ndern des focus und des hintergundes f?r den angesprungenen eintrag
		document.getElementById('entry'+akt_entry).focus();
		document.getElementById('entry'+akt_entry+'div').className = 'suggestion_entry_active';
		document.getElementById(ajax.entry_list_target.id).value = document.getElementById('entry'+akt_entry).innerHTML;
		
		// ?ndern des focus und des hintergundes f?r den vorhergehenden eintrag
		if (old_entry >= 0) {
			// wenn der n?chste eintrag der n?chste in der liste ist
			document.getElementById('entry'+old_entry+'div').className = 'suggestion_entry';
		}
	}
}


// tastenerkennung bei onkeydown global aufrufen
document.onkeydown = findKey;

//Erstelle die Connection
ajax.connection=ajax.createConnection();

