

function Ajax() {
//Eigenschaften deklarieren und initialisieren
	this.url="";
	this.params="";
	this.method="POST";
	this.async = true;
	
	this.setMethod = function(m) {
		this.method = m;
	}
	
	this.setParams = function(p) {
		this.params = p;
	}
	
	this.setAsync = function(a) {
		this.async = a;
	}
	
	this.addParameter = function(key, value) {
		if(this.params) {
			this.params += "&" + key + "=" + value;
		} else {
			this.params = key + "=" + value;
		}
	}
	
	this.addParams = function(p) {
		if(this.params) {
			this.params += "&" + p;
		} else {
			this.params = p;
		}
	}
	
	this.setUrl = function(u) {
		this.url = u;
	}
	
	
	this.onError=function (msg) {
		alert(msg)
	}


	this.serializeNode = function(node) {
		/* 
			from: http://www.faqts.com/knowledge_base/view.phtml/aid/34646
		*/
		if (typeof XMLSerializer != 'undefined' ) {
			return new XMLSerializer().serializeToString(node);
		} else if (typeof node.xml != 'undefined') {
			return node.xml;
		} else if (typeof printNode != 'undefined') {
			return printNode(node);
		} else if (typeof Packages != 'undefined') {
			try {
				var stringWriter = new java.io.StringWriter();
				Packages.org.apache.batik.dom.util.DOMUtilities.writeNode(node, stringWriter);
				return stringWriter.toString();
			} catch (e) {
				// might want to handle problem here
				return '';
			}
		} else {
			// might want to handle problem here
			return '';
		}
	}

	this.run = function(url, id) {
		this.url = url;
		this.target = id;
		this.doRequest();
	}
	
	this.formatXSL = function(xml, xsl) {
		if(window.XSLTProcessor) {
			var xslt = document.implementation.createDocument("", "", null);
			xslt.async = false;
			xslt.load(xsl);
			var process = new XSLTProcessor();
			process.importStylesheet(xslt);
			return process.transformToDocument(xml);
		} else {
			var xslt = new ActiveXObject("MSXML2.FreeThreadedDOMDocument");
			xslt.async = false;
			xslt.load(xsl);
			var template = new ActiveXObject("MSXML2.XSLTemplate");
			template.stylesheet = xslt;
			var process = template.createProcessor();
			process.input = xml;
			process.transform();
			alert(process.output);
			var newDoc = document.createElement("div");
			newDoc.innerHTML = process.output;
			return newDoc;
		}
	}
	
	// called by doRequest	
	// default handling - sets target to responseText 
	// overwrite for special function handling 
	this.onSuccess = function(txt, xml) {
		if(this.target) {
			var e = document.getElementById(this.target);
			if(e) {
				e.innerHTML = txt;
			}
			/* the shows a way to format the xml-output and set e.innerHTML */
			/*
			var myXML = this.formatXSL(xml, "test2.xsl");
			var xxXML = myXML.getElementsByTagName('div')[0];
			str = this.serializeNode(xxXML);
			e.innerHTML = str;
			*/
		}
	}
}


Ajax.prototype.doRequest=function() {
//Ueberpruefen der Angaben
	if (!this.url) {
		this.onError("Es wurde kein URL angegeben. Der Request wird abgebrochen.");
		return false;
	}

	if (!this.method) {
		this.method="GET";
	} else {
		this.method=this.method.toUpperCase();
	}

//Zugriff auf Klasse fuer readyStateHandler ermoeglichen
	var _this = this;

//XMLHttpRequest-Objekt erstellen
	var xmlHttpRequest=getXMLHttpRequest();
	if (!xmlHttpRequest) {
		this.onError("Es konnte kein XMLHttpRequest-Objekt erstellt werden.");
	return false;
	}

//Fallunterscheidung nach Uebertragungsmethode
	switch (this.method) {
		case "GET": xmlHttpRequest.open(this.method, this.url+"?"+this.params, this.async);
					xmlHttpRequest.onreadystatechange = readyStateHandler;
					xmlHttpRequest.send(null);
					break;
		case "POST": xmlHttpRequest.open(this.method, this.url, this.async);
					xmlHttpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
					xmlHttpRequest.send(this.params);
					break;
	}
	if(this.async == true) {
		xmlHttpRequest.onreadystatechange = readyStateHandler;
	} else if(xmlHttpRequest.status == 200 || xmlHttpRequest.status == 304) {
		this.onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
	}
		

//Private Methode zur Verarbeitung der erhaltenen Daten
	function readyStateHandler() {
		if (xmlHttpRequest.readyState < 4) {
			return false;
		}
		if (xmlHttpRequest.status == 200 || xmlHttpRequest.status==304) {
			if (_this.onSuccess) {
				_this.onSuccess(xmlHttpRequest.responseText, xmlHttpRequest.responseXML);
			}
		} else {
			if (_this.onError) {
				_this.onError("["+xmlHttpRequest.status+" "+xmlHttpRequest.statusText+"] Es trat ein Fehler bei der Datenuebertragung auf.");
			}
		}
	}
}



Ajax.prototype.fillForm = function(name, sxml, selTag) {
	var elem = document.forms[name].elements;
	var str = '';
	if(selTag) {
		xml = sxml.getElementsByTagName(selTag)[0];		
  	} else {
  		xml = sxml;
  	}
  	
	for(var i = 0; i < elem.length; i++) {
		var myname = elem[i].name;
		if(myname) {
			var e = document.forms[name].elements[myname];
			if(e) {
				var data = xml.getElementsByTagName(myname);
				for (var x = 0; x < data.length; x++) {
					var v = '';
					if(data[x].firstChild) {
						v = xml.getElementsByTagName(myname)[x].firstChild.data;
					} 
					
// 	       alert("=====" + myname + ": " + e.type + " len: " + e.length);
						if(e.type == 'select-one' || e.type == 'select' || e.type == 'select-multiple' || e.type == 'checkbox') {
							this.writeElement(e, v, x);
						} else {
							if(!e.length) {
								this.writeElement(e, v, x);
							} else {
								for(var j = 0; j < e.length; j++) {
									var ee = e[j];
									this.writeElement(ee, v, x);
								}
							}
						}
				}
			}
		}
	}
	
}


Ajax.prototype.fillForms = function(xml) {
	
	str = this.serializeNode(xml.getElementsByTagName('liste')[0]);
	document.getElementById('tldlist').innerHTML = str;
	this.fillForm('ftld', xml, 'data');
}


Ajax.prototype.writeElement = function(e, v, x) {
  switch(e.type) {
    case 'radio' : if(v && e.value == v) e.checked = 'checked'; break;
    case 'select' :
    case 'select-one' :
      var opt = e.options;
      for(var i = 0; i < opt.length; i++) {
        var o = opt[i];
          if(o.value == v) {
            o.selected = 'selected';
          } else {
    //        o.selected = '';
          }
      }
      break;
    case 'select-multiple' :
      var opt = e.options;
      for(var i = 0; i < opt.length; i++) {
          var o = opt[i];
          if(o.value == v) {
              o.selected = 'selected';
          } else {
            if(x == 0)
              o.selected = '';
          }
      }
      break;
    case 'checkbox':
//      alert(e.name + ' ' + e.value + ' === ' + v); 
      if(v != '' && v != 0)
        e.checked = 'checked';
       else 
       	e.checked = '';
      break;
    default: e.value = v; break;
  }
}

Ajax.prototype.createXMLParam = function(f) {
 var xml = "";
  for(var i = 0; i < f.length; i++) {
    var e = f[i];
    if(e.name) {
      var v = encodeURIComponent(e.value);
      xml += "<" + e.name + ">" + v + "</" + e.name + ">";
    }
  }
  return xml;
}

//Gibt browserunabhaengig ein XMLHttpRequest-Objekt zurueck
function getXMLHttpRequest() {
	if (window.XMLHttpRequest) {
//XMLHttpRequest fuer Firefox, Opera, Safari, ...
		return new XMLHttpRequest();
	} else
		if (window.ActiveXObject) {
			try {
//XMLHTTP (neu) für Internet Explorer
				return new ActiveXObject("Msxml2.XMLHTTP");
			} catch(e) {
				try {
//XMLHTTP (alt) für Internet Explorer
					return new ActiveXObject("Microsoft.XMLHTTP");
				} catch (e) {
					return null;
				}
			}
		}
	return false;
}

 