function Ajax(URI, Data, Callback)
  {
  function _Callback()
    {
    // ermitteln des Verbindungsstatus
    if (__Ajax.readyState != 4) __Callback(__Ajax.readyState, null);
    else if (__Abort)
      {
      // Abbruch signalisieren
      __Callback(6, null);
      }
    else
      {
      // ermitteln der Antwortdaten
      var Data = __Ajax.responseText;
      
      // prüfen ob eine gültige Antwort vorliegt
      if (Data.substr(0, 2) != "{\"") __Callback(5, {"code" : 1, "message" : "Empfangene Daten haben ein ung\u00fcltiges Format.", "data" : Data});
      else
        {
        try
          {
          // prüfen ob Daten sich übersetzen lassen
          eval("Data = " + Data + ";");
          }
        catch (Exception) { __Callback(5, {"code" : 2, "message" : "Empfangene Daten konnten nicht \u00fcbersetzt werden.", "data" : Data}); }
        
        try
          {
          // Daten an Verarbeitungsfunktion senden
          __Callback(4, Data);
          }
        catch (Exception) { __Callback(5, {"code" : 3, "message" : "Beim ausf\u00fchren der Callback-Funktion ist ein Fehler aufgetreten.", "data" : Data}); }
        }
        
      // Verbidnung freigeben
      delete __Ajax;
      }
    }
    
  function _Control()
    {
    // ermitteln der Daten im IFrame
    try { var Data = __IFrame.contentWindow.document.body.innerHTML; }
    catch (Exception) { var Data = null; }
    
    // prüfen ob Daten ermittelt werden konnten
    if ((Data != null) && (Data != ""))
      {
      // Überwachung beenden
      window.clearInterval(__IFrameInterval);
      
      // prüfen ob HTML-Formatierung entfernt werden muss
      if (Data.substr(0, 5).toLowerCase() == "<pre>") Data = Data.substr(5, Data.length - 11);
      
      // prüfen ob Daten in einem gültigen Format sind
      if (Data.substr(0, 2) != "{\"") __Callback(5, {"code" : 4, "message" : "Empfangene Daten haben ein ung\u00fcltiges Format.", "data" : Data});
      else try
        {
        // prüfen ob Daten sich übersetzen lassen
        eval("Data = " + Data + ";");
        
        // Daten an Verarbeitungsfunktion senden
        __Callback(4, Data);
        }
      catch (Exception) { __Callback(5, {"code" : 5, "message" : "Empfangene Daten konnten nicht \u00fcbersetzt werden.", "data" : Data}); }
      }
    }
    
  // definieren der Abbruchfunktion
  this.abort = function()
    {
    // prüfen ob die Anfrage bereits abgebrochen wird
    if (!__Abort)
      {
      // Abbruch-Flag setzen
      __Abort = true;
      
      // ggf. Ajax-Anfrage abbrechen
      if (__Ajax != null) __Ajax.abort();
      if (__IFrame != null) window.clearInterval(__IFrameInterval);
      }
    }
    
  // initialisieren des Abbruch-Flags
  var __Abort = false;
  
  // übernehmen der Verarbeitungsfunktion
  var __Callback = Callback;
  
  // intialisieren der IFRAME und AJAX-Variablen
  var __Ajax = null;
  var __IFrame = null;
  
  // prüfen ob "pseudo" oder "echte" Ajax-Anfrage überwacht werden soll
  if (URI == null)
    {
    // ermitteln des zu überwachenden IFrame-Objektes
    var __IFrame = document.getElementsByName(Data)[0];
    
    // prüfen ob ein IFrame vorliegt
    if (!__IFrame.nodeName || (__IFrame.nodeName.toLowerCase() != "iframe")) __Callback(5, {"code" : 0, "message" : "Kein g\u00fcltiges IFRAME.", "name" : Data});
    else
      {
      try
        {
        // ermitteln des IFrame-Dokumentes
        var IFrameDocument = __IFrame.contentWindow.document;
        
        // leeren des IFrames
        while (IFrameDocument.firstChild != null) IFrameDocument.removeChild(IFrameDocument.firstChild);
        }
      catch (Exception) { }
      
      // überwachen des IFrames
      var __IFrameInterval = window.setInterval(_Control, 100);
      }
    }
  else
    {
    // erstellen des Verbindungsobjekts
    var __Ajax = null;
    try { __Ajax = new XMLHttpRequest(); }
    catch (Exception)
      {
      try { __Ajax = new ActiveXObject("Msxml2.XMLHTTP"); }
      catch (Exception)
        {
        try { __Ajax = new ActiveXObject("Microsoft.XMLHTTP"); }
        catch (Exception) { throw null; }
        }
      }
    
    // prüfen ob Anfrage per GET oder POST gesendet werden soll
    if (Data == null)
      {
      try
        {
        // Verbindungsanfrage vorbereiten
        __Ajax.open("GET", URI);
        __Ajax.onreadystatechange = _Callback;

        // ausführen der Anfrage
        __Ajax.send(null);
        }
      catch (Exception) { delete __Ajax; throw null; }
      }
    else
      {
      try
        {
        // Verbindungsanfrage vorbereiten
        __Ajax.open("POST", URI);
        __Ajax.onreadystatechange = _Callback;
        __Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        
        // ausführen der Anfrage
        __Ajax.send(Data);
        }
      catch (Exception) { delete __Ajax; throw null; }
      }
    }
  }