/**
 * LisaAJAX
 * Javascript Ajax-Class for Lisa
 * Clientside
 * 
 * @version 1.0a
 * @author Andi Lehner
 * @copyright (c) Albis Capital, 2006        
 **/    

    /**
     *  Zeigt alle Select-, Input- und Textarea-Felder des aktuellen DOM-Baums an
     *  @return void Gibt nichts zurück
     *  @output string Gibt die Felder strukturiert zurück     
     **/
    function showFormularElements() {
        var thecontrol = document.getElementsByName("control")[0];
        var i = 0;        
        var result = "";
        
        i = 0;
        while (1 == 1) {
             if (document.getElementsByTagName("input")[i]) {
                 result += "[INPUT/" + document.getElementsByTagName("input")[i].type + "] " + document.getElementsByTagName("input")[i].name + " = " + document.getElementsByTagName("input")[i].value + "\n"; 
                 i++;
             } else {
                 break;
             }
        }

        i = 0;
        while (1 == 1) {
             if (document.getElementsByTagName("select")[i]) {
                 result += "[SELECT] " + document.getElementsByTagName("select")[i].name + " = " + document.getElementsByTagName("select")[i].length + "\n"; 
                 i++;
             } else {
                 break;
             }
        }

        i = 0;
        while (1 == 1) {
             if (document.getElementsByTagName("textarea")[i]) {
                 result += "[TEXTAREA] " + document.getElementsByTagName("textarea")[i].name + " = " + document.getElementsByTagName("textarea")[i].value.length + "\n"; 
                 i++;
             } else {
                 break;
             }
        }
        alert(result);
    }
    
	/**
	 * Zieht aus per Parameter übergebenen DOM-Feldern die Werte heraus und baut sie zum Übertragen per Ajax zusammen.
	 * @param string ID des Feldes
	 * @param string ID des nächsten Feldes, etc...
	 * @return string String zum Übergeben an die ServerClass     	 
	 **/          	
    function catchFields() {
        var result = "";
        var thefield = "";
	    for (var x = 0; x < catchFields.arguments.length; x++) {
             thefield = catchFields.arguments[x];
             //alert(thefield);
             if (document.getElementById(thefield)) {
                 if (document.getElementById(catchFields.arguments[x]).tagName == "INPUT" && document.getElementById(catchFields.arguments[x]).type == "checkbox") {
                     if (document.getElementById(catchFields.arguments[x]).checked) {
                          result = result + catchFields.arguments[x] + "=" + document.getElementById(catchFields.arguments[x]).value + ";;;";                 
                     } else {
                          result = result + catchFields.arguments[x] + "=;;;";                 
                     }
                 } else {	         
                     result = result + catchFields.arguments[x] + "=" + document.getElementById(catchFields.arguments[x]).value + ";;;";
                 }
             } else {
                 //alert(thefield + " kann nicht gefunden werden.");
             }
	    }
	    return result;
	}

    /**
     * Erstellt eine neue Ajax-Instanz
     * @return object Gibt die Ajax-Instanz zurück
     **/              
    function initAjax() {		
        var Ajax;
        try {
            Ajax = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                Ajax = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (oc) {
                Ajax = null;
            }
        }
        if(!Ajax && typeof XMLHttpRequest != "undefined")
            Ajax = new XMLHttpRequest();
        return Ajax;
    }
    
    /**
     * Führt einen Ajax-Request aus.
     * @param string Handle, in welches die zurückgelieferten Daten geschrieben werden sollen, siehe handleAjaxResult()
     * @param string Name der Datei, die geöffnet werden soll     
     * @param string Funktionsname der Funktion, welche auf dem Server ausgeführt werden soll.
     * @param string Unbegrenzt viele Parameter zur Übergabe an die Funktion auf dem Server
     * @return void Gibt nichts zurück          
     **/              
    function runAjax(handle) {
        var theajax;
        
        var i, aj;
        var url;
        var postdata;
        
        var parameters = runAjax.arguments;
        
        postdata = "ajaxtask=ajaxcall&isajax=1";
        for (i = 1; i < parameters.length; i++) {
            switch(i) {
                case 1 : url = parameters[i] + "?" + sid + ".."; break; 
                case 2 : postdata = postdata + "&runajaxfunc=" + parameters[i]; break;
                default: postdata = postdata + "&runajaxparams[]=" + escape(parameters[i]); break;
            }
        }
        
        aj = initAjax();
        aj.open("POST", url, true);

        aj.setRequestHeader("Method", "POST " + url + " HTTP/1.1");
        aj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        aj.setRequestHeader("Content-length", postdata.length);
        aj.setRequestHeader("Connection", "close");
        aj.setRequestHeader("Accept-Charset", "iso-8851-1");
        
        aj.onreadystatechange = function() {
            if (aj.readyState != 4) {
                return;
            }
            handleAjaxResult(handle, aj.responseText); 
        }
        aj.send(postdata);
        delete aj;
    }
    
    /**
     * Verarbeitet die von der Serverseite gesammelten Daten und bereitet sie auf die Wiedereingliederung ins DOM vor.
     * Die Funktion wird automatisch von runAjax aufgerufen!     
     * @param string Enthält die Felder, in welche später die Daten geschrieben werden sollen.
     * @param string Die Daten, welche vom Server per AJAX übertragen wurden
     * @return boolean Gibt bei Erfolg true zurück, ansonsten false
     **/                        
    function handleAjaxResult(handle, data) {
        if (handle != "") {
            if (data.substr(0,3) != "-=-") {
                var pos = handle.indexOf(",");
                if (pos > -1) {
                    var fields = handle.split(",");
                    var datablocks = data.split("############");
                    for (var i = 0; i < fields.length; i++) {
                        if (document.getElementById(fields[i])) {
                            addFieldContent(fields[i], datablocks[i]);
                        } else {
                            alert("Kann Container '" + fields[i] + "' nicht finden!");
                        }
                    }
                    return true;
                } else {            
                    if (document.getElementById(handle)) {
                        addFieldContent(handle, data);
                        return true;
                    } else {
                        alert("Kann Container '" + handle + "' nicht finden!");
                        return false;
                    }
                }
            } else {
                alert(data.substr(3));
            } 
        } else {
            alert("LisaAjax-Result: " + data);
        }
    }
    
    /**
     * Fügt in ein DOM-Objekt einen Wert ein.
     * @param string ID des Elements
     * @param string Neuer Wert des Elements
     * @return void               
     **/         
    function addFieldContent(fieldname, fieldvalue) {
        if (document.getElementById(fieldname)) {
            if (document.getElementById(fieldname).tagName == "SELECT") {
                while (document.getElementById(fieldname).length > 0) {
                    document.getElementById(fieldname).remove(0);                            
                }
                var s = fieldvalue.split("</option>");
                for (var x = 0; x < s.length; x++) {
                    if (s[x] != "") {
                        var thecaption = s[x].substr(s[x].indexOf(">")+1);
                        var thevalue = s[x].substr(s[x].indexOf("value=\"")+7);
                        thevalue = thevalue.substr(0, thevalue.indexOf("\""));
                        var selected = (s[x].indexOf("selected=") > -1 ? true : false);
                        newoption = new Option(thecaption, thevalue, false, selected);
                        document.getElementById(fieldname).options[document.getElementById(fieldname).length] = newoption;
                    }
                }
            } else if (document.getElementById(fieldname).tagName == "TEXTAREA") {
                document.getElementById(fieldname).value = fieldvalue;
            } else {
                if (fieldvalue != undefined) {
                    document.getElementById(fieldname).innerHTML = fieldvalue;
                } else {
                    alert("Empty resultset received for field '" + fieldname + "'.");
                }
            }
        } else {                     
            alert("Unable to find container for " + fieldname + "!");        
        }
    }
    
