/**
 * Définit une classe abstraite pour l'appel des services en XMLHttpRequest
 * Il faut redéfinir la méthode de gestion des événements (handlerEvenement)
 * dans les classes filles.
 *      
 * @note      Copyright(C) CCI.fr SAS, 2004
 * @author    Olivier GUILLOUX <olivier.guilloux@entreprise.cci.fr>
 * @version   $Revision: 2828 $
 * @date      $Date: 2005-09-29 11:59:12 +0200 (jeu, 29 sep 2005) $
 */      

// Déclare un fonction d'instanciation intercompatible entre navigateurs 
if (typeof XMLHttpRequest == 'undefined') {
    XMLHttpRequest = function() {
        var msxmls = ['MSXML4', 'MSXML3', 'MSXML2', 'Microsoft'];

        for (var i=0; i < msxmls.length; i++) {
            try {
                return new ActiveXObject(msxmls[i]+'.XMLHTTP');
            } catch (exception) {
                // Affichage d'un avertissement tant qu'aucun parseur 
                // n'est trouvé
                var avertissement = new ExceptionAEF('WC004');
                avertissement.afficher();    
            }
            // Masquage de l'avertissement si parseur trouvé
            window.status = "";
        }
        throw new ExceptionAEF('WC001');
    }
}

/**
 * Initialisation de l'url du serveur accueillant les services
 *
 * @param p_url: Url du serveur accueillant les services
 */
function S_setUrl(p_url) {
    this.url = p_url;
}

/**
 * Retourne l'url du serveur accueillant les services
 *
 * @return: L'url du serveur accueillant les services
 */
function S_getUrl() {
    return this.url;
}

/**
 * Gestionnaire d'événement à redéfinir dans la classe fille
 */
function S_handlerEvenement(self) {
    window.status = 'Methode a redéfinir';
    if (self.xmlhttp.readyState == 4) {
        reponse = self.xmlhttp.responseText;
        alert(reponse);
    }
}

/**
 * Méthode appelé suite à l'appel du gestionnaire de service,
 * Cette méthode peut être redéfinit dans la classe fillte
 */
function S_finaliserExecution() {
    try {
        this.xmlhttp.send(null);
    } catch(e) {
        var avertissement = new ExceptionAEF("WC002");
        avertissement.afficher();
    }
}

/**
 * Execute l'appel du service
 */
function S_executer() {
    this.xmlhttp.open("GET", this.url, true);
    var self = this;
    this.xmlhttp.onreadystatechange = function() {
        self.resultat = self.handlerEvenement(self);
    };
    this.finaliserExecution();
}

function ClientService() {
    /* attribut */
    try {
        this.xmlhttp = new XMLHttpRequest();
    } catch(exception) {
        var avertissement = exception;
        if (!(exception instanceof ExceptionAEF)) {
            avertissement = new ExceptionAEF('WC005');
        }
        avertissement.afficher();
    }
    this.url = '';
    this.resultat = null;
    /* methodes */
    this.setUrl = S_setUrl;
    this.getUrl = S_getUrl;
    this.executer = S_executer;
    this.handlerEvenement = S_handlerEvenement;
    this.finaliserExecution = S_finaliserExecution;
}

