//var XMLHttp = new Object;

function XMLHttpObj() {

  if (window.XMLHttpRequest) {
    this.Request = new XMLHttpRequest();
  } else {
    try {
      this.Request = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try {
        this.Request = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        this.Request = null;
      }
    }
  }
  
  this.parseXML = function(xmlText) {
    if(window.DOMParser) {
      parser = new DOMParser();
      xmlDoc = parser.parseFromString(xmlText, "text/xml");
    } else {  // Internet Explorer
      xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
      xmlDoc.async = "false";
      xmlDoc.loadXML(xmlText);
    } 
    return xmlDoc;
  }
  
  this.escapeChars = function(srcString) {  // 06.07.2009: warum replace() und kein encodeURI[component]? Wg. Umlaut-Problemen ergänzt um letzteres...
    return encodeURIComponent(srcString).replace(/&/g, '%26');
    //return srcString.replace(/&/g, '%26');
  }
  
  this.formDataAsString = function(frm) {
    var frmData = '';
    var i = 0, j = 0;
    for(i=0; i<frm.elements.length; i++) {
      if(frm.elements[i].type == 'checkbox' || frm.elements[i].type == 'radio') {
        if(frm.elements[i].checked) {
          frmData += (frmData != '' ? '&' : '');
          frmData += frm.elements[i].name + '=' + this.escapeChars(frm.elements[i].value);
        }
      } else if(frm.elements[i].type == 'text' || frm.elements[i].type == 'password' || frm.elements[i].type == 'textarea' || frm.elements[i].type == 'select-one' || frm.elements[i].type == 'hidden' || frm.elements[i].type == 'button') {
        frmData += (frmData != '' ? '&' : '');
        frmData += frm.elements[i].name + '=' + this.escapeChars(frm.elements[i].value);
      } else if(frm.elements[i].type == 'select-multiple') {
        for(j=0; j<frm.elements[i].length; j++) {
          if(frm.elements[i][j].selected) {
            frmData += (frmData != '' ? '&' : '');
            frmData += frm.elements[i].name + '=' + this.escapeChars(frm.elements[i][j].value);
          }
        }
      }
    }
    return frmData;
  }
  
  this.sendRequest = function(method, url, callbackFunc, postData, remoteMethod) {  // wahlweise synchron oder asynchron, je nachdem ob callbackFunc gesetzt ist
    var doAsync = typeof(callbackFunc) == 'function';
    if(method == 'SOAP') {
      this.Request.open('POST', url, doAsync);
      this.Request.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
      this.Request.setRequestHeader('SOAPAction', remoteMethod);
      var soapStr = '<?xml version="1.0" encoding="utf-8"?>' +
                    '<SOAP-ENV:Envelope xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">' +
                    '<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><NS1:' + remoteMethod + ' xmlns:NS1="http://services">' +
                    postData +
                    '</NS1:' + remoteMethod + '></SOAP-ENV:Body></SOAP-ENV:Envelope>';
      postData = soapStr;
    } else {
      //postData = encodeURI(postData);  // auskommentiert nach Einführung von this.escapeChars(), sonst würde am anderen Ende nicht mehr vollständig dekodiert
      this.Request.open(method, url, doAsync);
    }
    if(doAsync) {
      var req = this.Request;
      this.Request.onreadystatechange = function() {
        if(req.readyState == 4)
          if(method == 'SOAP')
            callbackFunc(req.responseXML);
          else
            callbackFunc(req.responseText);
      }
    }
    if(method == 'POST') {
      this.Request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    }
  
    this.Request.send(postData);
  
    if(doAsync)
      return true;
    else
      return this.Request.responseText;
  }

}

XMLHttp = new XMLHttpObj();



