function XHRConnection() { // v1.5.0

	// + ----------------------------------------------------------------------------------
	var conn = false;
	var debug = true;
	var errorConn = null; // code function default
	var errorHTTP = new Array(39);
	var fileError = new Array();
	var datas = new String();
	var areaId = new String();
	var xmlObj; // Objet XML
	var xmlLoad; // Type de comportement au chargement du XML


	// + ----------------------------------------------------------------------------------
	try {
		conn = new XMLHttpRequest();
	}
	catch (error) {

 			var msxmlhttp = new Array(
				'Msxml2.XMLHTTP.5.0',
				'Msxml2.XMLHTTP.4.0',
				'Msxml2.XMLHTTP.3.0',
				'Msxml2.XMLHTTP',
				'Microsoft.XMLHTTP');
			for (var i = 0; i < msxmlhttp.length; i++) {
				try {
					conn = new ActiveXObject(msxmlhttp[i]);
				} catch (e) {
					conn = null;
				}
			}

			if(!conn && typeof XMLHttpRequest != "undefined") {
				conn = new XMLHttpRequest();
			}
			if (!conn) {
				alert("Could not create connection object.");
				fileError.push("Could not create connection object.");
				return false;
			}
	}

	this.getDumpError = function(version) {
		return this.var_dump(fileError,version);
	}

	this.var_dump = function(tab,version) {
		switch(version) {
			case 0: var tabul = "\t"; var rline = "\n"; break;
			case 1: var tabul = "&nbsp;&nbsp;&nbsp;&nbsp;"; var rline = "<br />"; break;
		}

		var indent = tabul;
		var i = 0;
		var elements = "";

		for (var elt in tab) {
			elements += (i ? "," + rline + " " : " ") + indent + "[" + elt + "] : ";
			switch (typeof tab[elt]) {
				case "string" :
					elements += "\"" + tab[elt] + "\""; break;
				case "number" :
					elements += tab[elt]; break;
				case "object" :
					if (tab[elt] == null) elements += "*null*";
					else if (tab[elt]) elements += var_dump(tab[elt], indent); break;
				case "undefined" :
					elements += "*undefined*"; break;
				default : elements += tab[elt];
			}
			i++;
		}
		return "Array(" + (i-1) + ")" +tabul +"{" + rline + elements + rline +  "}";
	}

	this.setDebugOff = function() {
		debug = false;
	};

	this.setDebugOn = function() {
		debug = true;
	};

	this.resetData = function() {
		datas = new String();
		datas = '';
	};

	this.appendData = function(pfield, pvalue) {
		datas += (datas.length == 0) ? pfield+ "=" + escape(pvalue) : "&" + pfield + "=" + escape(pvalue);
	};

	this.setRefreshArea = function(id) {
		areaId = id;
	};

	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) {fileError.push('Erreur lors de la tentative de création de l\'objet XML\n\n');}
				return false;
			}
		}
		return xmlDoc;
	}

	this.setXMLObject = function(obj) {
		if (obj == undefined) {
				if (debug) {fileError.push('Paramètre manquant lors de l\'appel de la méthode setXMLObject');}
				return false;
		}
		try {
			//xmlObj = this.createXMLObject();
			xmlObj = obj;
		}
		catch (error) {
				if (debug) {fileError.push('Erreur lors de l\'affectation de l\'objet XML dans la méthode setXMLObject');}
		}
	}

	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;
		}
	}

	this.nodeCleanXML = function(c){
		if(!c.data.replace(/\s/g,''))
			c.parentNode.removeChild(c);
	}


	this.cleanXML = function(d){
		var bal=d.getElementsByTagName('*');

		for(i=0;i<bal.length;i++){
			a=bal[i].previousSibling;
			if(a && a.nodeType==3)
				go(a);
			b=bal[i].nextSibling;
			if(b && b.nodeType==3)
				go(b);
		}
		return d;
	}


	this.sendAndLoad = function(url, httpMode, callBack) {

 		httpMode = httpMode.toUpperCase();
			conn.onreadystatechange = function(){
				if(conn.readyState == 4 && conn.status == 200){ //alert(conn.responseText); // debug

					if (typeof callBack == "function") { // Si une fonction de callBack a été définie
						fileError.push('4 = (complete) Version GET');
						callBack(conn);
						return;
					}
				}
			}
			url = (datas.length > 0) ? url + "?" + datas : url;
			conn.open("GET",url,true);
			conn.send(null);
	}

	return this;
}
