// ********************************************************************************************** -->
// Fichier : scripts_js_communs.js                                                                -->
// Réalisé par P. ARNOULD / Créé le 21/08/2009 / Modifié le 05/08/2011                            -->
// ********************************************************************************************** -->
// Scripts communs à "cahier_de_texte.php", "cahier_de_texte_admin.php" et "base.php".
// ********************************************************************************************** -->
// VARIALES GLOBALES :
identifiant_eleve  = false; // Ces variables sont déclarées en dehors des fonctions et ne sont pas
identifiant_prof   = false; // déclarées avec "var", elle sont donc globales
identifiant_admin  = false; // et peuvent être utilisées dans les autres fonctions de ce script.
identifiant_parent = false; // 
mdp_valide         = false; //
onglet_encours     = 0;
// ********************************************************************************************** -->
// Variables pour modifier le comportement de la touche "Entrée".
// Lorsqu'on appuie sur cette touche, cela valide le formulaire, ce qui est gênant
// (l'utilisateur appuie sur cette touche après avoir taper son nom, le formulaire est envoyé
// alors qu'il n'a pas encore tapé son mdp...). Maintenant, lorsqu'on tape Entrée, cela passe
// le focus au champ ou au bouton suivant.
// Voir les ajouts dans les fonctions onFocus et onBlur des champs input des formulaires.
toucheDesactivee=255;       //la touche 255 est inusitée ; touche enter = 13
focusSuivant="identifiant"; // le premier champ de formulaire ou n'importe quel id
gk=window.Event?1:0;        // ? : à étudier !
// ********************************************************************************************** -->
// ********************************************************************************************** -->
// Fonction et instruction pour gérer l'appui sur la touche Entrée.
// ********************************************************************************************** -->
function toucheenter(e) {
  var touche=gk?e.which:window.event.keyCode; //pour compatibilité FF IE
  if (touche == toucheDesactivee){
    $(focusSuivant).focus();
    return false;
  }
}
document.onkeydown = toucheenter;
// ********************************************************************************************** -->
// Fonction XMLHttpRequest pour faire une requête AJAX : réponse TEXT ou XML.
// ********************************************************************************************** -->
function requete_XMLHttpRequest(methode,mode,fichier_php_a_appeler,parametres,zone_affichage_message,fonction_resultat) {
  // ******************************************************************************************** -->
  // Paramètres transmis :
  //   methode               : get ou post.
  //   mode                  : txt ou xml (type de la réponse).
  //   fichier_php_a_appeler : nom du fichier, suivi des paramètres à transmettre.
  //   Attention au format du fichier appelé qui doit être enadéquation avec le mode :
  //     Si mode="txt", le fichier php renvoyant la réponse au format txt doit commencer par :
  //                              <?php
  //                                header("Content-Type:text/plain; charset=iso-8859-1");
  //                                header("Cache-Control: no-cache, must-revalidate");
  //                                header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  //     Si mode="xml", le fichier php renvoyant la réponse au format xml doit commencer par :
  //                              <?php
  //                                header("Content-Type:text/xml; charset=iso-8859-1");
  //                                header("Cache-Control: no-cache, must-revalidate");
  //                                header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  //     La réponse au format XML (renvoyée avec des echo) doit être du type :
  //                              <?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?".">
  //                              <reponses xml:lang=\"FR\">
  //                                <item>
  //                                  <reponse>
  //                                    le texte de la réponse...
  //                                  </reponse>
  //                                </item>
  //                              </reponses>
  //   zone_affichage_message : id de la zone dans laquelle il faut afficher les messages.
  //   fonction_resultat()    : fonction vers laquelle il faut envoyer le résultat (avec paramètres).
  // ******************************************************************************************** -->
  // Initialisation des variables :
  var xhr = null;
  var xhr = false;
  var self = this;
  if (window.XMLHttpRequest) {
    self.xhr = new XMLHttpRequest();
  } else if (window.ActiveXObject) {
    self.xhr = new ActiveXObject("Microsoft.XMLHTTP");
  } else {
    alert("Votre navigateur n'est pas compatible avec AJAX...\n Cette application ne peut pas fonctionner.\n Contacter l'administrateur.");
  }
  // ******************************************************************************************** -->
  // Définition de la fonction qui détectera le changement d'état de la requête XMLHttpRequest
  // lorsqu'elle sera lancée, qui traitera la réponse et la renverra sa valeur :
  self.xhr.onreadystatechange = function() {
    // ****************************************************************************************** -->
    // Dès que la requête change d'état, on regarde si elle a abouti :
    if (self.xhr.readyState == 4) {
      // **************************************************************************************** -->
      // Elle a abouti, la réponse a été envoyée :
      $(zone_affichage_message).innerHTML = "";
      //$("p_message_erreur_zone_divmatgrp").innerHTML = "";
      //$("p_message_zone_identification").innerHTML = "";
      //$("p_affichage_bulletin_appel").innerHTML = "";
      //$("p_affichage_cahier_de_texte").innerHTML = "";
      //
      if (self.xhr.status == 200) { // Le fichier cible (php) existe-t-il ?
        // ************************************************************************************** -->
        // La requête a abouti correctement :
        // Fichier récupéré, récupération des données :
        if (mode == "txt") {
          // ************************************************************************************ -->
          // xhr.responseText contient le résultat du fichier php appelé
          reponse_requete_XMLHttpRequest = self.xhr.responseText;
          // ************************************************************************************ -->
        } else if (mode == "xml") {
          // ************************************************************************************ -->
          // xhr.responseText contient le résultat du fichier php appelé
          reponse_requete_XMLHttpRequest = self.xhr.responseXML;
          // ************************************************************************************ -->
        } else {
          alert("ERREUR !\n 'mode' incorrect dans l'appel de la fonction 'requete_XMLHttpRequest'.\n Le mode doit être 'txt' ou 'xml'.\n Contacter l'administrateur.");
          reponse_requete_XMLHttpRequest = "";
        } // ************************************************************************************ -->
        // Analyse du résultat / Identification du type de document / Détection d'une erreur.
        // En cas d'erreur dans le fichier PHP appelé, celui-ci renvoie l'erreur encadrée de <div...
        var erreur = false;
        //if (reponse_requete_XMLHttpRequest.nodeType == 9) { // Le résultat est du XML
        if (mode == "xml") {
          // Il faut extraire le message d'erreur du XML pour l'afficher.
          var items = reponse_requete_XMLHttpRequest.getElementsByTagName("item_erreur");
          if (items.length > 0) {
            var texte_erreur = items[0].getElementsByTagName("erreur")[0].firstChild.nodeValue;
            // En mode XML, le texte d'erreur a été envoyé avec les "<" des balises html remplacée par
            // des "##" pour que ces balises ne soient pas interprétées comme des balises XML, ce qui
            // auraient empêché de les récupérer.
            var expressionReguliere = new RegExp("##","g");
            texte_erreur = texte_erreur.replace(expressionReguliere,"<");
            erreur = true;
            $(zone_affichage_message).innerHTML = texte_erreur;
          } else {
          // Pas de balise xml <item_erreur> dans la réponse, il ne s'agit donc pas d'un message d'erreur
          erreur = false;
          }
        } else { // Mode 'txt' : le résultat est du texte
          if (reponse_requete_XMLHttpRequest.substring(0,4)=="<div") {
            erreur = true;
            // La réponse commence par "<div", c'est un message d'erreur...
            $(zone_affichage_message).innerHTML = reponse_requete_XMLHttpRequest;
          } else {
            // Ce n'est pas un message d'erreur
            erreur = false;
          }
        }
        if (!erreur) {
          // Pas d'erreur, la réponse est dans la variable globale et on appelle la fonction résultat :
          // Appel de la fonction :
          eval(fonction_resultat);
        }
        // ************************************************************************************** -->
      } else {
        // Le fichier cible n'existe pas, on affiche un message d'erreur en spécifiant le nom du fichier
        // sans les paramètres :
        if (fichier_php_a_appeler.indexOf("&") > 0) {
          // Si le fichier à appeler contient le caractère "&" (paramètres passé dans la fonction) :
          var nom_fichier = fichier_php_a_appeler.substring(0,fichier_php_a_appeler.indexOf("&"));
        } else {
          var nom_fichier = fichier_php_a_appeler;
        }
        alert("ERREUR dans la fonction 'requete_XMLHttpRequest' !\nStatut XHR = " + self.xhr.status + ".\nFichier '" + nom_fichier + "' non trouvé.\n Contacter l'administrateur.");
      }
    } else {
      // **************************************************************************************** -->
      // La réponse se fait attendre :
      $(zone_affichage_message).innerHTML            = "<img src=\"images/progressbar.gif\" /> <i>Traitement en cours...</i>";
      //$("p_message_erreur_zone_divmatgrp").innerHTML = "<img src=\"images/progressbar.gif\" /> <i>Traitement en cours...</i>";
      //$("p_message_zone_identification").innerHTML   = "<img src=\"images/chargement.gif\" /> <i>Traitement en cours...</i>";
      //$("p_affichage_bulletin_appel").innerHTML      = "<img src=\"images/chargement.gif\" /> <i>Traitement en cours...</i>";
      //$("p_affichage_cahier_de_texte").innerHTML     = "<img src=\"images/chargement.gif\" /> <i>Traitement en cours...</i>";
    }
    // ****************************************************************************************** -->
  } // Fin function()
  // ******************************************************************************************** -->
  // Ouverture de la requête et envoi  :
  if (methode == "get") {
    // ****************************************************************************************** -->
    self.xhr.open("GET", fichier_php_a_appeler + '?' + parametres, true);
    // self.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    self.xhr.send(null);
    // ****************************************************************************************** -->
  } else if (methode == "post") {
    // ****************************************************************************************** -->
    self.xhr.open("POST", fichier_php_a_appeler, true);
    self.xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    self.xhr.send(parametres);
    // ****************************************************************************************** -->
  } else {
    alert("ERREUR !\n 'methode' incorrecte dans l'appel de la fonction 'requete_XMLHttpRequest'.\n La méthode doit être 'get' ou 'post'.\n Contacter l'administrateur.");
    reponse_requete_XMLHttpRequest = "";
  } // ****************************************************************************************** -->
  // ******************************************************************************************** -->
}
// ********************************************************************************************** -->
// ********************************************************************************************** -->
// Encodage d'un texte pour transmission dans une URL :
// ********************************************************************************************** -->
function encodage_caracteres(texte) {
  // Conversion des caractères spéciaux : les paramètres vont être transmis par un GET ou un POST de la
  // fonction XMLHttpRequest. Les paramètres sont ajoutés au nom du fichier
  // PHP comme dans une URL. Il faut donc encoder les caractères spéciaux (à l'envoi avec
  // javascript) puis les décoder avec urldecode() (à la réception avec le PHP).
  //
  // Caractères à coder :
  var tableau_caracteres = new Array(String.fromCharCode(10)," ","\"","\\\\","\\?","\\$","\\+","&","#","µ","à","â","ä","è","é","ê","ë","î","ï","ô","ö","ù","û","ü","ç");
  // Codes des caractères :
  var tableau_codes_caracteres = new Array("%0A","%20","%22","%8E","%3F","%24","%86","%26","%23","%B5","%E0","%E2","%E4","%E8","%E9","%EA","%EB","%EE","%EF","%F4","%F6","%F9","%FB","%FC","%E7");
  // Attention : les caractères "+" (plus) et "\" (antislash) sont transformés respectivement
  // en hexa "86" (dec 134 : †) et "8E" (dec 143 : Ž) (et non pas "2B" et "5C")
  // car ces caractère ne peuvent être transmis dans l'URL. Il faudra les rétablir côté PHP.
  for (var i=0;i<tableau_caracteres.length;i++) {
    expressionReguliere = new RegExp(tableau_caracteres[i],"g");
    texte = texte.replace(expressionReguliere,tableau_codes_caracteres[i]);
  }
  // On renvoie la chaîne traitée :
  return texte;
}
// ********************************************************************************************** -->

