function AJAX(url,reqType,asynch){

	if(url == null)
		throw new Error("Le constructeur requiert un url");
	if(asynch != true && asynch != false)
		throw new Error("Le type de requête (asynchrone ou non) est requis dans le constructeur");
	if(reqType.toLowerCase() != "post" && reqType.toLowerCase() != "get")
		throw new Error("Le type d'envoi (post ou get) est requis dans le constructeur");
		
	/*
	PRIVATE
	*/
	this.__request__ = null;
	if(window.XMLHttpRequest){
        this.__request__ = new XMLHttpRequest();
    } else if(window.ActiveXObject){
        this.__request__=new ActiveXObject("Msxml2.XMLHTTP");
        if (!this.__request__){
            this.__request__=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
	this.__url__ = url;
	this.__asynch__ = asynch;
	this.__reqType__ = reqType;
	//this.__url__Vars sera poussé dans le tableau juste avant de faire le join("&")
	this.__url__Vars = arguments[3];//si GET cette valeur est nulle
	this.__urlVars__ = new Array();
	/*
	
	PUBLIC
	*/
	this.handleResponse = null;//on y affecte la fonction de recupération de document
	this.onreadystatechange = null;//on y affecte une fonction qui sera exécutée à chaque changement d'état de la requête
	this.responseXML = null;//la réponse xml est affectée ici
	this.responseText = null;//la réponse Texte est affectée ici
	this.waitingForResponse = false;//permet de savoir si on attend après une réponse du serveur
	this.status = null;// = 200 ok ou 404 not found
	this.statusText = null;//Reponse en mode texte de l'événement status
	/*
	0 = non initialisé, open() n'a pas encore été callé; 
	1 = en chargement, send( ) n'a pas encore été callé; 
	2 = loadé, send( ) a été callé, et headers/status sont disponibles; 
	3 = interactif, responseText contient des données partielles; 
	4 = complété.
	*/
	this.readyState = null;
	/*
	Événements
	*/
	this.onInitRequest = null;//quand une demande au serveur est faite, cette fonction est déclenchée
	this.onResponse = null;//quand la réponse du serveur est faite, cette fonction est déclenchée

}
AJAX.prototype.addUrlKeyVal = function(cle,valeur){
	//en premier lieu on regarde si le premier argument est un composant web
	//la variable valeur est donc nulle
	if(cle.type == "select-multiple"){//listbox multi select
		for(var t=0;t<cle.options.length;t++){
			if(!cle.options[t].selected)
				continue;
			this.__urlVars__.push(cle.name + "[]" + "=" + encodeURIComponent(cle.options[t].value));
		}
		return;
	}else if(cle.type == "select-one"){//listbox single select
		this.__urlVars__.push(cle.name + "=" + encodeURIComponent(cle.options[cle.selectedIndex].text));
		return;
	}else if(cle.type == "checkbox"){
		if(cle.checked){
			this.__urlVars__.push(cle.name + "=" + encodeURIComponent("on"));
			return;
		}
		this.__urlVars__.push(cle + "=" + encodeURIComponent("off"));
		return;
	}
	//sinon c'est une clé et une valeur
	this.__urlVars__.push(cle + "=" + encodeURIComponent(valeur));

}
AJAX.prototype.initRequest = function(){
    if(this.handleResponse == null)
		throw new Error("La methode handleResponse est requise");
	if(this.onInitRequest != null)
		this.onInitRequest();
	if(this.__request__ == null){
		alert("Votre fureteur ne permet pas d'utiliser toutes"+
              "\n les fonctionalités de cette application!\n Faites vos mises à jour");
		return false;
	}
	try{
		var me=this;
		this.__request__.onreadystatechange = function(){
			me.__onreadystatechange();
		}
        // Specifie la fonction qui va être appelée lors de la réponse du serveur
        this.__open(this.__reqType__,this.__url__,this.__asynch__);
        this.waitingForResponse = true;
		if(this.__reqType__.toLowerCase() == "post") {
            this.__setRequestHeader("Content-Type",
                    "application/x-www-form-urlencoded; charset=UTF-8");
            //des fois qu'un url serait passé par le constructeur
			if(this.__url__Vars != null)
				this.__urlVars__.push(this.__url__Vars);
			this.__send(this.__urlVars__.join("&"));
        }else{
            this.__send(null);
        }
		
    }catch(errv) {
        alert(
        "L'application ne peut contacter "+
        "le serveur pour le moment.\n"+
        "Essayez de nouveau dans quelques secondes.\n"+
        "Detail de l'erreur: " + errv.message + ".");
		return false;
    }

}
AJAX.prototype.__onreadystatechange = function(){

	if(!this.waitingForResponse)
		return false;
	this.readyState = this.__request__.readyState;
	if(this.readyState == 4){
		try{//le if plante dans mozilla quand une autre demande se fait avec le même objet sans que celui-ci n'ait encore reçu sa réponse
			this.status = this.__request__.status;
			this.statusText = this.__request__.statusText
			//alert(this.status)
            if(this.status == 200){//si la page a été trouvée
				this.waitingForResponse = false;
				this.responseXML = this.__request__.responseXML;
				this.responseText = this.__request__.responseText;
				//alert(this.responseText)
                this.handleResponse();
				if(this.onResponse != null)
					this.onResponse();
			}else{
              if (this.status == 404){
              	alert("La page n'a pu être trouvée sur le serveur\nErreur 404" + "\n\n« " + this.statusText + " »")
              }
              if (this.status >= 500){
              	this.responseText = this.__request__.responseText;
              	alert(this.responseText)
              	alert("Il y a possiblement une erreur dans la code\nde programmation puisque la page retourne un erreur  " + this.status + "\n\n« " + this.statusText + " »")
              }
            }
		}catch(e){
		}
	}
	if(this.onreadystatechange != null)
		this.onreadystatechange();
}
AJAX.prototype.statusText = function(){
	return this.__request__.statusText;
}
AJAX.prototype.abort = function(){
	if(this.waitingForResponse)
		this.__request__.abort();	
	this.waitingForResponse = false;
}
AJAX.prototype.getAllResponseHeaders = function(){
		return this.__request__.getAllResponseHeaders( ) 	
}
AJAX.prototype.getResponseHeader = function(header){
	return this.__request__.getResponseHeader(header);	
}
AJAX.prototype.__open = function(url,asynch){
	this.__request__.open(url,asynch);	
}
AJAX.prototype.__send = function(chaine) {
	this.__request__.send(chaine); 	
}
AJAX.prototype.__setRequestHeader = function(header,value){
	this.__request__.setRequestHeader(header,value);	
}