/**
 * Publimind AJAX Bibliothek.
 * @author S.Marletta
 * @since 0.1.2069
 */
var xmlHttpRequest = false;
var divId_dynamicContent = false;
var stopState = false;
var debugAjax = false;
var onXmlData = null;

/**
 * Erzeugt eine Instanz von AjaxRequest.
 * @param boolean sync TRUE wenn assyncrone Ausführung, andernfalls syncron.
 * @param int abortState Status bei welchem die Operation abgebrochen werden soll.
 * -1 wenn kein Abbruch gewünscht ist.
 */ 
function AjaxRequest(sync, abortState) {
    this.sync = sync;
    stopState = abortState;
    
    if (window.XMLHttpRequest) {
        xmlHttpRequest = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
        xmlHttpRequest = new ActiveXObject("Microsoft.XMLxmlHttpRequest");
    }
    
    if(xmlHttpRequest == false) {
    	alert('Ajax Request could not instanciated.');
    	return null;
    }
    
    this.setIdForUpdate= function(div_id) {
    	divId_dynamicContent = div_id;
    }    
    
    this.setDebugMode = function(mode) {
        debugAjax = mode;	
    }
    
    /**
     * Funktion implementiert das Event Handling von XML xmlHttpRequest Request.
     * Implementierbare Funktionen sind:
     * <ul>
     *    <li>onInit        - keine Parameter</li>
     *    <li>onObjectReady - keine Parameter</li>
     *    <li>onDataSent    - keine Parameter</li>
     *    <li>onRecieveData - keine Parameter</li>
     *    <li>onFinished    - 2 Parameter, Status Code und Antwort</li>
     * </ul>
     * 
     * Funktion bricht bei übergebenem abortState ab.
     */
    this.ajaxStateChanged = function() {
    	if(xmlHttpRequest.readyState == stopState) {
    	   if(divId_dynamicContent != null && divId_dynamicContent != false)
                document.getElementById(divId_dynamicContent).innerHTML = 'request stopped.';
                
    	   xmlHttpRequest.abort();	
    	}
    	
    	// Handling
    	switch(xmlHttpRequest.readyState) {
    		case 0: // Nicht initialisiert

    		  break;
    		case 1: // Objekt ist bereit, keine Daten gesendet

    		  break; 
    		case 2: // Anfrage wurde gesendet
    		        if(divId_dynamicContent != null && divId_dynamicContent != false) {
                        var div = document.getElementById(divId_dynamicContent);
                        if(div != null)
                            div.innerHTML = 'please wait, request sent ...';
                    }
    		  break;
    		case 3: // empfängt Daten
    		        if(divId_dynamicContent != null && divId_dynamicContent != false) {
                        var div = document.getElementById(divId_dynamicContent);
                        if(div != null)
                            div.innerHTML = 'please wait, while loading ...';
                    }
    		  break;
            case 4: // fertig
                    if(debugAjax) {
                        alert(
                            '[' + xmlHttpRequest.status + ']\n' + 
                            '[' + xmlHttpRequest.responseText + ']\n'
                        );
                    }
                        
                    if(divId_dynamicContent != null && divId_dynamicContent != false) {
                        var div = document.getElementById(divId_dynamicContent);
                        if(div != null)
                            div.innerHTML = xmlHttpRequest.responseText;
                    }
					
					if(onXmlData != null) {
						onXmlData(xmlHttpRequest.responseText);
					}
    		  break;
    	}
    }
    
    xmlHttpRequest.onreadystatechange = this.ajaxStateChanged;

    /**
     * Funktion führt AJAX Request aus, übergeben Sie stehts die 
     * Parameter in der paramList, da dann die Mehtod entschieden 
     * werden kann(GET/POST).
     * @param String url die URL die aufgerufen werden soll.
     * @param String paramList Eine Parameter Liste wie sie für ihren 
     * Server benötigt wird bei PHP z.B.: "id=1&user=2"
     * @param String method Die Art der Parameter übermittlung, POST/GET.
     * 
     * @return Das Ergebnis bzw. Die entsprechende Meldung.
     */
    this.execAjax = function(url, paramList, method) {
        var body = null;
        var message = "";
        
        if(url != null) {
            if(method != null) {
                if(method == "POST" && paramList == null || method == "PUT" && paramList == null) {
                    message += "Parameterlist für Methode Post/Put nicht gesetzt.<br>";
                }else if(method == "POST" && paramList != null || method == "PUT" && paramList != null) {
                    body = paramList;
                    message += "POST/PUT gewählt<br>";
                }
                
                message += "Öffnen(" + url + "?" + paramList.substr(0, 20) + " gekürzt.)<br>";
                if(method == "GET") {
                	
                    xmlHttpRequest.open(method, url + "?" + paramList, true);
                } else {
                    xmlHttpRequest.open(method, url, true);
                    xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                }
                    
                xmlHttpRequest.setRequestHeader("Pragma", "no-cache");
                xmlHttpRequest.setRequestHeader("Cache-Control", "must-revalidate");
                xmlHttpRequest.setRequestHeader("If-Modified-Since", document.lastModified);
                
                message += "Geöffnet<br>";
                xmlHttpRequest.send(body);
                message += "gestartet<br>";   
            }else {
                message += "Methode wurde nicht angegeben.<br>";
            }
        }else {
            message += "Keine URL übergeben.<br>";
        }
        return message; 
    }
} 