Ordre de tri avec des radios
La 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>
<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
}
}
}
}
}
}
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
}
}
}
}
}
}