/** @class
 * Mise à jour d'une liste déroulante par des appels Ajax
 * @requires json.js (String.prototype.parseJSON, 
 * Object.prototype.toJSONString et Array.prototype.toJSONString)
 * @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 FilterCatalogue(getOptionsUrl, idMsg) {
  /** Url de la requête XMLHttpajaxCall mettant à jour @type String */
  this.url = getOptionsUrl;
  /** Requête XMLHttpajaxCall de mise à jour @type XMLHttpajaxCall */
  this.ajaxCall = null;
  /** Message si aucune option n'est trouvée 
   * (défaut : "Valeur inconnue") @type String
   */
  this.NOT_FOUND_MSG = "Valeur inconnue";
  /** Elément HTML montrant le message @type HTMLElement*/
  this.msg = document.getElementById(idMsg);
  if (!this.msg) {
    alert("Erreur sur new SelectUpdater(..., ..., '"
      + idMsg + "') : " + idMsg + " introuvable");
  }
  
  this.ulFilterId = null;
}

FilterCatalogue.prototype = {
  /** Lancer la requête
   * @param value valeur passée à la requête @type String
   */
  run: function(sParam, sULId) {
    this.ulFilterId = sULId;
    if(this.ajaxCall && this.ajaxCall.transport && this.ajaxCall.transport.readyState != 4){
    	this.ajaxCall.transport.abort();
    }
    
    try {
    	var current = this;
    	this.ajaxCall = new Ajax.Request(this.url, {
    		method: 'get',
			parameters: sParam,
			onLoading: function(){
				current.show();
				},
			onComplete: function(){
				current.hide();
				},
			onSuccess: function(){
				current.onload();
				}
			
      		});
    }
    catch(exept){}
  },
  
  /** Mettre à jour la liste à la réception de la réponse.
   * Celle-ci peut être de type texte (ou html), XML ou JSON.
  */
  onload: function() {
    var hasContent, loadContent;
    var type = this.ajaxCall.transport.getResponseHeader("Content-Type").split(";")[0];
    if(type == 'text/xml' || type=='application/xml'){
		var root = this.ajaxCall.transport.responseXML.documentElement;
	    loadContent = this.loadXML;
    }	        
    else{
        Log.error(this.url + " has an invalid Content-Type." +
          "Found '" + type + "' (must be plain text, JSON or XML)");
    }
    loadContent.apply(this);
  },
  
  /** Créer les options quand la réponse est de type XML 
   * La réponse est supposée de la forme <pre>
   * <unNomQuelconque attributsQuelconques="...">
   *   <item value="codeItem" text="contenuItem" />
   *   <item value="codeItem" text="contenuItem" />
   *   etc.<br/></unNomQuelconque> </pre>
   * Si ce n'est pas le cas, appelle la méthode transformXML
   * qui par defaut renvoie la réponse XML, sans transformation.
   */
  loadXML: function() {
    var root = this.ajaxCall.transport.responseXML.documentElement;
	var aFilter = root.childNodes;
	for(var j=0; j<aFilter.length; j++) {
    	if(aFilter[j].nodeType == 1){
	    	var oFilterTarget = D.getElementById(aFilter[j].getAttribute('name'));
	    	oFilterTarget.innerHTML = '';
	    	var items = aFilter[j].childNodes;
	    	var option;
	    	for (var i=0 ; i < items.length ; i++) {
	      		if (items[i].nodeName == "item") {
	        		var option = document.createElement("li");
	        		option.setAttribute("id", items[i].getAttribute("value"));
	        		
	        		var oLink = document.createElement("a");
	        		oLink.setAttribute("href", items[i].getAttribute("url"));
	        		option.appendChild(oLink);
	        		
	        		var oText1 = document.createElement("span");
	        		oText1.className = 'filter-text1';
	        		oText1.innerHTML = items[i].getAttribute("text");
	        		//option.appendChild(oText1);
	        		oLink.appendChild(oText1);
					
					if(items[i].getAttribute("text2"))
					{
		        		var oText2 = document.createElement("span");
		        		oText2.className = 'filter-text2';
		        		oText2.innerHTML = ' - ' +items[i].getAttribute("text2");
		        		//option.appendChild(oText2);
		        		oLink.appendChild(oText2);
					}
	        		
	        		//option.innerHTML = items[i].getAttribute("text") + '<span style="font-size: 11px;" > - ' +items[i].getAttribute("text2") +'</span>';
	        		oFilterTarget.appendChild(option);
	      		}
	    	}
    	}	   
	}
	initFilterBoxBehaviour();
	listProductUpdate();
  },
  
  /** Montrer que l'appel est en cours */
  show: function() {
    this.msg.style.visibility = 'visible';
  },
  
  /** Effacer le message */
  hide: function() {
    this.msg.style.visibility = 'hidden';
  }
}

