/**
 * Classe Dajax - v0.2
 *
 * Cette classe permet d'envoyer des requêtes XmlHttpRequest.
 *
 * @author     David Desbouis - http://www.desbouis.com
 */


/**
 * Constructeur qui instancie un objet AJAX.
 */
function Dajax() {

  // propriétés
  this.reqUrl           = null;
  this.reqMethod        = "GET";
  this.reqParams        = null;
  this.callBackFunction = null;
  this.utf8             = false;
  this.overrideMimeType = true;
  this.responseVersion  = "xml"; // ou "txt"
  this.asynchronous     = true;

  // méthodes
  this.sendHttpRequest = sendHttpRequest;
  this.executeCallback = executeCallback;
  this.getResponseData = getResponseData;
} // fin constructeur





/**
 * Méthode qui instancie un objet XMLHttpRequest, sette ses attributs et envoie la requête.
 *
 * @return  true / false
 */
sendHttpRequest = function () {

  // on crée un objet XmlHttpRequest
  var objHttpRequest = false;
  try {
    objHttpRequest = new ActiveXObject('Msxml2.XMLHTTP');
  } catch(e) {
    try {
    objHttpRequest = new ActiveXObject('Microsoft.XMLHTTP');
    } catch(e) {
      objHttpRequest = new XMLHttpRequest();
    }
  }

  if (!objHttpRequest) {
    alert("Impossible de créer un objet XmlHttpRequest !!!");
    return false;
  }

  // pour s'assurer de récupérer les données avec le bon type-mime dans l'en-tête
  if (this.overrideMimeType) {
     if (objHttpRequest.overrideMimeType) {
       objHttpRequest.overrideMimeType('text/xml');
     }
  }

  var callBackFunction = this.callBackFunction;

  // ce qu'on fait dès qu'on a une réponse
  objHttpRequest.onreadystatechange = function () {
    executeCallback(objHttpRequest, callBackFunction);
  };
  
  // ouverture de la connexion et envoi de la requête
  switch (this.reqMethod) {
    case 'GET' :
    case 'get' :
      if (this.reqParams != null)
         objHttpRequest.open('GET', this.reqUrl + "?" + this.reqParams, this.asynchronous);
      else
         objHttpRequest.open('GET', this.reqUrl, this.asynchronous);
      // les données de l'en-tête
      objHttpRequest.setRequestHeader("X-Referrer", document.location);
      // envoi de la requête
      objHttpRequest.send(false);
      break;

    case 'POST' :
    case 'post' :
      objHttpRequest.open('POST', this.reqUrl, this.asynchronous);
      // les données de l'en-tête
      objHttpRequest.setRequestHeader("X-Referrer", document.location);
      objHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      // envoi de la requête
      objHttpRequest.send(this.reqParams);
      break;
    
    default :
      alert("Impossible d'envoyer l'objet XmlHttpRequest : pas de méthode !!!");
      return false;
  }

  return true;

} // fin sendHttpRequest





/**
 * Méthode permettant d'exécuter une fonction callback dès que la réponse XmlHttpRequest est complète et bien de retour.
 *
 * @param   object    _objXHR : l'objet XmlHttpRequest
 *
 * @return  bool      true/false
 */
executeCallback = function (_objXHR, callBackFunction) {
  // si on n'a pas un retour complet (readyState != 4) et 
  // si on n'a pas un code status HTTP 200, on ne fait rien
   if((_objXHR.readyState == 4) && (_objXHR.status == 200))
   {
      if (callBackFunction == null)
      {
         // statique
         processDajaxResponse(_objXHR);  // --> ok
      }
      else
      {
         // dynamique
         callBackFunction(_objXHR);
      }
      return true;
   }
   return false;
} // fin executeCallback




/**
 * Méthode qui récupère les données provenant d'une réponse à une requête XMLHttpRequest.
 *
 * @param   object    _objXHR : l'objet XmlHttpRequest
 *
 * @return  string || XMLdoc
 */
getResponseData = function (_objXHR) {
  switch (this.responseVersion) {
    case 'XML' :
    case 'xml' :
      return _objXHR.responseXML;
      break;
      
    case 'TXT' :
    case 'txt' :
      return _objXHR.responseText;
      break;
      
    default :
      return '';
  }
}




/********************************/
