CrazyCat Programming Factory
rendre internet plus accessible
 

Ordre de tri avec des radios

Logo javascriptLa problématique que nous allons donner ici est simple:
Nous voulons permettre le choix de l'ordre de tri d'annonces selon 4 critêres, en sachant que chaque critêre ne peut donc être sélectionné qu'une seule fois.
Voici tout d'abord le formulaire tel qu'il sera utilisé.
Tri des annonces
<form name="choixtri">
<b>Ordre n°1:</b> <input type="radio" name="UORDRE1" value="CPBIEN" checked onclick="ver_option('1');">CP <input type="radio" name="UORDRE1" value="PRIXBIEN" onclick="ver_option('1');">Prix <input type="radio" name="UORDRE1" value="TYPEBIEN" onclick="ver_option('1');">Type bien <input type="radio" name="UORDRE1" value="NBPIECES" onclick="ver_option('1');">Nb.Pièces
<b>Ordre n°2:</b> <input type="radio" name="UORDRE2" value="CPBIEN" onclick="ver_option('2');">CP <input type="radio" name="UORDRE2" value="PRIXBIEN" checked onclick="ver_option('2');">Prix <input type="radio" name="UORDRE2" value="TYPEBIEN" onclick="ver_option('2');">Type bien <input type="radio" name="UORDRE2" value="NBPIECES" onclick="ver_option('2');">Nb.Pièces
<b>Ordre n°3:</b> <input type="radio" name="UORDRE3" value="CPBIEN" onclick="ver_option('3');">CP <input type="radio" name="UORDRE3" value="PRIXBIEN" onclick="ver_option('3');">Prix <input type="radio" name="UORDRE3" value="TYPEBIEN" checked onclick="ver_option('3');">Type bien <input type="radio" name="UORDRE3" value="NBPIECES" onclick="ver_option('3');">Nb.Pièces
<b>Ordre n°4:</b> <input type="radio" name="UORDRE4" value="CPBIEN" onclick="ver_option('4');">CP <input type="radio" name="UORDRE4" value="PRIXBIEN" onclick="ver_option('4');">Prix <input type="radio" name="UORDRE4" value="TYPEBIEN" onclick="ver_option('4');">Type bien <input type="radio" name="UORDRE4" value="NBPIECES" checked onclick="ver_option('4');">Nb.Pièces
</form>

Notre script va devoir gérer l'ordre dynamiquement, c'est à dire que lorsqu'on change une valeur, les critêres s'adaptent aux nouveaux paramêtres.
Pour cela, nous utiliserons un système de calcul simple: en affectant une valeur dérivée du binaire à chaque choix, nous pouvons déterminer la somme que doit toujours représenter le formulaire.
Nous avons 4 valeurs, soit 2^0, 2^1, 2^2 et 2^3, ce qui donne un total de 15.
function ver_option(uord){
   mychoices = new Array(1,2,4,8);
   // initialisation du tableau de valeurs
   var total_sel = 0;
   var goodchoice = 0;
   var forced = 0;
   for (cursel = 0; cursel < 4; cursel++) {
      // On parcourt nos 4 ensembles de radios
      noselg = cursel + 1;
      noselected_group = eval("document.choixtri.UORDRE" noselg)
      for (nosel = 0; nosel < noselected_group.length; nosel++) {
         // dans chaque ensemble, on parcourt les radios
         if (noselected_group[nosel].checked == true) {
            total_sel  = eval(mychoices[nosel]);
            // le radio est coché, on ajoute sa valeur au total
            if (noselg == uord) {
               goodchoice = mychoices[nosel];
               // ici, on crée une "mémoire" pour la modification de l'ordre à venir
            }
         }
      }
   }
   if (total_sel != 15) {
      // La somme n'est pas égale à 15, il faut donc trouver quel radio il faut corriger
      delta = 15 - (total_sel - goodchoice);
      // la différence est l'exposant qui est en doublon
      if (delta == 1) { forced = 0 };
      if (delta == 2) { forced = 1 };
      if (delta == 4) { forced = 2 };
      if (delta == 8) { forced = 3 };
      for (cursel = 0; cursel < 4; cursel++) {
         // on reparcourt la liste des ensembles
         noselg = cursel + 1;
         noselected_group = eval("document.choixtri.UORDRE" noselg)
         for (nosel = 0; nosel < noselected_group.length; nosel  ) {
            // Et dans chaque ensemble, la liste des radios
            if (noselected_group[nosel].checked == true) {
               if ((noselg != uord) && (mychoices[nosel] == goodchoice)) {
                  // le radio coché est celui qui a la valeur modifiée mais il n'est pas celui qui a été modifié
                  noselected_group[forced].checked = true;
                  // on force la sélection du bon radio
               }
            }
         }
      } 
   }
}

©2006-2019 Geek Zone | eggdrop.fr | zeolia.net