//<![CDATA[


// + --------------------------------------------------------------------------------------
// + XHRConnection
// + V1.3
// + Thanh Nguyen, http://www.sutekidane.net
// + 20.10.2005
// + http://creativecommons.org/licenses/by-nc-sa/2.0/fr/deed.fr
// + --------------------------------------------------------------------------------------
function XHRConnection() {

    // + ----------------------------------------------------------------------------------
    var conn = false;
    var debug = false;
    var datas = new String();
    var areaId = new String();
    // Objet XML
    var xmlObj;
    // Type de comportement au chargement du XML
    var xmlLoad;

    // + ----------------------------------------------------------------------------------
    try {
        conn = new XMLHttpRequest();
    }
    catch (error) {
        if (debug) { alert('Erreur lors de la tentative de création de l\'objet \nnew XMLHttpRequest()\n\n' + error); }
        try {
            conn = new ActiveXObject("Microsoft.XMLHTTP");
        }
        catch (error) {
            if (debug) { alert('Erreur lors de la tentative de création de l\'objet \nnew ActiveXObject("Microsoft.XMLHTTP")\n\n' + error); }
            try {
                conn = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (error) {
                if (debug) { alert('Erreur lors de la tentative de création de l\'objet \nnew ActiveXObject("Msxml2.XMLHTTP")\n\n' + error); }
                conn = false;
            }
        }
    }

    // + ----------------------------------------------------------------------------------
    // + setDebugOff
    // + Désactive l'affichage des exceptions
    // + ----------------------------------------------------------------------------------
    this.setDebugOff = function() {
        debug = false;
    };

    // + ----------------------------------------------------------------------------------
    // + setDebugOn
    // + Active l'affichage des exceptions
    // + ----------------------------------------------------------------------------------
    this.setDebugOn = function() {
        debug = true;
    };

    // + ----------------------------------------------------------------------------------
    // + resetData
    // + Permet de vider la pile des données
    // + ----------------------------------------------------------------------------------
    this.resetData = function() {
        datas = new String();
        datas = '';
    };

    // + ----------------------------------------------------------------------------------
    // + appendData
    // + Permet d'empiler des données afin de les envoyer
    // + ----------------------------------------------------------------------------------
    this.appendData = function(pfield, pvalue) {
        datas += (datas.length == 0) ? pfield+ "=" + escape(pvalue) : "&" + pfield + "=" + escape(pvalue);
    };

    // + ----------------------------------------------------------------------------------
    // + setRefreshArea
    // + Indique quel elment identifié par id est valoris lorsque l'objet XHR reoit une réponse
    // + ----------------------------------------------------------------------------------
    this.setRefreshArea = function(id) {
        areaId = id;
    };

    // + ----------------------------------------------------------------------------------
    // + createXMLObject
    // + Méthode permettant de créer un objet DOM, retourne la réfrence
    // + Inspiré de: http://www.quirksmode.org/dom/importxml.html
    // + ----------------------------------------------------------------------------------
    this.createXMLObject = function() {
        try {
                xmlDoc = document.implementation.createDocument("", "", null);
                xmlLoad = 'onload';
        }
        catch (error) {
            try {
                xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
                xmlLoad = 'onreadystatechange ';
            }
            catch (error) {
                if (debug) { alert('Erreur lors de la tentative de création de l\'objet XML\n\n'); }
                return false;
            }
        }
        return xmlDoc;
    }

    // + ----------------------------------------------------------------------------------
    // + Permet de définir l'objet XML qui doit être valorisé lorsque l'objet XHR reoit une réponse
    // + ----------------------------------------------------------------------------------
    this.setXMLObject = function(obj) {
        if (obj == undefined) {
                if (debug) { alert('Paramètre manquant lors de l\'appel de la méthode setXMLObject'); }
                return false;
        }
        try {
            //xmlObj = this.createXMLObject();
            xmlObj = obj;
        }
        catch (error) {
                if (debug) { alert('Erreur lors de l\'affectation de l\'objet XML dans la méthode setXMLObject'); }
        }
        return '';
    }

    // + ----------------------------------------------------------------------------------
    // + loadXML
    // + Charge un fichier XML
    // + Entrées
    // +    xml         String      Le fichier XML à charger
    // + ----------------------------------------------------------------------------------
    this.loadXML = function(xml, callBack) {
        if (!conn) return false;
        // Chargement pour alimenter un objet DOM
        if (xmlObj && xml) {
            if (typeof callBack == "function") {
                if (xmlLoad == 'onload') {
                    xmlObj.onload = function() {
                        callBack(xmlObj);
                    }
                }
                else {
                    xmlObj.onreadystatechange = function() {
                        if (xmlObj.readyState == 4) callBack(xmlObj)
                    }
                }
            }
            xmlObj.load(xml);
        }
            return '';
    }

    // + ----------------------------------------------------------------------------------
    // + sendAndLoad
    // + Connexion à la page désirée avec envoie des données, puis mise en attente de la réponse
    // + Entrées
    // +    Url         String      L'url de la page à laquelle l'objet doit se connecter
    // +    httpMode        String      La méthode de communication HTTP : GET, HEAD ou POST
    // +    callBack        Objet       Le nom de la fonction de callback
    // + ----------------------------------------------------------------------------------
    this.sendAndLoad = function(Url, httpMode, callBack, param) {
        httpMode = httpMode.toUpperCase();
        conn.onreadystatechange = function() {
            if (conn.readyState == 4 && conn.status == 200) {
                // Si une fonction de callBack a été définie
                if (typeof callBack == "function") {
                    callBack(conn,param);
                    return;
                }
                // Si une zone destinée à récupérer le résultat a été définie
                else if (areaId.length > 0){
                    try {
                        document.getElementById(areaId).innerHTML = conn.responseText;
                    }
                    catch(error) {
                        if (debug) { alert('Echec, ' + areaId + ' n\'est pas un objet valide'); }
                    }
                    return;
                }
            }
        };
        switch(httpMode) {
            case "GET":
                try {
                    Url = (datas.length > 0) ? Url + "?" + datas : Url;
                    conn.open("GET", Url);
                    conn.send(null);
                }
                catch(error) {
                    if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la méthode GET'); }
                    return false;
                }
            break;
            case "POST":
                try {
                    conn.open("POST", Url);
                    conn.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
                    conn.send(datas);
                }
                catch(error) {
                    if (debug) { alert('Echec lors de la transaction avec ' + Url + ' via la mthode POST'); }
                    return false;
                }
            break;
            default :
                return false;
            break;
        }
        return true;
    };
    return this;
}

//]]>