/**
 * @class Selection
 * Boite de sélection contenant des options et des groupes d'options
 *
 * @note        Copyright(C) CCI.fr SAS, 2004
 * @author      Florent LAOT <f.laot@entreprise.cci.fr>,
 * @version     $Revision: 4436 $
 * @date        $Date: 2008-03-18 14:27:00 +0100 (mar, 18 mar 2008) $
 */

/**
 * Trie la sélection
 */
function S_trier() {
    // Définie les listes utilisées
    listeGroupes =
        lib.getById(this.identifiant).getElementsByTagName("OPTGROUP");
    listeOptions =
        lib.getById(this.identifiant).getElementsByTagName("OPTION");
    listeElements = new Array();

    // Récupère la liste complète des éléments contenu dans la selection
    for (var i = 0; i < listeOptions.length; i++) {
        listeElements[listeElements.length] = listeOptions[i];
    }
    for (var i = 0; i < listeGroupes.length; i++) {
        listeElements[listeElements.length] = listeGroupes[i];
    }

    // Supprime tous les groupes de la sélection
    for (var j = (listeGroupes.length - 1); j >= 0; j--) {
        var noeud = listeGroupes[0];
        lib.getById(this.identifiant).removeChild(noeud);
    }

    // Supprime toutes les options
    try {
        for (var j = (lib.getById(this.identifiant).options.length - 1); j >= 0; j--) {
            lib.getById(this.identifiant).options[j] =  null;
        }
    } catch(exception) {
    	throw new ExceptionAEF('ES001');
    }

    /* Affichage de debogage
    var alerte = "";
    for (var i = 0; i < listeElements.length; i++) {
        alerte += lib.getValueToCompare(listeElements[i]) + ", ";
    }
    alert("Avant " + alerte.substring(0, alerte.length - 2));
    */

    // Trie la liste des éléments
    listeElements.sort(F_trierListeElements);

    /* Affichage de debogage
    var alerte = "";
    for (var i = 0; i < listeElements.length; i++) {
        alerte += lib.getValueToCompare(listeElements[i]) + ", ";
    }
    alert("Après " + alerte.substring(0, alerte.length - 2));
    */

    // Remplace le contenu de la selection par la liste triée dans la
    // sélection
    var indexOptions = 0;
    for (var i = 0; i < listeElements.length; i++) {
        // Traite différemment l'objet si c'est un groupe ou une option
        typeElement = listeElements[i].nodeName;

        if ( typeElement == "OPTGROUP" ) {        	
            // Recrée un groupe
            groupe = document.createElement("optgroup");
            groupe.setAttribute("label",
                listeElements[i].getAttribute("label")
                );
            groupe.setAttribute("id", listeElements[i].id);

            // Ajoute le groupe si l'élément suivant existe et est une
            // option
            if ( i < (listeElements.length - 1)
                && listeElements[i + 1].nodeName == "OPTION") {
                lib.appendChild(this.identifiant, groupe);
            }
        } else if( typeElement == "OPTION" ) {

            // Recrée une option si l'option à une valeur et n'est pas un
            // doublon
            var aCreer = 0;

            if (listeElements[i+1] && listeElements[i+1].value) {
                if (listeElements[i].value != listeElements[i+1].value) {
                    aCreer = 1;
                }
            } else if (listeElements[i].value) {
                aCreer = 1;
            }

            if (aCreer == 1) {

                nouvelleOption = document.createElement("option");
                nouvelleOption.text = listeElements[i].text;
                nouvelleOption.setAttribute(
                    "value", listeElements[i].value);
                nouvelleOption.setAttribute('title', listeElements[i].text);

                // Ajoute l'option
                try {                 
                    lib.appendChild(this.identifiant, nouvelleOption);
                } catch(e) {
                    // Parfois sous IE
                    lib.getById(this.identifiant).options[indexOptions] =
                        nouvelleOption;
                    indexOptions++;
                    
                    var e = new ExceptionAEF("W0002");
                    e.afficher();
                }
            }
        }
    }
}

/**
 * Retourne une nouvelle sélection
 *
 * @param p_identifiant
 */
function getSelectionById(p_identifiant) {
    return new Selection(p_identifiant);
}

/**
 * Détermine la présence d'un critère de type date de
 * création dans la sélection
 */
function S_contientDateCreation() {
    var expression = /^infoDateCreation*/;
    return this.contient(expression);
}

/**
 * Détermine la présence d'un critère de type capital
 * social dans la sélection
 */
function S_contientCapitalSocial() {
    var expression = /^donneesChiffreesCapitalSocial*/;
    return this.contient(expression);
}

/**
 * Détermine la présence d'un critère correspondant à l'expression
 * régulière passée en paramètre dans la sélection
 *
 * @param p_expression
 */
function S_contient(p_expression) {
    var texte = "";
    var liste = this.objet.getElementsByTagName("OPTION");

    // Recherche si une option est de type capital social
    for (var i = 0; i < liste.length; i++) {
        texte = liste[i].value;

        if( texte.search(p_expression) >= 0 ) {
            return 1;
        }
    }

    return 0;
}

/**
 * Charge la liste dans la sélection
 */
function S_charger(p_liste) {
    var p_listeChoix = this.toListeChoix(p_liste);	
    
    //selection.setListeOptions(listeTemp);
    //selection.setListeChoix(listeTemp);
    
    // Correctif urgent appliqué sans contrôle
    for (var i=0; i < p_listeChoix.length; i++) {
	this.objet.options[i] = p_listeChoix[i].getOption();
	this.listeChoix[i] = p_listeChoix[i];        
    }
    page.formulaire.supprimerOptionsSuperflues(this.identifiant);
}

/**
 * Transforme le tableau JS en tableau de liste de choix
 */
function S_toListeChoix(p_dictPython) {
    var liste = eval(p_dictPython);	
    var listeChoix = new Array();
    for (var i = 0; i < liste.length; i++) {
        listeChoix[i] = new Choix(
            liste[i][1], 
            liste[i][0], 
            liste[i][1]
        );
    } 
	return listeChoix;
}


/**
 * Charge automatiquement la liste des valeurs d'une sélection
 * à partir d'un nom de critère
 */
function S_autocharger() {
    // Récupère la liste des valeurs que doit prendre la sélection
    // en effectuant un appel XML-RPC sur le critère correspondant à
    // la sélection
    url = page.construireURL(this.identifiant, '', '');
    client = new ClientListe();
    client.setUrl(url);
    client.service = this.identifiant;
    client.executer();
    return this.identifiant;
}

/**
 * Recharge la liste des valeurs d'une sélection à partir de la liste 
 * de choix sauvegardée lors du dernier setListeChoix()
 */
function S_recharger() {	
    this.setListeOptions(this.listeChoix);
}

/**
 * Détermine si la sélection contient ou non des options.
 *
 * Une sélection est vide si:
 * 		- elle contient au maximum 1 élément (c'est la cas standard à cause 
 *		  du libellé "Chargement en cours...")
 *      - si elle contient plus d'éléments mais que le premier a une valeur de 
 *		  longueur nulle ou négative (cas où en plus du libellé "Chargement en 
 *		  cours..." la sélection contient des éléments supprimés du conteneur 
 * 		  de droite).
 */
function S_estVide() {
  return (this.objet.options.length <= 0 || (
  	this.objet.options.length > 0 && this.objet.options[0].value.length <= 0
  	)
  );
}

/**
 * Construit l'arborescence des options à partir d'une liste
 *
 * @param p_listeChoix
 */
function S_setListeOptions(p_listeChoix) {
	for (var i = 0; i < p_listeChoix.length; i++) {
       	this.objet.options[i] = p_listeChoix[i].getOption();        
	}
}

/**
 * Construit l'arborescence des options à partir d'une liste
 * XXX: Ne fonctionne pas avec les OPTGROUP
 *
 * @param p_listeChoix
 */
function S_setListeChoix(p_listeChoix) {
	for (var i=0; i < p_listeChoix.length; i++) {
        this.listeChoix[i] = p_listeChoix[i];        
	}
}

/**
 *
 * @param p_critere
 */

/**
 * Détermine si la sélection est filtrée avec un liste de départements
 */
function Selection_estFiltreeParListe() {
	// Définit les éléments de comparaison:
	var idFiltre = '';
	var idSelection = this.identifiant.toLowerCase();
	
	// Récupère la liste des filtres
	var listeFiltres = page.formulaire.getFiltresTypeListe();
	
	// Retourne 'true' dès qu'une comparaison est positive
	for(var i=0; i<listeFiltres.length; i++) {
		idFiltre = listeFiltres[i].identifiant.toLowerCase();		
		if (idSelection.indexOf(idFiltre) >= 0) {
			return true;
		}
	}
	
	// Renvoie 'false' sinon
	return false;
}

/**
 * Classe Selection
 * Elle correspond à un noeud HTML SELECT.
 *
 * @param p_identifiant Valeur de l'attribut ID de la balise SELECT
 */
function Selection(p_identifiant) {
    // Déclare les attributs
    this.identifiant = p_identifiant;
    this.objet = document.getElementById(p_identifiant);
	this.listeChoix = new Array();

    // Déclare les méthodes
    this.trier = S_trier;
    this.contientCapitalSocial = S_contientCapitalSocial;
    this.contientDateCreation = S_contientDateCreation;
    this.contient = S_contient;
    this.charger = S_charger;
    this.autocharger = S_autocharger;
    this.recharger = S_recharger;
    this.estFiltreeParListe = Selection_estFiltreeParListe;
    this.estVide = S_estVide;
    this.setListeOptions = S_setListeOptions;
    this.setListeChoix = S_setListeChoix;
    this.toListeChoix = S_toListeChoix;
}

