// ****************************************************************************** -->
// Fichier : lps/cahier_de_texte.js (XHTML CSS JS AJAX PHP5 XML)                  -->
// Réalisé par P. ARNOULD / Créé le 08/08/2007 / Modifié le 28/08/2011            -->
// ****************************************************************************** -->
// Scripts du formulaire "cahier_de_texte.php"
// qui utilise également "scripts_js_communs.js".
// ****************************************************************************** -->
// AMELIORATIONS A APPORTER :
//
// - A chaque fois qu'il y a transmission d'une chaîne (texte du cdt, note du bulletin), il faut la
//   coder pour éviter les problèmes avec les caractères spéciaux (& " ' ...).
// - Demander l'heure au serveur (via un script PHP), pour ne pas être tributaire de l'heure du
//   client (javascript).
// - Utiliser le format XML pour la réponse d'XHR, quand c'est pertinent (au lieu des ####, car si un 
//   utilisateur emploie cette chaîne, cela va mettre en défaut l'aplication...
// - Utiliser : Prototype version 1.5.1 (bibliothèque de prototypage Javascript).
// - Vérifier la "déclaration" des variables et des tableaux...
// - Faire des requêtes de vérification de cohérence et strutures des tables SQL.
// - Que se passe-t-il quand la réponse du XMLHttpRequest est très longue ??? Ca plante ?
//   Il faut peut être prévoir des affichages page par page (avec des LIMIT dans les SELECT).
// - Faire une fonction pour l'appel XMLHttpRequest pour éviter les répétitions...
// - Ajouter des  "try...catch" si nécessaire pour parer aux éventuels plantages.
// - Inclure les "SESSION" PHP et MYSQL...
// - htmlEntities ??? Incidence, relation avec la fonction encodage_caracteres() ???
// - Peut-on éviter de transmettre le mot de passe dans l'appel à une fonction php ?
// - Renommer tous les champs des tables et toutes les variables "xxx" en "num_xxx", lorsqu'il
//   s'agit de num.
// - Activer le "Safe Mode" dans la config PHP de Wamp ? D'après fr.php.net, 
//   ça n'est pas une bonne solution, le Safe Mode sera supprimé dans le PHP 6.
// - Faut-il laisser "$zone = 3; $page = 18;" weborama ???
// - Les erreurs ne s'affichent pas toujours (on ne peut alors les voir que dans firebug).
// ****************************************************************************** -->
// VARIALES GLOBALES :
// Attention, d'autres variables globales sont déclarées dans le script "scripts_js_communs.js"
// Ces variables sont déclarées en dehors des fonctions et ne sont pas
// déclarées avec "var", elle sont donc globales
// et peuvent être utilisées dans toutes les fonctions de ce script.
//
archives_cdtxt    = false; // Flag pour savoir si on est dans les archives du cahier de texte :
                           // Si c'est le cas, le contenu des listes de sélection division,
                           // matières, groupes et profs doivent correspondre aux archives.
                           // Sinon elles doivent correspondre (sans la liste profs) à
                           // l'année en cours.
archives_annee_scolaire = "0"; // Année scolaire précédemment sélectionné. Permet de voir
                              // si l'utilisateur vient de changer l'année scolaire des archives.
// Listes de sélection Divisions/Matières/Groupes:
// Pour permettre la compatibilité avec MSIE, les balises <select> des listes déroulantes, ont été
// encadrée de balises <div> et c'est tout le contenu de ces <div> qui est chargé à chaque fois.
// En effet MSIE ne reconnait pas correctement les id des <select> lorsqu'on utilise l'instruction
// $("division").innerHTML pour mettre à jour les <option> dans le <select>.
// L'astuce consiste alors à recharger tout le bloc <select>...
// Pour ne pas avoir à le recopier n fois dans le code, on place les <select> dans des variables globales.
// Les fonctions placées dans l'évènement "onchange" n'ont pas de paramètres, ceci pour permettre
// également la compatibilité avec MSIE (voir explications dans les fonctions concernées).
// Sélections des DIVISIONS :
select_divisions = "<select name=\"division\" id=\"division\" size=\"1\" title=\"Veuillez sélectionner la classe\" tabindex=\"10\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_division()\">";
// Sélections des MATIERES :
select_matieres = "<select name=\"matiere\" id=\"matiere\" size=\"1\" title=\"Sélectionnez une matière\" tabindex=\"11\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_matiere()\">";
// Sélections des GROUPES :
select_groupes = "<select name=\"groupe\" id=\"groupe\" size=\"1\" title=\"Sélectionnez un groupe\" tabindex=\"12\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_groupe()\">";
// Sélections des PROFS :
select_profs = "<select name=\"prof\" id=\"prof\" size=\"1\" title=\"Sélectionnez un prof\" tabindex=\"13\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_prof()\">";
// Sélections des ANNEES SCOLAIRES :
select_annees_scolaires = "<select name=\"annee_scolaire\" id=\"annee_scolaire\" size=\"1\" title=\"Sélectionnez une année scolaire\" tabindex=\"14\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_annee_scolaire()\">";
// Sélections des ELEVES (accès pour les parents) :
select_eleves = "<select name=\"eleve\" id=\"eleve\" size=\"1\" title=\"Veuillez sélectionner l'élève\" tabindex=\"10\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_eleve()\">";
// Sélections des DIVISONS dans le CARNET DE BORD (accès pour les profs) :
select_divisions_ap_profs = "<select name=\"division_ap_profs\" id=\"division_ap_profs\" size=\"1\" title=\"Veuillez sélectionner la division\" tabindex=\"1\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_division_ap_profs()\">";
// Sélections des ELEVES dans le CARNET DE BORD (accès pour les profs) :
select_eleves_ap_profs = "<select name=\"eleve_ap_profs\" id=\"eleve_ap_profs\" size=\"1\" title=\"Veuillez sélectionner l'élève\" tabindex=\"2\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" onchange=\"javascript: selection_eleve_ap_profs()\">";
// ****************************************************************************** -->
// Fonction pour valider ou non le SUBMIT du formulaire.
// ****************************************************************************** -->
function valider_submit() {
  var identifiant=$('identifiant').value;
  if (identifiant == "admin") {
    //if (confirm('Vous allez passer sur la console pour administrer la base de données. Ok ?')) {
      return true;
    //} else {
    //  return false;
    //}
  } else {
    return false;
  }
} 
// ****************************************************************************** -->
// Sélection d'un onglet :
// ****************************************************************************** -->
function selection_onglet(onglet_selectionne) {
  // ONGLET 1 : IDENTIFICATION
  var onglet1 = $("onglet1");
  var lien_onglet1 = $("onglet1").firstChild;
  // ONGLET 2 : BULLETIN D'APPEL
  var onglet2 = $("onglet2");
  var lien_onglet2 = $("onglet2").firstChild;
  // ONGLET 3 : CAHIER DE TEXTE
  var onglet3 = $("onglet3");
  var lien_onglet3 = $("onglet3").firstChild;
  // ONGLET 4 : AP (Accompagnement personnalisé)
  var onglet4 = $("onglet4");
  var lien_onglet4 = $("onglet4").firstChild;
  // ONGLET 5 : MOT DE PASSE
  var onglet5 = $("onglet5");
  var lien_onglet5 = $("onglet5").firstChild;
  // ONGLET 6 : ADMINISTRATION
  var onglet6 = $("onglet6");
  var lien_onglet6 = $("onglet6").firstChild;
  // **************************************************************************** -->
  // Les variables globales "identifiant_eleve", ... sont déclarées dans "scripts_js_communs.js". 
  if ((identifiant_eleve || identifiant_prof || identifiant_parent || identifiant_admin) && mdp_valide == true) {
    // La personne s'est identifiée, elle a donc accès aux onglets :
    if (onglet_selectionne == 'onglet1') {
      // ************************************************************************ -->
      // ONGLET 1 : IDENTIFICATION
      onglet_encours = 1;
      // Gestion de l'affichage des onglets :
      $("onglet1").style.backgroundColor ="#EEEFDF";  // Onglet sélectionné     : fond en jaune
      $("onglet1").firstChild.style.color="black";    // Onglet sélectionné     : écriture noire
      $("onglet2").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet2").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet3").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet3").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet4").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet4").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet5").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet5").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet6").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet6").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      // On met à jour l'affichage des fieldset :
      $("identification").style.display  = "block";   // On affiche la partie "Identification"
      $("divmatgrp").style.display       = "none";    // On masque la partie  "Classe/Matière/Groupe"
      $("bulletin_appel").style.display  = "none";    // On masque la partie  "Bulletin d'appel"
      $("div_bouton_appel").style.display= "none";    // On masque le bouton  "Bulletin d'appel"
      $("div_bouton_bulletins").style.display="none"; // On masque le bouton  "Bulletin d'appel"
      $("div_cpe_date_bulletins_appel").style.display="none"; // On masque la date bulletins (CPE)
      $("cdtxt").style.display           = "none";    // On masque la partie  "Cahier de texte"
      $("div_bouton_cdtxt").style.display= "none";    // On masque les boutons  "Cahier de texte"
      $("ap").style.display              = "none";    // On masque la partie  "AP"
      $("div_ap").style.display          = "none";    // On masque la partie  "AP"
      $("div_bouton_actualiser_ap").style.display = "none";
      $("div_actualisation_ap").style.display     = "none";
      $("div_selection_ap_profs").style.display     = "none";
      $("motdepasse").style.display      = "none";    // On masque la partie  "Mot de passe"
      $("administration").style.display  = "none";    // On masque la partie "Administration"
      $("div_liste_annees_scolaires").style.display   = "none"; // Pour les archives cdtxt
      $("label_liste_annees_scolaires").style.display = "none";
      $("div_liste_profs").style.display  = "none";   // On masque la liste déroulante "profs"
      $("label_liste_profs").style.display= "none";   // et le label correspondant.
      // Si on était précédemment dans les archives des cahier de texte , on revient à l'affichage normal :
      if (archives_cdtxt == true) {
        archives_cdtxt = false;
        reinitialiser();
      }
      // ************************************************************************ -->
    } else if (onglet_selectionne == 'onglet2') {
      // ************************************************************************ -->
      // ONGLET 2 : ABSENCES
      onglet_encours = 2;
      // Gestion de l'affichage des onglets :
      $("onglet1").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet1").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet2").style.backgroundColor ="#EEEFDF";  // Onglet sélectionné     : fond en jaune
      $("onglet2").firstChild.style.color="black";    // Onglet sélectionné     : écriture noire
      $("onglet3").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet3").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet4").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet4").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet5").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet5").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet6").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet6").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      // On met à jour l'affichage des fieldset :
      $("identification").style.display  = "none";    // On masque la partie  "Identification"
      $("divmatgrp").style.display       = "block";   // On affiche la partie "Classe/Matière/Groupe"
      if (identifiant_eleve || identifiant_parent || archives_cdtxt) {
        $("img_trombinoscope").style.display= "none"; //
      } else {
        $("img_trombinoscope").style.display= "inline";  //
      }
      $("bulletin_appel").style.display  = "block";   // On affiche la partie "Bulletin d'appel"
      if (identifiant_eleve || identifiant_parent) {
        $("div_bouton_appel").style.display= "none";  // On masque le bouton "Bulletin d'appel"
      } else {
        $("div_bouton_appel").style.display= "block"; // On affiche le bouton "Bulletin d'appel"
      }
      $("div_bouton_bulletins").style.display="block";// On affiche le bouton  "Bulletin d'appel"
      if ($("identifiant").value == "cpe") {
        $("div_cpe_date_bulletins_appel").style.display="block"; // On affiche la date bulletins (CPE)
        var datedujour = new Date();
        var date  = datedujour.getDate();
        if (date<10) date = "0" + date;
        var mois  = datedujour.getMonth() + 1;
        if (mois<10) mois = "0" + mois;
        var annee = datedujour.getFullYear();
        var date_courante = date + "-" + mois + "-" + annee ;
        $("date_cpe_bulletins_appel").value = date_courante;
      } else {
        $("div_cpe_date_bulletins_appel").style.display="none"; // On masque la date bulletins (CPE)
      }
      $("cdtxt").style.display           = "none";    // On masque la partie  "Cahier de texte"
      $("div_bouton_cdtxt").style.display= "none";    // On masque les boutons  "Cahier de texte"
      $("ap").style.display              = "none";    // On masque la partie  "AP"
      $("div_ap").style.display          = "none";    // On masque la partie  "AP"
      $("div_bouton_actualiser_ap").style.display = "none";
      $("div_actualisation_ap").style.display     = "none";
      $("div_selection_ap_profs").style.display     = "none";
      $("motdepasse").style.display      = "none";    // On masque la partie  "Mot de passe"
      $("administration").style.display  = "none";    // On masque la partie "Administration"
      $("div_liste_annees_scolaires").style.display   = "none"; // Pour les archives cdtxt
      $("label_liste_annees_scolaires").style.display = "none";
      $("div_liste_profs").style.display  = "none";   // On masque la liste déroulante "profs"
      $("label_liste_profs").style.display= "none";   // et le label correspondant.
      // Si on était précédemment dans les archives des cahier de texte , on revient à l'affichage normal :
      if (archives_cdtxt == true) {
        archives_cdtxt = false;
        reinitialiser();
      }
      // ************************************************************************ -->
    } else if (onglet_selectionne == 'onglet3') {
      // ************************************************************************ -->
      // ONGLET 3 : CAHIER DE TEXTE
      onglet_encours = 3;
      // Gestion de l'affichage des onglets :
      $("onglet1").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet1").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet2").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet2").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet3").style.backgroundColor ="#EEEFDF";  // Onglet sélectionné     : fond en jaune
      $("onglet3").firstChild.style.color="black";    // Onglet sélectionné     : écriture noire
      $("onglet4").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet4").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet5").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet5").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet6").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet6").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      // On met à jour l'affichage des fieldset :
      $("identification").style.display  = "none";    // On masque la partie  "Identification"
      $("divmatgrp").style.display       = "block";   // On affiche la partie "Classe/Matière/Groupe"
      if (identifiant_eleve || identifiant_parent) {
        $("img_trombinoscope").style.display= "none"; // On masque le bouton-icone "Trombinoscope"
        $("bouton_cdtxt_archives").style.display = "none";
      } else {
        $("img_trombinoscope").style.display= "inline";// On affiche le bouton-icone "Trombinoscope"
      }
      $("bulletin_appel").style.display  = "none";    // On masque la partie  "Bulletin d'appel"
      $("div_bouton_appel").style.display= "none";    // On masque le bouton  "Bulletin d'appel"
      $("div_bouton_bulletins").style.display="none"; // On masque le bouton  "Bulletin d'appel"
      $("div_cpe_date_bulletins_appel").style.display="none"; // On masque la date bulletins (CPE)
      $("cdtxt").style.display           = "block";   // On affiche la partie "Cahier de texte"
      $("div_bouton_cdtxt").style.display= "block";   // On affiche les boutons "Cahier de texte"
      $("ap").style.display              = "none";    // On masque la partie  "AP"
      $("div_ap").style.display          = "none";    // On masque la partie  "AP"
      $("div_bouton_actualiser_ap").style.display = "none";
      $("div_actualisation_ap").style.display     = "none";
      $("div_selection_ap_profs").style.display     = "none";
      $("motdepasse").style.display      = "none";    // On masque la partie  "Mot de passe"
      $("administration").style.display  = "none";    // On masque la partie "Administration"
      $("div_liste_annees_scolaires").style.display   = "none"; // Pour les archives cdtxt
      $("label_liste_annees_scolaires").style.display = "none";
      $("div_liste_profs").style.display  = "none";   // On masque la liste déroulante "profs"
      $("label_liste_profs").style.display= "none";   // et le label correspondant.
      if (archives_cdtxt == true) {
        archives_cdtxt = false;
        reinitialiser();
      }
      // ************************************************************************ -->
    } else if (onglet_selectionne == 'onglet4') {
      // ************************************************************************ -->
      // ONGLET 4 : AP (Accompagnement personnalisé)
      onglet_encours = 4;
      // Gestion de l'affichage des onglets :
      $("onglet1").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet1").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet2").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet2").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet3").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet3").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet4").style.backgroundColor ="#EEEFDF";  // Onglet sélectionné     : fond en jaune
      $("onglet4").firstChild.style.color="black";    // Onglet sélectionné     : écriture noire
      $("onglet5").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet5").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet6").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet6").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      // On met à jour l'affichage des fieldset :
      $("identification").style.display  = "none";    // On masque la partie  "Identification"
      $("divmatgrp").style.display       = "none";    // On masque la partie  "Classe/Matière/Groupe"
      $("bulletin_appel").style.display  = "none"     // On masque la partie  "Bulletin d'appel"
      $("div_bouton_appel").style.display= "none";    // On masque le bouton  "Bulletin d'appel"
      $("div_bouton_bulletins").style.display="none"; // On masque le bouton  "Bulletin d'appel"
      $("div_cpe_date_bulletins_appel").style.display="none"; // On masque la date bulletins (CPE)
      $("cdtxt").style.display           = "none";    // On masque la partie  "Cahier de texte"
      $("div_bouton_cdtxt").style.display= "none";    // On masque les boutons  "Cahier de texte"
      $("ap").style.display              = "block";   // On affiche la partie  "AP"
      $("div_ap").style.display          = "block";   // On masque la partie  "AP"
      if (identifiant_eleve) {
        // Les élèves peuvent remplir le carnet de bord.
        $("div_actualisation_ap").style.display     = "none";
        $("div_bouton_actualiser_ap").style.display= "block";
      } else {
        // Les autres utilisateurs, non.
        $("div_actualisation_ap").style.display     = "none";
        $("div_bouton_actualiser_ap").style.display= "none";
      }
      if (identifiant_prof) {
        // Les profs peuvent sélectionner leurs élèves.
        $("div_selection_ap_profs").style.display = "block";
      } else {
        // Les autres utilisateurs, non.
        $("div_selection_ap_profs").style.display = "none";
      }
      $("motdepasse").style.display      = "none";    // On masque la partie "Mot de passe"
      $("administration").style.display  = "none";    // On masque la partie "Administration"
      $("div_liste_annees_scolaires").style.display   = "none"; // Pour les archives cdtxt
      $("label_liste_annees_scolaires").style.display = "none";
      $("div_liste_profs").style.display  = "none";   // On masque la liste déroulante "profs"
      $("label_liste_profs").style.display= "none";   // et le label correspondant.
      if (archives_cdtxt == true) {
        archives_cdtxt = false;
        reinitialiser();
      }
      // On affiche le carnet de bord :
      if (identifiant_eleve || identifiant_parent) {
        recuperer_ap();
      } else if (identifiant_prof) {
        recuperer_divisions_eleves();
      }
      // ************************************************************************ -->
    } else if (onglet_selectionne == 'onglet5') {
      // ************************************************************************ -->
      // ONGLET 5 : MOT DE PASSE
      onglet_encours = 5;
      // Gestion de l'affichage des onglets :
      $("onglet1").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet1").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet2").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet2").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet3").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet3").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet4").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet4").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet5").style.backgroundColor ="#EEEFDF";  // Onglet sélectionné     : fond en jaune
      $("onglet5").firstChild.style.color="black";    // Onglet sélectionné     : écriture noire
      $("onglet6").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet6").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      // On met à jour l'affichage des fieldset :
      $("identification").style.display  = "none";    // On masque la partie  "Identification"
      $("divmatgrp").style.display       = "none";    // On masque la partie  "Classe/Matière/Groupe"
      $("bulletin_appel").style.display  = "none"     // On masque la partie  "Bulletin d'appel"
      $("div_bouton_appel").style.display= "none";    // On masque le bouton  "Bulletin d'appel"
      $("div_bouton_bulletins").style.display="none"; // On masque le bouton  "Bulletin d'appel"
      $("div_cpe_date_bulletins_appel").style.display="none"; // On masque la date bulletins (CPE)
      $("cdtxt").style.display           = "none";    // On masque la partie  "Cahier de texte"
      $("div_bouton_cdtxt").style.display= "none";    // On masque les boutons  "Cahier de texte"
      $("ap").style.display              = "none";    // On masque la partie  "AP"
      $("div_ap").style.display          = "none";    // On masque la partie  "AP"
      $("div_bouton_actualiser_ap").style.display = "none";
      $("div_actualisation_ap").style.display     = "none";
      $("div_selection_ap_profs").style.display     = "none";
      $("motdepasse").style.display      = "block";   // On affiche la partie "Mot de passe"
      $("administration").style.display  = "none";    // On masque la partie "Administration"
      $("div_liste_annees_scolaires").style.display   = "none"; // Pour les archives cdtxt
      $("label_liste_annees_scolaires").style.display = "none";
      $("div_liste_profs").style.display  = "none";   // On masque la liste déroulante "profs"
      $("label_liste_profs").style.display= "none";   // et le label correspondant.
      if (archives_cdtxt == true) {
        archives_cdtxt = false;
        reinitialiser();
      }
      // ************************************************************************ -->
    } else if (onglet_selectionne == 'onglet6' && $("identifiant").value == "admin") {
      // ************************************************************************ -->
      // ONGLET 6 : ADMINISTRATION
      onglet_encours = 6;
      // Gestion de l'affichage des onglets :
      $("onglet1").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet1").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet2").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet2").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet3").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet3").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet4").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet4").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet5").style.backgroundColor ="#999999";  // Onglet pas sélectionné : fond jaune sombre
      $("onglet5").firstChild.style.color="white";    // Onglet pas sélectionné : écriture grise
      $("onglet6").style.backgroundColor ="#EEEFDF";  // Onglet sélectionné     : fond en jaune
      $("onglet6").firstChild.style.color="black";    // Onglet sélectionné     : écriture noire
      // On met à jour l'affichage des fieldset :
      $("identification").style.display  = "none";    // On masque la partie  "Identification"
      $("divmatgrp").style.display       = "none";    // On masque la partie  "Classe/Matière/Groupe"
      $("bulletin_appel").style.display  = "none"     // On masque la partie  "Bulletin d'appel"
      $("div_bouton_appel").style.display= "none";    // On masque le bouton  "Bulletin d'appel"
      $("div_bouton_bulletins").style.display="none"; // On masque le bouton  "Bulletin d'appel"
      $("div_cpe_date_bulletins_appel").style.display="none"; // On masque la date bulletins (CPE)
      $("cdtxt").style.display           = "none";    // On masque la partie  "Cahier de texte"
      $("div_bouton_cdtxt").style.display= "none";    // On masque les boutons  "Cahier de texte"
      $("ap").style.display              = "none";    // On masque la partie  "AP"
      $("div_ap").style.display          = "none";    // On masque la partie  "AP"
      $("div_bouton_actualiser_ap").style.display = "none";
      $("div_actualisation_ap").style.display     = "none";
      $("div_selection_ap_profs").style.display     = "none";
      $("motdepasse").style.display      = "none";    // On affiche la partie "Mot de passe"
      $("administration").style.display  = "block";   // On affiche la partie "Administration"
      $("div_liste_annees_scolaires").style.display   = "none"; // Pour les archives cdtxt
      $("label_liste_annees_scolaires").style.display = "none";
      $("div_liste_profs").style.display  = "none";   // On masque la liste déroulante "profs"
      $("label_liste_profs").style.display= "none";   // et le label correspondant.
      if (archives_cdtxt == true) {
        archives_cdtxt = false;
        reinitialiser();
      }
      // ************************************************************************ -->
    } else {
      alert("ERREUR ! Script 'cahier_de_texte.js'. Mauvais paramètre '" + onglet_selectionne + "' pour la fonction selection().\n Contacter l'administrateur.");
    }
  } else {
    // La personne ne s'est pas identifiée correctement,
    // il ne faut donc pas permettre l'accès aux autres onglets.
    alert("Vous devez d'abord vous identifier.");
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// Fermeture de la session
function fermer_session() {
  // Variables globales :
  identifiant_eleve  = false;
  identifiant_prof   = false;
  identifiant_parent = false;
  identifiant_admin  = false;
  mdp_valide         = false;
  // Titre page :
  $("titre_secondaire").innerHTML = "Bulletins d'appel - Cahier de texte";
  // ONGLET 1 : IDENTIFICATION
  $("identifiant").value = "";
  $("mdp").value = "";
  $("p_message_zone_identification").innerHTML = "Pour éviter qu'un utilisateur malveillant ne puisse accéder à votre compte, n'oubliez pas de fermer le navigateur une fois que vous aurez fini de l'utiliser.";
  $("legende_identification").innerHTML = "Indentifiez vous :";
  $("div_eleves").style.display = "none";
  // Zone commune DIVISION/MATIERES/GROUPES
  $("p_message_erreur_zone_divmatgrp").innerHTML = "";
  // ONGLET 2 : ABSENCES
  $("p_affichage_bulletin_appel").innerHTML = "";
  $("div_bulletin_appel").style.display = "none";
  $("div_bouton_appel").style.display="none";
  $("div_bouton_bulletins").style.display="none";
  $("div_cpe_date_bulletins_appel").style.display="none";
  // ONGLET 3 : CAHIER DE TEXTE
  $("p_affichage_cahier_de_texte").innerHTML = "";
  $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
  $("div_actualisation_cahier_de_texte").style.display = "none";
  // ONGLET 4 : AP
  $("div_ap").style.display = "none";
  $("div_ap").innerHTML = "";
  $("p_message_ap").innerHTML = "";
  $("div_bouton_actualiser_ap").style.display = "none";
  $("div_actualisation_ap").style.display     = "none";
  // ONGLET 5 : MOT DE PASSE
  $("identifiant_mdp").style.display = "block";
  $("p_fermeture_session").style.display = "none";
  $("mdp_actuel").value = "";
  $("mdp_nouveau_1").value = "";
  $("mdp_nouveau_2").value = "";
  $("p_message_mdp").innerHTML = "";
  // ONGLET 6 : ADMINISTRATION
  $("onglet6").style.display ="none";  // Onglet masqué
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// Réinitialiser la sélection DIVISIONS / MATIERES / GROUPES :
function reinitialiser() {
  if (archives_cdtxt == true) {
    // On affiche les sélections pour les archives :
    archives_annee_scolaire = "0";
    archives_cahiers_de_texte()
  } else {
    // **************************************************************************
    // On affiche les sélections pour les bulletins et cahiers de texte en cours :
    recuperer_nom_prenom_divisions_matieres_groupes();
    // **************************************************************************
    // On réinitialise les affichage des différentes zones :
    // ******************************
    // ********* Zone de sélection
    // Bouton "trombinoscope"."
    if (identifiant_eleve || identifiant_parent) {
      // Les élèves et les parents ne voient pas le trombinoscope
      $("img_trombinoscope").style.display= "none"; //
    } else {
    // Les profs, le CPE et l'admin, oui.
      $("img_trombinoscope").style.display = "inline";
    }
    // ******************************
    // ********* Bulletin d'appel
    $("div_bulletin_appel").style.display = "none";
    $("p_liste_eleves").innerHTML = "";
    $("p_affichage_bulletin_appel").innerHTML = "";
    $("liste_num_table_absences_retards").value = "";
    if (identifiant_eleve || identifiant_parent) {
      // Les élèves et les parents ne peuvent pas faire l'appel
      $("div_bouton_appel").style.display = "none";
    } else {
    // Les profs, le CPE et l'admin, oui.
      if (onglet_encours == 2) {
        // Si on est actuellement dans l'onglet "Bulletin d'appel"
        // on affiche les boutons 
        $("div_bouton_appel").style.display = "block";
      }
    }
    // Tout le monde peut voir les bulletins :
    if (onglet_encours == 2) {
      // Si on est actuellement dans l'onglet "Bulletin d'appel"
      // on affiche les boutons 
      $("div_bouton_bulletins").style.display = "block";
    }
    // ******************************
    // ********* Cahiers de texte
    // On remontre le bouton "bouton_cdtxt_complet" qui avait été caché.
    $("bouton_cdtxt_complet").style.display = "inline";
    // On cache le bouton "Remplir le CdTXT".
    $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
    $("div_actualisation_cahier_de_texte").style.display = "none";
    $("p_message_actualisation_cahier_de_texte").innerHTML = "";
    $("p_affichage_cahier_de_texte").innerHTML = "";
    // ******************************
    // ********* Archives Cahiers de texte
    // On cache le bouton qui permet de quitter les archives :
    $("bouton_cdtxt_quitter_archives").style.display = "none";
    if (identifiant_eleve || identifiant_parent) {
      // Les élèves et les parents ne peuvent pas accéder aux archives
      $("bouton_cdtxt_archives").style.display = "none";
    } else {
    // Les profs, le CPE et l'admin, oui.
    // On remontre le bouton permettant d'accéder aux archives (puisqu'on n'y est plus).
      $("bouton_cdtxt_archives").style.display = "inline";
    }
    // On cache les listes déroulantes "annees" et "profs" ainsi que les labels correspondants.
    $("div_liste_annees_scolaires").style.display   = "none";
    $("label_liste_annees_scolaires").style.display = "none";
    $("div_liste_profs").style.display              = "none";
    $("label_liste_profs").style.display            = "none";
  }
  // AP :
  //$("div_ap").style.display = "none";
  //$("p_message_ap").innerHTML = "";
  //$("div_bouton_actualiser_ap").style.display = "none";
  //$("div_actualisation_ap").style.display     = "none";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// Fonction appelée par le bouton "S'identifier" du formulaire, qu'il s'agisse
// d'un ELEVE, d'un PARENT ou d'un PROF. C'est le premier script exécuté.
function recuperer_nom_prenom_divisions_matieres_groupes() {
  // Zone Division/Matière/Groupe
  $("p_message_selections").innerHTML = "<i>Vous pouvez sélectionner la classe, la matière et le groupe dans l'ordre de votre choix pour définir l'entrée voulue du cahier de texte ou du bulletin d'appel :</i>";
  if ($("identifiant").value.length > 0 && $("mdp").value.length > 0 ) {
    // ************************************************************************** -->
    // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
    var identifiant = $("identifiant").value;
    var mdp = hex_md5($("mdp").value);
    // On détecte le type d'identifiant et on change le titre secondaire en fonction.
    // Cela aura bien sûr aussi une incidence sur la suite du fonctionnement de ce script...
    var expressionReguliere_eleve  = new RegExp("^[0-9]+$","g"); // Suite de chiffres...
    var expressionReguliere_parent = new RegExp("^[P]{1}[0-9]+$","g"); // Lettre P majuscule puis chiffres...
    if (expressionReguliere_eleve.test(identifiant) == true) {
      // ************************************************************************ -->
      // ELEVE :
      // L'identifiant est une suite de chiffres, il s'agit de l'elenoet d'un élève.
      $("titre_secondaire").innerHTML = "Bulletins d'appel - Cahier de texte - Accès élève";
      identifiant_eleve  = true;  // Ces variables sont globales
      identifiant_prof   = false; // déclarées dans "scripts_js_communs.js".
      identifiant_parent = false; //
      // Fichier php qui va élaborer la réponse (requête sur la base de données) :
      var fichier_php_a_appeler = "cdtxt_division_matieres_groupes.php";
      // Paramètres à passer à ce fichier php :
      var parametres = "elenoet=";
      // ************************************************************************ -->
    } else if (expressionReguliere_parent.test(identifiant) == true) {
      // ************************************************************************ -->
      // PARENT :
      // L'identifiant est une suite de 6 minuscules puis de chiffres, il s'agit d'un parent.
      $("titre_secondaire").innerHTML = "Bulletins d'appel - Cahier de texte - Accès Parent";
      identifiant_eleve  = false; // Ces variables sont globales
      identifiant_prof   = false; // déclarées dans "scripts_js_communs.js".
      identifiant_parent = true;  //
      // ************************************************************************ -->
      // Pour actualiser les listes division/matières/groupes pour un parent
      // on va envoyer l'identifiant du parent comme paramètre au script.
      // Ce script renverra alors la liste des élèves et les division/matieres/groupe
      // du premier élève de la liste.
      // Ultérieurement l'utilisateur pourra sélectionner un autre élève (donc un 
      // elenoet) dans la liste déroulante de l'onglet "Session".
      // Les scripts utiliseront cet elenoet pour mettre à jour les listes 
      // division/matieres/groupe. Voir : recuperer_eleve_division_matieres_groupes().
      // ************************************************************************ -->
      // Fichier php qui va élaborer la réponse (requête sur la base de données) :
      var fichier_php_a_appeler = "cdtxt_division_matieres_groupes.php";
      // Paramètres à passer à ce fichier php :
      var parametres = "identifiant=";
      // ************************************************************************ -->
    } else {
      // ************************************************************************ -->
      // PROF, CPE ou ADMIN :
      // L'identifiant n'est pas une suite de nombre, il s'agit de l'identifiant d'un prof.
      // CPE et ADMIN sont assimilés à des PROFS pour l'exécution des requêtes.
      $("titre_secondaire").innerHTML = "Bulletins d'appel - Cahier de texte - Accès prof";
      identifiant_prof   = true;  // Ces variables sont globales
      identifiant_eleve  = false; // déclarées dans "scripts_js_communs.js".
      identifiant_parent = false; //
      // Fichier php qui va élaborer la réponse (requête sur la base de données) :
      var fichier_php_a_appeler = "cdtxt_divisions_matieres_groupes.php";
      // Paramètres à passer à ce fichier php :
      var parametres = "identifiant=";
      // Affichage texte pour les profs, CPE et admin (cahier de texte) :
      //$("p_affichage_cahier_de_texte").innerHTML = "NB : une fois que vous aurez rempli le cahier de texte, vous ne pourrez modifier ce que vous venez de taper que le jour même. Dès le lendemain, la saisie sera verrouillée. Pour modifier le texte, cliquez sur l'icone : <img src=\"images/modifier.gif\" alt=\"Icone\" />.";
      $("p_affichage_cahier_de_texte").innerHTML = "NB : une fois que vous aurez rempli le cahier de texte, vous pourrez le modifier tout au long de l'année. Pour modifier le texte, cliquez sur l'icone : <img src=\"images/modifier.gif\" alt=\"Icone\" />.";
      // ************************************************************************ -->
      if ($("identifiant").value == "cpe" ) {
        // ********************************************************************** -->
        // CPE :
        // Affichage texte pour CPE (bulletins d'appels et mot de passe) :
        $("p_affichage_bulletin_appel").innerHTML = "En tant que CPE, vous avez accès à l'intégralité des bulletins d'appels. Trois possibilités pour cela : <br /> <b>- Obtenir l'intégralité des bulletins</b> : ne sélectionnez aucune classe, aucune matière et aucun groupe, effacez la date puis cliquez sur le bouton 'Voir tous les bulletins d'appel'.<br /> <b>- Obtenir tous les bulletins d'un jour</b> : ne sélectionnez aucune classe, aucune matière et aucun groupe, spécifiez la date puis cliquez sur le bouton 'Voir tous les bulletins d'appel'.<br /> <b>- Obtenir tous les bulletins d'une classe</b> : sélectionnez une classe, ne sélectionnez aucune matière et aucun groupe, spécifiez éventuellement la date puis cliquez sur le bouton 'Voir tous les bulletins d'appel'.<br /><br />Les professeurs ne peuvent modifier le bulletin que dans les 6 heures qui suivent la saisie. Vous, en tant que CPE, vous pouvez les modifier tout au long de la journée.";
        $("p_message_mdp").innerHTML = "Utilisez un mot de passe suffisamment sûr pour éviter qu'un élève ou une personne non autorisée n'ait accès à cette base de données et ne puisse la modifier ou l'endommager, d'autant plus que ce compte permet davantage d'opérations qu'un compte prof ! Mélangez majuscules, minuscules, chiffres, caractères - _ @ ... Merci.";
        // ********************************************************************** -->
      } else if ($("identifiant").value == "admin" ) {
        // ********************************************************************** -->
        // ADMIN :
        // ********************************************************************** -->
        identifiant_prof = true;   // 
        identifiant_admin = true;  // 
        $("onglet6").style.display ="block";  // Onglet affiché
      } else {
        // ********************************************************************** -->
        // PROF :
        // Affichage texte pour profs (bulletins d'appels et mot de passe) :
        $("p_affichage_bulletin_appel").innerHTML = "NB : une fois que vous aurez rempli un bulletin d'appel, vous ne pourrez le modifier que dans les 6 heures qui suivent. Ensuite, la saisie sera verrouillée et ne pourra être modifiée que par le CPE. Pour modifier un bulletin, utilisez l'icone : <img src=\"images/modifier.gif\" alt=\"Icone\" />.";
        // ********************************************************************** -->
      }
    }
    // ************************************************************************** -->
    // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
    // Paramètres à passer à ce fichier php :
    // "elenoet=...&mdp=..." ou "identifiant=...&mdp=..."
    parametres += identifiant + "&mdp=" + mdp;
    // Zone d'affichage :
    var zone_affichage_message = "p_message_zone_identification";
    //
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "recuperer_nom_prenom_divisions_matieres_groupes2(\"" + zone_affichage_message + "\",\"" + identifiant + "\")";
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
  } else {
    alert("Il faut spécifier un identifiant ET un mot de passe !!!")
  }
}
// ****************************************************************************** -->
function recuperer_nom_prenom_divisions_matieres_groupes2(zone_affichage_message,identifiant) {
  // Fichier récupéré, récupération des données :
  // Tout d'abord l'identification de l'utilisateur (champs séparés par des "####")
  // puis les données pour remplir les OPTIONs des SELECTs :
  // Ce fichier contient les différents "<option...>...</option>" les uns à la suite des autres,
  //   séparés par des "###" et des "####".
  // Il y a tout d'abord l'option des ou de la division, un "####", puis les options des matières séparés par des "###",
  // un "####", puis les options des groupes.
  //
  if (reponse_requete_XMLHttpRequest != "") {
    // La réponse n'est pas vide, c'est donc la liste des options...
    // On découpe la chaîne :
    expressionReguliere = new RegExp("####","g"); // Découpage Division / Matières / Groupes
    var tableau_reponse_requete = reponse_requete_XMLHttpRequest.split(expressionReguliere);
    // On récupère donc les éléments suivants :
    //   tableau_reponse_requete[0]  : Nom
    //   tableau_reponse_requete[1]  : Prénom
    //   tableau_reponse_requete[2]  : Réponse pour le mdp (vrai ou faux)
    //   tableau_reponse_requete[3]  : Code (type) de l'utilisateur (P professeur, PA parent, E élève).
    //   Dans le cas d'un ELEVE :
    //     tableau_reponse_requete[4]  : Vide (un espace)
    //     tableau_reponse_requete[5]  : Division (unique)
    //     tableau_reponse_requete[6]  : Matieres
    //     tableau_reponse_requete[7]  : Groupes
    //   Dans le cas d'un PARENT :
    //     tableau_reponse_requete[4]  : Liste des ELEVES de ce PARENT.
    //     tableau_reponse_requete[5]  : Division (unique) pour le premier ELEVE de la liste
    //     tableau_reponse_requete[6]  : Matieres
    //     tableau_reponse_requete[7]  : Groupes
    //
    // On vérifie le compte :
    if (tableau_reponse_requete[0].length == 0) {
      $(zone_affichage_message).innerHTML = "ATTENTION : vous avez indiqué un compte incorrect.  Veuillez le rectifier.";
    } else {
      // Le compte existe, on vérifie le mot de passe :
      if (tableau_reponse_requete[2] == "vrai") {
        mdp_valide = true;
      } else {
        mdp_valide = false;
      }
      if (mdp_valide) {
        // On récupère le nom et le prénom :
        if (tableau_reponse_requete[4].length > 0) {
          $(zone_affichage_message).innerHTML = "Bonjour, vous êtes : <b>" + tableau_reponse_requete[1] + " " + tableau_reponse_requete[0] + "</b>, ";
          if (tableau_reponse_requete[3] == "P") {
            $(zone_affichage_message).innerHTML += "professeur" ;
          } else if (tableau_reponse_requete[3] == "PA") { 
            $(zone_affichage_message).innerHTML += "parent d'élève" ;
          } else if (tableau_reponse_requete[3] == "E") { 
            $(zone_affichage_message).innerHTML += "élève" ;
          } else if (tableau_reponse_requete[3] == "AE") { 
            $(zone_affichage_message).innerHTML += "ancien élève" ;
          } else if (tableau_reponse_requete[3] == "CPE") { 
            $(zone_affichage_message).innerHTML += "CPE" ;
          } else if (tableau_reponse_requete[3] == "AP") { 
            $(zone_affichage_message).innerHTML += "ancien prof" ;
          } else if (tableau_reponse_requete[3] == "PA") { 
            $(zone_affichage_message).innerHTML += "parent" ;
          } else {
            // Ce cas ne doit normalement pas se produire...
            $(zone_affichage_message).innerHTML += "Type incorrect. Contacter l'administrateur pour lui signaler ce problème.<br />";
          }
          $(zone_affichage_message).innerHTML += " (compte &laquo;<b>" + identifiant + "</b>&raquo;).<br />Cliquez sur l'un des onglets ci-dessus pour accéder aux différentes parties de cette application (\"Bulletin d'appel\", \"Cahier de texte\", \"AP\", \"Mot de passe\").<br />N'oubliez pas de fermer la session et le navigateur, une fois terminé.";
          $("legende_identification").innerHTML = "Bienvenue.";
          $("p_fermeture_session").style.display = "block"; // On affiche le bouton "Fermer la session"
        } else {
          $(zone_affichage_message).innerHTML = "ATTENTION : une erreur a été rencontrée dans la récupération des données associées à votre compte.<br /> Contacter l'administrateur.";
        }
        // On masque la partie "Identifiant / Mot de passe".
        $("identifiant_mdp").style.display = "none";  
        // On récupère la ou les divisions :
        if (identifiant_parent) {
          // Dans le cas d'un PARENT : on récupère d'abord la liste des ELEVES correspondants
          expressionReguliere = new RegExp("###","g"); // Découpage des eleves
          var tableau_eleves = tableau_reponse_requete[4].split(expressionReguliere);
          var liste_eleves = "";
          for (var i=0;i<tableau_eleves.length;i++) {
            liste_eleves += tableau_eleves[i];
          }
          $("div_liste_eleves").innerHTML = select_eleves + liste_eleves + "</select>";
          // On affiche la partie "Liste des élèves".
          $("div_eleves").style.display = "block";  
          // On affiche la division du premier ELEVE de la liste.
          $("div_liste_divisions").innerHTML = select_divisions + tableau_reponse_requete[5] + "</select>";
        } else if (identifiant_eleve) {
          // Dans le cas d'un ELEVE : une seule DIVISION
          $("div_liste_divisions").innerHTML = select_divisions + tableau_reponse_requete[5] + "</select>";
        } else if (identifiant_prof) {
          // Pour les PROFS, possibilité d'afficher des statistiques de connexion :
          $(zone_affichage_message).innerHTML += "<br />Vous pouvez consulter ici les statistiques des connexions : <input type=\"button\" value=\"Stats\" id=\"bouton_stats_connexions1\" onclick=\"affichage_stats_connexions1();\" />";
          // Dans le cas d'un PROF : une liste de DIVISIONS
          expressionReguliere = new RegExp("###","g"); // Découpage des options
          var tableau_options = tableau_reponse_requete[5].split(expressionReguliere);
          var liste_options = "";
          for (var i=0;i<tableau_options.length;i++) {
            liste_options += tableau_options[i];
          }
          $("div_liste_divisions").innerHTML = select_divisions + liste_options + "</select>";
        }
        // On récupère les options pour les matières :
        expressionReguliere = new RegExp("###","g"); // Découpage des options
        var tableau_options = tableau_reponse_requete[6].split(expressionReguliere);
        var liste_options = "";
        for (var i=0;i<tableau_options.length;i++) {
          liste_options += tableau_options[i];
        }
        $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select>";
        // On récupère les options pour les groupes :
        tableau_options = tableau_reponse_requete[7].split(expressionReguliere);
        liste_options = "";
        for (var i=0;i<tableau_options.length;i++) {
          liste_options += tableau_options[i];
        }
        $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
        // Les options sont récupérées !
        // La connexion s'est faite, on l'enregistre dans les statistiques
        enregistrement_statistiques_connexions();
      } else {
        if (tableau_reponse_requete[2] == "faux") {
          $(zone_affichage_message).innerHTML = "Vous avez tapé un mot de passe incorrect. Veuillez le resaisir.";
        } else if (tableau_reponse_requete[2] == "pas_eleve") {
          $(zone_affichage_message).innerHTML = "Vous n'êtes pas un élève actuellement scolarisé au lycée... Accès refusé.";
        } else {
          $(zone_affichage_message).innerHTML = "Réponse du serveur non conforme. Accès refusé.";
        }
      }
    }
  }
}
// ****************************************************************************** -->
function enregistrement_statistiques_connexions() {
  // ************************************************************************** -->
  // Affichage du carnet de bord numérique d’accompagnement personnalisé
  // ************************************************************************** -->
  // Initialisation des variables pour la requête :
  var mdp = hex_md5($("mdp").value);
  var zone_affichage = "p_message_administration"; // On donne volontairement
  // une zone d'affichage "extérieure" à cet onglet, car elle va âtre effacée 
  // par la procédure. La zone p_message_zone_identification de cet onglet
  // est en effet utilisée par la connexion et ne doit donc pas être effacée
  // par les stats...
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_enregistrement_stats_connexions.php";
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "enregistrement_statistiques_connexions2(\"" + zone_affichage + "\")";
  // **************************************************************************
  // Paramètres à passer à ce fichier php :
  if (identifiant_eleve) {
    var parametres = "elenoet=" + $("identifiant").value + "&mdp=" + mdp;
  } else if (identifiant_parent || identifiant_prof) {
    var parametres = "identifiant=" + $("identifiant").value + "&mdp=" + mdp;
  }
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
}
// ****************************************************************************** -->
function enregistrement_statistiques_connexions2(zone_affichage) {
  // Fichier récupéré, récupération des données :
  if (reponse_requete_XMLHttpRequest != "") {
    // On découpe la chaîne :
    expressionReguliere = new RegExp("####","g");
    var tableau_reponse_requete = reponse_requete_XMLHttpRequest.split(expressionReguliere);
    // Que faut-il faire ?
    if (tableau_reponse_requete[0] == "vrai") {
      //
    } else {
      //
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// SELECTIONS dans les LISTES DIVISIONS / MATIERES / GROUPES
// ****************************************************************************** -->
// ****************************************************************************** -->
function selection_division() {
  // Pour assurer la compatibilité avec MSIE, il ne faut pas passer de paramètres dans la fonction
  // onchange de la balise <select> de la liste déroulante :
  //  <select ....... onchange="javascript: selection('division')"> NE FONCTIONNE PAS
  //   Le fait d'avoir placé un paramètre dans la fonction selection() fait échouer l'exécution dans MSIE
  //  <select ....... onchange="javascript: selection_division()"> FONCTIONNE
  // D'autre part, cela va permettre d'orienter cet appel sur les archives, le cas échéant...
  if (archives_cdtxt) {
    archives_cahiers_de_texte()
  } else {
    selection('division');
  }
}
function selection_matiere() {
  if (archives_cdtxt) {
    archives_cahiers_de_texte()
  } else {
    selection('matiere');
  }
}
function selection_groupe() {
  if (archives_cdtxt) {
    archives_cahiers_de_texte()
  } else {
    selection('groupe');
  }
}
function selection_prof() {
  archives_cahiers_de_texte();
}
function selection_annee_scolaire() {
  archives_cahiers_de_texte();
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function selection_eleve() {
  recuperer_eleve_division_matieres_groupes();
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_eleve_division_matieres_groupes() {
  // On est dans le cas d'un PARENT qui vient de sélectionner un ELEVE.
  // On va appeler le fichier PHP "cdtxt_eleve_division_matieres_groupes.php?elenoet=...&elenoet=...".
  // pour recevoir les listes d'options correspondant à cet élève.
  var elenoet = $("eleve").value;
  // **************************************************************************** -->
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_eleve_division_matieres_groupes.php";
  // Paramètres à passer à ce fichier php :
  var parametres = "elenoet=" + elenoet ;
  // Zone dans laquelle afficher les messages au cours de l'élaborration de la réponse et de son traitement :
  var zone_affichage_message = "p_message_zone_identification";
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "recuperer_eleve_division_matieres_groupes2(\"" + zone_affichage_message + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
}
// ****************************************************************************** -->
function recuperer_eleve_division_matieres_groupes2(zone_affichage_message) {
  // Fichier récupéré, récupération des données :
  // Données pour remplir les OPTIONs des SELECTs :
  // Ce fichier contient les différents "<option...>...</option>" les uns à la suite des autres,
  //   séparés par des "###" et des "####".
  // Il y a tout d'abord l'option de la division, un "####", puis les options des matières séparés par des "###",
  // un "####", puis les options des groupes.
  //
  if (reponse_requete_XMLHttpRequest != "") {
    // La réponse n'est pas vide, c'est donc la liste des options...
    // On découpe la chaîne :
    expressionReguliere = new RegExp("####","g"); // Découpage Division / Matières / Groupes
    var tableau_reponse_requete = reponse_requete_XMLHttpRequest.split(expressionReguliere);
    // On récupère donc les éléments suivants :
    //     tableau_reponse_requete[0]  : Division (unique)
    //     tableau_reponse_requete[1]  : Matieres
    //     tableau_reponse_requete[2]  : Groupes
    //
    // On affiche la division du premier ELEVE de la liste.
    $("div_liste_divisions").innerHTML = select_divisions + tableau_reponse_requete[0] + "</select>";
    // On récupère les options pour les matières :
    expressionReguliere = new RegExp("###","g"); // Découpage des options
    var tableau_options = tableau_reponse_requete[1].split(expressionReguliere);
    var liste_options = "";
    for (var i=0;i<tableau_options.length;i++) {
      liste_options += tableau_options[i];
    }
    $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select>";
    // On récupère les options pour les groupes :
    tableau_options = tableau_reponse_requete[2].split(expressionReguliere);
    liste_options = "";
    for (var i=0;i<tableau_options.length;i++) {
      liste_options += tableau_options[i];
    }
    $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
    // Les options sont récupérées !
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function selection(division_ou_matiere_ou_groupe) {
  // **************************************************************************** -->
  // L'utilisateur a sélectionné une division ou une matière ou un groupe :
  // **************************************************************************** -->
  // On efface les zones d'affichage (si l'utilisateur a changé la division, la matière ou le groupe
  // c'est que le cahier de texte ou le bulletin d'appel affiché ne correspond plus à la sélection...)
  // Bulletin d'appel :
  $("div_bulletin_appel").style.display = "none";
  $("p_liste_eleves").innerHTML = "";
  $("p_affichage_bulletin_appel").innerHTML = "";
  $("liste_num_table_absences_retards").value = "";
  if (onglet_encours == 2) {
    if (identifiant_eleve || identifiant_parent) {
      $("div_bouton_appel").style.display= "none";  // On masque le bouton "Bulletin d'appel"
    } else {
      $("div_bouton_appel").style.display = "block";
    }
    $("div_bouton_bulletins").style.display = "block";
  }
  // Cahier de texte :
  $("date_cdtxt").value = "";
  $("texte_cdtxt").value = "";
  $("afaire_cdtxt").value = "";
  $("div_actualisation_cahier_de_texte").style.display = "none";
  $("p_message_actualisation_cahier_de_texte").innerHTML = "";
  $("p_affichage_cahier_de_texte").innerHTML = "";
  $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
  // On teste ce qui a été sélectionné :
  if (division_ou_matiere_ou_groupe == "division" && (identifiant_prof)) {
    // ************************************************************************** -->
    // L'utilisateur a sélectionné une division (il s'agit donc d'un PROF),
    var division = $("division").value;
    // Il faut sélectionner les matières et groupes correspondants.
    if (division == 0) {
      // Si l'utilisateur a sélectionné la ligne "----------" (value = 0), c'est pour tout remettre à zéro.
      // Il faut récupérer toutes les divisions, toutes les matières et tous les groupes.
      recuperer_nom_prenom_divisions_matieres_groupes();
    } else {
      // Une division a été sélectionnée, il faut donc chercher les matières et les groupes 
      // correspondants à la division sélectionnée.
      recuperer_matieres_et_groupes();
    }
  } else if (division_ou_matiere_ou_groupe == "matiere" || division_ou_matiere_ou_groupe == "groupe") {
    // ************************************************************************** -->
    // L'utilisateur a sélectionné une matière ou un groupe :
    var matiere_ou_groupe = division_ou_matiere_ou_groupe;
    var matiere_ou_groupe_selectionne = $(matiere_ou_groupe).value;
    //
    if (identifiant_eleve || identifiant_parent) { // Variable globale renseignée au moment de l'identification.
      // ************************************************************************ -->
      // Il s'agit d'un élève, il ne faut agir que sur les matières si c'est un groupe qui a été
      // sélectionné ou sur les groupes si c'est une matière qui a été sélectionnée.
      if (matiere_ou_groupe_selectionne == 0) {
        // Si l'utilisateur a sélectionné la ligne "----------" (value = 0), c'est pour tout remettre à zéro.
        // Il faut récupérer toutes les matières et tous les groupes.
        recuperer_matieres_ou_groupes("matiere",0);
        recuperer_matieres_ou_groupes("groupe",0);
      } else {
        // Si l'utilisateur a sélectionné une matière ou un groupe,
        // il faut récupérer les groupes correspondants ou la matière correspondante..
        recuperer_matieres_ou_groupes(matiere_ou_groupe,matiere_ou_groupe_selectionne);
      }
    } else if (identifiant_prof) { // Variable globale renseignée au moment de l'identification.
      // ************************************************************************ -->
      // Il s'agit d'un PROF, il faut agir sur la division et sur les matières si c'est un groupe qui a été
      // sélectionné ou sur la division et sur les groupes si c'est une matière qui a été sélectionnée.
      var division = $("division").value;
      if (matiere_ou_groupe_selectionne == 0) {
        // Si l'utilisateur a sélectionné la ligne "----------" (value = 0), c'est pour tout remettre à zéro.
        // Il faut récupérer toutes les divisions, toutes les matières et tous les groupes.
        if (division == 0) {
          // Pas de division sélectionnée, il faut tout réinitialiser.
          recuperer_nom_prenom_divisions_matieres_groupes();
        } else {
          // Une division est déjà sélectionnée par ailleurs,
          // il faut récupérer les groupes correspondants ou la matière correspondante.
          recuperer_matieres_et_groupes();
        }
      } else {
        // L'utilisateur a sélectionné une matière ou un groupe :
        if (division == 0) {
          // Pas de division sélectionnée, il faut chercher toutes les divisions correspondant
          // à cette matière ou à ce groupe sélectionné, et récupérer les matières si c'est un groupe qui a été
          // sélectionné ou les groupes si c'est une matière qui a été sélectionnée.
          recuperer_divisions_et_matieres_ou_groupes(matiere_ou_groupe,matiere_ou_groupe_selectionne);
        } else {
          // Une division est déjà sélectionnée par ailleurs,
          // il faut récupérer les groupes correspondants ou la matière correspondante.
          recuperer_matieres_ou_groupes(matiere_ou_groupe,matiere_ou_groupe_selectionne);
        }
      }
    }
    // ************************************************************************** -->
  } else {
    alert("ERREUR ! Mauvais paramètre pour la fonction selection().\n Contacter l'administrateur.");
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_matieres_et_groupes() {
  // On est dans le cas d'un PROF qui vient de sélectionner une DIVISION.
  // On va appeler le fichier PHP "cdtxt_matieres_groupes.php?identifiant=...&division=...".
  // pour recevoir les listes d'options correspondant à cet utilisateur et à la division sélectionnée.
  var identifiant = $("identifiant").value;
  var division    = $("division").value;
  // **************************************************************************** -->
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_matieres_groupes.php";
  // Paramètres à passer à ce fichier php :
  var parametres = "identifiant=" + identifiant + "&division=" + division;
  // Zone dans laquelle afficher les messages au cours de l'élaboration de la réponse et de son traitement :
  var zone_affichage_message = "p_message_erreur_zone_divmatgrp";
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "recuperer_matieres_et_groupes2(\"" + zone_affichage_message + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
}
// ****************************************************************************** -->
function recuperer_matieres_et_groupes2(zone_affichage_message) {
  // Liste des options...
  // On découpe la chaîne pour récupérer les options pour les groupes :
  var expressionReguliere = new RegExp("####","g"); // Découpage Division / Matières / Groupes
  var tableau_options_MG = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  // On récupère les options pour les matières :
  if (tableau_options_MG[0].substring(0,4)=="<div") {
    // La réponse commence par "<div", c'est un message d'erreur...
    $(zone_affichage_message).innerHTML = reponse_requete_XMLHttpRequest;
  } else {
    // Découpage des options :
    expressionReguliere = new RegExp("###","g");
    var tableau_options = tableau_options_MG[0].split(expressionReguliere);
    var liste_options = "";
    // Voir les explications dans la fonction recuperer_matieres_ou_groupes().
    for (var i=0;i<tableau_options.length;i++) {
      if (tableau_options[i].substring(0,4)=="<div") {
        // La réponse commence par "<div", c'est un message d'erreur...
        $(zone_affichage_message).innerHTML = tableau_options[i];
      } else {
        // La réponse ne commence pas par "<div", c'est l'option du select...
        // Quelquechose du genre : <option value="3">Bal bla bla</option>
        if (tableau_options.length==2 && i==1) {
          tableau_options[i] = tableau_options[i].substring(0,tableau_options[i].indexOf(">")) + " selected=\"selected\"" + tableau_options[i].substring(tableau_options[i].indexOf(">"),tableau_options[i].length);
        }
        liste_options += tableau_options[i];
      }
    }
    $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select>";
    // On récupère les options pour les groupes :
    if (tableau_options_MG[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponse_requete_XMLHttpRequest;
    } else {
      // Découpage des options :
      tableau_options = tableau_options_MG[1].split(expressionReguliere);
      liste_options = "";
      for (var i=0;i<tableau_options.length;i++) {
        if (tableau_options.length==2 && i==1) {
          tableau_options[i] = tableau_options[i].substring(0,tableau_options[i].indexOf(">")) + " selected=\"selected\"" + tableau_options[i].substring(tableau_options[i].indexOf(">"),tableau_options[i].length);
        }
        liste_options += tableau_options[i];
      }
      $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
      // Les options sont récupérées !
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_matieres_ou_groupes(matiere_ou_groupe,matiere_ou_groupe_selectionne) {
  // Il peut s'agir d'un ELEVE, d'un PROF ou d'un PARENT. La division est connue.
  //
  // Si matiere_ou_groupe="matiere" : l'utilisateur a sélectionné une MATIERE : il faut trouver les groupes correspondants.
  //   On va appeler le fichier PHP "cdtxt_groupes.php?..."
  //   pour recevoir les listes d'options correspondant à l'utilisateur, à la division et à la matière sélectionnés.
  //
  // Si matiere_ou_groupe="groupe" : l'utilisateur a sélectionné une GROUPE : il faut trouver les matières correspondantes.
  //   On va appeler le fichier PHP "cdtxt_matieres.php?..."
  //   pour recevoir les listes d'options correspondant à l'utilisateur, à la division et au groupe sélectionnés.
  if (matiere_ou_groupe == "matiere") {
    // Si c'est une matière qui a été sélectionnée (variable matiere_ou_groupe = "matiere"),
    //   c'est qu'il faut trouver les groupes      (variable groupe_ou_matiere = "groupe"),
    //   donc appeler la page "cdtxt_groupes.php?elenoet=...&matiere=..."
    var groupe_ou_matiere = "groupe";
    //
  } else if (matiere_ou_groupe == "groupe") {
    // Si c'est un groupe qui a été sélectionné (variable matiere_ou_groupe = "groupe"),
    //   c'est qu'il faut trouver les matières  (variable groupe_ou_matiere = "matiere"),
    //   donc appeler la page "cdtxt_matieres.php?elenoet=...&groupe=..."
    var groupe_ou_matiere = "matiere";
  }
  // Un groupe ou une matière était peut-être déjà sélectionné, il faudra maintenir la sélection :
  var groupe_ou_matiere_deja_selectionne = $(groupe_ou_matiere).value;
  // *******************************************
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  // Fichier PHP à appeler :
  //                         "cdtxt_groupes.php?elenoet=...&matiere=..."
  //                      ou "cdtxt_matieres.php?elenoet=...&groupe=..."
  //                      ou "cdtxt_groupes.php?identifiant=...&division=...&&matiere=..."
  //                      ou "cdtxt_matieres.php?identifiant=...&division=...&groupe=..."
  if (identifiant_prof) {
    // Prof :
    var identifiant = $("identifiant").value;
    var division    = $("division").value;
    var parametres  = "identifiant=" + identifiant + "&division=" + division;
  } else if (identifiant_eleve) {
    // Elève :
    var elenoet    = $("identifiant").value;
    var division   = $("division").value;
    var parametres = "elenoet=" + elenoet + "&division=" + division;
  } else if (identifiant_parent) {
    // Parent :
    // Comme pour un élève, c'est l'elenoet choisi dans la liste des élève qui doit être utilisé.
    var elenoet    = $("eleve").value;
    var division   = $("division").value;
    var parametres = "elenoet=" + elenoet + "&division=" + division;
  } else {
    alert ("ERREUR ! L'utilisateur n'est identifié ni en tant qu'élève, ni en tant que parent, ni en tant que prof.\n Contacter l'administrateur.");
  }
  // **************************************************************************** -->
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  var zone_affichage_message = "p_message_erreur_zone_divmatgrp";
  // Fichier à appeler :
  var fichier_php_a_appeler = "cdtxt_" + groupe_ou_matiere + "s.php";
  // Paramètres à passer au fichier php :
  parametres += "&" + matiere_ou_groupe + "=" + matiere_ou_groupe_selectionne;
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "recuperer_matieres_ou_groupes2(\"" + zone_affichage_message + "\",\"" + groupe_ou_matiere_deja_selectionne + "\",\"" + groupe_ou_matiere  + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  // **************************************************************************** -->
}
// ****************************************************************************** -->
function recuperer_matieres_ou_groupes2(zone_affichage_message,groupe_ou_matiere_deja_selectionne,groupe_ou_matiere) {
  // On découpe la chaîne pour récupérer les options pour les groupes :
  var expressionReguliere = new RegExp("###","g"); // Découpage des options
  var tableau_options = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  var liste_options = "";
  var valeur_option = "";
  for (var i=0;i<tableau_options.length;i++) {
    if (tableau_options[i].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = tableau_options[i];
    } else {
      // La réponse ne commence pas par "<div", c'est l'option du select...
      // Quelquechose du genre : <option value="3">Bal bla bla</option>
      // On extrait la valeur de l'option :
      valeur_option = tableau_options[i].substring(tableau_options[i].indexOf("\"")+1,tableau_options[i].lastIndexOf("\""));
      // Deux cas de figure :
      //         - Il n'y a que deux options (<option value="0">-----</option> et <option value="x">XXXX</option>)
      //           autrement dit un seul groupe ou que la classe entière et on est sur la deuxième option
      //           (<option value="x">XXXX</option>). Il faut donc la sélectionner.
      // OU BIEN - Il y a plus de deux options et on est sur l'option qui était déjà sélectionnée.
      //           NB : si aucune option n'était précédemment sélectionnée
      //           (groupe_ou_matiere_deja_selectionne = 0), on sélectionne alors l'option "vide"
      //           <option value="0">-----</option>.
      // NB : seule l'option "vide" <option value="0">-----</option> a comme valeur O.
      //      L'option <option value="-1">Classe entière</option> doit avoir la valeur -1.
      if ((tableau_options.length==2 && i==1) || (valeur_option == groupe_ou_matiere_deja_selectionne && tableau_options.length>2)) {
        // On sélectionne alors cette option en rajoutant selected="selected" :
        tableau_options[i] = tableau_options[i].substring(0,tableau_options[i].indexOf(">")) + " selected=\"selected\"" + tableau_options[i].substring(tableau_options[i].indexOf(">"),tableau_options[i].length);
      }
      // On ajoute cette option à la liste des options.
      liste_options += tableau_options[i];
    }
  }
  if (groupe_ou_matiere == "matiere") {
    $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select>";
  } else if (groupe_ou_matiere == "groupe") {
    $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
  }
  // Les options sont récupérées !
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_divisions_et_matieres_ou_groupes(matiere_ou_groupe,matiere_ou_groupe_selectionne) {
  // Cette fonction n'est appelée que pour les PROFS.
  // On récupère l'identifiant et la matière saisis par l'utilisateur :
  var identifiant = $("identifiant").value;
  // Si matiere_ou_groupe="matiere" : l'utilisateur a sélectionné une MATIERE, il faut trouver les groupes correspondants.
  //   On va appeler le fichier PHP "cdtxt_groupe.php?elenoet=...&matiere=...".
  //   pour recevoir les listes d'options correspondant à l'élève et à la matière sélectionnée.
  //
  // Si matiere_ou_groupe="groupe" : l'utilisateur a sélectionné une GROUPE,  il faut trouver les matières correspondantes.
  //   On va appeler le fichier PHP "cdtxt_matiere.php?elenoet=...&groupe=...".
  //   pour recevoir les listes d'options correspondant à l'élève et au groupe sélectionnée.
  //
  if (matiere_ou_groupe == "matiere") {
    var groupe_ou_matiere = "groupe";
  } else if (matiere_ou_groupe == "groupe") {
    var groupe_ou_matiere = "matiere";
  }
  // **************************************************************************** -->
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  var zone_affichage_message = "p_message_erreur_zone_divmatgrp";
  // Fichier php à appeler :
  var fichier_php_a_appeler = "cdtxt_divisions_" + groupe_ou_matiere + "s.php";
  // Paramètres à passer au fichier php :
  var parametres = "identifiant=" + identifiant + "&" + matiere_ou_groupe + "=" + matiere_ou_groupe_selectionne;
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "recuperer_divisions_et_matieres_ou_groupes2(\"" + zone_affichage_message + "\",\"" + groupe_ou_matiere + "\",\"" + matiere_ou_groupe_selectionne  + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  // **************************************************************************** -->
}
// ****************************************************************************** -->
function recuperer_divisions_et_matieres_ou_groupes2(zone_affichage_message,groupe_ou_matiere,matiere_ou_groupe_selectionne) {
  // On découpe la chaîne pour récupérer les options :
  var expressionReguliere = new RegExp("####","g"); // Découpage Divison / (Matières ou Groupes)
  var tableau_options_MG = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  // On récupère les options pour les matières :
  if (tableau_options_MG[0].substring(0,4)=="<div") {
    // La réponse commence par "<div", c'est un message d'erreur...
    $(zone_affichage_message).innerHTML = reponse_requete_XMLHttpRequest;
  } else {
    // Découpage des options :
    expressionReguliere = new RegExp("###","g");
    var tableau_options = tableau_options_MG[0].split(expressionReguliere);
    var liste_options = "";
    for (var i=0;i<tableau_options.length;i++) {
      if (tableau_options.length==2 && i==1) {
        tableau_options[i] = tableau_options[i].substring(0,tableau_options[i].indexOf(">")) + " selected=\"selected\"" + tableau_options[i].substring(tableau_options[i].indexOf(">"),tableau_options[i].length);
      }
      liste_options += tableau_options[i];
    }
    $("div_liste_divisions").innerHTML = select_divisions + liste_options + "</select>";
    // On récupère les options pour les groupes ou les matières :
    if (tableau_options_MG[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = tableau_options_MG[1];
    } else {
      // Découpage des options :
      tableau_options = tableau_options_MG[1].split(expressionReguliere);
      liste_options = "";
      for (var i=0;i<tableau_options.length;i++) {
        if (tableau_options.length==2 && i==1) {
          tableau_options[i] = tableau_options[i].substring(0,tableau_options[i].indexOf(">")) + " selected=\"selected\"" + tableau_options[i].substring(tableau_options[i].indexOf(">"),tableau_options[i].length);
        }
        liste_options += tableau_options[i];
      }
      if (groupe_ou_matiere == "matiere") {
        $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select>";
      } else if (groupe_ou_matiere == "groupe") {
        $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
      }
      // Les options sont récupérées !
      // On actualise les options pour les matières ou les groupes :
      if (tableau_options_MG[2].substring(0,4)=="<div") {
        // La réponse commence par "<div", c'est un message d'erreur...
        $(zone_affichage_message).innerHTML = tableau_options_MG[2];
      } else {
        // Découpage des options :
        tableau_options = tableau_options_MG[2].split(expressionReguliere);
        liste_options = "";
        var value_option = 0;
        for (var i=0;i<tableau_options.length;i++) {
          // On cherche la valeur de l'option :
          value_option = tableau_options[i].substring(tableau_options[i].indexOf("=")+2,tableau_options[i].indexOf(">")-1);
          //alert(tableau_options[i] + "\n" + value_option + "\n" + matiere_ou_groupe_selectionne);
          if (value_option == matiere_ou_groupe_selectionne) {
            // Si c'est l'option sélectionnée par l'utilisateur...
            tableau_options[i] = tableau_options[i].substring(0,tableau_options[i].indexOf(">")) + " selected=\"selected\"" + tableau_options[i].substring(tableau_options[i].indexOf(">"),tableau_options[i].length);
          }
          liste_options += tableau_options[i];
        }
        if (groupe_ou_matiere == "groupe") {
          $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select>";
        } else if (groupe_ou_matiere == "matiere") {
          $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
        }
        // Les options sont récupérées !
      }
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// BULLETINS D'APPEL
// ****************************************************************************** -->
// ****************************************************************************** -->
function remplir_bulletin_appel(num_division,num_matiere,num_groupe,date,heure,date_saisie,heure_saisie) {
  // Ce script est appelé soit pour remplir un nouveau bulletin (paramètres transmis dans cette
  // fonction vides) soit pour modifier un bulletin d'appel existant (paramètres transmis non vides).
  // Dans le cas d'une modif, la liste des nums des enregistrements à supprimer avant d'en insérer
  // de nouveaux, se trouvera dans le champ caché "liste_num_table_absences_retards", ce qui
  // permettra à la procédure "enregistrer_bulletin_appel()" de fonctionner (on supprimera les
  // anciens enregistrements avant d'insérer les nouveaux).
  //
  $("liste_num_table_absences_retards").value="";
  //
  if (identifiant_eleve || identifiant_parent) {
    alert("L'édition d'un bulletin d'appel n'est pas accessible aux élèves ni aux parents !");
  } else if (identifiant_prof == true) {
    // Nouveau bulletin d'appel : il faut récupérer le triplet division, matiere, groupe.
    if (num_division == 0 && num_matiere == 0 && num_groupe == 0) {
      num_division = $("division").value;
      num_matiere = $("matiere").value;
      num_groupe = $("groupe").value;
    }
    if (date=="" && ( num_division == 0 && num_matiere == 0 )) { // num_groupe == 0
      alert("Pour faire l'appel, vous devez sélectionner au moins une classe et une matière !");
    } else {
      // ************************************************************************ -->
      // On peut afficher le bulletin :
      // ************************************************************************ -->
      // On masque les boutons :
      $("div_bouton_appel").style.display = "none";
      $("div_bouton_bulletins").style.display = "none";
      //
      // ************************************************************************ -->
      // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
      var zone_affichage_message = "p_affichage_bulletin_appel";
      // Fichier php à appeler :
      var fichier_php_a_appeler = "cdtxt_bulletin_appel.php";
      // Paramètres à passer au fichier php :
      var parametres = "division=" + num_division + "&matiere=" + num_matiere + "&groupe=" + num_groupe + "&date=" + date + "&heure=" + heure + "&date_saisie=" + date_saisie + "&heure_saisie=" + heure_saisie;
      // Fonction de traitement du résultat de la requête :
      var fonction_resultat = "remplir_bulletin_appel2(\"" + zone_affichage_message + "\",\"" + date + "\",\"" + heure + "\")";
      // Requête XMLHttpRequest :
      requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
      // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
      // ************************************************************************ -->
    }
  }
}
// ****************************************************************************** -->
function remplir_bulletin_appel2(zone_affichage_message,date,heure) {
  // Récupération des données :
  // On récupère dans une première partie les données du bulletin existant, s'il s'agit de la modification
  // d'un bulletin, et dans une deuxième partie la liste des élèves pour faire le tableau avec des coches.
  // Les deux parties sont séparées par "#####".
  var expressionReguliere = new RegExp("#####","g"); // Découpage des enregistrements
  var tableau_bulletin_classe = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  var bulletin_vide = true;
  if (tableau_bulletin_classe[0].substring(0,4) == "<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $("p_message_erreur_zone_divmatgrp").innerHTML = tableau_bulletin_classe[0];
  } else {
    // La réponse ne commence pas par "<div", c'est la liste attendue...
    // ************************************************************************** -->
    // PARTIE 1 : bulletin
    if (tableau_bulletin_classe[0] != "bulletin_vide") {
      // Le bulletin n'est pas vide, c'est à dire qu'il s'agit d'une modif de bulletin existant.
      // Mémorisation dans le tableau tableau_bulletin[] des élèves enregistrés dans le
      // bulletin existant pour cochage des cases :
      bulletin_vide = false;
      // On découpe la chaîne pour récupérer les enregistrements :
      expressionReguliere = new RegExp("####","g"); // Découpage des enregistrements
      var tableau_enregistrements = tableau_bulletin_classe[0].split(expressionReguliere);
      var tableau_bulletin = new Array();
      var tableau_champs = new Array();
      var i=0;
      var j=0;
      for (i=0;i<tableau_enregistrements.length;i++) {
        if (tableau_enregistrements[i].length > 0) {
          // L'enregistrement ne doit pas être vide...
          // Découpage des champs de l'enregistrement :
          expressionReguliere = new RegExp("###","g");
          tableau_champs = tableau_enregistrements[i].split(expressionReguliere);
          tableau_bulletin[0+(j*5)] = tableau_champs[0]; // num
          tableau_bulletin[1+(j*5)] = tableau_champs[1]; // elenoet
          tableau_bulletin[2+(j*5)] = tableau_champs[2]; // type
          tableau_bulletin[3+(j*5)] = tableau_champs[3]; // note
          tableau_bulletin[4+(j*5)] = tableau_champs[4]; // regularisation
          j++;
        }
      }
      var longueur_tableau_bulletin = j;
    }
    // ************************************************************************** -->
    // PARTIE 2 : Liste des élèves
    if (tableau_bulletin_classe[1] == "classe_vide") {
      // Pas d'enregistrements reçus :
      $("p_affichage_bulletin_appel").innerHTML = "Classe vide... Pas d'élèves enregistrés pour cette sélection. Contacter l'administrateur.";
      $("div_bouton_appel").style.display = "block";
      $("div_bouton_bulletins").style.display = "block";
    } else {
      // Enregistrements reçus (la classe n'est pas vide) :
      if (tableau_bulletin_classe[1].substring(0,4) == "<div") {
        // La réponse commence par "<div", c'est un message d'erreur...
        $("p_message_erreur_zone_divmatgrp").innerHTML = tableau_bulletin_classe[1];
      } else {
        // ********************************************************************** -->
        // LISTE DES ELEVES A AFFICHER :
        // La réponse ne commence pas par "<div", c'est la liste attendue...
        // On découpe la chaîne pour récupérer les enregistrements :
        expressionReguliere = new RegExp("####","g"); // Découpage des enregistrements
        tableau_enregistrements = tableau_bulletin_classe[1].split(expressionReguliere);
        // ********************************************************************** -->
        // Initialisation des variables locales :
        i = 0; // Ligne : TR
        tabindex = 0;
        var k = 0;
        var eleve_absent = false;
        var eleve_retard = false;
        var eleve_exclu  = false;
        var eleve_parti  = false;
        var regularisation = false;
        var ligne_paire  = true;
        var elenoet = "";
        var nom = "";
        var prenom = "";
        var photo = "";
        var note = "";
        var note_nonregul = "";
        var datedujour = new Date();
        var jour  = "";
        var mois  = "";
        var annee = "";
        var date_courante = "" ;
        var h = "";
        var m = "";
        var heure_courante = "";
        // ********************************************************************** -->
        // On va stocker dans le tableau liste_num_table_absences_retards[] la liste des nums
        // des enregistrements des élèves précédemment absents, en retard ou exclus
        // (cas de la modif d'un bulletin) pour les supprimer avant d'insérer
        // la nouvelle version du bulletin dans la table. Le principe est de supprimer tous
        // les enregistrements correspondants aux élèves absents, en retards ou exclus puis de créer
        // des enregistrements pour ceux présentement cochés (on ne fait pas d'update).
        // On place aussi, le cas échéant, dans cette table l'enregistrement
        // correspondant au bulletin indiquant que tout le monde était là...
        var liste_num_table_absences_retards = new Array();
        var l=0; // Indice tableau liste_num_table_absences_retards.
        if (longueur_tableau_bulletin == 1 && tableau_bulletin[1] == -1 ) {
          // Si le bulletin à modifier était du type "tout le monde était là", il faut le
          // mémoriser aussi pour pouvoir le supprimer avant d'enregistrer le bulletin modifié.
          liste_num_table_absences_retards[l++] = tableau_bulletin[0];
        }
        // ********************************************************************** -->
        // Affichage de l'entête du tableau XHTML :
        var liste_eleves = "<table class=\"table_tableau4\"><tr class=\"tr_tableau4_ligne1\"><th class=\"th_tableau4_titre1c\">Nom</th><th class=\"th_tableau4_titre1c\">Prénom</th><th class=\"th_tableau4_titre1c\">Absent</th><th class=\"th_tableau4_titre1c\">En retard</th><th class=\"th_tableau4_titre1c\">Exclu</th><th class=\"th_tableau4_titre1c\">Parti</th><th class=\"th_tableau4_titre1c\">Note</th><th class=\"th_tableau4_titre1c\">";
        if ($("identifiant").value == "cpe") {
          liste_eleves += "Régularisation <a class=\"a_lien_sans_deco_1\" href=\"javascript:tout_cocher_regularisation();\"><img src=\"images/tout_cocher.gif\" alt=\"Tout cocher\" title= \"Tout cocher\" /></a> <a class=\"a_lien_sans_deco_1\" href=\"javascript:tout_decocher_regularisation();\"><img src=\"images/tout_decocher.gif\" alt=\"Tout décocher\" title= \"Tout décocher\" /></a>";
        }
        liste_eleves += "</th></tr>";
        // ********************************************************************** -->
        // Boucles d'affichage, on scanne chaque élève (elenoet, nom, prenom) :
        for (i=0;i<tableau_enregistrements.length;i++) {
          if (tableau_enregistrements[i].length > 0) {
            // L'enregistrement ne doit pas être vide...
            // Découpage des champs de l'enregistrement :
            expressionReguliere = new RegExp("###","g");
            tableau_champs = tableau_enregistrements[i].split(expressionReguliere);
            elenoet        = tableau_champs[0];
            nom            = tableau_champs[1];
            prenom         = tableau_champs[2];
            photo          = tableau_champs[3];
            note_nonregul  = tableau_champs[4];
            if (note_nonregul == " " || note_nonregul == undefined) {note_nonregul = ""}
            // ****************************************************************** -->
            // Dans le cas où il s'agit d'une modification de bulletin, on regarde si l'élève
            // était absent, en retard ou exclu (tableau_bulletin[] précédemment constitué) :
            // ****************************************************************** -->
            note = "";
            eleve_absent = false;
            eleve_retard = false;
            eleve_exclu  = false;
            eleve_parti  = false;
            regularisation = false; // Ce champ ne sera utilisé que pour le CPE.
            if (bulletin_vide == false) {
              for (k=0;k<longueur_tableau_bulletin;k++) {      // Si l'élève était absent,
                if (tableau_bulletin[1+(k*5)] == elenoet) {    // en retard ou exclu, on devra cocher
                  if (tableau_bulletin[2+(k*5)] == 1) {        // la case correspondante.
                    eleve_absent = true;                       //
                  } else if (tableau_bulletin[2+(k*5)] == 2) { //
                    eleve_retard = true;                       //
                  } else if (tableau_bulletin[2+(k*5)] == 3) { //
                    eleve_exclu = true;                        //
                  } else if (tableau_bulletin[2+(k*5)] == 4) { //
                    eleve_parti = true;                        //
                  }
                  note = tableau_bulletin[3+(k*5)];            // On récupère également la note.
                  if (note == " ") {
                    note = "";
                  }
                  if (tableau_bulletin[4+(k*5)] == 1) {        // Régularisation (uniquement pour CPE).
                    regularisation = true;                     //
                  }
                  // On mémorise le num de la ligne du bulletin pour supprimer cet enregistrement
                  // quand l'utilisateur validera la modif (un nouvel enregistrement sera créé).
                  liste_num_table_absences_retards[l++] = tableau_bulletin[0+(k*5)];
                }
              }
            }
            // ****************************************************************** -->
            // Affichage :
            // ****************************************************************** -->
            liste_eleves += "<tr class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\">";
            // ****************************************************************** -->
            liste_eleves += "<td nowrap=\"nowrap\" align=\"center\" valign=\"bottom\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }

            liste_eleves += "\"><input type=\"hidden\" id=\"elenoet_" + i + "\" value=\"" + elenoet + "\" />";
            // L'élève est-il ok (régularisé) ?
            if (note_nonregul != "") { //&& bulletin_vide == false
              // L'élève n'est pas régularisé, il faut afficher une icone et un texte pour alerter.
              // Il ne faut pas qu'il y ait d'apostrophes ou de guillemets dans les paramètres
              // transmis dans les fonctions javascript (ici, dans le onclick de l'alert).
              expressionReguliere = new RegExp("'","g"); // On remplace les ' par des `
              note_nonregul = note_nonregul.replace(expressionReguliere,"`");
              expressionReguliere = new RegExp("\"","g"); // On remplace les " par des ``
              note_nonregul = note_nonregul.replace(expressionReguliere,"``");
              liste_eleves += "<a class=\"a_lien_sans_deco_1\" href=\"javascript:alert('" + note_nonregul + "\\nMerci d`envoyer cet élève à la vie scolaire afin qu`il régularise sa situation.');\"><img src=\"point_exclamation_anime_01_16x16.gif\" width=\"16\" height=\"18\" alt=\"Non régularisé !\" title= \"" + note_nonregul + " Merci d`envoyer cet élève à la vie scolaire afin qu`il régularise sa situation.\" style=\"margin-top:3px; margin-right:5px;\"  /></a>";
            }
            // Affichage du nom :
            liste_eleves += "<a class=\"a_lien_sans_deco_1\" href=\"javascript:afficher_photo('" + photo + "');\">";
            liste_eleves += nom;
            liste_eleves += "</a>";
            liste_eleves += "</td>";
            // ****************************************************************** -->
            liste_eleves += "<td align=\"center\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\">" + prenom + "</td>";
            // ****************************************************************** -->
            tabindex++;
            liste_eleves += "<td align=\"center\" width=\"60px\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\"><input type=\"checkbox\" id=\"coche_absent_" + i + "\" name=\"coche_absent_" + i + "\" value=\"1\" tabindex=\"" + tabindex + "\"";
            if (eleve_absent == true) {
              liste_eleves += " checked=\"checked\"";
            }
            liste_eleves += " onclick=\"$('coche_retard_" + i + "').checked=false; $('coche_exclu_" + i + "').checked=false; $('coche_parti_" + i + "').checked=false; \" /></td>";
            // ****************************************************************** -->
            tabindex++;
            liste_eleves += "<td align=\"center\" width=\"80px\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\"><input type=\"checkbox\" id=\"coche_retard_" + i + "\" name=\"coche_retard_" + i + "\" value=\"2\" tabindex=\"" + tabindex + "\"";
            if (eleve_retard == true) {
              liste_eleves += " checked=\"checked\"";
            }
            liste_eleves += " onclick=\"$('coche_absent_" + i + "').checked=false; $('coche_exclu_" + i + "').checked=false; $('coche_parti_" + i + "').checked=false; if ($('coche_retard_" + i + "').checked==true) {datedujour = new Date() ; h = datedujour.getHours(); m = datedujour.getMinutes(); if (h<10) {h = '0' + h;} ; if (m<10) {m = '0' + m;} ; heure_courante = h + 'h' + m ; $('note_" + i + "').value += 'Arrivé(e) à ' + heure_courante + '. ';}\" /></td>";
            // ****************************************************************** -->
            tabindex++;
            liste_eleves += "<td align=\"center\" width=\"80px\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\"><input type=\"checkbox\" id=\"coche_exclu_" + i + "\" name=\"coche_exclu_" + i + "\" value=\"3\" tabindex=\"" + tabindex + "\"";
            if (eleve_exclu == true) {
              liste_eleves += " checked=\"checked\"";
            }
            liste_eleves += " onclick=\"$('coche_absent_" + i + "').checked=false; $('coche_retard_" + i + "').checked=false; $('coche_parti_" + i + "').checked=false; if ($('coche_exclu_" + i + "').checked==true) {datedujour = new Date() ; h = datedujour.getHours(); m = datedujour.getMinutes(); if (h<10) {h = '0' + h;} ; if (m<10) {m = '0' + m;} ; heure_courante = h + 'h' + m ; $('note_" + i + "').value += 'Exclu(e) à ' + heure_courante + '. ';}\" /></td>";
            // ****************************************************************** -->
            tabindex++;
            liste_eleves += "<td align=\"center\" width=\"80px\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\"><input type=\"checkbox\" id=\"coche_parti_" + i + "\" name=\"coche_parti_" + i + "\" value=\"4\" tabindex=\"" + tabindex + "\"";
            if (eleve_parti == true) {
              liste_eleves += " checked=\"checked\"";
            }
            liste_eleves += " onclick=\"$('coche_absent_" + i + "').checked=false; $('coche_retard_" + i + "').checked=false; $('coche_exclu_" + i + "').checked=false; if ($('coche_parti_" + i + "').checked==true) {datedujour = new Date() ; h = datedujour.getHours(); m = datedujour.getMinutes(); if (h<10) {h = '0' + h;} ; if (m<10) {m = '0' + m;} ; heure_courante = h + 'h' + m ; $('note_" + i + "').value += 'Parti(e) à ' + heure_courante + '. ';}\" /></td>";
            // ****************************************************************** -->
            tabindex++;
            liste_eleves += "<td align=\"center\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            expressionReguliere = new RegExp("\"","g"); // On remplace les " par des " codés &#34
            note = note.replace(expressionReguliere,"&#34");
            liste_eleves += "\"><input type=\"text\" name=\"note_" + i + "\" id=\"note_" + i + "\" value=\"" + note + "\" tabindex=\"" + tabindex + "\" size=\"60\" maxlength=\"100\"  title=\"Note sur l'absence, le retard, l'exclusion ou la sortie...\" onfocus=\"this.className='focus';\" onblur=\"this.className='normal';\" /></td>";
            // ****************************************************************** -->
            // Si c'est le CPE qui affiche cette liste, on permet le cochage/décochage pour régulariser :
            tabindex++;
            liste_eleves += "<td align=\"center\" width=\"80px\" class=\"";
            if (ligne_paire) {
              liste_eleves += "td_tableau4_cellule1";
            } else {
              liste_eleves += "td_tableau4_cellule4";
            }
            liste_eleves += "\"><input type=\"checkbox\" id=\"coche_regularisation_" + i + "\" name=\"coche_regularisation_" + i + "\" value=\"1\" tabindex=\"" + tabindex + "\"";
            if (regularisation == true) {
              liste_eleves += " checked=\"checked\"";
            }
            if ($("identifiant").value != "cpe") {
              liste_eleves += " style=\"display:none;\"";
            }
            liste_eleves += " onclick=\"if ($('coche_regularisation_" + i + "').checked==true) {datedujour = new Date() ; jour = datedujour.getDate(); if (jour<10) {jour = '0' + jour;}; mois = datedujour.getMonth() + 1; if (mois<10) {mois = '0' + mois;}; annee = datedujour.getFullYear(); date_courante = jour + '-' + mois + '-' + annee; h = datedujour.getHours(); m = datedujour.getMinutes(); if (h<10) {h = '0' + h;}; if (m<10) {m = '0' + m;}; heure_courante = h + 'h' + m ; $('note_" + i + "').value += 'Régularisation par le CPE le ' + date_courante + ' à ' + heure_courante + '. '};\" /></td>";
            // Fin de la ligne :
            liste_eleves += "</tr>";
            // ****************************************************************** -->
            if (ligne_paire) {
              ligne_paire = false;
            } else {
              ligne_paire = true;
            }
            // ****************************************************************** -->
          } // Fin du "if (tableau_enregistrements[i].length > 0) {""
        } // Fin du "for (i=0;i<tableau_enregistrements.length;i++) {"
        liste_eleves += "</table>";
        // ********************************************************************** -->
        // La liste est prête.
        // On stocke dans un champ INPUT caché le nombre d'élève pour pouvoir le récupérer
        // au moment de l'enregistrement :
        $("nombre_eleves_classe").value = tableau_enregistrements.length;
        // ********************************************************************** -->
        // On affiche la date et l'heure (écrasé par la suite si modif du bulletin) :
        if (bulletin_vide == true) {
          jour  = datedujour.getDate();
          if (jour<10) {jour = "0" + jour;}
          mois  = datedujour.getMonth() + 1;
          if (mois<10) {mois = "0" + mois;}
          annee = datedujour.getFullYear();
          date_courante = jour + "-" + mois + "-" + annee ;
          h     = datedujour.getHours();
          m     = datedujour.getMinutes();
          // On arrondit l'heure à l'heure la plus proche :
          if (m>=50) {h++}
          m = 0;
          if (h<10) {h = "0" + h;}
          if (m<10) {m = "0" + m;}
          heure_courante = h + ":" + m ;
          $("date_bulletin_appel").value = date_courante;
          $("heure_bulletin_appel").value = heure_courante;
        } else {
          $("date_bulletin_appel").value = date;
          $("heure_bulletin_appel").value = heure.substring(0,5);
          var liste_num = "";
          var liste_vide = true;
          for (i=0;i<liste_num_table_absences_retards.length;i++) {
            if (liste_vide == false) {
              liste_num+= ",";
            } else {
              liste_vide = false;
            }
            liste_num+= liste_num_table_absences_retards[i];
          }
          $("liste_num_table_absences_retards").value = liste_num;
        }
        // ********************************************************************** -->
        // Affichage de la liste :
        $("p_liste_eleves").innerHTML = liste_eleves;
        $("div_bulletin_appel").style.display = "block";
        // Fini !
      }
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function tout_cocher_regularisation() {
  // On récupère le nombre d'élèves présents dans la liste, pour faire la boucle :
  var nombre_eleves_classe = $("nombre_eleves_classe").value;
  // On exécute une boucle pour cocher tous les élèves :
  for (i=0;i<nombre_eleves_classe;i++) {
    // On ne coche que les cases qui correspondent à une absence, un retard, etc...
    if ($("coche_absent_" + i).checked == true || $("coche_retard_" + i).checked == true || $("coche_exclu_" + i).checked == true || $("coche_parti_" + i).checked == true) {
      $("coche_regularisation_" + i).checked="checked";
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function tout_decocher_regularisation() {
  // On récupère le nombre d'élèves présents dans la liste, pour faire la boucle :
  var nombre_eleves_classe = $("nombre_eleves_classe").value;
  // On exécute une boucle pour cocher tous les élèves :
  for (i=0;i<nombre_eleves_classe;i++) {
    // On ne coche que les cases qui correspondent à une absence, un retard, etc...
    $("coche_regularisation_" + i).checked=0;
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function afficher_photo(photo) {
  dossier_photos = 'photos/';
  fenetre_photo=open('','','width=200, height=267, toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no');
  fenetre_photo.document.write('<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"><head><title>Photo</title></head><body><img class="img_border1_margpad0" src="' + dossier_photos + photo + '" alt="Photo" /></body></html>');
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function trombinoscope() {
  num_division = $("division").value;
  if (num_division <= 0) {
    alert("Il faut sélectionner une classe pour accéder au trombinoscope !");
  } else {
    fenetre_trombinoscope=open("trombinoscope2.php?division="+num_division,"","width=1024, height=768, toolbar=yes, location=yes, directories=yes, status=yes, menubar=yes, scrollbars=yes, resizable=yes");  
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function annuler_bulletin_appel() {
    $("div_bulletin_appel").style.display = "none";
    $("div_bouton_appel").style.display = "block";
    $("div_bouton_bulletins").style.display = "block";
    $("p_liste_eleves").innerHTML = "";
    $("p_affichage_bulletin_appel").innerHTML = "";
    $("liste_num_table_absences_retards").value = "";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function annuler_bulletin_appel() {
    $("div_bulletin_appel").style.display = "none";
    $("div_bouton_appel").style.display = "block";
    $("div_bouton_bulletins").style.display = "block";
    $("p_liste_eleves").innerHTML = "";
    $("p_affichage_bulletin_appel").innerHTML = "";
    $("liste_num_table_absences_retards").value = "";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function enregistrer_bulletin_appel() {
  if (identifiant_eleve || identifiant_parent) {
    alert("Le bulletin d'appel n'est pas accessible aux élèves !");
  } else if (identifiant_prof) {
    if ($("date_bulletin_appel").value.length == 0) {
      alert("Vous devez spécifier une date !");
    } else if ($("heure_bulletin_appel").value.length == 0) {
      alert("Vous devez spécifier une heure !");
    } else {
      // Vérification de la date :
      var expressionReguliere = new RegExp("^[0-9]{2}[-]{1}[0-9]{2}[-]{1}[0-9]{4}");
      if ($("date_bulletin_appel").value.match(expressionReguliere)) {
        // Vérification de l'heure :
        var expressionReguliere = new RegExp("^[0-9]{2}[:]{1}[0-9]{2}");
        if ($("heure_bulletin_appel").value.match(expressionReguliere)) {
          // ******************************************************************** -->
          // Les dates et heures sont correctes, on peut ENREGISTRER LE BULLETIN D'APPEL
          // ******************************************************************** -->
          // On récupère l'identifiant et le mot de passe de l'utilisateur :
          var identifiant = $("identifiant").value;
          var mdp = hex_md5($("mdp").value);
          // On récupère les données nécessaires à l'insertion de l'enregistrement :
          var nombre_eleves_classe = $("nombre_eleves_classe").value;
          var division = $("division").value;
          var matiere  = $("matiere").value;
          var groupe   = $("groupe").value;
          var date = $("date_bulletin_appel").value;
          var heure = $("heure_bulletin_appel").value;
          var liste_num_table_absences_retards = $("liste_num_table_absences_retards").value;
          if (liste_num_table_absences_retards == "") {
            liste_num_table_absences_retards = "vide";
          }
          $("liste_num_table_absences_retards").value = "";
          // Variables locales utilisées
          var id_elenoet = "";
          var id_coche_absent = "";
          var id_coche_retard = "";
          var id_coche_exclu  = "";
          var id_coche_parti  = "";
          var id_coche_regularisation = "";
          var id_note = "";
          var tableau_elenoet = new Array();
          var tableau_type_absence_retard = new Array();
          var tableau_regularisation = new Array();
          var tableau_note = new Array();
          var nombre_eleves_bulletin = 0; // Nombre d'élèves cochés sur le bulletin.
          // ******************************************************************** -->
          // Boucle de scrutation des cases à cocher.
          for (var i=0;i<nombre_eleves_classe;i++) {
            id_elenoet = "elenoet_" + i;            // On fabrique les id des éléments du formulaire.
            id_coche_absent = "coche_absent_" + i;
            id_coche_retard = "coche_retard_" + i;
            id_coche_exclu  = "coche_exclu_"  + i;
            id_coche_parti  = "coche_parti_"  + i;
            id_coche_regularisation = "coche_regularisation_"  + i;
            id_note = "note_" + i;
            if ($(id_coche_absent).checked == true || $(id_coche_retard).checked == true || $(id_coche_exclu).checked == true || $(id_coche_parti).checked == true) {
              // Cases "Absent" ou "Retard" cochées :
              tableau_elenoet[nombre_eleves_bulletin] = $(id_elenoet).value;
              if ($(id_coche_absent).checked == true) {
                // Case "Absent" cochée :
                tableau_type_absence_retard[nombre_eleves_bulletin] = 1;
              } else if ($(id_coche_retard).checked == true) {
                // Case "Retard" cochée :
                tableau_type_absence_retard[nombre_eleves_bulletin] = 2;
              } else if ($(id_coche_exclu).checked == true) {
                // Case "Exclu" cochée :
                tableau_type_absence_retard[nombre_eleves_bulletin] = 3;
              } else if ($(id_coche_parti).checked == true) {
                // Case "Parti(e)" cochée :
                tableau_type_absence_retard[nombre_eleves_bulletin] = 4;
              }
              tableau_note[nombre_eleves_bulletin] = encodage_caracteres($(id_note).value);
              // Régularisation :
              if ($(id_coche_regularisation).checked == true) {
                // Case "Regularisation" cochée :
                tableau_regularisation[nombre_eleves_bulletin] = '1';
              } else {
                // Case "Regularisation" non cochée :
                tableau_regularisation[nombre_eleves_bulletin] = '0';
              }
              nombre_eleves_bulletin++;
            } else {
              // Pas de case cochée :
              // Cet élève n'étant ni absent ni en retard ni exclu, il n'est pas envoyé...
            }
          }
          // ******************************************************************** -->
          // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
          var zone_affichage_message = "p_affichage_bulletin_appel";
          // Fichier php à appeler :
          var fichier_php_a_appeler = "cdtxt_enregistrement_bulletin_appel.php";
          // Paramètres à passer au fichier php :
          var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
          parametres += "&nombre_eleves_bulletin=" + nombre_eleves_bulletin;
          parametres += "&division=" + division + "&matiere=" + matiere + "&groupe=" + groupe;
          parametres += "&date=" + date + "&heure=" + heure;
          parametres += "&elenoet=" + tableau_elenoet + "&type=" + tableau_type_absence_retard;
          parametres += "&note=" + tableau_note;
          parametres += "&regularisation=" + tableau_regularisation;
          parametres += "&liste_num_table_absences_retards=" + liste_num_table_absences_retards;
          // Fonction de traitement du résultat de la requête :
          var fonction_resultat = "enregistrer_bulletin_appel2(\"" + zone_affichage_message + "\"," + nombre_eleves_classe + "," + nombre_eleves_bulletin + ")";
          // Requête XMLHttpRequest :
          requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
          // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
          // ******************************************************************** -->
        } else {
          // Le format de l'heure n'est pas correct :
          alert("Veuillez spécifier l'heure avec le bon format.\nLe format doit être : HH:MM");
          // On passe le focus au champ concerné par cette erreur :
          $("heure_bulletin_appel").focus();
        }
        // ********************************************************************** -->
      } else {
        // Le format de la date n'est pas correct :
        alert("Veuillez spécifier la date avec le bon format.\nLe format doit être : JJ-MM-AAAA");
        // On passe le focus au champ concerné par cette erreur :
        $("date_bulletin_appel").focus();
      }
    }
  }
}
// ****************************************************************************** -->
function enregistrer_bulletin_appel2(zone_affichage_message,nombre_eleves_classe,nombre_eleves_bulletin) {
  // Récupération des données :
  // On vérifie le mot de passe :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // La requête de mise à jour (update) a été lancée :
      if (reponses[1]=="enregistrement_ok") {
        $(zone_affichage_message).innerHTML = "<b>Le bulletin d'appel a été mis à jour</b> : " + reponses[3] + " élève(s) concerné(e)(s) sur " + nombre_eleves_classe + " élèves au total.\n";
        // reponses[3] = $nb_eleves du fichier PHP.
        // On masque la liste avec les coches et on réaffiche les boutons :
        $("div_bulletin_appel").style.display = "none";
        $("div_bouton_appel").style.display = "block";
        $("div_bouton_bulletins").style.display = "block";
        // ********************************************************************** -->
// A FAIRE              // Le traitement étant terminé, on propose maintenant de régulariser toutes les autres
        // absences, retard, etc...
// Modalbox.show('boitededialogue.html', {title: 'Confirmation', width: 500});
        // ********************************************************************** -->
      } else {
        if (reponses[2] == 0) {  // reponses[2] = $nb_requetes_effectuees du fichier PHP.
          $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le bulletin d'appel n'a pas été traité</b>. Contacter l'administrateur.";
        } else {
          $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le bulletin d'appel n'a été que partiellement traité</b> (" + reponses[2] + " élève(s) sur " + nombre_eleves_bulletin + ", avec " + reponses[3] + " requêtes INSERT effectuées). Contacter l'administrateur.";
        }
      }
    }
  } else if (reponses[0]=="faux") {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le bulletin d'appel n'a pas été enregistré.</b>.";
  } else {
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_enregistrement_bulletin_appel.php' (sans doute une erreur de syntaxe ou une réponse vide). <b>Le bulletin d'appel n'a pas été enregistré.</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function effacer_date_cpe_bulletins_appel() {
  $("date_cpe_bulletins_appel").value = "";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function datedujour_cpe_bulletins_appel() {
  var datedujour = new Date();
  var jour  = datedujour.getDate();
  if (jour<10) jour = "0" + jour;
  var mois  = datedujour.getMonth() + 1;
  if (mois<10) mois = "0" + mois;
  var annee = datedujour.getFullYear();
  var date_courante = jour + "-" + mois + "-" + annee;
  $("date_cpe_bulletins_appel").value = date_courante;
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function voir_bulletins_appels() {
  var num_division = $("division").value;
  var num_matiere = $("matiere").value;
  var num_groupe = $("groupe").value;
  var format_date_ok = true;
  var liste_complete = false;
  var liste_par_division = false;
  var date = 0;
  if ($("identifiant").value == "cpe") {
    if (num_division == 0 && num_matiere == 0 && num_groupe == 0) {
      var liste_complete = true;
    } else if (num_division != 0 && num_matiere == 0 && num_groupe == 0) {
      var liste_par_division = true;
    }
  } else {
    if (num_groupe == 0) {
      liste_par_division = true;
    }
  }
  if ($("date_cpe_bulletins_appel").value.length == 0) {
    date = 0;
  } else {
    var date = $("date_cpe_bulletins_appel").value;
    // Dans le cas où il s'agit du CPE et qu'il a spécifié une date, il faut qu'elle soit au bon format :
    // Vérification de la date :
    var expressionReguliere = new RegExp("^[0-9]{2}[-]{1}[0-9]{2}[-]{1}[0-9]{4}");
    if (!date.match(expressionReguliere)) {
      format_date_ok = false;
    }
  }
  if (format_date_ok == true) {
    // La date n'a pas été spécifiée (liste complète demandée par le cpe ou liste demandée par un prof) 
    // ou la date a été spécifiée par le CPE et est au bon format :
    if ((num_division == 0 || num_matiere == 0) && liste_complete == false && liste_par_division == false) {
      // Si on n'est pas dans le cas d'une liste complète ou d'une liste par division (CPE) :
      // Si la division ou la matière n'ont pas été sélectionnées :
      if (identifiant_eleve) {
        alert("Vous devez sélectionner une matière !");
      } else if (identifiant_prof || identifiant_parent) {
        alert("Vous devez sélectionner une division et une matière !");
      }
    } else {
      // La division et la matière ont été sélectionnées ou c'est une liste complète :
      // ************************************************************************ -->
      // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
      var zone_affichage_message = "p_affichage_bulletin_appel";
      // Fichier PHP à appeler : "cdtxt_liste_bulletins_appels.php?liste_complete=...&division=...&matiere=...&groupe=..."
      var fichier_php_a_appeler = "cdtxt_liste_bulletins_appels.php";
      // Paramètres à passer au fichier php :
      var parametres = "liste_complete=" + liste_complete + "&liste_par_division=" + liste_par_division + "&date=" + date + "&num_division=" + num_division + "&num_matiere=" + num_matiere + "&num_groupe=" + num_groupe;
      if (identifiant_eleve) {
        // Pour un élève, on transmet son elenoet, pour que ne s'affichent
        // que les bulletins qui le concernent.
        parametres += "&elenoet=" + $("identifiant").value
      } else if (identifiant_parent) {
        // Pour les parents, on transmet l'elenoet sélectionné dans la liste
        // des enfants de ce parent.
        parametres += "&elenoet=" + $("eleve").value
      }
      // Fonction de traitement du résultat de la requête :
      var fonction_resultat = "voir_bulletins_appels2(\"" + zone_affichage_message + "\"," + liste_complete + "," + liste_par_division + "," + num_division + "," + num_matiere + "," + num_groupe + ")";
      // Requête XMLHttpRequest :
      requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
      // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
      // ************************************************************************ -->
    }
  } else {
    // Le format de la date n'est pas correct :
    alert("Veuillez spécifier la date avec le bon format.\nLe format doit être JJ-MM-AAAA.");
    // On passe le focus au champ concerné par cette erreur :
    $("date_cpe_bulletins_appel").focus();
  }
}
// ****************************************************************************** -->
function voir_bulletins_appels2(zone_affichage_message,liste_complete,liste_par_division,num_division,num_matiere,num_groupe) {
  // Récupération des données :
  if (reponse_requete_XMLHttpRequest == "liste_bulletins_vide") {
    // Pas d'enregistrements reçus :
    $(zone_affichage_message).innerHTML = "Pas de bulletins d'appel...";
  } else {
    // Enregistrements reçus :
    if (reponse_requete_XMLHttpRequest.substring(0,4) == "<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponse_requete_XMLHttpRequest;
    } else {
      // La réponse ne commence pas par "<div", c'est la liste attendue...
      // ************************************************************************ -->
      // On découpe la chaîne pour récupérer les enregistrements :
      var expressionReguliere = new RegExp("####","g"); // Découpage des enregistrements
      var tableau_enregistrements = reponse_requete_XMLHttpRequest.split(expressionReguliere);
      // ************************************************************************ -->
      // Initialisation des variables locales :
      var tableau_champs = new Array();
      var division = "";
      var matiere = "";
      var groupe = "";
      var division_matiere_groupe = "";
      var division_matiere_groupe_precedents = "";
      var nom_prenom_prof = "";
      var nom_prenom_prof_precedent = "";
      var regularisation = "";
      var elenoet = "";
      var nom_prenom_eleve = "";
      var type_absence_retard = "";
      var note = "";
      var date = "";
      var heure = "";
      var date_heure = "";
      var date_heure_precedente = "";
      var date_saisie = "";
      var heure_saisie = "";
      var date_heure_saisie = "";
      var heure_saisie_en_minutes = 0;
      var date_heure_saisie_precedente = "";
      var i=0; // Ligne : TR
      var class_td = "td_tableau4_cellule1";
      // ************************************************************************ -->
      // Entêtes de la table :
      var liste_bulletins = "<table class=\"table_tableau4_collapse\"><tr class=\"tr_tableau4_ligne1\">";
      if (liste_complete == true || liste_par_division == true) {
        liste_bulletins += "<th class=\"th_tableau4_titre1l\">Division - Matière - Groupe</th>";
      }
      // liste_bulletins += "<th class=\"th_tableau4_titre1l\">Professeur</th><th class=\"th_tableau4_titre1l\">Date et heure du bulletin</th><th class=\"th_tableau4_titre1l\">Elève</th><th class=\"th_tableau4_titre1l\">Abs/Retard/Exclu/Parti</th><th class=\"th_tableau4_titre1l\">Note</th><th class=\"th_tableau4_titre1l\"";
      liste_bulletins += "<th class=\"th_tableau4_titre1l\">Professeur</th><th class=\"th_tableau4_titre1l\"";
      if (identifiant_prof) {
        // Pour les profs, une colonne de plus pour affichage de l'icone de modification :
        liste_bulletins += " colspan=\"2\"";
        // Pour les profs, il faut récupérer la date du jour pour savoir si le bulletin
        // peut être modifié (on peut le modifier dans les 2 heures qui suivent la saisie) :
        var dateheuredujour = new Date();
        var jour  = dateheuredujour.getDate();
        if (jour<10) jour = "0" + jour;
        var mois  = dateheuredujour.getMonth() + 1;
        if (mois<10) mois = "0" + mois;
        var annee = dateheuredujour.getFullYear();
        var date_courante = jour + "-" + mois + "-" + annee;
        var h = dateheuredujour.getHours();
        var m = dateheuredujour.getMinutes();
        var heure_courante = h + ":" + m;
        var heure_courante_en_minutes = parseInt(h) * 60 + parseInt(m);
      }
      liste_bulletins += ">Date et heure du bulletin</th><th class=\"th_tableau4_titre1l\">Date et heure de saisie</th><th class=\"th_tableau4_titre1l\">Régul.</th><th class=\"th_tableau4_titre1l\">Elève</th><th class=\"th_tableau4_titre1l\">Motif</th><th class=\"th_tableau4_titre1l\">Note</th></tr>";
      // ************************************************************************ -->
      // Affichage des bulletins :
      for (i=0;i<tableau_enregistrements.length;i++) {
        if (tableau_enregistrements[i].length > 0) {
          // L'enregistrement ne doit pas être vide...
          // Découpage des champs de l'enregistrement :
          expressionReguliere = new RegExp("###","g");
          tableau_champs = tableau_enregistrements[i].split(expressionReguliere);
          // On récupère les données dans le tableau  :
          if (liste_complete == true || liste_par_division == true) {
            //   Si liste complète ou par division :
            //     tableau_champs[0]  : num_division
            //     tableau_champs[1]  : division
            //     tableau_champs[2]  : num_matiere
            //     tableau_champs[3]  : matiere
            //     tableau_champs[4]  : num_groupe
            //     tableau_champs[5]  : groupe
            //     tableau_champs[6]  : nom_prof
            //     tableau_champs[7]  : prenom_prof
            //     tableau_champs[8]  : date bulletin
            //     tableau_champs[9]  : heure bulletin
            //     tableau_champs[10] : date_saisie
            //     tableau_champs[11] : heure_saisie
            //     tableau_champs[12] : regularisation
            //     tableau_champs[13] : elenoet
            //     tableau_champs[14] : nom_eleve
            //     tableau_champs[15] : prenom_eleve
            //     tableau_champs[16] : type
            //     tableau_champs[17] : note
            num_division        = tableau_champs[0];
            division            = tableau_champs[1];
            num_matiere         = tableau_champs[2];
            matiere             = tableau_champs[3];
            num_groupe          = tableau_champs[4];
            groupe              = tableau_champs[5];
            division_matiere_groupe = division + " - " + matiere + " - " + groupe;
            nom_prenom_prof     = tableau_champs[6] + " " + tableau_champs[7];
            date                = tableau_champs[8];
            heure               = tableau_champs[9];
            date_saisie         = tableau_champs[10];
            heure_saisie        = tableau_champs[11];
            regularisation      = tableau_champs[12];
            elenoet             = tableau_champs[13];
            nom_prenom_eleve    = tableau_champs[14] + " " + tableau_champs[15];
            type_absence_retard = tableau_champs[16];
            note                = tableau_champs[17];
            if (note == "-" || note == " ") {
              note ="";
            }
          } else {
            //   Si liste pas complète :
            //     tableau_champs[0]  : nom_prof
            //     tableau_champs[1]  : prenom_prof
            //     tableau_champs[2]  : date bulletin
            //     tableau_champs[3]  : heure bulletin
            //     tableau_champs[4]  : date_saisie
            //     tableau_champs[5]  : heure_saisie
            //     tableau_champs[6]  : regularisation
            //     tableau_champs[7]  : elenoet
            //     tableau_champs[8]  : nom_eleve
            //     tableau_champs[9]  : prenom_eleve
            //     tableau_champs[10] : type
            //     tableau_champs[11] : note
            nom_prenom_prof     = tableau_champs[0] + " " + tableau_champs[1];
            date                = tableau_champs[2];
            heure               = tableau_champs[3];
            date_saisie         = tableau_champs[4];
            heure_saisie        = tableau_champs[5];
            regularisation      = tableau_champs[6];
            elenoet             = tableau_champs[7];
            nom_prenom_eleve    = tableau_champs[8] + " " + tableau_champs[9];
            type_absence_retard = tableau_champs[10];
            note                = tableau_champs[11];
          }
          date_heure   = date + " " + heure;
          date_heure_saisie = date_saisie + " " + heure_saisie;
          // Style pour l'affichage (on permute les couleurs de fond à chaque bulletin) :
          if  (date_heure_saisie != date_heure_saisie_precedente) {
            // Changement de style des td :
            if (class_td == "td_tableau4_cellule1") {
              class_td = "td_tableau4_cellule4";
            } else {
              class_td = "td_tableau4_cellule1";
            }
          }
          // ******************************************************************** -->
          // Affichage :
          // ******************************************************************** -->
          liste_bulletins += "<tr>";
          // ******************************************************************** -->
          // Division, matière, groupe :
          if (liste_complete == true || liste_par_division == true) {
            liste_bulletins += "<td class=\"" + class_td + "\">";
            if  (division_matiere_groupe == division_matiere_groupe_precedents) {
              liste_bulletins += "&nbsp;";
            } else {
              liste_bulletins += division_matiere_groupe;
              division_matiere_groupe_precedents = division_matiere_groupe;
            }
            liste_bulletins += "</td>";
          }
          // ******************************************************************** -->
          // Nom du prof, prénom du prof
          liste_bulletins += "<td class=\"" + class_td + "\">";
          if  (nom_prenom_prof == nom_prenom_prof_precedent) {
            liste_bulletins += "&nbsp;";
          } else {
            liste_bulletins += nom_prenom_prof;
            nom_prenom_prof_precedent = nom_prenom_prof;
          }
          liste_bulletins += "</td>";
          // ******************************************************************** -->
          // Uniquement pour les profs, icone avec lien éventuel pour modification :
          if (identifiant_prof) {
            liste_bulletins += "<td width=\"12px\" class=\"" + class_td + "\">";
            if  (date_heure_saisie != date_heure_saisie_precedente) {
              // Inutile de répéter l'icone de modification s'il s'agit du même bulletin...
              // Si ce n'est pas le même bulletin :
              if (date_saisie == date_courante  || $("identifiant").value == "cpe") {
                // On ne peut modifier le bulletin que s'il est du jour ou que si l'on est le cpe...
                // On va maintenant voir s'il ne date pas de plus de 6 heures :
                if (heure_saisie.substring(0,1) == "0" ) {
                  // Si le premier chiffre de l'heure est un zéro, on ne prend que le deuxième.
                  h = heure_saisie.substring(1,2);
                } else {
                  // Si le premier chiffre de l'heure n'est pas un zéro, on prend les deux.
                  h = heure_saisie.substring(0,2);
                }
                if (heure_saisie.substring(3,4) == "0" ) {
                  // Si le premier chiffre des minutes est un zéro, on ne prend que le deuxième.
                  m = heure_saisie.substring(4,5);
                } else {
                  // Si le premier chiffre des minutes n'est pas un zéro, on prend les deux.
                  m = heure_saisie.substring(3,5);
                }
                heure_saisie_en_minutes = parseInt(h) * 60 + parseInt(m);
                if ((Math.abs(heure_courante_en_minutes - heure_saisie_en_minutes) <= 360) || ($("identifiant").value == "cpe")) {
                  // Si le bulletin ne date pas de plus de 6 heures, ou bien si on est le cpe,
                  // on afiche le bouton pour modifier.
                  liste_bulletins += "<a href=\"#\" onclick=\"remplir_bulletin_appel(" + num_division + "," + num_matiere  + "," + num_groupe + ",'" + date + "','" + heure + "','" + date_saisie + "','" + heure_saisie + "');\" title=\"Modifier ce bulletin\"><img src=\"images/modifier.gif\" alt=\"Modifier ce bulletin\" /></a>";
                } else {
                  liste_bulletins += "&nbsp;";
                }
              } else {
                liste_bulletins += "&nbsp;";
              }
            } else {
              liste_bulletins += "&nbsp;";
            }
            liste_bulletins += "</td>";
          }
          // ******************************************************************** -->
          // Date et heure du bulletin :
          liste_bulletins += "<td class=\"" + class_td + "\">";
          if  (date_heure == date_heure_precedente) {
            liste_bulletins += "&nbsp;";
          } else {
            liste_bulletins += date_heure;
            date_heure_precedente = date_heure;
          }
          liste_bulletins += "</td>";
          // ******************************************************************** -->
          // Date et heure saisie :
          liste_bulletins += "<td class=\"" + class_td + "\">";
          if  (date_heure_saisie == date_heure_saisie_precedente) {
            liste_bulletins += "&nbsp;";
          } else {
            liste_bulletins += date_heure_saisie;
          }
          liste_bulletins += "</td>";
          // ******************************************************************** -->
          // Régularisation :
          liste_bulletins += "<td class=\"" + class_td + "\">";
          if (regularisation == '1') {
            liste_bulletins += "<p class=\"p_ok\">Ok.</p>";
          } else if (regularisation == '0' && elenoet != '-1') {
            liste_bulletins += "<img src=\"point_exclamation_anime_01_16x16.gif\" width=\"16\" height=\"18\" alt=\"Non régularisé !\" title= \"Non régularisé !\" style=\"margin-top:3px; margin-right:5px;\" />";
          } else {
            // Ne rien aficher.
          }
          liste_bulletins += "</td>";
          // ******************************************************************** -->
          // Nom et prénom élève :
          liste_bulletins += "<td class=\"" + class_td + "\">" + nom_prenom_eleve + "</td>";
          // ******************************************************************** -->
          // Type (motif) :
          liste_bulletins += "<td class=\"" + class_td + "\">";
          liste_bulletins += "<p";
          if (regularisation == "0") {
            liste_bulletins += " class=\"p_exclu\"";
          }
          liste_bulletins += ">";
          if (type_absence_retard == "1") {
            liste_bulletins += "Absent(e)";
          } else if (type_absence_retard == "2") {
            liste_bulletins += "Retard";
          } else if (type_absence_retard == "3") {
            liste_bulletins += "Exclu(e)";
          } else if (type_absence_retard == "4") {
            liste_bulletins += "Parti(e)";
          } else {
            liste_bulletins += "&nbsp;";
          }
          liste_bulletins += "</p></td>";
          // ******************************************************************** -->
          // Note :
          liste_bulletins += "<td class=\"" + class_td + "\">" + note + "</td>";
          // ******************************************************************** -->
          liste_bulletins += "</tr>";
          // ******************************************************************** -->
          // ******************************************************************** -->
          if  (date_heure_saisie != date_heure_saisie_precedente) {
            date_heure_saisie_precedente = date_heure_saisie;
          }
          // ******************************************************************** -->
        }
      } // Fin du for
      liste_bulletins += "</table>";
      liste_bulletins += "<p>";
      if (identifiant_prof) {
        liste_bulletins += "Vous pouvez modifier les bulletins d'appel dans les 6 heures qui suivent leur saisie initiale. Ils sont ensuite verrouillés et ne pourront être modifiés que par le CPE. Pour modifier un bulletin, cliquez sur l'icone : <img src=\"images/modifier.gif\" alt=\"Icone\" /> qui se trouve devant.<br />";
      }
      liste_bulletins += "Le point d'interrogation <img src=\"point_exclamation_anime_01_16x16.gif\" alt=\"Point d'exclamation\" /> éventuellement placé devant le nom d'un élève signale que ce dernier n'a pas régularisé sa situation à la vie scolaire.<br />";
      liste_bulletins += "S'il n'y a pas de groupe spécifié, c'est qu'il s'agit d'un cours en classe entière.</p>";
      $(zone_affichage_message).innerHTML = liste_bulletins;
      // Les enregistrement sont récupérés !
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// CAHIERS DE TEXTE
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_cahier_de_texte(type_cdtxt) {
  if (archives_cdtxt == true) {
    type_cdtxt = "archives";
    var annee_scolaire = $("annee_scolaire").value;
    var prof = $("prof").value;
  }
  var division = $("division").value;
  var matiere = $("matiere").value;
  var groupe = $("groupe").value;
  if (type_cdtxt == 'complet' && division == 0) {
    // Cahier de texte complet : il faut sélectionner la division.
    alert("Vous devez sélectionner une division !");
  } else if (type_cdtxt != 'complet' && type_cdtxt != 'archives' && (division == 0 || matiere == 0)) {
    // Cahier de texte individuel : il faut sélectionner la division et la matière.
    alert("Vous devez sélectionner une division et une matière !");
  } else {
    // ************************************************************************** -->
    // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
      var zone_affichage_message = "p_message_erreur_zone_divmatgrp";
    // Fichier PHP à appeler : "cdtxt_groupe.php?division=...&matiere=...&groupe=..."
    // pour recevoir les listes d'options correspondant à l'élève et à la matière ou au groupe sélectionné.
    var fichier_php_a_appeler = "cdtxt_cahier_de_texte.php";
    // Paramètres à passer au fichier php :
    var parametres = "type=" + type_cdtxt;
    if (archives_cdtxt == true) {
      parametres += "&annee_scolaire=" + annee_scolaire +"&prof=" + encodage_caracteres(prof);
    }
    parametres += "&division=" + encodage_caracteres(division) + "&matiere=" +encodage_caracteres( matiere) + "&groupe=" + encodage_caracteres(groupe);
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "recuperer_cahier_de_texte2(\"" + zone_affichage_message + "\",\"" + type_cdtxt + "\")";
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
  }
}
// ****************************************************************************** -->
function recuperer_cahier_de_texte2(zone_affichage_message,type_cdtxt) {
  // Fichier récupéré, récupération des données :
  //
  if (reponse_requete_XMLHttpRequest == "cahier_de_texte_vide") {
    // Pas d'enregistrements reçus :
    $("p_affichage_cahier_de_texte").innerHTML = "Cahier de texte vide...";
  } else {
    // Enregistrements reçus :
    if (reponse_requete_XMLHttpRequest.substring(0,4) == "<div") {
      // La réponse commence par "<p>", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponse_requete_XMLHttpRequest;
    } else {
      // La réponse ne commence pas par "<div", c'est la liste attendue...
      // On découpe la chaîne pour récupérer les enregistrements :
      var expressionReguliere = new RegExp("#####","g"); // Découpage des enregistrements
      var tableau_enregistrements = reponse_requete_XMLHttpRequest.split(expressionReguliere);
      var tableau_champs = new Array();
      var texte   = "";
      var afaire  = "";
      var fichier = "";
      var dossier_fichiers_joints = "fichiers_joints/"; // Répertoire contenant les fichiers joints
      var i=0; // Ligne : TR
      var cahier_de_texte = "<table class=\"table_tableau4\"><tr class=\"tr_tableau4_ligne1\"><th class=\"th_tableau4_titre1l\">";
      if (archives_cdtxt == true) {
        cahier_de_texte += "Entrée du cahier de texte";
      }else {
        cahier_de_texte += "Professeur";
      }
      cahier_de_texte += "</th><th class=\"th_tableau4_titre1l\">Date</th><th class=\"th_tableau4_titre1l\"";
      var tableau_rowspan = new Array();
      var matiere_prof_groupe_actuel = "";
      var matiere_prof_groupe_precedent = "";
      var k=0; // Pour le rowspan.
      if (identifiant_prof) { // Uniquement pour les profs.
        cahier_de_texte += " colspan=\"2\"";
        var datedujour = new Date();
        var date  = datedujour.getDate();
        if (date<10) date = "0" + date;
        var mois  = datedujour.getMonth() + 1;
        if (mois<10) mois = "0" + mois;
        var annee = datedujour.getFullYear();
        var date_courante = date + "-" + mois + "-" + annee ;
      }
      cahier_de_texte += ">Travail effectué / à faire :</th></tr>";
      // ************************************************************************ -->
      // Lecture des enregistrements :
      //   On va tout d'abord lire une première fois tous les enregistrements pour repérer les
      //   changements de "Matière / prof / groupe" afin de pouvoir gérer les affichages (on n'affiche
      //   le "Matière / prof / groupe" qu'une fois, on évite de le répéter à chaque ligne) et pour
      //   cela, il faut savoir le nombre total de lignes concernées pour donner la valeur du ROWSPAN.
      // Principe d'utilisation du tableau tableau_rowspan[] :
      //   i   tableau_rowspan[i]  "Matière / prof / groupe"
      //   0            4           Maths / LEMONT / BTS1gr1
      //   1            0           Maths / LEMONT / BTS1gr1
      //   2            0           Maths / LEMONT / BTS1gr1
      //   3            0           Maths / LEMONT / BTS1gr1
      //   4            3           Maths / LEMONT / BTS1gr2
      //   5            0           Maths / LEMONT / BTS1gr2
      //   6            0           Maths / LEMONT / BTS1gr2
      //   7            2           Physique / FERRAGE / BTS1
      //   8            0           Physique / FERRAGE / BTS1
      //   etc...
      k = 0; // Indice de la ligne contenant la valeur du rowspan (valeur stockée dans tableau_rowspan[])
             // (les autres lignes ont pour valeur 0).
      for (i=0;i<tableau_enregistrements.length;i++) {
        if (tableau_enregistrements[i].length > 0) {
          // L'enregistrement ne doit pas être vide...
          // Découpage des champs de l'enregistrement :
          expressionReguliere = new RegExp("####","g");
          tableau_champs = tableau_enregistrements[i].split(expressionReguliere);
          // ******************************************************************** -->
          // On récupère alors le contenu suivant :
          //   Si type_cdtxt != 'complet' cela donne : $label_matiere####$label_groupe####
          // tableau_champs[] :                              0                 1
          //   Si type_cdtxt != 'complet' cela donne : " #### ####"
          // tableau_champs[] :                         0    1
          // puis :
          //                     $nom####$prenom####$date####$texte_html####$fichier####$date_saisie####$num
          // tableau_champs[] :    2         3        4           5            6             7            8
          // ******************************************************************** -->
          // Test :
          if (type_cdtxt == 'complet' || type_cdtxt == 'archives') {
            matiere_prof_groupe_actuel = tableau_champs[0] + tableau_champs[1] + tableau_champs[2] + tableau_champs[3];
          } else {
            matiere_prof_groupe_actuel = tableau_champs[2] + tableau_champs[3];
          }
          if (i == 0) {
            // Première ligne : ce sera forcément un premier ROWSPAN.
            k = i;
            matiere_prof_groupe_precedent = matiere_prof_groupe_actuel;
          } else {
            if (matiere_prof_groupe_actuel == matiere_prof_groupe_precedent) {
              // Même "Matière / prof / groupe", on indique cela dans le tableau.
              tableau_rowspan[i] = 0;
              // On continue, on passe à la ligne suivante (i)...
            } else {
              // On change de "Matière / prof / groupe" :
              tableau_rowspan[k] = i - k; // C'est la valeur du rowspan qu'il faut indiquer
              // à la première ligne du regroupement.
              k = i; // On repart pour un nouveau regroupement de "Matière / prof / groupe".
              //
              matiere_prof_groupe_precedent = matiere_prof_groupe_actuel;
            }
          }
        }  // Fin du if (tableau_enregistrements[i].length > 0)
      } // Fin du for
      // On arrive à la fin du tableau : il faut renseigner le dernier rowspan :
      tableau_rowspan[k] = i - k + 1;
      // ************************************************************************ -->
      // On relit une deuxième fois les enregistrements pour les afficher (maintenant
      // que l'on connait les valeurs des ROWSPAN) :
      for (i=0;i<tableau_enregistrements.length;i++) {
        if (tableau_enregistrements[i].length > 0) {
          // L'enregistrement ne doit pas être vide...
          // Découpage des champs de l'enregistrement :
          expressionReguliere = new RegExp("####","g");
          tableau_champs = tableau_enregistrements[i].split(expressionReguliere);
          // Affichage :
          cahier_de_texte += "<tr>";
          if (tableau_rowspan[i] > 0) {
            // ****************************************************************** -->
            // Première ligne :
            // on indique dans la première cellule le bon rowspan :
            cahier_de_texte += "<td rowspan=\"" + tableau_rowspan[i] + "\" class=\"td_tableau4_cellule1\">";
            // Puis le "Matière / prof / groupe"
            if (type_cdtxt == 'complet' || type_cdtxt == 'archives') {
              cahier_de_texte += "<b>" + tableau_champs[0] + "</b><br />" + tableau_champs[2] + " " + tableau_champs[3] + "<br />" + tableau_champs[1];
            } else {
              // Nom et prénom du prof :
              cahier_de_texte += tableau_champs[2] + " " + tableau_champs[3];
            }
            // Fin de la première cellule.
            cahier_de_texte += "</td>";
          }
          // ******************************************************************** -->
          // Deuxième cellule : date :
          cahier_de_texte += "<td class=\"td_tableau4_cellule2\">" + tableau_champs[4] + "</td>";
          // ******************************************************************** -->
          // Troisième cellule : texte, fichier joint, abscences+retards+exclusions+partis, à faire :
          //
          // Texte :
          texte = tableau_champs[5];
//expressionReguliere = new RegExp(String.fromCharCode(10),"g"); // LF
//texte = texte.replace(expressionReguliere,"<br />");
// alert(texte);
          cahier_de_texte += "<td class=\"td_tableau4_cellule5\">" + texte;
          //
          // Fichier joint :
          if (tableau_champs[6] != " ") {
            cahier_de_texte += "<p class=\"p_petit-texte_gauche\"><b>Fichier joint</b> : <a href=\"" + dossier_fichiers_joints + tableau_champs[6] + "\">" + tableau_champs[6] + "</a></p>";
          }
          //
          // Absences :
          if (tableau_champs[9].substring(0,4) == "<div") {
            // La réponse commence par "<div", c'est un message d'erreur...
            $(zone_affichage_message).innerHTML = tableau_champs[9];
          } else {
            // La réponse ne commence pas par "<div", c'est la liste attendue...
            if (tableau_champs[9] != "bulletin_appel_absences_vide") {
              expressionReguliere = new RegExp("###","g");
              var tableau_absences = tableau_champs[9].split(expressionReguliere);
              var premier_eleve = true;
              for (j=0;j<tableau_absences.length;j++) {
                expressionReguliere = new RegExp("##","g");
                tableau_eleves = tableau_absences[j].split(expressionReguliere);
                if (premier_eleve == true) {
                  cahier_de_texte += "<p class=\"p_petit-texte_gauche\"><b>Elève(s) absent(s)</b> :";
                  premier_eleve = false;
                }
                cahier_de_texte += " " + tableau_eleves[0] + " " + tableau_eleves[1] + " (" + tableau_eleves[2] + ")";
              }
              cahier_de_texte += "</p>";
            }
          }
          // Retards :
          if (tableau_champs[10].substring(0,4) == "<div") {
            // La réponse commence par "<div", c'est un message d'erreur...
            $(zone_affichage_message).innerHTML = tableau_champs[10];
          } else {
            // La réponse ne commence pas par "<div", c'est la liste attendue...
            if (tableau_champs[10] != "bulletin_appel_retards_vide") {
              expressionReguliere = new RegExp("###","g");
              var tableau_retards = tableau_champs[10].split(expressionReguliere);
              premier_eleve = true;
              for (j=0;j<tableau_retards.length;j++) {
                expressionReguliere = new RegExp("##","g");
                tableau_eleves = tableau_retards[j].split(expressionReguliere);
                if (premier_eleve == true) {
                  cahier_de_texte += "<p class=\"p_petit-texte_gauche\"><b>Elève(s) en retard</b> :";
                  premier_eleve = false;
                }
                cahier_de_texte += " " + tableau_eleves[0] + " " + tableau_eleves[1] + " (" + tableau_eleves[2] + ")";
              }
              cahier_de_texte += "</p>";
            }
          }
          // Exclusions :
          if (tableau_champs[11].substring(0,4) == "<div") {
            // La réponse commence par "<div", c'est un message d'erreur...
            $(zone_affichage_message).innerHTML = tableau_champs[11];
          } else {
            // La réponse ne commence pas par "<div", c'est la liste attendue...
            if (tableau_champs[11] != "bulletin_appel_retards_vide") {
              expressionReguliere = new RegExp("###","g");
              var tableau_retards = tableau_champs[11].split(expressionReguliere);
              premier_eleve = true;
              for (j=0;j<tableau_retards.length;j++) {
                expressionReguliere = new RegExp("##","g");
                tableau_eleves = tableau_retards[j].split(expressionReguliere);
                if (premier_eleve == true) {
                  cahier_de_texte += "<p class=\"p_petit-texte_gauche\"><b>Elève(s) exclus</b> :";
                  premier_eleve = false;
                }
                cahier_de_texte += " " + tableau_eleves[0] + " " + tableau_eleves[1] + " (" + tableau_eleves[2] + ")";
              }
              cahier_de_texte += "</p>";
            }
          }
          // Retards :
          if (tableau_champs[12].substring(0,4) == "<div") {
            // La réponse commence par "<div", c'est un message d'erreur...
            $(zone_affichage_message).innerHTML = tableau_champs[12];
          } else {
            // La réponse ne commence pas par "<div", c'est la liste attendue...
            if (tableau_champs[12] != "bulletin_appel_retards_vide") {
              expressionReguliere = new RegExp("###","g");
              var tableau_retards = tableau_champs[12].split(expressionReguliere);
              premier_eleve = true;
              for (j=0;j<tableau_retards.length;j++) {
                expressionReguliere = new RegExp("##","g");
                tableau_eleves = tableau_retards[j].split(expressionReguliere);
                if (premier_eleve == true) {
                  cahier_de_texte += "<p class=\"p_petit-texte_gauche\"><b>Elèves en retard</b> :";
                  premier_eleve = false;
                }
                cahier_de_texte += " " + tableau_eleves[0] + " " + tableau_eleves[1] + " (" + tableau_eleves[2] + ")";
              }
              cahier_de_texte += "</p>";
            }
          }
          //
          // A faire :
          afaire = tableau_champs[13];
          if (afaire != '' && afaire != ' ') {
            cahier_de_texte += "<div class=\"div_text_align_justifie_fond1\"><b>A faire</b> : ";
            cahier_de_texte += afaire;
            cahier_de_texte += "</div>";
          }
          // ******************************************************************** -->
          cahier_de_texte += "</td>";
          // ******************************************************************** -->
          // Quatrième cellule, uniquement pour les profs, lien éventuel pour modification
          // (on utilise alors le num) :
          if (identifiant_prof && type_cdtxt != 'complet' && type_cdtxt != 'archives') {
            cahier_de_texte += "<td width=\"12px\" class=\"td_tableau4_cellule1\">";
            // Modif 10/09/2008 : on peut modifier tout le temps le cahier de texte
            //if (tableau_champs[7] == date_courante) {
              cahier_de_texte += "<a href=\"#\" onclick=\"modification_enregistrement_cahier_de_texte(" + tableau_champs[8] + ");\" title=\"Modifier cet enregistrement\"><img src=\"images/modifier.gif\" alt=\"Modifier cet enregistrement\" /></a>";
              cahier_de_texte += "<a href=\"#\" onclick=\"suppression_enregistrement_cahier_de_texte(" + tableau_champs[8] + ");\" title=\"Supprimer cet enregistrement\"><img src=\"images/coche_pas-ok.gif\" alt=\"Supprimer cet enregistrement\" /></a>";
            //}
            cahier_de_texte += "</td>";
          }
          // ******************************************************************** -->
          cahier_de_texte += "</tr>";
        }
      } // Fin du for
      cahier_de_texte += "<tr><td colspan=\"4\">";
      // On place ces paragraphes dans une ligne du tableau et non pas en dehors du tableau, sinon
      // cela provoque une erreur avec MSIE...
      cahier_de_texte += "<p class=\"p_petit-texte_gauche\"><br />ASTUCE : ouvrez les fichiers joints dans une fenêtre séparée à l'aide d'un clic droit, ou bien en utilisant la combinaison : touche CTRL + clic gauche.</p>";
      //cahier_de_texte += "<p class=\"p_petit-texte_gauche\">NOTE : vous pouvez modifier une entrée du cahier de texte le jour même de la saisie. Le lendemain, le cahier de texte est verrouillé. Pour modifier une entrée, cliquez sur l'icone : <img src=\"images/modifier.gif\" alt=\"Icone\" /></p>";
      if (archives_cdtxt == false) {
        cahier_de_texte += "<p class=\"p_petit-texte_gauche\">NOTE : vous pouvez modifier une entrée du cahier de texte tout au long de l'année. Pour modifier une entrée, cliquez sur l'icone : <img src=\"images/modifier.gif\" alt=\"Icone\" /></p>";
      }
      cahier_de_texte += "</td></tr></table>";
      // On affiche les enregistrements du cahier de texte qui ont été récupérés !
      $("p_affichage_cahier_de_texte").innerHTML = cahier_de_texte;
    }
  }
  // Si on est dans les archives, il faut cacher le bouton d'actualisation :
  if (type_cdtxt == 'archives') {
    $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
  } else {
    // Si on n'est pas dans les archives et
    // si c'est un prof, il faut afficher le bouton d'actualisation :
    if (identifiant_prof && type_cdtxt != 'archives') {
      // Prof :
      $("div_bouton_actualiser_cahier_de_texte").style.display = "block";
    } else if (identifiant_eleve || identifiant_parent || type_cdtxt == 'archives') {
      // Si c'est un élève ou un parent, il faut le cacher :
      $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
    } else {
      alert ("ERREUR ! L'utilisateur n'est identifié ni en tant qu'élève, ni en tant que parent, ni en tant que prof.\n Contacter l'administrateur.");
    }
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function actualiser_cahier_de_texte() {
  if (identifiant_eleve || identifiant_parent) {
    alert("L'actualisation du cahier de texte n'est pas accessible aux élèves !");
  } else if (identifiant_prof) {
    // On vide la zone d'édition de l'éditeur tinyMCE
    tinyMCE.get('texte_cdtxt').setContent("");
    tinyMCE.get('afaire_cdtxt').setContent("");
    //
    var datedujour = new Date();
    var date  = datedujour.getDate();
    if (date<10) date = "0" + date;
    var mois  = datedujour.getMonth() + 1;
    if (mois<10) mois = "0" + mois;
    var annee = datedujour.getFullYear();
    $("date_cdtxt").value = date + "-" + mois + "-" + annee;
    $("texte_cdtxt").value = "";
    $("afaire_cdtxt").value = "";
    $("fichier_joint_serveur").value = "";
    $("div_actualisation_cahier_de_texte").style.display = "block";
    $("p_message_actualisation_cahier_de_texte").innerHTML = "";
    $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
    $("bouton_enregistrer_nouveau_cdtxt").style.display = "block";
    $("bouton_enregistrer_modif_cdtxt").style.display = "none";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function annuler_cahier_de_texte() {
  $("date_cdtxt").value = "";
  $("texte_cdtxt").value = "";
  $("afaire_cdtxt").value = "";
  $("div_actualisation_cahier_de_texte").style.display = "none";
  $("p_message_actualisation_cahier_de_texte").innerHTML = "";
  $("p_affichage_cahier_de_texte").innerHTML = "";
  $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
  $("div_actualisation_cahier_de_texte").style.display = "none";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function annuler_enregistrer_cahier_de_texte() {
  $("date_cdtxt").value = "";
  $("texte_cdtxt").value = "";
  $("afaire_cdtxt").value = "";
  $("div_actualisation_cahier_de_texte").style.display = "none";
  $("p_message_actualisation_cahier_de_texte").innerHTML = "";
  $("div_bouton_actualiser_cahier_de_texte").style.display = "block";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function enregistrer_cahier_de_texte() {
  //
  // On enregistre le nouveau texte qui vient d'être tapé.
  //
  if (identifiant_eleve || identifiant_parent) {
    alert("L'actualisation du cahier de texte n'est pas accessible aux élèves !");
  } else if (identifiant_prof) {
    // On bascule le contenu de l'iframe remplaçant le textearea vers la valeur de ce textarea 
    //  (TinyMCE utilise un iframe pour y placer le code html, qui remplace finalement le textarea, 
    //   dont la valeur reste nulle, si on n'utilise pas cette fonction).
    tinyMCE.triggerSave(true, true);
    // Maintenant, le contenu du textearea est dans : $("texte_cdtxt").value
    // TinyMCE a converti tous les caractères spéciaux en codes html (comme par exemple "&ccedil;"" pour le "ç"
    // ou "&gt;" pour le ">", etc) donc pas besoin de traiter ce texte (fonction encodage_caracteres(texte) 
    // inutile ici).
    if ($("date_cdtxt").value.length == 0) {
      alert("Vous devez spécifier une date !");
    } else if ($("texte_cdtxt").value.length == 0) {
      alert("Vous devez donner le texte !");
    } else {
      // Vérification de la date :
      var expressionReguliere = new RegExp("^[0-9]{2}[-]{1}[0-9]{2}[-]{1}[0-9]{4}");
      if ($("date_cdtxt").value.match(expressionReguliere)) {
        // ********************************************************************** -->
        // Les champs ont été renseignés et le format de la date est correct :
        // ********************************************************************** -->
        // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
        var identifiant = $("identifiant").value;
        var mdp = hex_md5($("mdp").value);
        // On récupère les données nécessaires à l'insertion de l'enregistrement :
        var date = $("date_cdtxt").value;
        var texte = $("texte_cdtxt").value;
        expressionReguliere = new RegExp("\"","g");          // On transforme les guillemets
        texte = texte.replace(expressionReguliere,"&quot;"); //  en &quot.
        texte = encodage_caracteres(texte); // S'il reste des caractères spéciaux qui risquent
        // de ne pas passer lors du passage des paramètres, on les transforme...
        var afaire = encodage_caracteres($("afaire_cdtxt").value);
        afaire = afaire.replace(expressionReguliere,"");
        var fichier = $("fichier_joint_serveur").value;
        var division = $("division").value;
        var matiere = $("matiere").value;
        var groupe = $("groupe").value;
        // ********************************************************************** -->
        // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
        var zone_affichage_message = "p_message_actualisation_cahier_de_texte";
        // Fichier PHP à appeler :
        // "cdtxt_actualisation_cahier_de_texte.php?identifiant=...&mdp=...&division=...
        //                                      &matiere=...&groupe=...&date=...&texte=...&afaire=..."
        var fichier_php_a_appeler = "cdtxt_actualisation_cahier_de_texte.php";
      // Paramètres à passer au fichier php :
        var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
        parametres += "&division=" + division + "&matiere=" + matiere + "&groupe=" + groupe;
        parametres += "&date=" + date;
        parametres += "&texte=" + encodage_caracteres(texte) + "&afaire=" + encodage_caracteres(afaire);
        parametres += "&fichier=" + fichier;
        // Fonction de traitement du résultat de la requête :
        var fonction_resultat = "enregistrer_cahier_de_texte2(\"" + zone_affichage_message + "\")";
        // Requête XMLHttpRequest :
        requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
        // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
        // ********************************************************************** -->
      } else {
        // Le format de la date n'est pas correct :
        alert("Veuillez spécifier la date avec le bon format.\nLe format doit être JJ-MM-AAAA.");
        // On passe le focus au champ concerné par cette erreur :
        $("date_cdtxt").focus();
      }
    }
  }
}
// ****************************************************************************** -->
function enregistrer_cahier_de_texte2(zone_affichage_message) {
  // Ce sont donc à priori l'une des deux réponses (vrai ou faux)...
  // On vérifie le mot de passe actuel :
  expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    // Le mot de passe est correct :
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // C'est ok, la requête de mise à jour (update) a été lancée :
      if (reponses[1]=="insertion_ok") {
        if (reponses[2]!="piece_jointe_ok") {
          // Une erreur est survenue, mais le fichier joint a déjà été chargé et le nom
          // a été inséré dans la base de données... Comme on ne sait pas ce qui se passe
          // on ne peut plus rien faire, si ce n'est prévenir l'utilisateur...
          alert("Attention ! Une erreur est survenue au niveau du renommage du fichier joint.\nLe lien vers cette pièce jointe ne va pas fonctionner. Contacter l'administrateur.");
        }
        // On masque la zone d'actualisation :
        annuler_enregistrer_cahier_de_texte();
        // On affiche la nouvelle version du cahier de texte :
        recuperer_cahier_de_texte();
      } else {
        // L'insertion ne s'est pas faite correctement :
        $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le cahier de texte n'a pas été actualisé</b>. Contacter l'administrateur.";
      }
    }
  } else if (reponses[0]=="faux") {
    // Le mot de passe n'est pas correct :
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le cahier de texte n'a pas été actualisé.</b>.";
  } else {
    // La réponse n'est ni 'vrai' ni 'faux' et ne commence pas par "<div" : cas non conforme
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_actualisation_cahier_de_texte.php'. La réponse n'est pas conforme (ni 'vrai' ni 'faux' ni '<div'...).<b>Le cahier de texte n'a pas été actualisé</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function modification_enregistrement_cahier_de_texte(num) {
  //
  // On affiche la zone d'édition avec le texte dedans
  // pour que l'utilisateur puisse la modifier.
  // On remplit également le champ "fichier joint"."
  //
  if (identifiant_eleve || identifiant_parent) {
    alert("La modification du cahier de texte n'est pas accessible aux élèves !");
  } else if (identifiant_prof) {
    // ************************************************************************** -->
    // Les champs ont été renseignés et le format de la date est correct :
    // ************************************************************************** -->
    // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
    var identifiant = $("identifiant").value;
    var mdp = hex_md5($("mdp").value);
    // ************************************************************************** -->
    // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
    var zone_affichage_message = "p_message_actualisation_cahier_de_texte";
    // Fichier PHP à appeler :
    //                     "cdtxt_modification_cahier_de_texte.php?identifiant=...&mdp=...&num=..."
    // pour recevoir les listes d'options correspondant à l'élève.
    var fichier_php_a_appeler = "cdtxt_modification_cahier_de_texte.php";
      // Paramètres à passer au fichier php :
    var parametres = "identifiant=" + identifiant + "&mdp=" + mdp + "&num=" + num ;
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "modification_enregistrement_cahier_de_texte2(\"" + zone_affichage_message + "\"," + num + ")";
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
  }
}
// ****************************************************************************** -->
function modification_enregistrement_cahier_de_texte2(zone_affichage_message,num) {
  // Les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // Les données sont reçues, on peut faire la modif :
      $("num_cdtxt").value = num;
      $("date_cdtxt").value = reponses[1];
      if (reponses[2] == " ") { // Si le champ est vide, la fonction php a renvoyé un espace...
        $("texte_cdtxt").value = "";
      } else {
        $("texte_cdtxt").value = reponses[2];
      }
      // Maintenant que le texte est dans le textarea du formulaire, on le transfère dans la zone
      // d'édition de tinyMCE (fonction inverse du tinyMCE.triggerSave).
      //tinyMCE.setContent('texte_cdtxt');
      //tinyMCE.updateContent('texte_cdtxt');
      //tinyMCE.get('texte_cdtxt').getContent();
      //tinyMCE.activeEditor.getContent;
      //tinyMCE.activeEditor.getContent('texte_cdtxt');
      tinyMCE.getInstanceById('texte_cdtxt').getBody().innerHTML = $("texte_cdtxt").value;
      // Idem pour "afaire" :
      if (reponses[3] == " ") { // Si le champ est vide, la fonction php a renvoyé un espace...
        $("afaire_cdtxt").value = "";
      } else {
        $("afaire_cdtxt").value = reponses[3];
      }
      tinyMCE.getInstanceById('afaire_cdtxt').getBody().innerHTML = $("afaire_cdtxt").value;
      // Fichier joint :
      if (reponses[4] == " ") { // Si le champ est vide, la fonction php a renvoyé un espace...
        $("fichier_joint_serveur").value = "";
      } else {
        $("fichier_joint_serveur").value = reponses[4];
      }
      //
      $("div_actualisation_cahier_de_texte").style.display = "block";
      $("p_message_actualisation_cahier_de_texte").innerHTML = "";
      $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
      $("bouton_enregistrer_nouveau_cdtxt").style.display = "none";
      $("bouton_enregistrer_modif_cdtxt").style.display = "block";
    }
  } else if (reponses[0]=="faux") {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le cahier de texte ne peut pas être modifié.</b>.";
  } else {
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_modification_cahier_de_texte.php'. <b>Le cahier de texte ne peut pas être modifié</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function suppression_enregistrement_cahier_de_texte(num) {
  //
  // On affiche une boîte de dialogue de confirmation et on supprime l'enregistrement.
  //
  if (identifiant_eleve || identifiant_parent) {
    alert("Cette fonction n'est pas accessible aux élèves ou aux parents !");
  } else if (identifiant_prof) {
    if (confirm("Suppression de cet enregistrement du cahier de texte ?") == true ) {
      // ************************************************************************ -->
      // Les champs ont été renseignés et le format de la date est correct :
      // ************************************************************************ -->
      // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
      var identifiant = $("identifiant").value;
      var mdp = hex_md5($("mdp").value);
      // ************************************************************************ -->
      // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
      var zone_affichage_message = "p_message_actualisation_cahier_de_texte";
      // Fichier à appeler :
      var fichier_php_a_appeler = "cdtxt_suppression_enregistrement.php";
      // Paramètres à passer au fichier php :
      var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
      parametres += "&num=" + num + "&table=table_cahier_de_texte";
      // Fonction de traitement du résultat de la requête :
      var fonction_resultat = "suppression_enregistrement_cahier_de_texte2(\"" + zone_affichage_message + "\")";
      // Requête XMLHttpRequest :
      requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
      // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
      // ************************************************************************ -->
    }
  }
}
// ****************************************************************************** -->
function suppression_enregistrement_cahier_de_texte2(zone_affichage_message) {
  // Les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else if (reponses[1]=="edition_ok") {
      // Suppression effectuée :
      // On affiche la nouvelle version du cahier de texte :
      recuperer_cahier_de_texte()
    } else {
      // Ce cas ne devrait pas se produire...
      alert("Une erreur a dû se produire... La réponse à la requête est :\n" + reponses[1] + "\net ne correspond pas à la réponse attendue.\nLa suppression de cette entrée du cahier de texte ne s'est peut-être pas effectuée correctement.\nContacter l'administrateur.");
    }
  } else if (reponses[0]=="faux") {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>La suppression de l'enregistrement du cahier de texte ne peut pas être effectuée</b>.";
  } else {
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_suppression_enregistrement.php'. <b>La suppression de l'enregistrement du cahier de texte ne peut pas être effectuée</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function enregistrer_modification_cahier_de_texte() {
  //
  // On enregiqstre les modifications apportées.
  //
  if (identifiant_eleve || identifiant_parent) {
    alert("La modification du cahier de texte n'est pas accessible aux élèves !");
  } else if (identifiant_prof) {
    // On bascule le contenu de l'iframe remplaçant le textearea vers la valeur de ce textarea 
    //  (TinyMCE utilise un iframe pour y placer le code html, qui remplace finalement le textarea, 
    //   dont la valeur reste nulle, si on n'utilise pas cette fonction).
    tinyMCE.triggerSave(true, true);
    // Maintenant, le contenu du textearea est dans : $("texte_cdtxt").value
    //
    // On vérifie que les champs ont été remplis :
    if ($("date_cdtxt").value.length == 0) {
      alert("Vous devez spécifier une date !");
    } else if ($("texte_cdtxt").value.length == 0) {
      alert("Vous devez donner le texte !");
    } else {
      // Vérification de la date :
      var expressionReguliere = new RegExp("^[0-9]{2}[-]{1}[0-9]{2}[-]{1}[0-9]{4}");
      if ($("date_cdtxt").value.match(expressionReguliere)) {
        // ********************************************************************** -->
        // Les champs ont été renseignés et le format de la date est correct :
        // ********************************************************************** -->
        // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
        var identifiant = $("identifiant").value;
        var mdp = hex_md5($("mdp").value);
        // On récupère les données nécessaires à l'insertion de l'enregistrement :
        var num = $("num_cdtxt").value;
        var date = $("date_cdtxt").value;
        var texte = encodage_caracteres($("texte_cdtxt").value);
        var afaire = encodage_caracteres($("afaire_cdtxt").value);
        var fichier = $("fichier_joint_serveur").value;
        // ********************************************************************** -->
        // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
        var zone_affichage_message = "p_message_actualisation_cahier_de_texte";
        // Fichier PHP à appeler :
        // "cdtxt_enregistrement_modification_cahier_de_texte.php?identifiant=...&mdp=...
        //                                                              &num=...&date=...&texte=..."
        var fichier_php_a_appeler = "cdtxt_enregistrement_modification_cahier_de_texte.php";
        // Paramètres à passer au fichier php :
        var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
        parametres += "&num=" + num;
        parametres += "&date=" + date + "&texte=" + texte + "&afaire=" + afaire + "&fichier=" + fichier;
        // Fonction de traitement du résultat de la requête :
        var fonction_resultat = "enregistrer_modification_cahier_de_texte2(\"" + zone_affichage_message + "\")";
        // Requête XMLHttpRequest :
        requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
        // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
        // ********************************************************************** -->
      } else {
        // Le format de la date n'est pas correct :
        alert("Veuillez spécifier la date avec le bon format.\nLe format doit être JJ-MM-AAAA.");
        // On passe le focus au champ concerné par cette erreur :
        $("date_cdtxt").focus();
      }
    }
  }
}
// ****************************************************************************** -->
function enregistrer_modification_cahier_de_texte2(zone_affichage_message) {
  // La réponse ne commence pas par "<p", c'est donc les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<p>", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // La requête de mise à jour (update) a été lancée :
      if (reponses[1]=="mise_a_jour_ok") {
        if (reponses[2]!="piece_jointe_ok") {
          // Une erreur est survenue, mais le fichier joint a déjà été chargé et le nom
          // a été inséré dans la base de données... Comme on ne sait pas ce qui se passe
          // on ne peut plus rien faire, si ce n'est prévenir l'utilisateur...
          alert("Attention ! Une erreur est survenue au niveau du renommage du fichier joint.\nLe lien vers cette pièce jointe ne va pas fonctionner. Contacter l'administrateur.");
        }
        // On masque la zone d'actualisation :
        annuler_enregistrer_cahier_de_texte()
        // On affiche la nouvelle version du cahier de texte :
        recuperer_cahier_de_texte()
      } else {
        $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le cahier de texte n'a pas été mis à jour</b>.\n Contacter l'administrateur.";
      }
    }
  } else {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le cahier de texte n'a pas été mis à jour</b>.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function enregistrer_mdp() {
  if ($("mdp_actuel").value.length > 0 && $("mdp_nouveau_1").value.length > 0 && $("mdp_nouveau_2").value.length > 0) {
   if ($("mdp_nouveau_1").value == $("mdp_nouveau_2").value) {
    // Les mots de passe ont été fournis :
    // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
    var identifiant   = $("identifiant").value;
    var mdp_actuel    = hex_md5($("mdp_actuel").value);
    var mdp_nouveau_1 = hex_md5($("mdp_nouveau_1").value);
    // ************************************************************************** -->
    // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
    var zone_affichage_message = "p_message_mdp";
    // Fichier PHP à appeler :
    //                         "cdtxt_nouveau_mdp.php?elenoet=...&mdp=...&nouveau_mdp=..."
    //                      ou "cdtxt_nouveau_mdp.php?identifiant=...&mdp=...&nouveau_mdp=..."
    // pour recevoir les listes d'options correspondant à l'élève.
    var fichier_php_a_appeler = "cdtxt_nouveau_mdp.php";
    // Paramètres à passer au fichier php :
    if (identifiant_eleve) {
      var parametres = "elenoet=" + identifiant;
    } else if (identifiant_prof || identifiant_parent) {
      var parametres = "identifiant=" + identifiant;
    }
    parametres += "&mdp_actuel=" + mdp_actuel + "&nouveau_mdp=" + mdp_nouveau_1;
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "enregistrer_mdp2(\"" + zone_affichage_message + "\")";
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
   } else {
     alert("La confirmation du nouveau mot de passe est incorrecte. Refaites la saisie.");
     $("mdp_nouveau_1").value = "";
     $("mdp_nouveau_2").value = "";
   }
  } else {
    alert("Il faut remplir les 3 champs !!!");
  }
}
// ****************************************************************************** -->
function enregistrer_mdp2(zone_affichage_message) {
  // Les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<p>", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // La requête de mise à jour (update) a été lancée :
      if (reponses[1]=="mise_a_jour_ok") {
        $(zone_affichage_message).innerHTML = "<b>Nouveau mot de passe enregistré.</b>";
        // On actualise le champ "mot de passe" de l'identification pour que les autres
        // fonctions qui l'utilise tiennent compte du nouveau mot de passe...
        $("mdp").value = $("mdp_nouveau_1").value;
      } else {
        $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le nouveau mot de passe n'a pas été enregistré</b>.\n Contacter l'administrateur.";
      }
    }
    $("mdp_actuel").value    = "";
    $("mdp_nouveau_1").value = "";
    $("mdp_nouveau_2").value = "";
  } else {
    $(zone_affichage_message).innerHTML = "Le mot de passe actuel que vous avez tapé est incorrect. Veuillez le resaisir.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function archives_cahiers_de_texte() {
  if (identifiant_eleve || identifiant_parent) {
    alert("Cette fonction n'est pas accessible aux élèves !");
  } else if (identifiant_prof) {
    // Si on passe en mode archive, les listes de sélection on peut être déjà été sélectionnée, on les réinitialise :
    if (archives_cdtxt == false) {
      $("div_liste_divisions").innerHTML = select_divisions + "<option value=\"0\"> --- </option></select><br />";
      $("div_liste_matieres").innerHTML = select_matieres + "<option value=\"0\"> --- </option></select><br />";
      $("div_liste_groupes").innerHTML = select_groupes + "<option value=\"0\"> --- </option></select>";
    }
    // On bascule en mode archive pour les listes de sélection.
    archives_cdtxt = true; // Flag pour savoir si on est dans les archives du cahier de texte.
    // On cache le bouton permettant de remplir le cahier de texte.
    $("div_bouton_actualiser_cahier_de_texte").style.display = "none";
    // On cache le bouton permettant d'accéder aux archives (puisqu'on y est).
    $("bouton_cdtxt_archives").style.display = "none";
    // On montre le bouton qui permet de quitter les archives :
    $("bouton_cdtxt_quitter_archives").style.display = "inline";
    // On cache le bouton "bouton_cdtxt_complet" (inutile pour les archives).
    $("bouton_cdtxt_complet").style.display = "none";
    // On cache la zone du dessous (un cahier de texte a peut-être été précédamment affiché)
    $("div_actualisation_cahier_de_texte").style.display = "none";
    // On modifie le texte pour la sélection :
    $("p_message_selections").innerHTML = "<i>Vous pouvez sélectionner l'année scolaire, le prof, la classe, la matière et le groupe dans l'ordre de votre choix pour définir l'entrée voulue des archives des cahiers de texte :</i>";
    // On cache le bouton "trombinoscope"."
    $("img_trombinoscope").style.display= "none"; //
    // On affiche les listes déroulantes "annees" et "profs" ainsi que les labels correspondants.
    $("div_liste_annees_scolaires").style.display   = "inline";
    $("label_liste_annees_scolaires").style.display = "inline";
    $("div_liste_profs").style.display              = "inline";
    $("label_liste_profs").style.display            = "inline";
    // On efface la zone d'édition :
    $("p_affichage_cahier_de_texte").innerHTML = "";
    // ************************************************************************** -->
    // On récupère les valeurs des éléments sélectionnées dans les listes :
    annee_scolaire = $("annee_scolaire").value;
    prof           = encodage_caracteres($("prof").value);
    division       = encodage_caracteres($("division").value);
    matiere        = encodage_caracteres($("matiere").value);
    groupe         = encodage_caracteres($("groupe").value);
    // Initialisation des variables pour la requête :
    var zone_affichage_message = "p_message_erreur_zone_divmatgrp";
    // Script php à appeler :
    var fichier_php_a_appeler = "cdtxt_archives_divisions_matieres_groupes_profs.php";
    // Paramètres à passer au fichier php :
    var parametres = "archives_annee_scolaire="+archives_annee_scolaire+"&annee_scolaire="+annee_scolaire+"&prof="+prof+"&division="+division+"&matiere="+matiere+"&groupe="+groupe;
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "archives_cahiers_de_texte2(\"" + zone_affichage_message + "\")";
    // Requête XMLHttpRequest :
      requete_XMLHttpRequest("post","xml",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
  } // Fin else if (identifiant_prof == true) {
}
// ****************************************************************************** -->
function archives_cahiers_de_texte2(zone_affichage_message) {
  if (identifiant_eleve || identifiant_parent) {
    alert("Cette fonction n'est pas accessible aux élèves !");
  } else if (identifiant_prof == true) {
    // ************************************************************************** -->
    // On met à jour la liste de sélection des ANNEES SCOLAIRES avec celles des archives :
    if ($("annee_scolaire").value == 0) {
      // On ne met à jour cette liste que la première fois (au moment de l'accès aux archives).
      // Ensuite, il ne faut plus la mettre à jour pour ne pas changer l'année sélectionnée.
      var liste_options = liste_options_reponse_requete_xml("item_annee_scolaire","annee_scolaire");
      $("div_liste_annees_scolaires").innerHTML = select_annees_scolaires + liste_options + "</select>";
    }
    // L'année de consultation des archives est celle en cours :
    archives_annee_scolaire = $("annee_scolaire").value;
    // On met à jour la liste de sélection des PROFS avec ceux des archives :
    liste_options = liste_options_reponse_requete_xml("item_prof","prof");
    $("div_liste_profs").innerHTML = select_profs + liste_options + "</select><br /><br />";
    // On met à jour la liste de sélection des DIVISIONS avec celles des archives :
    var liste_options = liste_options_reponse_requete_xml("item_division","division");
    $("div_liste_divisions").innerHTML = select_divisions + liste_options + "</select><br />";
    // On met à jour la liste de sélection des MATIERES avec celles des archives :
    liste_options = liste_options_reponse_requete_xml("item_matiere","matiere");
    $("div_liste_matieres").innerHTML = select_matieres + liste_options + "</select><br />";
    // On met à jour la liste de sélection des GROUPES avec ceux des archives :
    liste_options = liste_options_reponse_requete_xml("item_groupe","groupe");
    $("div_liste_groupes").innerHTML = select_groupes + liste_options + "</select>";
    // ************************************************************************** -->
  } // Fin else if (identifiant_prof == true) {
}
// ****************************************************************************** -->
function liste_options_reponse_requete_xml(tag_item,tag_element_liste) {
    // On récupère le résultat de la requête pour le transformer en liste d'option
    // <option>...</option> pour le <select>...
    var items = reponse_requete_XMLHttpRequest.getElementsByTagName(tag_item);
    var elements_liste = new Array();
    var liste_options = "";
    if (tag_item != "item_annee_scolaire" && items.length > 1) {
      // On n'affiche pas cette ligne pour les années.
      // On n'affiche pas cette ligne quand il n'y a qu'un élément
      // (qui est l'élément précédemment sélectionné).
      liste_options += "<option value=\"0\">----------</option>";
    }
    if (items.length > 0) {
      for (var i=0; i<items.length; i++) {
        elements_liste[i] = items[i].getElementsByTagName(tag_element_liste)[0].firstChild.nodeValue;
      }
      if (elements_liste.length > 0) {
        // Liste d'options :
        for (var i=0; i<elements_liste.length; i++) {
          liste_options += "<option value=\"" + elements_liste[i] + "\">";
          liste_options += elements_liste[i] + "</option>";
        }
      } else {
        alert("ERREUR !\nTableau 'elements_liste[]' vide.\n Contacter l'administrateur.");
      }
    } else {
      alert("ERREUR !\nTableau 'items[]' vide.\n Contacter l'administrateur.");
    }
    return liste_options;
  // **************************************************************************** -->
}
// ****************************************************************************** -->
function quitter_archives_cahiers_de_texte() {
  archives_cdtxt = false;
  reinitialiser();
  selection_onglet('onglet3');
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// LISTE DES ELEVES avec les DIVISIONS (ACCES CPE)
// ****************************************************************************** -->
// ****************************************************************************** -->
function liste_eleves_divisions() {
  if ($("identifiant").value != "cpe" ) {
    alert("Cette fonction n'est accessible qu'au compte 'cpe' !");
  } else {
    // ************************************************************************** -->
    // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
    var identifiant = $("identifiant").value;
    var mdp = hex_md5($("mdp").value);
    // Initialisation des variables pour la requête :
    var zone_affichage = "p_affichage_bulletin_appel";
    // On efface la zone  :
    $(zone_affichage).innerHTML = "";
    // Fichier php qui va élaborer la réponse (requête sur la base de données) :
    var fichier_php_a_appeler = "cdtxt_liste_eleves_divisions.php";
    // Paramètres à passer à ce fichier php :
    var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "liste_eleves_divisions2(\"" + zone_affichage + "\")";
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","xml",fichier_php_a_appeler,parametres,zone_affichage,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
  } // Fin if ($("identifiant").value != "admin" )
}
// ****************************************************************************** -->
function liste_eleves_divisions2(zone_affichage) {
  if ($("identifiant").value != "cpe" ) {
    alert("Cette fonction n'est accessible qu'au compte 'cpe' !");
  } else {
    var erreurs = reponse_requete_XMLHttpRequest.getElementsByTagName("erreur");
    if (erreurs.length > 0) { // Il y a une erreur en retour dans le XML...
      alert("Cette fonction n'est accessible qu'au compte 'cpe' avec un mot de passe correct !");
    } else {
      // ************************************************************************ -->
      var reg1 = new RegExp("(')", "g");  // Expression régulière pour remplacer les ' par des \'dans
      //                                    les paramètres transmis dans les fonctions javascript.
      // On récupère le résultat de la requête :
      var items     = reponse_requete_XMLHttpRequest.getElementsByTagName("item");
      var divisions = new Array();
      var elenoets  = new Array();
      var noms      = new Array();
      var prenoms   = new Array();
      var sdivision = "";
      var selenoet  = "";
      var snom      = "";
      var sprenom   = "";
      if (items.length > 0) {
        for (var i=0; i<items.length; i++) {
          divisions[i] = items[i].getElementsByTagName("division")[0].firstChild;
          elenoets[i]  = items[i].getElementsByTagName("elenoet")[0].firstChild;
          noms[i]      = items[i].getElementsByTagName("nom")[0].firstChild;
          prenoms[i]   = items[i].getElementsByTagName("prenom")[0].firstChild;
        }
        if (divisions.length > 0) {
          var zone_gestion_tables = "<p><b>Liste des élèves ('table_lps'),<br />avec la division de l'élève :</b>";
          zone_gestion_tables += "</p><table class=\"table_tableau1\">";
          zone_gestion_tables += "<tr><th class=\"th_tableau1_titre1\">Division</th><th class=\"th_tableau1_titre1\">Elenoet</th><th class=\"th_tableau1_titre1\">Nom</th><th class=\"th_tableau1_titre1\">Prénom</th></tr>";
          var nb_eleves = 0;
          for (i=0; i<divisions.length; i++) {
            nb_eleves++;
            if (divisions[i] != null) {sdivision = divisions[i].nodeValue} else {sdivision = ""};
            if (elenoets[i]  != null) {selenoet  = elenoets[i].nodeValue}  else {selenoet  = ""};
            if (noms[i]      != null) {snom      = noms[i].nodeValue}      else {snom      = ""};
            if (prenoms[i]   != null) {sprenom   = prenoms[i].nodeValue}   else {sprenom   = ""};
            zone_gestion_tables += "<tr><td class=\"td_tableau1_cellule6\">" + sdivision + "</td><td class=\"td_tableau1_cellule6\">" + selenoet + "</td><td class=\"td_tableau1_cellule6\">" + snom + "</td><td class=\"td_tableau1_cellule6\">" + sprenom + "</td></tr>";
          } // Fin du for
          zone_gestion_tables += "</table>";
          zone_gestion_tables += "<p>Nombre d'élèves dans cette liste : <b>" + nb_eleves + "</b></p>";
          $(zone_affichage).innerHTML = zone_gestion_tables;
        } else {
          alert("ERREUR !\nFonction 'liste_eleves_divisions2()'' du fichier 'cahier_de_texte.js' :\n'Tableau 'divisions[]' vide.\n Contacter l'administrateur.");
        }
      } else {
        alert("ERREUR !\nFonction 'liste_eleves_divisions2()'' du fichier 'cahier_de_texte.js' :\nTableau 'items[]' vide.\n Contacter l'administrateur.");
      }
    }// Fin if (erreurs.length > 0)
    // ************************************************************************** -->
  }// Fin if ($("identifiant").value != "admin" )
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// REGULARISATION GLOBALE D'UN ELEVE :
// ****************************************************************************** -->
// ****************************************************************************** -->
function regulariser_globalement_eleve() {
  if ($("identifiant").value != "cpe" ) {
    alert("Cette fonction n'est accessible qu'au compte 'cpe' !");
  } else {
    // On efface la zone d'édition :
    $("p_affichage_bulletin_appel").innerHTML = "";
    // ************************************************************************** -->
    // On récupère l'identifiant et le mot de passe de l'utilisateur à modifier :
    var identifiant_eleve = window.prompt("REGULARISATION GLOBALE D'UN ELEVE.\n\nTapez l'identifiant de l'élève\nque vous pouvez trouver dans la liste des élèves ('Elenoet') :","");
    // Attention : cette variable "identifiant_eleve" est locale dans cette fonction
    // "regulariser_globalement_eleve()". Il existe aussi la variable "identifiant_eleve"
    // globalement utilisée dans tous les scripts...
    if (identifiant_eleve != null) {
      // ************************************************************************ -->
      // On récupère l'identifiant et le mot de passe de l'utilisateur en cours :
      var identifiant = $("identifiant").value;
      var mdp = hex_md5($("mdp").value);
      // ************************************************************************ -->
      // Initialisation des variables pour la requête :
      var zone_affichage = "p_affichage_bulletin_appel";
      // ************************************************************************ -->
      // Fichier php qui va élaborer la réponse (requête sur la base de données) :
      var fichier_php_a_appeler = "cdtxt_identification_utilisateur.php";
      // Paramètres à passer à ce fichier php :
      var parametres = "identifiant=" + identifiant + "&mdp=" + mdp + "&identifiant_utilisateur=" + identifiant_eleve;
      // Fonction de traitement du résultat de la requête :
      var fonction_resultat = "regulariser_globalement_eleve2(\"" + zone_affichage + "\",\"" + identifiant_eleve + "\")";
      // Requête XMLHttpRequest :
      if (fichier_php_a_appeler != "") {
        requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage,fonction_resultat);
      }
      // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
    } else {
      alert("Opération annulée.");
    }
    // ************************************************************************** -->
  } // Fin if ($("identifiant").value != "admin" )
}
// ****************************************************************************** -->
function regulariser_globalement_eleve2(zone_affichage,identifiant_eleve) {
  if ($("identifiant").value != "cpe" ) {
    alert("Cette fonction n'est accessible qu'au compte 'cpe' !");
  } else {
    // ************************************************************************** -->
    // On récupère le résultat de la requête :
    // On vérifie le mot de passe actuel :
    var expressionReguliere = new RegExp("####","g"); // Découpage
    var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
    if (reponses[0]=="vrai") {
      if (reponses[1].substring(0,4)=="<div") {
        // La réponse commence par "<div", c'est un message d'erreur...
        $(zone_affichage).innerHTML = reponses[1];
      } else if (reponses[1]=="identification_pas_ok") {
        $(zone_affichage).innerHTML = "ATTENTION, une erreur a été rencontrée :<br /> <b>l'identification de l'élève n'a pas pu être effectuée</b>.\n Contacter l'administrateur.";
      } else {
        // ********************************************************************** -->
        // ********************************************************************** -->
        var reponse = window.prompt("REGULARISATION GLOBALE DE L'ELEVE :\nIdentifiant : '" + identifiant_eleve + "'\nNom : " + reponses[1] + "\nPrénom : " + reponses[2] + "\n\nPour régulariser globalement cet élève, taper : 'regulariser'","");
        if (reponse == 'regulariser') {
          // ******************************************************************** -->
          // On récupère l'identifiant et le mot de passe de l'utilisateur en cours :
          var identifiant = $("identifiant").value;
          var mdp = hex_md5($("mdp").value);
          // ******************************************************************** -->
          // Fichier php qui va élaborer la réponse (requête sur la base de données) :
          var fichier_php_a_appeler = "cdtxt_regul_global_eleve.php";
          // Paramètres à passer à ce fichier php :
          var parametres = "identifiant=" + identifiant + "&mdp=" + mdp + "&identifiant_eleve=" + identifiant_eleve;
          // Fonction de traitement du résultat de la requête :
          var fonction_resultat = "affichage(\"" + zone_affichage + "\")";
          // Requête XMLHttpRequest :
          if (fichier_php_a_appeler != "") {
            requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage,fonction_resultat);
          }
          // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
        // ********************************************************************** -->
        } else {
          alert("Opération abandonnée.");
        }
      // ************************************************************************ -->
      } // Fin du if (reponses[1].substring(0,4)=="<div") {
    } else if (reponses[0]=="faux") {
      $(zone_affichage).innerHTML = "ATTENTION, votre mot de passe est incorrect. <b>Le traitement n'a pas été effectué</b>.\n Contacter l'administrateur.";
    } else {
      $(zone_affichage).innerHTML = "ATTENTION, la réponse pour cette requête n'est pas conforme (première partie). <b>Le traitement n'a pas été nécessairement effectué</b>.\n Contacter l'administrateur.";
    }
    // ************************************************************************** -->
  } // Fin if ($("identifiant").value != "admin" )
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// ???
// ****************************************************************************** -->
// ****************************************************************************** -->
function affichage(zone_affichage) {
  // **************************************************************************** -->
  // On récupère le résultat de la requête :
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage).innerHTML = reponses[1];
    } else {
      // ************************************************************************ -->
      // On affiche le résultat de la requête :
      $(zone_affichage).innerHTML = reponses[1];
      // ************************************************************************ -->
    }
  } else if (reponses[0]=="faux") {
    $(zone_affichage).innerHTML = "ATTENTION, votre mot de passe est incorrect. <b>Le traitement n'a pas été effectué</b>.\n";
  } else {
    $(zone_affichage).innerHTML = "ATTENTION, la réponse pour cette requête n'est pas conforme (première partie). <b>Le traitement n'a pas été nécessairement effectué</b>.\n Contacter l'administrateur.";
  }
  // **************************************************************************** -->
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// ACCOMPAGNEMENT PERSONNALISE / CARNET DE BORD
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_divisions_eleves() {
  // Pour les profs.
  // On va récupérer la liste des divisions et des élèves pour que les profs
  // puissent sélectionner un élève et afficher son carnet de bord.
  //
  // On efface le carnet de bord précédemment affiché.
  $("div_ap").innerHTML = "";
  // ************************************************************************** -->
  // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
  var identifiant = $("identifiant").value;
  var mdp = hex_md5($("mdp").value);
  // ************************************************************************** -->
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_ap_divisions_eleves.php";
  // Paramètres à passer à ce fichier php :
  var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
  // Zone d'affichage :
  var zone_affichage_message = "p_message_ap";
  //
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "recuperer_divisions_eleves2(\"" + zone_affichage_message + "\",\"" + identifiant + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  // ************************************************************************** -->
}
// ****************************************************************************** -->
function recuperer_divisions_eleves2(zone_affichage_message,identifiant) {
  // Fichier récupéré, récupération des données :
  // Tout d'abord l'identification de l'utilisateur (champs séparés par des "####")
  // puis les données pour remplir les OPTIONs des SELECTs :
  // Ce fichier contient les différents "<option...>...</option>" les uns à la suite des autres,
  //   séparés par des "###" et des "####".
  // Il y a tout d'abord l'option des ou de la division, un "####", puis les options des matières séparés par des "###",
  // un "####", puis les options des groupes.
  //
  if (reponse_requete_XMLHttpRequest != "") {
    // La réponse n'est pas vide, c'est donc la liste des options...
    // On découpe la chaîne :
    expressionReguliere = new RegExp("####","g"); // Découpage Division / Matières / Groupes
    var tableau_reponse_requete = reponse_requete_XMLHttpRequest.split(expressionReguliere);
    // On récupère donc les éléments suivants :
    //   tableau_reponse_requete[0]  : Réponse pour le mdp (vrai ou faux)
    //   tableau_reponse_requete[1]  : Divisions
    //   tableau_reponse_requete[2]  : Eleves pour la première division
    //
  // On vérifie le compte :
    // Le compte existe, on vérifie le mot de passe :
    if (tableau_reponse_requete[0] == "vrai") {
      mdp_valide = true;
    } else {
      mdp_valide = false;
    }
    if (mdp_valide) {
      // On récupère les divisions :
      expressionReguliere = new RegExp("###","g"); // Découpage des options
      var tableau_options = tableau_reponse_requete[1].split(expressionReguliere);
      var liste_options = "";
      for (var i=0;i<tableau_options.length;i++) {
        liste_options += tableau_options[i];
      }
      $("div_liste_divisions_ap_profs").innerHTML = select_divisions_ap_profs + liste_options + "</select>";
      // On récupère les options pour les eleves :
      expressionReguliere = new RegExp("###","g"); // Découpage des options
      var tableau_options = tableau_reponse_requete[2].split(expressionReguliere);
      var liste_options = "";
      for (var i=0;i<tableau_options.length;i++) {
        liste_options += tableau_options[i];
      }
      $("div_liste_eleves_ap_profs").innerHTML = select_eleves_ap_profs + liste_options + "</select>";
      // Les options sont récupérées !
    } else {
      if (tableau_reponse_requete[0] == "faux") {
        $(zone_affichage_message).innerHTML = "Vous avez tapé un mot de passe incorrect. Veuillez le resaisir.";
      } else {
        $(zone_affichage_message).innerHTML = "Réponse du serveur non conforme. Accès refusé.";
      }
    }
  }
}
// ****************************************************************************** -->
function selection_division_ap_profs() {
  // Le prof a changé de division, il faut afficher la nouvelle liste d'élèves.
  //
  // On efface le carnet de bord précédemment affiché.
  $("div_ap").innerHTML = "";
  // ************************************************************************** -->
  // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
  var identifiant = $("identifiant").value;
  var mdp         = hex_md5($("mdp").value);
  var division    = $("division_ap_profs").value;
  // ************************************************************************** -->
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_ap_eleves.php";
  // ************************************************************************** -->
  // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
  // Paramètres à passer à ce fichier php :
  parametres = "identifiant=" + identifiant + "&mdp=" + mdp + "&division=" + division;
  // Zone d'affichage :
  var zone_affichage_message = "p_message_ap";
  //
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "selection_division_ap_profs2(\"" + zone_affichage_message + "\",\"" + identifiant + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  // ************************************************************************** -->
}
// ****************************************************************************** -->
function selection_division_ap_profs2(zone_affichage_message,identifiant) {
  // Fichier récupéré, récupération des données :
  // Tout d'abord l'identification de l'utilisateur (champs séparés par des "####")
  // puis les données pour remplir les OPTIONs des SELECTs :
  // Ce fichier contient les différents "<option...>...</option>" les uns à la suite des autres,
  //   séparés par des "###" et des "####".
  // Il y a tout d'abord l'option des ou de la division, un "####", puis les options des matières séparés par des "###",
  // un "####", puis les options des groupes.
  //
  if (reponse_requete_XMLHttpRequest != "") {
    // La réponse n'est pas vide, c'est donc la liste des options...
    // On découpe la chaîne :
    expressionReguliere = new RegExp("####","g"); // Découpage Division / Matières / Groupes
    var tableau_reponse_requete = reponse_requete_XMLHttpRequest.split(expressionReguliere);
    // On récupère donc les éléments suivants :
    //   tableau_reponse_requete[0]  : Réponse pour le mdp (vrai ou faux)
    //   tableau_reponse_requete[1]  : Eleves pour la division
    //
  // On vérifie le compte :
    // Le compte existe, on vérifie le mot de passe :
    if (tableau_reponse_requete[0] == "vrai") {
      mdp_valide = true;
    } else {
      mdp_valide = false;
    }
    if (mdp_valide) {
      // On récupère les options pour les eleves :
      expressionReguliere = new RegExp("###","g"); // Découpage des options
      var tableau_options = tableau_reponse_requete[1].split(expressionReguliere);
      var liste_options = "";
      for (var i=0;i<tableau_options.length;i++) {
        liste_options += tableau_options[i];
      }
      $("div_liste_eleves_ap_profs").innerHTML = select_eleves_ap_profs + liste_options + "</select>";
      // Les options sont récupérées !
    } else {
      if (tableau_reponse_requete[0] == "faux") {
        $(zone_affichage_message).innerHTML = "Vous avez tapé un mot de passe incorrect. Veuillez le resaisir.";
      } else {
        $(zone_affichage_message).innerHTML = "Réponse du serveur non conforme. Accès refusé.";
      }
    }
  }
}
// ****************************************************************************** -->
function selection_eleve_ap_profs() {
  // Le prof a changé l'élève, il faut afficher le carnet de bord de cet élève.
  //
  // On efface le carnet de bord précédemment affiché.
  $("div_ap").innerHTML = "";
  // On affiche.
  recuperer_ap()
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function recuperer_ap() {
  // ************************************************************************** -->
  // Affichage du carnet de bord numérique d’accompagnement personnalisé
  // ************************************************************************** -->
  // Initialisation des variables pour la requête :
  var mdp = hex_md5($("mdp").value);
  var zone_affichage = "p_message_ap";
  // On efface la zone  :
  $(zone_affichage).innerHTML = "";
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "recuperer_ap2(\"" + zone_affichage + "\")";
  // **************************************************************************
  if (identifiant_eleve || identifiant_parent || identifiant_prof) {
    // Elève ou parent :
    var identifiant = $("identifiant").value;
    if (identifiant_eleve) {
      var elenoet = $("identifiant").value;
    } else if (identifiant_parent) {
      var elenoet = $("eleve").value;
    } else if (identifiant_prof) {
      var elenoet = $("eleve_ap_profs").value;
    }
    // Fichier php qui va élaborer la réponse (requête sur la base de données) :
    var fichier_php_a_appeler = "cdtxt_ap_carnetdebord_eleve.php";
    // Paramètres à passer à ce fichier php :
    var parametres = "elenoet=" + elenoet + "&identifiant=" + identifiant + "&mdp=" + mdp;
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","xml",fichier_php_a_appeler,parametres,zone_affichage,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  }
}
// ****************************************************************************** -->
function recuperer_ap2(zone_affichage) {
  // On texte si le mdp est correct :
  var erreurs = reponse_requete_XMLHttpRequest.getElementsByTagName("erreur");
  if (erreurs.length > 0) { // Il y a une erreur en retour dans le XML...
    alert("Cette fonction n'est accessible qu'avec un mot de passe correct !");
  } else {
    // ************************************************************************ -->
    // Le mdp est ok
    // ************************************************************************ -->
    // Initialisation des variables :
    var items         = reponse_requete_XMLHttpRequest.getElementsByTagName("item");
    var nums          = new Array();
    var competences   = new Array();
    var dateactivites = new Array();
    var activites     = new Array();
    var tempss        = new Array();
    var snum          = "";
    var scompetence   = "";
    var sdateactivite = "";
    var sactivite     = "";
    var stemps        = "";
    var heures        = 0;
    var minutes       = 0;
    if (identifiant_eleve) {
      // Le nom d'élève est :
      var id_eleve = "";
    } else if (identifiant_parent) {
      // Le nom de l'élève est dans la liste déroulante de l'onglet "Session"
      var indexS   = document.form_cahierdetexte.eleve.options.selectedIndex;
      var id_eleve = document.form_cahierdetexte.eleve.options[indexS].text;
    } else if (identifiant_prof) {
      // Le nom de l'élève est dans la liste déroulante de l'onglet "AP"
      var indexS   = document.form_cahierdetexte.eleve_ap_profs.options.selectedIndex;
      var id_eleve = document.form_cahierdetexte.eleve_ap_profs.options[indexS].text;
    }
    var total_temps_competence = 0;
    var total_temps = 0;
    var competence_precedente = "";
    //
    if (items.length > 0) {
      // On récupère le résultat de la requête :
      for (var i=0; i<items.length; i++) {
        nums[i]          = items[i].getElementsByTagName("num")[0].firstChild;
        competences[i]   = items[i].getElementsByTagName("competence")[0].firstChild;
        dateactivites[i] = items[i].getElementsByTagName("dateactivite")[0].firstChild;
        activites[i]     = items[i].getElementsByTagName("activite")[0].firstChild;
        tempss[i]        = items[i].getElementsByTagName("temps")[0].firstChild;
      }
      // On affiche :
      if (competences.length > 0) {
        var zone_ap = "<p>";
        if (identifiant_eleve) {
          zone_ap += "Votre carnet de bord :";
        } else if (identifiant_parent || identifiant_prof) {
          zone_ap += "Carnet de bord de <b>" + id_eleve + "</b> :";
        }
        zone_ap += "<br /><table class=\"table_tableau4\">";
        zone_ap += "<tr><th class=\"th_tableau4_titre1l\">Compétence</th><th class=\"th_tableau4_titre1l\">Date</th><th class=\"th_tableau4_titre1l\">Activité</th><th class=\"th_tableau4_titre1l\">Temps</th><th class=\"th_tableau4_titre1l\"> </th><th class=\"th_tableau4_titre1l\"> </th></tr>";
        for (i=0; i<competences.length; i++) {
          // ******************************************************************** -->
          // Affichage de la ligne du tableau :
          if (nums[i]          != null) {snum          = nums[i].nodeValue}          else {snum          = ""};
          if (competences[i]   != null) {scompetence   = competences[i].nodeValue}   else {scompetence   = ""};
          if (dateactivites[i] != null) {sdateactivite = dateactivites[i].nodeValue} else {sdateactivite = ""};
          if (activites[i]     != null) {sactivite     = activites[i].nodeValue}     else {sactivite     = ""};
          if (tempss[i]        != null) {stemps        = tempss[i].nodeValue}        else {stemps        = ""};
          // ******************************************************************** -->
          total_temps += parseInt(stemps);
          // ******************************************************************** -->
          // Gestion des totaux du temps :
          if (competence_precedente == "") {
            // C'est la première ligne affichée, on mémorise cette compétence
            // et on initialise le total avec ce premier temps.
            competence_precedente = scompetence;
            total_temps_competence = parseInt(stemps);
          } else if (scompetence == competence_precedente) {
            // C'est la même compétence que la ligne d'avant, on ajoute le temps
            // au total de cette compétence.
            total_temps_competence += parseInt(stemps);
          } else {
            // On vient de changer de compétence. On affiche le total avant d'afficher la ligne
            heures  = Math.floor(total_temps_competence / 60);
            minutes = total_temps_competence - (heures * 60);
            zone_ap += "<tr><td colspan=\"6\" class=\"td_tableau4_cellule3\"> Temps passé pour la compétence '" + competence_precedente + "' : " + heures + "h et " + minutes + "mn</td></tr>";
            // On réinitialise le total du temps et on mémorise la nouvelle compétence précédente.
            total_temps_competence = parseInt(stemps);
            competence_precedente = scompetence;
          }
          // ******************************************************************** -->
          // On affiche la ligne :
          zone_ap += "<tr>";
          zone_ap += "<td class=\"td_tableau4_cellule4\">" + scompetence + "</td><td class=\"td_tableau4_cellule4\">" + sdateactivite + "</td><td class=\"td_tableau4_cellule4\">" + sactivite + "</td><td class=\"td_tableau4_cellule4\">" + stemps + "</td>";
          if (identifiant_eleve) {
            // Uniquement pour les élèves, lien éventuel pour modification ou suppression
            // (on utilise alors le num de l'enregistrement) :
            zone_ap += "<td class=\"td_tableau4_cellule1\"><a href=\"#\" onclick=\"modification_enregistrement_ap(" + snum + ");\" title=\"Modifier cet enregistrement\"><img src=\"images/modifier.gif\" alt=\"Modifier cet enregistrement\" /></a></td>";
            zone_ap += "<td class=\"td_tableau4_cellule1\"><a href=\"#\" onclick=\"suppression_enregistrement_ap(" + snum + ");\" title=\"Supprimer cet enregistrement\"><img src=\"images/coche_pas-ok.gif\" alt=\"Supprimer cet enregistrement\" /></a></td>";
          } else {
            // Pour les autres utilisateurs, pas de boutons pour modifier ou supprimer.
            zone_ap += "<td width=\"12px\" class=\"td_tableau4_cellule1\"></td><td width=\"12px\" class=\"td_tableau4_cellule1\"></td>";
          }// Fin du if (identifiant_eleve) {
          zone_ap += "</tr>";
          // ******************************************************************** -->
        } // Fin du for (i=0; i<competences.length; i++) {
        // On affiche le sous-total de la dernière compétence :
        heures  = Math.floor(total_temps_competence / 60);
        minutes = total_temps_competence - (heures * 60);
        zone_ap += "<tr><td colspan=\"6\" class=\"td_tableau4_cellule3\"> Temps passé pour la compétence '" + scompetence + "' : " + heures + "h et " + minutes + "mn</td></tr>";
        // ******************************************************************** -->
        // On affiche le total du temps passé
        heures  = Math.floor(total_temps / 60);
        minutes = total_temps - (heures * 60);
        zone_ap += "<tr>";
        zone_ap += "<td colspan=\"6\" class=\"th_tableau4_titre1c\"> Temps total : " + heures + "h et " + minutes + "mn</td>";
        zone_ap += "</tr>";
        // ******************************************************************** -->
        // Fin de la talbe.
        zone_ap += "</table></p>";
        $("div_ap").innerHTML = zone_ap;
      } else {
        alert("ERREUR !\nFonction 'recuperer_ap2()'' du fichier 'cahier_de_texte.js' :\n'Tableau 'divisions[]' vide.\n Contacter l'administrateur.");
      }
    } else {
      if (id_eleve == "") {
        $("div_ap").innerHTML = "Votre carnet de bord est vide.</p>";
      } else {
        $("div_ap").innerHTML = "Le carnet de bord de <b>" + id_eleve + "</b> est vide.</p>";
      }
    }
  } // Fin du if (items.length > 0) {
} // Fin du if (erreurs.length > 0)
// ****************************************************************************** -->
// ****************************************************************************** -->
function actualiser_ap() {
  if (identifiant_eleve) {
    // On vide la zone d'édition de l'éditeur tinyMCE
    tinyMCE.get('texte_ap').setContent("");
    //
    var datedujour = new Date();
    var date  = datedujour.getDate();
    if (date<10) date = "0" + date;
    var mois  = datedujour.getMonth() + 1;
    if (mois<10) mois = "0" + mois;
    var annee = datedujour.getFullYear();
    $("date_ap").value = date + "-" + mois + "-" + annee;
    $("texte_ap").value = "";
    $("div_actualisation_ap").style.display = "block";
    $("p_message_actualisation_ap").innerHTML = "";
    $("div_bouton_actualiser_ap").style.display = "none";
    $("bouton_enregistrer_nouveau_ap").style.display = "block";
    $("bouton_enregistrer_modif_ap").style.display = "none";
  } else {
    alert("L'actualisation du carnet de bord n'est accessible qu'aux élèves !");
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function annuler_ap() {
  $("date_ap").value = "";
  $("texte_ap").value = "";
  $("div_actualisation_ap").style.display = "none";
  $("p_message_actualisation_ap").innerHTML = "";
  $("p_affichage_ap").innerHTML = "";
  $("div_bouton_actualiser_ap").style.display = "none";
  $("div_actualisation_ap").style.display = "none";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function annuler_enregistrer_ap() {
  $("date_ap").value = "";
  $("texte_ap").value = "";
  $("div_actualisation_ap").style.display = "none";
  $("p_message_actualisation_ap").innerHTML = "";
  $("div_bouton_actualiser_ap").style.display = "block";
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function enregistrer_ap() {
  //
  // On enregistre le nouveau texte qui vient d'être tapé.
  //
  if (identifiant_eleve) {  
    // On bascule le contenu de l'iframe remplaçant le textearea vers la valeur de ce textarea 
    //  (TinyMCE utilise un iframe pour y placer le code html, qui remplace finalement le textarea, 
    //   dont la valeur reste nulle, si on n'utilise pas cette fonction).
    tinyMCE.triggerSave(true, true);
    // Maintenant, le contenu du textearea est dans : $("texte_ap").value
    // TinyMCE a converti tous les caractères spéciaux en codes html (comme par exemple "&ccedil;"" pour le "ç"
    // ou "&gt;" pour le ">", etc) donc pas besoin de traiter ce texte (fonction encodage_caracteres(texte) 
    // inutile ici).
    if ($("date_ap").value.length == 0) {
      alert("Vous devez spécifier une date !");
    } else if ($("competence_ap").value == 0) {
      alert("Vous devez spécifier une compétence !");
    } else if ($("texte_ap").value.length == 0) {
      alert("Vous devez donner le texte !");
    } else if ($("temps_ap").value.length == 0) {
      alert("Vous devez donner un temps (en minutes) !");
    } else {
      // Vérification de la date :
      var expressionReguliere = new RegExp("^[0-9]{2}[-]{1}[0-9]{2}[-]{1}[0-9]{4}");
      if ($("date_ap").value.match(expressionReguliere)) {
        // ********************************************************************** -->
        // Les champs ont été renseignés et le format de la date est correct :
        // ********************************************************************** -->
        // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
        var elenoet = $("identifiant").value;
        var mdp = hex_md5($("mdp").value);
        // On récupère les données nécessaires à l'insertion de l'enregistrement :
        var date = $("date_ap").value;
        var texte = $("texte_ap").value;
        expressionReguliere = new RegExp("\"","g");          // On transforme les guillemets
        texte = texte.replace(expressionReguliere,"&quot;"); //  en &quot.
        texte = encodage_caracteres(texte); // S'il reste des caractères spéciaux qui risquent
        // de ne pas passer lors du passage des paramètres, on les transforme...
        var competence = $("competence_ap").value;
        var temps = $("temps_ap").value;
        // ********************************************************************** -->
        // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
        var zone_affichage_message = "p_message_actualisation_ap";
        // Fichier PHP à appeler :
        // "cdtxt_actualisation_ap.php?elenoet=...&mdp=...&date=...&texte=...&competence=...&temps=..."
        var fichier_php_a_appeler = "cdtxt_actualisation_ap.php";
      // Paramètres à passer au fichier php :
        var parametres = "elenoet=" + elenoet + "&mdp=" + mdp;
        parametres += "&date=" + date;
        parametres += "&texte=" + encodage_caracteres(texte);
        parametres += "&competence=" + competence;
        parametres += "&temps=" + temps;
        // Fonction de traitement du résultat de la requête :
        var fonction_resultat = "enregistrer_ap2(\"" + zone_affichage_message + "\")";
        // Requête XMLHttpRequest :
        requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
        // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
        // ********************************************************************** -->
      } else {
        // Le format de la date n'est pas correct :
        alert("Veuillez spécifier la date avec le bon format.\nLe format doit être JJ-MM-AAAA.");
        // On passe le focus au champ concerné par cette erreur :
        $("date_ap").focus();
      }
    }
  } else {
    alert("L'actualisation du carnat de bord n'est accessible qu'aux élèves !");
  }
}
// ****************************************************************************** -->
function enregistrer_ap2(zone_affichage_message) {
  // Ce sont donc à priori l'une des deux réponses (vrai ou faux)...
  // On vérifie le mot de passe actuel :
  expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    // Le mot de passe est correct :
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // C'est ok, la requête de mise à jour (update) a été lancée :
      if (reponses[1]=="insertion_ok") {
        // On masque la zone d'actualisation :
        annuler_enregistrer_ap();
        // On affiche la nouvelle version du carnet de bord :
        recuperer_ap();
      } else {
        // L'insertion ne s'est pas faite correctement :
        $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le carnet de bord n'a pas été actualisé</b>. Contacter l'administrateur.";
      }
    }
  } else if (reponses[0]=="faux") {
    // Le mot de passe n'est pas correct :
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le carnet de bord n'a pas été actualisé.</b>.";
  } else {
    // La réponse n'est ni 'vrai' ni 'faux' et ne commence pas par "<div" : cas non conforme
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_actualisation_ap.php'. La réponse n'est pas conforme (ni 'vrai' ni 'faux' ni '<div'...).<b>Le carnet de bord n'a pas été actualisé</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function modification_enregistrement_ap(num) {
  //
  // On affiche la zone d'édition avec le texte dedans
  // pour que l'utilisateur puisse la modifier.
  //
  if (identifiant_eleve || identifiant_parent) {
    // ************************************************************************** -->
    // Les champs ont été renseignés et le format de la date est correct :
    // ************************************************************************** -->
    // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
    var elenoet = $("identifiant").value;
    var mdp = hex_md5($("mdp").value);
    // ************************************************************************** -->
    // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
    var zone_affichage_message = "p_message_actualisation_ap";
    // Fichier PHP à appeler :
    //                     "cdtxt_modification_ap.php?identifiant=...&mdp=...&num=..."
    // pour recevoir les listes d'options correspondant à l'élève.
    var fichier_php_a_appeler = "cdtxt_modification_ap.php";
      // Paramètres à passer au fichier php :
    var parametres = "elenoet=" + elenoet + "&mdp=" + mdp + "&num=" + num ;
    // Fonction de traitement du résultat de la requête :
    var fonction_resultat = "modification_enregistrement_ap2(\"" + zone_affichage_message + "\"," + num + ")";
    // Requête XMLHttpRequest :
    requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
    // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
    // ************************************************************************** -->
  } else {
    alert("La modification du carnet de bord n'est accessible qu'aux élèves !");
  }
}
// ****************************************************************************** -->
function modification_enregistrement_ap2(zone_affichage_message,num) {
  // Les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // Les données sont reçues, on peut faire la modif :
      $("num_ap").value = num;
      $("date_ap").value = reponses[1];
      if (reponses[2] == " ") { // Si le champ est vide, la fonction php a renvoyé un espace...
        $("texte_ap").value = "";
      } else {
        $("texte_ap").value = reponses[2];
      }
      document.form_cahierdetexte.competence_ap.options.selectedIndex = reponses[3];
      $("temps_ap").value = reponses[4];
      // Maintenant que le texte est dans le textarea du formulaire, on le transfère dans la zone
      // d'édition de tinyMCE (fonction inverse du tinyMCE.triggerSave).
      //tinyMCE.setContent('texte_ap');
      //tinyMCE.updateContent('texte_ap');
      //tinyMCE.get('texte_ap').getContent();
      //tinyMCE.activeEditor.getContent;
      //tinyMCE.activeEditor.getContent('texte_ap');
      tinyMCE.getInstanceById('texte_ap').getBody().innerHTML = $("texte_ap").value;
      //
      $("div_actualisation_ap").style.display = "block";
      $("p_message_actualisation_ap").innerHTML = "";
      $("div_bouton_actualiser_ap").style.display = "none";
      $("bouton_enregistrer_nouveau_ap").style.display = "none";
      $("bouton_enregistrer_modif_ap").style.display = "block";
    }
  } else if (reponses[0]=="faux") {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le carnet de bord ne peut pas être modifié.</b>.";
  } else {
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_modification_ap.php'. <b>Le carnet de bord ne peut pas être modifié</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function suppression_enregistrement_ap(num) {
  //
  // On affiche une boîte de dialogue de confirmation et on supprime l'enregistrement.
  //
  if (identifiant_eleve) {
    if (confirm("Suppression de cet enregistrement du carnet de bord ?") == true ) {
      // ************************************************************************ -->
      // Les champs ont été renseignés et le format de la date est correct :
      // ************************************************************************ -->
      // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
      var elenoet = $("identifiant").value;
      var mdp = hex_md5($("mdp").value);
      // ************************************************************************ -->
      // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
      var zone_affichage_message = "p_message_actualisation_ap";
      // Fichier à appeler :
      var fichier_php_a_appeler = "cdtxt_suppression_enregistrement.php";
      // Paramètres à passer au fichier php :
      var parametres = "elenoet=" + elenoet + "&mdp=" + mdp;
      parametres += "&num=" + num + "&table=table_ap";
      // Fonction de traitement du résultat de la requête :
      var fonction_resultat = "suppression_enregistrement_ap2(\"" + zone_affichage_message + "\")";
      // Requête XMLHttpRequest :
      requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
      // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
      // ************************************************************************ -->
    }
  } else {
    alert("Cette fonction n'est accessible qu'aux élèves !");
  }
}
// ****************************************************************************** -->
function suppression_enregistrement_ap2(zone_affichage_message) {
  // Les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<div", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else if (reponses[1]=="edition_ok") {
      // Suppression effectuée :
      // On affiche la nouvelle version du carnet de bord :
      recuperer_ap()
    } else {
      // Ce cas ne devrait pas se produire...
      alert("Une erreur a dû se produire... La réponse à la requête est :\n" + reponses[1] + "\net ne correspond pas à la réponse attendue.\nLa suppression de cette entrée du carnet de bord ne s'est peut-être pas effectuée correctement.\nContacter l'administrateur.");
    }
  } else if (reponses[0]=="faux") {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>La suppression de l'enregistrement du carnet de bord ne peut pas être effectuée</b>.";
  } else {
    $(zone_affichage_message).innerHTML = "ERREUR dans le fichier 'cdtxt_suppression_enregistrement.php'. <b>La suppression de l'enregistrement du carnet de bord ne peut pas être effectuée</b>. Contacter l'administrateur.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
function enregistrer_modification_ap() {
  //
  // On enregiqstre les modifications apportées.
  //
  if (identifiant_eleve) {
    // On bascule le contenu de l'iframe remplaçant le textearea vers la valeur de ce textarea 
    //  (TinyMCE utilise un iframe pour y placer le code html, qui remplace finalement le textarea, 
    //   dont la valeur reste nulle, si on n'utilise pas cette fonction).
    tinyMCE.triggerSave(true, true);
    // Maintenant, le contenu du textearea est dans : $("texte_ap").value
    //
    // On vérifie que les champs ont été remplis :
    if ($("date_ap").value.length == 0) {
      alert("Vous devez spécifier une date !");
    } else if ($("texte_ap").value.length == 0) {
      alert("Vous devez donner le texte !");
    } else {
      // Vérification de la date :
      var expressionReguliere = new RegExp("^[0-9]{2}[-]{1}[0-9]{2}[-]{1}[0-9]{4}");
      if ($("date_ap").value.match(expressionReguliere)) {
        // ********************************************************************** -->
        // Les champs ont été renseignés et le format de la date est correct :
        // ********************************************************************** -->
        // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
        var elenoet = $("identifiant").value;
        var mdp = hex_md5($("mdp").value);
        // On récupère les données nécessaires à l'insertion de l'enregistrement :
        var num = $("num_ap").value;
        var date = $("date_ap").value;
        var texte = encodage_caracteres($("texte_ap").value);
        var competence = $("competence_ap").value;
        var temps = $("temps_ap").value;
        // ********************************************************************** -->
        // On va lancer une requête sur la base de données grâce au XMLHttpRequest :
        var zone_affichage_message = "p_message_actualisation_ap";
        // Fichier PHP à appeler :
        // "cdtxt_enregistrement_modification_ap.php?elenoet=...&mdp=..."
        var fichier_php_a_appeler = "cdtxt_enregistrement_modification_ap.php";
        // Paramètres à passer au fichier php :
        var parametres = "elenoet=" + elenoet + "&mdp=" + mdp;
        parametres += "&num=" + num;
        parametres += "&date=" + date + "&texte=" + texte + "&competence=" + competence + "&temps=" + temps;
        // Fonction de traitement du résultat de la requête :
        var fonction_resultat = "enregistrer_modification_ap2(\"" + zone_affichage_message + "\")";
        // Requête XMLHttpRequest :
        requete_XMLHttpRequest("post","txt",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
        // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
        // ********************************************************************** -->
      } else {
        // Le format de la date n'est pas correct :
        alert("Veuillez spécifier la date avec le bon format.\nLe format doit être JJ-MM-AAAA.");
        // On passe le focus au champ concerné par cette erreur :
        $("date_ap").focus();
      }
    }
  } else {
    alert("La modification du carnet de bord n'est pas accessible aux élèves !");
  }
}
// ****************************************************************************** -->
function enregistrer_modification_ap2(zone_affichage_message) {
  // La réponse ne commence pas par "<p", c'est donc les deux réponses...
  // On vérifie le mot de passe actuel :
  var expressionReguliere = new RegExp("####","g"); // Découpage
  var reponses = reponse_requete_XMLHttpRequest.split(expressionReguliere);
  if (reponses[0]=="vrai") {
    if (reponses[1].substring(0,4)=="<div") {
      // La réponse commence par "<p>", c'est un message d'erreur...
      $(zone_affichage_message).innerHTML = reponses[1];
    } else {
      // La requête de mise à jour (update) a été lancée :
      if (reponses[1]=="mise_a_jour_ok") {
        // On masque la zone d'actualisation :
        annuler_enregistrer_ap()
        // On affiche la nouvelle version du carnet de bord :
        recuperer_ap()
      } else {
        $(zone_affichage_message).innerHTML = "ATTENTION, une erreur a été rencontrée lors du traitement des données :<br /> <b>le carnet de bord n'a pas été mis à jour</b>.\n Contacter l'administrateur.";
      }
    }
  } else {
    $(zone_affichage_message).innerHTML = "Votre mot de passe est incorrect. <b>Le carnet de bord n'a pas été mis à jour</b>.";
  }
}
// ****************************************************************************** -->
// ****************************************************************************** -->
// STATISTIQUES DE CONNEXIONS
// ****************************************************************************** -->
// ****************************************************************************** -->
function affichage_stats_connexions1() {
  // Pour les profs.
  //
  // ************************************************************************** -->
  // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
  var identifiant = $("identifiant").value;
  var mdp = hex_md5($("mdp").value);
  // ************************************************************************** -->
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_statistiques_connexions1.php";
  // Paramètres à passer à ce fichier php :
  var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
  // Zone d'affichage :
  var zone_affichage_message = "p_message_zone_identification";
  //
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "affichage_stats_connexions2(\"" + zone_affichage_message + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","xml",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  // ************************************************************************** -->
}
// ****************************************************************************** -->
function affichage_stats_connexions2(zone_affichage) {
  // On texte si le mdp est correct :
  var erreurs = reponse_requete_XMLHttpRequest.getElementsByTagName("erreur");
  if (erreurs.length > 0) { // Il y a une erreur en retour dans le XML...
    alert("Cette fonction n'est accessible qu'avec un mot de passe correct !");
  } else {
    // ************************************************************************ -->
    // Le mdp est ok
    // ************************************************************************ -->
    // Initialisation des variables :
    var items         = reponse_requete_XMLHttpRequest.getElementsByTagName("item");
    var numero_semaines     = new Array();
    var date_debut_semaines = new Array();
    var date_fin_semaines   = new Array();
    var types               = new Array();
    var nb_connexionss      = new Array();
    var snumero_semaine     = "";
    var sdate_debut_semaine = "";
    var sdate_fin_semaine   = "";
    var stype               = "";
    var snb_connexions      = "";
    //
    var total_connexions = 0;
    var total_connexions_semaine = 0;
    var semaine_precedente = "";
    var nombre_semaines = 1;
    //
    if (items.length > 0) {
      // On récupère le résultat de la requête :
      for (var i=0; i<items.length; i++) {
        numero_semaines[i]     = items[i].getElementsByTagName("numero_semaine")[0].firstChild;
        date_debut_semaines[i] = items[i].getElementsByTagName("date_debut_semaine")[0].firstChild;
        date_fin_semaines[i]   = items[i].getElementsByTagName("date_fin_semaine")[0].firstChild;
        types[i]               = items[i].getElementsByTagName("type")[0].firstChild;
        nb_connexionss[i]      = items[i].getElementsByTagName("nb_connexions")[0].firstChild;
      }
      // On affiche :
      if (numero_semaines.length > 0) {
        var aff_stats = "<p>Statistiques de connexion globales :<br />";
        aff_stats += "<table class=\"table_tableau4\">";
        aff_stats += "<tr><th class=\"th_tableau4_titre1l\">Semaine</th><th class=\"th_tableau4_titre1l\">Utilisateur</th><th class=\"th_tableau4_titre1l\">Nb de connexions</th></tr>";
        for (i=0; i<numero_semaines.length; i++) {
          // ******************************************************************** -->
          // Affichage de la ligne du tableau :
          if (numero_semaines[i]     != null) {snumero_semaine     = numero_semaines[i].nodeValue}     else {snumero_semaine     = ""};
          if (date_debut_semaines[i] != null) {sdate_debut_semaine = date_debut_semaines[i].nodeValue} else {sdate_debut_semaine = ""};
          if (date_fin_semaines[i]   != null) {sdate_fin_semaine   = date_fin_semaines[i].nodeValue}   else {sdate_fin_semaine   = ""};
          if (types[i]               != null) {stype               = types[i].nodeValue}               else {stype               = ""};
          if (nb_connexionss[i]      != null) {snb_connexions      = nb_connexionss[i].nodeValue}      else {snb_connexions      = ""};
          // ******************************************************************** -->
          // Totalisation des connexions :
          total_connexions += parseInt(snb_connexions);
          // ******************************************************************** -->
          // Gestion des totaux du temps :
          if (semaine_precedente == "") {
            // C'est la première ligne affichée, on mémorise cette semaine
            // et on initialise le total avec ce premier compte.
            semaine_precedente = snumero_semaine;
            total_connexions_semaine = parseInt(snb_connexions);
            affichage_complet = true;
          } else if (snumero_semaine == semaine_precedente) {
            // C'est la même semaine que la ligne d'avant, on ajoute le compte
            // au total de cette semaine.
            total_connexions_semaine += parseInt(snb_connexions);
            affichage_complet = false;
          } else {
            // On vient de changer de semaine. On affiche le total avant d'afficher la ligne
            aff_stats += "<tr><td colspan=\"3\" class=\"td_tableau4_cellule3\"> Nombre de connexions pour la semaine " + semaine_precedente + " : <strong>" + total_connexions_semaine + "</strong>.</td></tr>";
            // On réinitialise le total du temps et on mémorise la nouvelle compétence précédente.
            total_connexions_semaine = parseInt(snb_connexions);
            semaine_precedente = snumero_semaine;
            nombre_semaines++; // On incrémente le nombre de semaines.
            affichage_complet = true;
          }
          // ******************************************************************** -->
          if (affichage_complet) {
            // On affiche la ligne complète :
            aff_stats += "<tr><td class=\"td_tableau4_cellule4\">Semaine n°" + snumero_semaine + " (du " + sdate_debut_semaine + " au " + sdate_fin_semaine + ")</td><td class=\"td_tableau4_cellule4\">" + stype + "</td><td class=\"td_tableau4_cellule4\">" + snb_connexions + "</td></tr>";
          } else {
            // On affiche la ligne sans la semaine :
            aff_stats += "<tr><td class=\"td_tableau4_cellule4\"> </td><td class=\"td_tableau4_cellule4\">" + stype + "</td><td class=\"td_tableau4_cellule4\">" + snb_connexions + "</td></tr>";
          }
          // ******************************************************************** -->
        } // Fin du for (i=0; i<competences.length; i++) {
        // On affiche le sous-total de la dernière semaine :
        aff_stats += "<tr><td colspan=\"6\" class=\"td_tableau4_cellule3\"> Nombre de connexions pour la semaine " + snumero_semaine + " : <strong>" + total_connexions_semaine + "</strong>.</td></tr>";
        // ******************************************************************** -->
        // On affiche le total
        aff_stats += "<tr>";
        aff_stats += "<td colspan=\"6\" class=\"th_tableau4_titre1c\"> Nombre total de connexions : " + total_connexions + ".<br />Soit une moyenne de " + total_connexions / nombre_semaines + " connexions par semaine (sur " + nombre_semaines + " semaines)</td>";
        aff_stats += "</tr>";
        // ******************************************************************** -->
        // Fin de la talbe.
        aff_stats += "</table><br />";
        // Afficher les statistiques de connexion des élèves par classe :
        aff_stats += "Afficher les statistiques de connexion des élèves par classe : <input type=\"button\" value=\"Stats élèves par classe\" id=\"bouton_stats_connexions2\" onclick=\"affichage_stats_connexions3();\" /></p>";
        $(zone_affichage).innerHTML = aff_stats;
      } else {
        alert("ERREUR !\nFonction 'affichage_stats_connexions2()'' du fichier 'cahier_de_texte.js' :\n'Tableau 'numero_semaines[]' vide.\n Contacter l'administrateur.");
      }
    } else {
      $(zone_affichage).innerHTML = "Pas de statistiques...</p>";
    }
  } // Fin du if (items.length > 0) {
} // Fin du if (erreurs.length > 0)
// ****************************************************************************** -->
function affichage_stats_connexions3() {
  // Pour les profs.
  //
  // ************************************************************************** -->
  // On récupère l'identifiant et le mot de passe saisi par l'utilisateur :
  var identifiant = $("identifiant").value;
  var mdp = hex_md5($("mdp").value);
  // ************************************************************************** -->
  // Fichier php qui va élaborer la réponse (requête sur la base de données) :
  var fichier_php_a_appeler = "cdtxt_statistiques_connexions2.php";
  // Paramètres à passer à ce fichier php :
  var parametres = "identifiant=" + identifiant + "&mdp=" + mdp;
  // Zone d'affichage :
  var zone_affichage_message = "p_message_zone_identification";
  //
  // Fonction de traitement du résultat de la requête :
  var fonction_resultat = "affichage_stats_connexions4(\"" + zone_affichage_message + "\")";
  // Requête XMLHttpRequest :
  requete_XMLHttpRequest("post","xml",fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat);
  // Le résultat de cette requête va être stocké dans reponse_requete_XMLHttpRequest
  // ************************************************************************** -->
}
// ****************************************************************************** -->
function affichage_stats_connexions4(zone_affichage) {
  // On texte si le mdp est correct :
  var erreurs = reponse_requete_XMLHttpRequest.getElementsByTagName("erreur");
  if (erreurs.length > 0) { // Il y a une erreur en retour dans le XML...
    alert("Cette fonction n'est accessible qu'avec un mot de passe correct !");
  } else {
    // ************************************************************************ -->
    // Le mdp est ok
    // ************************************************************************ -->
    // Initialisation des variables :
    var items         = reponse_requete_XMLHttpRequest.getElementsByTagName("item");
    var numero_semaines     = new Array();
    var date_debut_semaines = new Array();
    var date_fin_semaines   = new Array();
    var classes             = new Array();
    var nb_connexionss      = new Array();
    var nb_elevess          = new Array();
    var snumero_semaine     = "";
    var sdate_debut_semaine = "";
    var sdate_fin_semaine   = "";
    var sclasse             = "";
    var snb_connexions      = "";
    var snb_eleves          = "";
    //
    var total_connexions = 0;
    var total_connexions_semaine = 0;
    var semaine_precedente = "";
    var nombre_semaines = 1;
    var affichage_complet = true;
    //
    if (items.length > 0) {
      // On récupère le résultat de la requête :
      for (var i=0; i<items.length; i++) {
        numero_semaines[i]     = items[i].getElementsByTagName("numero_semaine")[0].firstChild;
        date_debut_semaines[i] = items[i].getElementsByTagName("date_debut_semaine")[0].firstChild;
        date_fin_semaines[i]   = items[i].getElementsByTagName("date_fin_semaine")[0].firstChild;
        classes[i]             = items[i].getElementsByTagName("classe")[0].firstChild;
        nb_connexionss[i]      = items[i].getElementsByTagName("nb_connexions")[0].firstChild;
        nb_elevess[i]          = items[i].getElementsByTagName("nb_eleves")[0].firstChild;
      }
      // On affiche :
      if (numero_semaines.length > 0) {
        var aff_stats = "<p>Statistiques de connexion élèves par classe :<br />";
        aff_stats += "<table class=\"table_tableau4\">";
        aff_stats += "<tr><th class=\"th_tableau4_titre1l\">Semaine</th><th class=\"th_tableau4_titre1l\">Classe</th><th class=\"th_tableau4_titre1l\">Nb de connexions</th><th class=\"th_tableau4_titre1l\">Nb d'élèves connectés</th></tr>";
        for (i=0; i<numero_semaines.length; i++) {
          // ******************************************************************** -->
          // Affichage de la ligne du tableau :
          if (numero_semaines[i]     != null) {snumero_semaine     = numero_semaines[i].nodeValue}     else {snumero_semaine     = ""};
          if (date_debut_semaines[i] != null) {sdate_debut_semaine = date_debut_semaines[i].nodeValue} else {sdate_debut_semaine = ""};
          if (date_fin_semaines[i]   != null) {sdate_fin_semaine   = date_fin_semaines[i].nodeValue}   else {sdate_fin_semaine   = ""};
          if (classes[i]             != null) {sclasse             = classes[i].nodeValue}             else {sclasse             = ""};
          if (nb_connexionss[i]      != null) {snb_connexions      = nb_connexionss[i].nodeValue}      else {snb_connexions      = ""};
          if (nb_elevess[i]          != null) {snb_eleves          = nb_elevess[i].nodeValue}          else {snb_eleves          = ""};
          // ******************************************************************** -->
          // Totalisation des connexions :
          total_connexions += parseInt(snb_connexions);
          // ******************************************************************** -->
          // Gestion des totaux du temps :
          if (semaine_precedente == "") {
            // ******************************************************************** -->
            // C'est la première ligne affichée, on mémorise cette semaine
            // et on initialise le total avec ce premier compte.
            semaine_precedente = snumero_semaine;
            total_connexions_semaine = parseInt(snb_connexions);
            affichage_complet = true;
            // ******************************************************************** -->
          } else if (snumero_semaine == semaine_precedente) {
            // ******************************************************************** -->
            // C'est la même semaine que la ligne d'avant, on ajoute le compte
            // au total de cette semaine.
            total_connexions_semaine += parseInt(snb_connexions);
            affichage_complet = false;
            // ******************************************************************** -->
          } else {
            // ******************************************************************** -->
            // On vient de changer de semaine. On affiche le total avant d'afficher la ligne
            aff_stats += "<tr><td colspan=\"4\" class=\"td_tableau4_cellule3\"> Nombre de connexions pour la semaine " + semaine_precedente + " : <strong>" + total_connexions_semaine + "</strong>.</td></tr>";
            // On réinitialise le total du temps et on mémorise la nouvelle compétence précédente.
            total_connexions_semaine = parseInt(snb_connexions);
            semaine_precedente = snumero_semaine;
            nombre_semaines++; // On incrémente le nombre de semaines.
            affichage_complet = true;
            // ******************************************************************** -->
          }
          // ******************************************************************** -->
          if (affichage_complet) {
            // On affiche la ligne complète :
            aff_stats += "<tr><td class=\"td_tableau4_cellule4\">Semaine n°" + snumero_semaine + " (du " + sdate_debut_semaine + " au " + sdate_fin_semaine + ")</td><td class=\"td_tableau4_cellule4\">" + sclasse + "</td><td class=\"td_tableau4_cellule4\">" + snb_connexions + "</td><td class=\"td_tableau4_cellule4\">" + snb_eleves + "</td></tr>";
          } else {
            // On affiche la ligne sans la semaine :
            aff_stats += "<tr><td class=\"td_tableau4_cellule4\"> </td><td class=\"td_tableau4_cellule4\">" + sclasse + "</td><td class=\"td_tableau4_cellule4\">" + snb_connexions + "</td><td class=\"td_tableau4_cellule4\">" + snb_eleves + "</td></tr>";
          }
          // ******************************************************************** -->
        } // Fin du for (i=0; i<competences.length; i++) {
        // On affiche le sous-total de la dernière semaine :
        aff_stats += "<tr><td colspan=\"6\" class=\"td_tableau4_cellule3\"> Nombre de connexions pour la semaine " + snumero_semaine + " : <strong>" + total_connexions_semaine + "</strong>.</td></tr>";
        // ******************************************************************** -->
        // On affiche le total
        aff_stats += "<tr>";
        aff_stats += "<td colspan=\"6\" class=\"th_tableau4_titre1c\"> Nombre total de connexions élèves : " + total_connexions + ".<br />Soit une moyenne de " + total_connexions / nombre_semaines + " connexions par semaine (sur " + nombre_semaines + " semaines)</td>";
        aff_stats += "</tr>";
        // ******************************************************************** -->
        // Fin de la talbe.
        aff_stats += "</table>";
        // Afficher les statistiques de connexion des élèves par classe :
        aff_stats += "<br />Afficher les statistiques de connexion globales : <input type=\"button\" value=\"Stats\" id=\"bouton_stats_connexions1\" onclick=\"affichage_stats_connexions1();\" /></p>";
        $(zone_affichage).innerHTML = aff_stats;
      } else {
        alert("ERREUR !\nFonction 'affichage_stats_connexions3()'' du fichier 'cahier_de_texte.js' :\n'Tableau 'numero_semaines[]' vide.\n Contacter l'administrateur.");
      }
    } else {
      $(zone_affichage).innerHTML = "Pas de statistiques...</p>";
    }
  } // Fin du if (items.length > 0) {
} // Fin du if (erreurs.length > 0)
// ****************************************************************************** -->
// ****************************************************************************** -->
// ****************************************************************************** -->
// ****************************************************************************** -->

