diff -urN cahier-de-prepa3.0.1/CHANGELOG.php cahier-de-prepa3.0.2/CHANGELOG.php
--- cahier-de-prepa3.0.1/CHANGELOG.php	2013-08-27 08:55:20.623000630 +0200
+++ cahier-de-prepa3.0.2/CHANGELOG.php	2013-08-27 22:24:32.016554280 +0200
@@ -1,5 +1,4 @@
-<?php exit; ?>
-Version actuelle : 3.0.1 (27/08/13)
+Version actuelle : 3.0.2 (28/08/13)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -72,6 +71,10 @@
         dans le code SQL dans installation.php.
         Correction d'un problème de définition de la table recents dans installation.php et
         MAJSQL.sql. Ajout d'une balise link pour le flux RSS dans haut.php (merci A. Carrade).
+3.0.2 28/08/13 Correction d'un bug faisant apparaître, dans l'interface d'administration, comme
+        vides les répertoires ne contenant que des documents non visibles, dans docs.php ;
+        modification de la table reps dans installation.php et MAJSQL.php (merci PH Jondot).
+        Suppression du exit de CHANGELOG.php
 
 ===================
 
@@ -90,6 +93,7 @@
 [ 4.0 ] Août 2014
  * gestion des informations récentes : choix des notifications, suppressions/modifications
  * accès protégé hors élèves (profs et colleurs)
+ * programmes de colles en pdf : gestion spéciale
  * choix du regroupement des colles, par semaine ou quinzaine
  * gestion des sauvegardes automatiques : élimination des anciennes, exportation
  * paramétrage des styles pour les titres, des couleurs
diff -urN cahier-de-prepa3.0.1/docs.php cahier-de-prepa3.0.2/docs.php
--- cahier-de-prepa3.0.1/docs.php	2013-08-27 08:25:32.566943412 +0200
+++ cahier-de-prepa3.0.2/docs.php	2013-08-27 22:15:51.700537630 +0200
@@ -44,7 +44,7 @@
   $mysqli->set_charset('utf8');
 
   // Récupération des données du répertoire
-  $resultat = $mysqli->query("SELECT nom, parent, protection, nbrep+nbfic AS nb FROM reps WHERE id = $rid");
+  $resultat = $mysqli->query("SELECT nom, parent, protection, nbrep+nbdoc_v+nbdoc_nv AS nb FROM reps WHERE id = $rid");
   $rep = $resultat->fetch_assoc();
   $resultat->free();
 
@@ -116,14 +116,14 @@
   elseif ( isset($_REQUEST['cree']) && ( strlen($_REQUEST['nom']) ) )  {
     $nom = $mysqli->real_escape_string($_REQUEST['nom']);
     $protection = isset($_REQUEST['protection']) ? 1 : 0;
-    $message = ( $mysqli->query("INSERT INTO reps SET parent = $rid, parents = '${parents[$rid]},$rid', nom = '$nom', matiere = (SELECT r.matiere FROM reps AS r WHERE r.id = $rid), nbrep = 0, nbfic = 0, protection = $protection")
+    $message = ( $mysqli->query("INSERT INTO reps SET parent = $rid, parents = '${parents[$rid]},$rid', nom = '$nom', matiere = (SELECT r.matiere FROM reps AS r WHERE r.id = $rid), nbrep = 0, nbdoc_v = 0, nbdoc_nv = 0, protection = $protection")
               && $mysqli->query("UPDATE reps SET nbrep = (nbrep + 1) WHERE id = $rid")
               && $mysqli->query('ALTER TABLE reps ORDER BY parents,nom')
     ) ? 'Le répertoire <em>'.stripslashes($nom).'</em> a bien été créé.' : 'Le répertoire <em>'.stripslashes($nom).'</em> n\'a pas pu être créé. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'».';
   }
 
   // Mise à jour des champs 'docs' dans la table 'matieres' (pour le menu)
-  $mysqli->query('UPDATE matieres SET docs = (SELECT IF(SUM(nbfic),1,0) FROM reps WHERE matiere = matieres.id)');
+  $mysqli->query('UPDATE matieres SET docs = (SELECT IF(SUM(nbdoc_v),1,0) FROM reps WHERE matiere = matieres.id)');
   // Passage en connexion MySQL en lecture seulement
   $mysqli->close();
   $mysqli = new mysqli($serveur,$base,$mdp,$base);
@@ -179,10 +179,12 @@
       // Modification de l'accès
       // Si $protection = 2, on enlève un document du répertoire parent ; sinon on ajoute
       $protection = ( in_array($_REQUEST['protection'],array(0,1,2)) ) ? $_REQUEST['protection'] : 0;
-      if ( $protection != $doc['protection'] )
-        $message .= ( $mysqli->query("UPDATE docs SET protection = $protection WHERE id = $id")
-                   && $mysqli->query("UPDATE reps SET nbfic = (nbfic + FLOOR(${doc['protection']}/2) - FLOOR($protection/2)) WHERE id = ${doc['parent']}") 
+      if ( $protection != $doc['protection'] )  {
+         $a = ($protection==2) - ($doc['protection']==2);
+         $message .= ( $mysqli->query("UPDATE docs SET protection = $protection WHERE id = $id")
+                   && $mysqli->query("UPDATE reps SET nbdoc_v = (nbdoc_v - ($a)), nbdoc_nv = (nbdoc_nv + ($a)) WHERE id = ${doc['parent']}") 
         ) ? " L'accès au document <em>${doc['nom']}</em> a bien été modifié." : " L'accès au document <em>${doc['nom']}</em> n'a pas pu être modifié. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
+      }
 
       // Déplacement dans un autre répertoire
       if ( is_numeric($parent = $_REQUEST['parent']) && ( $parent != $doc['parent'] ) )  {
@@ -192,10 +194,9 @@
           $resultat->free();
           if ( $mysqli->query("UPDATE docs SET parent = '$parent', parents = '${r['parents']},$parent',
                                matiere = ${r['matiere']} WHERE id = $id") )  {
-            if ( $protection < 2 )  {
-              $mysqli->query("UPDATE reps SET nbfic = (nbfic -1) WHERE id = ${doc['parent']}");
-              $mysqli->query("UPDATE reps SET nbfic = (nbfic + 1) WHERE id = $parent");
-            }
+            $champ = ( $protection < 2 ) ? 'nbdoc_v' : 'nbdoc_nv';
+            $mysqli->query("UPDATE reps SET $champ = ($champ -1) WHERE id = ${doc['parent']}");
+            $mysqli->query("UPDATE reps SET $champ = ($champ + 1) WHERE id = $parent");
             $mysqli->query('ALTER TABLE docs ORDER BY parents,nom');
             $message .= " Le document <em>${doc['nom']}</em> a bien été déplacé.";
           }
@@ -236,11 +237,10 @@
       // Suppression physique
       exec("rm -rf documents/${doc['lien']}");
       // Mise à jour du répertoire
-      if ( $doc['protection'] < 2 )  {
-        $mysqli->query("UPDATE reps SET nbfic = (nbfic - 1) WHERE id = ${doc['parent']}");
-        // Suppression de l'éventuelle information récente
-        recent($mysqli,3,$id);
-      }
+      $champ = ( $doc['protection'] < 2 ) ? 'nbdoc_v' : 'nbdoc_nv';
+      $mysqli->query("UPDATE reps SET $champ = ($champ - 1) WHERE id = ${doc['parent']}");
+      // Suppression de l'éventuelle information récente
+      recent($mysqli,3,$id);
     }
     else
       $message = "Le document <em>${doc['nom']}</em> n'a pas pu être supprimé. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'».';
@@ -305,11 +305,11 @@
         $id = $mysqli->insert_id;
         $mysqli->query('ALTER TABLE docs ORDER BY parents,nom');
         $message = "Le document <em>$nom</em> a bien été mis en ligne.";
-        // Si le document est visible
+        // Mise à jour du répertoire
+        $champ = ( $protection < 2 ) ? 'nbdoc_v' : 'nbdoc_nv';
+        $mysqli->query("UPDATE reps SET $champ = ($champ + 1) WHERE id = $rid");
+        // Si le document est visible, ajout d'un information récente
         if ( $protection < 2 )  {
-          // Mise à jour du répertoire
-          $mysqli->query("UPDATE reps SET nbfic = (nbfic + 1) WHERE id = $rid");
-          // Ajout d'une information récente
           $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path
                                       FROM docs LEFT JOIN reps ON FIND_IN_SET(reps.id,docs.parents) WHERE docs.id = $id");
           $r = $resultat->fetch_assoc();
@@ -329,7 +329,7 @@
   }
   
   // Mise à jour des champs 'docs' dans la table 'matieres' (pour le menu)
-  $mysqli->query('UPDATE matieres SET docs = (SELECT IF(nbfic+nbrep,1,0) FROM reps WHERE parent=0 AND matiere = matieres.id)');
+  $mysqli->query('UPDATE matieres SET docs = (SELECT IF(SUM(nbdoc_v),1,0) FROM reps WHERE matiere = matieres.id)');
     
   // Passage en connexion MySQL en lecture seulement
   $mysqli->close();
@@ -356,7 +356,7 @@
 }
 
 // Récupération des données, vérification de la protection, répertoires parents
-$resultat = $mysqli->query("SELECT r.nom, r.parent, r.parents, r.nbrep + r.nbfic AS nb, r.protection, m.cle, m.nom AS mat
+$resultat = $mysqli->query('SELECT r.nom, r.parent, r.parents, r.nbrep + r.nbdoc_v'.( ($admin) ? ' + r.nbdoc_nv' : '' )." AS nb, r.protection, m.cle, m.nom AS mat
                             FROM reps AS r LEFT JOIN matieres AS m ON r.matiere = m.id
                             WHERE r.id = $rid");
 if ( $resultat->num_rows )  {
@@ -396,13 +396,13 @@
       $indent = str_pad('',2*$n);
 
       // Sous-répertoires et récursivité
-      $resultat = $mysqli->query("SELECT id, nom, nbrep, nbfic, protection FROM reps WHERE parent = $rid");
+      $resultat = $mysqli->query('SELECT id, nom, nbrep, nbdoc_v'.( ($admin) ? ' + nbdoc_nv' : '' )." AS nbdoc, protection FROM reps WHERE parent = $rid");
       if ( $resultat->num_rows )  {
         while ( $r = $resultat->fetch_assoc() )  {
           // Affichage du contenu si pas de protection ou utilisateur identifié
           if ( ( !$r['protection'] ) || $lecteur || $admin )  {
-            if ( $r['nbrep']+$r['nbfic'] )
-              $contenu = str_replace(array('0 répertoire,',', 0 document'),'',"(${r['nbrep']} répertoire".( ( $r['nbrep'] > 1 ) ? 's' : '' ).", ${r['nbfic']} document".( ( $r['nbfic'] > 1 ) ? 's' : '' ).')');
+            if ( $r['nbrep']+$r['nbdoc'] )
+              $contenu = str_replace(array('0 répertoire,',', 0 document'),'',"(${r['nbrep']} répertoire".( ( $r['nbrep'] > 1 ) ? 's' : '' ).", ${r['nbdoc']} document".( ( $r['nbdoc'] > 1 ) ? 's' : '' ).')');
             else
               $contenu = '(vide)';
             $s = ( $admin && $r['protection'] ) ? '<p class="rep open lock"><img class="icone" src="icones/rep-open-lock.png">' : '<p class="rep open"><img class="icone" src="icones/rep-open.png">';
diff -urN cahier-de-prepa3.0.1/index.php cahier-de-prepa3.0.2/index.php
--- cahier-de-prepa3.0.1/index.php	2013-08-27 08:29:28.658950967 +0200
+++ cahier-de-prepa3.0.2/index.php	2013-08-28 08:40:37.881737193 +0200
@@ -247,19 +247,19 @@
       $monte = ( $r['ordre'] == 1 ) ? '' : "\n      <input type=\"submit\" name=\"monte\" value=\"&uarr;\" title=\"Remonter l'information dans l'ordre d'apparition\">";
       $descend = ( $r['ordre'] == $max ) ? '' : "\n      <input type=\"submit\" name=\"descend\" value=\"&darr;\" title=\"Descendre l'information dans l'ordre d'apparition\">";
       if ( $r['cache'] )  {
-        $debut .= ' (information non diffusée sur la partie publique)';
+        $diff = ' (information non diffusée sur la partie publique)';
         $cache_classe = ' cache';
         $cache = "\n      <input type=\"submit\" name=\"montre\" value=\"Montrer\" title=\"Diffuser l'information, la rendre visible sur la partie publique\">";
       }
       else  {
-        $cache_classe = '';
+        $cache_classe = $diff = '';
         $cache = "\n      <input type=\"submit\" name=\"cache\" value=\"Cacher\" title=\"Ne plus diffuser l'information, la rendre invisible sur la partie publique\">";
       }
       echo <<<FIN
 
   <div class="item admin$cache_classe">
   <form action="?$p$urladmin" method="post">
-    <h3>Information n°${r['ordre']}&nbsp;: ${r['titre']}</h3>
+    <h3>Information n°${r['ordre']}&nbsp;: ${r['titre']}$diff</h3>
     <p class="boutons">
       <input type="submit" name="modifie" value="Valider" title="Valider les modifications sur le titre ou le texte">$monte$descend$cache
       <input type="submit" name="supprime" value="Supprimer" title="Supprimer l'information">
diff -urN cahier-de-prepa3.0.1/installation.php cahier-de-prepa3.0.2/installation.php
--- cahier-de-prepa3.0.1/installation.php	2013-08-27 08:27:21.630946902 +0200
+++ cahier-de-prepa3.0.2/installation.php	2013-08-28 15:28:12.146519732 +0200
@@ -225,8 +225,9 @@
   `parents` varchar(50) NOT NULL,
   `matiere` tinyint(2) unsigned NOT NULL,
   `nom` varchar(100) NOT NULL,
-  `nbfic` tinyint(2) unsigned NOT NULL,
   `nbrep` tinyint(2) unsigned NOT NULL,
+  `nbdoc_v` tinyint(2) unsigned NOT NULL,
+  `nbdoc_nv` tinyint(2) unsigned NOT NULL,
   `protection` tinyint(1) unsigned NOT NULL,
   KEY `parent` (`parent`),
   KEY `matiere` (`matiere`)
@@ -269,9 +270,9 @@
 $l = addslashes($lycee);
 $code_etape3 = <<<FIN
 TRUNCATE reps;
-INSERT INTO reps (id,parent,parents,matiere,nom,nbfic,nbrep,protection)
- VALUES (1, 0, '0', 0, 'Général', 0, 0, 0),
-        (2, 0, '0', 1, (SELECT nom FROM matieres WHERE id = 1), 0, 0, 0);
+INSERT INTO reps (id,parent,parents,matiere,nom,nbdoc_v,nbdoc_nv,nbrep,protection)
+ VALUES (1, 0, '0', 0, 'Général', 0, 0, 0, 0),
+        (2, 0, '0', 1, (SELECT nom FROM matieres WHERE id = 1), 0, 0, 0, 0);
 TRUNCATE pages;
 INSERT INTO pages (ordre,cle,nom,titre,bandeau,protection)
   VALUES (1,'accueil','Accueil','La classe $c du lycée $l','Dernières informations importantes',0);
diff -urN cahier-de-prepa3.0.1/MAJSQL.sql cahier-de-prepa3.0.2/MAJSQL.sql
--- cahier-de-prepa3.0.1/MAJSQL.sql	2013-08-27 08:27:07.206946440 +0200
+++ cahier-de-prepa3.0.2/MAJSQL.sql	2013-08-28 09:05:07.693784227 +0200
@@ -18,8 +18,24 @@
 CREATE TABLE recents (
   id smallint(5) unsigned NOT NULL PRIMARY KEY,
   heure datetime NOT NULL,
-  titre varchar(200) NOT NULL,
+  titre varchar(50) NOT NULL,
   lien varchar(20) NOT NULL,
   texte text NOT NULL,
   KEY heure (heure)
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
+
+-- 
+-- Voilà les modifications à effectuer sur chaque base pour passer de Cahier de
+-- Prépa 3.0.0 à Cahier de Prépa 3.0.1.
+-- 
+
+ALTER TABLE recents CHANGE titre titre VARCHAR( 200 ) NOT NULL;
+
+-- 
+-- Voilà les modifications à effectuer sur chaque base pour passer de Cahier de
+-- Prépa 3.0.1 à Cahier de Prépa 3.0.2.
+-- 
+
+ALTER TABLE reps CHANGE nbfic nbdoc_v TINYINT( 2 ) UNSIGNED NOT NULL;
+ALTER TABLE reps ADD nbdoc_nv TINYINT( 2 ) UNSIGNED NOT NULL;
+UPDATE reps SET nbdoc_nv = ( SELECT COUNT(docs.id) FROM docs WHERE docs.parent = reps.id AND docs.protection = 2 );
diff -urN cahier-de-prepa3.0.1/matieres.php cahier-de-prepa3.0.2/matieres.php
--- cahier-de-prepa3.0.1/matieres.php	2013-08-21 01:36:07.845568474 +0200
+++ cahier-de-prepa3.0.2/matieres.php	2013-08-30 21:13:10.300711697 +0200
@@ -50,7 +50,7 @@
         $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 reps SET parent = 0, parents = 0, nom = '$nom', matiere = $id, nbrep = 0, nbdoc_v = 0, nbdoc_nv = 0, protection = 0")
                   && $mysqli->query("INSERT INTO `cdt-types` (matiere, ordre, cle, titre, h_fin) VALUES
                                                              ($id, 1, 'cours', 'Cours', 1),
                                                              ($id, 2, 'TD', 'Séance de travaux dirigés', 1),
@@ -151,7 +151,7 @@
   else  {
     $debut = 'Nouvelle matière';
     $valide1 = "\n    <input class=\"bouton\" type=\"submit\" name=\"modifie\" value=\"Valider\" title=\"Valider les modifications\">";
-    $valide = $monte = $descend = $suppr = '';
+    $valide = $monte = $descend = $suppr = $indication = '';
   }
   echo <<<FIN
   <div class="item admin">
diff -urN cahier-de-prepa3.0.1/textarea.js.php cahier-de-prepa3.0.2/textarea.js.php
--- cahier-de-prepa3.0.1/textarea.js.php	2013-01-11 17:18:37.000000000 +0100
+++ cahier-de-prepa3.0.2/textarea.js.php	2013-08-30 21:10:07.096705834 +0200
@@ -12,7 +12,7 @@
 // Récupération des répertoires, avec le chemin complet
 $resultat = $mysqli->query('SELECT id, CONCAT(
             ( SELECT GROUP_CONCAT(nom SEPARATOR \'/\') FROM reps AS r WHERE FIND_IN_SET(r.id,reps.parents) )
-            ,\'/\') AS parents, nom FROM `reps` WHERE nbfic'.$m);
+            ,\'/\') AS parents, nom FROM `reps` WHERE nbdoc_v'.$m);
 $reps = '';
 $docs = array();
 if ( $resultat->num_rows )  {
@@ -23,7 +23,7 @@
     $reps .= "\n        <option value=\"${r['id']}\">".addslashes($r['parents'].$r['nom']).'</option>\\';
     // Récupération des documents
     $docs[$r['id']] = '';
-    $res = $mysqli->query("SELECT id, nom FROM docs WHERE parent = ${r['id']}");
+    $res = $mysqli->query("SELECT id, nom FROM docs WHERE parent = ${r['id']} AND protection < 2");
     while ( $d = $res->fetch_assoc() )  {
       $docs[$r['id']] .= "<option value=\"${d['id']}\">".addslashes($d['nom']).'</option>';
     }
