
/* Classe développée par Michel Plasse, modifiée par Galawa */

/** @class
 * Mise à jour d'une liste déroulante par des appels Ajax
 * @param idSelect id de la liste déroulante @type String
 * @param getOptionsUrl url de l'action serveur donnant les
 * options correspondant à une valeur passéeen paramètre
 * @type String
 * @param idWait id de l'élément HTML devant recevoir les
 * messages de transfert en cours @type String
 * @param idMsg id de l'élément HTML devant recevoir les
 * messages d'erreurs @type String
 * @param no_found id de l'élément HTML devant recevoir le
 * texte du message d'erreur @type String
 */
function SelectUpdater2(idSelect, getOptionsUrl, idWait, idMsg, not_found,attente) {
  /** Liste déroulante à mettre à jour @type HTMLSelectElement */
  this.select = document.getElementById(idSelect);
  // Vérifier que l'id est ok
  if (!this.select) {
    Log.error("Erreur sur new SelectUpdater('" + idSelect
      + " ' ...) : " + idSelect + " introuvable");
  }
  /** Url de la requête XMLHttpRequest mettant à jour @type String */
  this.url = getOptionsUrl;
  /** Requête XMLHttpRequest de mise à jour @type XMLHttpRequest */
  this.request = null;
  /** Message si aucune option n'est trouvée 
   * (défaut : "Valeur inconnue") @type String
   */
  this.NOT_FOUND_MSG = not_found;
  /** Message si liste vide
   * (défaut : "Valeur inconnue") @type String
   */
  this.WAIT_MSG = attente;
  /** Elément HTML montrant le message d'attente @type HTMLElement*/
  this.wait = document.getElementById(idWait);
  if (!this.wait) {
    Log.error("Erreur sur new SelectUpdater(..., ..., '"
      + idWait + "') : " + idWait + " introuvable");
  }
  /** Elément HTML montrant le message d'erreur @type HTMLElement*/
  this.msg = document.getElementById(idMsg);
  if (!this.msg) {
    Log.error("Erreur sur new SelectUpdater(..., ..., '"
      + idMsg + "') : " + idMsg + " introuvable");
  }
}

SelectUpdater2.prototype = {
  /** Lancer la requête
   * @param value valeur passée à la requête @type String
   */
  run: function(value) {
    if (this.request) {
      try {
        this.request.abort();
      }
      catch (exc) {}
    }
    try {
      this.request = new XMLHttpRequest();
      var url = this.url + encodeURIComponent(value);
      this.request.open("GET", url, true);
      this.show();
      var current = this;
      this.request.onreadystatechange = function() {
        try {
          if (current.request.readyState == 4) {
            if (current.request.status == 200) {
              current.onload();
            }
            else {
              current.msg.innerHTML = "Erreur HTTP " 
                + current.request.status + " sur '" 
                + current.url + "'";
            }
          }
        }
        catch (exc) {}
      }
      this.request.send("");
    }
    catch (exc) {
      Log.debug(exc);
    }
  },
  
  /** Mettre à jour la liste à la réception de la réponse */
  onload: function() {
    this.select.innerHTML = "";
    this.hide();
    if (this.request.responseText.length != 0) {
      // Le resultat n'est pas vide
	  // On injecte les choix possibles
      var options = this.request.responseText.split(";");
      var item, option;
      for (var i=0 ; i<options.length ; i++) {
        item = options[i].split("="); // value = text
        option = document.createElement("option");
        option.setAttribute("value", item[0]);
        option.innerHTML = item[1];
        this.select.appendChild(option);
      }
    }
    else {
      this.msg.innerHTML = this.NOT_FOUND_MSG;
    }
  },
  
  /** Montrer que l'appel est en cours */
  show: function() {
    this.wait.innerHTML = '<img src="../img/wait.gif" alt="Patience">';
  },
  
  /** Effacer le message */
  hide: function() {
    this.wait.innerHTML = "";
    this.msg.innerHTML = "";
  },
  
  /** Effacer la liste et le message, et annuler l'appel éventuel */
  reset: function() {
    this.select.innerHTML = "";
	option = document.createElement("option");
	option.setAttribute("value","");
	option.innerHTML =this.WAIT_MSG ;
	this.select.appendChild(option);
    this.wait.innerHTML = "";
    this.msg.innerHTML = "";
    try {
      if (this.request) {
        this.request.abort();
      }
    }
    catch (exc) {
      Log.debug(exc);
    }
  }
}
