/* auteur: Bernard Martin-Rabaud */
/* date de creation: 13/02/01 */

var nbthemes = 0; // nombre de thèmes
var nbmots = 0; 
var themecour = 0;
var motcour = 0;

// contrôle la validité des champs
function controle() {
   var alerte = "";
   with (document.donnees) {
      if (liste_themes.value == "")
         alerte += "le champ \"thème relatif aux mots à deviner\" est vide\n";
      if (liste_mots.value == "")
         alerte += "le champ \"liste des mots à deviner\" est vide";
   }
   if (alerte) {
      alert(alerte);
      return false;
   }
   else return true;
}

// récupère les valeurs des champs pour les transmettre à la page appelée 
function recup_form() {
   // la chaine qui sera transmise à pendu_donnees.htm
   var ch = ""; 
   with (document.donnees) {
      // champ 0 : les pages doivent être en XHTML ?
      ch = (XHTML.checked ? "XHTML" : "");
	  // champ 1 : ajouter des commentaires dans la page de données ?
      ch += comments.checked ? "&comments" : "&";
	  // champ 2 : coder les données ?
	  ch += coder.checked ? "&coder" : "&";
	  // champ 3 : l'alphabet
	  ch += "&" + (alphabet[1].checked ? "1" : "0");
	  // champs 4 et 5 : les répertoires
      ch += "&" + rep_lettres.value + "&" + rep_images.value;
	  // champs 6 et 7 : le bouton extrèmes et les extrèmes automatiques	  
	  if (extremes.checked) {
	     ch += "&extremes";
		 if (extremes_auto.checked) ch +="&auto";
		 else ch +="&";
      }
	  else ch += "&&";
	  // champ 8 : le coût de l'aide
	  ch += "&" + cout_aide.value;
   }
   // champs 9 et suivants les thèmes et les mots
   // formatte thèmes et mots pour envoi sur pendu_donnes.htm
   ch += liste.formatte(); 
   return ch;
}

// envoie les données récupérées à la page "pendu_données41.htm"
function envoie_donnees() {
//   if (controle())
      location.href = "form_confirme51.htm?" + recup_form();
}

// remplace dans une chaîne l'ancienne sous-chaîne par la nouvelle
function remplace_chaine(ancienne, nouvelle) {
  var pos1 = 0;
  var ch = "";
  var pos2 = this.indexOf(ancienne);
  while (pos2 != -1) {
     ch += this.substring(pos1, pos2) + nouvelle;
     pos1 = pos2 + ancienne.length;
     pos2 = this.indexOf(ancienne, pos1);
  }
  ch += this.substring(pos1, this.length);
  return ch;
}

String.prototype.remplace_chaine = remplace_chaine;

// GESTION DES THEMES

// PRINCIPE :
// On applique les mêmes principes que pour les mots.
// Pour ajouter un nouveau thème : inscrire le thème dans la boîte texte,
// puis cliquer sur "Ajouter"; si la boîte est vide, il ne se passe rien.
// Pour modifier un thème, le sélectionner, il s'affiche alors dans la boîte,
// et lorsqu'on l'a modifié, cliquer sur "Modifier", le thème sera modifié
// dans la liste des thèmes, et la boîte se vide.
// Pour supprimer un thème, on le sélectionne, puis on clique sur "Supprimer",
// le thème est supprimé de la boîte et de la liste.
// Pour voir les mots du thème, on le sélectionne, puis on clique sur "Les mots",
// les mots du thème sont affichés, et le thème est effacé de la boîte.
// Peut-on ajouter un thème, en l'écrivant simplement dans la boîte et cliquant sur "Entrée"
// (pour Netscape seulement) ? Bof... 

// affecte une valeur à une option existante
function theme_val_option(option, valeur) {
   document.donnees.liste_themes.options[option].text = valeur;
   document.donnees.liste_themes.options[option].value = valeur;
}

// déclenché lorsqu'on clique sur "sélectionner" dans la liste des thèmes
function selecte_theme() {
   themecour = document.donnees.liste_themes.selectedIndex;
   document.donnees.theme.value = document.donnees.liste_themes.options[themecour].value;
   affiche_mots();
   nbmots = liste.themes[themecour].mots.length;
}

// pour désélectionner le thème courant
function deselecte_theme() {
   themecour = -1;
   document.donnees.liste_themes.selectedIndex = -1;
   // vide la boîte de thème
   document.donnees.theme.value = "";
   // vide la liste des mots
   vide_liste_mots();
}

function ajout_theme(titre) {
   // il y a déjà des thèmes dans la liste : on crée une nouvelle option
   if (nbthemes) 
   document.donnees.liste_themes.options[nbthemes] = new Option(titre, titre, false, false);
   // c'est le 1er thème : il remplace le texte "nouveau thème"
   else theme_val_option(0, titre);
   // ajoute un élément à la "liste" des thèmes
   liste.nouveau_theme(titre);
   themecour = nbthemes;
   nbthemes++;
   // vide la liste des mots
   vide_liste_mots("aucun mot pour le thème " + titre);
}

// déclenché lorsqu'on clique sur "Ajouter" :
function nouveau_theme() {
   // si la boîte de thème est vide : message et il ne se passe rien
   if (document.donnees.theme.value == "")
      alert("Vous n'avez pas indiqué de thème.");
   else {
      // on vérifie d'abord si le thème n'existe pas déjà
	  // (cas où un thème a été sélectionné et qu'on appuye directement sur "Nouveau")
	  var titre = document.donnees.theme.value;
	  var i = 0;
	  while (i < nbthemes) {
	     if (titre == document.donnees.liste_themes.options[i].value) break;
		 else i++;
      }
	  if (i < nbthemes)
	     alert("Ce thème existe déjà. Vous devez écrire un nouveau thème avant de cliquer sur le bouton \"Nouveau\"");
      else ajout_theme(titre);
      // vide la boîte des thèmes
      deselecte_theme();
   }
}

// déclenché lorsqu'on clique sur "Modifier";
// la boîte thème doit contenir le nom du thème (qui devrait avoir été modifié)
function modif_theme() {
   // si aucun thème n'est sélectionné, il ne se passe rien
   if (themecour == -1)
      alert("Vous n'avez pas sélectionné de thème.");
   else {
      var titre = document.donnees.theme.value;
      // modifie le thème dans la liste des thèmes
      theme_val_option(themecour, titre); 
      // modifie le titre dans la "liste" des thèmes
      liste.themes[themecour].modif_titre(titre);
      deselecte_theme();
   }
}

// déclenché si on met le focus sur la liste déroulante des thèmes et qu'on a sélectionné un thème
function focus_theme() {
   if (navigator.appName != "Microsoft Internet Explorer") selecte_theme();
}

// affiche les mots dans la liste déroulante "liste_mots"
// lorsqu'on sélectionne un thème
function affiche_mots() {
      var longueur = document.donnees.liste_mots.length;
      var i = 0;
      // affiche les options avec les mots du thème courant
      // dans la limite du nombre actuel d'options de la liste déroulante "liste_mots"
      while (i < longueur) {
         if (liste.existe_mot(themecour, i)) {
		    mot_val_option(i, liste.valeur_mot(themecour, i));
		    if (i == 0) document.donnees.liste_mots.options[i].selected = true;
            i++;
         }
         else break;
      }
      // si, après que tous les mots aient été inscrits dans la liste déroulante des mots,
      // il reste encore des options, on met ces options résiduelles en blanc,
      while (i < longueur) {
	     mot_val_option(i, "");
	     i++;
      }
      // sinon on crée de nouvelles options pour recevoir le reste des mots
      while (liste.existe_mot(themecour, i)) {
	     status = "numéro du mot = " + i;
         document.donnees.liste_mots.options[i] = new Option(liste.valeur_mot(themecour, i), liste.valeur_mot(themecour, i), false, false);
         i++
      }
}

// déclenché lorsqu'on clique sur "Supprimer" :
// supprime le thème sélectionné 
function supprime_theme() {
   // si aucun thème n'est sélectionné, il ne se passe rien
   if (themecour == -1)
      alert("Vous n'avez pas sélectionné de thème.");
   else {
      document.donnees.liste_themes.options[themecour] = null;
	  vide_liste_mots();
      // supprime le thème de la "liste" des thèmes
      liste.suppr_theme(themecour);
//      if (themecour < nbthemes - 1) nbthemes--;
      nbthemes--;
      deselecte_theme();
   }
}

// GESTION DES MOTS

// PRINCIPE :
// Pour ajouter un nouveau mot, on remplit les cases mot, définition et contexte (ces 2 dernières facultatives), 
// puis on fait "Ajouter". 
// Si le dernier mot est sans def et/ou contexte, et qu'on ajoute un def et/ou un contexte sans mot, 
// on demande (par prompt) si on ajoute cette def et/ou ce contexte au dernier mot.
// Lorsqu'un mot est ajouté, les 3 boîtes texte sont vidées.
// Si un mot est sélectionné, on affiche le mot et éventuellement la def et/ou le contexte
// dans les boîtes texte respectives. Si on en sélectionne un autre, idem.
// Donc les mot, def, contexte remplacent les anciens dans les boîtes texte;
// ça veut dire que si l'on a écrit un mot (avec éventuellement def et/ou contexte)
// pour l'ajouter et qu'on sélectionne un autre mot, le mot qui vient d'être écrit est effacé.
// Ben oui.
// Lorsqu'un mot est sélectionné, on peut le modifier, le supprimer, le remonter, le descendre.
// Lorsqu'on met le focus dans une des 3 boîtes texte, celle-ci se vide. 
// Ca permet de pouvoir ajouter un nouveau mot, si un mot a été sélectionné.
// Pour modifier un mot (avec éventuellement def et/ou contexte), on le sélectionne
// puis on clique sur "Modifier" : les 3 boîtes texte se vident.
// Idem pour "Supprimer".
// On peut faire la même chose pour "Remonter" et "Descendre".
// Si on clique sur "Modifier", "Supprimer", "Remonter" ou "Descendre"
// et qu'aucun mot n'est sélectionné, il ne se passe rien.
// Si on clique sur "Ajouter" et que les 3 boîtes sont vides, il ne se passe rien.
    
// affecte une valeur à une option existante
function mot_val_option(option, valeur) {
   document.donnees.liste_mots.options[option].text = valeur;
   document.donnees.liste_mots.options[option].value = valeur;
}

// affecte des valeurs aux 3 boîtes mot, definition et contexte
function boites_mot_valeurs(mot, def, contexte) {
   document.donnees.mot.value = mot;
   document.donnees.def.value = def;
}

// déclenché lorsqu'on clique sur "sélectionner" dans la liste des mots
function selecte_mot() {
   if (themecour == -1) alert("aucun thème n'est sélectionné");
   else {
      motcour = document.donnees.liste_mots.selectedIndex;
      var elts_mot = decoupe_mot(document.donnees.liste_mots.options[motcour].value);
      boites_mot_valeurs(elts_mot[0], elts_mot[1], elts_mot[2]);
   }
}

// pour désélectionner le mot courant
function deselecte_mot() {
   motcour = -1;
   document.donnees.liste_mots.selectedIndex = -1;
   // vide les boîtes de mot
   boites_mot_valeurs("", "", "");
}

// concaténe le mot, la définition et le contexte
function concatene_mot() {
   var chaine = document.donnees.mot.value;
   var indice = document.donnees.def.value;
   var i = 0;
   if (indice) {
      while (indice.charAt(i) == " ") i++;
      if (i) indice = indice.substring(i);
      chaine += "//" + indice;
   }
  
   return chaine;
}

function ajout_mot(mot) {
   // il y a déjà des mots dans la liste : on crée une nouvelle option
   if (nbmots) 
   document.donnees.liste_mots.options[nbmots] = new Option(mot, mot, false, false);
   // c'est le 1er thème : il remplace le texte "nouveau thème"
   else mot_val_option(0, mot);
   // ajoute un élément à la "liste" des thèmes
   liste.nouveau_mot(themecour, mot);
   motcour = nbmots;
   nbmots++;
}

// déclenché lorsqu'on clique sur "ajouter" dans la liste déroulante des mots:
// met le focus sur le champ "mot" et indique qu'il s'agit d'un nouveau mot
function nouveau_mot() {
   if (themecour == -1) alert("aucun thème n'est sélectionné");
   // si la boîte de mot est vide : message et il ne se passe rien
   else if (document.donnees.mot.value == "")
      alert("Vous n'avez pas indiqué de mot.");
   else {
      // on vérifie d'abord si le mot n'existe pas déjà
	  // (cas où un mot a été sélectionné et qu'on appuye directement sur "Nouveau")
	  var mot = concatene_mot();
	  var i = 0;
	  while (i < nbmots) {
	     if (mot == document.donnees.liste_mots.options[i].value) break;
		 else i++;
      }
	  if (i < nbmots)
	     alert("Ce thème existe déjà. Vous devez écrire un nouveau thème avant de cliquer sur le bouton \"Nouveau\"");
      else ajout_mot(mot);
      deselecte_mot();
   }
}

// découpe le mot en mot, définition, contexte
function decoupe_mot(mot) {
   var elts_mot = new Array(3);
   elts_mot = mot.split("//");
   // s'il y a une définition et/ou un contexte
   if (elts_mot.length > 1) {
      var lemot = "";
      // on enlève le blanc éventuel au début de l'indice
      lemot = (elts_mot[1].charAt(0) == "") ? elts_mot[1].substring(1) : elts_mot[1];
      if (lemot.indexOf("***") != -1) {
         // s'il n'y a pas d'autre indice, on met la définition en blanc, puis le contexte
         if (mot.length == 2) elts_mot[1] = "";
         // sinon on écrit la définition (sans l'espace éventuel au début), puis le contexte
         else elts_mot[1] = ((elts_mot[2].charAt(0) == "") ? elts_mot[2].substring(1) : elts_mot[2]);
         elts_mot[2] = lemot;
      }
	  else {
         // sinon (le 1er indice n'est pas un contexte) on met ce 1er indice dans la col définition
         elts_mot[1] = lemot;
         if (elts_mot.length > 2) {
		     if (elts_mot[2].charAt(0) == "") elts_mot[2] = elts_mot[2].substring(1);
         }
		 else elts_mot[2] = "";
      }
   }
   else {
      elts_mot[1] = "";
	  elts_mot[2] = "";
   }
   return elts_mot;
}
     
// déclenché lorsqu'on clique sur "modifier" :
function modif_mot() {
   // si aucun mot n'est sélectionné, il ne se passe rien
   if (motcour == -1)
      alert("Vous n'avez pas sélectionné de mot.");
   else {
      // on concatène les 3 éléments du mot (mot, définition et contexte)
	  // qu'on va affecter à la "liste" et à l'option de boîte déroulante
      var mot = concatene_mot();
      // modifie le mot dans la boîte déroulante des mots
      mot_val_option(motcour, mot); 
      // modifie le mot courant dans la "liste" du thèmes
      liste.themes[themecour].modif_mot(motcour, mot);
      deselecte_mot();
   }
}

// déclenché lorsqu'on clique sur "Supprimer" :
// supprime le mot sélectionné
function supprime_mot() {
   // si aucun mot n'est sélectionné, il ne se passe rien
   if (motcour == -1)
      alert("Vous n'avez pas sélectionné de mot.");
   else {
      var i = motcour;
      // supprime le mot de la liste des mots du thème en cours
      liste.suppr_mot(themecour, i);
      i++;
      // décale tous les mots suivants vers le haut
      while (i < nbmots) {
         mot_val_option(i-1, document.donnees.liste_mots.options[i].value);
	     i++;
      }
      // efface le dernier mot
      mot_val_option(i-1, "");
      nbmots--;
      if (motcour == nbmots)
         document.donnees.liste_mots.options[motcour-1].selected = true;
      else
         document.donnees.liste_mots.options[motcour].selected = true;
      deselecte_mot();
   }
}

// vide la liste déroulante des mots
function vide_liste_mots() {
   var i = 1;
   if (arguments.length) mot_val_option(0, arguments[0]);
   else mot_val_option(0, "");
   while (i < document.donnees.liste_mots.length) mot_val_option(i++, "");
   nbmots = 0;
}

// remonte une option dans la liste des mots
function remonte_mot() {
   var nummot = document.donnees.liste_mots.selectedIndex;
   var autre_mot = nummot ? nummot - 1 : nbmots - 1;
   mot_val_option(autre_mot, liste.valeur_mot(themecour, nummot));
   mot_val_option(nummot, liste.valeur_mot(themecour, autre_mot));
   liste.themes[themecour].remonte_mot(nummot);
   document.donnees.liste_mots.options[autre_mot].selected = true;
}   
   
// descend une option dans la liste des mots
function descend_mot() {
   var nummot = document.donnees.liste_mots.selectedIndex;
   var autre_mot = (nummot == nbmots - 1) ? 0 : eval(nummot + 1);
   mot_val_option(autre_mot, liste.valeur_mot(themecour, nummot));
   mot_val_option(nummot, liste.valeur_mot(themecour, autre_mot));
   liste.themes[themecour].descend_mot(nummot);
   document.donnees.liste_mots.options[autre_mot].selected = true;
}   

// LECTURE DES INFOS RECUES PAR CETTE PAGE ET AFFECTATION AUX CHAMPS DU FORMULAIRE

// lit les infos à partir de la chaîne reçue par le formulaire
// (venant de la page de confirmation)
// pour remplir le formulaire des données précédemment écrites
function retour_confirmation() {
   if (navigator.appName == "Microsoft Internet Explorer") 
      chaine_infos = chaine_infos.chRemplTousPar("%20", " ");
   with (document.donnees) {
      var champs = chaine_infos.split("&");
      // l'alphabet utilisé (champs[3])
      if (champs[3] == "0") alphabet[0].checked = true;
	  else alphabet[1].checked = true;
      // les sous-répertoires (champs[4] et champs[5])
      rep_lettres.value = champs[4];
	  rep_images.value = champs[5];
      // les extrèmes
      extremes.checked = (champs[6] == "extremes");
      extremes_auto.checked = (champs[7] == "auto");
      // coût de l'aide
      cout_aide.value = champs[8];
      // page en XHTML ?
      XHTML.checked = (champs[0] == "XHTML");
      // fin du paramétrage
   }
   // les données
   var i = 9;
   var j = 0;
   var champmot = new Array();
   var mot = new Array();
   var lemot = "";
   // boucle pour chaque thème (un thème étant dans un élément de "champs")
   while (i<champs.length) {
      // le titre du thème et chaque mot du thème sont séparés par des "|'
	  champmot = champs[i].split("|");
	  // mise du nouveau thème dans la liste déroulante des thèmes et dans l'objet "liste"
      ajout_theme(champmot[0]);
	  // stockage de chaque mot
	  for (j=1;j<champmot.length;j++) {
	     // mot, définition, contexte sont séparés par des "//"
		 ajout_mot(champmot[j]);
      }
	  i++;
   }
   document.donnees.coder.checked = (champs[2] == "coder");
   document.donnees.comments.checked = (champs[1] == "comments")
}

// remplace dans la chaîne toutes les occurrences de "ancien" par "nouveau"
// les 2 chaînes peuvent avoir des longueurs différentes
// syntaxe : chaine1 = chaine2.chRemplTousPar(ancien, nouveau);
// exemple : chaine = chaine.chRemplTousPar("%20", " "); (remplace toutes les "%20" par des espaces)
function chRemplTousPar(ancien, nouveau) {
   var ch = "";
   var pos1 = 0;
   var pos2 = this.indexOf(ancien);
   while (pos2 != -1) {
      ch += this.substring(pos1, pos2) + nouveau;
	  pos1 = pos2 + ancien.length;
	  pos2 = this.indexOf(ancien, pos1);
   }
   return ch + this.substring(pos1, this.length);
}

String.prototype.chRemplTousPar = chRemplTousPar;

// lit les données à partir du fichier "pendu_donnees.js"
// pour remplir le formulaire
// (données précédemment sauvegardées dans ce fichier)
function lit_donnees() {
   with (document.donnees) {
      // l'alphabet utilisé (champs[3])
	  if (_alphabet == "ABCDEFGHIJKLMNOPQRSTUVWXYZ") alphabet[0].checked = true;
	  else alphabet[1].checked = true;
      // les sous-répertoires (champs[4] et champs[5])
      rep_lettres.value = _rep_lettres;
	  rep_images.value = _rep_images;
      // les extrèmes
      extremes.checked = _affiche_debut_fin;
      extremes_auto.checked = _auto_debut_fin;
      // coût de l'aide
      cout_aide.value = _cout_aide;
      // page en XHTML ?
      XHTML.checked = _XHTML;
      // codage des mots
	  coder.checked = _coder_mots;
   }
   donnees();
}

function theme(titre) {
   // il y a déjà des thèmes dans la liste : on crée une nouvelle option
   if (nbthemes) 
      document.donnees.liste_themes.options[nbthemes] = new Option(titre, titre, false, false);
   // c'est le 1er thème : il remplace le texte "nouveau thème"
   else theme_val_option(0, titre);
   // ajoute un élément à la "liste" des thèmes
   liste.nouveau_theme(titre);
   themecour = nbthemes;
   nbthemes++;
}

function mot(valeur) {
   // il y a déjà des mots dans la liste : on crée une nouvelle option
   if (nbmots) 
      document.donnees.liste_mot.options[nbmots] = new Option(mot, mot, false, false);
   // c'est le 1er thème : il remplace le texte "nouveau thème"
   else mot_val_option(0, mot);
   // ajoute un élément à la "liste" des thèmes
   liste.nouveau_mot(mot);
   motcour = nbmots;
   nbmots++;
}

function pendu() {
}
