// XMLHttpRequest-Objekt erzeugen
function createRequestObject() {
   var http_request;
   
   if (window.XMLHttpRequest) { // Mozilla, Safari,...
      
      http_request = new XMLHttpRequest();
      if (http_request.overrideMimeType) {
         http_request.overrideMimeType('text/xml; charset=ISO-8859-1');
      }
   } else if (window.ActiveXObject) { // IE
      try {
         http_request = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (eee) {
         try {
            http_request = new ActiveXObject("Microsoft.XMLHTTP");
         } catch (e) {
            if(DEBUG) alert(e);
         }
      }
   }
   
   return http_request;
}

function ajax_random_id() {
   var dt = new Date();
   td = dt.getTime();
   return td;
}

/* AJAX Functions
 */

function ajax_newXmlHttpRequest( pResponseXmlHandler, pMethod, pUrl, pParms, pIsAsync ) {
   var myIndex = 0;
   var myXmlreq = false;
   var msg = '';
   var mySendParm = null; // .send(null) for non IE browsers
   // make request
   if (window.XMLHttpRequest) {
      myXmlreq = new XMLHttpRequest();
   }
   else if (window.ActiveXObject) {
      try {
         myXmlreq = new ActiveXObject("Msxml2.XMLHTTP");
         mySendParm='';
      }
      catch (e1) {
         try {
            myXmlreq = new ActiveXObject("Microsoft.XMLHTTP");
            mySendParm='';
         }
         catch (e2) {
            if(DEBUG) alert(e2);
         }
      }
   }
   // process request
   if ( myXmlreq ) {
      myIndex = ajax_random_id();
      myXmlreq.onreadystatechange=ajax_getReadyStateHandler(myXmlreq, pResponseXmlHandler, myIndex);
      // POST oder GET ???
      if ( pMethod == 'POST' ) {
         myXmlreq.open('POST', pUrl, pIsAsync);
      }
      else {
         if ( pParms != null ) {
            pUrl = pUrl + '?' + pParms;
         }
         //window.status(pUrl);
         myXmlreq.open('GET', pUrl, pIsAsync);
      }
      
      // request process start ...
      if ( pMethod == 'POST' ) {
         if (pParms) {
            myXmlreq.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');
            myXmlreq.setRequestHeader("Content-Length", pParms.length);
            myXmlreq.send(pParms);
         }
         else {
            myXmlreq.send(mySendParm); // send('') for IE, send(null) for non-IE browsers
         }
      }
      else {
         myXmlreq.send(null);
      }
      
      if ( pIsAsync == false ) { // not asynchronous --> handle response directly !!!
         if ( myXmlreq.status == 200 ) {
            pResponseXmlHandler( myXmlreq.responseXML, myXmlreq.responseText);
         }
         else {
            msg=myXmlreq.status+': '+myXmlreq.statusText;
         }
      }
      return myXmlreq;
   }
   else {
      //  msg="Could not create XMLrequest object...";
      //  alert(msg);
      return false;
   }
}

function ajax_getReadyStateHandler(pReq, pResponseXmlHandler, pIndex) {
   
   return function () {
      var msg='';
      if (pReq.readyState == 4) {
         try {
            if (pReq.status == 200) {
               if (pReq.responseXML) {
                  pResponseXmlHandler( pReq.responseXML, pReq.responseText);
               }
               else if (pReq.responseText) {
                  pResponseXmlHandler( null, pReq.responseText);
               }
               else {
                  msg="No response XML or Text attribute...";
               }
            }
            else {
               msg="HTTP error: "+pReq.status+"Statustext:"+pReq.statusText;
            }
         }
         catch (e) {
            // this exception shows up in Mozilla, and is NOT AN ERROR, therefore the empty try-catch sequence !!!
            //alert("PROCESS ERROR: " + e1 + '\nREADY-STATE: '+pReq.readyState + '\nSTATUS: ( !!! ) \nTEXT: '+pReq.responseText +'\nXML: '+pReq.responseXML);
            //ajax_changeStatusElement(pIndex, 6);
         }
      }
   };
}

// mögliche Attribute für XML-Textinhalt überprüfen und entsprechend abfragen
function getInnerText(node) {
   
   try{
      // Eigenschaft textContent überprüfen
      if (node.textContent != undefined) {
         return node.textContent;
      }
      
      // Eigenschaft text überprüfen
      else if (node.text != undefined) {
         return node.text;
         
      } else {
         
         // abhaengig vom Knotentyp den Inhalt ermitteln
         switch (node.nodeType) {
            case 3:
            case 4:
               return node.nodeValue;
               
            case 1:
            case 11:
               
               // Netscape
               if (navigator.appName == "Netscape"){
                  var innerText = '';
                  for (var i = 0; i < node.childNodes.length; i++) {
                     innerText += getInnerText(node.childNodes[i]);
                  }
                  return innerText;
               }
               
               // für den Fall das CDATA berücksichtigt werden muss
               if (node.firstChild != null && node.firstChild != undefined){
                  return node.firstChild.data;
               }
               
               // Eigenschaft innerText überprüfen
               if (node.innerText != null && node.innerText != undefined){
                  return node.innerText;
               }
               
               // Eigenschaft data zurückgeben
               return node.data;
               
               // wenn alles nicht hilft, leerer Inhalt
            default:
               return '';
         }
      }
   } catch (e) {
      if(DEBUG) alert(e);
   }
}

