var waiterContent;
var waiter;
function fallback(){
	if(waiter && waiter != null){
		waiter.innerHTML = waiterContent;
	}
}

function XML() {
	var _this = this;
	var req;
	this.post = {};
	this.onLoad;
	
	// --> Objekt erzeugen
	try {
		req = new XMLHttpRequest(); 
	} catch(e) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");  
		} catch (e2) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");  
			} catch (e3) {
				try {
					req = new ActiveXObject("Msxml2.XMLHTTP.4.0");
				} catch(e4) {
					req = false;
				}
			} 
		} 
	}
  
	this.Load = function(url, arg_method){
		if(document.getElementById('modalloader')){
			document.getElementById('modalloader').style.display = 'block';
		}
		if (!url) {
			return;
    	}
		var str = '';
		var method = (arg_method != 'POST') ? null : arg_method;
		
		// Array in String umwandeln
		if(method){
			for (key in this.post) {
				if (typeof(this.post[key]) == 'object') {
					var pair = '';
					for (key2 in this.post[key]) {
						if(pair!=''){
							pair += '&';
						}
						pair += key + '[]=' + encodeURIComponent(this.post[key][key2]);
					}
				} else {
					var pair = key + '=' + encodeURIComponent(this.post[key]);
				}
				str = (!str) ? pair : str + '&' + pair;
			}
			// Länge des Strings ermitteln
			//str = escape(str);
			req.open('POST', url, true);
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.setRequestHeader('Content-length', str.length);
			req.setRequestHeader('Connection', 'close');
		} else {
			req.open('GET', url, true);
        	str = null;
		}
		req.onreadystatechange = function() {
			if(req.readyState == 4) {
				if(document.getElementById('modalloader')){
					document.getElementById('modalloader').style.display = 'none';
				}
				if(req.status == 200) {
					// - Alles Ok
					_this.loaded();//output = req.responseText;
				} else {
					_this.failure();// - Es ist ein Fehler passiert
					
				}
			}
		};
		req.send(str);
	}
  
	this.loaded = function(){
		if(this.onLoad){
			this.onLoad(true, req);
		}
	}
	
	this.failure = function(){
		//alert("Es konnte keine Verbindung mit dem Server hergestellt werden\n");
		//fallback();
		if(this.onLoad){
			this.onLoad(false);
		}
	}
}
// --> Paramter: this.name oder Name des Formulars
function ajaxForm(callForm, action){
	var metaXML = new XML();
	// ---> Felder auslesen
	for (var i = 0; i < document.forms[callForm].length; ++i) {
		element = document.forms[callForm].elements[i];
		type = element.type;
		name = element.name;
		value = element.value;
		
		if(type == "text" || type == "hidden" || type == "password" || type == "textarea" || type == "submit"){
			// abfrage mit value
			// - Vorsicht!! Mehrfache Auswahl
			if(name.substr(name.length-2) == '[]'){
				name = name.substr(0, name.length-2)
				if(!metaXML.post[name] || typeof(metaXML.post[name]) != 'object'){
					metaXML.post[name] = new Array();
				}
				metaXML.post[name].push(value);
			} else {
				metaXML.post[name] = value;
			}
			//metaXML.post[name] = value;
			// abfrage mit value
		} else if(type == "checkbox"){
			if(element.checked){
				// abfrage mit value
				// - Vorsicht!! Mehrfache Auswahl
				if(name.substr(name.length-2) == '[]'){
					name = name.substr(0, name.length-2)
					if(!metaXML.post[name] || typeof(metaXML.post[name]) != 'object'){
						metaXML.post[name] = new Array();
					}
					metaXML.post[name].push(value);
				} else {
					metaXML.post[name] = value;
				}
			}
		} else if(type == "radio"){
			if(element.checked){
				metaXML.post[name] = value;
			}
		} else if(type == "select-one"){
			// --> ES WIRD NUR GESENDET WENN value="irgendwas" angegeben wurde
			// --> leere Values (z.B.: value="") werden nicht gesendet
			// --> ist kein Value-attribut angegeben wird das Label gesendet
			// --> ist ein Value angegeben wird dieser gesendet
			if(element.selectedIndex > -1){
				// Es wurde was ausgeählt...
				if(name.substr(name.length-2) == '[]'){
					name = name.substr(0, name.length-2)
					if(!metaXML.post[name] || typeof(metaXML.post[name]) != 'object'){
						metaXML.post[name] = new Array();
					}
					metaXML.post[name].push(value);
				} else {
					metaXML.post[name] = value;
				}
				/*
				if(element.options[element.selectedIndex].getAttribute("value") || element.options[element.selectedIndex].getAttribute("value") != ""){
					alert("Value gesetzt");
				} else {
					alert("Value nicht gesetzt");
				}
				alert("Länge: "+value.length);
				alert("Wert: "+value);
				*/
			}
		} else if(type == "select-multiple"){
			// --> ES WIRD NUR GESENDET WENN value="irgendwas" angegeben wurde
			name = name.substr(0, name.length-2)
			for(a=0; a<element.options.length; a++){
				if(element.options[a].selected && element.options[a].getAttribute("value")){
					if(!metaXML.post[name] || typeof(metaXML.post[name]) != 'object'){
						metaXML.post[name] = new Array();
					}
					metaXML.post[name].push(element.options[a].value);
				}
			}
		} else if(type == "button"){
			// --> Wird nicht gesendet
		} else if(type == "reset"){
			// --> Wird nicht gesendet
		} else if(type == "file"){
			// --> Noch nicht implementiert
		} else {
			alert(type+" - noch nicht implementiert");
		}
	}
	target = document.forms[callForm].getAttribute('ajaxTarget');
	onLoad = document.forms[callForm].getAttribute("onresponse");
	if(!action){
		action = document.forms[callForm].action;
	}
	action += (action.indexOf('?') == -1) ? "?ajax" : "&ajax";
	if(target){
		if(document.getElementById(target)){
			waiterContent = document.getElementById(target).innerHTML;
			waiter = document.getElementById(target);
			document.getElementById(target).innerHTML = '<table width="100%"><tr align="center"><td valign="middle"><img src="images/bar.gif" /></td></tr></table>';
		}
	} else {
		waiterContent = null;
		waiter = null;
	}
	metaXML.onLoad = function(success, res){
		if(success){
			parseResponse(res);
		} else {
			alert("Es konnte keine Verbindung mit dem Server hergestellt werden\n");
			fallback();
		}
		delete metaXML;
	}
	metaXML.Load(action, "POST");
	return false;
}

function loadPage(url, target, postvars){
	url += (url.indexOf('?') == -1) ? "?ajax" : "&ajax";
	var a = new XML();
	for(i in postvars){
		a.post[i] = postvars[i];
	}
	a.onLoad = function(success, req){
		if(success){
			parseResponse(req);
		} else {
			alert("Es konnte keine Verbindung mit dem Server hergestellt werden\n");
			fallback();
		}
	}
	if(target){
		if(document.getElementById(target)){
			waiterContent = document.getElementById(target).innerHTML;
			waiter = document.getElementById(target);
			document.getElementById(target).innerHTML = '<table width="100%"><tr align="center"><td valign="middle"><img src="images/bar.gif" /></td></tr></table>';
		}
	}
	a.Load(url, "POST");
}

function sendInf(url, postvars){
	var a = new XML();
	for(i in postvars){
		a.post[i] = postvars[i];
	}
	a.onLoad = function(success, req){
		if(success){
			parseResponse(req);
		} else {
			alert("Verbindungs-Fehler");
		}
	}
	a.Load(url, "POST");
}

/*


function parseTextResponse(req){
	req = req.responseText;
	anw = req.substring(0, req.indexOf(":"));
	switch (anw){
		case 'content':
			tmp = req.substring(req.indexOf(":"));
			target = tmp.substring(1, req.indexOf(":"));
			tmp = tmp.substring(req.indexOf(":"));
			content = tmp.substring(1, req.indexOf(":"));
			
			if(document.getElementById(target)){
				document.getElementById(target).innerHTML = content;
			}
		break;
		case '':
		break;
		default:
		break;
	}
}
*/

function checkCorrectResponse(req){
	reqO = req;
	req = req.responseXML;
	// - Mozilla-abfrage
	if(!req){
		return false;
	} else {
		// - IE Explorer Abfrage
		if(!req.firstChild){
			return false;
		} else {
			// unvollständige XML responses
			if (req.firstChild.childNodes[0].nodeName != 'fallback' && req.firstChild.childNodes[0].nodeName != 'content' && req.firstChild.childNodes[0].nodeName != 'alert' && req.firstChild.childNodes[0].nodeName != 'script') {
				return false;
			}
		}
	}
	return true;
}

function parseResponse(req){
	errorMessage = 'incorrect Response';
	if(!checkCorrectResponse(req)){
		alert(errorMessage);
		fallback();
	} else {
		req = req.responseXML;
		var jsCode = '';
		for (i = 0; i < req.firstChild.childNodes.length; i++) {
			switch (req.firstChild.childNodes[i].nodeName){
				case "fallback":
					fallback();
				break;
				case "content":
					var content = req.firstChild.childNodes[i].childNodes[0].nodeValue;
					// ScriptTags-filtern, und später mittels eval() ausführen
					//var Suche = /<script.*>([^<]*)<\/script>/gi;
					var Suche = /<script.*>([^<]*)<\/script>/i;
					var Suche = /((<[\s\/]*script\b[^>]*>)([^>]*)(<\/script>))/i;
					//var Suche = new RegExp('<script[^>]*>((.|\n)*)</script>', 'i');
					
					while (Ergebnis = Suche.exec(content)){
						jsTag = Ergebnis[0];
						js = Ergebnis[3];
						// 2 Start-tag
						// 3 js
						// 4 Endtag
//alert(js);
						index = Ergebnis['index'];
						input = Ergebnis['input'];
						
						jsCode += js;
						
						//alert(index);
						//alert(jsTag.length);
						contentb = content.substr(0, index);
						contente = content.substr(index + jsTag.length);
						//contente = content.substr(index + jsTag.length);
						
						content = contentb + contente;
						// FF - Workaround (findet er einmal nix, findet der nie was)
						delete Suche;
						var Suche = /<script>([^<]*)<\/script>/gi;
						var Suche = /((<[\s\/]*script\b[^>]*>)([^>]*)(<\/script>))/i;
					}
					
					// IE - Workaround
					var tmp_tag = document.createElement('div');
					var div_tag = document.getElementById(req.firstChild.childNodes[i].getAttribute('target'));
					div_tag.innerHTML = "";
					tmp_tag.innerHTML = content;
					div_tag.appendChild(tmp_tag);
				break;
				case "alert":
					alert(req.firstChild.childNodes[i].childNodes[0].nodeValue);
				break;
				case "script":
					eval(req.firstChild.childNodes[i].childNodes[0].nodeValue);
				break;
				default:
				break;
			}
		}
		if(jsCode){
			//alert(jsCode);
			eval(jsCode);
		}
	}
}
