

/* 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)
 {
     XHR_request(sUrl, oData, 'GET', fnCallback, fnOnfail);
 } // end of "XHR_get()"



/**
 * XHR_post
 */
 function XHR_post(sUrl, oData, fnCallback, fnOnfail)
 {
     XHR_request(sUrl, oData, 'POST', fnCallback, fnOnfail);
 } // 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)
 {
    var sData;
    sMethod = sMethod.toUpperCase();

    if (typeof sUrl != 'string') {
      sUrl = document.location.href;
    }

    // Construction de l'url à appeler
    if (oData) {
      sData = buildQueryVars(oData)
      if (sMethod == "GET") {
          sUrl += (sUrl.indexOf('?') > 0) ? '&' : '?';
          sUrl += sData;
      }
    }

    // Création de l'objet XMLHttpRequest
    var XHR_request = newXHR();

    // ouverture de la connexion
    XHR_request.open(sMethod, sUrl, true);

    // fixe les entêtes
    XHR_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    XHR_request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    //XHR_request.setRequestHeader("Content-Length", sData.length );

    // Envoi des données en mode POST
    if (sMethod == "POST") {
      XHR_request.send(sData);
    }

    /**
     * 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;

      // données obtenues
      if (XHR_request.readyState == 4) {

          // Analyse de la réponse
          if (XHR_request.status == 200) { // ok
              odata = XHR_parseResponse(XHR_request.responseText); // analyse de la réponse (JSON par défaut)

          } else if (typeof errors[XHR_request.status] == 'string') { // erreur définie
             error = errors[XHR_request.status];

          } else {
            error = 'Une erreur inconnue est survenue';
          }


          // 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"

 } // 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
      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' + xhr_data);
         return false;
    }

    return data;

} // end function getXHRReponse()



/* XMLHttpRequest - AJAX
------------------------------------------------------------------------*/




/**
 * Créé l'objet XMLHttpRequest
 *
 */
/*function XHR_createRequest()
{
    var XHR_request = false;
    if (typeof XMLHttpRequest != 'undefined' && !window.ActiveXObject) {
        try {
            XHR_request = new XMLHttpRequest();
            return XHR_request;

        } catch (e) {
            //alert("Your browser is not supporting XMLHTTPRequest");
            XHR_request = false;
        }


    }  else if (window.ActiveXObject) {
        var aVersions = ["MSXML2.XMLHttp", "Microsoft.XMLHttp", "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0"];
        for (var i = 0; i < aVersions.length; i++) {
            try {
                XHR_request = new ActiveXObject(aVersions[i]);
                return XHR_request;

            } catch (e) {
              XHR_request = false;
            }
        }
    }

    return XHR_request;
} // end of "XHR_createRequest()"
*/


/**
 * XHR_attachEvent
 */
/* function XHR_attachEvent(sMethod, aQueryData, url, callback)
 {
    var XHR_request = XHR_createRequest();
    var callUrl = url;
    var sData = "";
    if (aQueryData) {
      sData = buildQueryVars(aQueryData)
      if (sMethod == "GET") {
          callUrl += (url.indexOf('?') > 0) ? '&' : '?';
          callUrl += sData;
      }
    }

    XHR_request.open(sMethod, callUrl, true);


    try {
      XHR_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      XHR_request.setRequestHeader("X-Requested-With", "XMLHttpRequest");
      //XHR_request.setRequestHeader("Content-Length", sData.length );

      if (sMethod == "POST") {
        XHR_request.send(sData);
      }

      // Action à effectuer lors de la réception de la réponse
      XHR_request.onreadystatechange = function ()
      {
        try {
          if (XHR_request.readyState == 4) { // données obtenues
              if (XHR_request.status == 200) { // ok
                  var XHRresponse = XHR_request.responseText;
                  if (XHRresponse) {
                      var data = XHR_parseResponse(XHRresponse); // analyse de la réponse (JSON par défaut)
                      if (data && typeof callback == "function") {
                        callback(data);
                      }
                  }
                  XHR_request.onreadystatechange = function() {};
                  XHR_request.abort();
                  XHR_request = null;


              }
          }
        } catch (e) { }
      } // end of "XHR_request.onreadystatechange"


    } catch (e) { }

    return true;

 } // 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
      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' + xhr_data);
         return false;
    }

    return data;

} // end function getXHRReponse()
*/


// =============== deprecated - complicance only =============================


/**
 * parseXHRResponse(xhr_data)
 */
/*function parseXHRResponse(xhr_data)
 {
       return XHR_parseResponse(xhr_data);
 } // end of "parseXHRResponse(xhr_data)"
*/

/**
 * Attache un évènement à un objet et unifie l'objet "événement"
 *
 */
/*function getXHRObj()
{
    obj = false;

    // branch for native XMLHttpRequest object
    if(window.XMLHttpRequest) {
        try {
            obj = new XMLHttpRequest();
        } catch(e) {
            obj = false;
        }

    } else if(window.ActiveXObject) { // branch for IE/Windows ActiveX version
        try {
          obj = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                obj = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                obj = false;
            }
        }
    }
  return obj;
} // end function getXHRObj()
*/



/**
 * Attache un évènement à un objet XMLHttpRequest
 *
 */
/*function attachXHREvent(sMethod, aQueryData, url, func)
{
    if (!window.XHR) window.XHR = getXHRObj();

    // Envoi des données en GET
    var sData = null;
    if (sMethod == "GET") {
        url += '?' + buildQueryVars(aQueryData);

    } else { // ou en POST
        sData = buildQueryVars(aQueryData);
    }

    window.XHR.open(sMethod, url, true);

    if (sMethod == "POST") {
      window.XHR.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    }
    if (typeof sData != null) {
      window.XHR.send(sData);
    }
    window.XHR.setRequestHeader("X-Requested-With", "XMLHttpRequest");


    window.XHR.onreadystatechange = func;
    return true;
} // end function attachXHREvent()
*/




/**
 * Lit la réponse lorsqu'elle est disponible
 *
 */
/*function getXHRReponse()
{
    if (!window.XHR) {
        return false;
    }

    if (window.XHR.readyState == 4) {
        return window.XHR.responseText;
    }

    return false;
} // end function getXHRReponse()
*/


