diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/ajax.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/ajax.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/ajax.php	2015-10-24 02:45:24.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/ajax.php	2015-10-24 02:45:29.896962640 +0200
@@ -72,19 +72,19 @@
     if ( sha1($_REQUEST['mdp']) != $s['mdp'] )
       $message = '{"etat":"nok","message":"Mot de passe incorrect"}';
     elseif ( !strlen($prenom = trim($_REQUEST['prenom'])) || !strlen($nom = trim($_REQUEST['nom'])) || !strlen($mail = strtolower(trim($_REQUEST['mail1']))) )
-      $message = '{"etat":"nok","message":"Votre compte n\'a pas pu être modifié. Prénom, nom et adresse mail non vides nécessaires."}';
+      $message = '{"etat":"nok","message":"Votre compte n\'a pas pu être modifié. Prénom, nom et adresse électronique non vides nécessaires."}';
     elseif ( ( $mail != $s['mail'] ) && strlen($_REQUEST['mail2']) )  {
       if ( !filter_var($mail,FILTER_VALIDATE_EMAIL) )
-        $message = '{"etat":"nok","message":"Adresse mail non valide"}';
+        $message = '{"etat":"nok","message":"Adresse électronique non valide"}';
       elseif ( $mail != $_REQUEST['mail2'] )
-        $message = '{"etat":"nok","message":"Adresses mails différentes"}';
+        $message = '{"etat":"nok","message":"Adresses électroniques différentes"}';
       else  {
         // Vérification que l'adresse n'existe pas déjà
         $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) AS mails FROM utilisateurs WHERE id != ${_SESSION['id']} AND LENGTH(mail)");
         $s = $resultat->fetch_assoc();
         $resultat->free();
         if ( in_array($mail,explode(',',$s['mails'])) )
-          $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
+          $message = '{"etat":"nok","message":"Adresse électronique déjà prise"}';
         else 
           $requete_mail = ', mail = \''.$mysqli->real_escape_string($mail).'\'';
       }
@@ -113,7 +113,7 @@
       $s = $resultat->fetch_assoc();
       $resultat->free();
       if ( in_array($login,explode(',',$s['logins'])) )
-        $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
+        $message = '{"etat":"nok","message":"Adresse électronique déjà prise"}';
       else 
         $requete_login = ', login = \''.$mysqli->real_escape_string($login).'\'';
     }
@@ -189,23 +189,23 @@
       $message = ( requete('utilisateurs',"UPDATE utilisateurs SET mailcopy = $val WHERE id = ${_SESSION['id']}",$mysqli) ) ? '{"etat":"ok","message":"Mise en copie modifiée"}' : '{"etat":"nok","message":"La mise en copie n\'a pas pu être modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
     else  {
       if ( !filter_var($val,FILTER_VALIDATE_EMAIL) )
-        $message = '{"etat":"nok","message":"Adresse mail non valide"}';
+        $message = '{"etat":"nok","message":"Adresse électronique non valide"}';
       else  {
         // Mail : vérification qu'il n'existe pas déjà
         $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) AS mails FROM utilisateurs WHERE id != ${_SESSION['id']} AND LENGTH(mail)");
         $s = $resultat->fetch_assoc();
         $resultat->free();
         if ( in_array($mail = strtolower($mysqli->real_escape_string($val)),explode(',',$s['mails'])) )
-          $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
+          $message = '{"etat":"nok","message":"Adresse électronique déjà prise"}';
         elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mail = '$mail' WHERE id = ${_SESSION['id']}",$mysqli) )
-          $message = '{"etat":"ok","message":"Adresse mail modifiée"}';
+          $message = '{"etat":"ok","message":"Adresse électronique modifiée"}';
       }
     }
   }
 
-/////////////////////////////////////////////////
-// Accès colleur et professeur : envoi de mail //
-/////////////////////////////////////////////////
+/////////////////////////////////////////////////////
+// Accès colleur et professeur : envoi de courriel //
+/////////////////////////////////////////////////////
   elseif ( isset($_REQUEST['envoimail']) && isset($_REQUEST['id-copie']) && isset($_REQUEST['sujet']) && isset($_REQUEST['texte'])  )  {
     // Récupération des données de l'utilisateur courant
     $resultat = $mysqli->query("SELECT mailexp, mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
@@ -221,15 +221,15 @@
     $ids = explode(',',$_REQUEST['id-copie']);
     foreach ( $ids as $i )
       if ( isset($utilisateurs[$i]) )  {
-        $dests .= $utilisateurs[$i]['nom'].' <'.$utilisateurs[$i]['mail'].'>, ';
+        $dests .= '=?UTF-8?B?'.base64_encode($utilisateurs[$i]['nom']).'?= <'.$utilisateurs[$i]['mail'].'>, ';
         unset($utilisateurs[$i]);
       }
     if ( !strlen($dests) )
-      $message = '{"etat":"nok","message":"Pas de destinataire valide : mail non envoyé"}';
+      $message = '{"etat":"nok","message":"Pas de destinataire valide : courriel non envoyé"}';
     elseif ( !strlen($sujet = $_REQUEST['sujet']) )
-      $message = '{"etat":"nok","message":"Pas de sujet : mail non envoyé"}';
+      $message = '{"etat":"nok","message":"Pas de sujet : courriel non envoyé"}';
     elseif ( !strlen($texte = $_REQUEST['texte']) )
-      $message = '{"etat":"nok","message":"Pas de texte : mail non envoyé"}';
+      $message = '{"etat":"nok","message":"Pas de texte : courriel non envoyé"}';
     else  {
       $dests = substr($dests,0,-2);
       $bcc = ( isset($_REQUEST['copie']) ) ? "${u['mailexp']} <${u['mail']}>, " : '';
@@ -237,7 +237,7 @@
         $ids = explode(',',$_REQUEST['id-bcc']);
         foreach ( $ids as $i )
           if ( isset($utilisateurs[$i]) )  {
-            $bcc .= $utilisateurs[$i]['nom'].' <'.$utilisateurs[$i]['mail'].'>, ';
+            $bcc .= '=?UTF-8?B?'.base64_encode($utilisateurs[$i]['nom']).'?= <'.$utilisateurs[$i]['mail'].'>, ';
             unset($utilisateurs[$i]);
           }
       $bcc = ( strlen($bcc) ) ? 'Bcc: '.substr($bcc,0,-2) : '';
@@ -247,9 +247,9 @@
       $n1 = substr_count($dests,'<');
       $n2 = substr_count($bcc,'<') - isset($_REQUEST['copie']);
       if ( $n2 )
-        $message = 'Mail envoyé à '.($n1+$n2).' destinataires (dont '.$n2.' en copie cachée)';
+        $message = 'Courriel envoyé à '.($n1+$n2).' destinataires (dont '.$n2.' en copie cachée)';
       else
-        $message = ( $n1 > 1 ) ? "Mail envoyé à $n1 destinataires." : 'Mail envoyé à 1 destinataire';
+        $message = ( $n1 > 1 ) ? "Courriel envoyé à $n1 destinataires." : 'Courriel envoyé à 1 destinataire';
       $message = $_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"$message\"}";
     }
   }
@@ -1142,7 +1142,7 @@
     }
 
     // Modifications de tous les utilisateurs : suppression, modification
-    // nom/prénom/mail, association à une matière, validation
+    // nom/prénom/adresse électronique, association à une matière, validation
     elseif ( isset($_REQUEST['id']) && ctype_digit($id = $_REQUEST['id']) )  {
       // Vérification que l'identifiant est valide
       $resultat = $mysqli->query("SELECT IF(LENGTH(nom),CONCAT(prenom,' ',nom),login) AS nom, matieres, login, mail, (LENGTH(mdp)=40) AS valide, autorisation FROM utilisateurs WHERE id = $id");
@@ -1153,7 +1153,8 @@
         // Suppression
         if ( isset($_REQUEST['supprime']) )  {
           if ( requete('utilisateurs',"DELETE FROM utilisateurs WHERE id = $id",$mysqli)
-             && requete('groupes',"UPDATE groupes SET eleves = TRIM(BOTH ',' FROM REPLACE(CONCAT(',',eleves,','),',$id,',',')) WHERE FIND_IN_SET($id,eleves)",$mysqli) )
+             && requete('groupes',"UPDATE groupes SET eleves = TRIM(BOTH ',' FROM REPLACE(CONCAT(',',eleves,','),',$id,',',')) WHERE FIND_IN_SET($id,eleves)",$mysqli)
+             && requete('notes',"DELETE FROM notes WHERE colleur = $id OR eleve = $id",$mysqli) )
             $message = $_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"${r['nom']} supprimé\"}";
           else
             $message = '{"etat":"nok","message":"La suppression n\'a pas été réalisée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
@@ -1170,24 +1171,24 @@
             }
             else  {
               if ( !filter_var($val,FILTER_VALIDATE_EMAIL) )
-                $message = '{"etat":"nok","message":"Adresse mail non valide"}';
+                $message = '{"etat":"nok","message":"Adresse électronique non valide"}';
               else  {
-                // Mail : vérification qu'il n'existe pas déjà
+                // Adresse électronique : vérification qu'il n'existe pas déjà
                 $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) AS mails FROM utilisateurs WHERE id != $id AND LENGTH(mail)");
                 $s = $resultat->fetch_assoc();
                 $resultat->free();
                 if ( in_array($mail = strtolower($mysqli->real_escape_string($val)),explode(',',$s['mails'])) )
-                  $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
+                  $message = '{"etat":"nok","message":"Adresse électronique déjà prise"}';
                 elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mail = '$mail' WHERE id = $id",$mysqli) )  {
-                  $message = "{\"etat\":\"ok\",\"message\":\"Adresse mail de ${r['nom']} modifiée (utilisateur prévenu par mail)\"}";
-                  // Récupération de l'adresse mail du professeur connecté
+                  $message = "{\"etat\":\"ok\",\"message\":\"Adresse électronique de ${r['nom']} modifiée (utilisateur prévenu par courriel)\"}";
+                  // Récupération de l'adresse électronique du professeur connecté
                   $resultat = $mysqli->query("SELECT mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
                   $s = $resultat->fetch_row();
                   $resultat->free();
                   if ( !isset($mailadmin) )
                     $mailadmin = 'admin@cahier-de-prepa.fr';
                   $returnpath = ( strlen($s[0]) ) ? $s[0] : $mailadmin;
-                  mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Changement d\'adresse mail').'?=',
+                  mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Changement d\'adresse électronique').'?=',
 'Bonjour
 
 L\'équipe pédagogique en charge du Cahier de Prépa <http'.($https?'s':'')."://$site> vient de modifier l'adresse électronique correspondant à l'identifiant ${r['login']}. Elle y a mis l'adresse à laquelle vous recevez ce courrier.
@@ -1312,9 +1313,9 @@
               $m .= "<br>Ligne $i : erreur MySQL n°".$mysqli->errno.' «'.$mysqli->error.'»';
           }
         }
-      // Comptes élèves, colleurs ou professeurs : mot de passe fourni ou invitation par mail
+      // Comptes élèves, colleurs ou professeurs : mot de passe fourni ou invitation par courriel
       else  {
-        // Récupération des adresses mails
+        // Récupération des adresses électroniques
         $resultat = $mysqli->query('SELECT GROUP_CONCAT(mail) FROM utilisateurs WHERE LENGTH(mail)');
         $r = $resultat->fetch_row();
         $resultat->free();
@@ -1329,9 +1330,9 @@
           if ( ( count($u) != 3 ) || !strlen($u[0].$u[1]) || !strlen($u[2]) )
             $m .= "<br>Ligne $i : mauvais paramètres";
           elseif ( ( $sep == ',' ) && in_array($mail = strtolower($u[2]),explode(',',$r[0])) )
-            $m .= "<br>Ligne $i : mail déjà existant";
+            $m .= "<br>Ligne $i : adresse électronique déjà existante";
           elseif ( ( $sep == ',' ) && !filter_var($mail,FILTER_VALIDATE_EMAIL) )
-            $m .= "<br>Ligne $i : mail non valide";
+            $m .= "<br>Ligne $i : adresse électronique non valide";
           else  {
             // Nettoyage des données envoyées
             $nom = mb_convert_case(strip_tags($mysqli->real_escape_string($u[0])),MB_CASE_TITLE,'UTF-8');
@@ -1349,7 +1350,7 @@
                 $n = $n+1;
                 if ( $mail )  {
                   $lien = ( $https ? 'https' : 'http' )."://$site/connexion?reponseinvitation&mail=$mail&p=".sha1($site.$mdp.$mail);
-                  // Récupération de l'adresse mail du professeur connecté
+                  // Récupération de l'adresse électronique du professeur connecté
                   $resultat = $mysqli->query("SELECT mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
                   $s = $resultat->fetch_row();
                   $resultat->free();
@@ -1361,7 +1362,7 @@
 
 L\'équipe pédagogique en charge du Cahier de Prépa <http'.($https?'s':'')."://$site> vous invite à les rejoindre.
 
-S'il s'agit d'une erreur, merci d'ignorer simplement ce mail.
+S'il s'agit d'une erreur, merci d'ignorer simplement ce courriel.
 
 Sinon, veuillez cliquer ci-dessous pour vous rendre à la page qui vous permettra d'entrer un mot de passe :
    $lien
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/cdt.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt.php	2015-10-04 00:47:30.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/cdt.php	2015-10-27 12:54:29.325706838 +0100
@@ -154,7 +154,7 @@
 ////////////
 /// HTML ///
 ////////////
-debut($mysqli,"Cahier de texte - ${matiere['nom']}",$message,$autorisation,"cdt?${matiere['cle']}",$matiere['id']);
+debut($mysqli,"Cahier de texte - ${matiere['nom']}". ( ( $edition && $matiere['protection'] ) ? "<span class=\"icon-lock${matiere['protection']}\"></span>" : '' ),$message,$autorisation,"cdt?${matiere['cle']}",$matiere['id']);
 
 // MathJax désactivé par défaut
 $mathjax = false;
@@ -173,7 +173,6 @@
     <input type=\"text\" value=\"$recherche\" onchange=\"window.location='?${matiere['cle']}&amp;recherche='+this.value;\" title=\"Recherche dans les textes des programmes de colles\">
     <span class=\"icon-recherche\" onclick=\"if ( !$(this).prev().is(':visible')) $(this).prev().show(); else window.location='?${matiere['cle']}&amp;recherche='+$(this).prev().val();\"></span>
   </p>
-
 ";
 
 // Affichage du titre de chaque semaine
@@ -240,10 +239,10 @@
       $resultat->free();
     }
     else
-      echo "  <h2>Aucun résultat n'a été trouvé pour cette recherche.</h2>\n";
+      echo "\n  <h2>Aucun résultat n'a été trouvé pour cette recherche.</h2>\n";
   }
   else
-    echo "  <h2>L'année est terminée... Bonnes vacances&nbsp;!</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le cahier de texte</a></p>\n";
+    echo "\n  <h2>L'année est terminée... Bonnes vacances&nbsp;!</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le cahier de texte</a></p>\n";
 }
 
 // Affichage professeur éditeur
@@ -252,7 +251,6 @@
   
   <a class="icon-aide general" data-id="page" title="Aide pour l'édition du cahier de texte"></a>
   <a class="icon-ajoute general" data-id="ajoute" title="Ajouter un nouvel élément du cahier de texte"></a>
-
 $boutons
 FIN;
   if ( $n !== false )  {
@@ -319,10 +317,10 @@
       $resultat->free();
     }
     else
-      echo "  <article><h2>Aucun résultat n'a été trouvé pour cette recherche.</h2></article>\n\n";
+      echo "\n  <article><h2>Aucun résultat n'a été trouvé pour cette recherche.</h2></article>\n\n";
   }
   else
-    echo "  <article><h2>L'année est terminée... Bonnes vacances&nbsp;!</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le cahier de texte</a></p></article>\n";
+    echo "\n  <article><h2>L'année est terminée... Bonnes vacances&nbsp;!</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le cahier de texte</a></p></article>\n";
 
   // Récupération des boutons
   $resultat = $mysqli->query("SELECT id, nom, jour, TIME_FORMAT(h_debut,'%Hh%i') AS h_debut, TIME_FORMAT(h_fin,'%Hh%i') AS h_fin,
@@ -356,15 +354,11 @@
 
   <form id="form-cdt">
     <p class="ligne"><label for="racourci">Raccourci&nbsp;:</label>
-      <select id="raccourci" name="raccourci">
-        <?php echo $select_raccourcis; ?>
-      </select>
+      <select id="raccourci" name="raccourci"><?php echo $select_raccourcis; ?></select>
       <a class="icon-edite" href="cdt-raccourcis?<?php echo $matiere['cle']; ?>">&nbsp;</a>
     </p>
     <p class="ligne"><label for="tid">Séance&nbsp;:</label>
-      <select id="tid" name="tid">
-        <?php echo $select_seances; ?>
-      </select>
+      <select id="tid" name="tid"><?php echo $select_seances; ?></select>
       <a class="icon-edite" href="cdt-seances?<?php echo $matiere['cle']; ?>">&nbsp;</a>
     </p>
     <p class="ligne"><label for="jour">Jour&nbsp;: </label><input type="text" class="date" id="jour" name="jour" value="" size="8"></p>
@@ -379,15 +373,11 @@
   <form id="form-ajoute">
     <h3 class="edition">Nouvel élément du cahier de texte</h3>
     <p class="ligne"><label for="racourci">Raccourci&nbsp;:</label>
-      <select id="raccourci" name="raccourci">
-        <?php echo $select_raccourcis; ?>
-      </select>
+      <select id="raccourci" name="raccourci"><?php echo $select_raccourcis; ?></select>
       <a class="icon-edite" href="cdt-raccourcis?<?php echo $matiere['cle']; ?>">&nbsp;</a>
     </p>
     <p class="ligne"><label for="tid">Séance&nbsp;:</label>
-      <select id="tid" name="tid">
-        <?php echo $select_seances; ?>
-      </select>
+      <select id="tid" name="tid"><?php echo $select_seances; ?></select>
       <a class="icon-edite" href="cdt-seances?<?php echo $matiere['cle']; ?>">&nbsp;</a>
     </p>
     <p class="ligne"><label for="jour">Jour&nbsp;: </label><input type="text" class="date" id="jour" name="jour" value="" size="8"></p>
@@ -474,7 +464,6 @@
   <script type="text/javascript" src="js/jquery.datepick-fr.js"></script>
   <script type="text/javascript" src="js/jquery.timeentry.js"></script>
   <script type="text/javascript" src="js/jquery.timeentry-fr.js"></script>
-
 <?php
 }
 
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt-raccourcis.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/cdt-raccourcis.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt-raccourcis.php	2015-09-04 23:10:56.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/cdt-raccourcis.php	2015-10-27 13:03:22.640827782 +0100
@@ -77,6 +77,7 @@
   <a class="icon-aide general" data-id="page" title="Aide pour les modifications des raccourcis de séance"></a>
   <a class="icon-annule general" onclick="history.back()" title="Retour au cahier de texte"></a>
   <a class="icon-ajoute general" data-id="ajoute" title="Ajouter un nouveau raccourci de séance"></a>
+
   <h2 class="edition">Modifier les raccourcis de séance</h2>
 
 FIN;
@@ -95,42 +96,35 @@
     
     echo <<<FIN
 
-<article data-id="cdt-seances|$id">
-  <a class="icon-aide" data-id="raccourci" title="Aide pour l'édition de ce raccourci de séance"></a>
-  <a class="icon-monte"$monte title="Déplacer ce type de séance vers le haut"></a>
-  <a class="icon-descend"$descend title="Déplacer ce type de séance vers le bas"></a>
-  <a class="icon-supprime" title="Supprimer ce type de séance"></a>
-  <form class="cdt-raccourcis">
-    <a class="icon-ok" title="Valider les modifications"></a>
-    <h3 class="edition">${r['nom']}</h3>
-    <p class="ligne"><label for="nom0">Nom&nbsp;: </label><input type="input" id="nom0" name="nom" value="${r['nom']}" size="50"></p>
-    <p class="ligne"><label for="type0">Séance&nbsp;:</label>
-      <select id="type0" name="type">
-        $sel_seances
-      </select>
-    </p>
-    <p class="ligne"><label for="jour0">Jour&nbsp;:</label>
-      <select id="jour0" name="jour">
-        $sel_jours
-      </select>
-    </p>
-    <p class="ligne"><label for="h_debut$id">Heure de début&nbsp;: </label><input type="text" class="heure" id="h_debut$id" name="h_debut" value="${r['h_debut']}" size="5"></p>
-    <p class="ligne"><label for="h_fin$id">Heure de fin&nbsp;: </label><input type="text" class="heure" id="h_fin$id" name="h_fin" value="${r['h_fin']}" size="5"></p>
-    <p class="ligne"><label for="demigroupe$id">Séance en demi-groupe&nbsp;: </label>
-      <select id="demigroupe$id" name="demigroupe">
-        $sel_dg
-      </select>
-    </p>
-  </form>
-</article>
+  <article data-id="cdt-seances|$id">
+    <a class="icon-aide" data-id="raccourci" title="Aide pour l'édition de ce raccourci de séance"></a>
+    <a class="icon-monte"$monte title="Déplacer ce type de séance vers le haut"></a>
+    <a class="icon-descend"$descend title="Déplacer ce type de séance vers le bas"></a>
+    <a class="icon-supprime" title="Supprimer ce type de séance"></a>
+    <form class="cdt-raccourcis">
+      <a class="icon-ok" title="Valider les modifications"></a>
+      <h3 class="edition">${r['nom']}</h3>
+      <p class="ligne"><label for="nom0">Nom&nbsp;: </label><input type="input" id="nom0" name="nom" value="${r['nom']}" size="50"></p>
+      <p class="ligne"><label for="type0">Séance&nbsp;:</label>
+        <select id="type0" name="type">$sel_seances</select>
+      </p>
+      <p class="ligne"><label for="jour0">Jour&nbsp;:</label>
+        <select id="jour0" name="jour">$sel_jours</select>
+      </p>
+      <p class="ligne"><label for="h_debut$id">Heure de début&nbsp;: </label><input type="text" class="heure" id="h_debut$id" name="h_debut" value="${r['h_debut']}" size="5"></p>
+      <p class="ligne"><label for="h_fin$id">Heure de fin&nbsp;: </label><input type="text" class="heure" id="h_fin$id" name="h_fin" value="${r['h_fin']}" size="5"></p>
+      <p class="ligne"><label for="demigroupe$id">Séance en demi-groupe&nbsp;: </label>
+        <select id="demigroupe$id" name="demigroupe">$sel_dg</select>
+      </p>
+    </form>
+  </article>
 
 FIN;
   }
   $resultat->free();
 }
 else
-  echo "<article>\n  <h2>Aucun raccourci de séances n'existe encore pour cette matière.</h2>\n  <p>Cliquez sur le bouton <span class=\"icon-ajoute\"></span> en haut de cette page pour en ajouter.</p>\n</article>\n";
-  
+  echo "\n  <article>\n    <h2>Aucun raccourci de séances n'existe encore pour cette matière.</h2>\n    <p>Cliquez sur le bouton <span class=\"icon-ajoute\"></span> en haut de cette page pour en ajouter.</p>\n  </article>\n";
 
 // Aide et formulaire d'ajout
 ?>
@@ -140,21 +134,15 @@
     <div>
       <p class="ligne"><label for="nom0">Nom&nbsp;: </label><input type="input" id="nom0" name="nom" value="" size="50"></p>
       <p class="ligne"><label for="type0">Séance&nbsp;:</label>
-        <select id="type0" name="type">
-          <?php echo $select_seances; ?>
-        </select>
+        <select id="type0" name="type"><?php echo $select_seances; ?></select>
       </p>
       <p class="ligne"><label for="jour0">Jour&nbsp;:</label>
-        <select id="jour0" name="jour">
-          <?php echo $select_jours; ?>
-        </select>
+        <select id="jour0" name="jour"><?php echo $select_jours; ?></select>
       </p>
       <p class="ligne"><label for="h_debut0">Heure de début&nbsp;: </label><input type="text" class="heure" id="h_debut0" name="h_debut" value="08h00" size="5"></p>
       <p class="ligne"><label for="h_fin0">Heure de fin&nbsp;: </label><input type="text" class="heure" id="h_fin0" name="h_fin" value="10h00" size="5"></p>
       <p class="ligne"><label for="demigroupe0">Séance en demi-groupe&nbsp;: </label>
-        <select id="demigroupe0" name="demigroupe">
-          <?php echo $select_dg; ?>
-        </select>
+        <select id="demigroupe0" name="demigroupe"><?php echo $select_dg; ?></select>
       </p>
     </div>
     <input type="hidden" name="table" value="cdt-seances">
@@ -201,7 +189,6 @@
   <script type="text/javascript" src="js/jquery.plugin.js"></script>
   <script type="text/javascript" src="js/jquery.timeentry.js"></script>
   <script type="text/javascript" src="js/jquery.timeentry-fr.js"></script>
-  
 <?php
 
 $mysqli->close();
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt-seances.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/cdt-seances.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt-seances.php	2015-09-04 23:09:58.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/cdt-seances.php	2015-10-27 12:58:04.182131621 +0100
@@ -62,16 +62,17 @@
   <a class="icon-aide general" data-id="page" title="Aide pour les modifications des types de séance"></a>
   <a class="icon-annule general" onclick="history.back()" title="Retour au cahier de texte"></a>
   <a class="icon-ajoute general" data-id="ajoute" title="Ajouter un nouveau type de séance"></a>
+
   <h2 class="edition">Modifier les types de séances</h2>
 
 FIN;
 $deb_fin_pour = '
-        <option value="0">Début seulement</option>
-        <option value="1">Début et fin</option>
-        <option value="2">Pas d\'horaire mais date d\'échéance</option>
-        <option value="3">Pas d\'horaire ni date d\'échéance</option>
-        <option value="4">Entrée journalière</option>
-        <option value="5">Entrée hebdomadaire</option>
+          <option value="0">Début seulement</option>
+          <option value="1">Début et fin</option>
+          <option value="2">Pas d\'horaire mais date d\'échéance</option>
+          <option value="3">Pas d\'horaire ni date d\'échéance</option>
+          <option value="4">Entrée journalière</option>
+          <option value="5">Entrée hebdomadaire</option>
 ';
 // Récupération
 $resultat = $mysqli->query("SELECT id, ordre, titre, cle, deb_fin_pour, nb FROM `cdt-types` WHERE matiere = ${matiere['id']}");
@@ -84,22 +85,22 @@
   $dfp = str_replace("\"${r['deb_fin_pour']}\"","\"${r['deb_fin_pour']}\" selected",$deb_fin_pour);
   echo <<<FIN
 
-<article data-id="cdt-types|$id">
-  <a class="icon-aide" data-id="seance" title="Aide pour l'édition de ce type de séances"></a>
-  <a class="icon-monte"$monte title="Déplacer ce type de séance vers le haut"></a>
-  <a class="icon-descend"$descend title="Déplacer ce type de séance vers le bas"></a>
-  <a class="icon-supprime" title="Supprimer ce type de séance"></a>
-  <form>
-    <a class="icon-ok" title="Valider les modifications"></a>
-    <h3 class="edition">${r['titre']}</h3>
-    <p>Ce type de séance correspond à ${r['nb']} élément$s du cahier de texte.</p>
-    <p class="ligne"><label for="titre$id">Titre&nbsp;: </label><input type="input" id="titre$id" name="titre" value="${r['titre']}" size="50"></p>
-    <p class="ligne"><label for="cle$id">Clé&nbsp;: </label><input type="input" id="cle$id" name="cle" value="${r['cle']}" size="50"></p>
-    <p class="ligne"><label for="deb_fin_pour$id">Affichage d'horaires&nbsp;:</label>
-      <select id="deb_fin_pour$id" name="deb_fin_pour">$dfp      </select>
-    </p>
-  </form>
-</article>
+  <article data-id="cdt-types|$id">
+    <a class="icon-aide" data-id="seance" title="Aide pour l'édition de ce type de séances"></a>
+    <a class="icon-monte"$monte title="Déplacer ce type de séance vers le haut"></a>
+    <a class="icon-descend"$descend title="Déplacer ce type de séance vers le bas"></a>
+    <a class="icon-supprime" title="Supprimer ce type de séance"></a>
+    <form>
+      <a class="icon-ok" title="Valider les modifications"></a>
+      <h3 class="edition">${r['titre']}</h3>
+      <p>Ce type de séance correspond à ${r['nb']} élément$s du cahier de texte.</p>
+      <p class="ligne"><label for="titre$id">Titre&nbsp;: </label><input type="input" id="titre$id" name="titre" value="${r['titre']}" size="50"></p>
+      <p class="ligne"><label for="cle$id">Clé&nbsp;: </label><input type="input" id="cle$id" name="cle" value="${r['cle']}" size="50"></p>
+      <p class="ligne"><label for="deb_fin_pour$id">Affichage d'horaires&nbsp;:</label>
+        <select id="deb_fin_pour$id" name="deb_fin_pour">$dfp        </select>
+      </p>
+    </form>
+  </article>
 
 FIN;
 }
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/CHANGELOG.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/CHANGELOG.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/CHANGELOG.php	2015-10-27 14:54:14.000000000 +0100
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/CHANGELOG.php	2015-10-27 14:49:55.059036415 +0100
@@ -1,4 +1,4 @@
-Version actuelle : 5.0.1 (27/09/15)
+Version actuelle : 5.1.0 (28/10/15)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -102,7 +102,7 @@
   personnels, gestion de l'oubli du mot de passe, demande de création de compte
   * Amélioration de la protection d'accès des contenus (plus de possibilités)
   * Préférences supplémentaires, identité complète, adresse mail, timeout
-  * Possibilité d'envoi de mail avec choix de destinataires
+  * Possibilité d'envoi de courriel avec choix de destinataires
   * Gestion des notes de colles :
     * saisie par les colleurs sur la partie publique et par les professeurs sur
     l'interface d'administration
@@ -135,12 +135,12 @@
   * Compte "invité" au mot de passe non modifiable (similaire aux comptes élève
   de la version 3)
   * Récupération des notes de colles en .xls
-  * Impossibilité d'envoyer un mail sans destinataire
-  * Envoi de mail possible aussi pour les colleurs
+  * Impossibilité d'envoyer un courriel sans destinataire
+  * Envoi de courriel possible aussi pour les colleurs
   * Possibilité de changer de matière pour les colleurs, plusieurs possibles
   * Gestion des groupes d'élèves/groupes de colles
     * Ajout, modification, suppression
-    * Utilisation pour l'envoi de mail
+    * Utilisation pour l'envoi de courriel
     * Utilisation pour la saisie des notes de colles
   * Ajout du nombre de comptes dans la gestion des utilisateurs
   Correction de bug :
@@ -169,7 +169,7 @@
   * Possibilité d'afficher des documents PDF ou JPG/PNG en ligne
   * Possibilité de restreindre l'accès des comptes invités, élèves et colleurs à
   des matières
-  * Possibilité d'envoyer des mails pour les colleurs
+  * Possibilité d'envoyer des courriels pour les colleurs
   * Simplification de l'édition du cahier de texte
   * Bouton permettant directement l'impression des pages visualisées
   * Possiblité de rendre complètement invisible une page, y compris dans le menu
@@ -179,24 +179,21 @@
   * (Certaines documentations sont manquantes)
 5.0.1 27/09/15 Corrections de bugs multiples... (merci L. Beau, S. Ravier,
   P. Moreau, F. Evrard, E. Blairon, F. Baux, T. Perruchot, L. Whiteley,
-  E. Droguet, P. Tondelier, C. Chevalier)
+  E. Droguet, P. Tondelier, C. Chevalier, E. De Pennart)
   * Retour du bandeau pour prévenir d'utilisateurs en attente de validation
-  * Retour des documentations des pages : utilisateurs, mail, docs, pages, notes  
+5.1.0 28/10/15 Corrections de bugs, encore et amélioration des documentations
+  Nouvelles fonctionnalités :
+  * Visualisation directe du niveau de protection pour les contenus protégés
+  * Retour des documentations des pages : utilisateurs, mail, docs, pages, notes
+  * Nouvelles couleurs
+  * Amélioration de la lisibilité des tableaux, choix des destinataires
 
 ===================
 
 Todo :
 
-[ 5.1 ] Octobre 2015
+[ 5.2 ] Février ou avril 2016
   * Flux RSS séparés par matières ; flux RSS correspondant aux accès de chacun
-  * Mails : clic possible sur le nom des destinataires
-  * Mails/Notes : hover
-  * Mail : problème d'encodage sur les noms/prénoms des destinataires
-  * Couleurs ?
-  * Mise en évidence des éléments cachés
-  * Visualisation du niveau de protection des répertoires/documents
-
-[ 5.2 ] Février 2016
   * Récupération des documents en .zip
   * Récupération des données de la base (via la sauvegarde)
   * Validation/Suppression multiple d'utilisateurs
@@ -213,3 +210,12 @@
   * Protection individuelle des informations (possibilité de régler pour chaque
   information si les invités/élèves/colleurs peuvent la voir)
   * Programme de colles par quinzaine
+  * Bug : suppression des notes lorsque suppression d'un compte élève/colleur
+
+Autres remarques :
+  * revenir à un choix de répertoire unique plutot que choix matière + choix
+  répertoire (ajout de document)
+  * agrandir les icônes
+  * assouplir la correction automatique des textarea
+  * mail : liens notamment
+  * ajouter la durée des séances dans le cahier de texte
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/colles.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/colles.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/colles.php	2015-09-28 00:29:04.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/colles.php	2015-10-27 12:28:17.595628535 +0100
@@ -121,7 +121,7 @@
 ////////////
 /// HTML ///
 ////////////
-debut($mysqli,"Programme de colles - ${matiere['nom']}",$message,$autorisation,"colles?${matiere['cle']}",$matiere['id']);
+debut($mysqli,"Programme de colles - ${matiere['nom']}". ( ( $edition && $matiere['protection'] ) ? "<span class=\"icon-lock${matiere['protection']}\"></span>" : '' ),$message,$autorisation,"colles?${matiere['cle']}",$matiere['id']);
 
 // MathJax désactivé par défaut
 $mathjax = false;
@@ -138,7 +138,6 @@
     <input type=\"text\" value=\"$recherche\" onchange=\"window.location='?${matiere['cle']}&amp;recherche='+this.value;\" title=\"Recherche dans les textes des programmes de colles\">
     <span class=\"icon-recherche\" onclick=\"if( $(this).prev().is(':visible') && $(this).prev().val().length ) window.location='?${matiere['cle']}&amp;recherche='+$(this).prev().val(); else $(this).prev().show();\"></span>
   </p>
-
 ";
 
 // Affichage du titre de chaque semaine
@@ -194,10 +193,10 @@
       $resultat->free();
     }
     else
-      echo "  <h2>Aucun résultat n'a été trouvé pour cette recherche.</h2>\n";
+      echo "\n  <h2>Aucun résultat n'a été trouvé pour cette recherche.</h2>\n";
   }
   else
-    echo "  <h2>L'année est terminée... Bonnes vacances&nbsp;!</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le programme de l'année</a></p>\n";
+    echo "\n  <h2>L'année est terminée... Bonnes vacances&nbsp;!</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le programme de l'année</a></p>\n";
 }
 
 // Affichage professeur éditeur
@@ -205,7 +204,6 @@
   echo <<<FIN
   
   <a class="icon-aide general" data-id="page" title="Aide pour les modifications des programmes de colles"></a>
-
 $boutons
 FIN;
   if ( $n !== false )  {
@@ -287,10 +285,10 @@
       $resultat->free();
     }
     else
-      echo "  <article><h2>Aucun résultat n'a été trouvé pour cette recherche.</h2></article>\n\n";
+      echo "\n  <article><h2>Aucun résultat n'a été trouvé pour cette recherche.</h2></article>\n";
   }
   else
-    echo "  <article><h2>L'année est terminée.</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le programme de l'année</a></p></article>\n\n";
+    echo "\n  <article><h2>L'année est terminée.</h2>\n  <p><a href=\"?${matiere['cle']}&amp;tout\">Revoir tout le programme de l'année</a></p></article>\n";
 
   // Aide et formulaire d'ajout
 ?>
@@ -336,7 +334,6 @@
   </div>
   
   <p id="log"></p>
-
 <?php
 }
 
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/connexion.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/connexion.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/connexion.php	2015-10-02 11:37:12.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/connexion.php	2015-10-22 01:00:05.301956983 +0200
@@ -20,7 +20,7 @@
 // Oubli d'identifiant
 if ( isset($_REQUEST['oublimdp']) && isset($_REQUEST['mail']) && strlen($mail = $_REQUEST['mail']) )  {
 
-  // Recherche du mail dans la base de données
+  // Recherche de l'adresse électronique dans la base de données
   $resultat = $mysqli->query('SELECT id, login, mail, mdp FROM utilisateurs WHERE LENGTH(mail)');
   while ( $r = $resultat->fetch_assoc() )
     if ( $r['mail'] == $mail )  {
@@ -30,13 +30,13 @@
   $resultat->free();
   if ( !isset($utilisateur) )  {
     $mysqli->close();
-    exit('{"etat":"nok_","message":"Le mail donné est inconnu. Si vous venez de demander la création de votre compte, le mot de passe n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un mail quand cela sera effectif.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
+    exit('{"etat":"nok_","message":"L\'adresse électronique donnée est inconnue. Si vous venez de demander la création de votre compte, le mot de passe n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un courriel quand cela sera effectif.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
   }
 
-  // Retour de mail : variable $_REQUEST['p'] 
+  // Retour de courriel : variable $_REQUEST['p'] 
   if ( isset($_REQUEST['p']) )  {
     // Si variable $_REQUEST['p'] à une mauvaise valeur, on l'efface : le
-    // formulaire affiché sera celui de demande d'adresse mail
+    // formulaire affiché sera celui de demande d'adresse électronique
     if ( ( $_REQUEST['p'] != sha1($site.date('Y-m-d-H').$utilisateur['mdp']) ) && ( $_REQUEST['p'] != sha1($site.date('Y-m-d-H',time()+900).$utilisateur['mdp']) ) )
       unset($_REQUEST['p']);
 
@@ -55,7 +55,7 @@
     }
   }
 
-  // Envoi de mail
+  // Envoi de courriel
   else  {
     // On ajoute 15 minutes au temps utilisé :
     // de xh00 à xh45, on a jusqu'à (x+1)h, de xh45 à (x+1)h on a jusqu'à (x+2)h
@@ -68,7 +68,7 @@
 
 Vous avez rempli une demande de modification de votre mot de passe sur le Cahier de Prépa <http'.($https?'s':'')."://$site>, correspondant à l'identifiant ${utilisateur['login']}.
 
-Si cette demande ne vient pas de vous ou si vous avez retrouvé votre mot de passe, merci d'ignorer simplement ce mail.
+Si cette demande ne vient pas de vous ou si vous avez retrouvé votre mot de passe, merci d'ignorer simplement ce courriel.
 
 Sinon, veuillez cliquer ci-dessous pour vous rendre à la page qui vous permettra de modifier votre mot de passe :
     $lien
@@ -79,7 +79,7 @@
 Cahier de Prépa
 ','From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
     $mysqli->close();
-    exit('{"etat":"ok_","message":"Un mail vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>. Si vous ne voyez rien, pensez à regarder dans les mails marqués comme spam. Vérifiez bien qu\'il n\'y a pas d\'erreur dans cette adresse, car vous ne pourrez pas continuer sans elle si elle est fausse.<br>Le mail qui vous a été envoyé contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de modifier votre mot de passe.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
+    exit('{"etat":"ok_","message":"Un courriel vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>.<br>Si vous ne voyez rien, pensez à regarder dans les courriels marqués comme spam. Certains serveurs retardent jusqu\'à 10 minutes l\'arrivée des messages, normalement la première fois uniquement.<br>Le courriel qui vous a été envoyé contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de modifier votre mot de passe.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
   }
 }
 
@@ -96,11 +96,11 @@
     // Vérifications
     if ( !filter_var($mail,FILTER_VALIDATE_EMAIL) )  {
       $mysqli->close();
-      exit('{"etat":"nok_","message":"L\'adresse saisie n\'est pas une adresse mail valide.<br>Vous avez dû faire une faute de frappe."}');
+      exit('{"etat":"nok_","message":"L\'adresse saisie n\'est pas une adresse électronique valide.<br>Vous avez dû faire une faute de frappe."}');
     }
     if ( in_array($domaine = strstr($mail,'@'),array('@gmail.fr','@laposte.fr')) )  {
       $mysqli->close();
-      exit('{"etat":"nok_","message":"L\'adresse saisie ne pourra pas fonctionner&nbsp;: le domaine <code>'.$domaine.'</code> ne reçoit pas de mails."}');
+      exit('{"etat":"nok_","message":"L\'adresse saisie ne pourra pas fonctionner&nbsp;: le domaine <code>'.$domaine.'</code> ne reçoit pas de courriels."}');
     }
     // Recherche du mail dans la base de données
     $resultat = $mysqli->query('SELECT GROUP_CONCAT(mail) AS mails FROM utilisateurs WHERE LENGTH(mail)');
@@ -108,7 +108,7 @@
     $resultat->free();
     if ( in_array($mail,$mails = explode(',',$r['mails'])) || in_array("@$mail",$mails) )  {
       $mysqli->close();
-      exit('{"etat":"nok_","message":"Un compte avec cette adresse mail existe déjà. Si vous venez de demander la création de votre compte, le compte n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un mail quand cela sera effectif. Si ce compte a déjà été validé par les professeurs, vous pouvez <a href=\"?oublimdp\">changer le mot de passe</a>.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
+      exit('{"etat":"nok_","message":"Un compte avec cette adresse électronique existe déjà. Si vous venez de demander la création de votre compte, le compte n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un courriel quand cela sera effectif. Si ce compte a déjà été validé par les professeurs, vous pouvez <a href=\"?oublimdp\">changer le mot de passe</a>.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
     }
 
     // Retour de mail : variable $_REQUEST['p'] 
@@ -143,7 +143,7 @@
           $r = $resultat->fetch_assoc();
           $resultat->free();
           if ( in_array($login,explode(',',$r['logins'])) )
-            $message = '{"etat":"nok_","message":"Un compte avec le même identifiant existe déjà. Merci de vous connecter avec l\'adresse mail correspondante."}';
+            $message = '{"etat":"nok_","message":"Un compte avec le même identifiant existe déjà. Merci de vous connecter avec l\'adresse électronique correspondante."}';
           else  {
             // Récupération des matières
             $resultat = $mysqli->query('SELECT GROUP_CONCAT(id) AS matieres FROM matieres');
@@ -169,7 +169,7 @@
             $mysqli = connectsql(true);
             $message = ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '@$mail',
                        mdp = '*$newmdp', autorisation = $autorisation, matieres = '$matiere', timeout = 900, mailexp = '$mailexp', mailcopy = $mailcopy",$mysqli) )
-                       ? '{"etat":"ok_","message":"Votre demande d\'inscription est terminée. Elle est maintenant en attente de validation par les professeurs de la classe. Vous recevrez un mail lorsque votre inscription sera validée.</p><p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}'
+                       ? '{"etat":"ok_","message":"Votre demande d\'inscription est terminée. Elle est maintenant en attente de validation par les professeurs de la classe. Vous recevrez un courriel lorsque votre inscription sera validée.</p><p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}'
                        : '{"etat":"nok_","message":"Votre demande d\'inscription n\'a pas pu être enregistrée suite à une erreur technique."}';
           }
         }
@@ -190,7 +190,7 @@
 
 Vous venez de donner cette adresse pour une demande de création de compte sur le Cahier de Prépa <http'.($https?'s':'')."://$site>.
 
-Si cette demande ne vient pas de vous, merci d'ignorer simplement ce mail.
+Si cette demande ne vient pas de vous, merci d'ignorer simplement ce courriel.
 
 Sinon, veuillez cliquer ci-dessous pour vous rendre à la page qui vous permettra de terminer votre inscription :
    $lien
@@ -201,14 +201,14 @@
 Cahier de Prépa
 ','From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
       $mysqli->close();
-      exit('{"etat":"ok_","message":"Un mail vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>. Si vous ne voyez rien, pensez à regarder dans les mails marqués comme spam.<br>Ce mail contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de terminer votre inscription.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
+      exit('{"etat":"ok_","message":"Un courriel vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>.<br>Si vous ne voyez rien, pensez à regarder dans les courriels marqués comme spam. Vérifiez bien qu\'il n\'y a pas d\'erreur dans cette adresse, car vous ne pourrez pas continuer votre inscription si elle est fausse. Certains serveurs retardent jusqu\'à 10 minutes l\'arrivée des messages, la première fois uniquement.<br>Le courriel qui vous a été envoyé contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de terminer votre inscription.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
     }
   }
 }
 
 // Réponse à une invitation
 elseif ( isset($_REQUEST['reponseinvitation']) && isset($_REQUEST['mail']) && strlen($mail = $_REQUEST['mail']) && isset($_REQUEST['p']) && ( $_REQUEST['p'] == sha1($site.$mdp.$mail) ) )  {
-  // Recherche du mail dans la base de données
+  // Recherche de l'adresse électronique dans la base de données
   $resultat = $mysqli->query('SELECT id, login, mail, LENGTH(mdp) AS lmdp FROM utilisateurs WHERE LENGTH(mail)');
   while ( $r = $resultat->fetch_assoc() )
     if ( $r['mail'] == $mail )  {
@@ -217,7 +217,7 @@
     }
   $resultat->free();
   if ( !isset($utilisateur) )  {
-    debut($mysqli,$titre,'Le mail donné est inconnu. Le compte pour lequel vous avez été invité a peut-être été supprimé.',false);
+    debut($mysqli,$titre,'L\'adresse électronique donnée est inconnue. Le compte pour lequel vous avez été invité a peut-être été supprimé.',false);
     $mysqli->close();
     fin();
   }
@@ -254,8 +254,8 @@
     <a class="icon-ok" title="Valider"></a>
     <form onsubmit="$('a.icon-ok').click(); return false;">
       <h3>Mot de passe oublié</h3>
-      <p>Si vous avez oublié votre mot de passe, vous pouvez le récupérer en entrant votre mail ci-dessous. Vous recevrez un mail contenant un lien temporaire permettant de modifier votre mot de passe.</p>
-      <input class="ligne" type="text" name="mail" data-placeholder="Adresse mail">
+      <p>Si vous avez oublié votre mot de passe, vous pouvez le récupérer en entrant votre adresse électronique ci-dessous. Vous recevrez un courriel contenant un lien temporaire permettant de modifier votre mot de passe.</p>
+      <input class="ligne" type="text" name="mail" data-placeholder="Adresse électronique">
     </form>
   </article>
 
@@ -317,10 +317,10 @@
     <a class="icon-ok" title="Valider"></a>
     <form onsubmit="$('a.icon-ok').click(); return false;">
       <h3>Création de compte</h3>
-      <p>Vous pouvez demander ici une création de compte sur ce Cahier de Prépa, si vous êtes élève ou colleur. Vous devez tout d'abord fournir une adresse mail valide. Vous recevrez un mail contenant un lien temporaire permettant de continuer votre inscription.</p>
-      <p>Il est par ailleurs conseillé de consulter cette adresse régulièrement, puisque les professeurs et colleurs de la classe pourront vous envoyer des mails sur cette adresse via Cahier de Prépa. Cette adresse ne sera divulguée à personne d'autre que les professeurs et colleurs de la classe.</p>
+      <p>Vous pouvez demander ici une création de compte sur ce Cahier de Prépa, si vous êtes élève ou colleur. Vous devez tout d'abord fournir une adresse électronique valide. Vous recevrez un courriel contenant un lien temporaire permettant de continuer votre inscription.</p>
+      <p>Il est par ailleurs conseillé de consulter cette adresse régulièrement, puisque les professeurs et colleurs de la classe pourront vous envoyer des courriels sur cette adresse via Cahier de Prépa. Cette adresse ne sera divulguée à personne d'autre que les professeurs et colleurs de la classe.</p>
       <p>À la fin de votre inscription, la demande sera mise en attente de validation par les professeurs de la classe.</p>
-      <input class="ligne" type="text" name="mail" data-placeholder="Adresse mail">
+      <input class="ligne" type="text" name="mail" data-placeholder="Adresse électronique">
     </form>
   </article>
 
@@ -338,7 +338,7 @@
     <a class="icon-ok" title="Valider"></a>
     <form>
       <h3>Création de compte</h3>
-      <p>Vous pouvez demander ici une création de compte sur ce Cahier de Prépa, si vous êtes élève ou colleur. Une fois votre demande remplie, l'inscription sera mise en attente de validation par les professeurs de la classe. Vous recevrez un mail si votre inscription est validée.</p>
+      <p>Vous pouvez demander ici une création de compte sur ce Cahier de Prépa, si vous êtes élève ou colleur. Une fois votre demande remplie, l'inscription sera mise en attente de validation par les professeurs de la classe. Vous recevrez un courriel si votre inscription est validée.</p>
       <p>Le mot de passe vous est complètement personnel et ne sera divulgué à personne. Il est chiffré avant son stockage dans la base de données. La bonne pratique est de ne pas écrire un simple mot du dictionnaire mais une suite de lettres, de chiffres et de signes de ponctuation qui n'ont de sens que pour vous. Tous les caractères de votre clavier, y compris l'espace, sont autorisés.</p>
       <input class="ligne" type="text" id="prenom" name="prenom" size="50" data-placeholder="Prénom">
       <input class="ligne" type="text" id="nom" name="nom" size="50"" data-placeholder="Nom">
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/icones.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/icones.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/icones.css	2015-09-20 03:45:04.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/icones.css	2015-10-21 01:50:05.429884698 +0200
@@ -1,10 +1,10 @@
 @font-face {
 	font-family: 'icomoon';
-	src:url('../fonts/icomoon.eot?-hrwqqn');
-	src:url('../fonts/icomoon.eot?#iefix-hrwqqn') format('embedded-opentype'),
-		url('../fonts/icomoon.ttf?-hrwqqn') format('truetype'),
-		url('../fonts/icomoon.woff?-hrwqqn') format('woff'),
-		url('../fonts/icomoon.svg?-hrwqqn#icomoon') format('svg');
+	src:url('../fonts/icomoon.eot?13');
+	src:url('../fonts/icomoon.eot?#iefix13') format('embedded-opentype'),
+		url('../fonts/icomoon.ttf?13') format('truetype'),
+		url('../fonts/icomoon.woff?13') format('woff'),
+		url('../fonts/icomoon.svg?13#icomoon') format('svg');
 	font-weight: normal;
 	font-style: normal;
 }
@@ -238,3 +238,19 @@
 .icon-recent:before {
 	content: "\e643";
 }
+.icon-lock1:before {
+	content: "\e644";
+}
+.icon-lock2:before {
+	content: "\e645";
+}
+.icon-lock3:before {
+	content: "\e646";
+}
+.icon-lock4:before {
+	content: "\e647";
+}
+.icon-lock5:before {
+	content: "\e648";
+  color: #C00;
+}
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/icones-min.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/icones-min.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/icones-min.css	2015-09-26 01:48:50.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/icones-min.css	2015-10-21 01:50:29.209475002 +0200
@@ -1 +1 @@
-@font-face{font-family:'icomoon';src:url('../fonts/icomoon.eot?-hrwqqn');src:url('../fonts/icomoon.eot?#iefix-hrwqqn') format('embedded-opentype'),url('../fonts/icomoon.ttf?-hrwqqn') format('truetype'),url('../fonts/icomoon.woff?-hrwqqn') format('woff'),url('../fonts/icomoon.svg?-hrwqqn#icomoon') format('svg');font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon';color:black;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a[class^="icon-"]{cursor:pointer;float:right;margin-left:5px;padding-top:.2em;text-decoration:none;font-weight:500}span.icon-lock{position:relative!important;left:-0.3em;top:.1em;color:#777;margin-right:-0.5em}.icon-montre:before{content:"\e600"}.icon-cache:before{content:"\e601"}.icon-aide:before{content:"\e602"}.icon-ajoute:before{content:"\e603"}.icon-supprime:before{content:"\e604"}.icon-annule:before{content:"\e605"}.icon-ok:before{content:"\e606"}.icon-prefs:before{content:"\e607"}.icon-monte:before{content:"\e608"}.icon-descend:before{content:"\e609"}.icon-ferme:before{content:"\e60a"}.icon-epingle:before{content:"\e60b"}.icon-par1:before{content:"\e60c"}.icon-par2:before{content:"\e60d"}.icon-par3:before{content:"\e60e"}.icon-gras:before{content:"\e60f"}.icon-italique:before{content:"\e610"}.icon-souligne:before{content:"\e611"}.icon-omega:before{content:"\e612"}.icon-sigma:before{content:"\e613"}.icon-exp:before{content:"\e614"}.icon-ind:before{content:"\e615"}.icon-ol:before{content:"\e616"}.icon-ul:before{content:"\e617"}.icon-lien1:before{content:"\e618"}.icon-lien2:before{content:"\e619"}.icon-retour:before{content:"\e61a"}.icon-source:before{content:"\e61b"}.icon-nosource:before{content:"\e61c"}.icon-tex:before{content:"\e61d"}.icon-titres:before{content:"\e61e"}.icon-edite:before{content:"\e61f"}.icon-precedent:before{content:"\e620"}.icon-suivant:before{content:"\e621"}.icon-recherche:before{content:"\e622"}.icon-voirtout:before{content:"\e623"}.icon-accueil:before{content:"\e624"}.icon-imprime:before{content:"\e625"}.icon-connexion:before{content:"\e626"}.icon-deconnexion:before{content:"\e627"}.icon-mail:before{content:"\e628"}.icon-menu:before{content:"\e629"}.icon-cocher:before{content:"\e62a"}.icon-decocher:before{content:"\e62b"}.icon-rep:before{content:"\e62c"}.icon-rep-open:before{content:"\e62d"}.icon-download:before{content:"\e62e"}.icon-lock:before{content:"\e62f"}.icon-alphaasc:before{content:"\e630"}.icon-alphadesc:before{content:"\e631"}.icon-chronoasc:before{content:"\e632"}.icon-chronodesc:before{content:"\e633"}.icon-ajouterep:before{content:"\e634"}.icon-ajoutedoc:before{content:"\e635"}.icon-doc:before{content:"\e636"}.icon-doc-txt:before{content:"\e636"}.icon-doc-pdf:before{content:"\e637"}.icon-doc-doc:before{content:"\e638"}.icon-doc-xls:before{content:"\e639"}.icon-doc-ppt:before{content:"\e63a"}.icon-doc-jpg:before{content:"\e63b"}.icon-doc-zip:before{content:"\e63c"}.icon-doc-mp3:before{content:"\e63d"}.icon-doc-mp4:before{content:"\e63e"}.icon-doc-pyt:before{content:"\e63f"}.icon-rss:before{content:"\e640"}.icon-infos:before{content:"\e641"}.icon-colles:before{content:"\e642"}.icon-recent:before{content:"\e643"}
\ Pas de fin de ligne à la fin du fichier
+@font-face{font-family:'icomoon';src:url('../fonts/icomoon.eot?13');src:url('../fonts/icomoon.eot?#iefix13') format('embedded-opentype'),url('../fonts/icomoon.ttf?13') format('truetype'),url('../fonts/icomoon.woff?13') format('woff'),url('../fonts/icomoon.svg?13#icomoon') format('svg');font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon';color:black;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a[class^="icon-"]{cursor:pointer;float:right;margin-left:5px;padding-top:.2em;text-decoration:none;font-weight:500}span.icon-lock{position:relative!important;left:-0.3em;top:.1em;color:#777;margin-right:-0.5em}.icon-montre:before{content:"\e600"}.icon-cache:before{content:"\e601"}.icon-aide:before{content:"\e602"}.icon-ajoute:before{content:"\e603"}.icon-supprime:before{content:"\e604"}.icon-annule:before{content:"\e605"}.icon-ok:before{content:"\e606"}.icon-prefs:before{content:"\e607"}.icon-monte:before{content:"\e608"}.icon-descend:before{content:"\e609"}.icon-ferme:before{content:"\e60a"}.icon-epingle:before{content:"\e60b"}.icon-par1:before{content:"\e60c"}.icon-par2:before{content:"\e60d"}.icon-par3:before{content:"\e60e"}.icon-gras:before{content:"\e60f"}.icon-italique:before{content:"\e610"}.icon-souligne:before{content:"\e611"}.icon-omega:before{content:"\e612"}.icon-sigma:before{content:"\e613"}.icon-exp:before{content:"\e614"}.icon-ind:before{content:"\e615"}.icon-ol:before{content:"\e616"}.icon-ul:before{content:"\e617"}.icon-lien1:before{content:"\e618"}.icon-lien2:before{content:"\e619"}.icon-retour:before{content:"\e61a"}.icon-source:before{content:"\e61b"}.icon-nosource:before{content:"\e61c"}.icon-tex:before{content:"\e61d"}.icon-titres:before{content:"\e61e"}.icon-edite:before{content:"\e61f"}.icon-precedent:before{content:"\e620"}.icon-suivant:before{content:"\e621"}.icon-recherche:before{content:"\e622"}.icon-voirtout:before{content:"\e623"}.icon-accueil:before{content:"\e624"}.icon-imprime:before{content:"\e625"}.icon-connexion:before{content:"\e626"}.icon-deconnexion:before{content:"\e627"}.icon-mail:before{content:"\e628"}.icon-menu:before{content:"\e629"}.icon-cocher:before{content:"\e62a"}.icon-decocher:before{content:"\e62b"}.icon-rep:before{content:"\e62c"}.icon-rep-open:before{content:"\e62d"}.icon-download:before{content:"\e62e"}.icon-lock:before{content:"\e62f"}.icon-alphaasc:before{content:"\e630"}.icon-alphadesc:before{content:"\e631"}.icon-chronoasc:before{content:"\e632"}.icon-chronodesc:before{content:"\e633"}.icon-ajouterep:before{content:"\e634"}.icon-ajoutedoc:before{content:"\e635"}.icon-doc:before{content:"\e636"}.icon-doc-txt:before{content:"\e636"}.icon-doc-pdf:before{content:"\e637"}.icon-doc-doc:before{content:"\e638"}.icon-doc-xls:before{content:"\e639"}.icon-doc-ppt:before{content:"\e63a"}.icon-doc-jpg:before{content:"\e63b"}.icon-doc-zip:before{content:"\e63c"}.icon-doc-mp3:before{content:"\e63d"}.icon-doc-mp4:before{content:"\e63e"}.icon-doc-pyt:before{content:"\e63f"}.icon-rss:before{content:"\e640"}.icon-infos:before{content:"\e641"}.icon-colles:before{content:"\e642"}.icon-recent:before{content:"\e643"}.icon-lock1:before{content:"\e644"}.icon-lock2:before{content:"\e645"}.icon-lock3:before{content:"\e646"}.icon-lock4:before{content:"\e647"}.icon-lock5:before{content:"\e648";color:#C00}
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/style.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style.css	2015-10-13 02:03:44.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/style.css	2015-10-27 23:43:15.710451945 +0100
@@ -2,7 +2,7 @@
 
 /* Police et taille globales */
 html,body { height: 100%; }
-body { font-size: 100%; font-family:Arial, Helvetica, sans-serif; position: relative; width:100%; margin: 0 auto; max-width: 1500px; }
+body { font-size: 100%; font-family:Arial, Helvetica, sans-serif; position: relative; width:100%; margin: 0 auto; max-width: 1500px; background-color: #F6F6F6; }
 h1 { font-size: 2.2em; text-align: center; margin: 0; padding: 1em 2em; }
 h2 { font-size: 1.8em; margin: 1em 0 0.8em; padding: 0; }
 h3 { font-size: 1.5em; margin: 1em 0 0.5em; padding: 0 1% 0; }
@@ -43,10 +43,10 @@
   header + section { text-align: center; }
   footer { font-size: 0.6em; }
 }
-article { margin: 1em 0; padding: 1em 2%; background-color: #EEE; }
+article { margin: 1em 0; padding: 1em 2%; background-color: #CCD3E0; }
 article:first-child, .general + article { margin-top: 0 !important; }
 footer { text-align: center; width: 90%; padding: 1em 5%; clear: both; position: fixed; left: 0; bottom: 0; z-index: 6;
-         border-top: 1px solid black; background-color: #EEE; opacity: 0.97; filter: alpha(opacity=97); }
+         border-top: 1px solid black; background-color: #DDD; opacity: 0.97; filter: alpha(opacity=97); }
 
 /* PDF et JPG */
 .pdf { height: 0; width: 100%; overflow: hidden; position: relative; }
@@ -59,13 +59,14 @@
 .warning { text-align: center; width: 50%; margin: 1em auto; padding: 0.5em 3%; }
 .annonce { margin: 1em 3%; padding: 0.5em 4%; }
 .note { margin: 0.5em 2%; padding: 0 4%; }
-.warning, .annonce { color: #A31F35; border: 1px solid #882C3C; }
-.note { color: #A31F35; }
+.warning, .annonce { color: #BA0D1F; border: 2px solid #BA0D1F; }
+.note { color: #BA0D1F; }
 .oubli { font-size: 0.8em; text-align: center; }
 .oubli a { text-decoration: none; color: #333; }
 p.titrecdt { text-align: right; text-decoration: underline; }
 .titrecdt.edition { text-align: left; text-decoration: none; padding-right: 1%; }
 .topbarre { height: 1.5em; background-color: #DDD; border: 1px solid #BBB; width: auto; padding: 0; margin-bottom: 0; border-radius: 4px; }
+h1 span { font-size: 70%; vertical-align: 7%; margin-left: 0.4em; } /* indication de protection en mode édition */
 
 /* Menu de recherche, programme de colle et cahier de texte */
 #recherchecdt a, #recherchecolle a { float: none !important; margin-left: 0.5em; }
@@ -73,7 +74,6 @@
 .topbarre select#seances { margin-left: 1.3em; width: 10.5em; height: 1.7em; }
 .topbarre input { position: absolute; margin:0 0.8em 0 1.5em; padding-left: 1.8em; width: -moz-available; height: 1.7em; }
 .topbarre span { position: relative; left: 1.9em; cursor: pointer; top: 0.1em; }
-/*.topbarre * { vertical-align: middle; padding-top: 0 !important; }
 /* Disparition de la case de recherche */
 @media screen and (max-width: 980px) and (min-width: 800px), screen and (max-width: 600px) {
   #recherchecdt input { display: none; top: 1.8em; padding-left: 0.1em; right: 2em; margin-left: 2em !important; }
@@ -121,16 +121,17 @@
 .edition { display: inline; text-align: left; padding-right: 3em; }
 h3.edition.editable { padding-right: 1%; }
 .edition ~ div, .edition + p, .edition ~ form { margin-top: 0.75em; }
-article.cache { color: #999; background-color: #F4F4F4; }
+article.cache { background-color: #AAA; opacity: 0.6; filter: alpha(opacity=60); }
 #log { position: fixed; top:3%; left: 3%; padding: 0.3em 2%; z-index: 6; margin-right: 3%; }
-#log.ok { background-color: #EFE; color: #090; border: 1px solid #090; }
-#log.nok { background-color: #FEE; color: #D00; border: 1px solid #D00; }
-#log.ok span { color: #090; }
-#log.nok span { color: #D00; }
+.ok { background-color: #EFE; color: #090; border: 1px solid #090; }
+.nok { background-color: #FEE; color: #D00; border: 1px solid #D00; }
+.ok span { color: #090; }
+.nok span { color: #D00; }
 #log span { cursor: pointer; position: relative; right: -0.8em; top: 0.1em;}
 #fenetre_fond { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #000; opacity: 0.2; filter: alpha(opacity=20); z-index: 3; }
-#fenetre { position: fixed; left: 50%; z-index: 4; padding: 0em 2% 1em; overflow: auto; background-color: #EEE; opacity: 0.97; filter: alpha(opacity=97);
+#fenetre { position: fixed; left: 50%; z-index: 4; padding: 0 2%; overflow: auto; background-color: #E3ECFC; opacity: 0.97; filter: alpha(opacity=97);
            box-shadow: 0.5em 0.5em 0.5em #777; -moz-box-shadow: 0.5em 0.5em 0.5em #777; -webkit-box-shadow: 0.5em 0.5em 0.5em #777; }
+#fenetre > *:last-child { margin-bottom: 1em; }
 @media screen and (min-width: 800px) {
   #fenetre { top: 10%; width: 70%; margin-left: -37%; max-height: 80%; }
 }
@@ -159,6 +160,7 @@
 #fenetre td { border-top: none !important; border-left: none !important; border-right: none !important; border-bottom: 1px dotted #BBB !important; }
 #planning { text-align: center; }
 .labelchecked { color: #999; }
+tr:hover { background-color: #EFF; }
 
 /* Édition : formulaires */
 input, select, textarea { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; }
@@ -200,17 +202,18 @@
 div.edithtml a.icon-annule { top: 3.1em; }
 
 /* Dans le menu et dans les informations récentes*/
-nav, #recent { background-color: #999; }
-nav a[class^="icon-"] { float: none !important; display: inline !important; margin: 0.5em 3% 1em; }
-nav a { display: block; margin-bottom: 0.2em; padding: 0; text-decoration: none; color: black; }
-nav h3 { font-size: 1.2em; margin: 0.5em 3% 0.1em; padding-top: 0.3em; border-top: 1px solid black; }
-nav hr { margin: 0.5em 3% 0.5em; color: black; border-top: 1px solid black; border-bottom: none; }
+nav, #recent { background-color: #9AB3E4; }
+nav a[class^="icon-"] { float: none !important; display: inline !important; margin: 0.5em 3% 1em; color: #001030; }
+nav a { display: block; margin-bottom: 0.2em; padding: 0; text-decoration: none; color: #002877; }
+nav a:hover { color: #CDF; }
+nav h3 { font-size: 1.2em; margin: 0.5em 3% 0.1em; padding-top: 0.3em; color: #001030; border-top: 1px solid #001030; }
+nav hr { margin: 0.5em 3% 0.5em; color: #001030; border-top: 1px solid #001030; border-bottom: none; }
 nav a.menurep { padding-left: 3%; font-size: 0.9em; }
 #actuel { font-style: italic; }
-nav h3 span { font-weight: 500; font-size: 0.83em; margin-right: 0.2em; }
-#recent .icone { height: 1.2em; vertical-align: bottom; margin-right: 0.2em; }
-#recent a { display: block; margin-bottom: 0.4em; padding: 0; text-decoration: none; color: black; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
-#recent h3 { font-size: 1.2em; margin: 0 3% 0.5em; }
+nav h3 span { font-weight: 500; font-size: 0.83em; margin-right: 0.2em; color: #001030 !important; }
+#recent a { display: block; margin-bottom: 0.4em; padding: 0; text-decoration: none; color: #002877; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
+#recent a span { color: #002877; }
+#recent h3 { font-size: 1.2em; margin: 0 3% 0.5em; color: #001030; }
  
 /* Tableau de notes */
 th.semaines { vertical-align: bottom; padding: 1.6em 0; text-align: center; }
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style-min.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/style-min.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style-min.css	2015-10-13 02:04:30.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/css/style-min.css	2015-10-27 23:43:57.237757896 +0100
@@ -1 +1 @@
-html,body{height:100%}body{font-size:100%;font-family:Arial,Helvetica,sans-serif;position:relative;width:100%;margin:0 auto;max-width:1500px}h1{font-size:2.2em;text-align:center;margin:0;padding:1em 2em}h2{font-size:1.8em;margin:1em 0 .8em;padding:0}h3{font-size:1.5em;margin:1em 0 .5em;padding:0 1% 0}h4{font-size:1.3em;margin:.5em 0 .2em;padding:0 2.5% 0}h5{font-size:1.1em;margin:.2em 0 0;padding:0 4% 0}h6{font-size:1em;margin:.2em 0 0;padding:0 5.5% 0}ul{margin:.5em 0;padding:0 2% 0 6%}p{margin:0;padding:0 2%}p+p{margin-top:.5em}div,form{margin:0;padding:0}img{border:0;max-width:100%}div,p,section,article{text-align:justify}article>*:first-child{margin-top:0}article>*:last-child{margin-bottom:0}section>h2:first-child{margin-top:0}@media screen and (min-width:800px){#colonne{width:280px;float:left;margin:0 30px 3em}nav{margin:0;padding:1em 20px .7em}.icon-menu,.icon-recent{display:none}#recent{margin-top:1.5em;padding:1em 20px}section{position:relative;margin:0 30px 0 340px;padding:0 0 3em}header+section{width:96%;margin:0 auto;max-width:1500px;text-align:center}footer{font-size:.8em}}@media screen and (max-width:800px){h1{font-size:1.8em;padding:.3em 3em}h2{font-size:1.65em}#colonne,nav,#recent{display:none}#colonne.visible{display:block}nav.visible,#recent.visible{display:block;position:fixed;z-index:2;top:3.3em;left:.5em;padding:1em 20px .7em;width:80%;min-width:200px;max-width:280px;max-height:70%;overflow:auto;box-shadow:.5em .5em .5em #777;-moz-box-shadow:.5em .5em .5em #777;-webkit-box-shadow:.5em .5em .5em #777}.icon-menu,.icon-recent{position:fixed;z-index:2;top:.8em;left:.5em;font-size:1.2em;cursor:pointer}.icon-recent{left:2.5em}section{position:relative;width:96%;margin:0 2%;padding:0 0 3em}header+section{text-align:center}footer{font-size:.6em}}article{margin:1em 0;padding:1em 2%;background-color:#EEE}article:first-child,.general+article{margin-top:0!important}footer{text-align:center;width:90%;padding:1em 5%;clear:both;position:fixed;left:0;bottom:0;z-index:6;border-top:1px solid black;background-color:#EEE;opacity:.97;filter:alpha(opacity=97)}.pdf{height:0;width:100%;overflow:hidden;position:relative}.portrait{padding-bottom:138%}.paysage{padding-bottom:74%}.hauteur50{padding-bottom:50%}.pdf object{position:absolute}.warning{text-align:center;width:50%;margin:1em auto;padding:.5em 3%}.annonce{margin:1em 3%;padding:.5em 4%}.note{margin:.5em 2%;padding:0 4%}.warning,.annonce{color:#a31f35;border:1px solid #882c3c}.note{color:#a31f35}.oubli{font-size:.8em;text-align:center}.oubli a{text-decoration:none;color:#333}p.titrecdt{text-align:right;text-decoration:underline}.titrecdt.edition{text-align:left;text-decoration:none;padding-right:1%}.topbarre{height:1.5em;background-color:#DDD;border:1px solid #BBB;width:auto;padding:0;margin-bottom:0;border-radius:4px}#recherchecdt a,#recherchecolle a{float:none!important;margin-left:.5em}.topbarre select#semaines{margin-left:1.3em;width:8em;height:1.7em}.topbarre select#seances{margin-left:1.3em;width:10.5em;height:1.7em}.topbarre input{position:absolute;margin:0 .8em 0 1.5em;padding-left:1.8em;width:-moz-available;height:1.7em}.topbarre span{position:relative;left:1.9em;cursor:pointer;top:.1em}@media screen and (max-width:980px) and (min-width:800px),screen and (max-width:600px){#recherchecdt input{display:none;top:1.8em;padding-left:.1em;right:2em;margin-left:2em!important}#recherchecdt span{left:1.3em}}@media screen and (max-width:450px){#recherchecdt a,#recherchecdt select{margin-left:.3em!important}#recherchecdt input{margin-left:.3em}#recherchecdt select{width:6em!important}#recherchecdt span{left:.3em}}@media screen and (max-width:400px){#recherchecolle a,#recherchecolle select{margin-left:.3em!important}#recherchecolle input{margin-left:0!important}#recherchecolle select{width:6em}#recherchecolle span{left:.3em}}@media screen and (max-width:350px){#recherchecolle input{display:none;top:1.8em;padding-left:.1em;right:2em;margin-left:2em!important}}@media screen and (-webkit-min-device-pixel-ratio:0){.topbarre{height:1.4em;vertical-align:bottom}#recherchecolle input{width:40%}.topbarre span{top:.2em}#recherchecdt a,#recherchecolle a{vertical-align:middle}.topbarre select{height:1.7em}}#parentsdoc{margin-bottom:1.5em;padding:.3em 2% 0}#parentsdoc *{padding-top:0}#parentsdoc span{position:static;cursor:auto}.rep,.doc{padding:0;margin-left:2%;margin-right:2%;border-bottom:1px dotted #BBB}.repcontenu,.docdonnees{float:right;font-size:.8em;padding-top:.2em;padding-left:.5em}#parentsdoc a,.rep a,.doc a{text-decoration:none;color:black}#parentsdoc .nom,.rep .nom,.doc .nom{font-weight:700;margin-left:.5em}.general{position:absolute;top:-4.1em;right:1em}.general+.general{right:2.2em}.general+.general+.general{right:3.4em}.general+.general+.general+.general{right:4.6em}.edition{display:inline;text-align:left;padding-right:3em}h3.edition.editable{padding-right:1%}.edition ~ div,.edition+p,.edition ~ form{margin-top:.75em}article.cache{color:#999;background-color:#f4f4f4}#log{position:fixed;top:3%;left:3%;padding:.3em 2%;z-index:6;margin-right:3%}#log.ok{background-color:#EFE;color:#090;border:1px solid #090}#log.nok{background-color:#FEE;color:#D00;border:1px solid #D00}#log.ok span{color:#090}#log.nok span{color:#D00}#log span{cursor:pointer;position:relative;right:-0.8em;top:.1em}#fenetre_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;filter:alpha(opacity=20);z-index:3}#fenetre{position:fixed;left:50%;z-index:4;padding:0 2% 1em;overflow:auto;background-color:#EEE;opacity:.97;filter:alpha(opacity=97);box-shadow:.5em .5em .5em #777;-moz-box-shadow:.5em .5em .5em #777;-webkit-box-shadow:.5em .5em .5em #777}@media screen and (min-width:800px){#fenetre{top:10%;width:70%;margin-left:-37%;max-height:80%}}@media screen and (max-width:800px){.general{top:-2.2em}#fenetre{top:4%;width:92%;margin-left:-48%;max-height:92%}}#fenetre a[class^="icon-"]{margin-top:1.5em}#fenetre hr{margin:1.5em 0}#epingle{margin-top:1.5em}#epingle h3{padding-left:0}[id^="aide-"],[id^="form-"]{display:none}#fenetre [name="titre"]{margin:2em 0 1em}#fenetre [name="titre"]+*{display:inline}form.titrecdt{padding:.2em 0 .5em;margin-top:.2em}.suppression{text-align:center}#fenetre.usermat h3{margin-bottom:0}#fenetre.usermat a.icon-ajoute,#fenetre a.icon-supprime{margin-top:.8em}#fenetre.usermat .ligne,#fenetre.usergrp .ligne{border-bottom:1px dotted #BBB}#fenetre.usermat input,#fenetre.usergrp input{margin-top:.2em}#fenetre th+th,#fenetre td+td{text-align:center;width:2em;padding:.15em}#fenetre th a{float:none}#fenetre th{border:none!important}#fenetre td{border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px dotted #BBB!important}#planning{text-align:center}.labelchecked{color:#999}input,select,textarea{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}p.ligne{padding:0;clear:right}.ligne label{font-weight:700}.ligne input,.ligne select,.ligne code{width:65%;float:right;margin-top:-0.2em}.ligne input[type="checkbox"],.ligne input[type="radio"]{width:1em;margin-top:.2em}input.ligne{width:100%;margin-bottom:.5em;display:block}.supprmultiple{margin-top:.3em;margin-bottom:0!important}.usermat{margin-top:.5em;padding:0;clear:right}.usermat a{padding:0!important}table{width:100%;margin:1em 0;border-collapse:collapse;border:medium solid #999}table td{padding:.15em .5%}table th{padding:.15em 3%}table td,table th{border:thin solid #AAA!important}table td .icon-edite{float:left!important;margin:0 .2em 0 .1em}div.placeholder:before{content:attr(data-placeholder);color:#AAA;margin-left:4px;z-index:2}span.placeholder{color:#AAA;position:absolute;margin:.2em 2.5% 0 5px;z-index:2}#fenetre span.placeholder,#fenetre div.placeholder:before{z-index:5}.editable,.titrecdt.edition,form.titrecdt,.editabledest{border:1px dotted #BBB;position:relative}.editable a[class^="icon-"],p.titrecdt a[class^="icon-"],.editabledest a[class^="icon-"]{float:none}.avecform{padding:0;border:none!important}h3.editable a[class^="icon-"],h3 span.editable a[class^="icon-"]{font-weight:500;font-size:.67em;padding-top:.1em}h3.avecform span{font-weight:500;font-size:.67em;margin-top:.4em;width:80%;overflow:hidden;white-space:nowrap}h3.avecform input{width:50%}textarea{width:100%;margin:0 0 .2em}textarea+div{min-height:6em;border:1px dotted #CCC;background-color:#FFF}.boutons{clear:right;background-color:#DDD;border:1px solid #BBB;width:auto;padding:0;margin-bottom:0;border-radius:4px}.boutons button{cursor:default;background-color:transparent;border-top:0;border-left:none;border-bottom:1px solid #BBB;border-right:1px solid #BBB;height:1.5em;font-size:100%;width:2em}.boutons button+button{margin-left:-0.2em}div.editable a[class^="icon-"]{position:absolute;right:3px;top:0}div.editable a.icon-annule{top:1.5em}div.edithtml a.icon-ok{top:1.6em}div.edithtml a.icon-annule{top:3.1em}nav,#recent{background-color:#999}nav a[class^="icon-"]{float:none!important;display:inline!important;margin:.5em 3% 1em}nav a{display:block;margin-bottom:.2em;padding:0;text-decoration:none;color:black}nav h3{font-size:1.2em;margin:.5em 3% .1em;padding-top:.3em;border-top:1px solid black}nav hr{margin:.5em 3% .5em;color:black;border-top:1px solid black;border-bottom:0}nav a.menurep{padding-left:3%;font-size:.9em}#actuel{font-style:italic}nav h3 span{font-weight:500;font-size:.83em;margin-right:.2em}#recent .icone{height:1.2em;vertical-align:bottom;margin-right:.2em}#recent a{display:block;margin-bottom:.4em;padding:0;text-decoration:none;color:black;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#recent h3{font-size:1.2em;margin:0 3% .5em}th.semaines{vertical-align:bottom;padding:1.6em 0;text-align:center}td.semaines{padding-bottom:1em!important;vertical-align:bottom;text-align:center;padding:.2em 5px}td.semaines span{display:block;font-weight:700;margin:0;padding:0;width:1.2em;transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);white-space:nowrap;zoom:1}td.pasnote{font-style:italic;text-align:center}.collsel{font-weight:700}.collnosel,.dejanote{color:#AAA}#recherchenote{padding:0 1em}#notes td+td{text-align:right}@media print{#colonne,#recherchecolle,#recherchecdt,[id^="aide-"],[id^="form-"],footer,a[class^="icon-"]{display:none}.editable,.titrecdt.edition,form.titrecdt,.editabledest{border:0}h1{font-size:1.7em;text-align:center;margin:0;padding:0 0 1em}h2{font-size:1.5em;margin:.7em 0;padding:0}h3{font-size:1.35em;margin:.6em 0;padding:0 1% 0}h4{font-size:1.2em;margin:.4em 0 .2em;padding:0 2.5% 0}h5{font-size:1.1em;margin:.2em 0 0;padding:0 4% 0}h6{font-size:1em;margin:.2em 0 0;padding:0 5.5% 0}article{border:1px solid #999}}.timeEntry-control{float:right;margin:0 5px 0 0}.datepick-trigger{float:right;margin:.1em 7px 0 0}.datepick{background-color:#fff;color:#000;border:1px solid #444;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em;font-family:Arial,Helvetica,Sans-serif;font-size:90%}.datepick-rtl{direction:rtl}.datepick-popup{z-index:2}.datepick-disable{position:absolute;z-index:1;background-color:white;opacity:.5;filter:alpha(opacity=50)}.datepick a{color:#fff;text-decoration:none}.datepick a.datepick-disabled{color:#888;cursor:auto}.datepick button{margin:.25em;padding:.125em 0;background-color:#fcc;border:0;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em;font-weight:bold}.datepick-nav,.datepick-ctrl{float:left;width:100%;background-color:#000;color:#fff;font-size:90%;font-weight:bold}.datepick-ctrl{background-color:#600}.datepick-cmd{width:30%}.datepick-cmd:hover{background-color:#777}.datepick-ctrl .datepick-cmd:hover{background-color:#f08080}.datepick-cmd-prevJump,.datepick-cmd-nextJump{width:8%}a.datepick-cmd{height:1.5em}button.datepick-cmd{text-align:center}.datepick-cmd-prev,.datepick-cmd-prevJump,.datepick-cmd-clear{float:left;padding-left:2%}.datepick-cmd-current,.datepick-cmd-today{float:left;width:35%;text-align:center}.datepick-cmd-next,.datepick-cmd-nextJump,.datepick-cmd-close{float:right;padding-right:2%;text-align:right}.datepick-rtl .datepick-cmd-prev,.datepick-rtl .datepick-cmd-prevJump,.datepick-rtl .datepick-cmd-clear{float:right;padding-left:0;padding-right:2%;text-align:right}.datepick-rtl .datepick-cmd-current,.datepick-rtl .datepick-cmd-today{float:right}.datepick-rtl .datepick-cmd-next,.datepick-rtl .datepick-cmd-nextJump,.datepick-rtl .datepick-cmd-close{float:left;padding-left:2%;padding-right:0;text-align:left}.datepick-month-nav{float:left;background-color:#777;text-align:center}.datepick-month-nav div{float:left;width:12.5%;margin:1%;padding:1%}.datepick-month-nav span{color:#888}.datepick-month-row{clear:left}.datepick-month{float:left;width:15em;border:1px solid #444;text-align:center}.datepick-month-header,.datepick-month-header select,.datepick-month-header input{height:1.5em;background-color:#444;color:#fff;font-weight:bold}.datepick-month-header select,.datepick-month-header input{height:1.4em;margin:0;padding:0;border:0;font-size:100%}.datepick-month-header input{position:absolute;display:none}.datepick-month table{width:100%;border-collapse:collapse}.datepick-month thead{border-bottom:1px solid #aaa}.datepick-month th,.datepick-month td{margin:0;padding:0;font-weight:normal;text-align:center}.datepick-month th{border:1px solid #777}.datepick-month th,.datepick-month th a{background-color:#777;color:#fff}.datepick-month td{background-color:#eee;border:1px solid #aaa}.datepick-month td.datepick-week{border:1px solid #777}.datepick-month td.datepick-week *{background-color:#777;color:#fff;border:0}.datepick-month a{display:block;width:100%;padding:.125em 0;background-color:#eee;color:#000;text-decoration:none}.datepick-month span{display:block;width:100%;padding:.125em 0}.datepick-month td span{color:#888}.datepick-month td .datepick-other-month{background-color:#fff}.datepick-month td .datepick-weekend{background-color:#ddd}.datepick-month td .datepick-today{background-color:#f0c0c0}.datepick-month td .datepick-highlight{background-color:#f08080}.datepick-month td .datepick-selected{background-color:#777;color:#fff}.datepick-month th.datepick-week{background-color:#777;color:#fff}.datepick-status{clear:both;background-color:#ddd;text-align:center}.datepick-clear-fix{clear:both}.timeEntry-control{vertical-align:middle;margin-left:2px}
\ Pas de fin de ligne à la fin du fichier
+html,body{height:100%}body{font-size:100%;font-family:Arial,Helvetica,sans-serif;position:relative;width:100%;margin:0 auto;max-width:1500px;background-color:#f6f6f6}h1{font-size:2.2em;text-align:center;margin:0;padding:1em 2em}h2{font-size:1.8em;margin:1em 0 .8em;padding:0}h3{font-size:1.5em;margin:1em 0 .5em;padding:0 1% 0}h4{font-size:1.3em;margin:.5em 0 .2em;padding:0 2.5% 0}h5{font-size:1.1em;margin:.2em 0 0;padding:0 4% 0}h6{font-size:1em;margin:.2em 0 0;padding:0 5.5% 0}ul{margin:.5em 0;padding:0 2% 0 6%}p{margin:0;padding:0 2%}p+p{margin-top:.5em}div,form{margin:0;padding:0}img{border:0;max-width:100%}div,p,section,article{text-align:justify}article>*:first-child{margin-top:0}article>*:last-child{margin-bottom:0}section>h2:first-child{margin-top:0}@media screen and (min-width:800px){#colonne{width:280px;float:left;margin:0 30px 3em}nav{margin:0;padding:1em 20px .7em}.icon-menu,.icon-recent{display:none}#recent{margin-top:1.5em;padding:1em 20px}section{position:relative;margin:0 30px 0 340px;padding:0 0 3em}header+section{width:96%;margin:0 auto;max-width:1500px;text-align:center}footer{font-size:.8em}}@media screen and (max-width:800px){h1{font-size:1.8em;padding:.3em 3em}h2{font-size:1.65em}#colonne,nav,#recent{display:none}#colonne.visible{display:block}nav.visible,#recent.visible{display:block;position:fixed;z-index:2;top:3.3em;left:.5em;padding:1em 20px .7em;width:80%;min-width:200px;max-width:280px;max-height:70%;overflow:auto;box-shadow:.5em .5em .5em #777;-moz-box-shadow:.5em .5em .5em #777;-webkit-box-shadow:.5em .5em .5em #777}.icon-menu,.icon-recent{position:fixed;z-index:2;top:.8em;left:.5em;font-size:1.2em;cursor:pointer}.icon-recent{left:2.5em}section{position:relative;width:96%;margin:0 2%;padding:0 0 3em}header+section{text-align:center}footer{font-size:.6em}}article{margin:1em 0;padding:1em 2%;background-color:#ccd3e0}article:first-child,.general+article{margin-top:0!important}footer{text-align:center;width:90%;padding:1em 5%;clear:both;position:fixed;left:0;bottom:0;z-index:6;border-top:1px solid black;background-color:#DDD;opacity:.97;filter:alpha(opacity=97)}.pdf{height:0;width:100%;overflow:hidden;position:relative}.portrait{padding-bottom:138%}.paysage{padding-bottom:74%}.hauteur50{padding-bottom:50%}.pdf object{position:absolute}.warning{text-align:center;width:50%;margin:1em auto;padding:.5em 3%}.annonce{margin:1em 3%;padding:.5em 4%}.note{margin:.5em 2%;padding:0 4%}.warning,.annonce{color:#ba0d1f;border:2px solid #ba0d1f}.note{color:#ba0d1f}.oubli{font-size:.8em;text-align:center}.oubli a{text-decoration:none;color:#333}p.titrecdt{text-align:right;text-decoration:underline}.titrecdt.edition{text-align:left;text-decoration:none;padding-right:1%}.topbarre{height:1.5em;background-color:#DDD;border:1px solid #BBB;width:auto;padding:0;margin-bottom:0;border-radius:4px}h1 span{font-size:70%;vertical-align:7%;margin-left:.4em}#recherchecdt a,#recherchecolle a{float:none!important;margin-left:.5em}.topbarre select#semaines{margin-left:1.3em;width:8em;height:1.7em}.topbarre select#seances{margin-left:1.3em;width:10.5em;height:1.7em}.topbarre input{position:absolute;margin:0 .8em 0 1.5em;padding-left:1.8em;width:-moz-available;height:1.7em}.topbarre span{position:relative;left:1.9em;cursor:pointer;top:.1em}@media screen and (max-width:980px) and (min-width:800px),screen and (max-width:600px){#recherchecdt input{display:none;top:1.8em;padding-left:.1em;right:2em;margin-left:2em!important}#recherchecdt span{left:1.3em}}@media screen and (max-width:450px){#recherchecdt a,#recherchecdt select{margin-left:.3em!important}#recherchecdt input{margin-left:.3em}#recherchecdt select{width:6em!important}#recherchecdt span{left:.3em}}@media screen and (max-width:400px){#recherchecolle a,#recherchecolle select{margin-left:.3em!important}#recherchecolle input{margin-left:0!important}#recherchecolle select{width:6em}#recherchecolle span{left:.3em}}@media screen and (max-width:350px){#recherchecolle input{display:none;top:1.8em;padding-left:.1em;right:2em;margin-left:2em!important}}@media screen and (-webkit-min-device-pixel-ratio:0){.topbarre{height:1.4em;vertical-align:bottom}#recherchecolle input{width:40%}.topbarre span{top:.2em}#recherchecdt a,#recherchecolle a{vertical-align:middle}.topbarre select{height:1.7em}}#parentsdoc{margin-bottom:1.5em;padding:.3em 2% 0}#parentsdoc *{padding-top:0}#parentsdoc span{position:static;cursor:auto}.rep,.doc{padding:0;margin-left:2%;margin-right:2%;border-bottom:1px dotted #BBB}.repcontenu,.docdonnees{float:right;font-size:.8em;padding-top:.2em;padding-left:.5em}#parentsdoc a,.rep a,.doc a{text-decoration:none;color:black}#parentsdoc .nom,.rep .nom,.doc .nom{font-weight:700;margin-left:.5em}.general{position:absolute;top:-4.1em;right:1em}.general+.general{right:2.2em}.general+.general+.general{right:3.4em}.general+.general+.general+.general{right:4.6em}.edition{display:inline;text-align:left;padding-right:3em}h3.edition.editable{padding-right:1%}.edition ~ div,.edition+p,.edition ~ form{margin-top:.75em}article.cache{background-color:#AAA;opacity:.6;filter:alpha(opacity=60)}#log{position:fixed;top:3%;left:3%;padding:.3em 2%;z-index:6;margin-right:3%}.ok{background-color:#EFE;color:#090;border:1px solid #090}.nok{background-color:#FEE;color:#D00;border:1px solid #D00}.ok span{color:#090}.nok span{color:#D00}#log span{cursor:pointer;position:relative;right:-0.8em;top:.1em}#fenetre_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;filter:alpha(opacity=20);z-index:3}#fenetre{position:fixed;left:50%;z-index:4;padding:0 2%;overflow:auto;background-color:#e3ecfc;opacity:.97;filter:alpha(opacity=97);box-shadow:.5em .5em .5em #777;-moz-box-shadow:.5em .5em .5em #777;-webkit-box-shadow:.5em .5em .5em #777}#fenetre>*:last-child{margin-bottom:1em}@media screen and (min-width:800px){#fenetre{top:10%;width:70%;margin-left:-37%;max-height:80%}}@media screen and (max-width:800px){.general{top:-2.2em}#fenetre{top:4%;width:92%;margin-left:-48%;max-height:92%}}#fenetre a[class^="icon-"]{margin-top:1.5em}#fenetre hr{margin:1.5em 0}#epingle{margin-top:1.5em}#epingle h3{padding-left:0}[id^="aide-"],[id^="form-"]{display:none}#fenetre [name="titre"]{margin:2em 0 1em}#fenetre [name="titre"]+*{display:inline}form.titrecdt{padding:.2em 0 .5em;margin-top:.2em}.suppression{text-align:center}#fenetre.usermat h3{margin-bottom:0}#fenetre.usermat a.icon-ajoute,#fenetre a.icon-supprime{margin-top:.8em}#fenetre.usermat .ligne,#fenetre.usergrp .ligne{border-bottom:1px dotted #BBB}#fenetre.usermat input,#fenetre.usergrp input{margin-top:.2em}#fenetre th+th,#fenetre td+td{text-align:center;width:2em;padding:.15em}#fenetre th a{float:none}#fenetre th{border:none!important}#fenetre td{border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px dotted #BBB!important}#planning{text-align:center}.labelchecked{color:#999}tr:hover{background-color:#EFF}input,select,textarea{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}p.ligne{padding:0;clear:right}.ligne label{font-weight:700}.ligne input,.ligne select,.ligne code{width:65%;float:right;margin-top:-0.2em}.ligne input[type="checkbox"],.ligne input[type="radio"]{width:1em;margin-top:.2em}input.ligne{width:100%;margin-bottom:.5em;display:block}.supprmultiple{margin-top:.3em;margin-bottom:0!important}.usermat{margin-top:.5em;padding:0;clear:right}.usermat a{padding:0!important}table{width:100%;margin:1em 0;border-collapse:collapse;border:medium solid #999}table td{padding:.15em .5%}table th{padding:.15em 3%}table td,table th{border:thin solid #AAA!important}table td .icon-edite{float:left!important;margin:0 .2em 0 .1em}div.placeholder:before{content:attr(data-placeholder);color:#AAA;margin-left:4px;z-index:2}span.placeholder{color:#AAA;position:absolute;margin:.2em 2.5% 0 5px;z-index:2}#fenetre span.placeholder,#fenetre div.placeholder:before{z-index:5}.editable,.titrecdt.edition,form.titrecdt,.editabledest{border:1px dotted #BBB;position:relative}.editable a[class^="icon-"],p.titrecdt a[class^="icon-"],.editabledest a[class^="icon-"]{float:none}.avecform{padding:0;border:none!important}h3.editable a[class^="icon-"],h3 span.editable a[class^="icon-"]{font-weight:500;font-size:.67em;padding-top:.1em}h3.avecform span{font-weight:500;font-size:.67em;margin-top:.4em;width:80%;overflow:hidden;white-space:nowrap}h3.avecform input{width:50%}textarea{width:100%;margin:0 0 .2em}textarea+div{min-height:6em;border:1px dotted #CCC;background-color:#FFF}.boutons{clear:right;background-color:#DDD;border:1px solid #BBB;width:auto;padding:0;margin-bottom:0;border-radius:4px}.boutons button{cursor:default;background-color:transparent;border-top:0;border-left:none;border-bottom:1px solid #BBB;border-right:1px solid #BBB;height:1.5em;font-size:100%;width:2em}.boutons button+button{margin-left:-0.2em}div.editable a[class^="icon-"]{position:absolute;right:3px;top:0}div.editable a.icon-annule{top:1.5em}div.edithtml a.icon-ok{top:1.6em}div.edithtml a.icon-annule{top:3.1em}nav,#recent{background-color:#9ab3e4}nav a[class^="icon-"]{float:none!important;display:inline!important;margin:.5em 3% 1em;color:#001030}nav a{display:block;margin-bottom:.2em;padding:0;text-decoration:none;color:#002877}nav a:hover{color:#CDF}nav h3{font-size:1.2em;margin:.5em 3% .1em;padding-top:.3em;color:#001030;border-top:1px solid #001030}nav hr{margin:.5em 3% .5em;color:#001030;border-top:1px solid #001030;border-bottom:0}nav a.menurep{padding-left:3%;font-size:.9em}#actuel{font-style:italic}nav h3 span{font-weight:500;font-size:.83em;margin-right:.2em;color:#001030!important}#recent a{display:block;margin-bottom:.4em;padding:0;text-decoration:none;color:#002877;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#recent a span{color:#002877}#recent h3{font-size:1.2em;margin:0 3% .5em;color:#001030}th.semaines{vertical-align:bottom;padding:1.6em 0;text-align:center}td.semaines{padding-bottom:1em!important;vertical-align:bottom;text-align:center;padding:.2em 5px}td.semaines span{display:block;font-weight:700;margin:0;padding:0;width:1.2em;transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);white-space:nowrap;zoom:1}td.pasnote{font-style:italic;text-align:center}.collsel{font-weight:700}.collnosel,.dejanote{color:#AAA}#recherchenote{padding:0 1em}#notes td+td{text-align:right}@media print{#colonne,#recherchecolle,#recherchecdt,[id^="aide-"],[id^="form-"],footer,a[class^="icon-"]{display:none}.editable,.titrecdt.edition,form.titrecdt,.editabledest{border:0}h1{font-size:1.7em;text-align:center;margin:0;padding:0 0 1em}h2{font-size:1.5em;margin:.7em 0;padding:0}h3{font-size:1.35em;margin:.6em 0;padding:0 1% 0}h4{font-size:1.2em;margin:.4em 0 .2em;padding:0 2.5% 0}h5{font-size:1.1em;margin:.2em 0 0;padding:0 4% 0}h6{font-size:1em;margin:.2em 0 0;padding:0 5.5% 0}article{border:1px solid #999}}.timeEntry-control{float:right;margin:0 5px 0 0}.datepick-trigger{float:right;margin:.1em 7px 0 0}.datepick{background-color:#fff;color:#000;border:1px solid #444;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em;font-family:Arial,Helvetica,Sans-serif;font-size:90%}.datepick-rtl{direction:rtl}.datepick-popup{z-index:2}.datepick-disable{position:absolute;z-index:1;background-color:white;opacity:.5;filter:alpha(opacity=50)}.datepick a{color:#fff;text-decoration:none}.datepick a.datepick-disabled{color:#888;cursor:auto}.datepick button{margin:.25em;padding:.125em 0;background-color:#fcc;border:0;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em;font-weight:bold}.datepick-nav,.datepick-ctrl{float:left;width:100%;background-color:#000;color:#fff;font-size:90%;font-weight:bold}.datepick-ctrl{background-color:#600}.datepick-cmd{width:30%}.datepick-cmd:hover{background-color:#777}.datepick-ctrl .datepick-cmd:hover{background-color:#f08080}.datepick-cmd-prevJump,.datepick-cmd-nextJump{width:8%}a.datepick-cmd{height:1.5em}button.datepick-cmd{text-align:center}.datepick-cmd-prev,.datepick-cmd-prevJump,.datepick-cmd-clear{float:left;padding-left:2%}.datepick-cmd-current,.datepick-cmd-today{float:left;width:35%;text-align:center}.datepick-cmd-next,.datepick-cmd-nextJump,.datepick-cmd-close{float:right;padding-right:2%;text-align:right}.datepick-rtl .datepick-cmd-prev,.datepick-rtl .datepick-cmd-prevJump,.datepick-rtl .datepick-cmd-clear{float:right;padding-left:0;padding-right:2%;text-align:right}.datepick-rtl .datepick-cmd-current,.datepick-rtl .datepick-cmd-today{float:right}.datepick-rtl .datepick-cmd-next,.datepick-rtl .datepick-cmd-nextJump,.datepick-rtl .datepick-cmd-close{float:left;padding-left:2%;padding-right:0;text-align:left}.datepick-month-nav{float:left;background-color:#777;text-align:center}.datepick-month-nav div{float:left;width:12.5%;margin:1%;padding:1%}.datepick-month-nav span{color:#888}.datepick-month-row{clear:left}.datepick-month{float:left;width:15em;border:1px solid #444;text-align:center}.datepick-month-header,.datepick-month-header select,.datepick-month-header input{height:1.5em;background-color:#444;color:#fff;font-weight:bold}.datepick-month-header select,.datepick-month-header input{height:1.4em;margin:0;padding:0;border:0;font-size:100%}.datepick-month-header input{position:absolute;display:none}.datepick-month table{width:100%;border-collapse:collapse}.datepick-month thead{border-bottom:1px solid #aaa}.datepick-month th,.datepick-month td{margin:0;padding:0;font-weight:normal;text-align:center}.datepick-month th{border:1px solid #777}.datepick-month th,.datepick-month th a{background-color:#777;color:#fff}.datepick-month td{background-color:#eee;border:1px solid #aaa}.datepick-month td.datepick-week{border:1px solid #777}.datepick-month td.datepick-week *{background-color:#777;color:#fff;border:0}.datepick-month a{display:block;width:100%;padding:.125em 0;background-color:#eee;color:#000;text-decoration:none}.datepick-month span{display:block;width:100%;padding:.125em 0}.datepick-month td span{color:#888}.datepick-month td .datepick-other-month{background-color:#fff}.datepick-month td .datepick-weekend{background-color:#ddd}.datepick-month td .datepick-today{background-color:#f0c0c0}.datepick-month td .datepick-highlight{background-color:#f08080}.datepick-month td .datepick-selected{background-color:#777;color:#fff}.datepick-month th.datepick-week{background-color:#777;color:#fff}.datepick-status{clear:both;background-color:#ddd;text-align:center}.datepick-clear-fix{clear:both}.timeEntry-control{vertical-align:middle;margin-left:2px}
\ Pas de fin de ligne à la fin du fichier
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/def_sql.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/def_sql.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/def_sql.php	2015-09-30 18:46:18.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/def_sql.php	2015-10-27 23:00:31.081183450 +0100
@@ -1,11 +1,11 @@
 <?php
 // Définition de la base de données
 // À utiliser en tant qu'utilisateur root
-// Champs à remplacer : $base, $mdp, $serveur, $cle_matiere, $nom_matiere,
-// $login, $nom, $prenom, $mail, $titre
+// Champs à remplacer : $base, $mdp, $serveur,
+// $login, $nom, $prenom, $mail, $titre, $cle_matiere, $nom_matiere
 //
 // Ces définitions sont utilisables en php directement ou en shell linux par
-// sed '1,/FIN/d ; N;$!P;$!D;$d' def_sql.php | sed "s/\\\$base/$BASE/g;s/\\\$serveur/$SERVEUR/g;..."
+// sed '1,/[ ]FIN/d ; N;$!P;$!D;$d' def_sql.php | sed "s/\\\$base/$BASE/g;s/\\\$serveur/$SERVEUR/g;..."
 
 $requete = <<< FIN
 
@@ -40,13 +40,13 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE `utilisateurs` (
-  `id` smallint(2) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  `id` tinyint(2) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `login` varchar(50) NOT NULL UNIQUE,
   `nom` varchar(50) NOT NULL,
   `prenom` varchar(50) NOT NULL,
   `mail` varchar(50) NOT NULL,
   `autorisation` tinyint(1) UNSIGNED NOT NULL,
-  `mdp` varchar(41) NOT NULL,
+  `mdp` char(41) NOT NULL,
   `matieres` varchar(30) NOT NULL,
   `timeout` smallint(4) UNSIGNED NOT NULL,
   `mailexp` varchar(50) NOT NULL,
@@ -85,7 +85,7 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE `colles` (
-  `id` smallint(3) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  `id` tinyint(3) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `semaine` tinyint(2) unsigned NOT NULL,
   `matiere` tinyint(2) unsigned NOT NULL,
   `texte` text NOT NULL,
@@ -185,8 +185,8 @@
 CREATE TABLE notes (
   `id` smallint(5) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `semaine` tinyint(2) unsigned NOT NULL,
-  `eleve` smallint(3) unsigned NOT NULL,
-  `colleur` smallint(3) unsigned NOT NULL,
+  `eleve` tinyint(2) unsigned NOT NULL,
+  `colleur` tinyint(2) unsigned NOT NULL,
   `matiere` tinyint(2) unsigned NOT NULL,
   `note` varchar(4) NOT NULL
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/docs.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/docs.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/docs.php	2015-09-20 01:46:22.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/docs.php	2015-10-27 12:48:33.019597305 +0100
@@ -118,12 +118,13 @@
 // Affichage public sans édition
 if ( !$edition )  {
   echo <<< FIN
+
   <p id="parentsdoc" class="topbarre">
     <a class="icon-chronodesc ordre" title="Classer les documents par ordre alphabétique inversé"></a>
     <a class="icon-chronoasc ordre" title="Classer les documents par ordre chronologique"></a>
     <a class="icon-alphadesc ordre" title="Classer les documents par ordre alphabétique inversé"></a>
     <a class="icon-alphaasc ordre" title="Classer les documents par ordre alphabétique"></a>
-    <span class="icon-rep-open"></span><span class="nom"><a href="docs?rep=$rid">${r['0']}</a></span>
+    <span class="icon-rep-open"></span><span class="nom">${r['0']}</span>
   </p>
 
 FIN;
@@ -137,13 +138,13 @@
       while ( $r = $resultat->fetch_assoc() )
         // Affichage du contenu : pas de lien si connecté et protection trop élevée
         if ( $autorisation && $r['protection'] )
-          echo "  <p class=\"rep\"><span class=\"icon-rep\"></span><span class=\"icon-lock\"></span><span class=\"nom\">${r['nom']}</span></p>\n";
+          echo "\n  <p class=\"rep\"><span class=\"icon-rep\"></span><span class=\"icon-lock\"></span><span class=\"nom\">${r['nom']}</span></p>\n";
         // Lien sinon, avec cadenas si non connecté mais protection
         else  {
           $protection = ( $r['protection'] ) ? '<span class="icon-lock"></span>' : '';
           $contenu = ( $r['nbrep']+$r['nbdoc'] ) ? str_replace(array('0 répertoire,',', 0 document'),'',"(${r['nbrep']} répertoire".( ( $r['nbrep'] > 1 ) ? 's' : '' ).", ${r['nbdoc']} document".( ( $r['nbdoc'] > 1 ) ? 's' : '' ).'&nbsp;)')
                                                  : '(vide)';
-          echo "  <p class=\"rep\"><span class=\"repcontenu\">$contenu</span> <a href=\"?rep=${r['id']}\"><span class=\"icon-rep\"></span>$protection<span class=\"nom\">${r['nom']}</span></a></p>\n";
+          echo "\n  <p class=\"rep\"><span class=\"repcontenu\">$contenu</span> <a href=\"?rep=${r['id']}\"><span class=\"icon-rep\"></span>$protection<span class=\"nom\">${r['nom']}</span></a></p>\n";
         }
       $resultat->free();
     }
@@ -155,24 +156,21 @@
       while ( $r = $resultat->fetch_assoc() )  {
         $icone = isset($icones[$ext = substr($r['ext'],1)]) ? $icones[$ext] : '';
         if ( $autorisation && $r['protection'] )
-          echo "  <p class=\"doc\"><span class=\"docdonnees\">($ext, ${r['upload']}, ${r['taille']})</span> <span class=\"icon-doc$icone\"></span><span class=\"icon-lock\"></span><span class=\"nom\">${r['nom']}</span></p>\n";
+          echo "\n  <p class=\"doc\"><span class=\"docdonnees\">($ext, ${r['upload']}, ${r['taille']})</span> <span class=\"icon-doc$icone\"></span><span class=\"icon-lock\"></span><span class=\"nom\">${r['nom']}</span></p>\n";
         else  {
           $protection = ( $r['protection'] ) ? '<span class="icon-lock"></span>' : '';
-          echo "  <p class=\"doc\"><span class=\"docdonnees\">($ext, ${r['upload']}, ${r['taille']})</span> <a href=\"download?id=${r['id']}\"><span class=\"icon-doc$icone\"></span>$protection<span class=\"nom\">${r['nom']}</span></a></p>\n";
+          echo "\n  <p class=\"doc\"><span class=\"docdonnees\">($ext, ${r['upload']}, ${r['taille']})</span> <a href=\"download?id=${r['id']}\"><span class=\"icon-doc$icone\"></span>$protection<span class=\"nom\">${r['nom']}</span></a></p>\n";
         }
       }
       $resultat->free();
     }
   }
   else
-    echo "  <h2>Ce répertoire est vide.</h2>\n";
+    echo "\n  <h2>Ce répertoire est vide.</h2>\n";
 }
-
-
-
 // Affichage professeur éditeur
 else  {
-  $protection = ( $rep['protection'] ) ? '<span class="icon-lock"></span>' : '';
+  $protection = ( $rep['protection'] ) ? "<span class=\"icon-lock${rep['protection']}\"></span>" : '';
   echo <<< FIN
 
   <a class="icon-aide general" data-id="page" title="Aide pour les modifications des répertoires et documents"></a>
@@ -181,7 +179,7 @@
     <a class="icon-edite" title="Modifier ce répertoire"></a>
     <a class="icon-ajoutedoc" title="Ajouter un document dans ce répertoire"></a>
     <a class="icon-ajouterep" title="Ajouter un sous-répertoire"></a>
-    <a class="icon-chronodesc ordre" title="Classer les documents par ordre alphabétique inversé"></a>
+    <a class="icon-chronodesc ordre" title="Classer les documents par ordre chronologique inversé"></a>
     <a class="icon-chronoasc ordre" title="Classer les documents par ordre chronologique"></a>
     <a class="icon-alphadesc ordre" title="Classer les documents par ordre alphabétique inversé"></a>
     <a class="icon-alphaasc ordre" title="Classer les documents par ordre alphabétique"></a>
@@ -197,17 +195,18 @@
     $resultat = $mysqli->query("SELECT id, nom, nbrep, nbdoc, parent, menu, protection FROM reps WHERE parent = $rid");
     if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )  {
-        $protection = ( $r['protection'] ) ? '<span class="icon-lock"></span>' : '';
+        $protection = ( $r['protection'] ) ? "<span class=\"icon-lock${r['protection']}\"></span>" : '';
         $contenu = ( $r['nbrep']+$r['nbdoc'] ) ? str_replace(array('0 répertoire,',', 0 document'),'',"(${r['nbrep']} répertoire".( ( $r['nbrep'] > 1 ) ? 's' : '' ).", ${r['nbdoc']} document".( ( $r['nbdoc'] > 1 ) ? 's' : '' ).'&nbsp;)')
                                                : '(vide)';
         // data-donnees : parent|menu|protection
         echo <<<FIN
+
   <p class="rep" data-id="reps|${r['id']}" data-donnees="${r['parent']}|${r['menu']}|${r['protection']}">
     <a class="icon-edite" title="Modifier ce répertoire"></a>
     <a class="icon-ajoutedoc" title="Ajouter un document dans ce répertoire"></a>
     <a class="icon-supprime" title="Supprimer ce répertoire et son contenu"></a>
     <span class="repcontenu">$contenu</span> 
-    <a href="?rep=${r['id']}"><span class="icon-rep"></span>$protection</a><span class="nom editable" data-id="reps|nom|${r['id']}">${r['nom']}</span>
+    <a href="?rep=${r['id']}"><span class="icon-rep"></span></a>$protection<span class="nom editable" data-id="reps|nom|${r['id']}">${r['nom']}</span>
   </p>
 
 FIN;
@@ -221,8 +220,9 @@
     if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )  {
         $icone = isset($icones[$ext = substr($r['ext'],1)]) ? $icones[$ext] : '';
-        $protection = ( $r['protection'] ) ? '<span class="icon-lock"></span>' : '';
+        $protection = ( $r['protection'] ) ? "<span class=\"icon-lock${r['protection']}\"></span>" : '';
         echo <<<FIN
+
   <p class="doc" data-id="docs|${r['id']}" data-protection="${r['protection']}">
     <a class="icon-edite" title="Modifier ce document"></a>
     <a class="icon-download" href="download?id=${r['id']}&amp;dl" title="Télécharger ce document"></a>
@@ -237,7 +237,7 @@
     }
   }
   else
-    echo "  <h2>Ce répertoire est vide.</h2>\n";
+    echo "\n  <h2>Ce répertoire est vide.</h2>\n";
 
   // Select sur les répertoires (pour les déplacements)
   function liste($rid,$n)  {
@@ -256,6 +256,14 @@
   }
   $resultat->free();
                               
+  // Taille maximale de fichier (pour l'aide)
+  $taille = min(ini_get('upload_max_filesize'),ini_get('post_max_size'));
+  if ( stristr($taille,'m') )
+    $taille = substr($taille,0,-1)*1048576;
+  elseif ( stristr($taille,'k') )
+    $taille = substr($taille,0,-1)*1024;
+  $taille = ( $taille < 1048576 ) ? intval($taille/1024).'&nbsp;ko' : intval($taille/1048576).'&nbsp;Mo';
+
   // Aide et formulaire d'ajout
 ?>
 
@@ -345,36 +353,123 @@
 
   <div id="aide-page">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Il est possible ici de modifier le contenu des répertoires et les propriétés des répertoires et des documents présents. Vous n'avez la possibilité de modifier que les documents &laquo;&nbsp;toutes matières&nbsp;&raquo; et les documents des matières qui vous sont associées. Pour modifier les matières qui vous sont associées, il faut aller sur la page de <a href="matieres">gestion des matières</a>.</p>
+    <p>Les noms des répertoires et documents contenus dans le répertoire affiché sur cette page sont modifiables directement, en cliquant sur le bouton <span class="icon-edite"></span> situé dans la case encadrée de pointillés.</p>
+    <p>Comme sur la partie visible par les visiteurs non connectés en tant que professeurs, les répertoires sont indiqués par l'icône <span class="icon-rep"></span> (cliquer dessus affiche le répertoire correspondant), les documents par l'icône correspondant à leur type (<span class="icon-doc-pdf"></span> pour les <code>pdf</code>, <span class="icon-doc-doc"></span> pour les textes <code>doc</code> ou <code>odt</code>...). Le contenu des répertoires et les principales propriétés des documents sont indiqués à droite.</p>
+    <p>La taille des fichiers envoyés est limitée à <?php echo $taille; ?>.</p>
+    <h4>Actions possibles</h4>
+    <p>Les différentes actions possibles sont&nbsp;:</p>
+    <ul>
+      <li><span class="icon-ajouterep"></span>&nbsp;: ajouter un répertoire à l'intérieur du répertoire affiché sur cette page. Une aide sera disponible sur le formulaire qui s'affichera.</li>
+      <li><span class="icon-ajoutedoc"></span>&nbsp;: ajouter un document à l'intérieur du répertoire choisi. Une aide sera disponible sur le formulaire qui s'affichera.</li>
+      <li><span class="icon-edite"></span>&nbsp;: modifier les propriétés du répertoire ou du document choisi. Il est notamment possible de modifier individuellement l'<em>accès</em> à chaque répertoire/document (explications ci-dessous). Une aide sera disponible sur le formulaire qui s'affichera.</li>
+      <li><span class="icon-supprime"></span>&nbsp;: supprimer le répertoire ou document choisi (une confirmation sera demandée). Supprimer un répertoire supprime automatiquement tout son contenu (sous-répertoires et documents).</li>
+      <li><span class="icon-download"></span>&nbsp;: télécharger un document pour le voir.</li>
+    </ul>
+    <p>Les liens vers les répertoires et les documents sont garantis&nbsp;: aucune modification (changement de nom, mise à jour de document, déplacement...) réalisée sur les répertoires ou les documents ne peut modifier ces liens. Si vous souhaitez mettre à jour un document, surtout ne le supprimez pas pour le recréer&nbsp;: cela changerait le lien, les liens existants ne seraient plus valables. Modifiez plutôt le document.</p>
+    <h4>Accès</h4>
+    <p>L'<em>accès</em> à chaque répertoire et chaque document peut être choisi parmi six possibilités. Le choix réalisé pour les répertoires/documents existants est directement visible sur cette page (uniquement lorsque vous êtes connecté en tant que professeur) avec un cadenas portant un numéro. Les choix possibles sont&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em> (pas de marquage)&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em> (<span class="icon-lock1"></span>)&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les répertoires/documents associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em> (<span class="icon-lock2"></span>)&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les répertoires/documents associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em> (<span class="icon-lock3"></span>)&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les répertoires/documents associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em> (<span class="icon-lock4"></span>)&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les répertoires/documents associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em> (<span class="icon-lock5"></span>)&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont le répertoire peut dépendre). La différence avec le choix précédent est que le répertoire/document n'apparaît plus du tout sur le site pour ceux qui ne le voient pas.</li>
+    </ul>
+    <p>Les répertoires/documents protégés (sauf <em>Non visible</em>) apparaissent même s'ils ne sont pas accessibles, marqués d'un petit cadenas. Le contenu des répertoires tient compte de cela&nbsp;: les répertoires/documents non visibles ne sont pas décomptés.</p>
+    <h4>Liens dans le menu</h4>
+    <p>Le lien dans le menu vers le répertoire racine de chaque matière est généré automatiquement. Il ne s'affiche que si ce répertoire est non vide&nbsp;:</p>
+    <ul>
+      <li>pour les utilisateurs non connectés, si des documents éventuellement protégés sont présents (les répertoires et documents protégés apparaissent avec un petit cadenas).</li>
+      <li>pour les utilisateurs connectés, si des documents sont présents et si le répertoire racine est accessible (<em>accès</em> pas trop élevé).</li>
+    </ul>
+    <p>Il est possible de rajouter des liens dans le menu vers des sous-répertoires. C'est une des propriétés que vous pouvez modifier pour chaque répertoire en cliquant sur le bouton <span class="icon-edite"></span> correspondant.</p>
   </div>
 
   <div id="aide-repertoire">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet de modifier les propriétés du répertoire choisi. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Les répertoires racines des matières sont très peu modifiables&nbsp;: seul l'<em>accès</em> peut être modifié. Pour les autres répertoires, il est possible de les renommer, de les déplacer à l'intérieur d'un autre répertoire ou d'afficher un lien supplémentaire dans le menu.</p>
+    <p>Le <em>nom</em> du répertoire peut comporter des espaces, des accents... Vous pouvez donc l'écrire en français&nbsp;! Ce nom est aussi modifiable directement en cliquant sur le bouton <span class="icon-edite"></span> dans la case entourée de pointillés.</p>
+    <p>Vous pouvez <em>déplacer</em> le répertoire dans un autre répertoire, qui peut éventuellement appartenir à une autre matière si elle vous est associée. La liste des répertoires où le déplacement est possible est dans le menu déroulant. L'ensemble du contenu du répertoire déplacé est bien sûr automatiquement déplacé.</p>
+    <p>La case à cocher <em>Affichage du répertoire dans le menu</em> permet d'afficher un lien direct dans le menu vers la page correspondant au répertoire. Ce lien sera situé en-dessous du lien <em>Documents à télécharger</em> qui permet d'arriver sur cette page. Sa visibilité dépend du choix de l'<em>accès</em> explicité ci-dessous.</p>
+    <p>L'<em>accès</em> à ce répertoire peut être choisi parmi six possibilités, visibles directement lorsque vous êtes connecté en tant que professeur&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em> (pas de marquage)&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em> (<span class="icon-lock1"></span>)&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em> (<span class="icon-lock2"></span>)&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em> (<span class="icon-lock3"></span>)&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em> (<span class="icon-lock4"></span>)&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em> (<span class="icon-lock5"></span>)&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont le répertoire peut dépendre). La différence avec le choix précédent est que le répertoire n'apparaît plus du tout sur le site pour ceux qui ne le voient pas.</li>
+    </ul>
+    <p>Hormis le dernier choix, le répertoire apparaît pour tout visiteur (identifié ou non), éventuellement avec un petit cadenas gris indiquant qu'il est protégé. Avec le choix <em>Non visible</em>, le répertoire n'est plus du tout visible sans être connecté en tant que professeur.</p>
+    <p>La case à cocher <em>Propager le choix ci-dessus à chaque document/sous-répertoire</em> permet de faire suivre le choix précédent à l'ensemble du contenu du répertoire. Si elle est décochée, aucune modification supplémentaire n'a lieu. Si elle est cochée, une action sera effectuée même si le choix d'<em>accès</em> n'a pas été modifié.</p>
+    <p>Les comptes utilisateurs sont à définir ou modifier sur la page de <a href="utilisateurs">gestion des utilisateurs</a>. Les associations avec les matières sont modifiables sur la page de <a href="matieres">gestion des matières</a>.</p>
   </div>
 
   <div id="aide-ajouterep">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet de créer un nouveau répertoire au sein du répertoire dont le contenu est affiché sur cette page. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Le <em>nom</em> du répertoire peut comporter des espaces, des accents... Vous pouvez donc l'écrire en français&nbsp;!</p>
+    <p>La case à cocher <em>Affichage du répertoire dans le menu</em> permet d'afficher un lien direct dans le menu vers la page correspondant au répertoire. Ce lien sera situé en-dessous du lien <em>Documents à télécharger</em> qui permet d'arriver sur cette page. Sa visibilité dépend du choix de l'<em>accès</em> explicité ci-dessous.</p>
+    <p>L'<em>accès</em> à ce nouveau répertoire peut être choisi parmi six possibilités&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont le répertoire peut dépendre). La différence avec le choix précédent est que le répertoire n'apparaît plus du tout sur le site pour ceux qui ne le voient pas.</li>
+    </ul>
+    <p>Hormis le dernier choix, le répertoire apparaîtra pour tout visiteur (identifié ou non), éventuellement avec un petit cadenas gris indiquant qu'il est protégé. Avec le choix <em>Non visible</em>, le répertoire n'est plus du tout visible sans être connecté en tant que professeur.</p>
+    <p>Les comptes utilisateurs sont à définir ou modifier sur la page de <a href="utilisateurs">gestion des utilisateurs</a>. Les associations avec les matières sont modifiables sur la page de <a href="matieres">gestion des matières</a>.</p>
   </div>
   
   <div id="aide-document">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet de modifier les propriétés du document choisi. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Le <em>nom</em> du document peut comporter des espaces, des accents... Vous pouvez donc l'écrire en français&nbsp;! Ce nom est aussi modifiable directement en cliquant sur le bouton <span class="icon-edite"></span> dans la case entourée de pointillés. Il ne doit pas comporter l'extension, qui est ajoutée lorsque l'on le télécharge.</p>
+    <p>Vous pouvez <em>mettre à jour</em> le document en envoyant un nouveau fichier. C'est bien mieux que de supprimer/recréer le document, car les liens existants restent valables. Une fois le formulaire validé, le document apparaîtra à nouveau tout en haut des informations récentes, comme s'il venait d'être envoyé. La date et la taille du document seront modifiées.</p>
+    <p>La taille maximale du fichier envoyé est <?php echo $taille; ?>. Le fichier envoyé doit être de même extension que le fichier originel.</p>
+    <p>Vous pouvez <em>déplacer</em> le document dans un autre répertoire, qui peut éventuellement appartenir à une autre matière si elle vous est associée. La liste des répertoires où le déplacement est possible est dans le menu déroulant.</p>
+    <p>L'<em>accès</em> à ce document peut être choisi parmi six possibilités, visibles directement lorsque vous êtes connecté en tant que professeur&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em> (pas de marquage)&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em> (<span class="icon-lock1"></span>)&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em> (<span class="icon-lock2"></span>)&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em> (<span class="icon-lock3"></span>)&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em> (<span class="icon-lock4"></span>)&nbsp;: accessible uniquement par les utilisateurs de type professeur. Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em> (<span class="icon-lock5"></span>)&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la bonne matière). La différence avec le choix précédent est que le document n'apparaît plus du tout sur le site pour ceux qui ne le voient pas, notamment dans le décompte du répertoire le contenant.</li>
+    </ul>
+    <p>Hormis le dernier choix, le document apparaît pour tout visiteur (identifié ou non), éventuellement avec un petit cadenas gris indiquant qu'il est protégé. Avec le choix <em>Non visible</em>, le document n'est plus du tout visible sans être connecté en tant que professeur.</p>
+    <p>Les comptes utilisateurs sont à définir ou modifier sur la page de <a href="utilisateurs">gestion des utilisateurs</a>. Les associations avec les matières sont modifiables sur la page de <a href="matieres">gestion des matières</a>.</p>
   </div>
 
   <div id="aide-ajoutedoc">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet d'ajouter un document dans le répertoire choisi. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>La taille maximale du <em>fichier</em> envoyé est <?php echo $taille; ?>.</p>
+    <p>Le <em>nom à afficher</em> du document peut comporter des espaces, des accents... Vous pouvez donc l'écrire en français&nbsp;!</p>
+    <p>L'<em>accès</em> à ce document peut être choisi parmi six possibilités, visibles directement lorsque vous êtes connecté en tant que professeur&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em> (pas de marquage)&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em> (<span class="icon-lock1"></span>)&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em> (<span class="icon-lock2"></span>)&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em> (<span class="icon-lock3"></span>)&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em> (<span class="icon-lock4"></span>)&nbsp;: accessible uniquement par les utilisateurs de type professeur. Dans les répertoires associés à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em> (<span class="icon-lock5"></span>)&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la bonne matière). La différence avec le choix précédent est que le document n'apparaît plus du tout sur le site pour ceux qui ne le voient pas, notamment dans le décompte du répertoire le contenant.</li>
+    </ul>
+    <p>Hormis le dernier choix, le document apparaît pour tout visiteur (identifié ou non), éventuellement avec un petit cadenas gris indiquant qu'il est protégé. Avec le choix <em>Non visible</em>, le document n'est plus du tout visible sans être connecté en tant que professeur.</p>
+    <p>Les comptes utilisateurs sont à définir ou modifier sur la page de <a href="utilisateurs">gestion des utilisateurs</a>. Les associations avec les matières sont modifiables sur la page de <a href="matieres">gestion des matières</a>.</p>
   </div>
   
   <p id="log"></p>
-
 <?php
 }
 ?>
 
-<script type="text/javascript">
+  <script type="text/javascript">
 $( function() {
   $('a.ordre').on("click",function() {
     var h = window.location.href;
@@ -393,7 +488,7 @@
       window.location = ( h.indexOf('?') > 0 ) ? h+'&ordre='+o : h+'?ordre='+o;
   });
 });
-</script>
+  </script>
 <?php
 $mysqli->close();
 fin($edition);
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonctions.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonctions.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonctions.php	2015-10-13 02:05:30.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonctions.php	2015-10-28 01:06:40.366809494 +0100
@@ -237,12 +237,7 @@
   if ( $actuel )  {
     // Récupération et affichage des pages
     $menu = "<a class=\"icon-menu\" title=\"Afficher le menu\"></a>\n<div id=\"colonne\">\n  <nav>\n";
-    if ( !$autorisation )
-      $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0 AND protection < 5');
-    elseif ( $autorisation == 4 )
-      $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0');
-    else 
-      $resultat = $mysqli->query("SELECT cle, nom FROM pages WHERE mat = 0 AND (id = 1 OR protection <= $autorisation)");
+    $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0 AND (id = 1 OR '. ( $autorisation ? "LEAST(protection,4) <= $autorisation" : 'protection < 5' ) .')');
     $r = $resultat->fetch_assoc();
     // Page d'accueil
     $menu .= "    <a class=\"icon-accueil\" href=\".?${r['cle']}\" title=\"${r['nom']}\"></a>\n";
@@ -256,14 +251,14 @@
     if ( $autorisation > 2 )
       $menu .= "    <a class=\"icon-mail\" title=\"Envoyer un mail\" href=\"mail\"></a>\n";
     // Connexion/Déconnexion
-    $menu .= ( $autorisation ) ? "    <a class=\"icon-deconnexion\" title=\"Se déconnecter\"></a>\n  <hr>\n" : "    <a class=\"icon-connexion\" title=\"Se connecter\"></a>\n  <hr>\n";
+    $menu .= ( $autorisation ) ? "    <a class=\"icon-deconnexion\" title=\"Se déconnecter\"></a>\n    <hr>\n" : "    <a class=\"icon-connexion\" title=\"Se connecter\"></a>\n    <hr>\n";
     // Autres pages
     while ( $r = $resultat->fetch_assoc() )
       $menu .= "    <a href=\".?${r['cle']}\">${r['nom']}</a>\n";
     $resultat->free();
     // Page de téléchargement
     $menu .= "    <a href=\"docs\">Documents à télécharger</a>\n";
-    $resultat = $mysqli->query('SELECT id, nom FROM reps WHERE matiere = 0 AND menu = 1'. ( $autorisation ? " AND protection <= $autorisation" : ' AND protection < 5' ));
+    $resultat = $mysqli->query('SELECT id, nom FROM reps WHERE matiere = 0 AND menu = 1 AND '. ( $autorisation ? "LEAST(protection,4) <= $autorisation" : 'protection < 5' ));
     if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )
         $menu .= "      <a class=\"menurep\" href=\"docs?rep=${r['id']}\">${r['nom']}</a>\n";        
@@ -289,7 +284,7 @@
       elseif ( $autorisation == 3 )
         $notes = '2';
       $resultat = $mysqli->query("SELECT m.id, m.cle, m.nom, (colles AND colles_protection<=$autorisation ) AS colles,
-                                  (cdt AND  cdt_protection<=$autorisation ) AS cdt, (docs AND r.protection<=$autorisation ) AS docs,
+                                  (cdt AND cdt_protection<=$autorisation ) AS cdt, (docs AND r.protection<=$autorisation ) AS docs,
                                   $notes AS notes, GROUP_CONCAT(CONCAT(m.cle,'/',p.cle) SEPARATOR '//') AS pcle, GROUP_CONCAT(p.nom SEPARATOR '//') AS pnom
                                   FROM matieres AS m LEFT JOIN (SELECT * FROM pages WHERE protection <=$autorisation ) AS p ON p.mat = m.id LEFT JOIN reps AS r ON r.matiere = m.id AND r.parent = 0
                                   WHERE FIND_IN_SET(m.id,'${_SESSION['matieres']}') AND ( $notes OR (docs AND r.protection<=$autorisation ) OR (colles AND colles_protection<=$autorisation ) OR (cdt AND cdt_protection<=$autorisation ) OR p.nom IS NOT NULL )
@@ -322,7 +317,7 @@
         }
         if ( $r['docs'] )  {
           $menu .= "    <a href=\"docs?${r['cle']}\">Documents à télécharger</a>\n";
-          $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1 AND protection < 5");
+          $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1 AND ". ( $autorisation ? "LEAST(protection,4) <= $autorisation" : 'protection < 5' ));
           if ( $resultat_doc->num_rows )  {
             while ( $d = $resultat_doc->fetch_assoc() )
               $menu .= "    <a class=\"menurep\" href=\"docs?rep=${d['id']}\">${d['nom']}</a>\n";        
@@ -347,7 +342,7 @@
 
 FIN;
     $menu = str_replace("a href=\"$actuel\"","a id=\"actuel\" href=\"$actuel\"",$menu);
-    $menu .= "\n  </nav>";
+    $menu .= '  </nav>';
 
     // Affichage des informations récentes
     $recent = '';
@@ -368,7 +363,7 @@
   else
     $menu = $recent = '';
   if ( strlen($menu.$recent) )
-    $recent .= "\n</div>";
+    $recent .= '</div>';
     
   // RSS
   $rss = sha1($GLOBALS['base'].'00');
@@ -387,16 +382,18 @@
   $token = ( isset($_SESSION['csrf-token']) ) ? " data-csrf-token=\"${_SESSION['csrf-token']}\"" : '';
   // Matière
   $matiere = ( $matiere ) ? " data-matiere=\"$matiere\"" : '';
+  // Titre dans le head : <span> pouvant indiquer la protection en mode édition
+  $head = strtok($titre,'<');
   // Affichage
   echo <<<FIN
 <!doctype html>
 <html lang="fr">
 <head>
-  <title>$titre</title>
+  <title>$head</title>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
-  <link rel="stylesheet" href="css/style-min.css?v=2">
-  <link rel="stylesheet" href="css/icones-min.css">
+  <link rel="stylesheet" href="css/style-min.css?v=3">
+  <link rel="stylesheet" href="css/icones-min.css?v=2">
   <script type="text/javascript" src="js/jquery.min.js"></script>
   <link rel="alternate" type="application/rss+xml" title="Flux RSS" href="documents/rss/$rss/rss.xml">
   <!--[if lte IE 8]><script src="js/html5shiv.min.js"></script><![endif]--> 
@@ -420,7 +417,7 @@
 <script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
 <script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax:{inlineMath:[["$","$"],["\\\\(","\\\\)"]]}});</script>' : '';
   // Édition possible si $edition est true
-  $js = ( $edition ) ? '<script type="text/javascript" src="js/edition-min.js?v=4"></script>' : '<script type="text/javascript" src="js/fonctions-min.js"></script>';
+  $js = ( $edition ) ? '<script type="text/javascript" src="js/edition-min.js?v=5"></script>' : '<script type="text/javascript" src="js/fonctions-min.js"></script>';
   // Affichage de message si $_SESSION['message']
   if ( isset($_SESSION['message']) )  {
     $m = json_decode($_SESSION['message'],true);
@@ -450,5 +447,4 @@
   return $semaine[substr($date,0,1)].' '.substr($date,7).' '.$mois[intval(substr($date,5,2))].' '.substr($date,1,4);
 }
 
-
 ?>
Les fichiers binaires /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonts/icomoon.eot et /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonts/icomoon.eot sont différents
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonts/icomoon.svg /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonts/icomoon.svg
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonts/icomoon.svg	2015-09-20 03:44:38.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonts/icomoon.svg	2015-10-21 01:49:21.858635064 +0200
@@ -75,4 +75,9 @@
 <glyph unicode="&#xe641;" glyph-name="infos" d="M448 656c0 26.4 21.6 48 48 48h32c26.4 0 48-21.6 48-48v-32c0-26.4-21.6-48-48-48h-32c-26.4 0-48 21.6-48 48v32zM640 192h-256v64h64v192h-64v64h192v-256h64zM512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 32c-229.75 0-416 186.25-416 416s186.25 416 416 416 416-186.25 416-416-186.25-416-416-416z" />
 <glyph unicode="&#xe642;" glyph-name="colles" d="M8.192 895.488c-7.168-7.168-8.192-47.104-8.192-365.056 0-326.656 0.512-358.4 8.704-364.544 5.12-4.608 23.552-7.168 52.224-7.68 24.064-0.512 44.544-1.024 44.544-1.536 0.512 0-3.584-14.848-9.216-32.256-5.632-17.92-10.24-39.936-9.728-49.664 1.024-41.472 46.592-70.144 86.528-53.76 9.216 3.584 15.36 4.608 13.824 2.048-6.144-10.24 7.68-25.6 23.552-25.6 18.432 0 20.992 5.12 32.256 69.12 31.744 181.76 33.792 193.536 28.672 199.68-8.192 9.728-24.064 12.288-32.768 5.632-7.168-5.632-43.52-100.864-64.512-171.008-9.728-32.768-12.8-36.864-23.552-36.864-24.064 0-23.040 7.168 11.264 115.2 10.24 31.232 26.112 72.704 35.328 92.16 14.336 29.696 20.992 38.4 39.424 48.64 22.016 12.288 23.552 12.288 159.232 12.8h137.216l58.88 70.656c32.256 38.4 61.952 70.144 65.536 70.144 9.728 0 19.968-13.824 16.896-22.528-2.56-6.144-90.112-113.664-116.736-142.336-6.144-7.168-16.896-9.216-54.272-9.728-65.536-0.512-66.56-2.048-52.736-73.728 6.656-33.28 8.192-41.472 12.8-69.12 2.048-12.8 4.608-27.648 6.144-33.28 1.024-5.632 6.144-34.304 11.776-63.488 9.728-54.272 14.336-61.952 34.816-61.952 18.944 0 22.016 17.92 10.752 72.192-5.12 26.624-10.752 57.344-12.288 68.608l-3.072 20.48 244.736-1.024c165.888-0.512 248.32 1.024 256.512 5.12l11.264 5.12v362.496c0 353.28 0 363.008-9.728 368.128-6.656 3.584-173.568 5.12-504.32 5.12-442.368 0-494.592-1.024-501.76-8.192zM976.896 530.944l-1.536-326.144h-474.112l-3.072 18.944c-1.536 10.752-2.56 20.992-2.048 23.040 0 2.56 12.8 4.096 28.672 4.608 15.36 0.512 34.304 3.584 43.008 7.168 19.456 8.192 144.896 158.208 151.040 181.248 6.144 22.528 0.512 42.496-16.896 59.904-18.432 18.432-37.376 23.040-62.464 15.36-15.872-4.608-28.16-15.872-59.392-53.248-21.504-26.112-45.568-54.784-53.76-64.512l-15.36-17.408-131.072-0.512c-123.904-0.512-133.12-1.536-154.624-11.776-43.008-20.48-58.368-40.96-86.016-112.128l-19.456-50.176h-35.328l-35.84-0.512-1.024 326.144-1.536 325.632h931.84l-1.024-325.632zM407.040 766.464c-25.088-2.56-35.84-23.552-19.968-38.912 6.656-7.168 29.184-8.192 168.448-8.192h161.28l7.68 12.288c9.728 14.336 5.632 27.648-9.728 31.232-12.288 3.072-284.16 6.144-307.712 3.584zM533.504 641.536c-7.68-7.68-7.68-26.112 0-33.792 8.704-8.704 393.728-8.704 402.432 0 7.68 7.68 7.68 26.112 0 33.792-8.704 8.704-393.728 8.704-402.432 0zM335.36 621.568c-26.624-6.144-40.448-13.312-57.344-31.232-69.12-72.192-21.504-185.344 77.824-185.344 69.12 0 119.296 60.416 107.52 130.048-4.096 24.576-29.184 59.392-51.712 72.704-20.48 11.776-56.832 18.432-76.288 13.824zM399.872 556.544c37.888-42.496 11.264-105.984-44.032-104.96-26.624 0-41.472 8.192-53.76 28.672-17.92 29.184-9.216 69.12 19.456 87.040 22.016 14.336 60.416 9.216 78.336-10.752z" />
 <glyph unicode="&#xe643;" glyph-name="recent" d="M728.992 448c137.754 87.334 231.008 255.208 231.008 448 0 21.676-1.192 43.034-3.478 64h-889.042c-2.29-20.968-3.48-42.326-3.48-64 0-192.792 93.254-360.666 231.006-448-137.752-87.334-231.006-255.208-231.006-448 0-21.676 1.19-43.034 3.478-64h889.042c2.288 20.966 3.478 42.324 3.478 64 0.002 192.792-93.252 360.666-231.006 448zM160 0c0 186.912 80.162 345.414 224 397.708v100.586c-143.838 52.29-224 210.792-224 397.706v0h704c0-186.914-80.162-345.416-224-397.706v-100.586c143.838-52.294 224-210.796 224-397.708h-704zM619.626 290.406c-71.654 40.644-75.608 93.368-75.626 125.366v64.228c0 31.994 3.804 84.914 75.744 125.664 38.504 22.364 71.808 56.348 97.048 98.336h-409.582c25.266-42.032 58.612-76.042 97.166-98.406 71.654-40.644 75.606-93.366 75.626-125.366v-64.228c0-31.992-3.804-84.914-75.744-125.664-72.622-42.18-126.738-125.684-143.090-226.336h501.67c-16.364 100.708-70.53 184.248-143.212 226.406z" />
+<glyph unicode="&#xe644;" glyph-name="lock1" d="M443.75 960c-112.928 0-204.813-91.885-204.813-204.813v-204.813h-17.063c-28.16 0-51.188-23.027-51.188-51.188v-512c0-28.16 23.028-51.188 51.188-51.188h580.25c28.16 0 51.188 23.028 51.188 51.188v512c0 28.16-23.028 51.188-51.188 51.188h-17.063v204.813c0 112.928-91.885 204.813-204.813 204.813h-136.5zM443.75 823.437h136.5c37.644 0 68.25-30.608 68.25-68.25v-204.813h-273.063v204.813c0 37.644 30.671 68.25 68.313 68.25zM537.188 500.187h64.563v-526.625h-91.938v403.5c-13.68-10.64-30.914-20.992-51.688-31.125s-40.809-18.476-60.063-25.063l-28.125 69.875c29.387 11.653 58.801 26.635 88.188 44.875 29.893 18.24 56.262 39.735 79.063 64.563z" />
+<glyph unicode="&#xe645;" glyph-name="lock2" d="M443.75 960c-112.928 0-204.813-91.885-204.813-204.813v-204.813h-17.063c-28.16 0-51.188-23.027-51.188-51.188v-512c0-28.16 23.028-51.188 51.188-51.188h580.25c28.16 0 51.188 23.028 51.188 51.188v512c0 28.16-23.028 51.188-51.188 51.188h-17.063v204.813c0 112.928-91.885 204.813-204.813 204.813h-136.5zM443.75 823.437h136.5c37.644 0 68.25-30.608 68.25-68.25v-204.813h-273.063v204.813c0 37.644 30.671 68.25 68.313 68.25zM505.188 512.375c56.24-0.001 97.528-13.46 123.875-40.313 26.853-26.347 40.25-62.519 40.25-108.625 0-18.24-3.775-36.267-11.375-54-7.6-17.227-17.528-34.155-29.688-50.875-11.654-16.214-25.050-32.231-40.25-47.938-15.2-15.2-30.425-30.119-45.625-44.813-8.107-7.6-17.179-16.735-27.313-27.375s-19.755-21.235-28.875-31.875c-9.12-10.64-16.976-21.054-23.563-31.188-6.587-9.627-10.181-17.726-10.688-24.313h234.125v-77.5h-335.188c-0.507 4.053-0.75 8.864-0.75 14.438 0 6.080 0 10.585 0 13.625 0 24.32 3.775 46.671 11.375 66.938 8.107 20.773 18.521 40.017 31.188 57.75s26.856 34.418 42.563 50.125c15.707 15.706 31.418 31.175 47.125 46.375 12.16 11.653 23.791 23.041 34.938 34.188s20.768 22.047 28.875 32.688c8.613 11.146 15.496 22.29 20.563 33.438 5.066 11.653 7.562 23.59 7.563 35.75 0 26.346-7.613 45.040-22.813 56.188s-33.651 16.75-55.438 16.75c-14.187 0-27.403-2.010-39.563-6.063s-23.061-8.865-32.688-14.438c-9.12-5.574-17.219-11.42-24.313-17.5-7.093-5.574-12.391-10.141-15.938-13.688l-45.625 64.625c21.28 20.266 46.127 36.464 74.5 48.625 28.88 12.666 59.817 18.999 92.75 19z" />
+<glyph unicode="&#xe646;" glyph-name="lock3" d="M443.75 960c-112.928 0-204.813-91.885-204.813-204.813v-204.813h-17.063c-28.16 0-51.188-23.027-51.188-51.188v-512c0-28.16 23.028-51.188 51.188-51.188h580.25c28.16 0 51.188 23.028 51.188 51.188v512c0 28.16-23.028 51.188-51.188 51.188h-17.063v204.813c0 112.928-91.885 204.813-204.813 204.813h-136.5zM443.75 823.437h136.5c37.644 0 68.25-30.608 68.25-68.25v-204.813h-273.063v204.813c0 37.644 30.671 68.25 68.313 68.25zM492.313 512.375c29.386-0.001 54.72-3.532 76-10.625s38.757-17.265 52.438-30.438c14.186-12.667 24.6-27.83 31.188-45.563 7.093-17.227 10.625-36.227 10.625-57 0-24.32-6.82-46.122-20.5-65.375-13.174-19.254-30.408-33.929-51.688-44.063 27.36-9.627 49.891-25.582 67.625-47.875 18.24-22.294 27.375-50.915 27.375-85.875 0-23.307-4.081-45.108-12.188-65.375-8.107-19.76-20.53-36.994-37.25-51.688-16.72-14.187-37.973-25.574-63.813-34.188-25.334-8.107-55.721-12.187-91.188-12.188-13.68 0-27.869 1.036-42.563 3.063-14.187 1.52-27.889 3.773-41.063 6.813-12.667 2.533-24.298 5.335-34.938 8.375-10.64 3.547-18.739 6.835-24.313 9.875l18.188 78.313c10.64-5.067 26.108-10.913 46.375-17.5 20.267-6.080 45.357-9.125 75.25-9.125 40.026 0 68.891 7.612 86.625 22.813 17.733 15.707 26.625 36.472 26.625 62.313 0 16.72-3.532 30.666-10.625 41.813-6.587 11.146-15.965 19.976-28.125 26.563-11.654 7.093-25.356 11.904-41.063 14.438-15.2 3.040-31.399 4.562-48.625 4.563h-31.188v74.5h38c11.653 0 23.346 1.036 35 3.063 12.16 2.533 23.061 6.551 32.688 12.125 9.626 6.080 17.482 13.935 23.563 23.563s9.062 22.050 9.063 37.25c0 12.16-2.253 22.511-6.813 31.125s-10.65 15.739-18.25 21.313c-7.094 5.573-15.436 9.654-25.063 12.188s-19.798 3.75-30.438 3.75c-22.8 0-43.017-3.532-60.75-10.625-17.733-6.587-33.445-14.2-47.125-22.813l-33.438 68.438c7.093 4.56 15.679 9.37 25.813 14.438 10.133 5.066 21.277 9.877 33.438 14.438 12.667 4.559 26.126 8.091 40.313 10.625 14.187 3.039 29.106 4.562 44.813 4.563z" />
+<glyph unicode="&#xe647;" glyph-name="lock4" d="M443.75 960c-112.928 0-204.813-91.885-204.813-204.813v-204.813h-17.063c-28.16 0-51.188-23.027-51.188-51.188v-512c0-28.16 23.028-51.188 51.188-51.188h580.25c28.16 0 51.188 23.028 51.188 51.188v512c0 28.16-23.028 51.188-51.188 51.188h-17.063v204.813c0 112.928-91.885 204.813-204.813 204.813h-136.5zM443.75 823.437h136.5c37.644 0 68.25-30.608 68.25-68.25v-204.813h-273.063v204.813c0 37.644 30.671 68.25 68.313 68.25zM559.938 500.187h87.438v-325.25h59.25v-75.25h-59.25v-126.125h-89.688v126.125h-231.063v65.375c10.133 22.293 23.592 47.87 40.313 76.75 17.227 28.88 36.227 58.537 57 88.938s42.818 60.3 66.125 89.688c23.306 29.386 46.568 55.936 69.875 79.75zM557.688 387c-12.16-14.694-24.827-30.405-38-47.125-12.667-16.72-25.090-34.198-37.25-52.438s-23.791-36.997-34.938-56.25c-11.147-18.747-21.318-37.504-30.438-56.25h140.625v212.063z" />
+<glyph unicode="&#xe648;" glyph-name="lock5" d="M443.75 960c-112.928 0-204.813-91.885-204.813-204.813v-204.813h-17.063c-28.16 0-51.188-23.027-51.188-51.188v-512c0-28.16 23.028-51.188 51.188-51.188h580.25c28.16 0 51.188 23.028 51.188 51.188v512c0 28.16-23.028 51.188-51.188 51.188h-17.063v204.813c0 112.928-91.885 204.813-204.813 204.813h-136.5zM443.75 823.437h136.5c37.644 0 68.25-30.608 68.25-68.25v-204.813h-273.063v204.813c0 37.644 30.671 68.25 68.313 68.25zM398.063 500.187h269.063v-77.5h-190.75c-0.507-8.614-1.299-18.479-2.313-29.625-0.507-10.64-1.237-21.541-2.25-32.688-0.507-11.147-1.299-21.805-2.313-31.938s-1.987-18.72-3-25.813c74.986-4.054 130.221-21.288 165.688-51.688 35.973-29.894 53.937-70.939 53.938-123.125 0-23.813-4.081-45.858-12.188-66.125s-20.468-37.744-37.188-52.438c-16.72-14.693-37.792-26.324-63.125-34.938-25.334-8.107-54.929-12.187-88.875-12.188-13.68 0-27.626 1.036-41.813 3.063s-27.889 4.523-41.063 7.563c-12.667 2.533-24.054 5.335-34.188 8.375s-17.746 5.842-22.813 8.375l17.5 77.5c10.64-5.067 25.802-10.608 45.563-16.688 20.267-5.573 44.87-8.375 73.75-8.375 19.76 0 36.751 2.009 50.938 6.063 14.186 4.56 25.574 10.65 34.188 18.25 9.12 7.6 15.696 16.186 19.75 25.813 4.053 10.133 6.062 20.791 6.063 31.938 0 16.72-3.289 31.701-9.875 44.875s-18.218 24.317-34.938 33.438c-16.214 9.12-38.259 15.94-66.125 20.5-27.36 4.56-62.072 6.812-104.125 6.813 5.573 48.64 9.897 94.801 12.938 138.375 3.040 44.080 5.536 88.107 7.563 132.188z" />
 </font></defs></svg>
\ Pas de fin de ligne à la fin du fichier
Les fichiers binaires /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonts/icomoon.ttf et /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonts/icomoon.ttf sont différents
Les fichiers binaires /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonts/icomoon.woff et /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/fonts/icomoon.woff sont différents
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/groupes.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/groupes.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/groupes.php	2015-10-02 11:01:40.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/groupes.php	2015-10-27 14:26:00.370565981 +0100
@@ -49,10 +49,7 @@
   <a class="icon-ajoute general" data-id="ajoute" title="Ajouter un groupe d'élève"></a>
 
 FIN;
-$select_mailnotes = '
-        <option value="1">envoi de mail</option>
-        <option value="2">notes de colles</option>
-        <option value="3">mails et notes</option>';
+$select_mailnotes = '<option value="1">envoi de courriels</option><option value="2">notes de colles</option><option value="3">courriels et notes</option>';
 
 // Récupération
 $resultat = $mysqli->query('SELECT id, nom, mailnotes, eleves FROM groupes');
@@ -62,22 +59,21 @@
     $sel_mailnotes = str_replace("\"${r['mailnotes']}\"","\"${r['mailnotes']}\" selected",$select_mailnotes);
     echo <<<FIN
 
-<article data-id="groupes|${r['id']}">
-  <a class="icon-supprime" title="Supprimer ce groupe"></a>
-  <h3 class="edition">Groupe <span class="editable" data-id="groupes|nom|${r['id']}">${r['nom']}</span></h3>
-  <p class="ligne"><label for="mailnotes${r['id']}">Utilisation&nbsp;: </label>
-    <select id="mailnotes${r['id']}" name="mailnotes">$sel_mailnotes
-    </select>
-  </p>
-  <p class="ligne usergrp"><a class="icon-edite" data-uid="${r['eleves']}"></a><label>Élèves&nbsp;:</label> <span>$e</span></p>
-</article>
+  <article data-id="groupes|${r['id']}">
+    <a class="icon-supprime" title="Supprimer ce groupe"></a>
+    <h3 class="edition">Groupe <span class="editable" data-id="groupes|nom|${r['id']}">${r['nom']}</span></h3>
+    <p class="ligne"><label for="mailnotes${r['id']}">Utilisation&nbsp;: </label>
+      <select id="mailnotes${r['id']}" name="mailnotes">$sel_mailnotes</select>
+    </p>
+    <p class="ligne usergrp"><a class="icon-edite" data-uid="${r['eleves']}"></a><label>Élèves&nbsp;:</label> <span>$e</span></p>
+  </article>
 
 FIN;
   }
   $resultat->free();
 }
 else
-  echo "  <article><h2>Aucun groupe n'est enregistré.</h2></article>\n\n";
+  echo "\n  <article>\n    <h2>Aucun groupe n'est enregistré.</h2>\n  </article>\n";
 
 // Aide et formulaire d'ajout
 ?>
@@ -92,8 +88,7 @@
     <div>
       <input type="input" class="ligne" name="nom" value="" size="50" data-placeholder="Nom du groupe (Ex: 1, A, LV2 Espagnol...)">
       <p class="ligne"><label for="mailnotes">Utilisation&nbsp;: </label>
-        <select id="mailnotes" name="mailnotes"><?php echo str_replace("\"3\"","\"3\" selected",$select_mailnotes); ?>
-        </select>
+        <select id="mailnotes" name="mailnotes"><?php echo str_replace("\"3\"","\"3\" selected",$select_mailnotes); ?></select>
       </p>
       <p class="ligne usergrp"><a class="icon-edite" data-uid=""></a><label>Élèves&nbsp;:</label> <span>[Aucun]</span></p>
       <input type="hidden" name="eleves" value="">
@@ -105,15 +100,15 @@
     <h3>Aide et explications</h3>
     <p>Il est possible ici d'ajouter et de modifier des groupes d'élèves. Ces groupes peuvent être utilisés à deux endroits&nbsp;:</p>
     <ul>
-      <li>l'envoi de mails, par les professeurs et colleurs</li>
+      <li>l'envoi de courriels, par les professeurs et colleurs</li>
       <li>la saisie de notes de colles, par les professeurs et colleurs</li>
     </ul>
-    <p>Les groupes d'élèves ne se limitent pas obligatoirement qu'aux groupes de colles&nbsp;: il peut être notamment intéressant de créer les deux demi-groupes de la classe ou les groupes de LV2 par exemple, pour envoyer des mails à la seule partie concernée de la classe.</p>
+    <p>Les groupes d'élèves ne se limitent pas obligatoirement qu'aux groupes de colles&nbsp;: il peut être notamment intéressant de créer les deux demi-groupes de la classe ou les groupes de LV2 par exemple, pour envoyer des courriels à la seule partie concernée de la classe.</p>
     <p>Chaque élève peut participer à plusieurs groupes. Un groupe peut contenir autant d'élèves que possible, sans limitation sur les matières associées à chaque élève.</p>
-    <p>Chaque groupe existant peut être supprimé en cliquant sur le bouton <span class="icon-supprime"></span>. Cela ne supprime pas les comptes des élèves du groupe.</p>
+    <p>Chaque groupe existant peut être supprimé en cliquant sur le bouton <span class="icon-supprime"></span> (une confirmation sera demandée). Cela ne supprime pas les comptes des élèves du groupe.</p>
     <h4>Préférences associées à chaque groupe</h4>
     <p>Le nom du groupe est modifiable en cliquant sur le bouton <span class="icon-edite"></span> à côté. Il peut s'agir d'un simple numéro (1,2,3...) pour des groupes de colles, d'une lettre ou d'un mot pour des demi-groupes par exemple (A et B, impairs et pairs...), ou encore d'un nom plus long (&laquo;&nbsp;LV2 Espagnol&nbsp;&raquo;).</p>
-    <p>Le choix de l'<em>utilisation</em> permet de spécifier si le groupe sera visible uniquement pour l'envoi des mail, uniquement pour la saisie des notes de colles, ou dans les deux cas. La modification est enregistrée immédiatement (pas de validation nécessaire).</p>
+    <p>Le choix de l'<em>utilisation</em> permet de spécifier si le groupe sera visible uniquement pour l'envoi des courriels, uniquement pour la saisie des notes de colles, ou dans les deux cas. La modification est enregistrée immédiatement (pas de validation nécessaire).</p>
     <p>La liste des élèves donnée est modifiable en cliquant sur le bouton <span class="icon-edite"></span> à côté. Une nouvelle fenêtre permet alors de cocher ou décocher les élèves, en cliquant sur les cases ou sur les noms des élèves. La modification est enregistrée immédiatement (pas de validation nécessaire). Un élève au minimum est obligatoire.</p>
     <h4>Ordre des groupes</h4>
     <p>Les groupes sont automatiquement classés par ordre alphanumérique.</p>
@@ -122,19 +117,16 @@
   <div id="aide-ajoute">
     <h3>Aide et explications</h3>
     <p>Ce formulaire permet de créer un nouveau groupe. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
-    <p>Les groupes d'élèves ne se limitent pas obligatoirement qu'aux groupes de colles&nbsp;: il peut être notamment intéressant de créer les deux demi-groupes de la classe ou les groupes de LV2 par exemple, pour envoyer des mails à la seule partie concernée de la classe.</p>
+    <p>Les groupes d'élèves ne se limitent pas obligatoirement qu'aux groupes de colles&nbsp;: il peut être notamment intéressant de créer les deux demi-groupes de la classe ou les groupes de LV2 par exemple, pour envoyer des courriels à la seule partie concernée de la classe.</p>
     <p>Chaque élève peut participer à plusieurs groupes. Un groupe peut contenir autant d'élèves que possible, sans limitation sur les matières associées à chaque élève.</p>
-    <p>Chaque groupe existant peut être supprimé en cliquant sur le bouton <span class="icon-supprime"></span>. Cela ne supprime pas les comptes des élèves du groupe.</p>
+    <p>Les groupes sont automatiquement classés par ordre alphanumérique.</p>
     <h4>Préférence du groupe</h4>
     <p>Le <em>nom du groupe</em> est ce qui apparaîtra derrière la mention &laquo;&nbsp;Groupe&nbsp;&raquo;. Il peut s'agir d'un simple numéro (1,2,3...) pour des groupes de colles, d'une lettre ou d'un mot pour des demi-groupes par exemple (A et B, impairs et pairs...), ou encore d'un nom plus long (&laquo;&nbsp;LV2 Espagnol&nbsp;&raquo;).</p>
-    <p>Le choix de l'<em>utilisation</em> permet de spécifier si le groupe sera visible uniquement pour l'envoi des mail, uniquement pour la saisie des notes de colles, ou dans les deux cas. La modification est enregistrée immédiatement (pas de validation nécessaire).</p>
+    <p>Le choix de l'<em>utilisation</em> permet de spécifier si le groupe sera visible uniquement pour l'envoi des courriels, uniquement pour la saisie des notes de colles, ou dans les deux cas. La modification est enregistrée immédiatement (pas de validation nécessaire).</p>
     <p>La liste des élèves est à définir en cliquant sur le bouton <span class="icon-edite"></span> à côté. Une nouvelle fenêtre permet alors de cocher ou décocher les élèves, en cliquant sur les cases ou sur les noms des élèves. Un élève au minimum est obligatoire.</p>
-    <h4>Ordre des groupes</h4>
-    <p>Les groupes sont automatiquement classés par ordre alphanumérique.</p>
   </div>
   
   <p id="log"></p>
-  
 <?php
 
 $mysqli->close();
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/index.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/index.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/index.php	2015-09-28 00:27:08.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/index.php	2015-10-27 18:16:03.279877757 +0100
@@ -28,6 +28,11 @@
 }
 // Page par défaut : la première
 if ( !isset($page) )  {
+  // Si pas de page : installation nécessaire
+  if ( !$resultat )  {
+    include('installation.php');
+    exit();
+  }
   $resultat->data_seek(0);
   $page = $resultat->fetch_assoc();
 }
@@ -57,7 +62,7 @@
 //////////////
 //// HTML ////
 //////////////
-debut($mysqli,$page['titre'],$message,$autorisation,".?${page['cle']}",( $page['mat'] ) ? $page['mat'] : false);
+debut($mysqli,$page['titre']. ( ( $edition && $page['protection'] ) ? "<span class=\"icon-lock${page['protection']}\"></span>" : '' ),$message,$autorisation,".?${page['cle']}",( $page['mat'] ) ? $page['mat'] : false);
 
 // MathJax désactivé par défaut
 $mathjax = false;
@@ -177,7 +182,7 @@
   <div id="aide-page">
     <h3>Aide et explications</h3>
     <p>Il est possible ici d'ajouter une information, de modifier les informations existantes ou de modifier les préférences de la page.</p>
-    <p>Pour déplacer cette page d'information, la supprimer, la vider de son contenu ou en créer d'autres, il faut aller à la <a href="pages">Gestion des pages</a>.</p>
+    <p>Pour déplacer cette page d'information, la supprimer, la vider de son contenu ou en créer d'autres, il faut aller à la <a href="pages">gestion des pages</a>.</p>
     <p>Les informations dans chaque zone indiquée par des pointillés sont modifiables individuellement, en cliquant sur les boutons <span class="icon-edite"></span> et en validant avec le bouton <span class="icon-ok"></span> qui apparaît alors.</p>
     <p>Les deux boutons généraux permettent de&nbsp;:</p>
     <ul>
@@ -187,30 +192,32 @@
     <h4>Préférences associées à cette page</h4>
     <p>Concernant cette page, vous pouvez modifier&nbsp;:</p>
     <ul>
-      <li>le <em>titre</em> qui sera affiché en haut de page et dans la barre de titre du navigateur. Par exemple, «&nbsp;À propos de l'ADS et du TIPE&nbsp;».</li>
-      <li>le <em>nom dans le menu</em> qui est affiché dans le menu en tant que lien vers la page. Il est préférable qu'il rentre sur une ligne, il faut donc le choisir assez court. Par exemple, «&nbsp;Informations ADS/TIPE&nbsp;».</li>
-      <li>la <em>clé dans l'adresse</em> qui est un mot-clé qui est utilisé uniquement dans l'adresse de la page. Par convention, il vaut mieux que ce soit un mot unique, court et sans majuscule. Par exemple, «&nbsp;ads-tipe&nbsp;». La clé doit obligatoirement être unique (deux pages ne peuvent pas avoir la même clé).</li>
-      <li>le <em>texte de début</em>, qui sera affiché au-dessus des informations de la page. Il s'agit d'une ou deux phrases maximum. Il n'est affiché que si la page contient des informations. Cette case peut être laissée vide.</li>
-      <li>l'<em>accès</em> à la page. Il peut être choisi parmi quatre possibilités&nbsp;:
-        <ul>
-          <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
-          <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (compte invité, compte élève, compte colleur ou compte professeur).</li>
-          <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur. Il faut donc avoir un compte personnel validé (voir l'aide de la page <a href="utilisateurs">Utilisateurs</a>) pour y accéder.</li>
-          <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur.</li>
-          <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur (vous et vos collègues).</li>
-          <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont la page peut dépendre). La différence avec le choix précédent est que cette page n'apparaît plus du tout dans le menu pour les "non-professeurs".</li>
-        </ul>
-        <p>Quel que soit ce choix, le lien dans le menu de la partie publique apparaîtra pour tout visiteur (identifié ou non).</p>
-      </li>
+      <li>le <em>titre</em> qui sera affiché en haut de page et dans la barre de titre du navigateur. Par exemple, «&nbsp;À propos du TIPE&nbsp;».</li>
+      <li>le <em>nom dans le menu</em> qui est affiché dans le menu en tant que lien vers la page. Il est préférable qu'il rentre sur une ligne, il faut donc le choisir assez court. Par exemple, «&nbsp;Informations TIPE&nbsp;».</li>
+      <li>la <em>clé dans l'adresse</em> qui est un mot-clé utilisé uniquement dans l'adresse de la page. Par convention, il vaut mieux que ce soit un mot unique, court et sans majuscule. Par exemple, «&nbsp;tipe&nbsp;». La clé doit obligatoirement être unique (deux pages ne peuvent pas avoir la même clé).</li>
+      <li>l'<em>accès</em> à la page (voir ci-dessous).</li>
+      <li>le <em>texte de début</em> qui sera affiché au-dessus des informations de la page. Il s'agit d'une ou deux phrases maximum. Il n'est affiché que si la page contient des informations. Cette case peut être laissée vide.</li>
+    </ul>
+    <p>L'<em>accès</em> à chaque page peut être choisi parmi six possibilités&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont la page peut dépendre). La différence avec le choix précédent est que cette page n'apparaît plus du tout dans le menu pour ceux qui ne la voient pas.</li>
     </ul>
-    <p>Il est aussi possible de modifier sur la page de gestion des <a href="pages">Pages</a> la matière associée à la page. Une page sans matière apparaît en haut du menu, une page avec matière associée apparaît dans le menu au niveau de la matière. Elle n'est alors visible que par les utilisateurs associés à la matière, éditable que par les professeurs associés à la matière. Pour modifier les matières qui vous sont associées, il faut aller sur la page de gestion des <a href="matieres">Matières</a>.</p>
+    <p>Hormis le dernier choix, le lien dans le menu apparaîtra pour tout visiteur (identifié ou non). Le niveau de protection est indiqué dans le titre par une icône de type <span class="icon-lock1"></span> où le numéro correspond au niveau de protection.</p>
+    <p>Les comptes utilisateurs sont à définir ou modifier sur la page de <a href="utilisateurs">gestion des utilisateurs</a>. Les associations avec les matières sont modifiables sur la page de <a href="matieres">gestion des matières</a>.</p>
+    <h4>Autres modifications de la page</h4>
+    <p>Il est aussi possible de modifier, sur la page de <a href="pages">gestion des pages</a>, la matière associée à la page. Une page sans matière apparaît en haut du menu, une page avec matière associée apparaît dans le menu au niveau de la matière. Elle n'est alors visible que par les utilisateurs associés à la matière, modifiable que par les professeurs associés à la matière. Pour modifier les matières qui vous sont associées, il faut aller sur la page de <a href="matieres">gestion des matières</a>.</p>
+    <p>Il est aussi possible de supprimer toutes les informations d'une page (sans supprimer la page elle-même), ou de supprimer la page elle-même, sur la page de <a href="pages">gestion des pages</a>.</p>
   </div>
 
   <div id="aide-information">
     <h3>Aide et explications</h3>
     <p>Le titre et le texte de chaque information sont modifiables séparément, en cliquant sur le bouton <span class="icon-edite"></span> correspondant. Chaque contenu éditable est indiqué par une bordure en pointillés.</p>
     <p>Une fois le texte édité, il est validé en appuyant sur Entrée dans le cas des titres ou sur le bouton <span class="icon-ok"></span>. Au contraire, un clic sur le bouton <span class="icon-annule"></span> annule l'édition.</p>
-    <p>Si la connexion est inactive depuis longtemps, une identification sera à nouveau nécessaire.</p>
     <p>Le titre d'une information peut rester vide.</p>
     <p>D'autres modifications sont possibles à l'aide des boutons disponibles pour chaque information&nbsp;:</p>
     <ul>
@@ -242,21 +249,21 @@
       <li>le <em>texte de début</em>, qui sera affiché au-dessus des informations de la page. Il s'agit d'une ou deux phrases maximum. Il n'est affiché que si la page contient des informations. Cette case peut être laissée vide.</li>
       <li>l'<em>accès</em> à la page (voir ci-dessous).</li>
     </ul>
-    <p>Il est aussi possible de modifier sur la <a href="pages">Gestion des pages</a> la matière associée à la page. Une page sans matière apparaît en haut du menu, une page avec matière associée apparaît dans le menu au niveau de la matière. Elle n'est alors visible que par les utilisateurs associés à la matière, éditable que par les professeurs associés à la matière. Pour modifier les matières qui vous sont associées, il faut aller dans vos <a href="prefs">Préférences</a>.</p>
-    <p>L'<em>accès</em> à cette page peut être choisi parmi quatre possibilités&nbsp;:</p>
+    <p>Il est aussi possible de modifier sur la page de <a href="pages">gestion des pages</a> la matière associée à la page. Une page sans matière apparaît en haut du menu, une page avec matière associée apparaît dans le menu au niveau de la matière. Elle n'est alors visible que par les utilisateurs associés à la matière, modifiable que par les professeurs associés à la matière. Pour modifier les matières qui vous sont associées, il faut aller sur la page de <a href="matieres">gestion des matières</a>.</p>
+    <p>L'<em>accès</em> à cette page peut être choisi parmi six possibilités&nbsp;:</p>
     <ul>
       <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
-      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (compte invité, compte élève, compte colleur ou compte professeur).</li>
-      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur. Il faut donc avoir un compte personnel validé (voir l'aide de la page <a href="utilisateurs">Utilisateurs</a>) pour y accéder.</li>
-      <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur.</li>
-      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur (vous et vos collègues).</li>
-      <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont la page peut dépendre). La différence avec le choix précédent est que cette page n'apparaît plus du tout dans le menu pour les "non-professeurs".</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont la page peut dépendre). La différence avec le choix précédent est que cette page n'apparaît plus du tout dans le menu pour ceux qui ne la voient pas.</li>
     </ul>
-    <p>Quel que soit ce choix, le lien dans le menu de la partie publique apparaîtra pour tout visiteur (identifié ou non).</p>
+    <p>Hormis le dernier choix, le lien dans le menu apparaîtra pour tout visiteur (identifié ou non). Le niveau de protection est indiqué dans le titre par une icône de type <span class="icon-lock1"></span> où le numéro correspond au niveau de protection.</p>
+    <p>Les comptes utilisateurs sont à définir ou modifier sur la page de <a href="utilisateurs">gestion des utilisateurs</a>. Les associations avec les matières sont modifiables sur la page de <a href="matieres">gestion des matières</a>.</p>
   </div>
 
   <p id="log"></p>
-  
 <?php
 }
 
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/installation.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/installation.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/installation.php	1970-01-01 01:00:00.000000000 +0100
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/installation.php	2015-10-28 00:27:28.094145602 +0100
@@ -0,0 +1,326 @@
+<?php
+// Script d'installation de Cahier de Prépa
+// Aide à l'installation et à la configuration
+// Vérifie l'existence de la base de données et des répertoires
+
+// Headers HTML
+$header = <<<FIN
+<!doctype html>
+<html lang="fr">
+<head>
+  <title>Cahier de Prépa&nbsp;: installation</title>
+  <meta charset="utf-8">
+  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
+  <link rel="stylesheet" href="css/style-min.css">
+  <link rel="stylesheet" href="css/icones-min.css">
+  <script type="text/javascript" src="js/jquery.min.js"></script>
+  <!--[if lte IE 8]><script src="js/html5shiv.min.js"></script><![endif]--> 
+  <!--[if lte IE 8]><script src="js/respond.min.js"></script><![endif]-->
+  <style>
+    p.ligne { padding: 0 2%; }
+    .warning { margin: 0 auto; }
+    .general { font-size:1.7em; top:-2.8em; }
+    .ok, .nok { padding: 1em 2%; }
+  </style>
+</head>
+<body>
+<header><h1>Cahier de Prépa&nbsp;: installation</h1></header>
+<section>
+
+FIN;
+$footer = <<<FIN
+
+</section>
+</body>
+</html>
+FIN;
+
+// Recharge de la page si elle est lancée par un autre script (donc config.php déjà appelé)
+if ( defined('OK') )  {
+  // Si $site est vide : config.php n'a pas été modifié correctement
+  if ( !strlen($site) )
+    exit($header.'<h3 class="warning">Le fichier de configuration n\'existe pas, n\'est pas lisible ou est mal rempli.</h3><article><p>Il doit s\'appeler <code>config.php</code>, se trouver au même endroit que l\'ensemble des fichiers constituant le site et être lisible par l\'utilisateur d\'Apache (<code>'.`whoami | tr -d '\n'`.'</code>).</p><p>Vous devez l\'éditer pour y mettre les bonnes valeurs.</p></article>'.$footer);
+  header('Location: http'.($https?'s':'')."://$site/installation");
+  exit();
+}
+
+///////////////////////////////
+// Première vérifications, bloquantes : le fichier de configuration est ok
+///////////////////////////////
+if ( file_exists('config.php') && is_readable('config.php') )
+  include('config.php');
+else
+  exit($header.'<h3 class="warning">Le fichier de configuration n\'existe pas ou n\'est pas lisible.</h3><article><p>Il doit s\'appeler config.php, se trouver au même endroit que l\'ensemble des fichiers constituant le site et être lisible par l\'utilisateur d\'Apache (<code>'.`whoami | tr -d '\n'`.'</code>).</p></article>'.$footer);
+// Vérification des données du fichier de configuration
+if ( !isset($site) || !isset($https) || !isset($serveur) || !isset($base) || !isset($mdp) )
+  exit($header.'<h3 class="warning">Le fichier de configuration est incomplet.</h3><article><p>Il manque des données nécessaire au fonctionnement du site dans le fichier <code>config.php</code>. Il faut l\'éditer et le modifier manuellement.</p></article>'.$footer);
+if ( strlen($base) > 12 )
+  exit($header.'<h3 class="warning">Le nom de la base de données est trop long.</h3><article><p>Le nom de la base de données ne doit pas être supérieur à 12 caractères. Il faut corriger manuellement cela dans le fichier de configuration  <code>config.php</code>.</p></article>'.$footer);
+
+///////////////////////////////
+// Connexion obligatoire à partir d'ici, en entrant le mot de passe du fichier de configuration
+///////////////////////////////
+session_name(md5("$site-install"));
+session_set_cookie_params(0,strchr($site,'/').'/',str_replace(strchr($site,'/'),'',$site));
+session_start();
+if ( isset($_REQUEST['motdepasse']) && ( $_REQUEST['motdepasse'] == $mdp ) )  {
+  // Interdiction de garder son identifiant de session
+  session_regenerate_id(true);
+  $_SESSION = array();
+  // Pour vérification aux connexions ultérieures
+  $_SESSION[md5("$site")] = true;
+  $_SESSION['client'] = $_SERVER['HTTP_USER_AGENT'];
+  $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
+  $_SESSION['time'] = time()+600;
+}
+elseif ( !isset($_SESSION[md5("$site")]) || ( $_SESSION['time'] < time() ) || isset($_REQUEST['deconnexion']) || ( $_SESSION['client'] != $_SERVER['HTTP_USER_AGENT'] ) || ( $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'] ) )  {
+  // Suppression du cookie et des données de session
+  $_SESSION = array();
+  setcookie(session_name(),'',time()-3600);
+  session_regenerate_id(true);
+  echo <<<FIN
+$header
+  <article>
+    <h3>Bienvenue sur <a href="http://cahier-de-prepa.fr">Cahier de Prépa</a> et merci d'essayer ce gestionnaire de site&nbsp;!</h3>
+    <p><a href="http://cahier-de-prepa.fr">Cahier de Prépa</a> est un gestionnaire de sites web pour la communication des professeurs vers leurs élèves de CPGE. Il permet de&nbsp;:</p>
+    <ul>
+      <li>Donner aux élèves un lien unique regroupant les informations de toutes les matières</li>
+      <li>Faire passer des informations de façon rapide (changement d'horaires, erratum de polycopié, petites choses oubliées...)</li>
+      <li>Disposer d'informations de façon un peu plus pérenne, sur un nombre de pages sans limite, pages associées à une matière ou non</li>
+      <li>Annoncer les programmes de colles (pour les élèves et les colleurs)</li>
+      <li>Tenir à jour le cahier de texte numérique</li>
+      <li>Mettre à disposition des documents, distribués ou non</li>
+      <li>Saisir les notes de colles (colleurs), Consulter ses notes de colles (élèves), Consulter la synthèse des notes de colles (professeurs)</li>
+      <li>Envoyer (professeurs et colleurs) des mails à l'ensemble des élèves/colleurs/professeurs ou à certains seulement</li>
+      <li>Restreindre l'accès de façon sure aux élèves ou aux colleurs, et indépendamment pour chaque ressource et chaque matière</li>
+      <li>Obtenir rapidement les nouveaux contenus du site, sur chaque page ou par flux RSS</li>
+      <li>Ajouter des formules en LaTeX directement sur le site</li>
+    </ul>
+  </article>
+
+  <article>
+    <a class="icon-ok" onclick="$('form').submit();" title="Envoyer le mot de passe"></a>
+    <form action="" method="post">
+      <p>Pour commencer l'installation, vous devez saisir ci-dessous <strong>le mot de passe contenu dans le fichier de configuration</strong>&nbsp;:</p>
+      <p><input class="ligne" type="password" name="motdepasse"></p>
+    </form>
+  </article>
+
+FIN;
+  exit($footer);
+}
+// Tout est ok : session valide pendant 10 minutes
+else
+  $_SESSION['time'] = time()+600;
+
+////////////////////////////
+// Fabrication de la base //
+////////////////////////////
+
+// Vérification de la connexion. Pas de connexion signifie qu'il faut réaliser l'installation
+$mysqli = new mysqli($serveur,$base,$mdp);
+if ( $mysqli->connect_errno || !($mysqli->select_db($base)) )  {
+  $message = '';
+  
+  //////////////////////////////
+  // Récupération des données //
+  //////////////////////////////
+  if ( isset($_REQUEST['mdproot']) )  {
+    // Vérification du mot de passe root
+    $mysqli = new mysqli($serveur,'root',$_REQUEST['mdproot'],'mysql');
+    if ( $mysqli->connect_errno )
+      $message = '<p class="warning">La connexion à la base de données est impossible. Le mot de passe root est certainement incorrect. Erreur MySQL n°'.$mysqli->connect_errno.', «'.$mysqli->connect_error."».</p>\n";
+    else  {
+      // Validation des données
+      $mysqli->set_charset('utf8');
+      $prenom = mb_convert_case(trim($mysqli->real_escape_string($_REQUEST['prenom'])),MB_CASE_TITLE,'UTF-8');
+      $nom = mb_convert_case(trim($mysqli->real_escape_string($_REQUEST['nom'])),MB_CASE_TITLE,'UTF-8');
+      $mail = strtolower(trim($mysqli->real_escape_string($_REQUEST['mail'])));
+      // Login automatiquement généré
+      $login = mb_strtolower(mb_substr($prenom,0,1,'UTF-8').str_replace(' ','_',$nom),'UTF-8');
+      $nom_matiere = trim($mysqli->real_escape_string($_REQUEST['nom_matiere']));
+      $cle_matiere = trim($mysqli->real_escape_string($_REQUEST['cle_matiere']));
+      $titre = trim($mysqli->real_escape_string($_REQUEST['titre']));
+      if ( !strlen($prenom) || !strlen($nom) || !filter_var($mail,FILTER_VALIDATE_EMAIL) || !strlen($nom_matiere) || !strlen($cle_matiere) || !strlen($titre) )
+        $message = "<p class=\"warning\">Toutes les données sont obligatoires. L'adresse mail doit être valide.</p>\n";
+      else  {
+        // Traitement des données
+        // Champs à remplacer : $base, $mdp, $serveur,
+        // $login, $nom, $prenom, $mail, $titre, $cle_matiere, $nom_matiere
+        include('def_sql.php');
+        $mysqli->multi_query($requete);
+        if ( $mysqli->errno )  {
+          $message = '<p class="warning">Quelque chose n\'a pas fonctionné. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error."».</p>\n";
+          $mysqli->close();
+        }
+        else  {
+          $mysqli->close();
+          sleep(1);
+          $mysqli = new mysqli($serveur,$base,$mdp,$base);
+        }
+        if ( $mysqli->connect_errno )
+          $message = '<p class="warning">La requête semble avoir fonctionné, mais la connexion à la base n\'est pas possible. Erreur MySQL n°'.$mysqli->connect_errno.', «'.$mysqli->connect_error."».</p>\n";
+        else  {
+          // Envoi du courriel d'invitation 
+          if ( !isset($mailadmin) )
+            $mailadmin = 'admin@cahier-de-prepa.fr';
+          $lien = ( $https ? 'https' : 'http' )."://$site/connexion?reponseinvitation&mail=$mail&p=".sha1($site.$mdp.$mail);
+          mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Invitation').'?=',
+'Bonjour
+
+Le Cahier de Prépa vient d\'être créé à l\'adresse <http'.($https?'s':'')."://$site>. Vous devez avant toute chose vous rendre à la page qui vous permettra de saisir un mot de passe :
+  $lien
+
+Les mots de passe sont chiffrés avant d'être stockés dans la base de données. Cela signifie que, sauf s'il est trop simple, votre mot de passe sera en complète sécurité : personne ne pourra jamais y avoir accès. Il est quand même dangereux que ce mot de passe soit évident, parce qu'un élève pourrait le deviner en vous voyant de loin le taper par exemple. Un bon mot de passe est un mot de passe d'au moins 8 caractères contenant des lettres, des chiffres et au moins un symbole parmi « ? ; : ! . , - _ ».
+
+Tout ensuite est modifiable. Cahier de Prépa est prévu pour être partagé entre collègues. Seul un professeur déjà connecté peut créer des comptes de professeurs, c'est donc à vous de le faire. Une fois connectés, tous les professeurs ont les mêmes droits. Pour les élèves et colleurs par contre, vous pouvez les inviter à demander une création de compte via l'icône de connexion puis \"Créer un compte\". Il faudra que vous validiez ces demandes dans la page de gestion des utilisateurs.
+
+Par ailleurs, toutes les fonctionnalités sont optionnelles : n'apparaît dans le menu visible des élèves que ce qui n'est pas vide. La matière \"$nom_matiere\" ne sera pas affichée dans ce menu tant qu'il n'y a pas de cahier de texte/programme de colles/documents.
+
+Il y a une aide assez fournie sur chaque page une fois que l'on est connecté en tant que professeur. Bonne navigation sur Cahier de Prépa.
+
+Cordialement,
+--
+L'installateur automatique de votre Cahier de Prépa
+",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
+        }
+      }
+    }
+  }
+
+  ////////////////////////////////////////////
+  // Formulaire de récupération des données //
+  ////////////////////////////////////////////
+  if ( !isset($_REQUEST['mdproot']) || strlen($message) )  {
+    echo <<<FIN
+$header
+  <a class="icon-ok general" onclick="$('form').submit();" title="Envoyer les informations"></a>
+
+  <form action="" method="post">
+  $message
+    <article>
+      <h3>Mot de passe root MySQL</h3>
+      <p>La création des tables de la base de données nécessite les droits d'administrateur sur le serveur. Inscrivez ci-dessous le mot de passe root du serveur <code>MySQL</code>. Ce mot de passe n'est noté ni envoyé nulle part (à part au serveur MySQL défini dans le fichier de configuration).</p>
+      <p class="ligne"><label for="mdproot">Mot de passe root du serveur MySQL&nbsp;: </label><input type="password" name="mdproot" id="mdproot"></p>
+    </article>
+
+    <article>
+      <h3>Création d'un compte professeur</h3>
+      <p>Entrez ci-dessous les coordonnées d'un des professeurs de la classe. Il va recevoir un courriel d'invitation, lui permettant de créer un mot de passe et de terminer la création de son compte. Il pourra, une fois connecté, créer les autres comptes.</p>
+      <p class="ligne"><label for="prenom">Prénom&nbsp;: </label><input type="text" id="prenom" name="prenom" value="" size="50"></p>
+      <p class="ligne"><label for="nom">Nom&nbsp;: </label><input type="text" id="nom" name="nom" value="" size="50"></p>
+      <p class="ligne"><label for="mail">Adresse mail&nbsp;: </label><input type="text" id="mail" name="mail" value="" size="50"></p>
+    </article>
+
+    <article>
+      <h3>Création d'une première matière</h3>
+      <p>Afin de faciliter la première rencontre avec l'interface d'administration, nous allons créer une matière qui sera associée au compte défini ci-dessus. D'autres matières pourront être créées ultérieurement.</p>
+      <ul>
+        <li>Le <em>nom complet</em> s'affichera dans le menu et dans les titres des pages. Mettez une majuscule au début.</li>
+        <li>La <em>clé dans l'adresse</em> est un mot-clé utilisé uniquement dans l'adresse des pages associées à la matière. Il vaut mieux que ce soit un mot unique, court et sans majuscule. Par exemple, «&nbsp;maths&nbsp;», «&nbsp;phys&nbsp;»...</li>
+      </ul>
+      <p class="ligne"><label for="nom_matiere">Nom complet&nbsp;: </label><input type="text" id="nom_matiere" name="nom_matiere" value="" size="50"></p>
+      <p class="ligne"><label for="cle_matiere">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle_matiere" name="cle_matiere" value=""" size="30"></p>
+    </article>
+
+    <article>
+      <h3>Titre du site</h3>
+      <p>Il faut enfin renseigner ici le titre du site, qui sera aussi celui de la page d'accueil. Il sera modifiable par les professeurs après la création. Par exemple&nbsp;: &laquo;&nbsp;La [classe] de [lycée]&nbsp;&raquo;.</p>
+      <p class="ligne"><label for="titre">Titre du site&nbsp;: </label><input type="text" id="titre" name="titre" value="" size="80"></p>
+    </article>
+
+  </form>
+$footer
+FIN;
+  exit();
+  }
+}
+
+/////////////////////////////////////
+// Vérifications de l'installation //
+/////////////////////////////////////
+function affiche($message,$status)  {
+  echo $status ? "\n<p class=\"ok\"><span class=\"icon-ok\"></span>&nbsp;$message</p></div>\n" : "\n<p class=\"nok\"><span class=\"icon-ferme\"></span>&nbsp;$message</p></div>\n";
+}
+
+// Si on est arrivé ici, la base est nécessairement créée.
+echo $header;
+
+// Récupération éventuelle de l'identifiant que l'on vient de créer
+$resultat = $mysqli->query('SELECT login FROM utilisateurs WHERE id = 1 AND LENGTH(mdp) = 1');
+if ( $resultat->num_rows )  {
+  $r = $resultat->fetch_assoc();
+  echo "  <p class=\"warning ok\">L'identifiant du compte professeur créé est ${r['login']} (sans majucule).\n";
+  $resultat->free();
+}
+
+// Installation
+affiche('Ce Cahier de Prépa semble correctement installé. Page d\'accueil&nbsp;: <a href=".">http'.($https?'s':'')."://$site/</a>",true);
+
+// Connexion en lecture
+affiche('Connexion à la base de donnée en lecture',true);
+
+// Connexion en écriture
+$mysqli->close();
+$mysqli = new mysqli($serveur,"$base-adm",$mdp,$base);
+affiche('Connexion à la base de donnée en écriture', !($mysqli->connect_errno));
+if ( !($mysqli->connect_errno) )
+  $mysqli = new mysqli($serveur,$base,$mdp,$base);
+
+// Tables dans la base de données
+$resultat = $mysqli->query('SHOW TABLES');
+$tables = array('cdt','cdt-seances','cdt-types','colles','docs','infos','matieres','notes','pages','recents','reps','semaines','utilisateurs','groupes');
+if ( $resultat->num_rows )  {
+  while ( $r = $resultat->fetch_row() )
+    $tables = array_diff($tables,$r);
+  $resultat->free();
+}
+affiche('Définition des tables',empty($tables));
+
+// La base de données doit contenir au moins un professeur
+$resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE autorisation = 4 LIMIT 1');
+affiche('Présence d\'au moins un utilisateur de type professeur',$resultat->num_rows);
+$resultat->free();
+
+// La base de données doit contenir la page d'identifiant 1
+$resultat = $mysqli->query('SELECT id FROM pages WHERE id = 1');
+affiche('Présence de la page d\'accueil',$resultat->num_rows);
+$resultat->free();
+
+// La base de données doit contenir la page d'identifiant 1
+$resultat = $mysqli->query('SELECT id FROM reps WHERE id = 1');
+affiche('Présence du répertoire Général',$resultat->num_rows);
+$resultat->free();
+
+// La base de données doit contenir 45 semaines en 2015-16
+$resultat = $mysqli->query('SELECT id FROM semaines WHERE debut > \'2015-08-01\' AND debut < \'2016-08-01\'');
+affiche('Définition des semaines',$resultat->num_rows == 45);
+$resultat->free();
+$mysqli->close();
+
+// Vérification du répertoire "documents"
+if ( !is_dir('documents') )
+  affiche('Le répertoire «&nbsp;documents&nbsp;» n\'existe pas à la racine du site web.',false);
+elseif ( !is_readable('documents') || !is_executable('documents') || !is_writable('documents') )
+  affiche('Le répertoire «&nbsp;documents&nbsp;» n\'a pas les bons droits d\'accès. Il doit être accessible en lecture et en écriture. Vous pouvez taper en console&nbsp;:<br>
+  <code>cd '.dirname($_SERVER['SCRIPT_FILENAME']).' && sudo chgrp '.`id -gn | tr -d '\n'`.' documents && sudo chmod g+w documents</code>',false);
+else 
+  affiche('Répertoire «&nbsp;documents&nbsp;» accessible en lecture et écriture',1);
+
+// Vérification du répertoire "sauvegarde"
+if ( !is_dir('sauvegarde') )
+  affiche('Le répertoire «&nbsp;sauvegarde&nbsp;» n\'existe pas à la racine du site web.',false);
+elseif ( !is_readable('sauvegarde') || !is_executable('sauvegarde') || !is_writable('sauvegarde') )
+  affiche('Le répertoire «&nbsp;sauvegarde&nbsp;» n\'a pas les bons droits d\'accès. Il doit être accessible en lecture et en écriture. Vous pouvez taper en console&nbsp;:<br>
+  <code>cd '.dirname($_SERVER['SCRIPT_FILENAME']).' && sudo chgrp '.`id -gn | tr -d '\n'`.' sauvegarde && sudo chmod g+w sauvegarde</code>',false);
+else 
+  affiche('Répertoire «&nbsp;sauvegarde&nbsp;» accessible en lecture et écriture',true);
+
+// Vérification de la quantité de données téléchargeable
+if ( '2M' == ini_get('upload_max_filesize') )
+  affiche('Les documents envoyés ne pourront excéder 2&nbsp;Mo, ce qui est plutôt faible. Il serait bien d\'augmenter cette limite. Plus d\'informations sur la page <a href="http://cahier-de-prepa.fr/technique">technique</a> de cahier-de-prepa.fr.',false);
+else
+  affiche('La taille des documents envoyés peut aller jusqu\'à'.ini_get('upload_max_filesize').'o. Cela est modifiable dans la configuration du serveur web. Plus d\'informations sur la page <a href="http://cahier-de-prepa.fr/technique">technique</a> de cahier-de-prepa.fr.',true);
+
+exit($footer);
+?>
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition.js /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/js/edition.js
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition.js	2015-10-03 23:49:28.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/js/edition.js	2015-10-26 23:34:58.975104306 +0100
@@ -1063,7 +1063,7 @@
   });
   // Insertion
   $('#fenetre a.icon-ok').on("click",function () {
-    if ( $('#t1').is("checked") )
+    if ( $('#t1').is(":checked") )
       insert(el,'$','$',$('#formule').val());
     else
       insert(el,'\\[','\\]',$('#formule').val());
@@ -1366,13 +1366,13 @@
 // Envoi automatique : pour les formulaire déjà présents
 function valide(el) {
   var data = '';
-  // Envoi de mail
+  // Envoi de courriel
   if ( $('#mail').length ) {
     // Pas d'envoi si pas de destinataire ou si sujet vide
     if ( $('.editabledest').children('span').text() == '[Personne]' )
-      affiche('Il faut au moins un destinataire pour envoyer le mail.','nok');
+      affiche('Il faut au moins un destinataire pour envoyer le courriel.','nok');
     else if ( !$('[name="sujet"]').val().length )
-      affiche('Il faut un sujet non vide pour envoyer le mail.','nok');
+      affiche('Il faut un sujet non vide pour envoyer le courriel.','nok');
     else
       data = $('#mail').serialize();
   }
@@ -1543,9 +1543,13 @@
   $('#fenetre :checked').prev().addClass('labelchecked');
 }
 
-// Édition des utilisateurs destinataires d'un mail
+// Édition des utilisateurs destinataires d'un courriel
 function utilisateursmail(el) {
   popup($('#form-utilisateurs').html(),true);
+  // Ajout des identifiants pour utilisation des labels
+  $('#fenetre [name="dest[]"]').each( function() {
+    $(this).attr('id','u'+this.value);
+  });
   // Sélection automatique des utilisateurs déjà choisis
   var ids = $('[name="id-copie"]').val().split(',');
   for(var i=0; i<ids.length; i++)
@@ -1604,12 +1608,13 @@
 
 // Édition des notes (on est déjà passé par la fonction formulaire)
 function notes(el)  {
-  // Groupes
-  if ( $('#epingle :checkbox').length )
-    $('#epingle tr[data-id]').hide();
+  // Clic sur les groupes
   $('#epingle :checkbox').on("click", function () {
+    // Récupération des élèves du groupe
     var ids = $('#epingle .grpnote:checked').map(function() { return this.value.split(','); }).get().concat();
-    $('#epingle tr[data-id]').hide();
+    // On cache tous les élèves sauf ceux ayant déjà une note pour l'édition
+    // de notes déjà saisies (lignes repérées par data-orig=true)
+    $('#epingle tr[data-id]:not([data-orig])').hide();
     for (var i=0; i<ids.length; i++)
       $('#epingle tr[data-id="'+ids[i]+'"]').show();
   });
@@ -1619,14 +1624,25 @@
     $(this).find('select').attr('name','e'+$(this).attr('data-id'));
   });
   $('#epingle div').remove();
-  // Modification initiale si provenant de notes à éditer
+  // Modification initiale
+  // On cache tous les élèves a priori s'il y a des groupes
+  if ( $('#epingle :checkbox').length )
+    $('#epingle tr[data-id]').hide();
+  // Si édition de notes, on affiche les notes déjà mises
   if ( el.getAttribute('data-eleves') ) {
+    // Titre et identifiant de la semaine 
     $('#epingle h4').text($(el).parent().children('h3').text());
     $('#epingle [name="id"]').val($(el).parent().attr('data-id').split('|')[1]);
+    // Récupération des élèves et des notes
     var eleves = el.getAttribute('data-eleves').split('|');
     var notes = el.getAttribute('data-notes').split('|');
+    // Modification et affichage. Les lignes sont marquées data-orig=true pour
+    // rester affichées lors du clic sur une checkbox de groupe, mais ce
+    // marquage est supprimé à la première modification de la note
     for (var i=0; i<eleves.length; i++)
-      $('#epingle tr[data-id="'+eleves[i]+'"]').show().find('select').val(notes[i]);
+      $('#epingle tr[data-id="'+eleves[i]+'"]').attr('data-orig',true).show().find('select').val(notes[i]).on('change',function() {
+        $(this).parent().parent().removeAttr('data-orig');
+      });
     // Impossible de modifier les élèves ayant déjà une note
     var dn = dejanotes[$('#epingle [name="id"]').val().split('-')[0]].split(',');
     for (i=0; i<dn.length; i++)
@@ -1656,11 +1672,11 @@
   }
 }
 
-// Envoi des mails
+// Envoi des courriels
 function envoimail(el) {
   // Pas d'envoi si pas de destinataire
   if ( $('.editabledest').children('span').text() == '[Personne]' )
-    affiche('Il faut au moins un destinataire pour envoyer le mail.','nok');
+    affiche('Il faut au moins un destinataire pour envoyer le courriel.','nok');
   else
   $.ajax({url: 'ajax.php',
           method: "post",
@@ -1689,7 +1705,8 @@
     // Donnees : parent,menu,protection
     var donnees = $(el).parent().attr('data-donnees').split('|');
     // Remplissage du formulaire par les données du répertoire
-    var nom = $(el).parent().children('.nom').text().split('/').pop() || $(el).parent().find('input').val();
+    // split(/\/\s/) : regexp = "/"+"espace" ("&nbsp;" passé dans text())
+    var nom = $(el).parent().children('.nom').text().split(/\/\s/).pop() || $(el).parent().find('input').val();
     form.find('em').text(nom);
     if ( donnees[0] == 0 ) {
       form.find('#nom,#parent,#menu').parent().remove();
@@ -1847,7 +1864,7 @@
     utilisateursmail(this);
   });
   
-  // Édition de la préférence de copie de mail
+  // Édition de la préférence de copie de courriel
   $('[name="copie"]').on("change", function() {
     $.ajax({url: 'ajax.php',
             method: "post",
@@ -1909,7 +1926,7 @@
   });
 
   // Validation des formulaires déjà présents (pas pour les transformés)
-  // Aussi utilisé pour l'envoi de mail
+  // Aussi utilisé pour l'envoi de courriel
   $('a.icon-ok').on("click", function() {
     valide(this);
   });
@@ -1927,6 +1944,13 @@
     });
   });
 
+  // Attribut title (infobulle) pour les icônes indiquant le niveau de protection
+  $('.icon-lock1').attr('title','Visible uniquement par les utilisateurs connectés');
+  $('.icon-lock2').attr('title','Visible uniquement par les élèves/colleurs/professeurs connectés');
+  $('.icon-lock3').attr('title','Visible uniquement par les colleurs/professeurs connectés');
+  $('.icon-lock4').attr('title','Visible uniquement par les professeurs connectés');
+  $('.icon-lock5').attr('title','Complètement invisible (hors professeurs de cette matière)');
+
   // Menu pour les petits écrans
   $('.icon-menu').on("click", function() {
     $('#colonne,nav').toggleClass('visible');
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition-min.js /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/js/edition-min.js
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition-min.js	2015-10-22 10:37:40.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/js/edition-min.js	2015-10-26 23:35:17.446784902 +0100
@@ -1 +1 @@
-function affiche(c,a){$("#log").removeClass().addClass(a).html(c).append('<span class="icon-ferme"></span>').show().off("click").on("click",function(){window.clearTimeout(b);$(this).hide(500)});var b=window.setTimeout(function(){$("#log").hide(500)},10000)}function afficher_login(a){$("#fenetre,#fenetre_fond").remove();popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>  <p>Vous avez été automatiquement déconnecté. Vous devez vous connecter à nouveau pour valider vos modifications.</p>  <form>  <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>  <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>  </form>',true);$("#login").focus();$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:$("#fenetre form").serialize()+"&"+a.data,dataType:"json",el:"",fonction:function(){return true}}).success(function(b){if(b.etat=="login_nok"){$("#fenetre > p").html(b.message).addClass("warning")}else{$("#fenetre,#fenetre_fond").remove();if(b.etat=="ok"){a.fonction(a.el)}}})});$("#fenetre a.icon-ferme").on("click",function(){affiche("Modification non effectuée, connexion nécessaire","nok")});$("#fenetre input").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}})}function popup(b,c){$("#fenetre,#fenetre_fond").remove();var a=$('<div id="fenetre"></div>').appendTo("body").html(b).focus();if(c){$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()})}else{$('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(a).on("click",function(){$("#fenetre_fond").remove();$(this).remove();$("section").children("div,article").first().before(a.removeAttr("id"))})}$('<a class="icon-ferme" title="Fermer"></a>').prependTo(a).on("click",function(){a.remove();$("#fenetre_fond").remove()})}$.fn.placeholder=function(){this.each(function(){var a=$(this);if(a.is("div")){a.on("change keyup mouseup",function(){if($(this).text().length){$(this).removeClass("placeholder")}else{$(this).addClass("placeholder")}}).change()}else{$('<span class="placeholder">'+this.getAttribute("data-placeholder")+"</span>").insertBefore(a).on("click",function(){$(this).next().focus()}).hide();a.on("change keyup mouseup",function(){if(!(this.value.length)&&($(this).is(":visible"))){$(this).prev().css("display","inline")}else{$(this).prev().hide()}}).change()}})};$.fn.textareahtml=function(){this.each(function(){var a=$(this);var c=this.getAttribute("data-placeholder");this.setAttribute("data-placeholder",c+". Formattage en HTML, balises visibles.");var b=$('<div contenteditable="true" data-placeholder="'+c+'"></div>').insertAfter(a.before(boutons)).hide();var d=a.prev().children(".icon-retour");a.on("keypress",function(f){if(f.which==13){this.value=nettoie(this.value)}}).on("paste cut",function(){var e=this;setTimeout(function(){e.value=nettoie(e.value)},100)});b.on("keypress",function(f){if(f.which==13){d.click()}}).on("paste cut",function(){var e=this;setTimeout(function(){e.innerHTML=nettoie(e.innerHTML)+"<br>"},100)});a.prev().children(".icon-nosource").on("click",function(h){h.preventDefault();a.hide();a.prev().hide();b.show().css("min-height",a.outerHeight());$(this).hide().prev().show();b.focus().html(nettoie(a.val())).change();if(window.getSelection){var g=document.createRange();g.selectNodeContents(b[0]);g.collapse(false);var f=window.getSelection();f.removeAllRanges();f.addRange(g)}else{var g=document.body.createTextRange();g.moveToElementText(b[0]);g.collapse(false);g.select()}});a.prev().children(".icon-source").on("click",function(f){f.preventDefault();b.hide(0);a.show(0).css("height",b.height());$(this).hide().next().show();a.focus().val(nettoie(b.html())).change()}).hide();a.prev().children(".icon-aide").on("click",function(f){f.preventDefault();aidetexte()});a.prev().children().not(".icon-nosource,.icon-source,.icon-aide").on("click",function(f){f.preventDefault();window["insertion_"+this.className.substring(5)]($(this))})})};$.fn.editinplace=function(){this.each(function(){var a=$(this);this.setAttribute("data-original",(a.is("h3"))?a.text():a.html());$('<a class="icon-edite" title="Modifier"></a>').appendTo(a).on("click",transforme)})};function transforme(){var b=$(this).parent().addClass("avecform");if(b.is("div")){b.html('<form><textarea name="val" rows="'+(b.attr("data-original").split(/\r\n|\r|\n/).length+3)+'"></textarea></form>')}else{b.html('<form class="edition" onsubmit="$(this).children(\'a.icon-ok\').click(); return false;"><input type="text" name="val" value=""></form>')}var a=b.find('[name="val"]').val(b.attr("data-original"));if(b.attr("data-placeholder")){a.attr("data-placeholder",b.attr("data-placeholder"));if(b.hasClass("edithtml")){a.textareahtml();a.next().placeholder()}a.placeholder()}$('<a class="icon-ok" title="Valider"></a>').appendTo(b.children()).on("click",function(){var c=b.attr("data-id").split("|");if(b.hasClass("edithtml")){a.val(nettoie((a.is(":visible"))?a.val():a.next().html()))}$.ajax({url:"ajax.php",method:"post",data:{table:c[0],champ:c[1],id:c[2],val:a.val()},dataType:"json",el:b,fonction:function(d){var e=d.find('[name="val"]').val();d.removeClass("avecform").html(e).attr("data-original",e);$('<a class="icon-edite" title="Modifier"></a>').appendTo(d).on("click",transforme)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b.children()).on("click",function(){b.removeClass("avecform").html(b.attr("data-original"));$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transforme)});a.focus().val((b.hasClass("edithtml"))?nettoie(a.val()):a.val())}$.fn.editinplacecdt=function(){this.each(function(){$(this).wrapInner("<span></span>").attr("data-original",$(this).text());$('<a class="icon-edite" title="Modifier"></a>').appendTo($(this)).on("click",transformecdt)})};function transformecdt(){var b=$(this).parent();b.children(".icon-edite").remove();var c=$('<form class="titrecdt"></form>').insertBefore(b.parent().children("div")).html($("#form-cdt").html());c.boutonscdt();c.find('input,[name="demigroupe"]').on("change keyup",function(){var e=new Date(c.find('[name="jour"]').val().replace(/(.{2})\/(.{2})\/(.{4})/,function(i,h,k,j){return j+"-"+k+"-"+h}));var f=(c.find('[name="demigroupe"]').val()==1)?" (en demi-groupe)":"";switch(parseInt(seances[c.find('[name="tid"]').val()])){case 0:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" à "+c.find('[name="h_debut"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 1:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" de "+c.find('[name="h_debut"]').val()+" à "+c.find('[name="h_fin"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 2:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+" pour le "+c.find('[name="pour"]').val()+f;break;case 3:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 4:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val();break;case 5:var g="[Entrée hebdomadaire]"}b.children("span").text(g)});var d=$.parseJSON(b.attr("data-donnees"));for(var a in d){c.find('[name="'+a+'"]').val(d[a])}$('<a class="icon-ok" title="Valider"></a>').appendTo(b).on("click",function(){var e=b.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:"table=cdt&id="+e[1]+"&"+c.serialize(),dataType:"json",el:b,fonction:function(f){var g=f.siblings("form");f.attr("data-original",f.children("span").text()).attr("data-donnees",'{"tid":'+g.find('[name="tid"]').val()+',"jour":"'+g.find('[name="jour"]').val()+'","h_debut":"'+g.find('[name="h_debut"]').val()+'","h_fin":"'+g.find('[name="h_fin"]').val()+'","pour":"'+g.find('[name="pour"]').val()+'","demigroupe":'+g.find('[name="demigroupe"]').val()+"}");g.remove();f.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(f).on("click",transformecdt)}}).success(function(f){if((f.etat=="ok")&&(f.reload=="oui")){location.reload(true)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b).on("click",function(){c.remove();b.children("span").html(b.attr("data-original"));b.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transformecdt)})}$.fn.boutonscdt=function(){form=this;form.find(".date").datepick({dateFormat:"dd/mm/yyyy",showTrigger:'<img src="js/calendar-blue.gif">',onSelect:function(){form.find('[name="h_debut"]').change()}});form.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});var a=function(b){return(String(b).length==1)?"0"+b:String(b)};form.find('[name="raccourci"]').on("change keyup",function(){var e=raccourcis[this.value];for(var d in e){if(d=="jour"){var c=new Date;var b=parseInt(e.jour);c.setDate((b>c.getDay())?c.getDate()-c.getDay()-7+b:c.getDate()-c.getDay()+b);form.find('[name="jour"]').val(a(c.getDate())+"/"+a(c.getMonth()+1)+"/"+c.getFullYear())}else{form.find('[name="'+d+'"]').val(e[d])}}this.setAttribute("data-modif",1);form.find('[name="tid"]').change()}).attr("data-modif",0);form.find('[name="tid"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 1:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().show();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 2:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().show();form.find('[name="demigroupe"]').parent().show();break;case 3:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;default:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().hide();break}form.find('[name="jour"]').change()});form.find('input,[name="demigroupe"]').on("change keyup",function(){if(form.find('[name="raccourci"]').attr("data-modif")==0){form.find('[name="raccourci"]').val(0)}else{form.find('[name="raccourci"]').attr("data-modif",0)}});form.find("input,select").on("keypress",function(b){if(b.which==13){el.find("a.icon-ok").click()}});form.find("select:first").focus();form.find('[name="tid"]').change()};$.fn.affichechamps=function(){this.each(function(){var a=$(this);a.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});a.find('[name="type"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 1:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().show();a.find('[name="demigroupe"]').parent().show();break;case 2:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 3:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;default:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().hide();break}}).change();a.find("input,select").on("keypress",function(b){if(b.which==13){a.find("a.icon-ok").click()}})})};function nettoie(b){if(b.indexOf("cdptmp")>0){var a=$("<div>"+b+"</div>");a.find(".cdptmp").contents().unwrap();b=a.html();if(b.indexOf("cdptmp")>0){b=b.replace(/<span class="cdptmp"><\/span>/g,"")}}return b.replace(/(<\/?[A-Z]+)([^>]*>)/g,function(d,c,e){return c.toLowerCase()+e}).replace(/[\r\n ]+/g," ").replace(/(<br>)+[ ]?<\/(p|div|li|h)/g,function(d,c,e){return"</"+e}).replace(/<br>/g,"<br>\n").replace(/<(p|div|li|h)/g,function(c){return"\n"+c}).replace(/<\/(p|div|li|h.)>/g,function(c){return c+"\n"}).replace(/<\/?(ul|ol)[^>]*>/g,function(c){return"\n"+c+"\n"}).replace(/^(?!(<p|<div|<ul|<ol|<li|<h))(.+)<br>$/gm,function(d,c,e){return"<p>"+e+"</p>"}).replace(/^(?!(<(p|div|ul|ol|li)))[ ]?(.+)[ ]?$/gm,function(d,c,f,e){return(e.match(/.*(p|div|ul|ol|li|h.)>$/))?e:"<p>"+e+"</p>"}).replace(/^[ ]?(<\/?(br|p|div|h.)>){0,2}[ ]?(<\/(p|div|h.)>)?[ ]?$/gm,"").replace(/^\n/gm,"").replace(/<li/g,"  <li")}function insert(d,a,g,e){var b=d.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(!b.hasAttribute("data-selection")){marqueselection(d)}var f=(e===undefined)?a+"Í"+b.getAttribute("data-selection")+"Ì"+g:a+"Í"+e+"Ì"+g;var c=nettoie(b.getAttribute("data-contenu").replace(/Í.*Ì/,f));if(b.tagName=="TEXTAREA"){b.value=c.replace(/[ÍÌ]/g,"")}else{b.innerHTML=c.replace(/[ÍÌ]/g,"")}marqueselection(d,true);$(b).change();if((b.tagName=="TEXTAREA")&&(b.selectionStart!==undefined)){b.selectionStart=c.indexOf("Í");b.selectionEnd=c.indexOf("Ì")-1;b.focus()}else{if(document.selection){if(b.tagName!="TEXTAREA"){c=c.replace(/(<([^>]+)>)[\n]*/g,"")}range=document.body.createTextRange();range.moveToElementText(b);range.collapse(true);range.moveEnd("character",c.indexOf("Ì")-1);range.moveStart("character",c.indexOf("Í"));range.select()}else{if(window.getSelection){b.innerHTML=c.replace("Í",'<span class="cdptmp">').replace("Ì","</span>")+"<br>";selection=window.getSelection();range=document.createRange();range.selectNodeContents($(b).find(".cdptmp")[0]);selection.removeAllRanges();selection.addRange(range);b.focus()}}}}function marqueselection(f,c){var a=f.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(c){a.removeAttribute("data-selection");a.removeAttribute("data-contenu");return true}var d=(a.tagName=="TEXTAREA")?a.value:a.innerHTML;var g="";if((a.tagName=="TEXTAREA")&&(a.selectionStart!==undefined)){a.focus();g=a.value.substring(a.selectionStart,a.selectionEnd);a.value=a.value.substr(0,a.selectionStart)+"Í"+g+"Ì"+a.value.substring(a.selectionEnd)}else{if(window.getSelection){var b=window.getSelection().getRangeAt(0);if((a==b.commonAncestorContainer)||$.contains(a,b.commonAncestorContainer)){var g=window.getSelection().toString();b.deleteContents();b.insertNode(document.createTextNode("Í"+g+"Ì"))}}else{var b=document.selection.createRange();if((a==b.parentElement())||$.contains(a,b.parentElement())){var g=document.selection.createRange().text;document.selection.createRange().text="Í"+g+"Ì"}}}if(a.tagName=="TEXTAREA"){var e=a.value;a.value=d}else{var e=a.innerHTML;$(a).html(d)}if(e.indexOf("Ì")<0){e=e+"ÍÌ"}a.setAttribute("data-selection",g);a.setAttribute("data-contenu",e);return g}var boutons='<p class="boutons">  <button class="icon-titres" title="Niveaux de titres"></button>  <button class="icon-par1" title="Paragraphe"></button>  <button class="icon-par2" title="Paragraphe important"></button>  <button class="icon-par3" title="Paragraphe très important"></button>  <button class="icon-retour" title="Retour à la ligne"></button>  <button class="icon-gras" title="Gras"></button>  <button class="icon-italique" title="Italique"></button>  <button class="icon-souligne" title="Souligné"></button>  <button class="icon-omega" title="Insérer une lettre grecque"></button>  <button class="icon-sigma" title="Insérer un signe mathématique"></button>  <button class="icon-exp" title="Exposant"></button>  <button class="icon-ind" title="Indice"></button>  <button class="icon-ol" title="Liste énumérée"></button>  <button class="icon-ul" title="Liste à puces"></button>  <button class="icon-lien1" title="Lien vers un document du site"></button>  <button class="icon-lien2" title="Lien internet"></button>  <button class="icon-tex" title="LATEX!"></button>  <button class="icon-source" title="Voir et éditer le code html"></button>  <button class="icon-nosource" title="Voir et éditer le texte formaté"></button>  <button class="icon-aide" title="Voir et éditer le texte formaté"></button></p>';function insertion_titres(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un titre</h3>  <p>Choisissez le type du titre ci-dessous. Vous pouvez éventuellement modifier le texte (ou pourrez le faire ultérieurement). Il est conseillé d\'utiliser des titres de niveau 2 pour les titres dans les programmes de colle.</p>  <input type="radio" name="titre" id="t3" value="3" checked><h3><label for="t3">Titre de niveau 1 (pour les I,II...)</label></h3><br>  <input type="radio" name="titre" id="t4" value="4"><h4><label for="t4">Titre de niveau 2 (pour les 1,2...)</label></h4><br>  <input type="radio" name="titre" id="t5" value="5"><h5><label for="t5">Titre de niveau 3 (pour les a,b...)</label></h5><br>  <input type="radio" name="titre" id="t6" value="6"><h6><label for="t6">Titre de niveau 4</label></h6><br>  <p class="ligne"><label for="texte">Texte&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre input").on("click keyup",function(){var b="h"+$("[name='titre']:checked").val();$("#apercu").html("<"+b+">"+(($("#texte").val().length)?$("#texte").val():"Texte du titre")+"</"+b+">")}).first().keyup();$("#texte").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).focus();$("#fenetre a.icon-ok").on("click",function(){var b="h"+$("[name='titre']:checked").val();insert(a,"<"+b+">","</"+b+">",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_omega(a){popup("<h3>Insertion d'une lettre grecque</h3>  <p>Cliquez sur la lettre à insérer&nbsp;:</p>  <button>&alpha;</button> <button>&beta;</button> <button>&gamma;</button> <button>&Delta;</button> <button>&delta;</button> <button>&epsilon;</button> <button>&eta;</button> <button>&Theta;</button> <button>&theta;</button> <button>&Lambda;</button> <button>&lambda;</button> <button>&mu;</button> <button>&nu;</button> <button>&xi;</button> <button>&Pi;</button> <button>&pi;</button> <button>&rho;</button> <button>&Sigma;</button> <button>&sigma;</button> <button>&tau;</button> <button>&upsilon;</button> <button>&Phi;</button> <button>&phi;</button> <button>&Psi;</button> <button>&psi;</button> <button>&Omega;</button> <button>&omega;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_sigma(a){popup("<h3>Insertion d'un symbole mathématique</h3>  <p>Cliquez sur le symbole à insérer&nbsp;:</p>  <button>&forall;</button> <button>&exist;</button> <button>&part;</button> <button>&nabla;</button> <button>&prod;</button> <button>&sum;</button> <button>&plusmn;</button> <button>&radic;</button> <button>&infin;</button> <button>&int;</button> <button>&prop;</button> <button>&sim;</button> <button>&cong;</button> <button>&asymp;</button> <button>&ne;</button> <button>&equiv;</button> <button>&le;</button> <button>&ge;</button> <button>&sub;</button> <button>&sup;</button> <button>&nsub;</button> <button>&sube;</button> <button>&supe;</button> <button>&isin;</button> <button>&notin;</button> <button>&ni;</button> <button>&oplus;</button> <button>&otimes;</button> <button>&sdot;</button> <button>&and;</button> <button>&or;</button> <button>&cap;</button> <button>&cup;</button> <button>&real;</button> <button>&image;</button> <button>&empty;</button> <button>&deg;</button> <button>&prime;</button> <button>&micro;</button> <button>&larr;</button> <button>&uarr;</button> <button>&rarr;</button> <button>&darr;</button> <button>&harr;</button> <button>&lArr;</button> <button>&uArr;</button> <button>&rArr;</button> <button>&dArr;</button> <button>&hArr;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_ol(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste numérotée</h3>  <p>Choisissez le type de numérotation et la valeur de départ de la liste ci-dessous. Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne. Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <p class="ligne"><label for="t1">Numérotation numérique (1, 2, 3...)</label><input type="radio" name="type" id="t1" value="1" checked></p>  <p class="ligne"><label for="t2">Numérotation alphabétique majuscule (A, B, C...)</label><input type="radio" name="type" id="t2" value="A"></p>  <p class="ligne"><label for="t3">Numérotation alphabétique minuscule (a, b, c...)</label><input type="radio" name="type" id="t3" value="a"></p>  <p class="ligne"><label for="t4">Numérotation romaine majuscule (I, II, III...)</label><input type="radio" name="type" id="t4" value="I"></p>  <p class="ligne"><label for="t5">Numérotation romaine minuscule (i, ii, iii...)</label><input type="radio" name="type" id="t5" value="i"></p>  <p class="ligne"><label for="debut">Valeur de début (numérique)</label><input type="text" id="debut" value="1"></p>  <p class="ligne"><label for="lignes">Textes (chaque ligne correspond à un élément de la liste)&nbsp;: </label></p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre :input").on("click keyup",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";$("#apercu").html('<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ol>")}).first().keyup();$("#lignes").focus();$("#fenetre a.icon-ok").on("click",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";var e=$("#lignes").val().trim("\n");var c=e.lastIndexOf("\n");if(c>0){var d=e.substring(c+1);e=e.substring(0,c)}else{var d=""}insert(a,'<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+e.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",d);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_ul(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste à puces</h3>  <p>Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne (chaque ligne correspond à un élément de la la liste). Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#lignes").on("click keyup",function(){$("#apercu").html("<ul><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ul>")}).keyup().focus();$("#fenetre a.icon-ok").on("click",function(){var d=$("#lignes").val().trim("\n");var b=d.lastIndexOf("\n");if(b>0){var c=d.substring(b+1);d=d.substring(0,b)}else{var c=""}insert(a,"<ul><li>"+d.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",c);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_lien1(a){var b=marqueselection(a);popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien vers un document de Cahier de Prépa</h3>  <div><p style="text-align:center; margin: 2em 0;">[Récupération des listes de documents]</p></div>  <div style="display:none;"><hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Veuillez choisir un document]</div></div>',true);$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)});$.ajax({url:"ajax.php",method:"post",data:{recupdoc:""},dataType:"json"}).success(function(d){var e=function(){var g=$("#apercu");var i=$("#doc").val();var h=$("#doc option:selected").text();if(i==0){g.html(h)}else{if($("#vue").is(":checked")){var f=$("#largeur").val();if(h.slice(-4,-1)=="pdf"){if(g.children(".pdf").length==0){g.html('<div><object data="download?id='+i+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+i+'">'+h+"</a> </object></div>")}else{if(g.find("object").attr("data").substr(12)!=i){g.find("object").attr("data","download?id="+i).html('<a href="download?id='+i+'">'+h+"</a>")}}g.children().attr("class","pdf "+$("#format").val());if(f){if(f==100){g.children().removeAttr("style").children().attr("width","100%").removeAttr("style")}else{g.children().css("padding-bottom",($('<div class="'+$("#format").val()+'"></div>').css("padding-bottom").slice(0,-1)*f/100)+"%");g.find("object").attr("width",f+"%").css("left",(100-f)/2+"%")}}}else{if("jpgpegpng".indexOf(h.slice(-4,-1))>-1){if(g.children("img").length==0){g.css("text-align","").html('<img src="download?id='+i+'">')}else{if(g.children().attr("src").substr(12)!=i){g.children().attr("src","download?id="+i)}}if(f){if(f==100){g.children().removeAttr("style")}else{g.children().css("width",f+"%").css("margin-left",(100-f)/2+"%")}}}}}else{$("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")}}};var c=function(f){$("#fenetre > div:first").html('  <p>Choisissez ci-dessous le répertoire puis le document à insérer. Vous pouvez aussi modifier le texte visible. Cela reste modifiable ultérieurement&nbsp;: le texte est situé entre les deux balises &lt;a...&gt; et &lt;/a&gt;.</p>  <p class="ligne"><label for="mat">Matière&nbsp;:</label><select id="mat">'+f.mats+'</select></p>  <p class="ligne"><label for="rep">Répertoire&nbsp;:</label><select id="rep"></select></p>  <p class="ligne"><label for="doc">Document&nbsp;:</label><select id="doc"></select></p>  <p class="ligne"><label for="texte">Texte visible&nbsp;:</label><input type="text" id="texte" value="'+b+'" size="80" data-auto="1"></p>  <p class="ligne"><label for="vue">Afficher dans la page (PDF et image uniquement)</label><input type="checkbox" id="vue">  <p class="ligne"><label for="largeur">Largeur en %&nbsp;:</label><input type="text" id="largeur" value="100" size="3"></p>  <p class="ligne"><label for="format">Format (PDF uniquement)</label><select id="format">    <option value="portrait">A4 vertical</option><option value="paysage">A4 horizontal</option><option value="hauteur50">Hauteur 50%</option>  </select>');$("#fenetre > div:last").show();if($("#texte").val().length){$("#texte").attr("data-auto",0)}$("#doc").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}var h=$("#doc option:selected").text();if($("#texte").attr("data-auto")==1){$("#texte").val((this.value>0)?h.substr(0,h.lastIndexOf("(")-1):"---")}if("pdfjpgpegpng".indexOf(h.slice(-4,-1))>-1){$("#vue").change().parent().show()}else{$("#vue, #largeur, #format").parent().hide()}e()});$("#texte").on("change keypress",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value.length==0){this.setAttribute("data-auto",1);$("#doc").change()}else{this.setAttribute("data-auto",0);e()}});$("#vue").on("change",function(){if($("#vue").is(":checked")){if($("#doc option:selected").text().slice(-4,-1)=="pdf"){$("#largeur, #format").parent().show();$("#texte").parent().hide()}else{if("jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1){$("#largeur").parent().show();$("#format, #texte").parent().hide()}}}else{$("#texte").parent().show();$("#largeur, #format").parent().hide()}e()});$("#format").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}e()});$("#largeur").on("keydown",function(g){if(g.which==38){++this.value}else{if(g.which==40){--this.value}}}).on("change keyup",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value!=this.getAttribute("data-valeur")){this.setAttribute("data-valeur",this.value);e()}}).attr("data-valeur",100);$("#rep").on("change",function(){$("#doc").html(f.docs[this.value]).change()});$("#mat").on("change",function(){$("#rep").html(f.reps[this.value]).change()}).focus().change();$("#fenetre a.icon-ok").on("click",function(){if($("#doc").val()){if($("#vue").is(":checked")&&("pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1)){insert(a,$("#apercu").html(),"","")}else{insert(a,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val())}$("#fenetre,#fenetre_fond").remove()}});$("#mat option").each(function(){if($("body").attr("data-matiere")==this.value){$("#mat").val(this.value).change()}})};if(d.etat=="login_"){$("#fenetre > div:first").html('<p>Vous n\'êtes actuellement plus connecté. Vous devez vous identifier à nouveau pour récupérer la liste des répertoires et documents disponibles.</p>        <form>        <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>        <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>        </form>');$("#fenetre input").on("keypress",function(f){if(f.which==13){$("#fenetre a.icon-ok").click()}});$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:{login:$("#login").val(),motdepasse:$("#motdepasse").val(),recupdoc:""},dataType:"json"}).success(function(f){if(f.etat=="login_nok"){$("#fenetre > div:first > p:first").html(f.message).addClass("warning")}else{if(f.etat=="ok_"){c(f)}}})})}else{if(d.etat=="ok_"){c(d)}}})}function insertion_lien2(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien</h3>  <p class="ligne"><label for="texte">Texte visible&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <p class="ligne"><label for="url">Adresse&nbsp;: </label><input type="text" id="url" value="http://" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;"></div>',true);$("#fenetre input").on("click keyup",function(){$("#apercu").html(($("#texte").val().length)?'<a onclick="return false;" href="'+$("#url").val()+'">'+$("#texte").val()+"</a>":"[Écrivez un texte visible]")}).on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).first().keyup().focus();$("#fenetre a.icon-ok").on("click",function(){insert(a,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_tex(b){var d=(typeof MathJax=="undefined")?'<script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"><\/script><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax:{inlineMath:[["$","$"],["\\\\(","\\\\)"]]}});<\/script>':"";var c=marqueselection(b);var a="t1";if(c.length){switch(c.substring(0,2)){case"\\[":case"$$":a="t2";case"\\(":c=c.substring(2,c.length-2);break;default:c=c.trim("$")}}popup(d+'<a class="icon-montre" title="Mettre à jour l\'aperçu"></a><a class="icon-ok" title="Valider"></a><h3>Insertion de formules LaTeX</h3>  <p>Vous pouvez ci-dessous entrer et modifier une formule LaTeX. L\'aperçu présent en bas sera mis à jour uniquement lorsque vous cliquez sur l\'icône <span class="icon-montre"></span>.</p>  <p class="ligne"><label for="t1">La formule est en ligne (pas de retour)</label><input type="radio" name="type" id="t1" value="1"></p>  <p class="ligne"><label for="t2">La formule est hors ligne (formule centrée)</label><input type="radio" name="type" id="t2" value="2"></p>  <textarea id="formule" rows="3">'+c+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Demandez l\'aperçu en cliquant sur l\'icône <span class="icon-montre"></span>]</div>',true);$("#"+a).prop("checked",true);$("#formule").focus();$("#fenetre a.icon-montre").on("click",function(){if($("#formule").val().length){$("#apercu").html(($("#t1").is(":checked"))?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left");MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])}else{$("#apercu").html("[Écrivez une formule]").css("text-align","center")}});$("#fenetre a.icon-ok").on("click",function(){if($("#t1").is(":checked")){insert(b,"$","$",$("#formule").val())}else{insert(b,"\\[","\\]",$("#formule").val())}$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(b,true)})}function insertion_par1(a){insert(a,"<p>","</p>")}function insertion_par2(a){insert(a,"<div class='note'>","</div>")}function insertion_par3(a){insert(a,"<div class='annonce'>","</div>")}function insertion_retour(a){insert(a,"<br>","")}function insertion_gras(a){insert(a,"<strong>","</strong>")}function insertion_italique(a){insert(a,"<em>","</em>")}function insertion_souligne(a){insert(a,"<u>","</u>")}function insertion_exp(a){insert(a,"<sup>","</sup>")}function insertion_ind(a){insert(a,"<sub>","</sub>")}function aidetexte(){popup('<h3>Aide et explications</h3>  <p>Il y a deux modes d\'éditions possibles pour éditer un texte&nbsp;: le mode «&nbsp;balises visibles&nbsp;» et le mode «&nbsp;balises invisibles&nbsp;». Il est possible de passer de l\'un à l\'autre&nbsp;:</p>  <ul>    <li><span class="icon-source"></span> permet de passer en mode «&nbsp;balises visibles&nbsp;» (par défaut), où le texte à taper est le code HTML de l\'article. Ce mode est plus précis. Les boutons aux dessus aident à utiliser les bonnes balises.</li>    <li><span class="icon-nosource"></span> permet de passer en mode «&nbsp;balises invisibles&nbsp;», où le texte est tel qu\'il sera affiché sur la partie publique, et modifiable. Ce mode est moins précis, mais permet le copié-collé depuis une page web ou un document Word/LibreOffice.  </ul>  <p>Une fonction de nettoyage du code HTML, permettant d\'assurer une homogénéité et une qualité d\'affichage optimales, est lancée à chaque commutation entre les deux modes, à chaque clic sur un des boutons disponibles, à chaque copie/coupe de texte et à chaque passage à la ligne.</p>  <p>En HTML, toutes les mises en formes sont réalisées par un encadrement de texte entre deux balises&nbsp;: &lt;h3&gt; et &lt;/h3&gt; pour un gros titre, &lt;p&gt; et &lt;/p&gt; pour un paragraphe. Le retour à la ligne simple, qui ne doit exister que très rarement, est une balise simple &lt;br&gt;. Mais les boutons disponibles sont là pour vous permettre de réaliser le formattage que vous souhaitez&nbsp;:</p>  <ul>    <li><span class="icon-titres"></span>&nbsp;: différentes tailles de titres (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-par1"></span>&nbsp;: paragraphe classique, qui doit obligatoirement encadrer au minimum chaque ligne de texte. Apparaît automatiquement au passage à la ligne si on l\'oublie.</li>    <li><span class="icon-par2"></span>&nbsp;: paragraphe important, écrit en rouge</li>    <li><span class="icon-par3"></span>&nbsp;: paragraphe très important, écrit en rouge et encadré</li>    <li><span class="icon-retour"></span>&nbsp;: retour à la ligne. Identique à un appui sur Entrée, et souvent inutile.</li>    <li><span class="icon-gras"></span>&nbsp;: mise en gras du texte entre les balises</li>    <li><span class="icon-italique"></span>&nbsp;: mise en italique du texte entre les balises</li>    <li><span class="icon-souligne"></span>&nbsp;: soulignement du texte entre les balises</li>    <li><span class="icon-omega"></span>&nbsp;: lettres grecques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-sigma"></span>&nbsp;: symboles mathématiques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-exp"></span>&nbsp;: mise en exposant du texte entre les balises</li>    <li><span class="icon-ind"></span>&nbsp;: mise en indice du texte entre les balises</li>    <li><span class="icon-ol"></span>&nbsp;: liste numérotée. Une fenêtre supplémentaire permet de choisir le type (1,A,a,I,i) et la première valeur. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-ul"></span>&nbsp;: liste à puces. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-lien1"></span>&nbsp;: lien d\'un document disponible ici (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-lien2"></span>&nbsp;: lien vers un autre site web (fenêtre supplémentaire pour entre l\'adresse)</li>    <li><span class="icon-tex"></span>&nbsp;: insertion de code LaTeX (fenêtre supplémentaire pour le taper)</li>  </ul>  <p class="tex2jax_ignore">Il est possible d\'insérer du code en LaTeX, sur une ligne séparée (balises \\[...\\] ou balises $$...$$) ou au sein d\'une phrase (balises $...$ ou balises \\(...\\)). Il faut ensuite taper du code en LaTeX à l\'intérieur. La prévisualisation est réalisée en direct.</p>',false)}function echange(b,a){if(b.length&&a.length){$("article").css("position","relative");b.css("opacity",0.3);a.css("opacity",0.3);a.animate({top:b.position().top-a.position().top},1000);b.animate({top:(a.outerHeight(true)+a.outerHeight())/2},1000,function(){b.css("opacity",1);a.css("opacity",1);b.insertAfter(a);b.css({position:"static",top:0});a.css({position:"static",top:0})})}}function cache(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().addClass("cache");c.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().removeClass("cache");c.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().prev().is("article"))){d.children(".icon-monte").hide(1000);d.prev().children(".icon-monte").show(1000)}if(!(d.next().is("article"))){d.children(".icon-descend").show(1000);d.prev().children(".icon-descend").hide(1000)}echange(d.prev(),d)}})}function descend(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().is("article"))){d.children(".icon-monte").show(1000);d.next().children(".icon-monte").hide(1000)}if(!(d.next().next().is("article"))){d.children(".icon-descend").hide(1000);d.next().children(".icon-descend").show(1000)}echange(d,d.next())}})}function supprime(b){var a=b.parent();popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){$("#fenetre,#fenetre_fond").remove();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{supprime:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(c[0]=="colles"){d.removeClass("cache");d.children(".icon-cache,.icon-montre,.icon-supprime").remove();d.children(".icon-ajoute").show();d.children("div.editable").each(function(){this.setAttribute("class",this.getAttribute("class").replace("editable","editable-remplace"))}).html("<p>Le programme de colles de cette semaine n'est pas encore défini.</p>")}else{if(c[0]=="utilisateurs"){location.reload(true)}else{d.remove()}}}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function formulaire(a){var c=a.getAttribute("data-id");if(!c){$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:$(a).parent().attr("data-id").split("|")[1]},dataType:"json",el:a,fonction:function(e){location.reload(true)}});return true}if(a.hasAttribute("data-remplace")){var d=$("article#"+a.getAttribute("data-remplace"));d.children(".icon-ajoute").after('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');d.children('[class*="-remplace"],.icon-ajoute').hide();var b=$("<form></form>").appendTo(d).html($("#form-"+c).html());b.children('[name="id"]').val(a.getAttribute("data-remplace"))}else{$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertBefore("article:first");var b=$("<form></form>").appendTo(d).html($("#form-"+c).html())}b.find(".edithtml").textareahtml();b.find("[data-placeholder]").placeholder();if(b.children('[name="table"]').val()=="cdt"){b.boutonscdt()}else{if(b.children('[name="table"]').val()=="cdt-seances"){b.affichechamps()}else{if($("table#notes").length){notes(a)}}}b.find(".usergrp > .icon-edite").on("click",function(){utilisateursgroupe(this)});d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children(".icon-annule").on("click",function(){d.children("form,.icon-annule,.icon-ok").remove();d.children('[class*="-remplace"],.icon-ajoute').show()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){b.children(".edithtml").each(function(){this.value=nettoie(($(this).is(":visible"))?this.value:$(this).next().html())});if(b.children('[name="table"]').val()=="notes"){$("#epingle select:not(:visible)").val("x")}$.ajax({url:"ajax.php",method:"post",data:b.serialize(),dataType:"json",el:d,fonction:function(e){if(e.attr("id")=="epingle"){if(!$("#epingle #autoriser").length){location.reload(true)}}else{e.children(".icon-supprime").show();if(e.find('[name="cache"]').is(":checked")){e.children(".icon-montre").show();e.addClass("cache")}else{e.children(".icon-cache").show()}e.children('[class*="-remplace"]').show().each(function(){this.setAttribute("class",this.getAttribute("class").replace("-remplace",""));var f=this.getAttribute("data-id");$(this).html(d.find('[name="'+f.slice(f.indexOf("|")+1,f.lastIndexOf("|"))+'"]').val())});e.children(".editable").editinplace();e.children(".icon-annule,.icon-ok,form").remove()}}})});b.find("input,select").on("keypress",function(f){if(f.which==13){f.preventDefault();d.children("a.icon-ok").click()}})}function valide(a){var c="";if($("#mail").length){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le mail.","nok")}else{if(!$('[name="sujet"]').val().length){affiche("Il faut un sujet non vide pour envoyer le mail.","nok")}else{c=$("#mail").serialize()}}}else{if($("#planning").length){c=$("form").serialize()}else{var b=$(a).parent();var d=b.parent().attr("data-id").split("|");c="table="+d[0]+"&id="+d[1]+"&"+b.serialize()}}if(c.length){$.ajax({url:"ajax.php",method:"post",data:c,dataType:"json",el:a,fonction:function(e){if(!$(e).is("[data-noreload]")){location.reload(true)}}})}}function suppressionmultiple(a){popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){var b=a.getAttribute("data-id").split("|");$("#fenetre,#fenetre_fond").remove();$.ajax({url:"ajax.php",method:"post",data:"table="+b[0]+"&id="+b[1]+"&supprime_"+b[2]+"=1",dataType:"json",el:$(a),fonction:function(c){c.remove()}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function utilisateursmatiere(a){var d=a;var c=d.getAttribute("data-matiere").split("|");popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usermat").children("h3").append(c[0]);$("#fenetre :checkbox").attr("id",function(){return this.name}).on("change",function(){var e=this;var f=e.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:f,matiere:c[1],ok:(e.checked?1:0)},dataType:"json",el:e,fonction:function(i){if(i.checked){b=b+","+f;$(e).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+f+",",",").slice(1,-1);$(e).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);var k=$("#fenetre .a4:checked").length;var m=$("#fenetre .a3:checked").length;var j=$("#fenetre .a2:checked").length;var h=$("#fenetre .a1:checked").length;var l=k+m+j+h;if(l){var g="";if(k){g+=", "+k+" professeur"+(k>1?"s":"")}if(m){g+=", "+m+" colleur"+(m>1?"s":"")}if(j){g+=", "+j+" élève"+(j>1?"s":"")}if(h){g+=", "+h+" invité"+(h>1?"s":"")}$(d).parent().children("span").text("Cette matière concerne "+l+" utilisateur"+(l>1?"s":"")+" dont "+g.substr(1)+".")}else{$(d).parent().children("span").text("Cette matière ne concerne aucun utilisateur.")}}}).success(function(g){if(g.etat!="ok"){e.checked=!e.checked}})});var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursgroupe(a){var d=a;var c=$(a).parent().parent();popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usergrp").children("h3").append(c.find("span.editable").text()||c.find("input").val());$("#fenetre :checkbox").attr("id",function(){return this.name});if(c.is("div")){$("#fenetre :checkbox").on("change",function(){$(this).prev().toggleClass("labelchecked",a.checked)});$('<a class="icon-ok" title="Valider"></a>').insertAfter("#fenetre .icon-ferme").on("click",function(){var e=$("#fenetre input:checked").map(function(){return this.id.replace("u","")}).get().join();d.setAttribute("data-uid",e);$(d).parent().next().val(e);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "));$("#fenetre, #fenetre_fond").remove()})}else{$("#fenetre :checkbox").on("change",function(){var f=this;var e=f.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",id:c.attr("data-id").split("|")[1],eleve:e,ok:(f.checked?1:0)},dataType:"json",el:f,fonction:function(g){if(g.checked){b=b+","+e;$(f).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+e+",",",").slice(1,-1);$(f).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "))}}).success(function(g){if(g.etat!="ok"){f.checked=!f.checked}})})}var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursmail(c){popup($("#form-utilisateurs").html(),true);var b=$('[name="id-copie"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest[]"][value="'+b[a]+'"]').prop("checked",true)}b=$('[name="id-bcc"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest_bcc[]"][value="'+b[a]+'"]').prop("checked",true)}$("#fenetre .icon-cocher").on("click keyup",function(){var d=this.getAttribute("data-classe");$("#fenetre ."+d+":not(:disabled)").prop("checked",true);$(this).hide();$(this).next().show();d=(d.indexOf("bcc")>0)?d.replace("bcc","c"):d.replace("c","bcc");$("#fenetre ."+d+":not(:disabled)").prop("checked",false);$('#fenetre .icon-cocher[data-classe="'+d+'"]').show();$('#fenetre .icon-decocher[data-classe="'+d+'"]').hide()});$("#fenetre .icon-decocher").on("click keyup",function(){$("#fenetre ."+this.getAttribute("data-classe")+":not(:disabled)").prop("checked",false);$(this).hide();$(this).prev().show()}).hide();$("#fenetre :checkbox[name]").on("change",function(){if($(this).is(":checked")){$('#fenetre :checkbox[name][value="'+this.value+'"][name!="'+this.name+'"]').prop("checked",false)}});$("#fenetre :checkbox:not([name])").on("click",function(){var e=this.value.split(",");for(var d=0;d<e.length;d++){$('#fenetre :checkbox[name="'+this.className+'[]"][value="'+e[d]+'"]').prop("checked",$(this).prop("checked")).change()}if($(this).is(":checked")){$('#fenetre :checkbox[class="'+((this.className=="dest")?"dest_bcc":"dest")+'"][value="'+this.value+'"]').prop("checked",false)}});$("#fenetre .icon-ok").on("click",function(){$('[name="id-copie"]').val($('#fenetre [name="dest[]"]:checked').map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($('#fenetre [name="dest_bcc[]"]:checked').map(function(){return this.value}).get().join(","));$(c).prev().text($('#fenetre [name="dest[]"]:checked').parent().prev().map(function(){return $(this).text().replace(" (identifiant)","")}).get().concat($('#fenetre [name="dest_bcc[]"]:checked').parent().prev().prev().map(function(){return $(this).text().replace(" (identifiant)","")+" (CC)"}).get()).join(", "));if(!$(c).prev().text().length){$(c).prev().text("[Personne]")}$("#fenetre, #fenetre_fond").remove()})}function notes(e){if($("#epingle :checkbox").length){$("#epingle tr[data-id]").hide()}$("#epingle :checkbox").on("click",function(){var g=$("#epingle .grpnote:checked").map(function(){return this.value.split(",")}).get().concat();$("#epingle tr[data-id]").hide();for(var f=0;f<g.length;f++){$('#epingle tr[data-id="'+g[f]+'"]').show()}});$("#epingle tr[data-id]").each(function(){$(this).children("td:last").html($("#epingle div").html());$(this).find("select").attr("name","e"+$(this).attr("data-id"))});$("#epingle div").remove();if(e.getAttribute("data-eleves")){$("#epingle h4").text($(e).parent().children("h3").text());$('#epingle [name="id"]').val($(e).parent().attr("data-id").split("|")[1]);var b=e.getAttribute("data-eleves").split("|");var d=e.getAttribute("data-notes").split("|");for(var c=0;c<b.length;c++){$('#epingle tr[data-id="'+b[c]+'"]').show().find("select").val(d[c])}var a=dejanotes[$('#epingle [name="id"]').val().split("-")[0]].split(",");for(c=0;c<a.length;c++){$('#epingle tr[data-id="'+a[c]+'"]:not(:visible)').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}else{$("#epingle #semaine").on("change keyup",function(){var f=$(this).val().split("-")[0];$(".dejanote td:first-child").each(function(){$(this).text($(this).text().replace(" (noté par un autre colleur)",""))});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);if(f>0){var g=dejanotes[f].split(",");for(var h=0;h<g.length;h++){$('#epingle tr[data-id="'+g[h]+'"]').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}})}}function envoimail(a){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le mail.","nok")}else{$.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(b){location.reload(true)}})}}function modifierepertoire(b){var d=(b.className=="icon-edite")?"repertoire":"ajouterep";$("#epingle").remove();var e=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");var c=$('<form onsubmit="return false;"></form>').appendTo(e).html($("#form-"+d).html());if(d=="repertoire"){var g=$(b).parent().attr("data-id").split("|")[1];var f=$(b).parent().attr("data-donnees").split("|");var a=$(b).parent().children(".nom").text().split("/").pop()||$(b).parent().find("input").val();c.find("em").text(a);if(f[0]==0){c.find("#nom,#parent,#menu").parent().remove()}else{c.find("#nom").val(a);c.find('[data-parents*=",'+g+',"]').prop("disabled",true);if(f[1]=="1"){c.find("#menu").prop("checked",true)}}$('#protection option[value="'+f[2]+'"]').prop("selected",true);c.find('[name="id"]').val(g)}e.children(".icon-ferme").on("click",function(){$("#epingle").remove()});e.children("a.icon-aide").on("click",function(){popup($("#aide-"+d).html(),false)});e.children("a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:c.serialize(),dataType:"json",el:e,fonction:function(h){location.reload(true)}})});c.find("input,select").on("keypress",function(h){if(h.which==13){e.children("a.icon-ok").click()}})}function modifiedocument(b){var c=(b.className=="icon-edite")?"document":"ajoutedoc";$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");form=$('<form onsubmit="return false;"></form>').appendTo(d).html($("#form-"+c).html());var a=$(b).parent().children(".nom").text()||$(b).parent().find("input").val();form.find("em").text(a);if(c=="document"){form.find("#nom").val(a);$('#protection option[value="'+$(b).parent().attr("data-protection")+'"]').prop("selected",true);form.find('[name="id"]').val($(b).parent().attr("data-id").split("|")[1])}else{$('#protection option[value="'+$(b).parent().attr("data-donnees").split("|")[2]+'"]').prop("selected",true);form.find('[name="parent"]').val($(b).parent().attr("data-id").split("|")[1]);form.find("#fichier").on("change",function(){if(!form.find("#nom").val().length){var e=this.value}form.find("#nom").val(e.substring(e.lastIndexOf("\\")+1,e.lastIndexOf("."))||e)})}d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){var e=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:e,dataType:"json",contentType:false,processData:false,el:d,fonction:function(f){location.reload(true)}})});form.find("input,select").on("keypress",function(f){if(f.which==13){d.children("a.icon-ok").click()}})}$(document).ajaxSend(function(b,c,a){$("body").css("cursor","wait");if(a.data.append){a.data.append("csrf-token",$("body").attr("data-csrf-token"))}else{a.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+a.data}}).ajaxStop(function(){$("body").css("cursor","auto")}).ajaxSuccess(function(b,d,a){var c=d.responseJSON;switch(c.etat){case"ok":affiche(c.message,"ok");a.fonction(a.el);break;case"nok":affiche(c.message,"nok");break;case"login":afficher_login(a)}});$(function(){$(".editable").editinplace();$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").affichechamps();$(".supprmultiple").on("click",function(){suppressionmultiple(this)});$(".usermat .icon-edite").on("click",function(){utilisateursmatiere(this)});$(".editabledest .icon-edite").on("click",function(){utilisateursmail(this)});$('[name="copie"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"mailprefs",champ:"mailcopy",id:0,val:$(this).prop("checked")?1:0},dataType:"json",el:"",fonction:function(a){return true}})});$("#parentsdoc .icon-edite, .rep > .icon-edite, .icon-ajouterep").on("click",function(){modifierepertoire(this)});$(".doc > .icon-edite, .icon-ajoutedoc").on("click",function(){modifiedocument(this)});$('[name="mailnotes"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",champ:"mailnotes",id:$(this).attr("id").substr(9),val:$(this).find("option:selected").val()},dataType:"json",el:"",fonction:function(a){return true}})});$(".usergrp .icon-edite").on("click",function(){utilisateursgroupe(this)});$("#log").hide().on("click",function(){$(this).hide()});$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime").on("click",function(){window[this.className.substring(5)]($(this))});$("a.icon-aide").on("click",function(){popup($("#aide-"+this.getAttribute("data-id")).html(),false)});$("a.icon-prefs.general,a.icon-ajoute").on("click",function(){formulaire(this)});$("a.icon-ok").on("click",function(){valide(this)});$("a.icon-deconnexion").on("click",function(a){$.ajax({url:"ajax.php",method:"post",data:{deconnexion:1},dataType:"json",el:"",fonction:function(b){location.reload(true)}})});$(".icon-menu").on("click",function(){$("#colonne,nav").toggleClass("visible")})});
+function affiche(c,a){$("#log").removeClass().addClass(a).html(c).append('<span class="icon-ferme"></span>').show().off("click").on("click",function(){window.clearTimeout(b);$(this).hide(500)});var b=window.setTimeout(function(){$("#log").hide(500)},10000)}function afficher_login(a){$("#fenetre,#fenetre_fond").remove();popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>  <p>Vous avez été automatiquement déconnecté. Vous devez vous connecter à nouveau pour valider vos modifications.</p>  <form>  <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>  <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>  </form>',true);$("#login").focus();$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:$("#fenetre form").serialize()+"&"+a.data,dataType:"json",el:"",fonction:function(){return true}}).success(function(b){if(b.etat=="login_nok"){$("#fenetre > p").html(b.message).addClass("warning")}else{$("#fenetre,#fenetre_fond").remove();if(b.etat=="ok"){a.fonction(a.el)}}})});$("#fenetre a.icon-ferme").on("click",function(){affiche("Modification non effectuée, connexion nécessaire","nok")});$("#fenetre input").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}})}function popup(b,c){$("#fenetre,#fenetre_fond").remove();var a=$('<div id="fenetre"></div>').appendTo("body").html(b).focus();if(c){$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()})}else{$('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(a).on("click",function(){$("#fenetre_fond").remove();$(this).remove();$("section").children("div,article").first().before(a.removeAttr("id"))})}$('<a class="icon-ferme" title="Fermer"></a>').prependTo(a).on("click",function(){a.remove();$("#fenetre_fond").remove()})}$.fn.placeholder=function(){this.each(function(){var a=$(this);if(a.is("div")){a.on("change keyup mouseup",function(){if($(this).text().length){$(this).removeClass("placeholder")}else{$(this).addClass("placeholder")}}).change()}else{$('<span class="placeholder">'+this.getAttribute("data-placeholder")+"</span>").insertBefore(a).on("click",function(){$(this).next().focus()}).hide();a.on("change keyup mouseup",function(){if(!(this.value.length)&&($(this).is(":visible"))){$(this).prev().css("display","inline")}else{$(this).prev().hide()}}).change()}})};$.fn.textareahtml=function(){this.each(function(){var a=$(this);var c=this.getAttribute("data-placeholder");this.setAttribute("data-placeholder",c+". Formattage en HTML, balises visibles.");var b=$('<div contenteditable="true" data-placeholder="'+c+'"></div>').insertAfter(a.before(boutons)).hide();var d=a.prev().children(".icon-retour");a.on("keypress",function(f){if(f.which==13){this.value=nettoie(this.value)}}).on("paste cut",function(){var e=this;setTimeout(function(){e.value=nettoie(e.value)},100)});b.on("keypress",function(f){if(f.which==13){d.click()}}).on("paste cut",function(){var e=this;setTimeout(function(){e.innerHTML=nettoie(e.innerHTML)+"<br>"},100)});a.prev().children(".icon-nosource").on("click",function(h){h.preventDefault();a.hide();a.prev().hide();b.show().css("min-height",a.outerHeight());$(this).hide().prev().show();b.focus().html(nettoie(a.val())).change();if(window.getSelection){var g=document.createRange();g.selectNodeContents(b[0]);g.collapse(false);var f=window.getSelection();f.removeAllRanges();f.addRange(g)}else{var g=document.body.createTextRange();g.moveToElementText(b[0]);g.collapse(false);g.select()}});a.prev().children(".icon-source").on("click",function(f){f.preventDefault();b.hide(0);a.show(0).css("height",b.height());$(this).hide().next().show();a.focus().val(nettoie(b.html())).change()}).hide();a.prev().children(".icon-aide").on("click",function(f){f.preventDefault();aidetexte()});a.prev().children().not(".icon-nosource,.icon-source,.icon-aide").on("click",function(f){f.preventDefault();window["insertion_"+this.className.substring(5)]($(this))})})};$.fn.editinplace=function(){this.each(function(){var a=$(this);this.setAttribute("data-original",(a.is("h3"))?a.text():a.html());$('<a class="icon-edite" title="Modifier"></a>').appendTo(a).on("click",transforme)})};function transforme(){var b=$(this).parent().addClass("avecform");if(b.is("div")){b.html('<form><textarea name="val" rows="'+(b.attr("data-original").split(/\r\n|\r|\n/).length+3)+'"></textarea></form>')}else{b.html('<form class="edition" onsubmit="$(this).children(\'a.icon-ok\').click(); return false;"><input type="text" name="val" value=""></form>')}var a=b.find('[name="val"]').val(b.attr("data-original"));if(b.attr("data-placeholder")){a.attr("data-placeholder",b.attr("data-placeholder"));if(b.hasClass("edithtml")){a.textareahtml();a.next().placeholder()}a.placeholder()}$('<a class="icon-ok" title="Valider"></a>').appendTo(b.children()).on("click",function(){var c=b.attr("data-id").split("|");if(b.hasClass("edithtml")){a.val(nettoie((a.is(":visible"))?a.val():a.next().html()))}$.ajax({url:"ajax.php",method:"post",data:{table:c[0],champ:c[1],id:c[2],val:a.val()},dataType:"json",el:b,fonction:function(d){var e=d.find('[name="val"]').val();d.removeClass("avecform").html(e).attr("data-original",e);$('<a class="icon-edite" title="Modifier"></a>').appendTo(d).on("click",transforme)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b.children()).on("click",function(){b.removeClass("avecform").html(b.attr("data-original"));$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transforme)});a.focus().val((b.hasClass("edithtml"))?nettoie(a.val()):a.val())}$.fn.editinplacecdt=function(){this.each(function(){$(this).wrapInner("<span></span>").attr("data-original",$(this).text());$('<a class="icon-edite" title="Modifier"></a>').appendTo($(this)).on("click",transformecdt)})};function transformecdt(){var b=$(this).parent();b.children(".icon-edite").remove();var c=$('<form class="titrecdt"></form>').insertBefore(b.parent().children("div")).html($("#form-cdt").html());c.boutonscdt();c.find('input,[name="demigroupe"]').on("change keyup",function(){var e=new Date(c.find('[name="jour"]').val().replace(/(.{2})\/(.{2})\/(.{4})/,function(i,h,k,j){return j+"-"+k+"-"+h}));var f=(c.find('[name="demigroupe"]').val()==1)?" (en demi-groupe)":"";switch(parseInt(seances[c.find('[name="tid"]').val()])){case 0:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" à "+c.find('[name="h_debut"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 1:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" de "+c.find('[name="h_debut"]').val()+" à "+c.find('[name="h_fin"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 2:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+" pour le "+c.find('[name="pour"]').val()+f;break;case 3:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 4:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val();break;case 5:var g="[Entrée hebdomadaire]"}b.children("span").text(g)});var d=$.parseJSON(b.attr("data-donnees"));for(var a in d){c.find('[name="'+a+'"]').val(d[a])}$('<a class="icon-ok" title="Valider"></a>').appendTo(b).on("click",function(){var e=b.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:"table=cdt&id="+e[1]+"&"+c.serialize(),dataType:"json",el:b,fonction:function(f){var g=f.siblings("form");f.attr("data-original",f.children("span").text()).attr("data-donnees",'{"tid":'+g.find('[name="tid"]').val()+',"jour":"'+g.find('[name="jour"]').val()+'","h_debut":"'+g.find('[name="h_debut"]').val()+'","h_fin":"'+g.find('[name="h_fin"]').val()+'","pour":"'+g.find('[name="pour"]').val()+'","demigroupe":'+g.find('[name="demigroupe"]').val()+"}");g.remove();f.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(f).on("click",transformecdt)}}).success(function(f){if((f.etat=="ok")&&(f.reload=="oui")){location.reload(true)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b).on("click",function(){c.remove();b.children("span").html(b.attr("data-original"));b.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transformecdt)})}$.fn.boutonscdt=function(){form=this;form.find(".date").datepick({dateFormat:"dd/mm/yyyy",showTrigger:'<img src="js/calendar-blue.gif">',onSelect:function(){form.find('[name="h_debut"]').change()}});form.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});var a=function(b){return(String(b).length==1)?"0"+b:String(b)};form.find('[name="raccourci"]').on("change keyup",function(){var e=raccourcis[this.value];for(var d in e){if(d=="jour"){var c=new Date;var b=parseInt(e.jour);c.setDate((b>c.getDay())?c.getDate()-c.getDay()-7+b:c.getDate()-c.getDay()+b);form.find('[name="jour"]').val(a(c.getDate())+"/"+a(c.getMonth()+1)+"/"+c.getFullYear())}else{form.find('[name="'+d+'"]').val(e[d])}}this.setAttribute("data-modif",1);form.find('[name="tid"]').change()}).attr("data-modif",0);form.find('[name="tid"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 1:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().show();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 2:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().show();form.find('[name="demigroupe"]').parent().show();break;case 3:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;default:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().hide();break}form.find('[name="jour"]').change()});form.find('input,[name="demigroupe"]').on("change keyup",function(){if(form.find('[name="raccourci"]').attr("data-modif")==0){form.find('[name="raccourci"]').val(0)}else{form.find('[name="raccourci"]').attr("data-modif",0)}});form.find("input,select").on("keypress",function(b){if(b.which==13){el.find("a.icon-ok").click()}});form.find("select:first").focus();form.find('[name="tid"]').change()};$.fn.affichechamps=function(){this.each(function(){var a=$(this);a.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});a.find('[name="type"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 1:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().show();a.find('[name="demigroupe"]').parent().show();break;case 2:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 3:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;default:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().hide();break}}).change();a.find("input,select").on("keypress",function(b){if(b.which==13){a.find("a.icon-ok").click()}})})};function nettoie(b){if(b.indexOf("cdptmp")>0){var a=$("<div>"+b+"</div>");a.find(".cdptmp").contents().unwrap();b=a.html();if(b.indexOf("cdptmp")>0){b=b.replace(/<span class="cdptmp"><\/span>/g,"")}}return b.replace(/(<\/?[A-Z]+)([^>]*>)/g,function(d,c,e){return c.toLowerCase()+e}).replace(/[\r\n ]+/g," ").replace(/(<br>)+[ ]?<\/(p|div|li|h)/g,function(d,c,e){return"</"+e}).replace(/<br>/g,"<br>\n").replace(/<(p|div|li|h)/g,function(c){return"\n"+c}).replace(/<\/(p|div|li|h.)>/g,function(c){return c+"\n"}).replace(/<\/?(ul|ol)[^>]*>/g,function(c){return"\n"+c+"\n"}).replace(/^(?!(<p|<div|<ul|<ol|<li|<h))(.+)<br>$/gm,function(d,c,e){return"<p>"+e+"</p>"}).replace(/^(?!(<(p|div|ul|ol|li)))[ ]?(.+)[ ]?$/gm,function(d,c,f,e){return(e.match(/.*(p|div|ul|ol|li|h.)>$/))?e:"<p>"+e+"</p>"}).replace(/^[ ]?(<\/?(br|p|div|h.)>){0,2}[ ]?(<\/(p|div|h.)>)?[ ]?$/gm,"").replace(/^\n/gm,"").replace(/<li/g,"  <li")}function insert(d,a,g,e){var b=d.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(!b.hasAttribute("data-selection")){marqueselection(d)}var f=(e===undefined)?a+"Í"+b.getAttribute("data-selection")+"Ì"+g:a+"Í"+e+"Ì"+g;var c=nettoie(b.getAttribute("data-contenu").replace(/Í.*Ì/,f));if(b.tagName=="TEXTAREA"){b.value=c.replace(/[ÍÌ]/g,"")}else{b.innerHTML=c.replace(/[ÍÌ]/g,"")}marqueselection(d,true);$(b).change();if((b.tagName=="TEXTAREA")&&(b.selectionStart!==undefined)){b.selectionStart=c.indexOf("Í");b.selectionEnd=c.indexOf("Ì")-1;b.focus()}else{if(document.selection){if(b.tagName!="TEXTAREA"){c=c.replace(/(<([^>]+)>)[\n]*/g,"")}range=document.body.createTextRange();range.moveToElementText(b);range.collapse(true);range.moveEnd("character",c.indexOf("Ì")-1);range.moveStart("character",c.indexOf("Í"));range.select()}else{if(window.getSelection){b.innerHTML=c.replace("Í",'<span class="cdptmp">').replace("Ì","</span>")+"<br>";selection=window.getSelection();range=document.createRange();range.selectNodeContents($(b).find(".cdptmp")[0]);selection.removeAllRanges();selection.addRange(range);b.focus()}}}}function marqueselection(f,c){var a=f.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(c){a.removeAttribute("data-selection");a.removeAttribute("data-contenu");return true}var d=(a.tagName=="TEXTAREA")?a.value:a.innerHTML;var g="";if((a.tagName=="TEXTAREA")&&(a.selectionStart!==undefined)){a.focus();g=a.value.substring(a.selectionStart,a.selectionEnd);a.value=a.value.substr(0,a.selectionStart)+"Í"+g+"Ì"+a.value.substring(a.selectionEnd)}else{if(window.getSelection){var b=window.getSelection().getRangeAt(0);if((a==b.commonAncestorContainer)||$.contains(a,b.commonAncestorContainer)){var g=window.getSelection().toString();b.deleteContents();b.insertNode(document.createTextNode("Í"+g+"Ì"))}}else{var b=document.selection.createRange();if((a==b.parentElement())||$.contains(a,b.parentElement())){var g=document.selection.createRange().text;document.selection.createRange().text="Í"+g+"Ì"}}}if(a.tagName=="TEXTAREA"){var e=a.value;a.value=d}else{var e=a.innerHTML;$(a).html(d)}if(e.indexOf("Ì")<0){e=e+"ÍÌ"}a.setAttribute("data-selection",g);a.setAttribute("data-contenu",e);return g}var boutons='<p class="boutons">  <button class="icon-titres" title="Niveaux de titres"></button>  <button class="icon-par1" title="Paragraphe"></button>  <button class="icon-par2" title="Paragraphe important"></button>  <button class="icon-par3" title="Paragraphe très important"></button>  <button class="icon-retour" title="Retour à la ligne"></button>  <button class="icon-gras" title="Gras"></button>  <button class="icon-italique" title="Italique"></button>  <button class="icon-souligne" title="Souligné"></button>  <button class="icon-omega" title="Insérer une lettre grecque"></button>  <button class="icon-sigma" title="Insérer un signe mathématique"></button>  <button class="icon-exp" title="Exposant"></button>  <button class="icon-ind" title="Indice"></button>  <button class="icon-ol" title="Liste énumérée"></button>  <button class="icon-ul" title="Liste à puces"></button>  <button class="icon-lien1" title="Lien vers un document du site"></button>  <button class="icon-lien2" title="Lien internet"></button>  <button class="icon-tex" title="LATEX!"></button>  <button class="icon-source" title="Voir et éditer le code html"></button>  <button class="icon-nosource" title="Voir et éditer le texte formaté"></button>  <button class="icon-aide" title="Voir et éditer le texte formaté"></button></p>';function insertion_titres(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un titre</h3>  <p>Choisissez le type du titre ci-dessous. Vous pouvez éventuellement modifier le texte (ou pourrez le faire ultérieurement). Il est conseillé d\'utiliser des titres de niveau 2 pour les titres dans les programmes de colle.</p>  <input type="radio" name="titre" id="t3" value="3" checked><h3><label for="t3">Titre de niveau 1 (pour les I,II...)</label></h3><br>  <input type="radio" name="titre" id="t4" value="4"><h4><label for="t4">Titre de niveau 2 (pour les 1,2...)</label></h4><br>  <input type="radio" name="titre" id="t5" value="5"><h5><label for="t5">Titre de niveau 3 (pour les a,b...)</label></h5><br>  <input type="radio" name="titre" id="t6" value="6"><h6><label for="t6">Titre de niveau 4</label></h6><br>  <p class="ligne"><label for="texte">Texte&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre input").on("click keyup",function(){var b="h"+$("[name='titre']:checked").val();$("#apercu").html("<"+b+">"+(($("#texte").val().length)?$("#texte").val():"Texte du titre")+"</"+b+">")}).first().keyup();$("#texte").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).focus();$("#fenetre a.icon-ok").on("click",function(){var b="h"+$("[name='titre']:checked").val();insert(a,"<"+b+">","</"+b+">",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_omega(a){popup("<h3>Insertion d'une lettre grecque</h3>  <p>Cliquez sur la lettre à insérer&nbsp;:</p>  <button>&alpha;</button> <button>&beta;</button> <button>&gamma;</button> <button>&Delta;</button> <button>&delta;</button> <button>&epsilon;</button> <button>&eta;</button> <button>&Theta;</button> <button>&theta;</button> <button>&Lambda;</button> <button>&lambda;</button> <button>&mu;</button> <button>&nu;</button> <button>&xi;</button> <button>&Pi;</button> <button>&pi;</button> <button>&rho;</button> <button>&Sigma;</button> <button>&sigma;</button> <button>&tau;</button> <button>&upsilon;</button> <button>&Phi;</button> <button>&phi;</button> <button>&Psi;</button> <button>&psi;</button> <button>&Omega;</button> <button>&omega;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_sigma(a){popup("<h3>Insertion d'un symbole mathématique</h3>  <p>Cliquez sur le symbole à insérer&nbsp;:</p>  <button>&forall;</button> <button>&exist;</button> <button>&part;</button> <button>&nabla;</button> <button>&prod;</button> <button>&sum;</button> <button>&plusmn;</button> <button>&radic;</button> <button>&infin;</button> <button>&int;</button> <button>&prop;</button> <button>&sim;</button> <button>&cong;</button> <button>&asymp;</button> <button>&ne;</button> <button>&equiv;</button> <button>&le;</button> <button>&ge;</button> <button>&sub;</button> <button>&sup;</button> <button>&nsub;</button> <button>&sube;</button> <button>&supe;</button> <button>&isin;</button> <button>&notin;</button> <button>&ni;</button> <button>&oplus;</button> <button>&otimes;</button> <button>&sdot;</button> <button>&and;</button> <button>&or;</button> <button>&cap;</button> <button>&cup;</button> <button>&real;</button> <button>&image;</button> <button>&empty;</button> <button>&deg;</button> <button>&prime;</button> <button>&micro;</button> <button>&larr;</button> <button>&uarr;</button> <button>&rarr;</button> <button>&darr;</button> <button>&harr;</button> <button>&lArr;</button> <button>&uArr;</button> <button>&rArr;</button> <button>&dArr;</button> <button>&hArr;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_ol(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste numérotée</h3>  <p>Choisissez le type de numérotation et la valeur de départ de la liste ci-dessous. Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne. Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <p class="ligne"><label for="t1">Numérotation numérique (1, 2, 3...)</label><input type="radio" name="type" id="t1" value="1" checked></p>  <p class="ligne"><label for="t2">Numérotation alphabétique majuscule (A, B, C...)</label><input type="radio" name="type" id="t2" value="A"></p>  <p class="ligne"><label for="t3">Numérotation alphabétique minuscule (a, b, c...)</label><input type="radio" name="type" id="t3" value="a"></p>  <p class="ligne"><label for="t4">Numérotation romaine majuscule (I, II, III...)</label><input type="radio" name="type" id="t4" value="I"></p>  <p class="ligne"><label for="t5">Numérotation romaine minuscule (i, ii, iii...)</label><input type="radio" name="type" id="t5" value="i"></p>  <p class="ligne"><label for="debut">Valeur de début (numérique)</label><input type="text" id="debut" value="1"></p>  <p class="ligne"><label for="lignes">Textes (chaque ligne correspond à un élément de la liste)&nbsp;: </label></p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre :input").on("click keyup",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";$("#apercu").html('<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ol>")}).first().keyup();$("#lignes").focus();$("#fenetre a.icon-ok").on("click",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";var e=$("#lignes").val().trim("\n");var c=e.lastIndexOf("\n");if(c>0){var d=e.substring(c+1);e=e.substring(0,c)}else{var d=""}insert(a,'<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+e.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",d);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_ul(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste à puces</h3>  <p>Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne (chaque ligne correspond à un élément de la la liste). Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#lignes").on("click keyup",function(){$("#apercu").html("<ul><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ul>")}).keyup().focus();$("#fenetre a.icon-ok").on("click",function(){var d=$("#lignes").val().trim("\n");var b=d.lastIndexOf("\n");if(b>0){var c=d.substring(b+1);d=d.substring(0,b)}else{var c=""}insert(a,"<ul><li>"+d.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",c);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_lien1(a){var b=marqueselection(a);popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien vers un document de Cahier de Prépa</h3>  <div><p style="text-align:center; margin: 2em 0;">[Récupération des listes de documents]</p></div>  <div style="display:none;"><hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Veuillez choisir un document]</div></div>',true);$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)});$.ajax({url:"ajax.php",method:"post",data:{recupdoc:""},dataType:"json"}).success(function(d){var e=function(){var g=$("#apercu");var i=$("#doc").val();var h=$("#doc option:selected").text();if(i==0){g.html(h)}else{if($("#vue").is(":checked")){var f=$("#largeur").val();if(h.slice(-4,-1)=="pdf"){if(g.children(".pdf").length==0){g.html('<div><object data="download?id='+i+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+i+'">'+h+"</a> </object></div>")}else{if(g.find("object").attr("data").substr(12)!=i){g.find("object").attr("data","download?id="+i).html('<a href="download?id='+i+'">'+h+"</a>")}}g.children().attr("class","pdf "+$("#format").val());if(f){if(f==100){g.children().removeAttr("style").children().attr("width","100%").removeAttr("style")}else{g.children().css("padding-bottom",($('<div class="'+$("#format").val()+'"></div>').css("padding-bottom").slice(0,-1)*f/100)+"%");g.find("object").attr("width",f+"%").css("left",(100-f)/2+"%")}}}else{if("jpgpegpng".indexOf(h.slice(-4,-1))>-1){if(g.children("img").length==0){g.css("text-align","").html('<img src="download?id='+i+'">')}else{if(g.children().attr("src").substr(12)!=i){g.children().attr("src","download?id="+i)}}if(f){if(f==100){g.children().removeAttr("style")}else{g.children().css("width",f+"%").css("margin-left",(100-f)/2+"%")}}}}}else{$("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")}}};var c=function(f){$("#fenetre > div:first").html('  <p>Choisissez ci-dessous le répertoire puis le document à insérer. Vous pouvez aussi modifier le texte visible. Cela reste modifiable ultérieurement&nbsp;: le texte est situé entre les deux balises &lt;a...&gt; et &lt;/a&gt;.</p>  <p class="ligne"><label for="mat">Matière&nbsp;:</label><select id="mat">'+f.mats+'</select></p>  <p class="ligne"><label for="rep">Répertoire&nbsp;:</label><select id="rep"></select></p>  <p class="ligne"><label for="doc">Document&nbsp;:</label><select id="doc"></select></p>  <p class="ligne"><label for="texte">Texte visible&nbsp;:</label><input type="text" id="texte" value="'+b+'" size="80" data-auto="1"></p>  <p class="ligne"><label for="vue">Afficher dans la page (PDF et image uniquement)</label><input type="checkbox" id="vue">  <p class="ligne"><label for="largeur">Largeur en %&nbsp;:</label><input type="text" id="largeur" value="100" size="3"></p>  <p class="ligne"><label for="format">Format (PDF uniquement)</label><select id="format">    <option value="portrait">A4 vertical</option><option value="paysage">A4 horizontal</option><option value="hauteur50">Hauteur 50%</option>  </select>');$("#fenetre > div:last").show();if($("#texte").val().length){$("#texte").attr("data-auto",0)}$("#doc").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}var h=$("#doc option:selected").text();if($("#texte").attr("data-auto")==1){$("#texte").val((this.value>0)?h.substr(0,h.lastIndexOf("(")-1):"---")}if("pdfjpgpegpng".indexOf(h.slice(-4,-1))>-1){$("#vue").change().parent().show()}else{$("#vue, #largeur, #format").parent().hide()}e()});$("#texte").on("change keypress",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value.length==0){this.setAttribute("data-auto",1);$("#doc").change()}else{this.setAttribute("data-auto",0);e()}});$("#vue").on("change",function(){if($("#vue").is(":checked")){if($("#doc option:selected").text().slice(-4,-1)=="pdf"){$("#largeur, #format").parent().show();$("#texte").parent().hide()}else{if("jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1){$("#largeur").parent().show();$("#format, #texte").parent().hide()}}}else{$("#texte").parent().show();$("#largeur, #format").parent().hide()}e()});$("#format").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}e()});$("#largeur").on("keydown",function(g){if(g.which==38){++this.value}else{if(g.which==40){--this.value}}}).on("change keyup",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value!=this.getAttribute("data-valeur")){this.setAttribute("data-valeur",this.value);e()}}).attr("data-valeur",100);$("#rep").on("change",function(){$("#doc").html(f.docs[this.value]).change()});$("#mat").on("change",function(){$("#rep").html(f.reps[this.value]).change()}).focus().change();$("#fenetre a.icon-ok").on("click",function(){if($("#doc").val()){if($("#vue").is(":checked")&&("pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1)){insert(a,$("#apercu").html(),"","")}else{insert(a,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val())}$("#fenetre,#fenetre_fond").remove()}});$("#mat option").each(function(){if($("body").attr("data-matiere")==this.value){$("#mat").val(this.value).change()}})};if(d.etat=="login_"){$("#fenetre > div:first").html('<p>Vous n\'êtes actuellement plus connecté. Vous devez vous identifier à nouveau pour récupérer la liste des répertoires et documents disponibles.</p>        <form>        <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>        <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>        </form>');$("#fenetre input").on("keypress",function(f){if(f.which==13){$("#fenetre a.icon-ok").click()}});$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:{login:$("#login").val(),motdepasse:$("#motdepasse").val(),recupdoc:""},dataType:"json"}).success(function(f){if(f.etat=="login_nok"){$("#fenetre > div:first > p:first").html(f.message).addClass("warning")}else{if(f.etat=="ok_"){c(f)}}})})}else{if(d.etat=="ok_"){c(d)}}})}function insertion_lien2(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien</h3>  <p class="ligne"><label for="texte">Texte visible&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <p class="ligne"><label for="url">Adresse&nbsp;: </label><input type="text" id="url" value="http://" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;"></div>',true);$("#fenetre input").on("click keyup",function(){$("#apercu").html(($("#texte").val().length)?'<a onclick="return false;" href="'+$("#url").val()+'">'+$("#texte").val()+"</a>":"[Écrivez un texte visible]")}).on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).first().keyup().focus();$("#fenetre a.icon-ok").on("click",function(){insert(a,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_tex(b){var d=(typeof MathJax=="undefined")?'<script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"><\/script><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax:{inlineMath:[["$","$"],["\\\\(","\\\\)"]]}});<\/script>':"";var c=marqueselection(b);var a="t1";if(c.length){switch(c.substring(0,2)){case"\\[":case"$$":a="t2";case"\\(":c=c.substring(2,c.length-2);break;default:c=c.trim("$")}}popup(d+'<a class="icon-montre" title="Mettre à jour l\'aperçu"></a><a class="icon-ok" title="Valider"></a><h3>Insertion de formules LaTeX</h3>  <p>Vous pouvez ci-dessous entrer et modifier une formule LaTeX. L\'aperçu présent en bas sera mis à jour uniquement lorsque vous cliquez sur l\'icône <span class="icon-montre"></span>.</p>  <p class="ligne"><label for="t1">La formule est en ligne (pas de retour)</label><input type="radio" name="type" id="t1" value="1"></p>  <p class="ligne"><label for="t2">La formule est hors ligne (formule centrée)</label><input type="radio" name="type" id="t2" value="2"></p>  <textarea id="formule" rows="3">'+c+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Demandez l\'aperçu en cliquant sur l\'icône <span class="icon-montre"></span>]</div>',true);$("#"+a).prop("checked",true);$("#formule").focus();$("#fenetre a.icon-montre").on("click",function(){if($("#formule").val().length){$("#apercu").html(($("#t1").is(":checked"))?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left");MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])}else{$("#apercu").html("[Écrivez une formule]").css("text-align","center")}});$("#fenetre a.icon-ok").on("click",function(){if($("#t1").is(":checked")){insert(b,"$","$",$("#formule").val())}else{insert(b,"\\[","\\]",$("#formule").val())}$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(b,true)})}function insertion_par1(a){insert(a,"<p>","</p>")}function insertion_par2(a){insert(a,"<div class='note'>","</div>")}function insertion_par3(a){insert(a,"<div class='annonce'>","</div>")}function insertion_retour(a){insert(a,"<br>","")}function insertion_gras(a){insert(a,"<strong>","</strong>")}function insertion_italique(a){insert(a,"<em>","</em>")}function insertion_souligne(a){insert(a,"<u>","</u>")}function insertion_exp(a){insert(a,"<sup>","</sup>")}function insertion_ind(a){insert(a,"<sub>","</sub>")}function aidetexte(){popup('<h3>Aide et explications</h3>  <p>Il y a deux modes d\'éditions possibles pour éditer un texte&nbsp;: le mode «&nbsp;balises visibles&nbsp;» et le mode «&nbsp;balises invisibles&nbsp;». Il est possible de passer de l\'un à l\'autre&nbsp;:</p>  <ul>    <li><span class="icon-source"></span> permet de passer en mode «&nbsp;balises visibles&nbsp;» (par défaut), où le texte à taper est le code HTML de l\'article. Ce mode est plus précis. Les boutons aux dessus aident à utiliser les bonnes balises.</li>    <li><span class="icon-nosource"></span> permet de passer en mode «&nbsp;balises invisibles&nbsp;», où le texte est tel qu\'il sera affiché sur la partie publique, et modifiable. Ce mode est moins précis, mais permet le copié-collé depuis une page web ou un document Word/LibreOffice.  </ul>  <p>Une fonction de nettoyage du code HTML, permettant d\'assurer une homogénéité et une qualité d\'affichage optimales, est lancée à chaque commutation entre les deux modes, à chaque clic sur un des boutons disponibles, à chaque copie/coupe de texte et à chaque passage à la ligne.</p>  <p>En HTML, toutes les mises en formes sont réalisées par un encadrement de texte entre deux balises&nbsp;: &lt;h3&gt; et &lt;/h3&gt; pour un gros titre, &lt;p&gt; et &lt;/p&gt; pour un paragraphe. Le retour à la ligne simple, qui ne doit exister que très rarement, est une balise simple &lt;br&gt;. Mais les boutons disponibles sont là pour vous permettre de réaliser le formattage que vous souhaitez&nbsp;:</p>  <ul>    <li><span class="icon-titres"></span>&nbsp;: différentes tailles de titres (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-par1"></span>&nbsp;: paragraphe classique, qui doit obligatoirement encadrer au minimum chaque ligne de texte. Apparaît automatiquement au passage à la ligne si on l\'oublie.</li>    <li><span class="icon-par2"></span>&nbsp;: paragraphe important, écrit en rouge</li>    <li><span class="icon-par3"></span>&nbsp;: paragraphe très important, écrit en rouge et encadré</li>    <li><span class="icon-retour"></span>&nbsp;: retour à la ligne. Identique à un appui sur Entrée, et souvent inutile.</li>    <li><span class="icon-gras"></span>&nbsp;: mise en gras du texte entre les balises</li>    <li><span class="icon-italique"></span>&nbsp;: mise en italique du texte entre les balises</li>    <li><span class="icon-souligne"></span>&nbsp;: soulignement du texte entre les balises</li>    <li><span class="icon-omega"></span>&nbsp;: lettres grecques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-sigma"></span>&nbsp;: symboles mathématiques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-exp"></span>&nbsp;: mise en exposant du texte entre les balises</li>    <li><span class="icon-ind"></span>&nbsp;: mise en indice du texte entre les balises</li>    <li><span class="icon-ol"></span>&nbsp;: liste numérotée. Une fenêtre supplémentaire permet de choisir le type (1,A,a,I,i) et la première valeur. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-ul"></span>&nbsp;: liste à puces. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-lien1"></span>&nbsp;: lien d\'un document disponible ici (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-lien2"></span>&nbsp;: lien vers un autre site web (fenêtre supplémentaire pour entre l\'adresse)</li>    <li><span class="icon-tex"></span>&nbsp;: insertion de code LaTeX (fenêtre supplémentaire pour le taper)</li>  </ul>  <p class="tex2jax_ignore">Il est possible d\'insérer du code en LaTeX, sur une ligne séparée (balises \\[...\\] ou balises $$...$$) ou au sein d\'une phrase (balises $...$ ou balises \\(...\\)). Il faut ensuite taper du code en LaTeX à l\'intérieur. La prévisualisation est réalisée en direct.</p>',false)}function echange(b,a){if(b.length&&a.length){$("article").css("position","relative");b.css("opacity",0.3);a.css("opacity",0.3);a.animate({top:b.position().top-a.position().top},1000);b.animate({top:(a.outerHeight(true)+a.outerHeight())/2},1000,function(){b.css("opacity",1);a.css("opacity",1);b.insertAfter(a);b.css({position:"static",top:0});a.css({position:"static",top:0})})}}function cache(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().addClass("cache");c.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().removeClass("cache");c.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().prev().is("article"))){d.children(".icon-monte").hide(1000);d.prev().children(".icon-monte").show(1000)}if(!(d.next().is("article"))){d.children(".icon-descend").show(1000);d.prev().children(".icon-descend").hide(1000)}echange(d.prev(),d)}})}function descend(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().is("article"))){d.children(".icon-monte").show(1000);d.next().children(".icon-monte").hide(1000)}if(!(d.next().next().is("article"))){d.children(".icon-descend").hide(1000);d.next().children(".icon-descend").show(1000)}echange(d,d.next())}})}function supprime(b){var a=b.parent();popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){$("#fenetre,#fenetre_fond").remove();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{supprime:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(c[0]=="colles"){d.removeClass("cache");d.children(".icon-cache,.icon-montre,.icon-supprime").remove();d.children(".icon-ajoute").show();d.children("div.editable").each(function(){this.setAttribute("class",this.getAttribute("class").replace("editable","editable-remplace"))}).html("<p>Le programme de colles de cette semaine n'est pas encore défini.</p>")}else{if(c[0]=="utilisateurs"){location.reload(true)}else{d.remove()}}}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function formulaire(a){var c=a.getAttribute("data-id");if(!c){$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:$(a).parent().attr("data-id").split("|")[1]},dataType:"json",el:a,fonction:function(e){location.reload(true)}});return true}if(a.hasAttribute("data-remplace")){var d=$("article#"+a.getAttribute("data-remplace"));d.children(".icon-ajoute").after('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');d.children('[class*="-remplace"],.icon-ajoute').hide();var b=$("<form></form>").appendTo(d).html($("#form-"+c).html());b.children('[name="id"]').val(a.getAttribute("data-remplace"))}else{$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertBefore("article:first");var b=$("<form></form>").appendTo(d).html($("#form-"+c).html())}b.find(".edithtml").textareahtml();b.find("[data-placeholder]").placeholder();if(b.children('[name="table"]').val()=="cdt"){b.boutonscdt()}else{if(b.children('[name="table"]').val()=="cdt-seances"){b.affichechamps()}else{if($("table#notes").length){notes(a)}}}b.find(".usergrp > .icon-edite").on("click",function(){utilisateursgroupe(this)});d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children(".icon-annule").on("click",function(){d.children("form,.icon-annule,.icon-ok").remove();d.children('[class*="-remplace"],.icon-ajoute').show()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){b.children(".edithtml").each(function(){this.value=nettoie(($(this).is(":visible"))?this.value:$(this).next().html())});if(b.children('[name="table"]').val()=="notes"){$("#epingle select:not(:visible)").val("x")}$.ajax({url:"ajax.php",method:"post",data:b.serialize(),dataType:"json",el:d,fonction:function(e){if(e.attr("id")=="epingle"){if(!$("#epingle #autoriser").length){location.reload(true)}}else{e.children(".icon-supprime").show();if(e.find('[name="cache"]').is(":checked")){e.children(".icon-montre").show();e.addClass("cache")}else{e.children(".icon-cache").show()}e.children('[class*="-remplace"]').show().each(function(){this.setAttribute("class",this.getAttribute("class").replace("-remplace",""));var f=this.getAttribute("data-id");$(this).html(d.find('[name="'+f.slice(f.indexOf("|")+1,f.lastIndexOf("|"))+'"]').val())});e.children(".editable").editinplace();e.children(".icon-annule,.icon-ok,form").remove()}}})});b.find("input,select").on("keypress",function(f){if(f.which==13){f.preventDefault();d.children("a.icon-ok").click()}})}function valide(a){var c="";if($("#mail").length){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le courriel.","nok")}else{if(!$('[name="sujet"]').val().length){affiche("Il faut un sujet non vide pour envoyer le courriel.","nok")}else{c=$("#mail").serialize()}}}else{if($("#planning").length){c=$("form").serialize()}else{var b=$(a).parent();var d=b.parent().attr("data-id").split("|");c="table="+d[0]+"&id="+d[1]+"&"+b.serialize()}}if(c.length){$.ajax({url:"ajax.php",method:"post",data:c,dataType:"json",el:a,fonction:function(e){if(!$(e).is("[data-noreload]")){location.reload(true)}}})}}function suppressionmultiple(a){popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){var b=a.getAttribute("data-id").split("|");$("#fenetre,#fenetre_fond").remove();$.ajax({url:"ajax.php",method:"post",data:"table="+b[0]+"&id="+b[1]+"&supprime_"+b[2]+"=1",dataType:"json",el:$(a),fonction:function(c){c.remove()}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function utilisateursmatiere(a){var d=a;var c=d.getAttribute("data-matiere").split("|");popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usermat").children("h3").append(c[0]);$("#fenetre :checkbox").attr("id",function(){return this.name}).on("change",function(){var e=this;var f=e.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:f,matiere:c[1],ok:(e.checked?1:0)},dataType:"json",el:e,fonction:function(i){if(i.checked){b=b+","+f;$(e).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+f+",",",").slice(1,-1);$(e).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);var k=$("#fenetre .a4:checked").length;var m=$("#fenetre .a3:checked").length;var j=$("#fenetre .a2:checked").length;var h=$("#fenetre .a1:checked").length;var l=k+m+j+h;if(l){var g="";if(k){g+=", "+k+" professeur"+(k>1?"s":"")}if(m){g+=", "+m+" colleur"+(m>1?"s":"")}if(j){g+=", "+j+" élève"+(j>1?"s":"")}if(h){g+=", "+h+" invité"+(h>1?"s":"")}$(d).parent().children("span").text("Cette matière concerne "+l+" utilisateur"+(l>1?"s":"")+" dont "+g.substr(1)+".")}else{$(d).parent().children("span").text("Cette matière ne concerne aucun utilisateur.")}}}).success(function(g){if(g.etat!="ok"){e.checked=!e.checked}})});var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursgroupe(a){var d=a;var c=$(a).parent().parent();popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usergrp").children("h3").append(c.find("span.editable").text()||c.find("input").val());$("#fenetre :checkbox").attr("id",function(){return this.name});if(c.is("div")){$("#fenetre :checkbox").on("change",function(){$(this).prev().toggleClass("labelchecked",a.checked)});$('<a class="icon-ok" title="Valider"></a>').insertAfter("#fenetre .icon-ferme").on("click",function(){var e=$("#fenetre input:checked").map(function(){return this.id.replace("u","")}).get().join();d.setAttribute("data-uid",e);$(d).parent().next().val(e);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "));$("#fenetre, #fenetre_fond").remove()})}else{$("#fenetre :checkbox").on("change",function(){var f=this;var e=f.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",id:c.attr("data-id").split("|")[1],eleve:e,ok:(f.checked?1:0)},dataType:"json",el:f,fonction:function(g){if(g.checked){b=b+","+e;$(f).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+e+",",",").slice(1,-1);$(f).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "))}}).success(function(g){if(g.etat!="ok"){f.checked=!f.checked}})})}var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursmail(c){popup($("#form-utilisateurs").html(),true);$('#fenetre [name="dest[]"]').each(function(){$(this).attr("id","u"+this.value)});var b=$('[name="id-copie"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest[]"][value="'+b[a]+'"]').prop("checked",true)}b=$('[name="id-bcc"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest_bcc[]"][value="'+b[a]+'"]').prop("checked",true)}$("#fenetre .icon-cocher").on("click keyup",function(){var d=this.getAttribute("data-classe");$("#fenetre ."+d+":not(:disabled)").prop("checked",true);$(this).hide();$(this).next().show();d=(d.indexOf("bcc")>0)?d.replace("bcc","c"):d.replace("c","bcc");$("#fenetre ."+d+":not(:disabled)").prop("checked",false);$('#fenetre .icon-cocher[data-classe="'+d+'"]').show();$('#fenetre .icon-decocher[data-classe="'+d+'"]').hide()});$("#fenetre .icon-decocher").on("click keyup",function(){$("#fenetre ."+this.getAttribute("data-classe")+":not(:disabled)").prop("checked",false);$(this).hide();$(this).prev().show()}).hide();$("#fenetre :checkbox[name]").on("change",function(){if($(this).is(":checked")){$('#fenetre :checkbox[name][value="'+this.value+'"][name!="'+this.name+'"]').prop("checked",false)}});$("#fenetre :checkbox:not([name])").on("click",function(){var e=this.value.split(",");for(var d=0;d<e.length;d++){$('#fenetre :checkbox[name="'+this.className+'[]"][value="'+e[d]+'"]').prop("checked",$(this).prop("checked")).change()}if($(this).is(":checked")){$('#fenetre :checkbox[class="'+((this.className=="dest")?"dest_bcc":"dest")+'"][value="'+this.value+'"]').prop("checked",false)}});$("#fenetre .icon-ok").on("click",function(){$('[name="id-copie"]').val($('#fenetre [name="dest[]"]:checked').map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($('#fenetre [name="dest_bcc[]"]:checked').map(function(){return this.value}).get().join(","));$(c).prev().text($('#fenetre [name="dest[]"]:checked').parent().prev().map(function(){return $(this).text().replace(" (identifiant)","")}).get().concat($('#fenetre [name="dest_bcc[]"]:checked').parent().prev().prev().map(function(){return $(this).text().replace(" (identifiant)","")+" (CC)"}).get()).join(", "));if(!$(c).prev().text().length){$(c).prev().text("[Personne]")}$("#fenetre, #fenetre_fond").remove()})}function notes(e){$("#epingle :checkbox").on("click",function(){var g=$("#epingle .grpnote:checked").map(function(){return this.value.split(",")}).get().concat();$("#epingle tr[data-id]:not([data-orig])").hide();for(var f=0;f<g.length;f++){$('#epingle tr[data-id="'+g[f]+'"]').show()}});$("#epingle tr[data-id]").each(function(){$(this).children("td:last").html($("#epingle div").html());$(this).find("select").attr("name","e"+$(this).attr("data-id"))});$("#epingle div").remove();if($("#epingle :checkbox").length){$("#epingle tr[data-id]").hide()}if(e.getAttribute("data-eleves")){$("#epingle h4").text($(e).parent().children("h3").text());$('#epingle [name="id"]').val($(e).parent().attr("data-id").split("|")[1]);var b=e.getAttribute("data-eleves").split("|");var d=e.getAttribute("data-notes").split("|");for(var c=0;c<b.length;c++){$('#epingle tr[data-id="'+b[c]+'"]').attr("data-orig",true).show().find("select").val(d[c]).on("change",function(){$(this).parent().parent().removeAttr("data-orig")})}var a=dejanotes[$('#epingle [name="id"]').val().split("-")[0]].split(",");for(c=0;c<a.length;c++){$('#epingle tr[data-id="'+a[c]+'"]:not(:visible)').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}else{$("#epingle #semaine").on("change keyup",function(){var f=$(this).val().split("-")[0];$(".dejanote td:first-child").each(function(){$(this).text($(this).text().replace(" (noté par un autre colleur)",""))});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);if(f>0){var g=dejanotes[f].split(",");for(var h=0;h<g.length;h++){$('#epingle tr[data-id="'+g[h]+'"]').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}})}}function envoimail(a){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le courriel.","nok")}else{$.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(b){location.reload(true)}})}}function modifierepertoire(b){var d=(b.className=="icon-edite")?"repertoire":"ajouterep";$("#epingle").remove();var e=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");var c=$('<form onsubmit="return false;"></form>').appendTo(e).html($("#form-"+d).html());if(d=="repertoire"){var g=$(b).parent().attr("data-id").split("|")[1];var f=$(b).parent().attr("data-donnees").split("|");var a=$(b).parent().children(".nom").text().split(/\/\s/).pop()||$(b).parent().find("input").val();c.find("em").text(a);if(f[0]==0){c.find("#nom,#parent,#menu").parent().remove()}else{c.find("#nom").val(a);c.find('[data-parents*=",'+g+',"]').prop("disabled",true);if(f[1]=="1"){c.find("#menu").prop("checked",true)}}$('#protection option[value="'+f[2]+'"]').prop("selected",true);c.find('[name="id"]').val(g)}e.children(".icon-ferme").on("click",function(){$("#epingle").remove()});e.children("a.icon-aide").on("click",function(){popup($("#aide-"+d).html(),false)});e.children("a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:c.serialize(),dataType:"json",el:e,fonction:function(h){location.reload(true)}})});c.find("input,select").on("keypress",function(h){if(h.which==13){e.children("a.icon-ok").click()}})}function modifiedocument(b){var c=(b.className=="icon-edite")?"document":"ajoutedoc";$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");form=$('<form onsubmit="return false;"></form>').appendTo(d).html($("#form-"+c).html());var a=$(b).parent().children(".nom").text()||$(b).parent().find("input").val();form.find("em").text(a);if(c=="document"){form.find("#nom").val(a);$('#protection option[value="'+$(b).parent().attr("data-protection")+'"]').prop("selected",true);form.find('[name="id"]').val($(b).parent().attr("data-id").split("|")[1])}else{$('#protection option[value="'+$(b).parent().attr("data-donnees").split("|")[2]+'"]').prop("selected",true);form.find('[name="parent"]').val($(b).parent().attr("data-id").split("|")[1]);form.find("#fichier").on("change",function(){if(!form.find("#nom").val().length){var e=this.value}form.find("#nom").val(e.substring(e.lastIndexOf("\\")+1,e.lastIndexOf("."))||e)})}d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){var e=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:e,dataType:"json",contentType:false,processData:false,el:d,fonction:function(f){location.reload(true)}})});form.find("input,select").on("keypress",function(f){if(f.which==13){d.children("a.icon-ok").click()}})}$(document).ajaxSend(function(b,c,a){$("body").css("cursor","wait");if(a.data.append){a.data.append("csrf-token",$("body").attr("data-csrf-token"))}else{a.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+a.data}}).ajaxStop(function(){$("body").css("cursor","auto")}).ajaxSuccess(function(b,d,a){var c=d.responseJSON;switch(c.etat){case"ok":affiche(c.message,"ok");a.fonction(a.el);break;case"nok":affiche(c.message,"nok");break;case"login":afficher_login(a)}});$(function(){$(".editable").editinplace();$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").affichechamps();$(".supprmultiple").on("click",function(){suppressionmultiple(this)});$(".usermat .icon-edite").on("click",function(){utilisateursmatiere(this)});$(".editabledest .icon-edite").on("click",function(){utilisateursmail(this)});$('[name="copie"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"mailprefs",champ:"mailcopy",id:0,val:$(this).prop("checked")?1:0},dataType:"json",el:"",fonction:function(a){return true}})});$("#parentsdoc .icon-edite, .rep > .icon-edite, .icon-ajouterep").on("click",function(){modifierepertoire(this)});$(".doc > .icon-edite, .icon-ajoutedoc").on("click",function(){modifiedocument(this)});$('[name="mailnotes"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",champ:"mailnotes",id:$(this).attr("id").substr(9),val:$(this).find("option:selected").val()},dataType:"json",el:"",fonction:function(a){return true}})});$(".usergrp .icon-edite").on("click",function(){utilisateursgroupe(this)});$("#log").hide().on("click",function(){$(this).hide()});$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime").on("click",function(){window[this.className.substring(5)]($(this))});$("a.icon-aide").on("click",function(){popup($("#aide-"+this.getAttribute("data-id")).html(),false)});$("a.icon-prefs.general,a.icon-ajoute").on("click",function(){formulaire(this)});$("a.icon-ok").on("click",function(){valide(this)});$("a.icon-deconnexion").on("click",function(a){$.ajax({url:"ajax.php",method:"post",data:{deconnexion:1},dataType:"json",el:"",fonction:function(b){location.reload(true)}})});$(".icon-lock1").attr("title","Visible uniquement par les utilisateurs connectés");$(".icon-lock2").attr("title","Visible uniquement par les élèves/colleurs/professeurs connectés");$(".icon-lock3").attr("title","Visible uniquement par les colleurs/professeurs connectés");$(".icon-lock4").attr("title","Visible uniquement par les professeurs connectés");$(".icon-lock5").attr("title","Complètement invisible (hors professeurs de cette matière)");$(".icon-menu").on("click",function(){$("#colonne,nav").toggleClass("visible")})});
\ Pas de fin de ligne à la fin du fichier
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/mail.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/mail.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/mail.php	2015-09-20 01:30:40.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/mail.php	2015-10-26 00:09:19.318564620 +0100
@@ -13,12 +13,12 @@
 // Accès aux professeurs et colleurs connectés uniquement
 $mysqli = connectsql();
 if ( !$autorisation )  {
-  $titre = 'Envoi d\'email';
+  $titre = 'Envoi de courriel';
   $actuel = false;
   include('login.php');
 }
 elseif ( $autorisation < 3 )  {
-  debut($mysqli,'Envoi d\'email','Vous n\'avez pas accès à cette page.',$autorisation,' ');
+  debut($mysqli,'Envoi de courriel','Vous n\'avez pas accès à cette page.',$autorisation,' ');
   $mysqli->close();
   fin();
 }
@@ -26,7 +26,7 @@
 //////////////
 //// HTML ////
 //////////////
-debut($mysqli,'Envoi d\'email',$message,$autorisation,'mail');
+debut($mysqli,'Envoi de courriel',$message,$autorisation,'mail');
 
 // Récupération des préférences d'envoi (mailexp, mailcopy) de l'utilisateur
 $resultat = $mysqli->query("SELECT mail, TRIM(mailexp) AS mailexp, IF(mailcopy,' checked','') AS mailcopy
@@ -40,14 +40,14 @@
 
   <article>
     <p><strong>Nom de l'expéditeur&nbsp;: </strong>&nbsp;<span class="editable" data-id="mailprefs|mailexp|0" data-placeholder="Nom">${u['mailexp']}</span>
-    <p><strong>Adresse mail de l'expéditeur&nbsp;: </strong>&nbsp;<span class="editable" data-id="mailprefs|mail|0" data-placeholder="Adresse mail">${u['mail']}</span></p>
+    <p><strong>Adresse électronique de l'expéditeur&nbsp;: </strong>&nbsp;<span class="editable" data-id="mailprefs|mail|0" data-placeholder="Adresse électronique">${u['mail']}</span></p>
     <p><strong>Destinataires&nbsp;: </strong>&nbsp;<span class="editabledest"><span>[Personne]</span><a class="icon-edite"></a></span></p>
     <p><strong>Sujet&nbsp;:</strong></p>
     <form id="mail">
       <input class="ligne" name="sujet"></input>
       <p><strong>Texte du message&nbsp;:</strong></p>
       <textarea id="texte" name="texte" rows="20" cols="100">\n\n\n\n-- \n${u['mailexp']}\nhttps://$site/</textarea>
-      <p class="ligne"><label for="copie">Recevoir le mail en copie&nbsp;: </label>
+      <p class="ligne"><label for="copie">Recevoir le courriel en copie&nbsp;: </label>
         <input type="checkbox" id="copie" name="copie" value="1"${u['mailcopy']}>
       </p>
       <input type="hidden" name="id-copie" value="">
@@ -84,8 +84,11 @@
 FIN;
   }
   if ( strlen($r['mail']) )
-    $r['nom'] .= ' (pas de mail)';
-  $table .= "        <tr><td>${r['nom']}</td><td><input type=\"checkbox\" class=\"dest_c$a\" name=\"dest[]\" value=\"${r['id']}\"${r['mail']}></td><td><input type=\"checkbox\" class=\"dest_bcc$a\" name=\"dest_bcc[]\" value=\"${r['id']}\"${r['mail']}></td></tr>\n";
+    $r['nom'] .= ' (pas d\'adresse)';
+  // Le label sert à cocher automatiquement la case "copie", mais l'identifiant
+  // de cette case doit être ajouter au chargement javascript : voir edition.js,
+  // dans la fonction utilisateursmail
+  $table .= "        <tr><td><label for=\"u${r['id']}\">${r['nom']}</label></td><td><input type=\"checkbox\" class=\"dest_c$a\" name=\"dest[]\" value=\"${r['id']}\"${r['mail']}></td><td><input type=\"checkbox\" class=\"dest_bcc$a\" name=\"dest_bcc[]\" value=\"${r['id']}\"${r['mail']}></td></tr>\n";
 }
 
 // Récupération des groupes d'élèves
@@ -105,19 +108,56 @@
   <div id="form-utilisateurs">
     <a class="icon-ok" title="Valider ces utilisateurs"></a>
     <h3>Choix des destinataires</h3>
+    <form>
     <table class="destinataires">
       <tbody>
         <tr><th></th><th>Copie</th><th>Copie cachée</th></tr>
 <?php echo $table; ?>
       </tbody>
     </table>
+    </form>
   </div>
   
   <div id="aide-page">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Il est possible ici d'envoyer un courriel aux utilisateurs ayant renseigné leur adresse électronique, qu'il s'agisse d'élèves, de colleurs ou de professeurs. L'envoi du courriel est réalisé lors du clic sur le bouton <span class="icon-ok"></span> situé en haut de cette page.</p>
+    <p>Seuls les professeurs et les colleurs ont accès à cette fonctionnalité.</p>
+    <h4>Expéditeur</h4>
+    <p>Le <em>nom de l'expéditeur</em> et l'<em>adresse électronique de l'expéditeur</em> sont ceux qui apparaîtront comme expéditeur du courriel. Ils sont modifiables directement en cliquant sur les boutons <span class="icon-edite"></span>, et immédiatement enregistrés dans votre compte&nbsp;: ils seront identiques lors de vos prochaines connexions.</p>
+    <p>Le <em>nom de l'expéditeur</em> par défaut est de la forme <em>Prénom Nom</em>, mais vous pouvez tout-à-fait mettre par exemple <em>M. Bidule</em> ou <em>Mme Bidule</em>. Cela ne change pas vos nom et prénom enregistrés.</p>
+    <h4>Destinataires</h4>
+    <p>La liste des destinataires est éditable à tout moment en cliquant sur le bouton <span class="icon-edite"></span>. Cela ouvre une fenêtre dans laquelle on peut cocher les destinataires. Le bouton <span class="icon-ok"></span> de cette fenêtre valide la liste des destinataires uniquement, n'envoie pas le courriel.</p>
+    <p>Les cases à cocher <em>Copie</em> permettent d'ajouter les utilisateurs cochés dans la liste des destinataires. Il est obligatoire qu'au moins un utilisateur soit destinataire.</p>
+    <p>Les cases à cocher <em>Copie cachée</em> permettent d'ajouter les utilisateurs cochés dans la liste des destinataires en copie cachée&nbsp;: les autres destinataires ne verront pas que ce courriel a aussi été envoyé à ceux en copie cachée.</p>
+    <p>Un utilisateur ne peut pas être à la fois en copie et en copie cachée.</p>
+    <p>Les cases à cocher sont grisées si l'utilisateur n'a pas renseigné son adresse électronique.</p>
+    <p>Un clic sur le nom d'un utilisateur est équivalent à un clic sur la case <em>Copie</em> associée.</p>
+    <p>Les boutons <span class="icon-cocher"></span> permettent de cocher l'ensemble des utilisateurs du type correspondant.</p>
+    <p>Si des groupes d'élèves ont été définis, vous pouvez cocher les cases correspondantes pour ajouter les élèves de ces groupes-là à la sélection.<?php if ( $autorisation == 4 ) echo ' Les groupes d\'élèves sont à définir ou modifier sur la page de <a href="groupes">gestion des groupes</a>.'; ?></p>
+    <h4>Sujet et contenu du courriel</h4>
+    <p>Le <em>sujet</em> est le sujet du courriel. Tous les caractères sont autorisés. Pensez à envoyer des courriels avec un sujet correspondant explicitement au contenu...</p>
+    <p>Le <em>contenu</em> est le corps du courriel, en texte brut. Le courriel envoyé ne sera pas formaté en HTML&nbsp;: il n'est pas possible de réaliser un formattage particulier (changer une taille d'écriture, une police, mettre de la couleur...). Par convention classique,</p>
+    <ul>
+      <li>écrire un mot entre astérisques (*) signifie le mettre en gras et appuyer sur ce mot.</li>
+      <li>écrire un mot entre slashes (/) signifie le mettre en italique pour indiquer qu'il faut y faire attention.</li>
+      <li>écrire en majuscules signifie que l'on en train d'hurler. :-)</li>
+    </ul>
+    <h4>Réception en copie</h4>
+    <p>Il est aussi possible de recevoir en copie ce mail en cochant la case située en bas de ce formulaire. Cocher ou décocher cette case enregistre votre choix. Si la case est cochée, votre adresse électronique sera placée dans les destinataires en copie cachée.</p>
+    <p>Les messages d'erreurs (de type &laquo;&nbsp;destinataire non valide&nbsp;&raquo;, &laquo;&nbsp;boîte pleine&nbsp;&raquo;...) vous seront envoyés.</p>
   </div>
-
+  
+  <script type="text/javascript">
+$( function() {
+  // Envoi par appui sur Entrée dans le sujet
+  $('input[name="sujet"]').on('keypress',function (e) {
+    if ( e.which == 13 ) {
+      $('a.general.icon-ok').click();
+      return false;
+    }
+  });
+});
+  </script>
 <?php
 $mysqli->close();
 fin(true);
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/MAJSQL.sql /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/MAJSQL.sql
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/MAJSQL.sql	2015-09-30 18:46:34.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/MAJSQL.sql	2015-09-24 01:41:31.017579603 +0200
@@ -219,11 +219,10 @@
   ('2016-06-06'),('2016-06-13'),('2016-06-20'),('2016-06-27'),('2016-07-04');
 UPDATE semaines SET colle = 1;
 ALTER TABLE utilisateurs
-  MODIFY id SMALLINT( 3 ) NOT NULL AUTO_INCREMENT,
-  MODIFY mdp VARCHAR( 41 ) NOT NULL,
+  MODIFY mdp VARCHAR(41),
   DROP genre,
-  MODIFY matieres VARCHAR( 30 ) NOT NULL,
-  MODIFY mailexp VARCHAR( 50 ) NOT NULL;
+  CHANGE matieres matieres VARCHAR( 30 ) NOT NULL,
+  CHANGE mailexp mailexp VARCHAR( 50 ) NOT NULL;
 UPDATE utilisateurs SET matieres = CONCAT_WS(",","0",IF(matieres="",(SELECT GROUP_CONCAT(id) FROM matieres),matieres));
 UPDATE utilisateurs SET mailexp = CONCAT(prenom,' ',nom) WHERE autorisation > 2;
 UPDATE utilisateurs SET mailexp = '' WHERE autorisation < 3;
@@ -231,12 +230,7 @@
 UPDATE utilisateurs SET mdp='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' WHERE mdp='pas de mot de passe';
 ALTER TABLE groupes CHANGE colle mailnotes TINYINT(1) UNSIGNED NOT NULL;
 UPDATE groupes SET mailnotes = 1+2*mailnotes;
-ALTER TABLE notes
-  MODIFY eleve SMALLINT( 3 ) UNSIGNED NOT NULL,
-  MODIFY colleur SMALLINT( 3 ) UNSIGNED NOT NULL,
-  MODIFY note VARCHAR( 4 ) NOT NULL;
-ALTER TABLE colles
-  MODIFY id SMALLINT( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT;
+ALTER TABLE notes CHANGE note note VARCHAR( 4 ) NOT NULL;
 ALTER TABLE recents
   ADD protection TINYINT( 1 ) UNSIGNED NOT NULL,
   ADD matiere TINYINT( 2 ) UNSIGNED NOT NULL;
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/matieres.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/matieres.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/matieres.php	2015-09-13 14:52:44.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/matieres.php	2015-10-27 14:32:34.908106120 +0100
@@ -34,11 +34,11 @@
 
 FIN;
 $select_protection = '
-        <option value="0">Visible de tous</option>
-        <option value="1">Visible pour les connectés</option>
-        <option value="2">Visible pour les élèves, colleurs, profs</option>
-        <option value="3">Visible pour les colleurs et les profs</option>
-        <option value="4">Visible pour les profs uniquement</option>';
+          <option value="0">Visible de tous</option>
+          <option value="1">Visible pour les connectés</option>
+          <option value="2">Visible pour les élèves, colleurs, profs</option>
+          <option value="3">Visible pour les colleurs et les profs</option>
+          <option value="4">Visible pour les profs uniquement</option>';
 
 // Récupération
 $resultat = $mysqli->query("SELECT m.id, ordre, cle, m.nom, colles, cdt, docs, notes, colles_protection, cdt_protection, FIND_IN_SET(m.id,'${_SESSION['matieres']}') AS modifiable,
@@ -55,8 +55,8 @@
   $sel_cdt = str_replace("\"${r['cdt_protection']}\"","\"${r['cdt_protection']}\" selected",$select_protection);
   $disabled = $boutons = '';
   if ( $r['modifiable'] )  {
-    $suppr = "\n  <a class=\"icon-supprime\" title=\"Supprimer cette matière\"></a>";
-    $ok = "\n  <a class=\"icon-ok\" title=\"Valider les modifications\"></a>";
+    $suppr = "\n    <a class=\"icon-supprime\" title=\"Supprimer cette matière\"></a>";
+    $ok = "\n      <a class=\"icon-ok\" title=\"Valider les modifications\"></a>";
     $indication = '';
     if ( $r['colles'] )
       $boutons .= "\n    <input type=\"button\" class=\"ligne supprmultiple\" data-id=\"matieres|$id|colles\" value=\"Supprimer tous les programmes de colles\">";
@@ -69,7 +69,7 @@
   }
   else  {
     $suppr = $ok = '';
-    $indication = "\n    <p>Vous ne pouvez pas modifier cette matière tant qu'elle ne vous est pas associée.</p>";
+    $indication = "\n      <p>Vous ne pouvez pas modifier cette matière tant qu'elle ne vous est pas associée.</p>";
     $disabled = ' disabled';
   }
   if ( $max == 1 )  {
@@ -89,25 +89,25 @@
     $utilisateurs = 'ne concerne aucun utilisateur'; 
   echo <<<FIN
 
-<article data-id="matieres|$id">
-  <a class="icon-aide" data-id="matiere" title="Aide pour l'édition de cette matière"></a>
-  <a class="icon-monte"$monte title="Déplacer cette matière vers le haut"></a>
-  <a class="icon-descend"$descend title="Déplacer cette matière vers le bas"></a>$suppr
-  <form>$ok
-    <h3 class="edition">${r['nom']}</h3>$indication
-    <p class="ligne"><label for="nom$id">Nom complet&nbsp;: </label><input type="text" id="nom$id" name="nom" value="${r['nom']}" size="50"$disabled></p>
-    <p class="ligne"><label for="cle$id">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle$id" name="cle" value="${r['cle']}" size="30"$disabled></p>
-    <p class="ligne"><label for="colles_protection$id">Accès aux programmes de colles&nbsp;: </label>
-      <select id="colles_protection$id" name="colles_protection"$disabled>$sel_colles
-      </select>
-    </p>
-    <p class="ligne"><label for="cdt_protection$id">Accès au cahier de texte&nbsp;: </label>
-      <select id="cdt_protection$id" name="cdt_protection"$disabled>$sel_cdt
-      </select>
-    </p>
-  </form>$boutons
-  <p class="usermat"><a class="icon-edite" data-uid="${r['uid']}" data-matiere="${r['nom']}|${r['id']}"></a><span>Cette matière $utilisateurs.</span></p>
-</article>
+  <article data-id="matieres|$id">
+    <a class="icon-aide" data-id="matiere" title="Aide pour l'édition de cette matière"></a>
+    <a class="icon-monte"$monte title="Déplacer cette matière vers le haut"></a>
+    <a class="icon-descend"$descend title="Déplacer cette matière vers le bas"></a>$suppr
+    <form>$ok
+      <h3 class="edition">${r['nom']}</h3>$indication
+      <p class="ligne"><label for="nom$id">Nom complet&nbsp;: </label><input type="text" id="nom$id" name="nom" value="${r['nom']}" size="50"$disabled></p>
+      <p class="ligne"><label for="cle$id">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle$id" name="cle" value="${r['cle']}" size="30"$disabled></p>
+      <p class="ligne"><label for="colles_protection$id">Accès aux programmes de colles&nbsp;: </label>
+        <select id="colles_protection$id" name="colles_protection"$disabled>$sel_colles
+        </select>
+      </p>
+      <p class="ligne"><label for="cdt_protection$id">Accès au cahier de texte&nbsp;: </label>
+        <select id="cdt_protection$id" name="cdt_protection"$disabled>$sel_cdt
+        </select>
+      </p>
+    </form>$boutons
+    <p class="usermat"><a class="icon-edite" data-uid="${r['uid']}" data-matiere="${r['nom']}|${r['id']}"></a><span>Cette matière $utilisateurs.</span></p>
+  </article>
 
 FIN;
 }
@@ -155,10 +155,12 @@
       <input type="input" class="ligne" name="cle" value="" size="50" data-placeholder="Clé pour les adresses web (Diminutif en minuscules : maths, phys...)">
       <p class="ligne"><label for="colles_protection0">Accès aux programmes de colles&nbsp;: </label>
         <select id="colles_protection0" name="colles_protection"><?php echo $select_protection; ?>
+
         </select>
       </p>
       <p class="ligne"><label for="cdt_protection0">Accès au cahier de texte&nbsp;: </label>
         <select id="cdt_protection0" name="cdt_protection"><?php echo $select_protection; ?>
+
         </select>
       </p>
     </div>
@@ -168,8 +170,9 @@
   <div id="aide-page">
     <h3>Aide et explications</h3>
     <p>Il est possible ici d'ajouter ou de modifier les matières utilisables sur le Cahier de Prépa.</p>
-    <p>Seules les matières qui proposent un contenu (cahier de texte, programmes de colles, documents, notes) est visible dans le menu général. Cela est automatique.</p>
+    <p>Seules les matières qui proposent un contenu (cahier de texte, programmes de colles, documents, notes) sont visibles dans le menu général. Cela est automatique.</p>
     <p>L'ordre d'apparition des matières dans le menu général est modifiable grâce aux boutons <span class="icon-monte"></span> et <span class="icon-descend"></span>.</p>
+    <p>Vous pouvez modifier uniquement les matières associées à votre compte. Vous pouvez néanmoins modifier l'ordre de toutes les matières.</p>
     <h4>Propriétés de chaque matière</h4>
     <p>Pour chaque matière associée à votre compte, vous pouvez modifier&nbsp;:</p>
     <ul>
@@ -179,15 +182,15 @@
     <p>L'<em>accès au programmes de colles</em> et l'<em>accès au cahier de texte</em> peuvent être choisis parmi cinq possibilités&nbsp;:</p>
     <ul>
       <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
-      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (compte invité, compte élève, compte colleur ou compte professeur).</li>
-      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur. Il faut donc avoir un compte personnel validé (voir l'aide de la page <a href="utilisateurs">Utilisateurs</a>) pour y accéder.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur).</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur.</li>
       <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur.</li>
-      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur (vous et vos collègues).</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur.</li>
     </ul>
-    <p>Quel que soit ce choix, les liens dans le menu de la partie publique apparaîtront pour tout visiteur (si le cahier de texte/programme de colles est non vide uniquement), tout comme le lien vers les documents.</p>
-    <p>Les modifications de nom, d'accès et les suppressions ne sont possibles que pour les matières qui vous sont associées. Vous pouvez modifier cela en cliquant sur le bouton <span class="icon-edite"></span> en bas de chaque matière, afin d'éditer la liste d'utilisateurs. Il est bien sûr possible d'être associé à plusieurs matières.</p>
+    <p>Quel que soit ce choix, les liens dans le menu apparaîtront pour tout visiteur non connecté, dès qu'un contenu existe. Pour les utilisateurs connectés, n'apparaissent dans le menu que les liens vers les contenus visibles.</p>
+    <p>Les modifications de nom, d'accès et les suppressions ne sont possibles que pour les matières qui vous sont associées. Vous pouvez modifier votre association à une matière en cliquant sur le bouton <span class="icon-edite"></span> en bas de chaque matière, afin d'éditer la liste d'utilisateurs. Il est bien sûr possible d'être associé à plusieurs matières.</p>
     <h4>Suppressions massives</h4>
-    <p>Pour les matières qui vous sont associées et s'il y en a, il est possible de supprimer en un seul coup les programmes de colles, le cahier de texte ou les documents. Des boutons larges apparaissent alors pour ce faire. Une confirmation sera demandée.</p>
+    <p>Pour les matières qui vous sont associées, il est possible de supprimer en un seul coup les programmes de colles, le cahier de texte ou les documents. Des boutons larges apparaissent alors pour ce faire. Une confirmation sera demandée. Seules les rubriques non vides correspondent à un bouton.</p>
     <p>Il est possible de complètement supprimer une matière en cliquant sur le bouton <span class="icon-supprime"></span> (une confirmation sera demandée). Cela entraîne&nbsp;:</p>
     <ul>
       <li>la suppression définitive des programmes de colles de cette matière</li>
@@ -199,7 +202,7 @@
     <h4>Édition de la liste des utilisateurs</h4>
     <p>Pour chaque matière, il est possible d'éditer la liste des utilisateurs associés en cliquant sur le bouton <span class="icon-edite"></span> situé après le décompte global d'utilisateurs associés à la matière. Pour les comptes invités/élèves/colleurs, cela a une conséquence uniquement pour les contenus dont l'accès est restreint. Si l'accès d'un contenu est réglé à &laquo;&nbsp;<em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;&raquo;, seuls les élèves et colleurs associés à la matière pourront y accéder.</p>
     <p>Les professeurs peuvent voir tous les contenus (même pour les matières qui ne leur sont pas associées) mais ne peuvent éditer que les matières qui leur sont associées.</p>
-    <p>Les invités/élèves/colleurs ne peuvent pas changer seuls les matières qui leur sont associées.</p>
+    <p>Les invités/élèves/colleurs ne peuvent consulter que les matières qui leur sont associées.</p>
     <p>Tout compte doit être associé au minimum à une matière.</p>
   </div>
 
@@ -213,13 +216,13 @@
     <p>L'<em>accès aux programmes de colles</em> et l'<em>accès au cahier de texte</em> peuvent être choisis parmi cinq possibilités&nbsp;:</p>
     <ul>
       <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
-      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (compte invité, compte élève, compte colleur ou compte professeur).</li>
-      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur. Il faut donc avoir un compte personnel validé (voir l'aide de la page <a href="utilisateurs">Utilisateurs</a>) pour y accéder.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur).</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur.</li>
       <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur.</li>
-      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur (vous et vos collègues).</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur.</li>
     </ul>
     <p>Si ce choix n'est pas <em>Visible de tous</em>, les utilisateurs qui ne sont pas associés à cette matière n'ont pas accès aux pages correspondantes. Par exemple, si le programme de colles n'est visible que par les colleurs ou professeurs, alors les colleurs d'une autre matière n'y auront pas accès. Les professeurs ont eux accès à tout, mais ne peuvent éditer que les pages des matières qui leur sont associées.</p>
-    <p>Quel que soit ce choix, les liens dans le menu de la partie publique apparaîtront pour tout visiteur (si le cahier de texte/programme de colles est non vide uniquement), tout comme le lien vers les documents.</p>
+    <p>Quel que soit ce choix, les liens dans le menu apparaîtront pour tout visiteur non connecté, dès qu'un contenu existe. Pour les utilisateurs connectés, n'apparaissent dans le menu que les liens vers les contenus visibles.</p>
     <p>Pour les documents, le réglage de l'accès est propre à chaque répertoire, et ne se fait donc pas ici.</p>
     <h4>Déplacements et suppressions</h4>
     <p>D'autres modifications sont possibles à l'aide des boutons disponibles pour chaque matière&nbsp;:</p>
@@ -247,13 +250,13 @@
     <p>L'<em>accès aux programmes de colles</em> et l'<em>accès au cahier de texte</em> peuvent être choisis parmi cinq possibilités&nbsp;:</p>
     <ul>
       <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
-      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (compte invité, compte élève, compte colleur ou compte professeur).</li>
-      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur. Il faut donc avoir un compte personnel validé (voir l'aide de la page <a href="utilisateurs">Utilisateurs</a>) pour y accéder.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur).</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de types élève, colleur ou professeur.</li>
       <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur.</li>
-      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur (vous et vos collègues).</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur.</li>
     </ul>
     <p>Si ce choix n'est pas <em>Visible de tous</em>, les utilisateurs qui ne sont pas associés à cette matière n'ont pas accès aux pages correspondantes. Par exemple, si le programme de colles n'est visible que par les colleurs ou professeurs, alors les colleurs d'une autre matière n'y auront pas accès. Les professeurs ont eux accès à tout, mais ne peuvent éditer que les pages des matières qui leur sont associées.</p>
-    <p>Quel que soit ce choix, les liens dans le menu de la partie publique apparaîtront pour tout visiteur (si le cahier de texte/programme de colles est non vide uniquement), tout comme le lien vers les documents.</p>
+    <p>Quel que soit ce choix, les liens dans le menu apparaîtront pour tout visiteur non connecté, dès qu'un contenu existe. Pour les utilisateurs connectés, n'apparaissent dans le menu que les liens vers les contenus visibles.</p>
     <p>Pour les documents, le réglage de l'accès est propre à chaque répertoire, et ne se fait donc pas ici.</p>
     <p>La nouvelle matière sera automatiquement associée à tous les comptes utilisateurs qui peuvent déjà avoir accès à toutes les matières (en général, les élèves). Pour les autres comptes, il faudra éditer la liste d'utilisateurs une fois la matière enregistrée.</p>
   </div>
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/notes.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/notes.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/notes.php	2015-10-07 22:46:56.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/notes.php	2015-10-27 14:14:55.801515995 +0100
@@ -119,11 +119,11 @@
   // Affichage des notes concernées
   if ( $resultat->num_rows )  {
     while ( $r = $resultat->fetch_assoc() )
-      echo '<article><h3>Semaine du '.format_date($r['debut'])."</h3><p>${r['note']} (${r['colleur']})</p></article>\n\n";
+      echo "\n  <article>\n    <h3>Semaine du ".format_date($r['debut'])."</h3>\n    <p>${r['note']} (${r['colleur']})</p>\n  </article>\n";
     $resultat->free();
   }
   else
-    echo "<article><h2>Vous n'avez encore aucune note en ${matiere['nom']} cette année.</h2></article>\n\n";
+    echo "\n  <article>\n    <h2>Vous n'avez encore aucune note en ${matiere['nom']} cette année.</h2>\n  </article>\n";
 
 }
 
@@ -153,6 +153,7 @@
       $resultat->free();
       // Barre de sélection
       echo <<<FIN
+
   <p id="recherchenote" class="topbarre">
     Voir les notes de <select id="colleurs" onchange="if (this.value>0) { $('[data-colleur]').attr('class','collnosel'); $('[data-colleur=&quot;'+this.value+'&quot;]').attr('class','collsel'); } else $('[data-colleur]').removeClass();">
       <option value="0">tous les colleurs</option>$select_colleurs
@@ -167,23 +168,23 @@
                                          FROM semaines AS s LEFT JOIN utilisateurs AS u ON 1 WHERE colle AND u.autorisation=2 AND FIND_IN_SET(${matiere['id']},u.matieres) ORDER BY IF(LENGTH(nom),nom,login)) AS t
                                   LEFT JOIN notes ON sid = semaine AND eid = eleve AND matiere = ${matiere['id']} GROUP BY eid ORDER BY nom,sid");
       if ( $resultat->num_rows )  {
-        echo "  <table>\n    <thead>\n      <tr><th class=\"semaines\">Nom</th>";
+        echo "\n  <table>\n    <thead>\n      <tr><th class=\"semaines\">Nom</th>";
         $semaines = $mysqli->query('SELECT DATE_FORMAT(debut,\'%d/%m\') FROM semaines WHERE colle');
         $nb = $semaines->num_rows;
         while ( $r = $semaines->fetch_row() )
           echo "<td class=\"semaines\"><span>${r[0]}</span></td>";
         $semaines->free();
-        echo "</tr>\n    </thead>\n      <tbody>\n";
+        echo "</tr>\n    </thead>\n    <tbody>\n";
         while ( $r = $resultat->fetch_assoc() )
           if ( strlen(str_replace('<td></td>','',$r['notes'])) )
-            echo "        <tr>${r['nom']}${r['notes']}</tr>\n";
+            echo "      <tr>${r['nom']}${r['notes']}</tr>\n";
           else
-            echo "        <tr>${r['nom']}<td class=\"pasnote\" colspan=\"$nb\">Pas encore de note pour cet élève</td></tr>\n";
+            echo "      <tr>${r['nom']}<td class=\"pasnote\" colspan=\"$nb\">Pas encore de note pour cet élève</td></tr>\n";
         $resultat->free();
-        echo "      </tbody>\n  </table>\n\n";
+        echo "    </tbody>\n  </table>\n";
       }
       else
-        echo "<article><h2>Il n'y a encore aucune note de colle en ${matiere['nom']} cette année.</h2></article>\n\n";
+        echo "\n  <article>\n    <h2>Il n'y a encore aucune note de colle en ${matiere['nom']} cette année.</h2>\n  </article>\n";
     }
   }
   else
@@ -203,36 +204,36 @@
   $resultat->free();
 
   // Récupération de l'ensemble des semaines
-  $resultat = $mysqli->query("SELECT s.id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, colle, vacances, IFNULL(GROUP_CONCAT(n.eleve),'') AS eleves, COUNT(n.id) AS n
-                              FROM semaines AS s LEFT JOIN (SELECT * FROM notes WHERE matiere = ${matiere['id']} AND colleur=${_SESSION['id']}) AS n ON s.id = n.semaine GROUP BY s.id");
-  $select_semaines = "\n      <option value=\"0\">Choisir une semaine</option>";
+  $resultat = $mysqli->query("SELECT s.id, DATE_FORMAT(debut,'%w%Y%m%e') AS debut, colle, vacances, IFNULL(GROUP_CONCAT(n.eleve),'') AS eleves, COUNT(IF(n.colleur=${_SESSION['id']},1,NULL)) AS n
+                              FROM semaines AS s LEFT JOIN (SELECT * FROM notes WHERE matiere = ${matiere['id']}) AS n ON s.id = n.semaine GROUP BY s.id");
+  $select_semaines = "\n        <option value=\"0\">Choisir une semaine</option>";
   $semaines = $semaines_notes = array();
   while ( $r = $resultat->fetch_assoc() )  {
     switch ( $r['vacances'] )  {
       case 0:
         if ( $r['colle'] == 0 )
-          $select_semaines .= "\n      <option disabled>".format_date($r['debut']).' (pas de colle)</option>';
+          $select_semaines .= "\n        <option disabled>".format_date($r['debut']).' (pas de colle)</option>';
         elseif ( $r['n'] )  {
-          $select_semaines .= "\n      <option disabled>".format_date($r['debut'])." (${r['n']} notes déjà entrées)</option>";
+          $select_semaines .= "\n        <option disabled>".format_date($r['debut'])." (${r['n']} notes déjà entrées)</option>";
           $semaines[$r['id']] = $r['debut']; 
           $semaines_notes[$r['id']] = $r['eleves']; 
         }
         else  {
-          $select_semaines .= "\n      <option value=\"${r['id']}-${matiere['id']}\">".format_date($r['debut']).'</option>';
+          $select_semaines .= "\n        <option value=\"${r['id']}-${matiere['id']}\">".format_date($r['debut']).'</option>';
           $semaines_notes[$r['id']] = $r['eleves']; 
         }
         break;
       case 1:
-        $select_semaines .= "\n      <option disabled>Vacances de Toussaint</option>";
+        $select_semaines .= "\n        <option disabled>Vacances de Toussaint</option>";
         break;
       case 2:
-        $select_semaines .= "\n      <option disabled>Vacances de Noël</option>";
+        $select_semaines .= "\n        <option disabled>Vacances de Noël</option>";
         break;
       case 3:
-        $select_semaines .= "\n      <option disabled>Vacances d'hiver</option>";
+        $select_semaines .= "\n        <option disabled>Vacances d'hiver</option>";
         break;
       case 4:
-        $select_semaines .= "\n      <option disabled>Vacances de Pâques</option>";
+        $select_semaines .= "\n        <option disabled>Vacances de Pâques</option>";
     }
   }
   $resultat->free();
@@ -241,7 +242,7 @@
   $resultat = $mysqli->query("SELECT semaine, COUNT(id) AS nb,
                               GROUP_CONCAT(eleve ORDER BY id SEPARATOR '|') AS eleves, GROUP_CONCAT(note ORDER BY id SEPARATOR '|') AS notes
                               FROM notes WHERE colleur = ${_SESSION['id']} AND matiere = ${matiere['id']} GROUP BY semaine ORDER BY semaine DESC");
-  // Affichage de l'ensmeble des notes de l'année
+  // Affichage de l'ensemble des notes de l'année
   if ( $resultat->num_rows )  {
     while ( $r = $resultat->fetch_assoc() )  {
       $date = format_date($semaines[$r['semaine']]);
@@ -253,20 +254,20 @@
       }
       $texte = implode(', ',$texte);
       echo <<<FIN
+
   <article data-id="notes|${r['semaine']}-${matiere['id']}">
     <h3 class="edition">Semaine du $date</h3>
     <a class="icon-supprime" title="Supprimer ces notes"></a>
     <a class="icon-edite" title="Modifier ces notes" data-id="notes" data-eleves="${r['eleves']}" data-notes="${r['notes']}" onclick="formulaire(this);"></a>
     <p><strong>${r['nb']} notes&nbsp;:</strong> $texte</p>
   </article>
+
 FIN;
     }
     $resultat->free();
   }
   else
-    echo "<article><h2>Vous n'avez encore saisi aucune note en ${matiere['nom']} cette année.</h2></article>\n\n";
-
-  // Aide et formulaire d'ajout
+    echo "\n  <article>\n    <h2>Vous n'avez encore saisi aucune note en ${matiere['nom']} cette année.</h2>\n  </article>\n";
 
   // Table contenant les élèves
   $table = '';
@@ -279,11 +280,13 @@
                               FROM groupes AS g JOIN utilisateurs AS e ON FIND_IN_SET(e.id,g.eleves)
                               WHERE g.mailnotes>1 AND FIND_IN_SET(${matiere['id']},e.matieres) GROUP BY g.id ORDER BY g.nom_nat");
   if ( $resultat->num_rows )  {
-    $table .= "    <tr><th>Groupes de colles</th><th></th></tr>\n";
+    $table .= "        <tr><th>Groupes de colles</th><th></th></tr>\n";
     while ( $r = $resultat->fetch_assoc() )
       $table .= "        <tr><td>Groupe ${r['nom']}&nbsp;: ${r['eleves']}</td><td><input type=\"checkbox\" class=\"grpnote\" value=\"${r['eid']}\"></td></tr>\n";
     $resultat->free();
   }
+
+  // Aide et formulaire d'ajout
 ?>
 
   <script type="text/javascript">
@@ -307,6 +310,7 @@
     <h3 class="edition">Ajouter des notes de colles</h3>
     <p class="ligne"><label for="semaine">Semaine</label>
       <select id="semaine" name="id"><?php echo $select_semaines; ?>
+
       </select>
     </p>
     <table id="notes">
@@ -317,24 +321,69 @@
     <div><select><option value="x"></option><option value="7">7</option><option value="8">8</option><option value="9">9</option><option value="10">10</option><option value="11">11</option><option value="12">12</option><option value="13">13</option><option value="14">14</option><option value="15">15</option><option value="16">16</option><option value="17">17</option><option value="18">18</option><option value="19">19</option><option value="20">20</option><option value="abs">Absent</option><option value="0">0</option><option value="1">1</option><option value="2">2</option><option value="3">3</option><option value="4">4</option><option value="5">5</option><option value="6">6</option><option value="0,5">0,5</option><option value="1,5">1,5</option><option value="2,5">2,5</option><option value="3,5">3,5</option><option value="4,5">4,5</option><option value="5,5">5,5</option><option value="6,5">6,5</option><option value="7,5">7,5</option><option value="8,5">8,5</option><option value="9,5">9,5</option><option value="10,5">10,5</option><option value="11,5">11,5</option><option value="12,5">12,5</option><option value="13,5">13,5</option><option value="14,5">14,5</option><option value="15,5">15,5</option><option value="16,5">16,5</option><option value="17,5">17,5</option><option value="18,5">18,5</option><option value="19,5">19,5</option></select></div>
     <input type="hidden" name="notes" value="">
   </form>
-  
+
+<?php if ( $autorisation == 3 ) { ?>
   <div id="aide-page">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Il est possible ici consulter les notes que vous avez mises, de les modifier en cliquant sur le bouton <span class="icon-edite"></span>, de les supprimer en cliquant sur le bouton <span class="icon-supprime"></span> (une confirmation sera demandée) et d'en ajouter en cliquant sur le bouton <span class="icon-ajoute"></span>.</p>
+    <p>Vous ne pouvez mettre des notes de colles que dans certaines matières. Les professeurs de la classe ont la possibilité de modifier les matières qui vous sont associées.</p>
+    <p>Un élève ne peut avoir qu'une seule note par matière et par semaine. Dans les formulaires d'ajout ou de modification des notes, les élèves ayant déjà eu une note par un autre colleur lors de la semaine concernée sont indiqués.</p>
+    <p>Vous ne devez faire qu'une saisie pour chaque semaine, qui doit donc contenir l'ensemble des notes de toutes vos heures de colles correspondantes.</p>
   </div>
 
   <div id="aide-notes">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet de modifier, supprimer ou ajouter des notes pendant la semaine choisie. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Si des groupes de colles ont été définis par les professeurs, vous pouvez cocher les cases correspondantes pour n'afficher que les notes déjà saisies et ces groupes-là. Les notes déjà saisies restent affichées lors du cochage/décochage des groupes, sauf si elles ont été modifiées.</p>
+    <p>Un élève ne peut avoir qu'une seule note par matière et par semaine. Les élèves ayant déjà eu une note par un autre colleur lors de la semaine concernée sont indiqués.</p>
+    <p>Vous ne devez faire qu'une saisie pour chaque semaine, qui doit donc contenir l'ensemble des notes de toutes vos heures de colles correspondantes.</p>
+    <p>Seules les notes visibles au moment où vous cliquez sur le bouton <span class="icon-ok"></span> sont effectivement envoyées pour la saisie. Les notes que vous avez remplies mais qui ne sont pas affichées parce que vous avez décoché le groupe de colles correspondant ne sont pas envoyées.</p>
+    <p>Les notes laissées vides ne sont pas enregistrées. Pour saisir une note non numérique, le seul choix possible est <em>Absent</em>.</p>
   </div>
 
   <div id="aide-ajoute">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet d'ajouter des notes sur une semaine où vous n'en avez pas encore saisi. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Vous devez commencer par choisir la semaine correspondant aux notes que vous allez saisir. Vous ne pouvez faire qu'une saisie pour chaque semaine, qui doit donc contenir l'ensemble des notes de toutes vos heures de colles correspondantes. Pour ajouter des notes sur une semaine où vous avez déjà saisi des notes, vous devez l'éditer en cliquant sur le bouton <span class="icon-edite"></span> correspondant.</p>
+    <p>Si des groupes de colles ont été définis par les professeurs, vous pouvez cocher les cases correspondantes pour n'afficher que les élèves de ces groupes-là.</p>
+    <p>Un élève ne peut avoir qu'une seule note par matière et par semaine. Les élèves ayant déjà eu une note par un autre colleur lors de la semaine choisie sont indiqués.</p>
+    <p>Seules les notes visibles au moment où vous cliquez sur le bouton <span class="icon-ok"></span> sont effectivement envoyées pour la saisie. Les notes que vous avez remplies mais qui ne sont pas affichées parce que vous avez décoché le groupe de colles correspondant ne sont pas envoyées.</p>
   </div>
-  
-  <p id="log"></p>
+<?php } else { ?>
+  <div id="aide-page">
+    <h3>Aide et explications</h3>
+    <h4>Saisie des notes</h4>
+    <p>Il est possible ici consulter les notes que vous avez mises, de les modifier en cliquant sur le bouton <span class="icon-edite"></span>, de les supprimer en cliquant sur le bouton <span class="icon-supprime"></span> (une confirmation sera demandée) et d'en ajouter en cliquant sur le bouton <span class="icon-ajoute"></span>.</p>
+    <p>Vous ne pouvez mettre des notes de colles que dans certaines matières. Les professeurs de la classe ont la possibilité de modifier les matières qui vous sont associées.</p>
+    <p>Un élève ne peut avoir qu'une seule note par matière et par semaine. Dans les formulaires d'ajout ou de modification des notes, les élèves ayant déjà eu une note par un autre colleur lors de la semaine concernée sont indiqués.</p>
+    <p>Vous ne devez faire qu'une saisie pour chaque semaine, qui doit donc contenir l'ensemble des notes de toutes vos heures de colles correspondantes.</p>
+    <h4>Consultation globale des notes</h4>
+    <p>En tant que professeur associé à cette matière, vous avez la possibilité de consulter l'ensemble des notes qui ont été saisies par l'ensemble des colleurs. Les utilisateurs de type colleurs n'ont pas droit à cette fonctionnalité.</p>
+    <p>Un clic sur le bouton <span class="icon-download"></span> permet de récupérer le tableau récapitulatif global en fichier de type <code>xls</code>, éditable par un logiciel tableur (Excel, LibreOffice Calc...).</p>
+    <p>Un clic sur le bouton <span class="icon-voirtout"></span> permet de voir en ligne ce tableau récapitulatif. Il est alors possible de faire ressortir les notes de chaque colleur séparément à l'aide d'un menu déroulant. Cet affichage peut être supprimé par un clic sur le bouton <span class="icon-ferme"></span>.</p>
+  </div>
+
+  <div id="aide-notes">
+    <h3>Aide et explications</h3>
+    <p>Ce formulaire permet de modifier, supprimer ou ajouter des notes pendant la semaine choisie. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Si des groupes de colles ont été définis, vous pouvez cocher les cases correspondantes pour n'afficher que les notes déjà saisies et ces groupes-là. Les notes déjà saisies restent affichées lors du cochage/décochage des groupes, sauf si elles ont été modifiées. Les groupes de colles sont définir ou modifier sur la page de <a href="groupes">gestion des groupes</a>.</p>
+    <p>Un élève ne peut avoir qu'une seule note par matière et par semaine. Les élèves ayant déjà eu une note par un autre colleur lors de la semaine concernée sont indiqués.</p>
+    <p>Vous ne devez faire qu'une saisie pour chaque semaine, qui doit donc contenir l'ensemble des notes de toutes vos heures de colles correspondantes.</p>
+    <p>Seules les notes visibles au moment où vous cliquez sur le bouton <span class="icon-ok"></span> sont effectivement envoyées pour la saisie. Les notes que vous avez remplies mais qui ne sont pas affichées parce que vous avez décoché le groupe de colles correspondant ne sont pas envoyées.</p>
+    <p>Les notes laissées vides ne sont pas enregistrées. Pour saisir une note non numérique, le seul choix possible est <em>Absent</em>.</p>
+  </div>
+
+  <div id="aide-ajoute">
+    <h3>Aide et explications</h3>
+    <p>Ce formulaire permet d'ajouter des notes sur une semaine où vous n'en avez pas encore saisi. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Vous devez commencer par choisir la semaine correspondant aux notes que vous allez saisir. Vous ne pouvez faire qu'une saisie pour chaque semaine, qui doit donc contenir l'ensemble des notes de toutes vos heures de colles correspondantes. Pour ajouter des notes sur une semaine où vous avez déjà saisi des notes, vous devez l'éditer en cliquant sur le bouton <span class="icon-edite"></span> correspondant.</p>
+    <p>Si des groupes de colles ont été définis, vous pouvez cocher les cases correspondantes pour n'afficher que les élèves de ces groupes-là. Les groupes de colles sont à définir ou modifier sur la page de <a href="groupes">gestion des groupes</a>.</p>
+    <p>Un élève ne peut avoir qu'une seule note par matière et par semaine. Les élèves ayant déjà eu une note par un autre colleur lors de la semaine choisie sont indiqués.</p>
+    <p>Seules les notes visibles au moment où vous cliquez sur le bouton <span class="icon-ok"></span> sont effectivement envoyées pour la saisie. Les notes que vous avez remplies mais qui ne sont pas affichées parce que vous avez décoché le groupe de colles correspondant ne sont pas envoyées.</p>
+  </div>
+<?php } ?>
 
+  <p id="log"></p>
 <?php
 }
 
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/pages.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/pages.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/pages.php	2015-09-20 01:37:54.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/pages.php	2015-10-27 14:21:36.778876621 +0100
@@ -34,11 +34,12 @@
 
 FIN;
 $select_protection = '
-        <option value="0">Visible de tous</option>
-        <option value="1">Visible pour les connectés</option>
-        <option value="2">Visible pour les élèves, colleurs, profs</option>
-        <option value="3">Visible pour les colleurs et les profs</option>
-        <option value="4">Visible pour les profs uniquement</option>';
+          <option value="0">Visible de tous</option>
+          <option value="1">Visible pour les connectés</option>
+          <option value="2">Visible pour les élèves, colleurs, profs</option>
+          <option value="3">Visible pour les colleurs et les profs</option>
+          <option value="4">Visible pour les profs uniquement</option>
+          <option value="5">Non visible</option>';
 
 
 // Récupération des matières
@@ -54,7 +55,7 @@
                             WHERE FIND_IN_SET(p.mat,'${_SESSION['matieres']}') GROUP BY m.id ORDER BY m.ordre");
 while ( $m = $resultat->fetch_assoc() )  {
   if ( $m['id'] )
-    echo "<h3>${m['nom']}</h3>\n\n";
+    echo "\n  <h3>${m['nom']}</h3>\n";
   $resultat1 = $mysqli->query("SELECT p.id, p.ordre, p.cle, p.nom, p.mat, p.titre, p.bandeau, p.protection, COUNT(i.id) AS n
                               FROM pages AS p LEFT JOIN infos AS i ON i.page = p.id WHERE p.mat = ${m['id']} GROUP BY p.id ORDER BY p.ordre");
   while ( $r = $resultat1->fetch_assoc() )  {
@@ -63,18 +64,16 @@
     $descend = ( ( $r['ordre'] == $m['max'] ) || ( $r['id'] == 1 ) ) ? ' style="display:none;"' : '';
     $sel_matiere = str_replace("\"${m['id']}\"","\"${m['id']}\" selected",$select_matieres);
     $sel_protection = str_replace("\"${r['protection']}\"","\"${r['protection']}\" selected",$select_protection);
-    $suppr = ( $r['id'] > 1 ) ? "\n  <a class=\"icon-supprime\" title=\"Supprimer cette page\"></a>" : '';
+    $suppr = ( $r['id'] > 1 ) ? "\n    <a class=\"icon-supprime\" title=\"Supprimer cette page\"></a>" : '';
     $nom = ( $m['id'] ) ? "${m['nom']}/${r['nom']}" : $r['nom'];
     if ( $r['id'] > 1 )  {
-      $suppr = "\n  <a class=\"icon-supprime\" title=\"Supprimer cette page\"></a>";
+      $suppr = "\n    <a class=\"icon-supprime\" title=\"Supprimer cette page\"></a>";
       str_replace("\"${m['id']}\"","\"${m['id']}\" selected",$select_matieres);
       $sel_matiere = <<<FIN
 
-    <p class="ligne"><label for="matiere$id">Matière&nbsp;: </label>
-      <select id="matiere$id" name="matiere">
-        $sel_matiere
-      </select>
-    </p>
+      <p class="ligne"><label for="matiere$id">Matière&nbsp;: </label>
+        <select id="matiere$id" name="matiere">$sel_matiere</select>
+      </p>
 FIN;
       $span = '';
     }
@@ -83,27 +82,27 @@
       // Pour obtenir le bon comportement du script js lors après les montées/descentes
       $span = '<span></span>';
     }
-    $supprinfos = ( $r['n'] ) ? "\n    <input type=\"button\" class=\"ligne supprmultiple\" data-id=\"pages|$id|infos\" value=\"Supprimer les ${r['n']} informations de la page\">" : '';
+    $supprinfos = ( $r['n'] ) ? "\n      <input type=\"button\" class=\"ligne supprmultiple\" data-id=\"pages|$id|infos\" value=\"Supprimer les ${r['n']} informations de la page\">" : '';
     echo <<<FIN
 
-<article data-id="pages|$id">
-  <a class="icon-monte"$monte title="Déplacer cette matière vers le haut"></a>
-  <a class="icon-descend"$descend title="Déplacer cette matière vers le bas"></a>$suppr
-  <form>
-    <a class="icon-ok" title="Valider les modifications"></a>
-    <h3 class="edition">$nom</h3>
-    <p class="ligne"><label for="titre$id">Titre&nbsp;: </label><input type="text" id="titre$id" name="titre" value="${r['titre']}" size="50" data-placeholder="Ex: «&nbsp;Informations en [matière]&nbsp;», «&nbsp;À propos de l'ADS et du TIPE&nbsp;»"></p>
-    <p class="ligne"><label for="nom$id">Nom dans le menu&nbsp;: </label><input type="text" id="nom$id" name="nom" value="${r['nom']}" size="50" data-placeholder="Pas trop long. Ex: «&nbsp;Informations&nbsp;», «&nbsp;Informations ADS/TIPE&nbsp;»"></p>
-    <p class="ligne"><label for="cle$id">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle$id" name="cle" value="${r['cle']}" size="30" data-placeholder="En minuscules et sans espace. Ex: «&nbsp;infos&nbsp;», «&nbsp;ads-tipe&nbsp;»"></p>$sel_matiere
-    <p class="ligne"><label for="protection$id">Accès&nbsp;: </label>
-      <select id="protection$id" name="protection">$sel_protection
-      </select>
-    </p>
-    <p class="ligne"><label for="bandeau$id">Texte de début&nbsp;:</label></p>
-    <textarea id="bandeau$id" name="bandeau" rows="2" cols="100" data-placeholder="Texte qui s'affichera au début de la page">${r['bandeau']}</textarea>$supprinfos
-  </form>
-</article>
-$span
+  <article data-id="pages|$id">
+    <a class="icon-monte"$monte title="Déplacer cette matière vers le haut"></a>
+    <a class="icon-descend"$descend title="Déplacer cette matière vers le bas"></a>$suppr
+    <form>
+      <a class="icon-ok" title="Valider les modifications"></a>
+      <h3 class="edition">$nom</h3>
+      <p class="ligne"><label for="titre$id">Titre&nbsp;: </label><input type="text" id="titre$id" name="titre" value="${r['titre']}" size="50" data-placeholder="Ex: «&nbsp;Informations en [matière]&nbsp;», «&nbsp;À propos du TIPE&nbsp;»"></p>
+      <p class="ligne"><label for="nom$id">Nom dans le menu&nbsp;: </label><input type="text" id="nom$id" name="nom" value="${r['nom']}" size="50" data-placeholder="Pas trop long. Ex: «&nbsp;Informations&nbsp;», «&nbsp;Informations TIPE&nbsp;»"></p>
+      <p class="ligne"><label for="cle$id">Clé dans l'adresse&nbsp;: </label><input type="text" id="cle$id" name="cle" value="${r['cle']}" size="30" data-placeholder="En minuscules et sans espace. Ex: «&nbsp;infos&nbsp;», «&nbsp;tipe&nbsp;»"></p>$sel_matiere
+      <p class="ligne"><label for="protection$id">Accès&nbsp;: </label>
+        <select id="protection$id" name="protection">$sel_protection
+        </select>
+      </p>
+      <p class="ligne"><label for="bandeau$id">Texte de début&nbsp;:</label></p>
+      <textarea id="bandeau$id" name="bandeau" rows="2" cols="100" data-placeholder="Texte qui s'affichera au début de la page">${r['bandeau']}</textarea>$supprinfos
+    </form>
+  </article>$span
+
 FIN;
   }
   $resultat1->free();
@@ -116,9 +115,9 @@
   <form id="form-ajoute">
     <h3 class="edition">Ajouter une nouvelle page</h3>
     <div>
-      <input type="text" class="ligne"  id="nom" name="nom" value="" size="50" data-placeholder="Nom pour le menu. Pas trop long. Ex: «&nbsp;Informations&nbsp;», «&nbsp;Informations ADS/TIPE&nbsp;»">
-      <input type="text" class="ligne" id="cle" name="cle" value="" size="30" data-placeholder="Clé pour l''adresse web. En minuscules et sans espace. Ex: «&nbsp;infos&nbsp;», «&nbsp;ads-tipe&nbsp;»">
-      <input type="text" class="ligne" id="titre" name="titre" value="" size="50" data-placeholder="Titre. Ex: «&nbsp;Informations en [matière]&nbsp;», «&nbsp;À propos de l'ADS et du TIPE&nbsp;»">
+      <input type="text" class="ligne"  id="nom" name="nom" value="" size="50" data-placeholder="Nom pour le menu. Pas trop long. Ex: «&nbsp;Informations&nbsp;», «&nbsp;Informations TIPE&nbsp;»">
+      <input type="text" class="ligne" id="cle" name="cle" value="" size="30" data-placeholder="Clé pour l''adresse web. En minuscules et sans espace. Ex: «&nbsp;infos&nbsp;», «&nbsp;tipe&nbsp;»">
+      <input type="text" class="ligne" id="titre" name="titre" value="" size="50" data-placeholder="Titre. Ex: «&nbsp;Informations en [matière]&nbsp;», «&nbsp;À propos du TIPE&nbsp;»">
       <p class="ligne"><label for="matiere$id">Matière&nbsp;: </label>
         <select id="matiere" name="matiere">
           <?php echo $select_matieres; ?>
@@ -136,12 +135,60 @@
 
   <div id="aide-page">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Il est possible ici d'ajouter, de modifier et de supprimer les pages d'informations de ce Cahier de Prépa.</p>
+    <p>Chaque page peut être sans matière associée ou non. Sans matière associée, elle sera affichée tout en haut du menu, directement sous les icônes. Avec une matière associée, elle sera affichée dans le menu sous le titre de la matière. Une page apparaît toujours dans le menu des visiteurs connectés en tant que professeur, pour pouvoir être éditée. Pour les autres visiteurs (non connecté ou invité/élève/colleur), elle n'apparaît que si elle est contient au moins une information.</p>
+    <p>La première page sans matière associée est la page d'accueil du Cahier de Prépa&nbsp;: il est donc impossible de la supprimer ou de la déplacer.</p>
+    <p>Pour toutes les autres pages, il est possible de les supprimer en cliquant sur le bouton <span class="icon-supprime"></span> (une confirmation sera demandée). Si cela est possible, les pages peuvent être déplacées les unes par rapport aux autres dans le menu, à l'aide des boutons <span class="icon-monte"></span> et <span class="icon-descend"></span>.</p>
+    <p>Seules les pages sans matière associée ou dont la matière associée est aussi associée à votre compte sont modifiables. Vous pouvez modifier les associations des matières à votre compte dans la page de <a href="matieres">gestion des matières</a>.</p>
+    <h4>Préférences associées à chaque page</h4>
+    <p>Pour chaque page, vous pouvez modifier&nbsp;:</p>
+    <ul>
+      <li>le <em>titre</em> qui sera affiché en haut de page et dans la barre de titre du navigateur. Par exemple, «&nbsp;À propos du TIPE&nbsp;».</li>
+      <li>le <em>nom dans le menu</em> qui est affiché dans le menu en tant que lien vers la page. Il est préférable qu'il rentre sur une ligne, il faut donc le choisir assez court. Par exemple, «&nbsp;Informations TIPE&nbsp;».</li>
+      <li>la <em>clé dans l'adresse</em> qui est un mot-clé utilisé uniquement dans l'adresse de la page. Par convention, il vaut mieux que ce soit un mot unique, court et sans majuscule. Par exemple, «&nbsp;tipe&nbsp;». La clé doit obligatoirement être unique (deux pages ne peuvent pas avoir la même clé).</li>
+      <li>la <em>matière</em> associée qui conditionne la place du lien dans le menu de la partie publique. Vous ne pouvez associer à une nouvelle page qu'une matière déjà associée à votre compte. Vous pouvez modifier les associations des matières à votre compte dans la page de <a href="matieres">gestion des matières</a>.</li>
+      <li>l'<em>accès</em> à la page (voir ci-dessous).</li>
+      <li>le <em>texte de début</em> qui sera affiché au-dessus des informations de la page. Il s'agit d'une ou deux phrases maximum. Il n'est affiché que si la page contient des informations. Cette case peut être laissée vide.</li>
+    </ul>
+    <p>L'<em>accès</em> à chaque page peut être choisi parmi six possibilités&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont la page peut dépendre). La différence avec le choix précédent est que cette page n'apparaît plus du tout dans le menu pour ceux qui ne la voient pas.</li>
+    </ul>
+    <p>Hormis le dernier choix, le lien dans le menu apparaîtra pour tout visiteur (identifié ou non). Le niveau de protection est indiqué dans le titre par une icône de type <span class="icon-lock1"></span> où le numéro correspond au niveau de protection à côté du titre, lorsque vous allez sur la page concernée connecté en tant que professeur.</p>
+    <p>Le titre de la première page a un statut spécial&nbsp;: c'est le titre du Cahier de Prépa. Il est donc repris à plusieurs endroits (titre dans la barre de titre du navigateur, titre dans le flux RSS). Le <em>nom dans le menu</em> de cette page est par contre peu important car affiché uniquement lorsque la souris survole l'icône <span class="icon-accueil"></span>.</p>
+    <h4>Suppression d'une page ou de ses informations</h4>
+    <p>La suppression d'une page entraîne automatiquement la suppression de toutes les informations qui y étaient inscrites.</p>
+    <p>Il est aussi possible de supprimer toutes les informations d'une page (sans supprimer la page elle-même) en cliquant sur le bouton correspondant. Celui-ci n'apparaît pas pour les pages vides.</p>
   </div>
 
   <div id="aide-ajoute">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet de créer une nouvelle page d'informations. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Il est possible de définir pour cette page&nbsp;:</p>
+    <ul>
+      <li>le <em>titre</em> qui sera affiché en haut de page et dans la barre de titre du navigateur. Par exemple, «&nbsp;À propos du TIPE&nbsp;».</li>
+      <li>le <em>nom dans le menu</em> qui est affiché dans le menu en tant que lien vers la page. Il est préférable qu'il rentre sur une ligne, il faut donc le choisir assez court. Par exemple, «&nbsp;Informations TIPE&nbsp;».</li>
+      <li>la <em>clé dans l'adresse</em> qui est un mot-clé utilisé uniquement dans l'adresse de la page. Par convention, il vaut mieux que ce soit un mot unique, court et sans majuscule. Par exemple, «&nbsp;tipe&nbsp;». La clé doit obligatoirement être unique (deux pages ne peuvent pas avoir la même clé).</li>
+      <li>la <em>matière</em> associée qui conditionne la place du lien dans le menu de la partie publique. Vous ne pouvez associer à une nouvelle page qu'une matière déjà associée à votre compte. Vous pouvez modifier les associations des matières à votre compte dans la page de <a href="matieres">gestion des matières</a>.</li>
+      <li>l'<em>accès</em> à la page (voir ci-dessous).</li>
+      <li>le <em>texte de début</em> qui sera affiché au-dessus des informations de la page. Il s'agit d'une ou deux phrases maximum. Il n'est affiché que si la page contient des informations. Cette case peut être laissée vide.</li>
+    </ul>
+    <p>L'<em>accès</em> à la page peut être choisi parmi six possibilités&nbsp;:</p>
+    <ul>
+      <li><em>Visible de tous</em>&nbsp;: accessible de tout visiteur, sans identification.</li>
+      <li><em>Visible pour les connectés</em>&nbsp;: accessible de tout utilisateur mais uniquement après identification (utilisateurs de type invité, élève, colleur ou professeur). Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les élèves, colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type élève, colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les colleurs, professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type colleur ou professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Visible pour les professeurs</em>&nbsp;: accessible uniquement par les utilisateurs de type professeur. Pour les pages associées à une matière, seuls les utilisateurs associés à cette matière ou à toutes les matières peuvent y accéder.</li>
+      <li><em>Non visible</em>&nbsp;: entièrement invisible pour les utilisateurs autres que les professeurs (éventuellement associés à la matière dont la page peut dépendre). La différence avec le choix précédent est que cette page n'apparaît plus du tout dans le menu pour ceux qui ne la voient pas.</li>
+    </ul>
+    <p>Hormis le dernier choix, le lien dans le menu apparaîtra pour tout visiteur (identifié ou non). Le niveau de protection est indiqué dans le titre par une icône de type <span class="icon-lock1"></span> où le numéro correspond au niveau de protection à côté du titre, lorsque vous allez sur la page concernée connecté en tant que professeur.</p>
+    <p>La page sera automatiquement positionnée en dernière place, éventuellement au sein de la matière choisie. Il est ensuite possible de la déplacer parmi les autres pages à l'aide des boutons <span class="icon-monte"></span> et <span class="icon-descend"></span>.</p>   
   </div>
 
   <p id="log"></p>
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/planning.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/planning.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/planning.php	2015-09-25 01:49:16.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/planning.php	2015-10-27 14:34:06.622602873 +0100
@@ -90,7 +90,6 @@
 });
   </script>
 
-  
   <div id="aide-page">
     <h3>Aide et explications</h3>
     <p>Il est possible ici de modifier le planning annuel, c'est-à-dire pour chaque semaine de l'année, préciser s'il s'agit&nbsp;:
@@ -104,7 +103,6 @@
   </div>
 
   <p id="log"></p>
-  
 <?php
 
 $mysqli->close();
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/prefs.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/prefs.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/prefs.php	2015-09-16 22:18:38.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/prefs.php	2015-10-22 01:08:20.385698306 +0200
@@ -43,7 +43,7 @@
       <h3 class="edition">Mon identité</h3>
       <p class="ligne"><label for="prenom">Prénom&nbsp;: </label><input type="text" id="prenom" name="prenom" value="<?php echo $r['prenom']; ?>" size="50"></p>
       <p class="ligne"><label for="nom">Nom&nbsp;: </label><input type="text" id="nom" name="nom" value="<?php echo $r['nom']; ?>" size="50"></p>
-      <p class="ligne"><label for="mail1">Adresse mail&nbsp;: </label><input type="text" id="mail1" name="mail1" value="<?php echo $r['mail']; ?>" size="50"></p>
+      <p class="ligne"><label for="mail1">Adresse électronique&nbsp;: </label><input type="text" id="mail1" name="mail1" value="<?php echo $r['mail']; ?>" size="50"></p>
       <p class="ligne"><label for="mail2">Confirmation&nbsp;: </label><input type="text" id="mail2" name="mail2" value="" size="50"></p>
       <p class="ligne"><label for="mdp0">Mot de passe&nbsp;: </label><input type="password" id="mdp0" name="mdp" value=""></p>
       <p>Le mot de passe actuel doit être obligatoirement fourni pour toute modification.</p>
@@ -68,12 +68,12 @@
   <div id="aide-page">
     <h3>Aide et explications</h3>
     <p>Il est possible ici de modifier vos préférences. Une fois modifié, le formulaire est à validé par un clic sur le bouton <span class="icon-ok"></span>.</p>
-    <h4>Modification de l'identité&nbsp;: nom, prénom, adresse mail</h4>
-    <p>Si l'on souhaite modifier l'adresse mail, il faut la saisir deux fois afin d'éviter les fautes de frappes.</p>
+    <h4>Modification de l'identité&nbsp;: nom, prénom, adresse électronique</h4>
+    <p>Si l'on souhaite modifier l'adresse électronique, il faut la saisir deux fois afin d'éviter les fautes de frappes.</p>
     <p>Afin d'éviter les usurpations de compte, il est nécessaire de taper son mot de passe pour toute modification.</p>
-    <p>L'adresse mail ne sera pas modifiée si un autre compte contient déjà la nouvelle valeur saisie.</p>
-    <p>Il est possible de ne modifier que le prénom ou le nom sans modifier l'adresse mail&nbsp;: il n'est alors pas nécessaire de saisir une deuxième fois l'adresse mail.</p>
-    <p>L'adresse mail sert pour les élèves à recevoir des mails de la part des professeurs et colleurs. Pour les colleurs et professeurs, cela permet de recevoir et d'envoyer des mails via ce Cahier de Prépa.</p>
+    <p>L'adresse électronique ne sera pas modifiée si un autre compte contient déjà la nouvelle valeur saisie.</p>
+    <p>Il est possible de ne modifier que le prénom ou le nom sans modifier l'adresse électronique&nbsp;: il n'est alors pas nécessaire de saisir une deuxième fois l'adresse électronique.</p>
+    <p>L'adresse électronique sert pour les élèves à recevoir des courriels de la part des professeurs et colleurs. Pour les colleurs et professeurs, cela permet de recevoir et d'envoyer des courriels via ce Cahier de Prépa.</p>
     <h4>Modification des paramètres de connexion</h4>
     <p>Votre identifiant est initialement de la forme &laquo;&nbsp;jdupont&nbsp;&raquo;. Vous pouvez le modifier, à condition de ne pas demander un identifiant déjà existant dans la base.</p>
     <p>Si l'on souhaite modifier le mot de passe, il faut le saisir deux fois afin d'éviter les fautes de frappes.</p>
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/README.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/README.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/README.php	2014-07-29 13:38:14.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/README.php	2015-10-27 15:08:28.485048620 +0100
@@ -5,7 +5,9 @@
 les élèves, et dédiés aux CPGE.
 
 Pour installer ce logiciel, vous devez commencer par éditer le fichier de
-configuration config.php et suivre les instructions qui y sont écrites.
+configuration config.php. Une fois le répertoire entier (ou une copie) placé dans
+un répertoire accessible par un navigateur, connectez-vous dessus et suivez
+simplement les instructions.
 
 Plus d'informations sont disponibles sur <http://cahier-de-prepa.fr>.
 
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/rss.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/rss.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/rss.php	2015-09-23 23:36:04.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/rss.php	2015-10-27 12:08:02.251942203 +0100
@@ -20,7 +20,6 @@
   </article>
 
 <?php
-
 $mysqli->close();
 fin(false,false);
 ?>
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/utilisateurs.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/utilisateurs.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/utilisateurs.php	2015-09-20 22:15:52.000000000 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.1.0/utilisateurs.php	2015-10-27 14:24:28.576067636 +0100
@@ -48,7 +48,7 @@
 $autorisations = array(1=>'Invité',2=>'Élève',3=>'Colleur',4=>'Professeur');
 
 // Récupération des demandes à valider
-$resultat = $mysqli->query('SELECT id, IF(LENGTH(mail),SUBSTR(mail,2),"Pas de mail") AS mail, autorisation, CONCAT( nom, \' \', prenom ) AS nom
+$resultat = $mysqli->query('SELECT id, IF(LENGTH(mail),SUBSTR(mail,2),"Pas d\'adresse") AS mail, autorisation, CONCAT( nom, \' \', prenom ) AS nom
                             FROM utilisateurs WHERE LENGTH(mdp)=41 ORDER BY IF(LENGTH(nom),CONCAT(nom,prenom),login)');
 if ( $n = $resultat->num_rows )  {
   $n = ( $n > 1 ) ? "$n comptes" : "1 compte";
@@ -59,7 +59,7 @@
 }
 
 // Récupération des invitations non répondues
-$resultat = $mysqli->query('SELECT id, IF(LENGTH(mail),mail,"Pas de mail") AS mail, autorisation, CONCAT( nom, \' \', prenom ) AS nom
+$resultat = $mysqli->query('SELECT id, IF(LENGTH(mail),mail,"Pas d\'adresse") AS mail, autorisation, CONCAT( nom, \' \', prenom ) AS nom
                             FROM utilisateurs WHERE LENGTH(mdp)=1 ORDER BY IF(LENGTH(nom),CONCAT(nom,prenom),login)');
 if ( $n = $resultat->num_rows )  {
   $n = ( $n > 1 ) ? "$n comptes" : "1 compte";
@@ -91,14 +91,14 @@
     }
     echo <<<FIN
         <tr><th colspan="5">$t (${n[$a]})</th></tr>
-        <tr><th>Nom</th><th>Prénom</th><th>Identifiant</th><th>Mail</th><th></th></tr>
+        <tr><th>Nom</th><th>Prénom</th><th>Identifiant</th><th>Adresse électronique</th><th></th></tr>
 
 FIN;
   }
   if ( $a > 1 )
-    echo "<tr><td class=\"editable\" data-id=\"utilisateurs|nom|${r['id']}\">${r['nom']}</td><td class=\"editable\" data-id=\"utilisateurs|prenom|${r['id']}\">${r['prenom']}</td><td>${r['login']}</td><td class=\"editable\" data-id=\"utilisateurs|mail|${r['id']}\">${r['mail']}</td><td data-id=\"utilisateurs|${r['id']}\"><a class=\"icon-supprime\" title=\"Supprimer ce compte\"></a></td></tr>\n";
+    echo "        <tr><td class=\"editable\" data-id=\"utilisateurs|nom|${r['id']}\">${r['nom']}</td><td class=\"editable\" data-id=\"utilisateurs|prenom|${r['id']}\">${r['prenom']}</td><td>${r['login']}</td><td class=\"editable\" data-id=\"utilisateurs|mail|${r['id']}\">${r['mail']}</td><td data-id=\"utilisateurs|${r['id']}\"><a class=\"icon-supprime\" title=\"Supprimer ce compte\"></a></td></tr>\n";
   else
-    echo "<tr><td></td><td></td><td>${r['login']}</td><td></td><td data-id=\"utilisateurs|${r['id']}\"><a class=\"icon-supprime\" title=\"Supprimer ce compte\"></a></td></tr>\n";
+    echo "        <tr><td></td><td></td><td>${r['login']}</td><td></td><td data-id=\"utilisateurs|${r['id']}\"><a class=\"icon-supprime\" title=\"Supprimer ce compte\"></a></td></tr>\n";
 }
 ?>
       </tbody>
@@ -120,7 +120,6 @@
 
 // Aide et formulaire d'ajout
 ?>
-
   <form id="form-ajoute">
     <h3 class="edition">Ajouter de nouveaux utilisateurs</h3>
     <p class="ligne"><label for="autorisation">Type de comptes&nbsp;:</label>
@@ -134,6 +133,7 @@
     <p class="ligne"><label for="matiere">Matière&nbsp;:</label>
       <select name="matiere" id="matiere">
         <option value="0">Toutes matières</option><?php echo $select_matieres; ?>
+
       </select>
     </p>
     <p class="ligne"><label for="utilisateurs">Comptes à créer&nbsp;:</label></p>
@@ -141,12 +141,12 @@
     <ul>
       <li>Un utilisateur par ligne</li>
       <li>Uniquement des utilisateurs de même type à chaque envoi</li>
-      <li>Pour chaque utilisateur de type élève, colleur ou professeur, deux possibilités :
+      <li>Pour chaque utilisateur de type élève, colleur ou professeur, deux possibilités&nbsp;:
         <ul style="margin: 0;">
-          <li>3 valeurs séparées par des virgules&nbsp;: nom, prénom, mail</li>
+          <li>3 valeurs séparées par des virgules&nbsp;: nom, prénom, adresse électronique</li>
           <li>3 valeurs séparées par des points-virgules&nbsp;: nom, prénom, mot de passe</li>
         </ul>
-        Dans le premier cas, un mail sera envoyé à chaque utilisateur avec un lien pour générer le mot de passe. Dans le second cas, ce sera à vous de communiquer les mots de passe.
+        Dans le premier cas, un courriel sera envoyé à chaque utilisateur avec un lien pour générer le mot de passe. Dans le second cas, ce sera à vous de communiquer les mots de passe.
       </li>
       <li>Pour chaque compte invité, 2 valeurs séparées par des virgules&nbsp;: identifiant, mot de passe</li>
     </ul>
@@ -161,26 +161,66 @@
     </p>
     <input type="hidden" name="creation" value="1">
     <input type="hidden" name="table" value="utilisateurs">
+    <p class="ligne">Pour modifier les associations entre utilisateurs et matières, il faut vous rendre sur la page de <a href="matieres">gestion des matières</a>.</p>
   </form>
   
   <div id="aide-page">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Il est possible ici d'ajouter, de modifier et de supprimer des utilisateurs pouvant se connecter à ce Cahier de Prépa.</p>
+    <p>Les associations entre les utilisateurs et les matières sont à régler dans la page de <a href="matieres">gestion des matières</a>.</p>
+    <p>Les deux boutons généraux permettent de&nbsp;:</p>
+    <ul>
+      <li><span class="icon-ajoute"></span>&nbsp;: ouvrir un formulaire pour ajouter de nouveaux utilisateurs.</li>
+      <li><span class="icon-prefs"></span>&nbsp;: ouvrir un formulaire pour autoriser ou interdire les demandes de création de compte.</li>
+    </ul>
+    <h4>Tableau récapitulatif</h4>
+    <p>Le tableau récapitulatif ci-dessous présente tous les utilisateurs existants, ordonnés par type puis par ordre alphabétique.</p>
+    <p>Les noms, prénoms et adresses électroniques des utilisateurs existants sont directement modifiables en cliquant sur le bouton <span class="icon-edite"></span> et en validant avec le bouton <span class="icon-ok"></span> qui apparaît alors.</p>
+    <p>La modification d'une adresse électronique entraîne l'envoi automatique d'un courriel, à l'adresse modifiée uniquement (pas à l'ancienne adresse). Vous ne serez pas en copie de ce courriel.</p>
+    <p>Les identifiants ne sont pas modifiables ici&nbsp;: l'utilisateur concerné ne pourrait plus se connecter. Chaque utilisateur (y compris vous) peut modifier son propre identifiant sur la page de ses <a href="prefs">préférences</a>.</p>
+    <p>Chaque utilisateur peut être supprimé à l'aide du bouton <span class="icon-supprime"></span> (une confirmation sera demandée). Attention, si vous supprimez votre compte, vous serez rapidement déconnecté et ne pourrez plus vous connecter à nouveau.</p>
+    <p>Attention&nbsp;: lors de la suppression d'un utilisateur (élève, colleur, professeur), les colles le concernant sont automatiquement supprimées. Ne supprimez pas un compte pour le recréer, modifiez-le directement.</p>
+    <p>Il n'est pas possible de changer le type d'un utilisateur (transformer un élève en colleur, etc.).</p>
+    <h4>Types d'utilisateurs</h4>
+    <p>Il existe quatre types d'utilisateurs&nbsp;:</p>
+    <ul>
+      <li>Les <em>professeurs</em> peuvent modifier tout ce qui est réglable dans ce Cahier de Prépa&nbsp;: pages d'informations et informations générales, utilisateurs, groupes d'élèves, matières, planning annuel. Tous les professeurs ont les mêmes droits sur ces catégories (il n'y a pas d'&laquo;&nbsp;administrateur&nbsp;&raquo;). Ils peuvent être associés ou non à une ou plusieurs matières, et pouvoir alors modifier ce qui concerne spécifiquement ces matières&nbsp;: programmes de colles, cahier de texte, documents, notes de colles. Ils peuvent voir l'ensemble des notes de colles mises dans les matières associées, et les récupérer sous forme de fichier xls. Les professeurs peuvent aussi envoyer des courriels à tous les autres utilisateurs.</li>
+      <li>Les <em>colleurs</em> peuvent être associés ou non à une ou plusieurs matières (ils ne peuvent pas modifier leur liste des matières associées). Ils peuvent voir les contenus associés à ces matières et les contenus généraux, sauf les contenus protégés visibles seulement par les professeurs. Ils peuvent mettre des notes dans ces matières et voir leurs notes uniquement. Ils peuvent modifier leur identité. Ils peuvent aussi envoyer des courriels à tous les autres utilisateurs.</li>
+      <li>Les <em>élèves</em> peuvent être associés ou non à une ou plusieurs matières (ils ne peuvent pas modifier leur liste des matières associées). Ils peuvent voir les contenus associés à ces matières et les contenus généraux, sauf les contenus protégés visibles seulement par les colleurs ou les professeurs. Ils peuvent voir leurs notes de colles. Ils peuvent modifier leur identité. Ils ne peuvent pas envoyer de courriels.</li>
+      <li>Les <em>invités</em> sont des comptes prévus pour être éventuellement partagés entre plusieurs personnes. Une fois connecté, il est impossible de changer les paramètres du compte (identifiant, mot de passe, matières associées). Les invités peuvent voir les contenus associés à leurs matières et les contenus généraux marqués comme visibles sans autorisation ou pour tous les connectés.</li>
+    </ul>
   </div>
 
   <div id="aide-ajoute">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet de créer de nouveaux comptes utilisateurs. Il sera validé par un clic sur <span class="icon-ok"></span>, et abandonné (donc supprimé) par un clic sur <span class="icon-ferme"></span>.</p>
+    <p>Il est possible de créer simultanément autant de comptes que l'on le souhaite, mais tous les comptes créés simultanément doivent correspondre à un même type d'utilisateurs (invités, élèves, colleurs, professeurs).</p>
+    <p>Il est possible de restreindre les utilisateurs à une seule matière&nbsp;: ils ne pourront alors consulter que les contenus généraux et ceux de cette matière&nbsp;; pour les colleurs, ils pourront aussi mettre des notes, uniquement dans cette matière&nbsp;; pour les professeurs, ils pourront aussi modifier les propriétés générales du Cahier de Prépa et les contenus de cette matière.</p>
+    <p>L'association à une matière n'est pas définitive&nbsp;: il est possible de modifier (ajouter ou supprimer) les associations entre matières et utilisateurs à tout moment et pour tous les utilisateurs, sur la page de <a href="matieres">gestion des matières</a>. On peut alors notamment associer une deuxième matière à un utilisateur créé et associé à une seule.</p>
+    <p>Les comptes utilisateurs à créer doivent être écrits à raison d'un compte par ligne.</p>
+    <p>À chaque ligne, si les utilisateurs sont de type élèves, colleurs ou professeurs, il y a deux syntaxes possibles&nbsp;:</p>
+    <ul>
+      <li>3 valeurs séparées par des virgules&nbsp;: nom, prénom, adresse électronique. Un courriel d'invitation sera alors envoyé à l'adresse indiquée, avec un lien permettant de générer le mot de passe. L'utilisateur apparaîtra dans une case &laquo;&nbsp;invitations&nbsp;&raquo; dans le tableau récapitulatif. Attention, il ne sera pas possible de modifier cet utilisateur, de lui envoyer un mail ou de lui attribuer une note tant qu'il n'aura pas répondu à l'invitation. Il sera cependant possible de le supprimer.</li>
+      <li>3 valeurs séparées par des points-virgules&nbsp;: nom, prénom, mot de passe. Le compte est alors immédiatement créé et directement utilisable (pour lui envoyer un mail ou de lui attribuer une note par exemple). Il faudra par contre communiquer séparément à la personne concernée son identifiant et son mot de passe.</li>
+    </ul>
+    <p>À chaque ligne, si les utilisateurs sont de type invités, il faut écrire l'identifiant et le mot de passe séparés par une virgule. À vous de communiquer ces données aux personnes à qui vous souhaiter donner l'accès.</p>
+    <h4>Types d'utilisateurs</h4>
+    <p>Il existe quatre types d'utilisateurs&nbsp;:</p>
+    <ul>
+      <li>Les <em>professeurs</em> peuvent modifier tout ce qui est réglable dans ce Cahier de Prépa&nbsp;: pages d'informations et informations générales, utilisateurs, groupes d'élèves, matières, planning annuel. Tous les professeurs ont les mêmes droits sur ces catégories (il n'y a pas d'&laquo;&nbsp;administrateur&nbsp;&raquo;). Ils peuvent être associés ou non à une ou plusieurs matières, et pouvoir alors modifier ce qui concerne spécifiquement ces matières&nbsp;: programmes de colles, cahier de texte, documents, notes de colles. Ils peuvent voir l'ensemble des notes de colles mises dans les matières associées, et les récupérer sous forme de fichier xls. Les professeurs peuvent aussi envoyer des courriels à tous les autres utilisateurs.</li>
+      <li>Les <em>colleurs</em> peuvent être associés ou non à une ou plusieurs matières (ils ne peuvent pas modifier leur liste des matières associées). Ils peuvent voir les contenus associés à ces matières et les contenus généraux, sauf les contenus protégés visibles seulement par les professeurs. Ils peuvent mettre des notes dans ces matières et voir leurs notes uniquement. Ils peuvent modifier leur identité. Ils peuvent aussi envoyer des courriels à tous les autres utilisateurs.</li>
+      <li>Les <em>élèves</em> peuvent être associés ou non à une ou plusieurs matières (ils ne peuvent pas modifier leur liste des matières associées). Ils peuvent voir les contenus associés à ces matières et les contenus généraux, sauf les contenus protégés visibles seulement par les colleurs ou les professeurs. Ils peuvent voir leurs notes de colles. Ils peuvent modifier leur identité. Ils ne peuvent pas envoyer de courriels.</li>
+      <li>Les <em>invités</em> sont des comptes prévus pour être éventuellement partagés entre plusieurs personnes. Une fois connecté, il est impossible de changer les paramètres du compte (identifiant, mot de passe, matières associées). Les invités peuvent voir les contenus associés à leurs matières et les contenus généraux marqués comme visibles sans autorisation ou pour tous les connectés.</li>
+    </ul>
   </div>
   
   <div id="aide-prefs">
     <h3>Aide et explications</h3>
-    <p>À venir bientôt...</p>
+    <p>Ce formulaire permet d'autoriser ou d'interdire les demandes de création de compte. Ces demandes peuvent être réalisées par des utilisateurs non connectés, ayant cliqué sur le bouton <span class="icon-connexion"></span>, puis &laquo;&nbsp;Créer un compte&nbsp;&raquo;. Les demandes existantes sont placées en attente de validation sur cette page. Si tous les élèves et colleurs attendus ont leur compte, il peut être utile de décocher cette case pour éviter les demandes imprévues.</p>
+    <p>Ce formulaire sera validé par un clic sur <span class="icon-ok"></span>, et abandonné par un clic sur <span class="icon-ferme"></span>.</p>
   </div>
 
-
   <p id="log"></p>
-  
 <?php
 
 $mysqli->close();
