var ajax_instances = new Array();
var ajax_handlers = new Array();

/**
 * Instanz ermitteln
 *
 * Sucht nach einer bestehenden, freien Instanz eines AJAX Objekts und
 * liefert deren ID zurück.
 *
 * @return int Instanz-ID
 */
function ajax_load()
{
    // Nach einer bestehenden, freien Instanz suchen
    for(var i = 0; i < ajax_instances.length; i++)
    {
        if(ajax_instances[i].readyState == 0)
        {
            // Bestehende Instanz zurückgeben
            return ajax_instances[i];
        }
    }
    
    // Neue Instanz erzeugen
    return ajax_create();
}

/**
 * Neues Request Objekt erzeugen
 *
 * Erzeugt ein neues AJAX Objekt und registriert es im globalen Array,
 * so dass diese Instanz ohne Probleme wiederverwendet werden kann.
 * Zurückgegeben wird die ID der Instanz für eine spätere Wiedererkennung.
 *
 * @return int Instanz-ID
 */
function ajax_create()
{
    // Neue Instanz erzeugen
    var ajax_object = null;
    if(typeof XMLHttpRequest != "undefined")
    {
        ajax_object = new XMLHttpRequest();
    }
    if(!ajax_object)
    {
        try
        {
            ajax_object = new ActiveXObject("Msxml2.XMLHTTP");
        }
        catch(e)
        {
            try
            {
                ajax_object = new ActiveXObject("Microsoft.XMLHTTP");
            }
            catch(e)
            {
            }
        }
    }
    
    // Instanz registrieren und zurückliefern
    ajax_instances.push(ajax_object);
    return ajax_instances.length - 1;
}

/**
 * Event-Handler registrieren
 *
 * Registriert den Event-Handler einer Instanz. Dadurch kann jedem Befehl
 * eine eigene Aktion zugeordnet werden.
 *
 * @param int id Instanz-ID
 * @param string func Event-Handler-Funktion
 * @return void
 */
function ajax_handler(id, func)
{
    // Event-Handler registrieren
    ajax_handlers[id] = func;
}

/**
 * Anfrage senden
 *
 * Sendet eine GET Anfrage an das serverseitige Script [target]. [target]
 * muss eine gültige URL mit allen vom Script benötigten Variablen sein.
 *
 * @param int id Instanz-ID
 * @param string target Ziel-URL
 * @return void
 */
function ajax_request(id, target, parameters)
{
    // Parameter zusammenstellen
    var param_string = "";
    for(var parameter in parameters)
    {
        if(param_string.length > 0)
        {
            param_string += "&";
        }
        param_string += parameter + "=" + encodeURI(parameters[parameter]);
    }
    
    // Verbindung öffnen
    ajax_instances[id].open("POST", target, true);
    ajax_instances[id].setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset=UTF-8");
    
    // Response Funktion setzen
    var func = "ajax_response(" + id + ");";
    ajax_instances[id].onreadystatechange = new Function("", func);
    
    // Daten senden
    ajax_instances[id].send(param_string);
}

/**
 * Antwort ermitteln
 *
 * Reagiert auf eingehende Daten der registrierten Instanzen und ruft
 * den der ID entsprechenden Handler auf.
 *
 * @param int Instanz-ID
 * @return void
 */
function ajax_response(id)
{
    // Vollständige Datenübermittlung sicherstellen
    if(ajax_instances[id].readyState == 4)
    {
        // Daten ermitteln
        var response = ajax_instances[id].responseXML;
        if(ajax_handlers[id])
        {
            // Event-Handler aufrufen
            eval(ajax_handlers[id] + "(response)");
        }
    }
}
