/**
* Klasse für die Kommunikation per XMLHttpRequest
*
* @version $Id: ajax.js,v 1.2.2.7 2009/04/08 10:53:59 jues Exp $
*
* (c) Copyright 2005-2006 by FEDER Software
*
*/

var __ajaxVers = 10;

	function __setObjectValue (obj, name, val) {
		if(obj) {
			var x = name.split(".");
			
			for(var i = 0 ; i < x.length-1 ; i++)
				obj = obj[x[i]];
			obj[x[x.length-1]] = val ;
		}
	}

function _addNodes (xmlNode, htmlNode) {

	for(var i = 0 ; i < xmlNode.childNodes.length ; i++) {
	//	alert(xmlNode.childNodes[i].nodeName);
		if(xmlNode.childNodes[i].nodeName == "#text") {
			if(xmlNode.childNodes[i].nodeValue) {
				var newText = document.createTextNode(xmlNode.childNodes[i].nodeValue);
				htmlNode.appendChild (newText);
			}	
		} else {	
			var newElem = document.createElement(xmlNode.childNodes[i].nodeName);
			var attrs = xmlNode.childNodes[i].attributes ;
			
			if(attrs) {
				// Attribute setzen
				for(var j = 0 ; j < attrs.length ; j++) {
					switch(attrs[j].name) {
						case "class" :
							newElem.className = attrs[j].value ; 
							break ;
						case "style" :
							if(navigator.appName == "Microsoft Internet Explorer") {
								newElem.style.cssText = attrs[j].value ;
								break ;
							}	
						default :				
							if(document.createAttribute) {	// IE 5.5 kanns nicht
								var a = document.createAttribute(attrs[j].name);
							//	a.nodeValue = attrs[j].value;
							//	alert(attrs[j].name+" = "+attrs[j].value);
								if(a) {
									newElem.setAttributeNode(a);
									newElem.setAttribute(attrs[j].name, attrs[j].value);
								} else {
									alert(attrs[j].name+" = "+attrs[j].value);
								}	
							} else {
								switch(attrs[j].name) {
									case "title" :
										newElem.title = attrs[j].value ; break ;
									case "align" :
										newElem.align = attrs[j].value ; break ;
									default :
										alert("Attribute: "+attrs[j].name);
										break ;
								}	
							}	
							break ;
					}
				}	
			}	
	
			// Attribute setzen
			if(xmlNode.childNodes[i].nodeValue) {
				var newText = document.createTextNode(xmlNode.childNodes[i].nodeValue);
				newElem.appendChild(newText);
			} else if(xmlNode.childNodes[i].childNodes.length) {
				_addNodes (xmlNode.childNodes[i], newElem);
			}	
			htmlNode.appendChild(newElem);
		}	
	}		
}


var _Colors = new Array();
	_Colors[1] = "ff";
	_Colors[2] = "ee";
	_Colors[3] = "dd";
	_Colors[4] = "cc";
	_Colors[5] = "bb";
	_Colors[6] = "aa";
	_Colors[7] = "99";
	_Colors[8] = "88";


function outFading(strID, delay) {
	if (document.getElementById(strID)) {
		document.getElementById(strID).style.backgroundColor = "#ffff" + _Colors[8];
    	setTimeout("_fadeOut('"+strID+"', 7,"+delay+")", 1000);
	}
}

function _fadeOut(strID, step, delay) {
    if (step >= 1) {
        document.getElementById(strID).style.backgroundColor = "#ffff" + _Colors[step];
		step -= 1 ;        	
		setTimeout("_fadeOut('"+strID+"',"+step+","+delay+")", delay);
		if(step	== 0) {
	 	 	document.getElementById(strID).style.backgroundColor = "transparent";
	 	}	
    }
}

function ajax_noItem (nodeName) {
	if(confirm("Es wurde kein Eintrag für "+nodeName+" gefunden!\n\nWollen Sie den kompletten Rückgabewert sehen?")) {
		if(this.xmlReq) {
			alert (this.xmlReq.responseText);
		}
	}	
	if(this.url) {
		if(confirm("Wollen Sie die Anfrage im Browser öffnen ?")) {
			window.open (this.url, '', '');	
		}		
	}	
}

function ajax_alerts () {
	if(this.xmlReq) {
	//	alert(this.xmlReq.responseText);
		if(this.xmlReq.responseXML/* && this.xmlReq.responseXML.getElementsByTagName */) {
			var items = this.xmlReq.responseXML.getElementsByTagName("alert");
			
			for(var i = 0 ; i < items.length ; i++) {
				alert(items[i].firstChild.nodeValue);
			}		
		}	
	}
}	

/**
* im Tag JSDATA werden Javascript Variablen gesetzt 
*/
function ajax_jsVars() {
	if(this.xmlReq) {
		var items = this.xmlReq.responseXML.getElementsByTagName("JSDATA");

		if(! items.length)
			return false ;

		for(var i = 0 ; i < items.length ; i++) {
			if(items[i].getAttributeNode("varName")) {
				var varName = items[i].getAttributeNode("varName").value;
				var method = "eval";
				var value = items[i].firstChild.nodeValue;
								
			//	alert(varName +" = "+items[i].firstChild.nodeValue);
				if(items[i].getAttributeNode("method"))
					method = items[i].getAttributeNode("method").value ;
				switch(method) {
					case "eval" :
						eval(value);
						break ;
					case "replace":
						break ;
					case "add":
						break ;		
				}	
			}
		}
	}
}				

/**
* im Tag HTMLDATA wird HTML Code übergeben. Das Attribut ElemID  gibt an, welches Element
* damit bestückt werden soll.
*/
function ajax_innerHTML () {
	if(this.xmlReq && this.xmlReq.responseXML) {
		//alert(this.xmlReq.responseText);
		
		var items = this.xmlReq.responseXML.getElementsByTagName("HTMLDATA");

		if(! items.length) {
			return this.noItem("HTMLDATA");
		}	

		for(var i = 0 ; i < items.length ; i++) {
			if(items[i].getAttributeNode("ElemID")) {
				var strElemID = items[i].getAttributeNode("ElemID").value;
				var elem = document.getElementById (strElemID);
				var method = "replace" ;
				
				if(items[i].getAttributeNode("method"))
					method = items[i].getAttributeNode("method").value ;

				if(! elem) {
					// Element existiert noch nicht
					if(method == "create") {
						elem = document.createElement("div");
						elem.id = strElemID ;
//						elem.appendCild = document.createTextNode ("leeres Element");

						if(items[i].getAttributeNode("values")) {
							var values = items[i].getAttributeNode("values").value ;
							var x = values.split(";");
							
							for(var j = 0 ; j < x.length ; j++) {
								var y = x[j].split("=");
								
								__setObjectValue (elem, y[0], y[1]);
							}
						} 
						document.body.appendChild(elem);
					}	
				}	
				if(elem) {	
					if(elem.nodeName == "TABLE") {
						if(elem.firstChild)				// auf das TBODY Element gehen
							elem = elem.firstChild ;
					}
					switch(method) {
						case "remove" :
							elem.parentNode.removeChild(elem);
							break ;
						case "replace" :	
						case "create":
						default:
							switch(elem.nodeName.toLowerCase()){
								case "select":
								case "input":
								case "option":
								case "textarea":
									elem.value = ""; break;
								default:
									elem.innerHTML = ""; break;
							}		
						case "add" :
							switch(elem.nodeName.toLowerCase()){
								case "select":
								case "input":
								case "option":
								case "textarea":
									elem.value += items[i].firstChild.nodeValue;
									break;						
								default:	
									if(items[i].firstChild.nodeName == "#cdata-section") {
										elem.innerHTML = items[i].firstChild.nodeValue;
									} else {	
										_addNodes (items[i], elem);
									}	
									break;
							}	
							break ;
					}		
					elem.parentNode.style.display = "block";
							
					if(this.debug)
						alert(elem.innerHTML);
					try {
						if(elem.parentNode._doBlock) {		
							elem.parentNode.style.display = "block";
							elem.parentNode._doBlock = false ;
						} else {
							//alert("kein Block ?");
						}	
						if(elem.parentNode._doResize) {		
							if(elem.style.width) {
								alert(elem.style.width)
								elem.parentNode.style.width = elem.style.width;
							}	
							elem.parentNode._doResize = false ;
						}	
					} catch(e) {
						//alert("Fehler");
					}	
					if(items[i].getAttributeNode("fade")) {
						var delay = items[i].getAttributeNode("fade").value?items[i].getAttributeNode("fade").value:200;
						if(delay < 50)
							delay = 50 ;
						outFading(strElemID, delay);
					}
									
				}
			}		
		}
	}
}

/**
* wird aufgerufen, wenn der Server 200 (OK) gesendet hat
*/
function ajax_cbk200 () {
	this.alerts ();
	this.innerHTML ();
	this.jsVars ();
}

/**
* formatiert ein XML string <xjxquery> aus einem FORM Element
*/

function ajax_form2XML (frm) {
	var sXml = "<xjxquery><q>";
	var objForm;
	
	if (typeof(frm) == "string")
		objForm = document.getElementById(frm);
	else
		objForm = frm;
	
	var prefix="";
    if(arguments.length > 2)
   		prefix = arguments[2];	
	if (objForm && objForm.tagName == 'FORM') {
		var formElements = objForm.elements;
		
		for( var i=0; i < formElements.length; i++)	{
			if ((formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false)
				continue;
			if (!formElements[i].name)
				continue;
			if (formElements[i].name.substring(0, prefix.length) != prefix)
				continue;				
				
			var name = formElements[i].name;
			if(name) {
				if (sXml != '<xjxquery><q>')
					sXml += '&';
	 			if(formElements[i].type=='select-multiple') {
					for (var j = 0; j < formElements[i].length; j++) {
	 					if (formElements[i].options[j].selected == true)
							sXml += name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";
					}
				} else  {			
					sXml += name+"="+encodeURIComponent(formElements[i].value);
				} 
			}	
		}
	}
	sXml +="</q></xjxquery>";
	return sXml;
}

// Generates an XML message that xajax can understand from a javascript object

function ajax_object2XML (obj)	{
	var sXml = "<xjxobj>";
	for (i in obj) {
		try	{
			if (i == 'constructor')
				continue;
			if (obj[i] && typeof(obj[i]) == 'function')
				continue;
							
			var key = i;
			var value = obj[i];
			if (value && typeof(value)=="object" && (value.constructor == Array) && this.depth <= 50) {
				this.depth++;
				value = this.object2XML(value);
				this.depth--;
			}
			sXml += "<e><k>"+key+"</k><v>"+value+"</v></e>";
		}
		catch(e) {
			// <?php if ($this->bDebug){ ?>this.DebugMessage(e);<?php } ?>
		}
	}
	sXml += "</xjxobj>";
	return sXml;
}

function ajax_deleteReq () {
	if(this.xmlReq)
		delete this.xmlReq ;
	this.xmlReq = 0 ;	
}

function ajax_check4Queue () {
    var len = req.FuncQueue.length;
    if(len) {
    	if (req.xmlReq.readyState == 4) {		// ready, Seite geladen
	       	var FuncEntry = req.FuncQueue[0];
	       
	       	if(typeof(FuncEntry) != "undefined") {
		       	for(var i = 0 ; i < len-1 ; i++) {
		       		req.FuncQueue[i] = req.FuncQueue[i+1]
		       	}
		       	delete(req.FuncQueue[len-1]);
		       	status = "Aus Queue aufrufen "+FuncEntry["uri"]+" : "+FuncEntry["sFunction"];

		       	req.xmlReq.abort();
	       		req.call(FuncEntry["uri"], FuncEntry["sFunction"], FuncEntry["aArgs"], FuncEntry["method"]);
			}		       	
		}	
    }
}

function ajax_cbkReq () {
	//status = "readyState = "+req.xmlReq.readyState;
	
	if (req.xmlReq.readyState == 4) {	// ready, Seite geladen
		if (document.body)
			document.body.style.cursor = 'default';  
		if (req.xmlReq.status == 200) {	// Antwortcode 200 - alles OK
			req.cbk200();
		}	
		else {
           	alert("Fehler bei der Kommunikation mit dem Server\nServerantwort:\n" + req.xmlReq.statusText);			
        }	
		req.inUse = false ;
		if(req.setInWork == 1){
			if(self.resetInWork)
				self.resetInWork();
		}	
		req.setInWork = 0;
	    var len = req.FuncQueue.length;
    	if(len) {
			setTimeout("ajax_check4Queue()", 250);
		}	
	}
}

function ajax_loadXMLDoc(url, method, content, username, passwd) {    
    if(this.xmlReq) {
    	try {
    		switch(this.xmlReq.readyState) {
    			default:
    			case 4:
	  				this.xmlReq.abort();  	// falls ein Request läuft, ihn evtl.abbrechen
    			case 0:
    				if(this.inUse == false) {
    					break ;
    				}	
    			case 2:
    			case 3:
    			case 5:
    				return false ;
	  				break ;
			}
			this.inUse = true;
			this.xmlReq.onreadystatechange = ajax_cbkReq;

			if (document.body)
				document.body.style.cursor = 'wait';    	
			//status = "lade "+url;	
			if(! username)
				username = "" ;
			if(! passwd)
				passwd = "";	        	
        	// Request absetzen, asynchron (true), nicht blocken
        	
        	this.xmlReq.open(method, url, true, username, passwd);
        	if(method == "POST") {
				try	{
        			this.xmlReq.setRequestHeader("Method", "POST " + url + " HTTP/1.1");
					this.xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
				} catch(e) {
					alert("Ihr Browser unterstützt keine asynchronen Requests");
					return false ;
				}	
			}
        	this.xmlReq.send(content);
        	this.url = url ;
        	this.method = method ;
        	if(this.debug) 	{
        		window.open(url, '', '');
        	}
    	} 
    	catch(e) {
    		var strErr = "Fehler aufgetreten";
    		for(var x in e) {
    			try {
        			strErr += "\n" + x + " : " + e[x] ;
        		} catch(c) {
        		}		
        	}	
			alert(strErr);
			return false ;
    	}		
    	return true ;
    }
    return false ;
} 

function ajax_call (uri, sFunction, aArgs, method, setInWork) {
	var i,postData;

	this.setInWork = 0;
	if(self.setInWork && setInWork){
		self.setInWork(setInWork);
		this.setInWork = setInWork;
	}
	switch(this.xmlReq.readyState) {
		default:
		case 4:
//			alert(this.inUse+" "+uri+" : "+sFunction);
		case 0:
			if(this.inUse == false) {
				//alert("not in Use "+uri+" : "+sFunction);
				break ;
			}	
		case 2:
		case 3:
		case 5:
			// in FunktionCache packen
			var funcObj = new Object() ;
			funcObj["uri"] = uri ;
			funcObj["sFunction"] = sFunction;
			funcObj["aArgs"] = aArgs;
			funcObj["method"] = method;
			
			var nextIndex =  this.FuncQueue.length ; 				
			this.FuncQueue [nextIndex] = funcObj;
			status = " in Queue gestellt "+uri+" : "+sFunction;
			return false ;
			break ;
	}
	
	var value;
	switch(method) {
		case "GET":
			{
				var uriGet = uri.indexOf("?")==-1?"?xajax="+encodeURIComponent(sFunction):"&xajax="+encodeURIComponent(sFunction);
				if(__sessid)
					uriGet += "&PHPSESSID="+__sessid;
				for (i = 0; i < aArgs.length; i++) {
					value = aArgs[i];
					
					if (typeof(value)=="object") {
						if((value.tagName && value.tagName == "FORM")) {
							value = this.form2XML(value);
						}	
						else
							value = this.object2XML(value);
					}	
					uriGet += "&xajaxargs[]="+encodeURIComponent(value);
				}
				uriGet += "&xajaxr=" + new Date().getTime();
				uri += uriGet;
				postData = null;
			} 
			break;
		case "POST":
			postData = "xajax="+encodeURIComponent(sFunction);
			postData += "&xajaxr="+new Date().getTime();
			if(__sessid)
				postData += "&PHPSESSID="+__sessid;
			
			if (aArgs) {
				for (i = 0; i <aArgs.length; i++)
				{
					value = aArgs[i];
					if (typeof(value)=="object") {
						if((value.tagName && value.tagName == "FORM")) {
							value = this.form2XML(value);
						}	
						else
							value = this.object2XML(value);
					}	
					postData = postData+"&xajaxargs[]="+encodeURIComponent(value);
				}
			}		
			break ;
		default:
			break;		
	}	
	return this.loadXMLDoc (uri, method, postData, this.user, this.passwd);
}	

/**
* erzeugt ein Object der Klasse ajax
*/
function ajax(altURL) {
	this.debug = 0 ;
	this.depth = 0 ;
	this.user = "" ;
	this.passwd = "";
    this.inUse = false;
	
	this.workId='xajaxWork'+new Date().getTime();
	
	if (window.XMLHttpRequest) { 
    	// Test, ob der Browser ein eingebautes XMLHttpRequest-Objekt besitzt (Mozilla)
        this.xmlReq = new XMLHttpRequest();
        if(! this.xmlReq && altURL)
        	self.location.href = altURL ;
	} else {        
		// IE
		try {
    		this.xmlReq  = new ActiveXObject("Msxml2.XMLHTTP");
		} catch(e) {
    		try {
        		this.xmlReq  = new ActiveXObject("Microsoft.XMLHTTP");
    		} catch(e) {
        		this.xmlReq  = false;
        		if(altURL)
        			self.location.href = altURL ;
        	}
        }		
    }
	this.xmlReq.onreadystatechange = ajax_cbkReq;
    
    this.loadXMLDoc = ajax_loadXMLDoc ;
    this.cbk200 = ajax_cbk200 ;
    this.noItem = ajax_noItem ;
    this.innerHTML = ajax_innerHTML;
    this.jsVars = ajax_jsVars ;
    this.object2XML = ajax_object2XML;
    this.form2XML = ajax_form2XML;
    this.call = ajax_call;
    this.deleteReq = ajax_deleteReq;
    this.alerts = ajax_alerts;
    this.FuncQueue = new Array ();
    return this;
}    