diff -u -r cahier-de-prepa2.1.3/admin.php cahier-de-prepa2.2.0/admin.php
--- cahier-de-prepa2.1.3/admin.php	2012-11-16 19:26:20.000000000 +0100
+++ cahier-de-prepa2.2.0/admin.php	2013-01-05 09:42:30.000000000 +0100
@@ -209,7 +209,7 @@
   <script type="text/javascript">
 $( function() {
   $('.item h3').append(' <span>[déplier]</span>');
-  $(".item h3 span").css('cursor','pointer').click( function () {
+  $('.item h3 span').css('cursor','pointer').click( function () {
     $(this).parent().parent().find('.bouton,.ligne,textarea').toggle();
     $(this).text($(this).text() == '[déplier]' ? '[replier]' : '[déplier]');
   });
@@ -217,7 +217,7 @@
 });
   </script>
 
-  <script type="text/javascript" src="js/textarea.js"></script>
+  <script type="text/javascript" src="textarea.js.php"></script>
 
 <?php
 $mysqli->close();
diff -u -r cahier-de-prepa2.1.3/bas.php cahier-de-prepa2.2.0/bas.php
--- cahier-de-prepa2.1.3/bas.php	2012-09-10 19:03:29.000000000 +0200
+++ cahier-de-prepa2.2.0/bas.php	2013-01-04 10:39:25.000000000 +0100
@@ -4,7 +4,7 @@
 $( function() {
   // Pliage des aides de l'interface d'administration
   $('.aide').prepend("<h3 class=\"deplie\">Aide et explications <span>[déplier]</span></h3>");
-  $(".deplie span").css('cursor','pointer').click( function () {
+  $('.deplie span').css('cursor','pointer').click( function () {
     $(this).parent().parent().find('p').toggle();
     $(this).text($(this).text() == '[déplier]' ? '[replier]' : '[déplier]');
   });
diff -u -r cahier-de-prepa2.1.3/cdt.php cahier-de-prepa2.2.0/cdt.php
--- cahier-de-prepa2.1.3/cdt.php	2012-09-13 17:25:17.000000000 +0200
+++ cahier-de-prepa2.2.0/cdt.php	2013-01-05 10:32:59.000000000 +0100
@@ -7,10 +7,11 @@
 // Validation de la requête : matière, n, nb //
 ///////////////////////////////////////////////
 
-// Recherche de la matière concernée
+// Recherche de la matière concernée (sur la partie publique, affichage seulement
+// si existe ; sur l'interface d'administration, affichage sans condition)
 $mysqli = premiere_connexion();
 $mysqli->set_charset('utf8');
-$resultat = $mysqli->query('SELECT id, cle, nom, cdt FROM matieres WHERE cdt');
+$resultat = $mysqli->query('SELECT id, cle, nom, cdt FROM matieres WHERE cdt OR '.var_export($admin,true));
 if ( $resultat->num_rows )  {
   if ( !empty($_REQUEST) )
     while ( $r = $resultat->fetch_assoc() )
@@ -119,8 +120,8 @@
       // Correction évetuelle de n et nb pour que l'entrée soit visible après enregistrement
       $s = array_search($r['id'],$sid);
       if ( ( $s < $m ) || ( $m+$nb <= $s ) )  {
-        echo $n = $r['id'];
-        echo $m = array_search($n,$sid);
+        $n = $r['id'];
+        $m = array_search($n,$sid);
         $nb = 1;
       }
       
@@ -183,6 +184,9 @@
     }
   }
   
+  // Mise à jour des champs 'cdt' dans la table 'matieres' (pour le menu)
+  $mysqli->query('UPDATE matieres SET cdt = IF((SELECT id FROM cdt WHERE matiere = matieres.id AND cache = 0 LIMIT 1),1,0) WHERE cdt < 2');
+    
   // Passage en connexion MySQL en lecture seulement
   $mysqli->close();
   $mysqli = new mysqli($serveur,$base,$mdp,$base);
@@ -446,7 +450,7 @@
   }
   echo <<<FIN
 
-  <script type="text/javascript" src="js/textarea.js"></script>
+  <script type="text/javascript" src="textarea.js.php?m=${matiere['id']}"></script>
   
   <script type="text/javascript">
 
@@ -456,7 +460,7 @@
 $raccourcisjs
 
   $('.titre').append(' <span>[déplier]</span>');
-  $(".titre span").css('cursor','pointer').click( function () {
+  $('.titre span').css('cursor','pointer').click( function () {
     $(this).parent().parent().find('.bouton,.boutons,.ligne,textarea').toggle();
     $(this).text($(this).text() == '[déplier]' ? '[replier]' : '[déplier]');
   });
diff -u -r cahier-de-prepa2.1.3/CHANGELOG.php cahier-de-prepa2.2.0/CHANGELOG.php
--- cahier-de-prepa2.1.3/CHANGELOG.php	2012-11-18 10:27:40.000000000 +0100
+++ cahier-de-prepa2.2.0/CHANGELOG.php	2013-01-11 19:02:45.000000000 +0100
@@ -1,5 +1,5 @@
 <?php exit; ?>
-Version actuelle : 2.1.3 (18/09/12)
+Version actuelle : 2.2.0 (11/01/13)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -43,31 +43,30 @@
         rendant inopérants les boutons de séances du cahier de texte
 2.1.3 18/11/12 Correction de la mise en ordre des documents/répertoires (docs_admin.php)
         Correction de l'erreur 1690 (overflow handling) affectant MySQL 5.5.5 et suivants 
+2.2.0 11/01/13 Nouvelles fonctionnalités :
+        * il n'est plus possible de mettre son utilisateur sans matière
+        * les composantes d'une matière (cahier de texte, programme de colles, documents)
+        sont désactivées par défaut
+        * une matière n'est plus affichée dans le menu si les trois composantes sont désactivées
+        * pages de documents : l'icone de répertoire devient celle d'un répertoire
+        ouvert lorsqu'un répertoire est ouvert
+        * on peut ajouter des liens vers les documents disponibles directement dans l'interface
+        administrative (admin.php, cdp.php, colles.php, index.php)
+        * un avertissement s'affiche pour prévenir la déconnexion et permet la reconnexion
+        sans recharger la page (donc sans perdre les données)
 
 ===================
-To-do list :
-[ 2.2 ] Décembre 2012
- * interdire de mettre son utilsateur sans matière
- * liens vers les documents quand on est sur le cahier de textes
- * décompte en javascript pour avertir de la déconnexion ou bouton pour reconnexion via AJAX sans recharger la page
-   -> bandeau apparaissant en javascript au bout de 10 minutes, disparaissant au bout de 15
- * ne pas afficher une matière dans le menu si les trois composantes sont désactivées
- * icone de rep ouvert si rep ouvert...
 
-[ 2.3 ] Janvier 2013
- * news sur le côté
- * FAQ
-   -> comment ajouter un collègue ou un compte élèves
- * prévenir sur "Mon accueil" si le cahier de texte/le programme de colles est vide
-        pour cette semaine (ou depuis toujours mais affiché)...
- * prévenir sur cdt.php/colles.php du non affichage si non vide, de l'affichage si vide ?
-
-[ 2.5 ] Avril 2013
+[ 2.3 ] Février ou Avril 2013
  * suppression multiple d'informations
  * correction bug infos auto si modification (ex: doc envoyé, l'info auto n'est pas
    modifiée s'il est déplacé/renommé)
+ * news sur le côté
+ * nouvelle gestion des infos automatiques
+ * FAQ
+   -> comment ajouter un collègue ou un compte élèves
 
-[ 3.0 ] 29 août 2013
+[ 3.0 ] Août 2013
  * exportation des données
  * vérification des saisie de texte, ajout automatique de balises <p>, éventuellement
         de balises fermantes oubliées ?, ou simplification de la saisie,
diff -u -r cahier-de-prepa2.1.3/colles.php cahier-de-prepa2.2.0/colles.php
--- cahier-de-prepa2.1.3/colles.php	2012-09-13 17:25:48.000000000 +0200
+++ cahier-de-prepa2.2.0/colles.php	2013-01-03 23:48:08.000000000 +0100
@@ -3,9 +3,11 @@
 define('OK',1);
 include('debut.php');
 
-// Recherche de la matière concernée
+// Recherche de la matière concernée (sur la partie publique, affichage seulement
+// si existe ; sur l'interface d'administration, affichage sans condition)
 $mysqli = premiere_connexion();
-$resultat = $mysqli->query('SELECT id, cle, nom, colles FROM matieres WHERE colles');
+$mysqli->set_charset('utf8');
+$resultat = $mysqli->query('SELECT id, cle, nom, colles FROM matieres WHERE colles OR '.var_export($admin,true));
 if ( $resultat->num_rows )  {
   if ( !empty($_REQUEST) )
     while ( $r = $resultat->fetch_assoc() )
@@ -154,6 +156,9 @@
 
   }
   
+  // Mise à jour des champs 'colles' dans la table 'matieres' (pour le menu)
+  $mysqli->query('UPDATE matieres SET colles = IF((SELECT id FROM colles WHERE matiere = matieres.id AND cache = 0 LIMIT 1),1,0) WHERE colles < 2');
+
   // Passage en connexion MySQL en lecture seulement
   $mysqli->close();
   $mysqli = new mysqli($serveur,$base,$mdp,$base);
@@ -425,7 +430,7 @@
 $mysqli->close();
 
 if ( $admin )
-  echo "  <script type=\"text/javascript\" src=\"js/textarea.js\"></script>\n\n";
+  echo "  <script type=\"text/javascript\" src=\"textarea.js.php?m=${matiere['id']}\"></script>\n\n";
 
 // Bas de page
 include('bas.php');
Only in cahier-de-prepa2.2.0: connect.php
diff -u -r cahier-de-prepa2.1.3/css/print.css cahier-de-prepa2.2.0/css/print.css
--- cahier-de-prepa2.1.3/css/print.css	2012-09-05 16:01:17.000000000 +0200
+++ cahier-de-prepa2.2.0/css/print.css	2012-12-06 00:03:07.000000000 +0100
@@ -4,7 +4,7 @@
 #contenu { width: 100%; font-size: 10pt; }
 
 /* Pas d'affichage pour certains éléments */
-#menu, #prec, #suiv, #bas, #deconnexion, form { display: none; }
+#menu, .prec, .suiv, #bas, #deconnexion, form { display: none; }
 a { color: black; text-decoration: none; }
 
 /* Positionnements principaux */
diff -u -r cahier-de-prepa2.1.3/css/style.css cahier-de-prepa2.2.0/css/style.css
--- cahier-de-prepa2.1.3/css/style.css	2012-09-13 17:28:12.000000000 +0200
+++ cahier-de-prepa2.2.0/css/style.css	2013-01-05 10:40:41.000000000 +0100
@@ -82,7 +82,7 @@
 #deconnexion { text-align: center; margin-bottom: 1em; }
 .aide { padding-top: 0.1em; }
 .bouton { margin: 0 4% 0 10px; float: right; }
-p.boutons, p.ligne, p.symboles { padding: 0; width: 92%; margin: 0.5em 4% 0.2em; }
+#aide_js p, p.boutons, p.ligne, p.symboles { padding: 0; width: 92%; margin: 0.5em 4% 0.2em; }
 input.ligne, textarea { width: 92%; margin: 0.5em 4% 0.2em; }
 p.ligne label { font-weight: 700; vertical-align: sub; }
 p.ligne input, p.ligne select, p.ligne code { width: 60%; float: right; }
@@ -94,3 +94,4 @@
 table#semaines td, table#semaines th, table#utilisateurs td, table#utilisateurs th { width: 33.33%; }
 .timeEntry_control { float: right; margin: 3px 5px 0 0; }
 .datepick-trigger { float: right; margin: 5px 7px 0 0; }
+#message { position: fixed; left: 25%; z-index: 1; background-color: #FFBBBB; }
diff -u -r cahier-de-prepa2.1.3/docs_admin.php cahier-de-prepa2.2.0/docs_admin.php
--- cahier-de-prepa2.1.3/docs_admin.php	2012-11-16 22:36:51.000000000 +0100
+++ cahier-de-prepa2.2.0/docs_admin.php	2013-01-04 14:51:14.000000000 +0100
@@ -356,9 +356,10 @@
 
   // Affichage du répertoire considéré
   $suppr = ( $r['parent'] ) ? "\n$indent    <input type=\"submit\" name=\"supprime\" value=\"Supprimer\" title=\"Supprimer ce répertoire\">" : '';
+  $protection = ( $r['protection'] ) ? ' lock' : '';
   echo "
 $indent<div class=\"rep\">
-$indent  <form action=\"$lien\" method=\"post\"><p class=\"rep\"><img class=\"icone\" src=\"icones/rep${r['protection']}.png\">$suppr
+$indent  <form action=\"$lien\" method=\"post\"><p class=\"rep open$protection\"><img class=\"icone\" src=\"icones/rep-open${r['protection']}.png\">$suppr
 $indent    <input type=\"hidden\" name=\"id\" value=\"$rid\">
 $indent    <a href=\"?rep=$rid\">${r['nom']}</a>${r['vide']}</p></form>";
 
@@ -486,7 +487,7 @@
   echo "\n  <div class=\"item\" id=\"parents\">";
   while ( $r = $resultat->fetch_assoc() )  {
     echo "\n    <a href=\"?rep=${r['id']}\"><img class=\"icone\" src=\"icones/$icone${r['protection']}.png\">${r['nom']}</a>";
-    $icone = 'repopen';
+    $icone = 'rep-open';
   }
   echo "\n  </div>\n";
   $resultat->free();
@@ -568,9 +569,21 @@
   <script type="text/javascript">
 $( function() {
   $('p.rep img').css('cursor','pointer').click( function () {
-    $(this).parent().parent().parent().find('.fic,div.rep').toggle();
+    var p = $(this).parent();
+    p.toggleClass('open');
+    if ( p.is('.open') )  {
+      $(this).attr('src',p.is('.lock') ? 'icones/rep-open-lock.png' : 'icones/rep-open.png');
+      p.parent().parent().children('.fic,div.rep').css('display','block');
+    }
+    else  {
+      $(this).attr('src',p.is('.lock') ? 'icones/rep-lock.png' : 'icones/rep.png');
+      p.parent().parent().children('.fic,div.rep').css('display','none');
+    }
   });
-  $('#contenu > .rep').find('.fic,div.rep').toggle().toggle();
+
+  $('#contenu > div.rep > div.rep').find('p.rep:not(.lock) img').attr('src','icones/rep.png').parent().removeClass('open');
+  $('#contenu > div.rep > div.rep').find('p.rep.lock img').attr('src','icones/rep-lock.png').parent().removeClass('open');
+  $('#contenu > div.rep > div.rep').find('.fic,div.rep').css('display','none');
   $('.fic').find('form').hide();
   $('.fic span').replaceWith(function() { return '<a href="">'+$(this).html()+'</a>'; });
   $('.fic a').click( function () {
diff -u -r cahier-de-prepa2.1.3/docs.php cahier-de-prepa2.2.0/docs.php
--- cahier-de-prepa2.1.3/docs.php	2012-09-01 10:40:11.000000000 +0200
+++ cahier-de-prepa2.2.0/docs.php	2013-01-03 00:00:09.000000000 +0100
@@ -18,13 +18,13 @@
   if ( $r['nbfic'] )
     $indication[] = ( $r['nbfic'] > 1 ) ? "${r['nbfic']} fichiers" : "${r['nbfic']} fichier";
   $indication = ( empty($indication) ) ? '' : ' ('.implode(', ',$indication).')';
-  $protection = ( !$GLOBALS['lecteur'] ) ? "IF(protection,'-lock','')" : '\'\'';
   echo "
 $indent<div class=\"rep\">
-$indent  <p class=\"rep\"><img class=\"icone\" src=\"icones/rep${r['protection']}.png\"><a href=\"?rep=${r['id']}\">${r['nom']}</a>$indication</p>";
+$indent  <p class=\"rep ${r['protection']}\"><img class=\"icone\" src=\"icones/rep-${r['protection']}.png\"><a href=\"?rep=${r['id']}\">${r['nom']}</a>$indication</p>";
 
   // Pas de protection sur ce répertoire, affichage de son contenu
-  if ( !strlen($r['protection']) )  {
+  if ( $r['protection'] != 'lock' )  {
+    $protection = ( !$GLOBALS['lecteur'] ) ? 'IF(protection,\'lock\',\'open\')' : '\'open\'';
     // Sous-répertoires et récursivité
     $resultat = $GLOBALS['mysqli']->query("SELECT id, nom, nbfic, nbrep, $protection AS protection FROM reps WHERE parent = ${r['id']}");
     if ( $resultat->num_rows )  {
@@ -33,6 +33,7 @@
       $resultat->free();
     }
     // Fichiers
+    $protection = ( !$GLOBALS['lecteur'] ) ? 'IF(protection,\'-lock\',\'\')' : '\'\'';
     $resultat = $GLOBALS['mysqli']->query("SELECT id, nom, taille, DATE_FORMAT(upload,'%d/%m/%Y') AS upload, ext, $protection AS protection FROM docs WHERE parent = ${r['id']} AND protection < 2");
     if ( $resultat->num_rows )  {
       while ( $s = $resultat->fetch_assoc() )  {
@@ -164,7 +165,7 @@
   // Gestion de la protection : demande de login si le répertoire affiché est protégé
   if ( $rep['protection'] && !$lecteur )
     include('login_lecture.php');
-  $rep['protection'] = '';
+  $rep['protection'] = 'open';
 
   // Haut de page, menu et message
   include('haut.php');
@@ -187,11 +188,21 @@
 
   <script type="text/javascript">
 $( function() {
-  $('p.rep img').css('cursor','pointer').click( function () {
-    $(this).parent().parent().find('.fic,div.rep').toggle();
+  $('p.rep:not(.lock) img').css('cursor','pointer').click( function () {
+    var p = $(this).parent();
+    p.toggleClass('open');
+    if ( p.is('.open') )  {
+      $(this).attr('src','icones/rep-open.png');
+      p.parent().children('.fic,div.rep').css('display','block');
+    }
+    else  {
+      $(this).attr('src','icones/rep.png');
+      p.parent().children('.fic,div.rep').css('display','none');
+    }
   });
 
-  $('#contenu > .rep').find('.fic,div.rep').toggle().toggle();
+  $('#contenu > div.rep > div.rep').find('p.rep:not(.lock) img').attr('src','icones/rep.png').parent().removeClass('open');
+  $('#contenu > div.rep > div.rep').find('.fic,div.rep').css('display','none');
   $('#contenu > .rep').before('<p>Vous pouvez ouvrir ou fermer des répertoires en cliquant sur leur icone.</p>');
 });
   </script>
diff -u -r cahier-de-prepa2.1.3/haut.php cahier-de-prepa2.2.0/haut.php
--- cahier-de-prepa2.1.3/haut.php	2012-09-13 17:30:08.000000000 +0200
+++ cahier-de-prepa2.2.0/haut.php	2013-01-04 10:18:48.000000000 +0100
@@ -24,6 +24,7 @@
   <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>
+  <script type="text/javascript" src="js/timeout.js"></script>
 
 FIN;
 ?>
@@ -96,7 +97,7 @@
   echo "    <a$actuel href=\"docs\">Documents à télécharger</a>\n  </div>\n";
 
   // Récupération et affichage des matières
-  $resultat = $mysqli->query('SELECT cle, nom, colles, cdt, docs FROM matieres');
+  $resultat = $mysqli->query('SELECT cle, nom, colles, cdt, docs FROM matieres WHERE colles+cdt+docs');
   if ( $resultat->num_rows )  {
     while ( $r = $resultat->fetch_assoc() )  {
       echo "  <div>\n    <h3>${r['nom']}</h3>\n";
Only in cahier-de-prepa2.2.0/icones: rep-open-lock.png
Only in cahier-de-prepa2.1.3/icones: repopen-lock.png
Only in cahier-de-prepa2.2.0/icones: rep-open.png
Only in cahier-de-prepa2.1.3/icones: repopen.png
diff -u -r cahier-de-prepa2.1.3/index.php cahier-de-prepa2.2.0/index.php
--- cahier-de-prepa2.1.3/index.php	2012-09-11 23:41:18.000000000 +0200
+++ cahier-de-prepa2.2.0/index.php	2013-01-03 23:48:43.000000000 +0100
@@ -278,7 +278,7 @@
   else
     echo "  <h2>Il n'y actuellement aucune information enregistrée pour cette page.</h2>\n\n";
 
-  echo "  <script type=\"text/javascript\" src=\"js/textarea.js\"></script>\n\n";
+  echo "  <script type=\"text/javascript\" src=\"textarea.js.php\"></script>\n\n";
 }
 
 // Partie publique
diff -u -r cahier-de-prepa2.1.3/installation.php cahier-de-prepa2.2.0/installation.php
--- cahier-de-prepa2.1.3/installation.php	2012-09-11 23:54:48.000000000 +0200
+++ cahier-de-prepa2.2.0/installation.php	2013-01-01 22:57:02.000000000 +0100
@@ -251,7 +251,7 @@
 
 $code_etape2 = <<<FIN
 TRUNCATE matieres;
-INSERT INTO matieres (id,ordre,cle,nom,colles,cdt,docs) VALUES (1,1,'[cle_matiere]','[nom_matiere]',1,1,0);
+INSERT INTO matieres (id,ordre,cle,nom,colles,cdt,docs) VALUES (1,1,'[cle_matiere]','[nom_matiere]',0,0,0);
 TRUNCATE utilisateurs;
 INSERT INTO utilisateurs (nom,mdp,matiere) VALUES ('[utilisateur]',SHA1('[mot_de_passe]'),1);
 FIN;
Only in cahier-de-prepa2.1.3/js: textarea.js
Only in cahier-de-prepa2.2.0/js: timeout.js
diff -u -r cahier-de-prepa2.1.3/login_admin.php cahier-de-prepa2.2.0/login_admin.php
--- cahier-de-prepa2.1.3/login_admin.php	2012-08-28 22:30:38.000000000 +0200
+++ cahier-de-prepa2.2.0/login_admin.php	2013-01-11 16:13:49.000000000 +0100
@@ -48,7 +48,7 @@
     // Vérification du répertoire de sauvegarde des données MySQL
     if ( !is_dir('sauvegarde') || !is_executable('sauvegarde') || !is_writable('sauvegarde') )
       $message = 'Attention, le répertoire de sauvegarde n\'est pas accessible&nbsp;: cela signifie que les données ne pourront pas être sauvegardées périodiquement comme prévu, et qu\'aucune protection n\'est en fonctionnement pour prévenir un accident.';
-      
+
     // Retour au script appelant
     return;
   }
@@ -56,6 +56,10 @@
     $message = 'Ce login/mot de passe n\'est pas correct&nbsp;!';
 }
 
+// Retour au script appelé par AJAX si c'est le cas (pas d'HTML)
+if ( defined('AJAX') )
+  exit(json_encode(array('etat'=>0)));
+
 // Message par défaut
 if ( !isset($message) )
   $message = "Vous devez vous identifier pour accéder à cette partie du site.";
diff -u -r cahier-de-prepa2.1.3/matieres.php cahier-de-prepa2.2.0/matieres.php
--- cahier-de-prepa2.1.3/matieres.php	2012-09-13 19:26:26.000000000 +0200
+++ cahier-de-prepa2.2.0/matieres.php	2013-01-01 23:22:08.000000000 +0100
@@ -24,19 +24,21 @@
       // Validation des données envoyées
       $cle = $mysqli->real_escape_string($_REQUEST['cle']);
       $nom = $mysqli->real_escape_string($_REQUEST['nom']);
-      $colles = ( is_numeric($_REQUEST['colles']) ) ? $_REQUEST['colles'] : 0;
-      $cdt = ( is_numeric($_REQUEST['cdt']) ) ? $_REQUEST['cdt'] : 0;
       // Si identifiant numérique, modification d'une matière existante
       if ( is_numeric($id = $_REQUEST['id']) )  {
+        $colles = ( isset($_REQUEST['colles']) ) ? ', colles = 2' : ", colles = IF((SELECT id FROM colles WHERE matiere = $id AND cache = 0 LIMIT 1),1,0)";
+        $cdt = ( isset($_REQUEST['cdt']) ) ? ', cdt = 2' : ", cdt = IF((SELECT id FROM cdt WHERE matiere = $id AND cache = 0 LIMIT 1),1,0)";
         // Sauvegarde de la table contenant les données
         sauvegarde_mysql('reps');
-        $message = ( $mysqli->query("UPDATE matieres SET cle = '$cle', nom = '$nom', colles = $colles, cdt = $cdt WHERE id = $id")
+        $message = ( $mysqli->query("UPDATE matieres SET cle = '$cle', nom = '$nom'$colles$cdt WHERE id = $id")
                   && $mysqli->query("UPDATE reps SET nom = '$nom' WHERE matiere = $id AND parent = 0")
         ) ? 'La matière «&nbsp;'.stripslashes($nom).'&nbsp;» a bien été modifiée.' : 'La matière «&nbsp;'.stripslashes($nom).'&nbsp;» n\'a pas pu être modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
       }
       // Si id = '', ajout d'une nouvelle matière
-      else
-        $message = ( $mysqli->query("INSERT INTO matieres SET cle = '$cle', nom = '$nom', colles = $colles, cdt = $cdt, docs = 0, ordre = ((SELECT MAX(m.ordre) FROM matieres AS m)+1)")
+      else  {
+        $colles = ( isset($_REQUEST['colles']) ) ? 2 : 0;
+        $cdt = ( isset($_REQUEST['cdt']) ) ? 2 : 0;
+        $message = ( $mysqli->query("INSERT INTO matieres SET cle = '$cle', nom = '$nom', colles = '$colles', cdt = '$cdt', docs = 0, ordre = ((SELECT MAX(m.ordre) FROM matieres AS m)+1)")
                   && ( $id = $mysqli->insert_id )
                   && $mysqli->query("INSERT INTO reps SET parent = 0, parents = 0, nom = '$nom', matiere = $id, nbrep = 0, nbfic = 0, protection = 0")
                   && $mysqli->query("INSERT INTO `cdt-types` (`matiere`, `ordre`, `cle`, `titre`, `h_fin`) VALUES
@@ -48,6 +50,7 @@
                                                              ($id, 6, 'distributions', 'Distribution de document', 0),
                                                              ($id, 7, 'DM', 'Devoir maison', 0)")
         ) ? 'La matière «&nbsp;'.stripslashes($nom).'&nbsp;» a bien été ajoutée.' : 'La matière «&nbsp;'.stripslashes($nom).'&nbsp;» n\'a pas pu être ajoutée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
+      }
     }
   }
 
@@ -132,8 +135,6 @@
 
 // Fonction d'affichage
 function affichage($r)  {
-  $colles = str_replace("${r['colles']}\"","${r['colles']}\" selected",'<option value="0">Ne pas afficher</option><option value="1">Afficher sans mot de passe</option><option value="2">Afficher avec mot de passe</option>');
-  $cdt = str_replace("${r['cdt']}\"","${r['cdt']}\" selected",'<option value="0">Ne pas afficher</option><option value="1">Afficher sans mot de passe</option><option value="2">Afficher avec mot de passe</option>');
   if ( $id = $r['id'] )  {
     $debut = "Matière n°${r['ordre']}";
     $valide1 = '';
@@ -155,12 +156,8 @@
     </p>
     <p class="ligne"><label for="nom$id">Nom complet&nbsp;: </label><input type="text" id="nom$id" name="nom" value="${r['nom']}" size="50"></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"></p>
-    <p class="ligne"><label for="colles$id">Programme de colles</label>
-      <select id="colles$id" name="colles">$colles</select>
-    </p>
-    <p class="ligne"><label for="cdt$id">Cahier de texte</label>
-      <select id="cdt$id" name="cdt">$cdt</select>
-    </p>
+    <p class="ligne"><label for="colles$id">Affichage du programme de colle avec mot de passe</label><input type="checkbox" id="colles$id" name="colles" value="1"${r['colles']}></p>
+    <p class="ligne"><label for="cdt$id">Affichage du cahier de texte avec mot de passe</label><input type="checkbox" id="cdt$id" name="cdt" value="1"${r['cdt']}></p>
     <input type="hidden" name="id" value="$id">
   </form>
   </div>
@@ -170,7 +167,7 @@
 }
 
 // Formulaire vide pour une nouvelle matière et aide générale
-affichage(array('id' => '', 'ordre' => 0, 'cle' => 'cle_de_la_matiere', 'nom' => 'Nom de la matière', 'colles' => 1, 'cdt' => 1, 'docs' => 0 ));
+affichage(array('id' => '', 'ordre' => 0, 'cle' => 'cle_de_la_matiere', 'nom' => 'Nom de la matière', 'colles' => '', 'cdt' => ''));
 ?>
 
   <div class="item aide">
@@ -178,7 +175,8 @@
     <p>Supprimer une matière supprime automatiquement toutes les entrées du cahier de texte, tous les programmes de colles, tous les répertoires et documents qui s'y rapportent. Une confirmation est demandée avant la suppression.</p>
     <p>Le <em>nom complet</em> de la matière est ce qui est affiché, à la fois dans les titres des pages et dans le menu.</p>
     <p>La <em>clé</em> est un mot-clé qui sera utilisé uniquement dans l'adresse des pages relié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;»...</p>
-    <p>Vous pouvez aussi définir si le cahier de texte et les programmes de colles sont visible ou non, ou accessible uniquement par les utilisateurs qui auront donné un mot de passe. Les utilisateurs et leur mot de passe sont modifiables <a href="utilisateurs<?php echo str_replace('&amp;','?',$urladmin); ?>">ici</a>. Les pages de documents sont disponibles automatiquement, uniquement si des documents sont à télécharger.</p>
+    <p>Vous pouvez aussi définir si un nom d'utilisateur et un mot de passe sont nécessaire pour lire le cahier de texte et les programmes de colles. Les utilisateurs et leur mot de passe sont modifiables <a href="utilisateurs<?php echo str_replace('&amp;','?',$urladmin); ?>">ici</a>. Le réglage équivalent pour les documents se fait répertoire par répertoire.</p>
+    <p>Le cahier de texte, les programmes de colles et les documents sont affichés dans le menu automatiquement, uniquement lorsque des entrées correspondantes ont été faites.</p>
   </div>
 
 <?php
@@ -187,7 +185,7 @@
 $resultat = $mysqli->query('SELECT max(ordre) FROM matieres');
 $r = $resultat->fetch_row();
 $max = $r[0];
-$resultat = $mysqli->query('SELECT id, ordre, cle, nom, colles, cdt, docs FROM matieres');
+$resultat = $mysqli->query('SELECT id, ordre, cle, nom, IF(colles=2,\' checked\',\'\') AS colles, IF(cdt=2,\' checked\',\'\') AS cdt FROM matieres');
 $mysqli->close();
 while ( $r = $resultat->fetch_assoc() )
   affichage($r);
Only in cahier-de-prepa2.2.0: textarea.js.php
diff -u -r cahier-de-prepa2.1.3/utilisateurs.php cahier-de-prepa2.2.0/utilisateurs.php
--- cahier-de-prepa2.1.3/utilisateurs.php	2012-11-16 22:40:10.000000000 +0100
+++ cahier-de-prepa2.2.0/utilisateurs.php	2012-12-26 20:06:10.000000000 +0100
@@ -69,8 +69,11 @@
       // Validation des données envoyées
       $nom = $mysqli->real_escape_string($nom);
       if ( !is_numeric($matiere = $_REQUEST['matiere']) )  $matiere = 0;
+      // Impossible de supprimer la matière de son propre utilisateur
+      if ( !$matiere && ( $utilisateurs[$id] == $_SESSION['user'] ) )
+        $message = 'Il est impossible de supprimer la matière associé à votre compte, car cela le transformerait en simple lecteur des pages protégées sur la partie publique&nbsp;: vous n\'auriez plus accès à cette interface d\'administration. demander à un collègue de faire cela si besoin.'
       // Envoi MySQL
-      if ( $mysqli->query("UPDATE utilisateurs SET nom = '$nom', matiere = ( SELECT SUM(id*IF(id=$matiere,1,0)) FROM matieres ) WHERE id = $id") )  {
+      elseif ( $mysqli->query("UPDATE utilisateurs SET nom = '$nom', matiere = ( SELECT SUM(id*IF(id=$matiere,1,0)) FROM matieres ) WHERE id = $id") )  {
         // Si on modifie son propre utilisateur, modification des données de session
         if ( $utilisateurs[$id] == $_SESSION['user'] )  {
           $SESSION['user'] = $nom;
@@ -80,7 +83,7 @@
             $_SESSION['mat'] = $r[0];
           }
           else  $matiere = 0;
-          $message = ( $matiere ) ? "Les données de l'utilisateur «&nbsp;${utilisateurs[$id]}&nbsp;» ont bien été modifiées." : 'Les données de votre compte utilisateur ont bien été modifiées. Attention, vous venez de le transformer en simple lecteur des pages protégées sur la partie publique&nbsp;: vous n\'aurez plus accès à cette interface d\'administration à votre prochaine connexion... Vous pouvez changer cela tant que vous ne vous déconnectez pas.';
+          $message = "Les données de l'utilisateur «&nbsp;${utilisateurs[$id]}&nbsp;» ont bien été modifiées.";
         }
         else
           $message = 'Les données votre compte utilisateur ont bien été modifiées.';
