/** @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 idMsg id de l'élément HTML devant recevoir les
 * messages (transfert en cours, erreurs) @type String
 */
function SelectUpdater(idSelect, getOptionsUrl, idMsg) {
  /** Liste déroulante à mettre à jour @type HTMLSelectElement */
  this.select = document.getElementById(idSelect);
  // Vérifier que leid 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 = "Code postal inconnu";
  /** Elément HTML montrant le message @type HTMLElement*/
  this.msg = document.getElementById(idMsg);
  if (!this.msg) {
    Log.error("Erreur sur new SelectUpdater(..., ..., '"
      + idMsg + "') : " + idMsg + " introuvable");
  }
}

SelectUpdater.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
      document.getElementById("ouinon").value="oui";
      var options = this.request.responseText.split(";");
      var item, option;

        option = document.createElement("option");
        option.setAttribute("value", "rien");
        option.innerHTML = "-------------------------------------------";
        this.select.appendChild(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 = "<span style='color: red'>"
        + this.NOT_FOUND_MSG + "</span>";
      document.getElementById("ouinon").value="non";
    }
  },
  
  /** Montrer que l'appel est en cours */
  show: function() {
    this.msg.innerHTML = "<img src='images/ajax-1.gif' border='0' id='imajax' style='display:inline;' align='absmiddle' />&nbsp;&nbsp;<em>En chargement ...</em>";
  },
  
  /** Effacer le message */
  hide: function() {
    this.msg.innerHTML = "";
    document.getElementById("ouinon").value="";
  },
  
  /** Effacer la liste et le message, et annuler l'appel éventuel */
  reset: function() {
    this.select.innerHTML = "";
    this.msg.innerHTML = "";
    try {
      if (this.request) {
        this.request.abort();
      }
    }
    catch (exc) {
      Log.debug(exc);
    }
  }
}
