
/* XMLHttpRequest - AJAX
------------------------------------------------------------------------*/
//
// jeux de fonctions pour exécuter des requêtes http (XMLHttpRequest)
//




/**
 * Créé l'objet XMLHttpRequest
 *
 */
function newXHR()
{
    // Création de l'objet XMLHttpRequest
    var xhrObj = false;

    // Firefox, Internet Explorer 7, safari
    try { xhrObj = new XMLHttpRequest(); } catch (e) {

    // Internet Explorer < 7
    try { xhrObj = new ActiveXObject("MSXML2.XMLHttp"); } catch (e) {
    try { xhrObj = new ActiveXObject("Microsoft.XMLHttp"); } catch (e) {}}}

    return xhrObj;

} // end of "newXHR()"




/**
 * XHR_get
 */
 function XHR_get(sUrl, oData, fnCallback, fnOnfail, disableJason)
 {
     XHR_request(sUrl, oData, 'GET', fnCallback, fnOnfail, disableJason);
 } // end of "XHR_get()"



/**
 * XHR_post
 */
 function XHR_post(sUrl, oData, fnCallback, fnOnfail, disableJason)
 {
     XHR_request(sUrl, oData, 'POST', fnCallback, fnOnfail, disableJason);
 } // end of "XHR_post()"




/**
 * Lance une requête http
 *
 * @param string sMethod POST ou GET, non sensible à la casse
 *
 */
 function XHR_request(sUrl, oData, sMethod, fnCallback, fnOnfail, disableJason)
 {
    var sData;
    sMethod = sMethod.toUpperCase();

    if (typeof sUrl != 'string') {
      sUrl = document.location.href;
    }

    // Construction de l'url à appeler
    if (oData) {
      sData = buildQueryVars(oData)
      //alert(sData);
      //return false;
      if (sMethod == "GET") {
          sUrl += (sUrl.indexOf('?') > 0) ? '&' : '?';
          sUrl += sData;
      }
    }

    // Création de l'objet XMLHttpRequest
    var XHR_request = newXHR();
    

    /**
     * Gestionnaire de la réponse
     * Action à effectuer lors de la réception de la réponse
     */
    XHR_request.onreadystatechange = function ()  {
		      var errors = {404: 'La page n\'a pas été trouvée', 500: 'Erreur interne du serveur'};
		      var XHRresponse = false, odata = {}, error = false;
		      
		      //alert('XHR_request.readyState = ' + XHR_request.readyState);
		
		      // données obtenues
		      if (XHR_request.readyState == 4) {
		    	  
		    	  
		
		          // Analyse de la réponse
		          if (XHR_request.status == 200) { // ok
		        	  odata = XHR_request.responseText;
		        	  
		        	  // analyse de la réponse si JSON
		        	  if (!disableJason) {
		        		  odata = XHR_parseResponse(odata);
		        	  }
		        	  
		        	  
		
		          } else if (typeof errors[XHR_request.status] == 'string') { // erreur définie
		             error = errors[XHR_request.status];
		
		          } else {
		            //error = 'Une erreur inconnue est survenue';
		          	return false;
		          }
		
		
		          // Actions sur succès
		          if (!error && odata && typeof fnCallback == "function") {
		            fnCallback(odata);
		
		          // Actions en cas d'échec
		          } else {
		            if (typeof fnOnfail == "function") {
		              fnOnfail();
		            }
		            /*if (error) {
		              alert(error);
		            }*/
		          }
		
		          XHR_request.onreadystatechange = function() {};
		          //XHR_request.abort();
		          XHR_request = null;
		      }
		
		
		    }; // end of "XHR_request.onreadystatechange"


    // ouverture de la connexion
    XHR_request.open(sMethod, sUrl, true);

    //XHR_request.setRequestHeader("Content-Type", "text/xml; charset=UTF-8")
    
    // // Envoi des données et entêtes en mode POST
    if (sMethod == "POST") {
	    XHR_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
	    XHR_request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
	    //XHR_request.setRequestHeader("Content-Length", sData.length );
	    
    } else {
    	XHR_request.setRequestHeader("Content-Type", "text/xml; charset=iso-8859-1");
    }
    XHR_request.send(sData);

    
 } // end of "XHR_attachEvent()"





/**
 * Lit la réponse lorsqu'elle est disponible
 *
 */
function XHR_parseResponse(xhr_data)
{
    var data = new Array;

    try {
      // il y aura une erreur si ce n'est pas au format JSON
      xhr_data = xhr_data.replace("\r\n", '');
      xhr_data = xhr_data.replace("\r", '');
      xhr_data = xhr_data.replace("\n", '');
      //alert('data = ' + xhr_data + ';');
      eval('data = ' + xhr_data + ';');
      if (data['rState'] < 0) {
         //alert(data['errors']);
         return false;
      }
      return data;


    } catch (err) {
         /*xhr_data = xhr_data.replace('<br />', "\r\n");
         xhr_data = xhr_data.replace(/<[\/]?[^<>]*[\/]?>/ig, '');
         alert('Une erreur est survenue : \r\n' + err + '\r\n' + xhr_data);*/
         return false;
    }

    return data;

} // end function getXHRReponse()



