/**
 * @class Formulaire
 * Formulaire de recherche dont l'unique instance permet la manipulation
 * complexe des éléments de la page Recherche.pt
 *
 * @note        Copyright(C) CCI.fr SAS, 2004
 * @author      Olivier GUILLOUX <olivier.guilloux@entreprise.cci.fr>
 * @author      Florent LAOT <f.laot@entreprise.cci.fr>,
 * @author      FranÃ§ois DE FAUCAL <f.juindefaucal@entreprise.cci.fr>
 * @version     $Revision: 4436 $
 * @date        $Date: 2008-03-18 14:27:00 +0100 (mar, 18 mar 2008) $
 */

/*******************
*    Affichage/masquage
***************************************************************************/
/**
 * Affiche l'ensemble de champs correspondant au critère sélectionné
 *
 * @param p_idEnsemble : Identifiant de l'ensemble de champs à afficher
 * @param p_idFamille : Identifiant de la barre d'onglets contenant
 * l'ensemble de champs à afficher
 * @param p_indexCritere : Numéro d'ordre du critère dans la barre de
 * sous-onglets
 */
function F_afficherChamp(p_idEnsemble, p_idFamille, p_indexCritere){
    // Affiche le bon ensemble de champs
    this.masquerTout();
    //lib.setDisplayInline( lib.getById(p_idEnsemble) );
    lib.setDisplayBlock( lib.getById(p_idEnsemble) );

    // Gère la selection active
    this.setChampsActifs(p_idEnsemble);
    
    try {
        for(var i = 0; i < this.listeChampsActifs.length; i++) {
            // Récupère l'identifiant et le type de l'élément
            var idElement = this.listeChampsActifs[i];
            var typeElement = lib.getById(idElement).nodeName;

            // Trie l'élément s'il s'agit d'une sélection
            if (typeElement == "SELECT") {
            	var selection = new Selection(idElement);

            	if (selection.estVide()) {
	            	selection.autocharger();
		} 
		else {      
		    selection.recharger();
		    this.trierSelection(idElement);
		    this.supprimerOptionsSuperflues(idElement);
		}        
		
		/*if (selection.estFiltreeParListe())  {
		  alert(selection.identifiant);
		  } else {
		  alert(selection.identifiant + "FAUX");
		  }
		*/
            } else if (typeElement == "INPUT") {
                this.effacerContenuSaisie(idElement);
            }
        }
	
        this.trierSelection("listeCriteresSelectionnes");
    } catch(e)  {
    	e = new ExceptionAEF('W0001');    	
    	e.afficher();
    }

    // Affiche le bon sous-onglet
    this.masquerSousOnglets(p_idFamille);
    this.afficherSousOnglet(p_idFamille, p_indexCritere);
}

/**
 * Réinitialiser le contenu des saisies
 *
 * @param p_idEnsemble : identifiant de l'ensemble de champs
 * contenant les saisies à traiter
 */
function F_reinitialiserSaisies(p_idEnsemble) {
    var listeSaisies = lib.getById(p_idEnsemble).getElementsByTagName("INPUT");

    for (var i = 0; i < listeSaisies.length; i++) {
        if (listeSaisies[i].getAttribute("type") == "text") {
            listeSaisies[i].value = "";
        }
    }
}

/**
 * Supprimer les options déjà présentes dans la sélection de critères
 *
 * @param p_idSelection: identifiant de la sélection à filtrer
 */
function F_supprimerOptionsSuperflues(p_idSelection) {
    // Définit les listes d'options à comparer
    var idSelectionCriteres = "listeCriteresSelectionnes";
    var listeCriteres =
        lib.getById(idSelectionCriteres).getElementsByTagName("OPTION");
    var listeOptions = lib.getById(p_idSelection).options;

    // Recherche les index des options à supprimer
    var trouve = 0;

    for(var i = 0; i < listeCriteres.length; i++) {
        trouve = 0;

        for(var j = 0; j < listeOptions.length && trouve == 0; j++) {
            if (listeCriteres[i].value == listeOptions[j].value) {
                lib.getById(p_idSelection).options[j] = null;
                trouve = 1;
            }
        }
    }
}

/**
 * Afficher le premier ensemble de champs -FIELDSET- d'une famille
 *
 * @param p_idFamille : Identifiant de la barre d'onglets -DT- contenant
 * l'ensemble de champs -FIELDSET- à afficher
 */
function F_afficherEnsembleChamps(p_idFamille){
    // Recherche l'identifiant du premier ensemble de champs de la famille
    var idEnsemble = "";

    listeEnsembles = this.saisie.getElementsByTagName('fieldset');
    for(var i = 0 ; i< listeEnsembles.length ; i++){
        id = listeEnsembles[i].id.substring(0, p_idFamille.length);
        if(id == p_idFamille) {
            idEnsemble = listeEnsembles[i].id;
            break;
        }
    }

    // Affiche le premier ensemble de champs de la famille
    this.afficherChamp(idEnsemble, p_idFamille, 0);
}

/**
 * Masquer l'ensemble des sous onglets appartenant à l'onglet paramètre
 *
 * @param p_idOnglet : Identifiant de l'onglet
 */
function F_masquerSousOnglets(p_idOnglet){
    // Construit l'identifiant de la barre d'onglet
    idBarre  = "barre" + p_idOnglet.charAt(0).toUpperCase();
    idBarre += p_idOnglet.substring(1, p_idOnglet.length);

    // Récupère l'objet barre correspondant
    barre = lib.getById(id);

    // Recherche laliste des sous-onglets de cette barre
    listeSousOnglets = barre.getElementsByTagName('li');

    // Initialise à nul le style -CLASS- de ses sous-onglets
    for(var i=0 ; i<listeSousOnglets.length ; i++){
        listeSousOnglets[i].className = "";
    }
}

/**
 * Affiche le sous onglet de la famille 'p_identifiant' et se trouvant en
 * position 'p_index'
 *
 * @param p_identifiant: Identifiant de la famille d'onglet
 *
 * @param p_index: Index du menu cliqué
 */
function F_afficherSousOnglet(p_identifiant, p_index){
    // Construit l'identifiant de la barre de sous-onglets
    idBarre  = "barre" + p_identifiant.charAt(0).toUpperCase();
    idBarre += p_identifiant.substring(1, p_identifiant.length);

    // Récupère la liste des sous-onglets de la barre
    barre = lib.getById(idBarre);
    listeSousOnglets = lib.getListByTag(barre,'li');

    // Affecte le style souhaité à chaque sous-onglet
    for( var i = 0; i < listeSousOnglets.length; i++ ) {
        if( p_index == i)
            classe = "sousOngletSelectionne";
        else
            classe = "none";

        lib.setClass(listeSousOnglets[i], classe);
    }
}

/**
 * Lire le contenu associé au champ correspondant au sous onglet :
 *   p_identifiantSousOnglet et le retourne
 *
 * @param p_identifiantSousOnglet: Identifiant du sous onglet
 * @type p_identifiantSousOnglet: B{String}
 */
function F_lireFiltre(p_idSousOnglet){
    // Détermine l'identifiant unique de la saisie à filtrer
    identifiant = p_idSousOnglet.charAt(0).toUpperCase() +
        p_idSousOnglet.substring(1, p_idSousOnglet.length);

    // Récupère la valeur du filtre
    return document.getElementById("filtre" + identifiant).value;
}

/**
 * Lire le filtre d'exclusion
 *
 * @param p_identifiantSousOnglet: Identifiant sous onglet
 * @type p_identifiantSousOnglet: B{string}
 */
function F_lireFiltreExclusion(p_idSousOnglet){
    // Détermine l'identifiant unique de la saisie à filtrer
    identifiant = p_idSousOnglet.charAt(0).toUpperCase() +
        p_idSousOnglet.substring(1, p_idSousOnglet.length);

    // Récupère la valeur du filtre
    objet = document.getElementById("filtreExclusion" + identifiant);
    if (objet) {
        return objet.value;
    }
    else {
        return '';
    }
}
/**
 * Déterminer la destination d'un élément à déplacer à partir de sa valeur.
 *
 * @param p_valeurElement : Valeur de l'élément à transférer
 */
function F_getDestination(p_valeurElement) {
    var idSelection = p_valeurElement.split("_")[0];
    var destination = lib.getById(idSelection);

    if (destination && destination.nodeName == "SELECT")
        return destination;
    else
        return;
}

/**
 * Renvoyer le groupe d'options parent de l'élément à ajouter
 *
 * @param p_famille : Famille de l'objet
 * @param p_idBase : Identifiant de base
 */
function F_ajouterGroupeOptions(p_famille, p_idBase, p_destination) {
    // Construit l'identifiant du groupe d'options
    idGroupe = "groupeOptions_" + p_idBase;
    
    // Récupère le groupe d'options
    groupe = lib.getById(idGroupe);
    if( !groupe ) {
        // Crée le groupe s'il n'existe pas
        groupe = document.createElement("optgroup");
        groupe.setAttribute("label", p_famille);
        groupe.setAttribute("id", idGroupe);

        // Ajoute le groupe à la sélection de critères
        lib.appendChild(p_destination.id, groupe);	
    }

    return groupe;
}

/**
 * Déplacer les éléments choisis d'une sélection à une autre
 *
 * @param p_origine : Sélection de départ -SELECT-
 *
 * @param p_destination : Sélection d'arrivée -SELECT- (déterminée
 * automatiquement si paramètre absent)
 */
function F_deplacerOptionsSelectionnees(p_origine, p_destination) {
    // Copie les éléments de la sélection de destination dans un objet
    // temporaire
    if (p_destination) {
        //var listeOptions = lib.copierTableau(p_destination.options);
        var listeOptions = p_destination.options;
    }

    //
    var destination = null;
    for (var i=0; i<p_origine.options.length; i++) {
        var optionCourante = p_origine.options[i];
        if (optionCourante.selected) {
	    // Récupère la valeur à transférer
	    valeur = optionCourante.value;
	    
	    // Formate le texte à afficher
	    affichage = optionCourante.text;
            if (!listeOptions
                || listeOptions[valeur] == null
                || listeOptions[valeur] == "undefined"
                ) {
                // Détermine si la destination à été fournie en paramètre
                // ou doit être devinée à partir de la valeur de l'élément
                // en transfert
                if (!p_destination) {
                    destination = this.getDestination(valeur);

                    // Reformate le texte à afficher
                    //affichage = affichage.split("/")[1];
                } else {
                    // Assigne la destination
                    destination = p_destination;
                    // Ajoute si besoin la famille à la sélection
		    
                    etiquette = this.getEtiquette(optionCourante);
                    idBase = optionCourante.parentNode.id;
                    this.ajouterGroupeOptions(etiquette, idBase, destination);
                }

                // Ajoute un nouvel élément à la sélection de destination
                nouvelleOption = document.createElement("option");
                nouvelleOption.text = affichage;
                nouvelleOption.setAttribute("value", valeur);
                nouvelleOption.setAttribute("title", affichage);

                if (destination){		    
                    lib.appendChild(destination.id, nouvelleOption);
		}
            } else {
                message  = "Critère '" + optionCourante.text;
                message += "' déjà sélectionné !";
                alert(message);
            }
        }
    }

    // Supprime les éléments copiés de la sélection de départ
    for (var i=(p_origine.options.length-1); i>=0; i--) {
        var o = p_origine.options[i];
        if (o.selected) {
            p_origine.options[i] = null;
            }
        }

    // Rafraichit le tri des sélections affectées
    if (destination) {
        this.setSelectionMelangee(destination.id);
        this.trierSelection(destination.id);
    }
    this.setSelectionMelangee(p_origine.id);
    this.trierSelection(p_origine.id);

    // Réinitialise les curseurs de sélection
    if (destination) {
        destination.selectedIndex = -1;
    }
    p_origine.selectedIndex = -1;
}

/**
 * Trie la sélection
 *
 * @param p_idSelection: identifiant unique de la sélection
 */
function F_trierSelection(p_idSelection) {
    // Trie la sélection si nécessaire
    if(!this.estSelectionTriee(p_idSelection)) {
        getSelectionById(p_idSelection).trier();
        //this.afficherGroupesOptions();
    }

    // Conserve l'état trié de la sélection
    this.setSelectionTriee(p_idSelection);
}

/**
 * Affiche les OPTGROUP sous forme d'OPTION avec le style .optgroup
 * sur les navigateurs incompatibles avec les OPTGROUP
 */
function F_afficherGroupesOptions() {
	var selection = document.getElementById('listeCriteresSelectionnes');

	// Détecte l'absence de reconnaissance de la balise OPTGROUP	
	if (selection.childNodes.length > selection.options.length) {

		// Construit la nouvelle liste d'OPTION
		var listeOptions = new Array();
		for(var i=0; i<selection.childNodes.length; i++) {
		
			// Traite séparement le cas de l'OPTGROUP et de l'OPTION
			if (selection.childNodes[i].nodeName == 'OPTGROUP') {
				listeOptions[i] = new Option(
					selection.childNodes[i].getAttribute('label'), 
					selection.childNodes[i].getAttribute('label')
				);
				listeOptions[i].className = "optgroup";
			} else {
				listeOptions[i] = new Option(
					selection.childNodes[i].text, 
					selection.childNodes[i].value
				);
			}
		}
	
		// Supprimme le contenu actuel de la saisie
		for (var i=(selection.options.length-1); i>=0; i--) {
        	selection.options[i] = null;
	    }
    	selection.selectedIndex = -1;

		// Copie le contenu de la liste dans la saisie
		for(var i=0; i<listeOptions.length; i++) {
			if(listeOptions[i].text.length > 0) {
				var n = selection.options.length;
				selection.options[n] = new Option(
					listeOptions[i].text, 
					listeOptions[i].value
				);
				selection.options[n-1].className = listeOptions[i].className;
			}
		}
	}
}

/*************************************************************************
*    Etat des selections
**************************************************************************/
/**
 * Crée un enregistrement de l'état d'une selection à l'état trié
 *
 * @param p_idSelection: identifiant unique de la sélection
 */
function F_initialiserSelectionTriee(p_idSelection) {
    var taille = this.listeSelectionsTriees.length;

    this.listeSelectionsTriees[taille] = new Array();
    this.listeSelectionsTriees[taille][0] = p_idSelection;
    this.listeSelectionsTriees[taille][1] = 1;
}

/**
 * Enregistre l'etat de la selection.
 *
 * @param p_idSelection: identifiant unique de la sélection
 * @param p_etat: (0=mélangé, 1=trié)
 */
function F_setSelectionOrdonnee(p_idSelection, p_etat) {
    var trouvee = 0;
    var taille = this.listeSelectionsTriees.length;

    // Recherche l'existence de la selection
    for(var i=0; (i < taille) && (trouvee == 0); i++) {
        if (this.listeSelectionsTriees[i][0] == p_idSelection) {
            this.listeSelectionsTriees[i][1] = p_etat;
            trouvee = 1;
        }
    }

    // Crée l'élément s'il n'existe pas déjà
    if (trouvee == 0) {
        this.initialiserSelectionTriee(p_idSelection);
    }
}

/**
 * Enregistre l'état trié de la selection
 *
 * @param p_idSelection: identifiant unique de la sélection
 */
function F_setSelectionTriee(p_idSelection) {
    this.setSelectionOrdonnee(p_idSelection, 1);
}

/**
 * Enregistre l'état mélangé de la selection
 *
 * @param p_idSelection: identifiant unique de la sélection
 */
function F_setSelectionMelangee(p_idSelection) {
    this.setSelectionOrdonnee(p_idSelection, 0);
}

/**
 * Retourne vrai si la liste est triée, faux sinon
 *
 * @param p_idSelection: identifiant unique de la sélection
 *
 * @return 1 si triée, 0 sinon
 */
function F_estSelectionTriee(p_idSelection) {
    var taille = this.listeSelectionsTriees.length;

    // Recherche l'existence de la selection
    for(var i=0; i < taille; i++) {
        if (this.listeSelectionsTriees[i][0] == p_idSelection) {
            return this.listeSelectionsTriees[i][1];
        }
    }

    return 0;
}

/**************************************************************************
*    ???
*************************************************************************/
/**
 * Trier la liste des éléments d'une sélection
 *
 * @param p_element1 : Premier élément à comparer
 *
 * @param p_element2 : Deuxième élément à comparer
 */
function F_trierListeElements(p_element1,p_element2) {
	/*
	if ( lib.getValueToCompare(p_element1) < lib.getValueToCompare(p_element2) ) {
		alert(lib.getValueToCompare(p_element1) + " < " + lib.getValueToCompare(p_element2));
	} else {
		alert(lib.getValueToCompare(p_element1) + " > " + lib.getValueToCompare(p_element2));
	}
	*/

   // Compare les deux paramètres
    var val1 = lib.getValueToCompare(p_element1);
    var val2 = lib.getValueToCompare(p_element2);

   return (val1 < val2 ) ? -1 : 1;
}

/**
 * Renvoie l'étiquette du champ paramètre
 * !! PARAMETRE JAMAIS UTILISE !!
 */
function F_getEtiquette(p_champ) {
    // Essaie de récupérer le titre de l'élément courant
    try {
        chaine= lib.getById(this.listeChampsActifs[0]).getAttribute('title');
        //return chaine.toUpperCase();
        return chaine;
    } catch(e1) {

        // En cas d'erreur renvoie l'identifiant du champ actif
        try {
            return this.listeChampsActifs[0]
        } catch(e2) {

            // En cas d'erreur renvoie une chaine vide
            return "..."
        }
    }
}

/**************************************************************************
*    Boites de saisie
****************************************************************************/
/**
 * Crée un nouvel élément option dans une liste à partir du contenu d'un champ
 */
function F_copierSaisie(p_champ, p_liste) {
    var valeurDate = "";
    var valeur = "";
    var symbole = "";

    // Ajoute le symbole euro aux valeurs monétaires
    if (p_champ.id == 'donneesChiffreesCapitalSocial1' ) {
        affichage = "A partir de " + p_champ.value + "K€";
        symbole = "-";
    }
    if (p_champ.id == 'donneesChiffreesCapitalSocial2') {
        affichage = "Jusqu'à " + p_champ.value + "K€";
        symbole = "+";
    }
    // Ajoute des articles aux dates pour en indiquer le sens
    else if(p_champ.id == 'infoDateCreation1') {
        var date = lib.chaineEnDate(p_champ.value);
        valeurDate = lib.dateEnChaine(date);
        affichage = "A partir du " + valeurDate;
        symbole = "-";
    }
    else if(p_champ.id == 'infoDateCreation2') {
        var date = lib.chaineEnDate(p_champ.value);
        valeurDate = lib.dateEnChaine(date);
        affichage = "Jusqu'au " + valeurDate;
        symbole = "+";
    }

    // idBase
    var idBase = p_champ.id.substring(0, p_champ.id.length - 1);
    // Permet de bloquer temporairement l'accumulation d'intervalle
    var nePasTransferer = 0;

    // Définit un nouvel élément option
    if(valeurDate.length > 0) {
        valeur = 'infoDateCreation' + symbole;
        //On bloque les intervalles temporairement
        if ( this.incrementDate < 2) {
            valeur = valeur + this.incrementDate++;
            valeur = valeur + '_' + valeurDate;
        } else {
            this.incrementDate++;
            nePasTransferer = 1;
            if ((this.incrementDate > 1) && (this.incrementDate % 2 == 0 )) {
            	new ExceptionAEF('E0006').afficher();
            }
        }
    } else  {
        valeur = 'donneesChiffreesCapitalSocial' + symbole;
        if ( this.incrementCapitalSocial < 2) {
            valeur = valeur + this.incrementCapitalSocial++;
            valeur = valeur + '_' + p_champ.value;
        } else {
            this.incrementCapitalSocial++;
            nePasTransferer = 1;
            if ((this.incrementCapitalSocial > 1) &&
(this.incrementCapitalSocial % 2 == 0 ))  {
                new ExceptionAEF('E0006').afficher();
            }
        }
    }

    if (!nePasTransferer) {
        etiquette = this.getEtiquette(p_champ);
        this.ajouterGroupeOptions(etiquette, idBase, p_liste);
        nouvelleOption = new Option( affichage, valeur, false, false);
        nouvelleOption.setAttribute('title', affichage);
        p_liste.options[p_liste.options.length] = nouvelleOption;
        
        this.trierSelection(p_liste.id);
    }
}

/***************************************************************************
*    Transferts
****************************************************************************/
/**
 * Selectionne si besoin tous les champs avant de les tranférer
 *
 * @param p_tout: Booléen valant 1 si tous les champs doivent être selectionnés
 */
function F_selectionnerChampsTransferes(p_tout) {
    // Transfert champ par champ les champs actifs
    for(var i=0; i < this.listeChampsActifs.length; i++) {
        var idChamp = this.listeChampsActifs[i];

        // Selectionne toutes les options d'une boite de selection
        if (p_tout == 1 ) {
            var champ = document.getElementById(idChamp);
            if(champ.nodeName == "SELECT") {
                selectAllOptions(champ);
            }
        }

        this.transfererChamp(idChamp);
    }

    // Affiche un erreur si le transfert en déclenche une
    if(this.messageErreur.length > 0) {
        alert(this.messageErreur);
        this.messageErreur = "";
    }
}

/**
 * Transfert tous les champs actifs sélectionnés
 */
function F_transferer() {
    this.selectionnerChampsTransferes(0);
}

/**
 * Transfert tout le contenu des champs actifs
 */
function F_toutTransferer() {
    this.selectionnerChampsTransferes(1);
}

/**
 * Transfert un champ
 *
 * @param p_identifiantChamp: idenitfiant unique du champ transféré
 */
function F_transfererChamp(p_identifiantChamp){
    var codeErreur = "";
    var champ = document.getElementById(p_identifiantChamp);
    var liste = document.getElementById('listeCriteresSelectionnes');
    // Transfert les options d'une sélection
    if(champ.nodeName == 'SELECT') {
        this.deplacerOptionsSelectionnees(champ, liste);
    }
    // Transfert une saisie
    else if(champ.nodeName == 'INPUT') {
        if ( this.validerFormat(champ) ) {
            if ( this.validerBornes(champ.id) ) {
                this.copierSaisie(champ, liste);
            }
        } else {
            this.messageErreur =
                "Veuillez saisir uniquement des caractères numériques";
        }
    }
}

/**
 * Efface le contenu de la liste des critères sélectionnés
 */
function F_effacerTouteSelection() {
    this.selectionnerTout();
    this.supprimer();
    }

/**
 * Supprime les critères sélectionnés de la liste de sélection
 */
function F_supprimer() {
    liste = document.getElementById('listeCriteresSelectionnes');
    //Permet de remettre un intervalle de date et de capital social
    if (this.incrementDate != 0) {
        this.incrementDate = 0;
    }
    if (this.incrementCapitalSocial != 0) {
        this.incrementCapitalSocial = 0;
    }
    this.deplacerOptionsSelectionnees(liste);
}

/****************************************************************************
*    Validations de format
****************************************************************************/
/**
 * Permet de valider le type de donnees du champ
 */
function F_validerFormat(p_champ) {
   if ((p_champ.id == 'donneesChiffreesCapitalSocial1')
       || (p_champ.id == 'donneesChiffreesCapitalSocial2')) {
       for (i=0; i < p_champ.value.length; ++i)
           if (p_champ.value.charAt(i) < "0" ||
               p_champ.value.charAt(i) > "9")
               return 0;
   }
   return 1;
}

/**
 * Permet de valider que date2 > date1 et cpatial1 < capital2
 */
function F_validerBornes(p_nomChamp) {
	champs = this.listeChampsActifs;
    sValChamp = document.getElementById(champs[0]).value;
    sValChamp1 = document.getElementById(champs[1]).value;
    this.messageErreur = "";
    

	if ((p_nomChamp == 'donneesChiffreesCapitalSocial1')
		|| (p_nomChamp == 'donneesChiffreesCapitalSocial2')) {
        valChamp = parseInt(sValChamp);
        valChamp1 = parseInt(sValChamp1);
        
        // Vérifie le format du capital social et la validite des bornes
        if ((sValChamp.length > 0) && (sValChamp1.length > 0)) {
			if (valChamp > valChamp1) {
            	var message = "Veuillez saisir un nombre minimum inférieur";
                message += " au nombre maximum";
                this.messageErreur = message;
                return 0;
            } else if (valChamp == valChamp1) {
                var message = "Veuillez saisir un nombre minimum différent";
                message += " du nombre maximum";
                this.messageErreur = message;
                return 0;
            } else {
                return 1;
            }
		} else if (sValChamp.length == 0) {
            this.messageErreur = "Veuillez saisir un minimum";
            return 0;
        } else if (sValChamp1.length == 0) {
            this.messageErreur = "Veuillez saisir un maximum";
            return 0;
        }
    } else if (
    	(p_nomChamp == 'infoDateCreation1') ||(p_nomChamp =='infoDateCreation2')
    ) {
        
        // Vérifie le format d'entrée
        this.messageErreur = lib.formatDateIncorrect(sValChamp);
        if (this.messageErreur.length > 0) {
            return 0;
        }
        
        this.messageErreur = lib.formatDateIncorrect(sValChamp1);
        if (this.messageErreur.length > 0) {
            return 0;
        }
        

        // Vérifie le format des dates et la validité des bornes
        
        test_date = lib.comparerDates(
        	lib.chaineEnDate(sValChamp), lib.chaineEnDate(sValChamp1)
        );
        
        if ((sValChamp.length > 0) && (sValChamp1.length > 0)) {
			if (test_date == 0) {
            	var message = "Veuillez saisir une date de début différente";
               	message += " de la date de fin";
               	this.messageErreur = message;
           	} else if (test_date == 1) {
               	var message = "Veuillez saisir une date de début antérieure";
               	message += " à la date de fin";
               	this.messageErreur = message;
            } else if (test_date == 3) {
               	this.messageErreur =
                	"Veuillez saisir les dates au format JJ/MM/AAAA";
           	} else { 
				return 1; 
			}
        } else {
            return 1;
        }
    }
}

/****************************************************************************
*    ???
****************************************************************************/

/**
 * Annuler le choix de toutes les éléments des sélections du document
 */
function F_annulerToutesSelections() {
    // Recherche la liste des sélections du formulaire
    listeSelections = this.saisie.getElementsByTagName('select');

    // Désactive le curseur de choix sur chaque sélection
    for(var i=0 ; i < listeSelections.length ; i++){
        listeSelections[i].selectedIndex = -1;
    }
}

/**
 * Efface le contenu de la saisie paramètre
 *
 * @param p_idSaisie: identifiant unique d'une saisie
 */
function F_effacerContenuSaisie(p_idSaisie) {
    document.getElementById(p_idSaisie).value = "";
}

/**
 * Masquer tous les ensembles de champs du formulaire
 */
function F_masquerTout(){
    // Recherche la liste des ensembles de champs du formulaire
    listeEnsembles = this.saisie.getElementsByTagName('fieldset');

    // Masque un à un les ensembles de champs
    for(var i=0 ; i < listeEnsembles.length ; i++){
        ensembleChamps = listeEnsembles[i];
        lib.setDisplayNone(ensembleChamps);
    }

    // Ré-initialise les saisies et sélections du formulaire
    this.annulerToutesSelections();
}

/**
 * Selection toutes les options de la liste des critères selectionnes
 */
function F_selectionnerTout() {
    liste = document.getElementById('listeCriteresSelectionnes');
    for (var i=0; i<liste.options.length; i++) {
        liste.options[i].selected = true;
    }
}

/**
 * Définit les champs actifs du formulaire, c'est à dire dont les valeurs
 * peuvent potentiellment être tranférées dans la sélection à soumettre
 *
 * @param p_idEnsemble: Ensemble de champs actif
 * @type p_idEnsemble: B{string}
 */
function F_setChampsActifs(p_idEnsemble) {
    // Récupère l'ensemble de champs actif
    ensemble = lib.getById(p_idEnsemble);

    // Ré-initialise la liste des champs actifs
    this.listeChampsActifs = new Array();

    // Parcours un à un les champs de l'ensemble afin de déterminer s'il
    // sont à activer ou pas
    for(var i=0; i<ensemble.childNodes.length; i++) {
        // Ajoute les champs actifs à la liste
        this.ajouterChampsActifs(ensemble, i);

        // Saute les paragraphe et les conteneurs présents dans les ensembles
        // de champs
        if(typeChamp == "P" || typeChamp == "DIV") {

            // Parcours le conteneur à la recherche de champs
            conteneur = ensemble.childNodes[i];
            for(var j=0; j<conteneur.childNodes.length; j++) {
                // Ajoute les champs actifs à la liste
                this.ajouterChampsActifs(conteneur, j);
            }
        }
    }
}

/**
 * Ajouter les champs actifs à la listes des champs actifs
 */
function F_ajouterChampsActifs(p_conteneur, p_increment) {
    // Détermine le type et l'identifiant du champ vérifié
    typeChamp = p_conteneur.childNodes[p_increment].nodeName;
    idChamp = p_conteneur.childNodes[p_increment].id;

    // Ajoute les sélections et les saisies qui ne sont pas des
    // filtres
    if( ( typeChamp == "SELECT" || typeChamp == "INPUT" )
        && idChamp.substring(0, 6) != 'filtre' && idChamp.length > 0 ) {

        // Ajoute l'identifiant du champ à la liste des champs actifs
        this.listeChampsActifs[this.listeChampsActifs.length] = idChamp;
    }
}

/**
 * Définit toutes les sélections comme triées sauf la sélection de droite
 */
function Formulaire_initialiserSelections() {
    listeSelections = document.getElementsByTagName("SELECT");
    for( var i=0; i<listeSelections.length; i++) {	
        this.initialiserSelectionTriee(listeSelections[i].id);
    }
    this.setSelectionMelangee('listeCriteresSelectionnes');
}

/**
 * Récupère les filtre de type liste dans la page
 *
 * @return Tableau d'objets 'Selection'
 */
function Formulaire_getFiltresTypeListe() {	
	//
	var listeFiltresTypeListe = new Array();
	var listeSELECT = document.getElementsByTagName('SELECT');
	
	//
    for(var i=0; i<listeSELECT.length; i++) {	
        if (listeSELECT[i].className != 'filtreTypeListe') {
        	listeFiltresTypeListe.append(new Selection(listeSELECT[i].id));
        }
    }
    
    // Renvoie ...      
    return listeFiltresTypeListe;
}

/****************************************************************************
*    Constructeur
****************************************************************************/

/**
 * Cette classe s'occupe de la gestion du formulaire elle permet de :
 * - d'afficher le première élément d'un ensemble de champs
 * - d'afficher un champ
 * - de masquer l'ensemble des champs
 * - de lire les valeurs d'un filtre
 */
function Formulaire(){
    // Déclare les attributs
    this.saisie = document.getElementById('saisie');
    this.optionTransfer = null;
    this.listeChampsActifs = null;
    this.listeSelectionsTriees = new Array();
    this.messageErreur = "";
    this.incrementDate = 0;
    this.incrementCapitalSocial = 0;

    // Déclare les méthodes
    this.afficherEnsembleChamps = F_afficherEnsembleChamps;
    this.afficherChamp = F_afficherChamp;
    this.masquerTout = F_masquerTout;
    this.lireFiltre = F_lireFiltre;
    this.lireFiltreExclusion = F_lireFiltreExclusion;
    this.masquerSousOnglets = F_masquerSousOnglets;
    this.afficherSousOnglet = F_afficherSousOnglet;
    this.transferer = F_transferer;
    this.deplacerOptionsSelectionnees = F_deplacerOptionsSelectionnees;
    this.annulerToutesSelections = F_annulerToutesSelections;
    this.transfererChamp = F_transfererChamp;
    this.selectionnerChampsTransferes = F_selectionnerChampsTransferes;
    this.selectionnerTout = F_selectionnerTout;
    this.setChampsActifs = F_setChampsActifs;
    this.ajouterChampsActifs =F_ajouterChampsActifs;
    this.copierSaisie = F_copierSaisie;
    this.toutTransferer = F_toutTransferer;
    this.getEtiquette = F_getEtiquette;
    this.getDestination = F_getDestination;
    this.ajouterGroupeOptions = F_ajouterGroupeOptions;
    this.trierSelection = F_trierSelection;
    this.supprimerOptionsSuperflues = F_supprimerOptionsSuperflues;
    this.effacerTouteSelection = F_effacerTouteSelection;
    this.validerFormat = F_validerFormat;
    this.validerBornes = F_validerBornes;
    this.setSelectionOrdonnee = F_setSelectionOrdonnee;
    this.setSelectionTriee = F_setSelectionTriee;
    this.setSelectionMelangee = F_setSelectionMelangee;
    this.estSelectionTriee = F_estSelectionTriee;
    this.initialiserSelections = Formulaire_initialiserSelections;
    this.initialiserSelectionTriee = F_initialiserSelectionTriee;
    this.reinitialiserSaisies = F_reinitialiserSaisies;
    this.supprimer = F_supprimer;
    this.effacerContenuSaisie = F_effacerContenuSaisie;
    this._getFiltresTypeListe = Formulaire_getFiltresTypeListe;
    this.afficherGroupesOptions = F_afficherGroupesOptions;    

    // Initialise les incréments à 1 si besoin
    var selection = getSelectionById('listeCriteresSelectionnes');
    if (selection.contientCapitalSocial() == 1) {
        this.incrementCapitalSocial = 2;
    }
    if (selection.contientDateCreation() == 1 ) {
        this.incrementDate = 2;
    }
    
    // Détermine le statut de tri des sélections du formulaire
    this.initialiserSelections();
}

