// JavaScript Document
//http://xhrconnection.sutekidane.net/
//alert ("ok");
function XHRConnection() 
{
	var conn = false;
	var datas = new String();
	var areaId = new String();
	var xmlObj;
	var xmlLoad;
	var async = true;
	var tab_Version_ie= ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHTTP"];
	//var tab_Version_ie= ["Microsoft.XMLHTTP"];

	//var XHR_TEMPS_MAX_EXEC=100;
	var XHR_timer=null;
	var xhrFlag=false;
	var xhr_callBack=null;
	var xhr_httpMode=null;
	var xhr_Url=null;
	var xhr_reload=0;
	
	//création de l'objet XMLHttp
	try 
	{	
		conn = new XMLHttpRequest(); //firefox, safari et opera
		
	}
	catch (error)
	{
		try  //internet explorer
		{
			for (var i=0;i<tab_Version_ie.length;i++){
				try {
					//conn = new ActiveXObject("Microsoft.XMLHTTP");
					conn = new ActiveXObject(tab_Version_ie[i]);
				} catch (oError){
					conn = false;
				}
			}
		}
		catch (error) 
		{
			try
			{
				conn = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (error) 
			{
				conn = false;
			}
		}
	}
	
  function initXHR(){
      try{
            conn.abort();
      }catch(error){
      
      }
      
			try 
    	{	
    		conn = new XMLHttpRequest(); //firefox, safari et opera
    		
    	}
    	catch (error)
    	{
    		try  //internet explorer
    		{
    			for (var i=0;i<tab_Version_ie.length;i++){
    				try {
    					//conn = new ActiveXObject("Microsoft.XMLHTTP");
    					conn = new ActiveXObject(tab_Version_ie[i]);
    				} catch (oError){
    					//conn = new ActiveXObject("Microsoft.XMLHTTP");
    				}
    			}
    		}
    		catch (error) 
    		{
    			try
    			{
    				conn = new ActiveXObject("Microsoft.XMLHTTP");
    			}
    			catch (error) 
    			{
    				conn=false;
    			}
    		}
    	}
  }
  
  if (!conn){
      alert ("Attention, ce site web nécessite un navigateur récent.");
      document.location.href="telecharge_navigateur.html";
  }
	this.overrideMimeType = function(mime) 
	{
	  if (!document.all){
  		switch (mime){
  				case "text/plain":
  					conn.overrideMimeType('text/plain')
  				break;
  				case "text/xml":
  					conn.overrideMimeType('text/xml')
  				break;
  				default:
  					conn.overrideMimeType('text/xml')
  				break;
  		}
		}
	};
	
	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) 
			{
				return false;
			}
		}
		return xmlDoc;
	};
	
	this.setXMLObject = function(obj) 
	{
		if (obj == undefined) 
		{
			return false;
		}
		try
		{
			xmlObj = obj;
		}
		catch (error)
		{
		}
	};
	
	this.loadXML = function(xml, callBack) 
	{
		if (!conn) 
			return false;
		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;
		}		
	};
	
	/*
	*	Async=true : la requete est envoyée en mode asynchrone et l'exécution  du cote javascript se poursuit sans attendre la réponse (pour messages long)
	*	Async=false : javascript attend une réponse du sserveur avant de poursuivre l'exécution du code (peut être dangereux car si la réponse tarde, l'utilisateur ne peut pas interagir avec le navigateur (messages courts)
	*/
	this.setAsync = function(Async) 
	{
		async=Async;		
	};
	/*
	*	Annulation de la requete
	*
	*/
	this.xhr_annule = function (){
			if (conn.readyState != 0){ //annule une requete en attente de traitement
			   try {
					 conn.abort();
				 }catch(erreur){
				 
				 }
					xhrFlag=false;
					//datas = new String();
					datas = '';
			}
	};
	
	
	this.setAsync = function(Async) 
	{
		async=Async;		
	}
	/*
	*	Url : cette chaine indique l'url à envoyer à la requête
	*	httpMode : type de requete à effectuer => POST / GET
	*	callBack : renvoi à la fonction
	*
	*	readyState peut avoir différents états :
	*		0 : l'objet a été créé mais la méthode open n'a pas été invoquée
	*		1 : la méthode open a été invoquée mais la requete n'a pas été envoyée
	*		2 : la requete a été envoyée
	*		3 : une réponse partielle a été réceptionnée
	*		4 : toutes les données ont été réceptionnées et la connexion a été fermée
	*/

  function xhr_StateChange(){
  		if (xhr_callBack!=null && xhrFlag==false){
  		  try {
  				if (conn.readyState == 4) 
  				{   
    					if (conn.status == 200 && xhr_reload<10){
    						if (typeof xhr_callBack == "function") 
    						{
    						  xhrFlag=true;
    						  clearTimeout(XHR_timer);
    							xhr_callBack(conn);
    							return true;
    						}
    						else if (areaId.length > 0)
    						{
  
    							  xhrFlag=true;
    						    clearTimeout(XHR_timer);
    								document.getElementById(areaId).innerHTML = conn.responseText;
     						    return true;
  
    						}else {
    						    return false;
    						}
    					}else{
    					   
    					   throw "RELOAD";
    					}
  				}
  			}catch(error){
  			  if  (error=="RELOAD"){
  			     xhr_reload++;
  			     xhr_sendAndLoad ();
  			  }
  			}
  		}
  }

  
	conn.onreadystatechange = function() 
	{
      xhr_StateChange();
	};

  function xhr_sendAndLoad (){
    
		switch(xhr_httpMode) 
		{
		  
			case "GET":
				try 
				{
				  Url=xhr_Url;
					//Url = (datas.length > 0) ? Url + "?" + datas : Url;
					if (datas.length > 0 && datas!='=') {
					   if (Url.indexOf("?",0)=="-1"){
					     Url=Url + "?" + datas;
					   }else {
					     Url=Url + "&" + datas;
					   }
					}

          conn.open("GET", Url, async);
					conn.send(null);
					if (!async)
					   xhr_StateChange();
				}
				catch(error) 
				{
					return false;
				}
			break;
			case "POST":
				try 
				{
				  Url=xhr_Url;
          conn.open("POST", Url, async); 
					conn.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					conn.send(datas);
					
					if (!async)
					   xhr_StateChange();
				}
        catch(error) 
				{
					return false;
				}
			break;
			default :
				return false;
			break;
		}
  
  }


	this.sendAndLoad = function(Url, httpMode, callBack) 
	{
		xhr_httpMode = httpMode.toUpperCase();
    xhr_Url=Url;
    xhr_callBack=callBack;
    xhrFlag=false;
    XHR_timer=null;
		return xhr_sendAndLoad(); 
	};
	return this;
}
