/*
--------------------------------------------------------
Collection de fonction de validation de champs de formulaire
--------------------------------------------------------
Copyright 2001 GHS
--------------------------------------------------------
20010122 NH : developpement initial
--------------------------------------------------------
Historique :
    - 2002/02/12 SB : suppression des caracteres accentues
--------------------------------------------------------
Script de gestion de listes deroullantes <SELECT> dependantes.
--------------------------------------------------------
Usage : 
        - charger de Javascript dans le HEAD
        - indiquer dans l'evenement onChange de la liste mere,
          qu'il faut recharger la liste fille
        - creer l'objet JS contenant toutes les donnees
        - la liste dependante est initialisee par un appel
          JS, de maniere a eviter une execution de requete et
          pour permettre a NS de preparer la taille de la liste.
        - si plusieurs listes contiennent les memes donnees
          dependantes (HTC : selection de plusieurs couples secteur
          qualif dependante), on ne doit creer qu'un seul objet JS
          listant les donnees dependantes (SELECT multiple <> Objet unique)
        - On peut imbriquer les dependances : liste 3 depend de
          liste 2, qui depend de liste 1. Pour ce faire, il suffit
          de deux objets JS, utilises par les deux listes dependantes.
--------------------------------------------------------
Exemples :
    <script language="JavaScript" src="/js/listeDep.js"></script>
    ...
    <select name="cle_secteur" onChange="return lst_qualif.change(this, this.form.cle_qualif);">
        <option value="1">Option 1</option>
    ...
    <select name="cle_qualif">
    ...
    <script LANGUAGE="JavaScript1.1">
        var lst_qualif = new ListeDependante();
        lst_qualif.preserveOption = 1;
        lst_qualif.addListe(1);
        lst_qualif.addOption("Option 1.1", 11);
        lst_qualif.addOption("Option 1.2", 12);
        lst_qualif.addListe(2);
        lst_qualif.addOption("Option 2.1", 21);
        lst_qualif.addOption("Option 2.2", 22);
        lst_qualif.change(document.inscription_ec.cle_secteur, document.inscription_ec.cle_qualif, 1);
    </script>
--------------------------------------------------------
Code en situation :
    <select name="cle_secteur" onChange="return lst_qualif.change(this, this.form.cle_qualif);">
        <option value="">(Votre choix)</option>
%       while ($sth_secteur->fetchrow_arrayref) {
            <option value="<% $cle %>" <% ($cle eq $cle_secteur) ? "SELECTED" : "" %>><% encode_entities($libelle) %></option>
%       }
    </select>
    <select name="cle_qualif">
        <option value="">(Votre choix)</option>
        <option value="">cette fausse option definit la largeur</option>
        <option value="">...hauteur (pour Netscape)</option>
        <option value="">...hauteur (pour Netscape)</option>
    </select>
    <script LANGUAGE="JavaScript1.1">
        var lst_qualif = new ListeDependante();
        lst_qualif.preserveOption = 1;
%       while ($sth_secteur->fetchrow_arrayref) {
            lst_qualif.addListe(<% $cle %>);
%           $sth_qualif->execute($cle);
%           $sth_qualif->bind_columns(\$cle, \$libelle);
%           while ($sth_qualif->fetchrow_arrayref) {
                lst_qualif.addOption("<% $libelle %>", <% $cle %>);
%           }
%       }
        lst_qualif.change(document.inscription_ec.cle_secteur, document.inscription_ec.cle_qualif, <% $cle_qualif || 0 %>);
    </script>
--------------------------------------------------------
*/



// --------------------------------------------------------
// Classe OptionDependante : toutes les options de la liste dependantes, classees selon les options de la liste mere

function OD_addOption(label, valeur)
{
    this.label[this.label.length] = label;
    this.valeur[this.label.length - 1] = valeur;
}

function OptionDependante()
{
    this.label = new Array();
    this.valeur = new Array();

    this.addOption = OD_addOption;
}


// --------------------------------------------------------
// Classe ListeDependante : options de la liste mere, avec toutes les options dependantes

function LD_addListe(cle)
{
    this.cle[this.cle.length] = cle;
    this.liste[this.cle.length - 1] = new OptionDependante();
}

function LD_addOption(label, valeur)
{
    this.liste[this.liste.length - 1].addOption(label, valeur);
}

function LD_change(selectPere, selectFils, cleFille)
{
    var cleMere = selectPere.options[selectPere.selectedIndex].value;
    selectFils.options.length = this.preserveOption;
    selectFils.selectedIndex = 0;

    for (var i = 0; i < this.cle.length; i++) {
        if (this.cle[i] == cleMere) {

            // On a trouve l'option dont la cle est selectionnee : on charge la liste dependante
            var liste = this.liste[i];
            for (var j = 0; j < liste.label.length; j++) {
				selectFils.options[selectFils.options.length] = new Option(liste.label[j], liste.valeur[j]);
				if (liste.valeur[j] == cleFille) {
				    selectFils.options[selectFils.options.length - 1].selected = true;
				}
		    }

            return true;
        }
    }

    return false;
}

function ListeDependante()
{
    this.cle = new Array();     // Liste des cles de la liste d'option principale, dont depend la liste dependante
    this.liste = new Array();   // Liste des options dependantes, pour chacune des cles : chaque element de ce tableau est une liste d'options
    this.preserveOption = 1;    // Preserve toujours la premiere option de la liste dependante (ex. "(Selectionnez ci-dessous)")

    this.addListe = LD_addListe;
    this.addOption = LD_addOption;
    this.change = LD_change;
}
