/** @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

  /** 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 inconnu";
  /** Elément HTML montrant le message @type HTMLElement*/
  this.msg = document.getElementById(idMsg);
 
}

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
      var options = this.request.responseText.split(";");
      var item, option;
	  
	  option = document.createElement("option");
      option.setAttribute("value", -1);

      option.innerHTML = "Toutes...";
	 
		
      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[1]);
        option.innerHTML = item[1];
        this.select.appendChild(option);
      }	  
	  
	  if (i>1)
		this.msg.innerHTML=i+" enregistrements trouvés";
	  else
		this.msg.innerHTML=i+" enregistrement trouvé";	
	  writediv('<img src='+image_valid+'></img>&nbsp&nbsp<b>Commune remplie</b>', "Vcommune"); //reponse OK
	  Rcommune=1;
	  verifetat();
    }
    else {
		
      this.msg.innerHTML='<b>'+this.NOT_FOUND_MSG+"</b>";
	  writediv('<img src='+image_error+'></img>&nbsp&nbsp<b>Commune non remplie</b>', "Vcommune"); //reponse pas OK
	  Rcommune=0;
	  verifetat();
    }
  },
  
  /** Montrer que l'appel est en cours */
  show: function() {
	option = document.createElement("option");
    option.setAttribute("value", -1);
    option.innerHTML = "En chargement ...";
    window.document.getElementById('commune').appendChild(option);
	
   // this.msg.innerHTML = "<em>En chargement ...</em>";
  },
  
  /** Effacer le message */
  hide: function() {
	window.document.getElementById('commune').removeChild(option);
    //this.msg.innerHTML = "";
  },
  
  /** 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);
    }
  }
}

