
/* 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
      xhr_data = xhr_data.replace("\r\n", '');
      xhr_data = xhr_data.replace("\r", '');
      xhr_data = xhr_data.replace("\n", '');
      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()


