/**
* AJAX-API-Modul
*/

  /* Array mit den aktiven XMLHttp-Objekten und ihren CallBack-Funktionen */
var aXmlHttp = new Array();

/**
* Erstellt ein XMLHttp-Objekt (je nach Browser) und gibt dieses zurück (bei Erfolg, sonst null).
*/
function ajax_getXmlHttp()
{
  var objXmlHttp = null;
  
    /* Internet Explorer 6 und älter */
  try
  {
    objXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
  }
  catch(ex)
  {
    try
    {
      objXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    catch(oex)
    {
      objXmlHttp = null;
    }
  }
  
    /* Mozilla, Internet Explorer 7, Safari, Opera, Konqueror */
  if(!objXmlHttp && typeof XMLHttpRequest != "undefined")
  {
    objXmlHttp = new XMLHttpRequest();
  }
  
  return objXmlHttp;
}

/**
* ONREADYSTATECHANGE-Handler für die XMLHttp-Objekte bei asynchronem Aufruf.
* Wird aufgerufen sobald sich der Status eines XMLHTTP-Objekt ändert
* (z.B. 4 == Serverantwort empfangen)
*/
function ajax_xmlResult()
{
  for(var i = 0; i < aXmlHttp.length; i++)
  {
      /* Prüfen ob ein XMLHttp eine Antwort empfangen hat */
    if(aXmlHttp[i] && aXmlHttp[i][0] && 
      aXmlHttp[i][0].readyState == 4 && aXmlHttp[i][0].responseText)
    {
        /* CallBack-Funktion des jeweiligen AJAX-Aufrufs ankicken und XMLHttp-Objekt nullen */
      var fCallback = aXmlHttp[i][1];
      var callbackParams = aXmlHttp[i][2];
      var sResponse = aXmlHttp[i][0].responseText;
      aXmlHttp[i][0] = null;
      aXmlHttp[i][1] = null;
      aXmlHttp[i][2] = null;
      aXmlHttp[i] = null;
      ajax_executeCallback(fCallback, callbackParams, sResponse);
    }
  }
}

/**
* Führt einen neuen AJAX-Aufruf durch Verwendung eines XMLHttp-Objektes aus
*/
function ajax_call(sUrl, fCallback, bAsync, callbackParams)
{
    /* Freien Slot im Array für XMLHttp-Objekte suchen */
  var idx = aXmlHttp.length;
  for(var i = 0; i < idx; i++)
  {
    if(aXmlHttp[i] == null)
    {
      idx = i;
      break;
    }
  }
  
    /* Neues XMLHttp-Objekt erstellen, CallBack-Funktion zwischenspeichern */
  aXmlHttp[idx] = new Array(2);
  aXmlHttp[idx][0] = ajax_getXmlHttp();
  aXmlHttp[idx][1] = fCallback;
  aXmlHttp[idx][2] = callbackParams;

  if (aXmlHttp[idx]) {
      if (bAsync == undefined) {
          bAsync = true;
      }

      /* URL per POST aufrufen und den ONREADYSTATECHANGEHANDLER registrieren (wenn nötig) */
      var pos = sUrl.indexOf("?");
      var sNewUrl = sUrl;
      var sPost = '';
      if (pos != -1) {
          sNewUrl = sUrl.substr(0, pos);
          sPost = sUrl.substr(pos + 1, sUrl.length - pos - 1);
      }
      aXmlHttp[idx][0].open("POST", sNewUrl, bAsync);
      if (bAsync) {
          aXmlHttp[idx][0].onreadystatechange = ajax_xmlResult;
      }

      aXmlHttp[idx][0].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      aXmlHttp[idx][0].setRequestHeader('Content-length', sPost.length);
      aXmlHttp[idx][0].send(sPost);

      /* Wenn der Aufruf synchron war, die CallBack-Funktion hier aufrufen, da der Skriptfluss
      auch im Scope hier weitergeht */
      if (!bAsync) {
          var sResponse = aXmlHttp[idx][0].responseText;
          aXmlHttp[idx][0] = null;
          aXmlHttp[idx][1] = null;
          aXmlHttp[idx][2] = null;
          aXmlHttp[idx] = null;
          ajax_executeCallback(fCallback, callbackParams, sResponse);

          return sResponse;
      }
      else {
          return true;
      }
  }
  
  return false;
}

/**
* Führt die Callback-Funktion aus
*/
function ajax_executeCallback(callback, callbackParams, sResponse)
{
  var cbType = (typeof callback).toLowerCase();
  if(cbType == "string")
  {
      /* Objekt-Methode aufrufen */
    var aCallback = callback.split(",");
    var obj = eval(aCallback[0]);
    if(obj && obj[aCallback[1]]) {
      obj[aCallback[1]](sResponse, callbackParams)
    }
  }
  else if(cbType == "function")
  {
      /* Funktion aufrufen */
    callback(sResponse, callbackParams);
  }
}