diff -urN cahier-de-prepa9.0.1/ajax.php cahier-de-prepa9.0.2/ajax.php
--- cahier-de-prepa9.0.1/ajax.php	2019-08-29 19:25:39.423850014 +0200
+++ cahier-de-prepa9.0.2/ajax.php	2019-09-08 14:45:00.568465844 +0200
@@ -11,7 +11,7 @@
   exit('{"etat":"nok","message":"Accès non autorisé"}');
 
 // Récupération de l'action
-if ( !isset($_REQUEST['action']) || !in_array($action = $_REQUEST['action'],array('deconnexion', 'courriel', 'prefsperso', 'notes', 'ajout-notes', 'releve-notes', 'infos', 'ajout-info', 'reps', 'ajout-rep', 'docs', 'ajout-doc', 'colles', 'ajout-colle', 'cdt-elems', 'cdt-types', 'cdt-raccourcis', 'ajout-cdt-raccourci', 'pages', 'ajout-page', 'matieres', 'ajout-matiere', 'utilisateur', 'utilisateurs','ajout-utilisateurs', 'utilisateur-matiere', 'utilisateurs-matieres', 'groupes', 'ajout-groupe', 'planning', 'agenda-elems', 'deplcolle', 'agenda-types', 'ajout-agenda-types', 'prefsmatiere', 'prefsglobales')) )
+if ( !isset($_REQUEST['action']) || !in_array($action = $_REQUEST['action'],array('deconnexion', 'courriel', 'prefsperso', 'notes', 'ajout-notes', 'releve-notes', 'infos', 'ajout-info', 'reps', 'ajout-rep', 'docs', 'ajout-doc', 'colles', 'ajout-colle', 'cdt-elems', 'cdt-types', 'ajout-cdt-types', 'cdt-raccourcis', 'ajout-cdt-raccourci', 'pages', 'ajout-page', 'matieres', 'ajout-matiere', 'utilisateur', 'utilisateurs','ajout-utilisateurs', 'utilisateur-matiere', 'utilisateurs-matieres', 'groupes', 'ajout-groupe', 'planning', 'agenda-elems', 'deplcolle', 'agenda-types', 'ajout-agenda-types', 'prefsmatiere', 'prefsglobales')) )
   exit('{"etat":"nok","message":"Aucune action effectuée"}');
 
 // Demande de déconnexion
@@ -167,7 +167,7 @@
   // Troisième cadre de modifications de prefs.php : adresse électronique
   if ( ( $_REQUEST['id'] == 3 ) && isset($_REQUEST['mail']) )  {
     // Vérification et nettoyage des données
-    if ( !($mail = filter_var(mb_strtolower(trim($_REQUEST['mail'])),FILTER_VALIDATE_EMAIL)) )
+    if ( !filter_var($mail = mb_strtolower(trim($_REQUEST['mail'])),FILTER_VALIDATE_EMAIL) )
       exit('{"etat":"nok","message":"L\'adresse électronique doit être valide et non vide."}');
     // Vérification que l'adresse n'est pas déjà utilisée
     $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE mail = \''.$mysqli->real_escape_string($mail)."' AND id != ${_SESSION['id']}");
@@ -222,7 +222,7 @@
     $requete = array();
     if ( $login != $_SESSION['login'] )  {
       // Vérification que le login n'existe pas déjà
-      $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE login = '.$mysqli->real_escape_string($login)." AND id != ${_SESSION['id']}");
+      $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE login = \''.$mysqli->real_escape_string($login)."' AND id != ${_SESSION['id']}");
       if ( $resultat->num_rows )
         exit('{"etat":"nok","message":"Adresse électronique non disponible"}');
       $requete['login'] = $login;
@@ -712,7 +712,7 @@
         $mysqli->query('ALTER TABLE reps ORDER BY parents,nom');
         $etat = 'ok';
       }
-      if ( ( $menu = intval(isset($_REQUEST['menu']))) != $r['menu'] )  {
+      if ( ( $menu = intval(isset($_REQUEST['menurep']))) != $r['menu'] )  {
         requete('reps', "UPDATE reps SET menu = 1-menu WHERE id = $id",$mysqli);
         $etat = 'ok';
       }
@@ -821,7 +821,7 @@
     exit('{"etat":"nok","message":"Identifiant de répertoire parent non valide"}');
   $r = $resultat->fetch_assoc();
   $resultat->free();
-  $menu = intval(isset($_REQUEST['menu']));
+  $menu = intval(isset($_REQUEST['menurep']));
   // Génération de la valeur de protection
   $protection = ( count($val = array_filter($_REQUEST['protection'],function($id) { return ctype_digit($id); })) )
                 ? ( ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32) )
@@ -1241,7 +1241,7 @@
 
   // Traitement d'une modification
   if ( isset($_REQUEST['titre']) && isset($_REQUEST['cle']) && isset($_REQUEST['deb_fin_pour']) && in_array($deb_fin_pour = intval($_REQUEST['deb_fin_pour']),array(0,1,2,3,4,5)) )  {
-    $titre = mb_convert_case(strip_tags(trim($mysqli->real_escape_string($_REQUEST['titre']))),MB_CASE_TITLE);
+    $titre = mb_strtoupper(mb_substr($titre = strip_tags(trim($mysqli->real_escape_string($_REQUEST['titre']))),0,1)).mb_substr($titre,1);
     $cle = str_replace(' ','_',trim($mysqli->real_escape_string($_REQUEST['cle'])));
     if ( !strlen($titre) || !strlen($cle) )
       exit("{\"etat\":\"nok\",\"message\":\"Le type de séance <em>${r['titre']}</em> n'a pas été modifié. Le texte et la clé doivent être non vides.\"}");
@@ -1289,7 +1289,7 @@
 // Ajout d'un type de séance des cahiers de texte //
 ////////////////////////////////////////////////////
 elseif ( ( $action == 'ajout-cdt-types' ) && isset($_REQUEST['titre']) && isset($_REQUEST['cle']) && isset($_REQUEST['deb_fin_pour']) && in_array($deb_fin_pour = intval($_REQUEST['deb_fin_pour']),array(0,1,2,3,4,5)) && isset($_REQUEST['matiere']) && in_array($matiere = intval($_REQUEST['matiere']),explode(',',$_SESSION['matieres'])) )  {
-  $titre = mb_convert_case(strip_tags(trim($mysqli->real_escape_string($_REQUEST['titre']))),MB_CASE_TITLE);
+  $titre = mb_strtoupper(mb_substr($titre = strip_tags(trim($mysqli->real_escape_string($_REQUEST['titre']))),0,1)).mb_substr($titre,1);
   $cle = str_replace(' ','_',trim($mysqli->real_escape_string($_REQUEST['cle'])));
   if ( !strlen($titre) || !strlen($cle) )
     exit('{"etat":"nok","message":"Le type de séance n\'a pas été ajouté. Le texte et la clé doivent être non vides."}');
@@ -1615,16 +1615,19 @@
         requete('recents',"UPDATE recents SET titre = ( SELECT CONCAT( IF(LENGTH(i.titre),i.titre,'Information'),' [',m.nom,'/',p.nom,']' )
                                                         FROM infos AS i LEFT JOIN pages AS p ON page=p.id LEFT JOIN matieres AS m ON mat=m.id WHERE i.id = recents.id )
                            WHERE type = 1 AND matiere = $id",$mysqli);
-        requete('recents',"UPDATE recents SET protection = ${protection['colles']}, ".( ( $cle != $r['cle'] ) ? "lien = CONCAT('colles?$cle&amp;n=',SUBSTRING_INDEX(lien,'&',-1))," : '')."
-                                              titre = CONCAT( SUBSTRING_INDEX(titre,' ',4), ' en $nom' )
+        requete('recents',"UPDATE recents SET titre = CONCAT( SUBSTRING_INDEX(titre,' ',4), ' en $nom' )
                            WHERE type = 2 AND matiere = $id",$mysqli);
         requete('recents',"UPDATE recents SET texte = ( SELECT CONCAT(ext,'|',taille,'|',d.parent,'|',GROUP_CONCAT( r.nom ORDER BY FIND_IN_SET(r.id,d.parents) SEPARATOR '/' ))
                                                         FROM docs AS d LEFT JOIN reps AS r ON FIND_IN_SET(r.id,d.parents) WHERE d.id = recents.id GROUP BY d.id )
-                                          WHERE type = 3 AND matiere = $id",$mysqli);
-        rss($mysqli,$r['mat'],0);
+                           WHERE type = 3 AND matiere = $id",$mysqli);
+        rss($mysqli,$id,0);
       }
       if ( $protection['docs'] != $r['docs_protection'] )
         requete('reps',"UPDATE reps SET protection = ${protection['docs']} WHERE matiere = $id AND parent = 0",$mysqli);
+      if ( $protection['colles'] != $r['colles_protection'] )
+        requete('recents',"UPDATE recents SET protection = ${protection['colles']} WHERE type = 2 AND matiere = $id",$mysqli);
+      if ( $cle != $r['cle'] )
+        requete('recents',"UPDATE recents SET lien = CONCAT('colles?$cle&amp;n=',SUBSTRING_INDEX(lien,'&',-1)) WHERE type = 2 AND matiere = $id",$mysqli);
       exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"La matière <em>${r['nom']}</em> a été modifiée.\"}");
     }
     else
@@ -1635,7 +1638,7 @@
   if ( isset($_REQUEST['supprime']) )  {
     if ( $r['max'] == 1 )
       exit("{\"etat\":\"nok\",\"message\":\"La matière <em>${r['nom']}</em> n'a pas été supprimée. Il faut obligatoirement en garder au moins une.\"}");
-    $resultat->$mysql_query("SELECT id FROM reps WHERE parent = 0 AND matiere = $id");
+    $resultat = $mysqli->query("SELECT id FROM reps WHERE parent = 0 AND matiere = $id");
     $rid = $resultat->fetch_row()[0];
     $resultat->free();
     if ( requete('matieres',"DELETE FROM matieres WHERE id = $id",$mysqli) 
@@ -1788,31 +1791,28 @@
           unset($requete['login']);
         else  {
           // Vérification que le login n'existe pas déjà
-          $resultat = $mysqli->query("SELECT GROUP_CONCAT(login) FROM utilisateurs WHERE id != $id");
-          $s = $resultat->fetch_row();
-          $resultat->free();
-          if ( in_array($login,explode(',',$s[0])) )
+          $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE login = \''.$mysqli->real_escape_string($login)."' AND id != $id");
+          if ( $resultat->num_rows )  {
+            $resultat->free();
             unset($requete['login']);
+          }
         }
       }
       if ( isset($requete['mail']) )  {
+        // Vérification de l'adresse (écriture, confirmation, absence de la base)
         if ( !filter_var($mail = $requete['mail'],FILTER_VALIDATE_EMAIL) || !isset($_REQUEST['mail2']) )
           unset($requete['mail']);
         elseif ( $mail != mb_strtolower(trim($_REQUEST['mail2'])) )
           exit('{"etat":"nok","message":"Les préférences '.$compte.' n\'ont pas été modifiées, les deux adresses électroniques saisies ne sont pas identiques."}');
-        else  {
-          // Vérification que l'adresse n'existe pas déjà
-          $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) FROM utilisateurs WHERE id != $id AND mail > ''");
-          $s = $resultat->fetch_row();
+        elseif ( ( $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE mail = \''.$mysqli->real_escape_string($mail)."' AND id != $id") ) && $resultat->num_rows )  {
           $resultat->free();
-          if ( in_array($mail,explode(',',$s[0])) )
-            unset($requete['mail']);
+          unset($requete['mail']);
         }
       }
       if ( isset($requete['mailexp']) && !($mailexp = strip_tags($requete['mailexp'])) )
         unset($requete['mailexp']);
       if ( !$requete )
-        exit('{"etat":"ok","message":"Les valeurs fournies étaient celles déjà enregistrées. Aucune modification n\'a été effectuée."}');
+        exit($_SESSION['message'] = '{"etat":"ok","message":"Les valeurs fournies étaient celles déjà enregistrées. Aucune modification n\'a été effectuée."}');
       if( requete('utilisateurs','UPDATE utilisateurs SET '.fabriqueupdate($requete,$mysqli)." WHERE id = $id",$mysqli) )  {
         // Si interface globale activée, mise à jour
         if ( ( $r['autorisation'] > 1 ) && $interfaceglobale )  {
@@ -2062,14 +2062,8 @@
   $r = $resultat->fetch_row();
   $resultat->free();
   $matieres = '0,'.implode(',', array_intersect($_REQUEST['matieres'],explode(',',$r[0])) ?: explode(',',$r[0]) );
-  
-  // Récupération des identifiants existants
-  $resultat = $mysqli->query('SELECT GROUP_CONCAT(login) FROM utilisateurs');
-  $r = $resultat->fetch_row();
-  $resultat->free();
-  $logins = explode(',',$r[0]);
-  
-   // Récupération des lignes
+
+  // Récupération des lignes
   $utilisateurs = explode("\n",$_REQUEST['listeutilisateurs']);
   
   // Compteurs : $n nb de comptes ajoutés; $i compteur de ligne traitée
@@ -2084,7 +2078,7 @@
       $i = $i+1;
       if ( ( count($u) != 2 ) || !strlen($u[0]) || !strlen($u[1]) )
         $message .= "<br>Ligne $i : mauvais paramètres";
-      elseif ( in_array($login = mb_strtolower(str_replace(' ','_',$u[0])),$logins) )
+      elseif ( ( $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE login = \''.($login = $mysqli->real_escape_string(mb_strtolower(str_replace(' ','_',$u[0])))).'\'') ) && $resultat->num_rows ) 
         $message .= "<br>Ligne $i : identifiant <strong>$login</strong> déjà existant";
       elseif ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', mdp = '".sha1($mdp.$u[1])."', autorisation = 1, matieres = '$matieres', timeout=900",$mysqli) )  {
         $message .= "<br>Ligne $i : ok (identifiant <strong>$login</strong>)";
@@ -2107,8 +2101,10 @@
         $nom = mb_convert_case(strip_tags($mysqli->real_escape_string($u[0])),MB_CASE_TITLE);
         $prenom = mb_convert_case(strip_tags($mysqli->real_escape_string($u[1])),MB_CASE_TITLE);
         $login = mb_strtolower(mb_substr($prenom,0,1).str_replace(' ','_',$nom));
-        if ( in_array($login,$logins) )
+        if ( ( $resultat = $mysqli->query("SELECT id FROM utilisateurs WHERE login = '$login'") ) && $resultat->num_rows )  {
+          $resultat->free();
           $message .= "<br>Ligne $i : identifiant <strong>$login</strong> déjà existant";
+        }
         // Si nom,prenom,mdp
         elseif ( $_REQUEST['saisie'] == 2 )  {
           if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mdp = '".sha1($mdp.$u[2])."', autorisation = $autorisation, matieres = '$matieres', timeout = 900",$mysqli) )  {
@@ -2125,30 +2121,28 @@
         }
         // Si nom,prenom,mail
         else  {
-          // Récupération des adresses électroniques
-          $resultat = $mysqli->query('SELECT GROUP_CONCAT(mail) FROM utilisateurs WHERE mail > \'\'');
-          $r = $resultat->fetch_row();
-          $resultat->free();
-          if ( in_array($mail = mb_strtolower($u[2]),explode(',',$r[0])) )
-            $message .= "<br>Ligne $i : adresse électronique déjà existante (<strong>$prenom $nom</strong>)";
-          elseif ( !filter_var($mail,FILTER_VALIDATE_EMAIL) )
+          // Vérification de l'adresse mail (écriture et absence dans la base)
+          if ( !$mysqli->real_escape_string(filter_var($mail = mb_strtolower($u[2]),FILTER_VALIDATE_EMAIL)) )
             $message .= "<br>Ligne $i : adresse électronique non valide (<strong>$prenom $nom</strong>)";
-          else  {
-            if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation, matieres = '$matieres', timeout = 900, mailexp = '$prenom $nom'",$mysqli) )  {
-              $message .= "<br>Ligne $i : ok (<strong>$prenom $nom</strong>, identifiant $login)";
-              $n = $n+1;
-              // Si interface globale activée, mise à jour
-              if ( $interfaceglobale )  {
-                include_once("${interfaceglobale}majutilisateurs.php");
-                majutilisateurs($mysqli->insert_id,"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation");
-              }
-              // 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();
-              $returnpath = $s[0] ?: $mailadmin;
-              $lien = "https://$domaine${chemin}gestioncompte?invitation&mail=".str_replace('@','__',$mail).'&p='.sha1($chemin.$mdp.$mail);
-              mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Invitation').'?=',
+          elseif ( ( $resultat = $mysqli->query("SELECT id FROM utilisateurs WHERE mail = '$mail'") ) && $resultat->num_rows )  {
+            $resultat->free();
+            $message .= "<br>Ligne $i : adresse électronique déjà existante (<strong>$prenom $nom</strong>)";
+          }
+          elseif ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation, matieres = '$matieres', timeout = 900, mailexp = '$prenom $nom'",$mysqli) )  {
+            $message .= "<br>Ligne $i : ok (<strong>$prenom $nom</strong>, identifiant $login)";
+            $n = $n+1;
+            // Si interface globale activée, mise à jour
+            if ( $interfaceglobale )  {
+              include_once("${interfaceglobale}majutilisateurs.php");
+              majutilisateurs($mysqli->insert_id,"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '?', autorisation = $autorisation");
+            }
+            // 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();
+            $returnpath = $s[0] ?: $mailadmin;
+            $lien = "https://$domaine${chemin}gestioncompte?invitation&mail=".str_replace('@','__',$mail).'&p='.sha1($chemin.$mdp.$mail);
+            mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Invitation').'?=',
 "Bonjour
 
 L'équipe pédagogique en charge du Cahier de Prépa <https://$domaine$chemin> vous invite à les rejoindre.
@@ -2166,18 +2160,17 @@
 -- 
 Cahier de Prépa
 ",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$returnpath");
-            }
-            else
-              $message .= "<br>Ligne $i : erreur MySQL n°".$mysqli->errno.' «'.$mysqli->error.'»';
           }
+          else
+            $message .= "<br>Ligne $i : erreur MySQL n°".$mysqli->errno.' «'.$mysqli->error.'»';
         }
       }
     }
   // Fabrication du message
   $nouveaucompte = ( $n > 1 ) ? 'nouveaux comptes' : 'nouveau compte';
   if ( $e = $i-$n )
-    exit("{\"etat\":\"nok\",\"message\":\"<strong>$n $nouveaucompte et $e erreur".($e>1?'s':'')."</strong>$message\"}");
-  exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"<strong>$n $nouveaucompte</strong>$message\"}");
+    exit("{\"etat\":\"nok\",\"message\":\"<strong>$n $nouveaucompte et $e erreur".($e>1?'s':'').'</strong>'.stripslashes($message).'"}');
+  exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"<strong>$n $nouveaucompte</strong>".stripslashes($message).'"}');
 }
 
 ///////////////////////////////////////////////////////////////
@@ -2692,7 +2685,8 @@
       exit($_SESSION['message'] = '{"etat":"nok","message":"Les préférences d\'accès à l\'agenda n\'ont pas été modifiées."}');
     $protection = ( ( $val[0] == 0 ) || ( $val[0] == 32 ) ) ? $val[0] : array_reduce($val, function($s,$v) { return $s - ( ( $v<6 ) ? 1<<($v-1) : 0 ); }, 32);
     if ( requete('prefs',"UPDATE prefs SET val = $protection WHERE nom='protection_agenda'",$mysqli)
-      && requete('prefs',"UPDATE prefs SET val = $nb_agenda_index WHERE nom='nb_agenda_index'",$mysqli) )
+      && requete('prefs',"UPDATE prefs SET val = $nb_agenda_index WHERE nom='nb_agenda_index'",$mysqli) 
+      && requete('recents',"UPDATE recents SET protection = $protection WHERE type=4",$mysqli) )
       exit($_SESSION['message'] = '{"etat":"ok","message":"Les préférences de l\'agenda ont été modifiées."}');
     exit('{"etat":"nok","message":"Les préférences globales de l\'agenda n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
   }
diff -urN cahier-de-prepa9.0.1/cdt-raccourcis.php cahier-de-prepa9.0.2/cdt-raccourcis.php
--- cahier-de-prepa9.0.1/cdt-raccourcis.php	2018-10-12 15:09:12.227576211 +0200
+++ cahier-de-prepa9.0.2/cdt-raccourcis.php	2019-09-08 14:37:18.839143946 +0200
@@ -25,7 +25,7 @@
 // Accès aux professeurs connectés uniquement
 $mysqli = connectsql();
 if ( $autorisation == 5 )  {
-  $resultat = $mysqli->query("SELECT id, cle, nom FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}') AND colles_protection < 32");
+  $resultat = $mysqli->query("SELECT id, cle, nom FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}') AND cdt_protection < 32");
   if ( $resultat->num_rows )  {
     if ( !empty($_REQUEST) )  {
       while ( $r = $resultat->fetch_assoc() )
diff -urN cahier-de-prepa9.0.1/cdt-seances.php cahier-de-prepa9.0.2/cdt-seances.php
--- cahier-de-prepa9.0.1/cdt-seances.php	2018-10-12 15:03:58.728099684 +0200
+++ cahier-de-prepa9.0.2/cdt-seances.php	2019-09-08 14:37:26.707234769 +0200
@@ -25,7 +25,7 @@
 // Accès aux professeurs connectés uniquement
 $mysqli = connectsql();
 if ( $autorisation == 5 )  {
-  $resultat = $mysqli->query("SELECT id, cle, nom FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}') AND colles_protection < 32");
+  $resultat = $mysqli->query("SELECT id, cle, nom FROM matieres WHERE FIND_IN_SET(id,'${_SESSION['matieres']}') AND cdt_protection < 32");
   if ( $resultat->num_rows )  {
     if ( !empty($_REQUEST) )  {
       while ( $r = $resultat->fetch_assoc() )
diff -urN cahier-de-prepa9.0.1/CHANGELOG.php cahier-de-prepa9.0.2/CHANGELOG.php
--- cahier-de-prepa9.0.1/CHANGELOG.php	2019-08-29 19:30:43.158976565 +0200
+++ cahier-de-prepa9.0.2/CHANGELOG.php	2019-09-08 10:44:19.743603571 +0200
@@ -1,4 +1,4 @@
-Version actuelle : 9.0.1 (29/08/19)
+Version actuelle : 9.0.2 (08/09/19)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -240,6 +240,7 @@
     dépend du réglage du navigateur)
   * Planning dépendant de la zone scolaire
 9.0.1 29/08/19 Correction de bugs
+9.0.2 08/09/19 Correction de bugs, nouvelles icônes de documents
 
 
 ===================
diff -urN cahier-de-prepa9.0.1/colles.php cahier-de-prepa9.0.2/colles.php
--- cahier-de-prepa9.0.1/colles.php	2019-08-28 03:35:18.257231642 +0200
+++ cahier-de-prepa9.0.2/colles.php	2019-09-03 22:41:51.576102081 +0200
@@ -139,7 +139,7 @@
     if ( $recherche )
       $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte
                                   FROM colles AS c LEFT JOIN semaines AS s ON c.semaine=s.id LEFT JOIN vacances ON s.vacances = vacances.id
-                                  WHERE c.matiere = $mid AND c.cache = 0 AND c.texte LIKE '%".$mysqli->real_escape_string($_REQUEST['recherche']).'%\' ORDER BY c.semaine');
+                                  WHERE c.matiere = $mid AND c.cache = 0 AND c.texte LIKE '%".$mysqli->real_escape_string($recherche).'%\' ORDER BY c.semaine');
     else
       $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte
                                   FROM semaines AS s LEFT JOIN vacances ON s.vacances = vacances.id
@@ -193,12 +193,12 @@
     if ( strlen($recherche) )
       $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte, s.id, c.cache 
                                   FROM colles AS c LEFT JOIN semaines AS s ON c.semaine=s.id LEFT JOIN vacances ON s.vacances = vacances.id
-                                  WHERE c.matiere = $mid AND c.texte LIKE '%$recherche%' ORDER BY c.semaine");
+                                  WHERE c.matiere = $mid AND c.texte LIKE '%".$mysqli->real_escape_string($recherche).'%\' ORDER BY c.semaine');
     else
       $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, s.colle, nom AS vacances, c.texte, s.id, c.cache 
                                   FROM semaines AS s LEFT JOIN vacances ON s.vacances = vacances.id
                                   LEFT JOIN (SELECT texte, semaine, cache FROM colles WHERE matiere = $mid) AS c ON c.semaine=s.id
-                                  $requete");
+                                  $requete ORDER BY s.id");
     $mysqli->close();
     if ( $resultat->num_rows )  {
       $compteur = 0;
diff -urN cahier-de-prepa9.0.1/css/icones.css cahier-de-prepa9.0.2/css/icones.css
--- cahier-de-prepa9.0.1/css/icones.css	2019-08-29 19:13:16.224201068 +0200
+++ cahier-de-prepa9.0.2/css/icones.css	2019-09-08 14:50:12.516054522 +0200
@@ -1,6 +1,6 @@
 @font-face {
   font-family: 'icomoon';
-  src:url('../fonts/icomoon.woff?24') format('woff');
+  src:url('../fonts/icomoon.woff?25') format('woff');
   font-weight: normal;
   font-style: normal;
 }
@@ -230,87 +230,99 @@
 .icon-doc-db:before {
   content: "\e641";
 }
-.icon-recent:before {
+.icon-doc-apk:before {
   content: "\e642";
 }
-.icon-rss:before {
+.icon-doc-cod:before {
   content: "\e643";
 }
-.icon-infos:before {
+.icon-doc-tex:before {
   content: "\e644";
 }
-.icon-colles:before {
+.icon-doc-exe:before {
   content: "\e645";
 }
-.icon-lock1:before {
+.icon-recent:before {
   content: "\e646";
 }
-.icon-lock2:before {
+.icon-rss:before {
   content: "\e647";
 }
-.icon-lock3:before {
+.icon-infos:before {
   content: "\e648";
 }
-.icon-lock4:before {
+.icon-colles:before {
   content: "\e649";
 }
-.icon-lock5:before {
+.icon-lock1:before {
   content: "\e64a";
 }
-.icon-agenda:before {
+.icon-lock2:before {
   content: "\e64b";
 }
-.icon-ajout-colle:before {
+.icon-lock3:before {
   content: "\e64c";
 }
-.icon-messages:before {
+.icon-lock4:before {
   content: "\e64d";
 }
-.icon-lock:before {
+.icon-lock5:before {
   content: "\e64e";
 }
-.icon-locktotal:before {
+.icon-agenda:before {
   content: "\e64f";
 }
-.icon-editemultiple:before {
+.icon-ajout-colle:before {
   content: "\e650";
 }
-.icon-plie:before {
+.icon-messages:before {
   content: "\e651";
 }
-.icon-deplie:before {
+.icon-lock:before {
   content: "\e652";
 }
-.icon-mailenvoi:before {
+.icon-locktotal:before {
   content: "\e653";
 }
-.icon-nok:before {
+.icon-editemultiple:before {
   content: "\e654";
 }
-.icon-active:before {
+.icon-plie:before {
   content: "\e655";
 }
-.icon-desactive:before {
+.icon-deplie:before {
   content: "\e656";
 }
-.icon-supprutilisateur:before {
+.icon-mailenvoi:before {
   content: "\e657";
 }
-.icon-validutilisateur:before {
+.icon-nok:before {
   content: "\e658";
 }
-.icon-lecture:before {
+.icon-active:before {
   content: "\e659";
 }
-.icon-nolecture:before {
+.icon-desactive:before {
   content: "\e65a";
 }
-.icon-echange:before {
+.icon-supprutilisateur:before {
   content: "\e65b";
 }
-.icon-notes:before {
+.icon-validutilisateur:before {
   content: "\e65c";
 }
-.icon-cdt:before {
+.icon-lecture:before {
   content: "\e65d";
 }
+.icon-nolecture:before {
+  content: "\e65e";
+}
+.icon-echange:before {
+  content: "\e65f";
+}
+.icon-notes:before {
+  content: "\e660";
+}
+.icon-cdt:before {
+  content: "\e661";
+}
diff -urN cahier-de-prepa9.0.1/css/icones.min.css cahier-de-prepa9.0.2/css/icones.min.css
--- cahier-de-prepa9.0.1/css/icones.min.css	2019-08-29 19:13:33.284376035 +0200
+++ cahier-de-prepa9.0.2/css/icones.min.css	2019-09-08 14:50:20.896151495 +0200
@@ -1 +1 @@
-@font-face{font-family:'icomoon';src:url('../fonts/icomoon.woff?24') format('woff');font-weight:normal;font-style:normal}[class^="icon-"]{font-family:'icomoon'!important;color:black;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a[class^="icon-"]{cursor:pointer;text-decoration:none}span.icon-minilock{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,.icon-ajoutecolle:before{content:"\e603"}.icon-supprime:before{content:"\e604"}.icon-annule:before{content:"\e605"}.icon-ok:before,.icon-envoidoc: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,.icon-editedoc:before,.icon-editerep: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-minilock: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-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-py:before{content:"\e63f"}.icon-doc-sql:before{content:"\e640"}.icon-doc-db:before{content:"\e641"}.icon-recent:before{content:"\e642"}.icon-rss:before{content:"\e643"}.icon-infos:before{content:"\e644"}.icon-colles:before{content:"\e645"}.icon-lock1:before{content:"\e646"}.icon-lock2:before{content:"\e647"}.icon-lock3:before{content:"\e648"}.icon-lock4:before{content:"\e649"}.icon-lock5:before{content:"\e64a"}.icon-agenda:before{content:"\e64b"}.icon-ajout-colle:before{content:"\e64c"}.icon-messages:before{content:"\e64d"}.icon-lock:before{content:"\e64e"}.icon-locktotal:before{content:"\e64f"}.icon-editemultiple:before{content:"\e650"}.icon-plie:before{content:"\e651"}.icon-deplie:before{content:"\e652"}.icon-mailenvoi:before{content:"\e653"}.icon-nok:before{content:"\e654"}.icon-active:before{content:"\e655"}.icon-desactive:before{content:"\e656"}.icon-supprutilisateur:before{content:"\e657"}.icon-validutilisateur:before{content:"\e658"}.icon-lecture:before{content:"\e659"}.icon-nolecture:before{content:"\e65a"}.icon-echange:before{content:"\e65b"}.icon-notes:before{content:"\e65c"}.icon-cdt:before{content:"\e65d"}
+@font-face{font-family:'icomoon';src:url('../fonts/icomoon.woff?25') format('woff');font-weight:normal;font-style:normal}[class^="icon-"]{font-family:'icomoon'!important;color:black;speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a[class^="icon-"]{cursor:pointer;text-decoration:none}span.icon-minilock{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,.icon-ajoutecolle:before{content:"\e603"}.icon-supprime:before{content:"\e604"}.icon-annule:before{content:"\e605"}.icon-ok:before,.icon-envoidoc: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,.icon-editedoc:before,.icon-editerep: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-minilock: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-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-py:before{content:"\e63f"}.icon-doc-sql:before{content:"\e640"}.icon-doc-db:before{content:"\e641"}.icon-doc-apk:before{content:"\e642"}.icon-doc-cod:before{content:"\e643"}.icon-doc-tex:before{content:"\e644"}.icon-doc-exe:before{content:"\e645"}.icon-recent:before{content:"\e646"}.icon-rss:before{content:"\e647"}.icon-infos:before{content:"\e648"}.icon-colles:before{content:"\e649"}.icon-lock1:before{content:"\e64a"}.icon-lock2:before{content:"\e64b"}.icon-lock3:before{content:"\e64c"}.icon-lock4:before{content:"\e64d"}.icon-lock5:before{content:"\e64e"}.icon-agenda:before{content:"\e64f"}.icon-ajout-colle:before{content:"\e650"}.icon-messages:before{content:"\e651"}.icon-lock:before{content:"\e652"}.icon-locktotal:before{content:"\e653"}.icon-editemultiple:before{content:"\e654"}.icon-plie:before{content:"\e655"}.icon-deplie:before{content:"\e656"}.icon-mailenvoi:before{content:"\e657"}.icon-nok:before{content:"\e658"}.icon-active:before{content:"\e659"}.icon-desactive:before{content:"\e65a"}.icon-supprutilisateur:before{content:"\e65b"}.icon-validutilisateur:before{content:"\e65c"}.icon-lecture:before{content:"\e65d"}.icon-nolecture:before{content:"\e65e"}.icon-echange:before{content:"\e65f"}.icon-notes:before{content:"\e660"}.icon-cdt:before{content:"\e661"}
diff -urN cahier-de-prepa9.0.1/css/style.css cahier-de-prepa9.0.2/css/style.css
--- cahier-de-prepa9.0.1/css/style.css	2019-08-28 18:08:33.383559955 +0200
+++ cahier-de-prepa9.0.2/css/style.css	2019-09-04 14:54:02.615825816 +0200
@@ -38,9 +38,12 @@
 #iconesmenu a:hover { color: #CDF; }
 #iconesmenu .icon-recent::before{ font-size: 2em; }
 #iconesmenu .icon-recent { font-size: 0.5em; }
-nav > a { display: block; margin-bottom: 0.2em; text-decoration: none; color: #002877; }
-nav h3 { font-size: 1.2em; margin: 0.5em 3% 0.1em; padding-top: 0.3em; color: #001030; border-top: 1px solid #001030; }
-#actuel { font-style: italic; }
+#menu h3 { font-size: 1.2em; margin: 0.5em 3% 0.1em; padding-top: 0.3em; color: #001030; border-top: 1px solid #001030; }
+#menu a { display: block; margin-bottom: 0.2em; text-decoration: none; color: #002877; }
+#menu a.menurep { padding-left: 3%; font-size: 0.9em; }
+a#actuel { color: #1F5FDF; }
+#menu a#actuel { font-style: italic; }
+.menurep { padding-left: 0.5em; font-size: 0.9em; }
 section > :first-child, article > :first-child, article > h2:first-of-type, article > h3:first-of-type, #fenetre h3:first-of-type { margin-top: 0; }
 article > :last-child, #fenetre > :last-child { margin-bottom: 0; }
 article { margin-bottom: 1em; padding: 1em 2%; background-color: #CDD5E4; overflow-x: auto; }
@@ -55,11 +58,11 @@
  
 /* Blocs principaux, affichage différentiés selon la taille de l'écran */
 @media screen and (min-width: 800px) {
+  nav { float: left; width: 240px; margin: 0 30px; padding: 0.7em 20px 0.5em; padding-top: 0.1em; margin-bottom: 3em; background-color: #99B3E5; }
   #iconesmenu { width: 240px; padding: 0.7em 0 0.5em; }
   #iconesmenu a:first-child { display: none; }
-  nav { float: left; width: 240px; margin: 0 30px; padding: 0.7em 20px 0.5em; padding-top: 0.1em; margin-bottom: 3em; background-color: #99B3E5; }
-  nav hr { margin: 0 3% 0.7em; color: #001030; border-top: 1px solid #001030; border-bottom: none; }
-  nav a:hover { color: #CDF; }
+  #menu hr { margin: 0 3% 0.7em; color: #001030; border-top: 1px solid #001030; border-bottom: none; }
+  #menu a:hover { color: #CDF; }
   section { position: relative; margin: 0 30px 0 340px; padding-bottom: 3em;  }
   #icones { position: absolute; top: -4em; right: 0; }
   header + section { width: 96%; margin: 0 auto; max-width: 1500px; text-align: center;}
@@ -71,16 +74,16 @@
   body { padding-top: 2.2em; }
   h1 { font-size: 1.8em; padding: 0.3em 3em; }
   h2 { font-size: 1.65em; }
-  #iconesmenu { position: fixed; top: 0; left: 0; z-index: 20; width: 100%; min-width: 320px; height: 1.4em; border-bottom: 1px solid black; padding: 0.4em 0; }
+  #iconesmenu { position: fixed; top: 0; left: 0; right: 0; z-index: 20; min-width: 320px; height: 1.4em; border-bottom: 1px solid black; padding: 0.4em 0; }
   #iconesmenu a:first-child { padding-left: 20px; }
   #iconesmenu a:last-child { padding-right: 20px; }
   #iconesmenu [class="icon-imprime"] { display: none; }
-  nav { position: fixed; top: 2.2em; left: 0; z-index: 19; height: calc(100% - 5.4em); width: 0; padding: 0.5em 0 0.7em; overflow-x: hidden; overflow-y: auto; transition: all 1s ease-in-out; background-color: #E7EEFE; }
-  nav.visible { display: block; width: 80%; padding: 0.5em 20px 0.7em; }
+  #menu { position: fixed; top: 2.2em; left: 0; z-index: 19; height: calc(100% - 5.4em); width: 0; padding: 0.5em 0 0.7em; overflow-x: hidden; transition: all 1s ease-in-out; background-color: #E7EEFE; }
+  #menu.visible { display: block; width: 80%; padding: 0.5em 20px 0.7em; }
   #menu_fond { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: #000; opacity: 0.2; z-index: 18; }
-  nav > a, nav h3 { white-space: pre; }
-  nav hr:first-of-type { display: none; }
-  nav > a:last-child { padding-bottom: 0.5em; }
+  #menu a, nav h3 { white-space: pre; }
+  #menu hr:first-of-type { display: none; }
+  #menu a:last-child { padding-bottom: 0.5em; }
   section { position: relative; width:96%; margin: 0 auto; padding-bottom: 3em; }
   #icones { position: absolute; top: -2.2em; right: 0; }
   header + section { text-align: center; }
@@ -298,3 +301,4 @@
 #cahiers { text-align: center; }
 #cahiers a { text-decoration: none; font-weight: 700; display: block; color: #000; }
 #cahiers a:hover { color: #002877; background-color: #E7EEFE; }
+#cahiers + p { text-align: center; color: #777; padding-top: 1em; }
diff -urN cahier-de-prepa9.0.1/css/style.min.css cahier-de-prepa9.0.2/css/style.min.css
--- cahier-de-prepa9.0.1/css/style.min.css	2019-08-28 19:37:25.609433710 +0200
+++ cahier-de-prepa9.0.2/css/style.min.css	2019-09-04 14:56:41.261657692 +0200
@@ -1 +1 @@
-*{font-size:1em;margin:0;padding:0}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;position:relative;width:100%;margin:0 auto;min-width:320px;max-width:1500px;background-color:#f6f6f6}h1{font-size:2.2em;text-align:center;padding:1em 2em}h2{font-size:1.8em;margin:1em 0 .8em}h3{font-size:1.5em;margin:1em 0 .5em}h2+h3{padding-left:1%}h4{font-size:1.3em;margin:.5em 0 .2em;padding-left:2.5%}h5{font-size:1.1em;margin-top:.2em;padding-left:4%}h6{font-size:1em;margin-top:.2em;padding-left:5.5%}ul,ol{margin:.5em 0;padding:0 2% 0 6%}p{padding:0 2%}p+p{margin-top:.5em}img{border:0;max-width:100%}div,p,section,article{text-align:justify}#iconesmenu{background-color:#99b3e5;text-align-last:justify}#iconesmenu a{padding:0 3px;color:#001030}#iconesmenu a:hover{color:#CDF}#iconesmenu .icon-recent::before{font-size:2em}#iconesmenu .icon-recent{font-size:.5em}nav>a{display:block;margin-bottom:.2em;text-decoration:none;color:#002877}nav h3{font-size:1.2em;margin:.5em 3% .1em;padding-top:.3em;color:#001030;border-top:1px solid #001030}#actuel{font-style:italic}section>:first-child,article>:first-child,article>h2:first-of-type,article>h3:first-of-type,#fenetre h3:first-of-type{margin-top:0}article>:last-child,#fenetre>:last-child{margin-bottom:0}article{margin-bottom:1em;padding:1em 2%;background-color:#cdd5e4;overflow-x:auto}#fenetre{position:fixed;z-index:15;padding:1em 2% 0;background-color:#e7eefe;opacity:.97;box-shadow:.5em .5em .5em #777}#fenetre:after{content:"";display:block;height:1em;width:100%}#fenetre_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;z-index:14}article>a[class^="icon-"],#fenetre>a[class^="icon-"]{float:right;margin-left:.3em}#fenetre hr{margin:1.5em 0}footer{text-align:center;width:90%;padding:1em 5%;clear:both;position:fixed;left:0;bottom:0;z-index:20;border-top:1px solid black;background-color:#DDD;opacity:.97}@media screen and (min-width:800px){#iconesmenu{width:240px;padding:.7em 0 .5em}#iconesmenu a:first-child{display:none}nav{float:left;width:240px;margin:0 30px;padding:.7em 20px .5em;padding-top:.1em;margin-bottom:3em;background-color:#99b3e5}nav hr{margin:0 3% .7em;color:#001030;border-top:1px solid #001030;border-bottom:0}nav a:hover{color:#CDF}section{position:relative;margin:0 30px 0 340px;padding-bottom:3em}#icones{position:absolute;top:-4em;right:0}header+section{width:96%;margin:0 auto;max-width:1500px;text-align:center}footer{font-size:.8em}#fenetre{top:10%;left:0;right:0;width:70%;margin:0 auto;max-height:calc(90% - 7em)}p.ligne input,p.ligne select,p.ligne code{width:65%}}@media screen and (max-width:800px){body{padding-top:2.2em}h1{font-size:1.8em;padding:.3em 3em}h2{font-size:1.65em}#iconesmenu{position:fixed;top:0;left:0;z-index:20;width:100%;min-width:320px;height:1.4em;border-bottom:1px solid black;padding:.4em 0}#iconesmenu a:first-child{padding-left:20px}#iconesmenu a:last-child{padding-right:20px}#iconesmenu [class="icon-imprime"]{display:none}nav{position:fixed;top:2.2em;left:0;z-index:19;height:calc(100% - 5.4em);width:0;padding:.5em 0 .7em;overflow-x:hidden;overflow-y:auto;transition:all 1s ease-in-out;background-color:#e7eefe}nav.visible{display:block;width:80%;padding:.5em 20px .7em}#menu_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;z-index:18}nav>a,nav h3{white-space:pre}nav hr:first-of-type{display:none}nav>a:last-child{padding-bottom:.5em}section{position:relative;width:96%;margin:0 auto;padding-bottom:3em}#icones{position:absolute;top:-2.2em;right:0}header+section{text-align:center}footer{font-size:.6em;height:1.4em}#fenetre{top:3em;left:0;right:0;width:92%;margin:0 auto;max-height:calc(100% - 8em)}p.ligne input,p.ligne select,p.ligne code{width:35%}}.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%;color:#ba0d1f}.warning,.annonce{color:#ba0d1f;border:2px solid #ba0d1f}.oubli{font-size:.8em;text-align:center}.oubli a{text-decoration:none;color:#333}.oubli label{font-weight:700}.oubli input{margin-left:1em;vertical-align:text-top}p.titrecdt{text-align:right;text-decoration:underline}p.titrecdt.edition{text-align:left;text-decoration:none;padding-right:1%}h1 span{font-size:70%;vertical-align:7%;margin-left:.4em}.topbarre{min-height:1.6em;background-color:#DDD;border:1px solid #BBB;width:auto;border-radius:4px;padding:0 1em .2em;margin-bottom:1.5em}.topbarre *{margin-right:.4em;vertical-align:middle}.topbarre *:last-child{margin-right:0}.topbarre a{width:1em}.topbarre input,.topbarre select{font-size:.8em;height:1.4em}#recherchecolle input{padding-left:1.8em;width:calc(100% - 16.1em)}#recherchecdt input{padding-left:1.8em;width:calc(100% - 28.1em)}#rechercherecent input{padding-left:1.8em;width:calc(100% - 25.5em)}.topbarre select#seances{width:11em}.topbarre select#semaines{width:9em}#rechercherecent select{width:12em}.topbarre .icon-recherche{position:absolute;top:.75em;font-size:.7em;cursor:pointer}#recherchecolle .icon-recherche{left:20.5em}#recherchecdt .icon-recherche{left:33.7em}#rechercherecent .icon-recherche{left:31.2em}#parentsdoc>a[class^="icon-"]{float:right;margin:.4em 0 0 .3em}#parentsdoc .nom{font-weight:700}#parentsdoc .nom a{text-decoration:none;color:black;margin:0;vertical-align:baseline}@media screen and (max-width:500px){#recherchecdt select#seances{width:calc(65% - 6.5em);margin:0}#recherchecdt select#semaines{width:35%;margin:0}#rechercherecent select{margin:0;width:calc(50% - .3em)}#recherchecdt .icon-recherche,#rechercherecent .icon-recherche{left:2.1em;top:2.8em}#recherchecdt input,#rechercherecent input{width:100%;margin-top:.2em}}.rep,.doc{margin:0 2%;padding:0;border-bottom:1px dotted #BBB;line-height:1.3em}.repcontenu,.docdonnees{float:right;font-size:.8em;padding-left:.5em;line-height:1.625em}.rep>a[class^="icon-"],.doc>a[class^="icon-"]{float:right;margin-left:.3em;line-height:1.3em}.rep a,.doc a{text-decoration:none;color:black}.rep .nom,.doc .nom{font-weight:700;margin-left:.5em}.recents h3{margin:0}.recents h3 *{text-decoration:none;color:#001030}.recents .publi{font-size:.8em;padding:0 5px .3em;color:#002877}.edition{display:inline;text-align:left;padding-right:3em}h3.edition.editable{padding-right:1%}.edition+p,.edition ~ form{margin-top:.75em}article.cache{background-color:#AAA;opacity:.6}#log{position:fixed;top:3%;left:3%;padding:.3em 2%;z-index:25;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}[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}.confirmation{text-align:center}#fenetre.usergrp .ligne{border-bottom:1px dotted #BBB}#fenetre.usergrp input{margin-top:.2em}.protection{font-size:.8em;color:#999}#rgpd p{font-size:.8em}input,select,textarea{box-sizing:border-box;border:1px solid;border-radius:2px;padding:0 .3em}#fichier{border:0;font-size:.8em;height:1.9em}p.ligne label{font-weight:700}p.ligne input,p.ligne select,p.ligne code{float:right;margin-left:.2em;font-size:.8em;height:1.6em}p.ligne input[type="checkbox"],p.ligne input[type="radio"]{width:1em}input.ligne{width:96%;margin:.5em 2%;height:1.6em;font-size:.8em;display:block}p.ligne+*{clear:right}.gestion_protection{margin:0!important}.gestion_protection p{margin:0}.gestion_protection input{vertical-align:sub}.supprmultiple{margin-top:.3em;margin-bottom:0!important}table{width:100%;margin:1em 0;border-collapse:collapse;border:medium solid #999}table td,table th{padding:.15em .3em 0;border:thin solid #AAA}.centre,#planning,#notes{text-align:center}.centre th{padding:.15em 0}tr[data-id]:hover,#planning tbody tr:hover,#fenetre tbody tr:not(.categorie):hover{background-color:#EFF}#selmult{width:auto;min-width:70%;margin:2em auto;padding-bottom:2em}#selmult th,#selmult td{border:0}#selmult tr{border-top:0;border-left:none;border-right:0;border-bottom:1px dotted #BBB}#selmult td{padding-left:5%;font-weight:700}#selmult .element td:first-child{padding-left:10%;font-weight:500}#selmult th+th,#selmult td+td{vertical-align:sub;text-align:center;width:5em;padding:.1em}#selmult input{vertical-align:sub}.sel{background-color:#EFF}.editable,.titrecdt.edition,form.titrecdt{border:1px dotted #BBB;position:relative}.editable a[class^="icon-"],p.titrecdt a[class^="icon-"],.maildest a[class^="icon-"]{padding-left:.3em}.avecform{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:.6em;margin-top:.5em;width:80%;overflow:hidden;white-space:nowrap}h3.avecform input{width:50%}textarea,[contenteditable=true].ligne{width:calc(100% - 3em);margin:0 1.5em}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}p.boutons.ligne{width:96%;margin:0 2%}[contenteditable=true]:empty:before{content:attr(placeholder);color:#999;font-size:.8em;display:block}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}.icon-mailenvoi{font-size:2em}#notes th,#notes td{padding:.15em .5em}#notes .icones{text-align:left;padding:.15em .5em;width:2.3em}.notes td+td{width:6em;text-align:center}.notes td+td select{width:6em;font-size:.8em;margin-bottom:.2em}.notes+p.ligne{clear:right;margin-top:.5em}td.pasnote{font-style:italic;text-align:center}.collsel{font-weight:700}.collnosel,.dejanote{color:#AAA}#tableaunotes td+td{text-align:right}.utilisateurs th,.utilisateurs td{border:1px dotted #BBB}.utilisateurs .icone{text-align:center;width:1.4em}#fenetre .utilisateurs .icone{width:5em;padding:0}.categorie th:first-child{padding-left:3%}.utilisateurs .icones{width:1em;white-space:nowrap;font-weight:normal;text-align:right}.utilisateurs .icones *{font-weight:normal;padding:0;margin:0}.utilisateurs .icones input{width:1em}.utilisateurs .icones a{display:inline-block;width:1em}.categorie span,#envoimails span{cursor:pointer}.utilisateurs .cache{padding:0 .3em}.utilisateurs .cache div{padding:.1em 0;width:100%}.utilisateurs .cache.icone div{text-align:center}#planning select{font-size:.8em;height:1.6em;margin-bottom:3px}th.vertical{vertical-align:bottom;padding:1em 0;text-align:center;min-width:1.4em}th.vertical span{display:inline-block;white-space:nowrap;writing-mode:vertical-lr;-webkit-writing-mode:vertical-rl;transform:rotate(180deg);-webkit-transform:rotate(180deg)}@media print{body{font-size:90%;font-family:Serif}#colonne,#recherchecolle,#recherchecdt,#rechercheagenda,[id^="aide-"],[id^="form-"],footer,a[class^="icon-"]{display:none}.editable,.titrecdt.edition,form.titrecdt{border:0}h1{font-size:1.7em}h2{font-size:1.5em;margin:.7em 0}h3{font-size:1.35em;margin:.6em 0}h4{font-size:1.2em;margin:.4em 0 .2em}article{border:1px solid #999}table th{padding:.15em .5%}}#calendrier{margin-top:1em}#calendrier table{table-layout:fixed}#semaine,.semaine-bg,.evenements{margin:0}#semaine{font-weight:900;text-align:center}#semaine th{overflow:hidden;text-overflow:clip}.semaine-bg{border-top:0;position:absolute;z-index:1}.autremois{background-color:#e7eefe;color:#002877}#aujourdhui{background-color:#99b3e5}.evenements{position:relative;z-index:2;border-top:0;border-bottom:0}.evenements thead{border-bottom:1px solid #999}.evenements th{padding:.15em .5%;text-align:right}.evenements td{padding:2px 3px 1px;border:none!important}.modifevnmt{padding:1px 3px;border-radius:5px;white-space:nowrap;overflow:hidden;font-size:.8em;cursor:pointer}.evnmt_suivi{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:-2px}.evnmt_suite{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-3px}#load{display:none;margin:0;padding:0;position:fixed;top:0;left:0;width:100%;height:100%;z-index:30;text-align:center}#load img{position:absolute;top:50%}#cahiers{text-align:center}#cahiers a{text-decoration:none;font-weight:700;display:block;color:#000}#cahiers a:hover{color:#002877;background-color:#e7eefe}
\ No newline at end of file
+*{font-size:1em;margin:0;padding:0}html,body{height:100%}body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif;position:relative;width:100%;margin:0 auto;min-width:320px;max-width:1500px;background-color:#f6f6f6}h1{font-size:2.2em;text-align:center;padding:1em 2em}h2{font-size:1.8em;margin:1em 0 .8em}h3{font-size:1.5em;margin:1em 0 .5em}h2+h3{padding-left:1%}h4{font-size:1.3em;margin:.5em 0 .2em;padding-left:2.5%}h5{font-size:1.1em;margin-top:.2em;padding-left:4%}h6{font-size:1em;margin-top:.2em;padding-left:5.5%}ul,ol{margin:.5em 0;padding:0 2% 0 6%}p{padding:0 2%}p+p{margin-top:.5em}img{border:0;max-width:100%}div,p,section,article{text-align:justify}#iconesmenu{background-color:#99b3e5;text-align-last:justify}#iconesmenu a{padding:0 3px;color:#001030}#iconesmenu a:hover{color:#CDF}#iconesmenu .icon-recent::before{font-size:2em}#iconesmenu .icon-recent{font-size:.5em}#menu h3{font-size:1.2em;margin:.5em 3% .1em;padding-top:.3em;color:#001030;border-top:1px solid #001030}#menu a{display:block;margin-bottom:.2em;text-decoration:none;color:#002877}#menu a.menurep{padding-left:3%;font-size:.9em}a#actuel{color:#1f5fdf}#menu a#actuel{font-style:italic}.menurep{padding-left:.5em;font-size:.9em}section>:first-child,article>:first-child,article>h2:first-of-type,article>h3:first-of-type,#fenetre h3:first-of-type{margin-top:0}article>:last-child,#fenetre>:last-child{margin-bottom:0}article{margin-bottom:1em;padding:1em 2%;background-color:#cdd5e4;overflow-x:auto}#fenetre{position:fixed;z-index:15;padding:1em 2% 0;background-color:#e7eefe;opacity:.97;box-shadow:.5em .5em .5em #777}#fenetre:after{content:"";display:block;height:1em;width:100%}#fenetre_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;z-index:14}article>a[class^="icon-"],#fenetre>a[class^="icon-"]{float:right;margin-left:.3em}#fenetre hr{margin:1.5em 0}footer{text-align:center;width:90%;padding:1em 5%;clear:both;position:fixed;left:0;bottom:0;z-index:20;border-top:1px solid black;background-color:#DDD;opacity:.97}@media screen and (min-width:800px){nav{float:left;width:240px;margin:0 30px;padding:.7em 20px .5em;padding-top:.1em;margin-bottom:3em;background-color:#99b3e5}#iconesmenu{width:240px;padding:.7em 0 .5em}#iconesmenu a:first-child{display:none}#menu hr{margin:0 3% .7em;color:#001030;border-top:1px solid #001030;border-bottom:0}#menu a:hover{color:#CDF}section{position:relative;margin:0 30px 0 340px;padding-bottom:3em}#icones{position:absolute;top:-4em;right:0}header+section{width:96%;margin:0 auto;max-width:1500px;text-align:center}footer{font-size:.8em}#fenetre{top:10%;left:0;right:0;width:70%;margin:0 auto;max-height:calc(90% - 7em)}p.ligne input,p.ligne select,p.ligne code{width:65%}}@media screen and (max-width:800px){body{padding-top:2.2em}h1{font-size:1.8em;padding:.3em 3em}h2{font-size:1.65em}#iconesmenu{position:fixed;top:0;left:0;right:0;z-index:20;min-width:320px;height:1.4em;border-bottom:1px solid black;padding:.4em 0}#iconesmenu a:first-child{padding-left:20px}#iconesmenu a:last-child{padding-right:20px}#iconesmenu [class="icon-imprime"]{display:none}#menu{position:fixed;top:2.2em;left:0;z-index:19;height:calc(100% - 5.4em);width:0;padding:.5em 0 .7em;overflow-x:hidden;transition:all 1s ease-in-out;background-color:#e7eefe}#menu.visible{display:block;width:80%;padding:.5em 20px .7em}#menu_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;z-index:18}#menu a,nav h3{white-space:pre}#menu hr:first-of-type{display:none}#menu a:last-child{padding-bottom:.5em}section{position:relative;width:96%;margin:0 auto;padding-bottom:3em}#icones{position:absolute;top:-2.2em;right:0}header+section{text-align:center}footer{font-size:.6em;height:1.4em}#fenetre{top:3em;left:0;right:0;width:92%;margin:0 auto;max-height:calc(100% - 8em)}p.ligne input,p.ligne select,p.ligne code{width:35%}}.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%;color:#ba0d1f}.warning,.annonce{color:#ba0d1f;border:2px solid #ba0d1f}.oubli{font-size:.8em;text-align:center}.oubli a{text-decoration:none;color:#333}.oubli label{font-weight:700}.oubli input{margin-left:1em;vertical-align:text-top}p.titrecdt{text-align:right;text-decoration:underline}p.titrecdt.edition{text-align:left;text-decoration:none;padding-right:1%}h1 span{font-size:70%;vertical-align:7%;margin-left:.4em}.topbarre{min-height:1.6em;background-color:#DDD;border:1px solid #BBB;width:auto;border-radius:4px;padding:0 1em .2em;margin-bottom:1.5em}.topbarre *{margin-right:.4em;vertical-align:middle}.topbarre *:last-child{margin-right:0}.topbarre a{width:1em}.topbarre input,.topbarre select{font-size:.8em;height:1.4em}#recherchecolle input{padding-left:1.8em;width:calc(100% - 16.1em)}#recherchecdt input{padding-left:1.8em;width:calc(100% - 28.1em)}#rechercherecent input{padding-left:1.8em;width:calc(100% - 25.5em)}.topbarre select#seances{width:11em}.topbarre select#semaines{width:9em}#rechercherecent select{width:12em}.topbarre .icon-recherche{position:absolute;top:.75em;font-size:.7em;cursor:pointer}#recherchecolle .icon-recherche{left:20.5em}#recherchecdt .icon-recherche{left:33.7em}#rechercherecent .icon-recherche{left:31.2em}#parentsdoc>a[class^="icon-"]{float:right;margin:.4em 0 0 .3em}#parentsdoc .nom{font-weight:700}#parentsdoc .nom a{text-decoration:none;color:black;margin:0;vertical-align:baseline}@media screen and (max-width:500px){#recherchecdt select#seances{width:calc(65% - 6.5em);margin:0}#recherchecdt select#semaines{width:35%;margin:0}#rechercherecent select{margin:0;width:calc(50% - .3em)}#recherchecdt .icon-recherche,#rechercherecent .icon-recherche{left:2.1em;top:2.8em}#recherchecdt input,#rechercherecent input{width:100%;margin-top:.2em}}.rep,.doc{margin:0 2%;padding:0;border-bottom:1px dotted #BBB;line-height:1.3em}.repcontenu,.docdonnees{float:right;font-size:.8em;padding-left:.5em;line-height:1.625em}.rep>a[class^="icon-"],.doc>a[class^="icon-"]{float:right;margin-left:.3em;line-height:1.3em}.rep a,.doc a{text-decoration:none;color:black}.rep .nom,.doc .nom{font-weight:700;margin-left:.5em}.recents h3{margin:0}.recents h3 *{text-decoration:none;color:#001030}.recents .publi{font-size:.8em;padding:0 5px .3em;color:#002877}.edition{display:inline;text-align:left;padding-right:3em}h3.edition.editable{padding-right:1%}.edition+p,.edition ~ form{margin-top:.75em}article.cache{background-color:#AAA;opacity:.6}#log{position:fixed;top:3%;left:3%;padding:.3em 2%;z-index:25;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}[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}.confirmation{text-align:center}#fenetre.usergrp .ligne{border-bottom:1px dotted #BBB}#fenetre.usergrp input{margin-top:.2em}.protection{font-size:.8em;color:#999}#rgpd p{font-size:.8em}input,select,textarea{box-sizing:border-box;border:1px solid;border-radius:2px;padding:0 .3em}#fichier{border:0;font-size:.8em;height:1.9em}p.ligne label{font-weight:700}p.ligne input,p.ligne select,p.ligne code{float:right;margin-left:.2em;font-size:.8em;height:1.6em}p.ligne input[type="checkbox"],p.ligne input[type="radio"]{width:1em}input.ligne{width:96%;margin:.5em 2%;height:1.6em;font-size:.8em;display:block}p.ligne+*{clear:right}.gestion_protection{margin:0!important}.gestion_protection p{margin:0}.gestion_protection input{vertical-align:sub}.supprmultiple{margin-top:.3em;margin-bottom:0!important}table{width:100%;margin:1em 0;border-collapse:collapse;border:medium solid #999}table td,table th{padding:.15em .3em 0;border:thin solid #AAA}.centre,#planning,#notes{text-align:center}.centre th{padding:.15em 0}tr[data-id]:hover,#planning tbody tr:hover,#fenetre tbody tr:not(.categorie):hover{background-color:#EFF}#selmult{width:auto;min-width:70%;margin:2em auto;padding-bottom:2em}#selmult th,#selmult td{border:0}#selmult tr{border-top:0;border-left:none;border-right:0;border-bottom:1px dotted #BBB}#selmult td{padding-left:5%;font-weight:700}#selmult .element td:first-child{padding-left:10%;font-weight:500}#selmult th+th,#selmult td+td{vertical-align:sub;text-align:center;width:5em;padding:.1em}#selmult input{vertical-align:sub}.sel{background-color:#EFF}.editable,.titrecdt.edition,form.titrecdt{border:1px dotted #BBB;position:relative}.editable a[class^="icon-"],p.titrecdt a[class^="icon-"],.maildest a[class^="icon-"]{padding-left:.3em}.avecform{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:.6em;margin-top:.5em;width:80%;overflow:hidden;white-space:nowrap}h3.avecform input{width:50%}textarea,[contenteditable=true].ligne{width:calc(100% - 3em);margin:0 1.5em}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}p.boutons.ligne{width:96%;margin:0 2%}[contenteditable=true]:empty:before{content:attr(placeholder);color:#999;font-size:.8em;display:block}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}.icon-mailenvoi{font-size:2em}#notes th,#notes td{padding:.15em .5em}#notes .icones{text-align:left;padding:.15em .5em;width:2.3em}.notes td+td{width:6em;text-align:center}.notes td+td select{width:6em;font-size:.8em;margin-bottom:.2em}.notes+p.ligne{clear:right;margin-top:.5em}td.pasnote{font-style:italic;text-align:center}.collsel{font-weight:700}.collnosel,.dejanote{color:#AAA}#tableaunotes td+td{text-align:right}.utilisateurs th,.utilisateurs td{border:1px dotted #BBB}.utilisateurs .icone{text-align:center;width:1.4em}#fenetre .utilisateurs .icone{width:5em;padding:0}.categorie th:first-child{padding-left:3%}.utilisateurs .icones{width:1em;white-space:nowrap;font-weight:normal;text-align:right}.utilisateurs .icones *{font-weight:normal;padding:0;margin:0}.utilisateurs .icones input{width:1em}.utilisateurs .icones a{display:inline-block;width:1em}.categorie span,#envoimails span{cursor:pointer}.utilisateurs .cache{padding:0 .3em}.utilisateurs .cache div{padding:.1em 0;width:100%}.utilisateurs .cache.icone div{text-align:center}#planning select{font-size:.8em;height:1.6em;margin-bottom:3px}th.vertical{vertical-align:bottom;padding:1em 0;text-align:center;min-width:1.4em}th.vertical span{display:inline-block;white-space:nowrap;writing-mode:vertical-lr;-webkit-writing-mode:vertical-rl;transform:rotate(180deg);-webkit-transform:rotate(180deg)}@media print{body{font-size:90%;font-family:Serif}#colonne,#recherchecolle,#recherchecdt,#rechercheagenda,[id^="aide-"],[id^="form-"],footer,a[class^="icon-"]{display:none}.editable,.titrecdt.edition,form.titrecdt{border:0}h1{font-size:1.7em}h2{font-size:1.5em;margin:.7em 0}h3{font-size:1.35em;margin:.6em 0}h4{font-size:1.2em;margin:.4em 0 .2em}article{border:1px solid #999}table th{padding:.15em .5%}}#calendrier{margin-top:1em}#calendrier table{table-layout:fixed}#semaine,.semaine-bg,.evenements{margin:0}#semaine{font-weight:900;text-align:center}#semaine th{overflow:hidden;text-overflow:clip}.semaine-bg{border-top:0;position:absolute;z-index:1}.autremois{background-color:#e7eefe;color:#002877}#aujourdhui{background-color:#99b3e5}.evenements{position:relative;z-index:2;border-top:0;border-bottom:0}.evenements thead{border-bottom:1px solid #999}.evenements th{padding:.15em .5%;text-align:right}.evenements td{padding:2px 3px 1px;border:none!important}.modifevnmt{padding:1px 3px;border-radius:5px;white-space:nowrap;overflow:hidden;font-size:.8em;cursor:pointer}.evnmt_suivi{border-top-right-radius:0;border-bottom-right-radius:0;margin-right:-2px}.evnmt_suite{border-top-left-radius:0;border-bottom-left-radius:0;margin-left:-3px}#load{display:none;margin:0;padding:0;position:fixed;top:0;left:0;width:100%;height:100%;z-index:30;text-align:center}#load img{position:absolute;top:50%}#cahiers{text-align:center}#cahiers a{text-decoration:none;font-weight:700;display:block;color:#000}#cahiers a:hover{color:#002877;background-color:#e7eefe}#cahiers+p{text-align:center;color:#777;padding-top:1em}
\ No newline at end of file
diff -urN cahier-de-prepa9.0.1/def_sql.php cahier-de-prepa9.0.2/def_sql.php
--- cahier-de-prepa9.0.1/def_sql.php	2019-08-28 14:55:58.599311389 +0200
+++ cahier-de-prepa9.0.2/def_sql.php	2019-09-01 02:06:38.808996598 +0200
@@ -58,9 +58,6 @@
 --       * si commence par un ! : compte suspendu
 -- mailexp : nom d'expédition des courriels
 -- mailcopie : si par défaut envoi personnel d'une copie de ses courriels
--- mailenvoi : si on peut envoyer des courriels ; doit être cohérent avec mail
--- mailliste : si on apparait dans la liste des destinataires possibles
---             de courriels pour les élèves ; doit être cohérent avec mail
 -- permconn : token d'identification légère, par cookie
 -- lastconn : horodatage de la connexion actuelle
 CREATE TABLE `utilisateurs` (
diff -urN cahier-de-prepa9.0.1/docs.php cahier-de-prepa9.0.2/docs.php
--- cahier-de-prepa9.0.1/docs.php	2019-08-26 01:35:41.328219964 +0200
+++ cahier-de-prepa9.0.2/docs.php	2019-09-08 10:41:51.653965595 +0200
@@ -91,18 +91,20 @@
 
 // Liste des icônes pour affichage
 $icones = array(
-  'pdf' => '-pdf',
+  'pdf' => '-pdf', 'dvi' => '-pdf',
+  'py' => '-py', 'sql' => '-sql',
+  'db' => '-db', 'db3' => '-db', 'sqlite' => '-db', 'sq3' => '-db',
   'doc' => '-doc', 'odt' => '-doc', 'docx' => '-doc',
-  'xls' => '-xls', 'ods' => '-xls', 'xlsx' => '-xls',
-  'ppt' => '-ppt', 'odp' => '-ppt', 'pptx' => '-ppt',
-  'jpg' => '-jpg', 'jpeg' => '-jpg', 'png' => '-jpg', 'gif' => '-jpg', 'svg' => '-jpg', 'tif' => '-jpg', 'tiff' => '-jpg', 'bmp' => '-jpg', 'ps' => '-jpg', 'eps' => '-jpg',
+  'xls' => '-xls', 'ods' => '-xls', 'xlsx' => '-xls', 'csv' => '-xls',
+  'ppt' => '-ppt', 'odp' => '-ppt', 'pptx' => '-ppt', 'pps' => 'ppt',
+  'jpg' => '-jpg', 'jpeg' => '-jpg', 'jpe' => '-jpg', 'png' => '-jpg', 'gif' => '-jpg', 'svg' => '-jpg', 'tif' => '-jpg', 'tiff' => '-jpg', 'bmp' => '-jpg', 'ps' => '-jpg', 'eps' => '-jpg',
   'mp3' => '-mp3', 'ogg' => '-mp3', 'oga' => '-mp3', 'wma' => '-mp3', 'wav' => '-mp3', 'ra' => '-mp3', 'rm' => '-mp3',
-  'mp4' => '-mp4', 'avi' => '-mp4', 'mpeg' => '-mp4', 'mpg' => '-mp4', 'wmv' => '-mp4', 'mp4' => '-mp4', 'ogv' => '-mp4', 'qt' => '-mp4', 'mov' => '-mp4', 'mkv' => '-mp4', 'flv' => '-mp4',
-  'zip' => '-zip', 'rar' => '-zip', '7z' => '-zip',
-  'py' => '-py', 'exe' => '-py', 'sh' => '-py', 'ml' => '-py', 'mw' => '-py',
-  'db' => '-db', 'db3' => '-db', 'sqlite' => '-db',
-  'sql' => '-sql',
-  'txt' => '', 'rtf' => '', '' => ''
+  'mp4' => '-mp4', 'avi' => '-mp4', 'mpeg' => '-mp4', 'mpg' => '-mp4', 'wmv' => '-mp4', 'mp4' => '-mp4', 'ogv' => '-mp4', 'qt' => '-mp4', 'mov' => '-mp4', 'mkv' => '-mp4', 'flv' => '-mp4', 'swf' => '-mp4',
+  'zip' => '-zip', 'rar' => '-zip', '7z' => '-zip', 'apk' => '-zip', 'dmg' => '-zip', 'jar' => '-zip', 
+  'apk' => '-apk',
+  'exe' => '-exe', 'sh' => '-exe', 'ml' => '-exe', 'mw' => '-exe', 'msi' => '-exe',
+  'tex' => '-tex',
+  'ggb' => '-cod', 'htm' => '-cod', 'mht' => '-cod', 'rw3' => '-cod', 'sce' => '-cod', 'slx' => '-cod', 'vpp' => '-cod'
 );
 
 
@@ -154,7 +156,7 @@
                               FROM docs WHERE parent = $rid AND protection != 32 $ordre");
   if ( $nd = $resultat->num_rows )  {
     while ( $r = $resultat->fetch_assoc() )  {
-      $icone = isset($icones[$ext = substr($r['ext'],1)]) ? $icones[$ext] : '';
+      $icone = $icones[$ext = substr($r['ext'],1)] ?? '';
       // Si protégé, pas de détails et lien que si utilisateur non connecté
       if ( $r['protection'] == 1 )  {
         if ( $autorisation )
@@ -319,19 +321,19 @@
         <option value="0">Ne pas déplacer</option><?php echo $select_reps; ?>
       </select>
     </p>
-    <p class="ligne"><label for="menu">Affichage du répertoire dans le menu&nbsp;: </label><input type="checkbox" name="menu" value="1"></p>
+    <p class="ligne"><label for="menurep">Affichage du répertoire dans le menu&nbsp;: </label><input type="checkbox" name="menurep" value="1"></p>
     <p class="ligne"><label for="protection">Accès&nbsp;: </label>
       <select name="protection[]" multiple><?php echo $select_protection; ?>
       </select>
     </p>
-    <p class="ligne"><label for="menu">Propager ce choix d'accès à chaque document/sous-répertoire&nbsp;: </label><input type="checkbox" name="propage" value="1"></p>
+    <p class="ligne"><label for="propage">Propager ce choix d'accès à chaque document/sous-répertoire&nbsp;: </label><input type="checkbox" name="propage" value="1"></p>
     <input type="button" class="ligne" value="Vider ce répertoire">
   </form>
 
   <form id="form-ajouterep" data-action="ajout-rep">
     <h3 class="edition">Ajouter un répertoire</h3>
     <p class="ligne"><label for="nom">Nom&nbsp;: </label><input type="text" name="nom" value="" size="50"></p>
-    <p class="ligne"><label for="menu">Affichage du répertoire dans le menu&nbsp;: </label><input type="checkbox" name="menu" value="1"></p>
+    <p class="ligne"><label for="menurep">Affichage du répertoire dans le menu&nbsp;: </label><input type="checkbox" name="menurep" value="1"></p>
     <p class="ligne"><label for="protection">Accès&nbsp;: </label>
       <select name="protection[]" multiple><?php echo $sel_protection; ?>
       </select>
diff -urN cahier-de-prepa9.0.1/fonctions.php cahier-de-prepa9.0.2/fonctions.php
--- cahier-de-prepa9.0.1/fonctions.php	2019-08-29 19:14:18.152836200 +0200
+++ cahier-de-prepa9.0.2/fonctions.php	2019-09-08 10:32:43.215902609 +0200
@@ -26,7 +26,7 @@
 //              3 pour reconnexion normale, 4 pour reconnexion light, 5 pour déconnexion
 function logconnect($connexion)  {
   if ( is_dir('sauvegarde') && is_executable('sauvegarde') && is_writable('sauvegarde') )  {
-    if ( !file_exists($fichier = 'sauvegarde/connexion.'.date('Y-m').'php') )  {
+    if ( !file_exists($fichier = 'sauvegarde/connexion.'.date('Y-m').'.php') )  {
       $f = fopen($fichier,'wb');
       fwrite($f, "<?php exit(); ?>\n\n");
     }
@@ -350,7 +350,7 @@
         $resultat = $mysqli->query("SELECT matiere, CONCAT(SUBSTRING(debut,9,2),'/',SUBSTRING(debut,6,2),' - ',t.nom,IF(matiere>0, CONCAT(' en ',m.nom),'')) AS titre,
                                            CONCAT('agenda?mois=',SUBSTRING(debut,3,2),SUBSTRING(debut,6,2)) AS lien, texte, 0 AS protection
                                     FROM agenda LEFT JOIN matieres AS m ON matiere = m.id LEFT JOIN `agenda-types` AS t ON type = t.id WHERE agenda.id = $id");
-      $prop = array_map($mysqli->real_escape_string,$resultat->fetch_assoc());
+      $prop = array_map(array($mysqli,'real_escape_string'),$resultat->fetch_assoc());
       $resultat->free();
       requete('recents',"INSERT INTO recents SET id=$id, type=$type, publi = NOW(), matiere = ${prop['matiere']}, titre = '${prop['titre']}', lien = '${prop['lien']}', texte = '${prop['texte']}', protection = ${prop['protection']}",$mysqli);
     }
@@ -599,7 +599,6 @@
     // Icônes principales (accueil, agenda, impression, rss)
     $recents = $_SESSION['recents'] ?? '';
     $icones = <<<FIN
-  <div id="iconesmenu">
     <a class="icon-menu" title="Afficher le menu"></a>
     <a class="icon-accueil" href="." title="Revenir à la page d'accueil"></a>
     <a class="icon-recent" href="recent" title="Voir les $recents nouveaux contenus">$recents</a>
@@ -619,22 +618,22 @@
         $icones .= "    <a class=\"icon-echange\" title=\"Changer de Cahier\"></a>\n";
     }
     // Connexion/Déconnexion
-    $icones .= ( ( $autorisation ) ? '    <a class="icon-deconnexion" title="Se déconnecter"></a>' : '    <a class="icon-connexion" title="Se connecter"></a>' )."\n  </div>";
+    $icones .= ( ( $autorisation ) ? '    <a class="icon-deconnexion" title="Se déconnecter"></a>' : '    <a class="icon-connexion" title="Se connecter"></a>' );
     
     ////////////////////////////
     // Menu : pages générales //
     ////////////////////////////
     
     // Pages d'information générales
-    $resultat = $mysqli->query("SELECT cle, nom FROM pages WHERE mat = 0 AND (id = 1 OR $requete_pages) ORDER BY ordre");
-    $menu = "  <hr>\n";
-    if ( $resultat->num_rows > 1 )  {
+    $resultat = $mysqli->query("SELECT cle, nom FROM pages WHERE mat = 0 AND id > 1 AND ( $requete_pages ) ORDER BY ordre");
+    $menu = "    <hr>\n";
+    if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )
-        $menu .= "  <a href=\".?${r['cle']}\">${r['nom']}</a>\n";
+        $menu .= "    <a href=\".?${r['cle']}\">${r['nom']}</a>\n";
     }
     $resultat->free();
     // Page de téléchargement
-    $menu .= "  <a href=\"docs\"><span class=\"icon-rep\"></span>&nbsp;Documents à télécharger</a>\n";
+    $menu .= "    <a href=\"docs\"><span class=\"icon-rep\"></span>&nbsp;Documents à télécharger</a>\n";
     $resultat = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = 0 AND menu = 1 AND ( $requete_reps )");
     if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )
@@ -663,34 +662,34 @@
     if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )  {
         $edition = ( $autorisation == 5 ) && ( in_array($r['id'],explode(',',$_SESSION['matieres'])) );
-        $menu .= "  <h3>${r['nom']}</h3>\n";
+        $menu .= "    <h3>${r['nom']}</h3>\n";
         if ( !is_null($r['pcle']) )  {
           $pcle = explode('//',$r['pcle']);
           $pnom = explode('//',$r['pnom']);
           $nom = $pnom[0];
           foreach ( $pcle as $cle )  {
-            $menu .= "  <a href=\".?$cle\">$nom</a>\n";
+            $menu .= "    <a href=\".?$cle\">$nom</a>\n";
             $nom = next($pnom);
           }
         }
         if ( $r['colles'] )
-          $menu .= "  <a href=\"colles?${r['cle']}\"><span class=\"icon-colles\"></span>&nbsp;Programme de colles</a>\n";
+          $menu .= "    <a href=\"colles?${r['cle']}\"><span class=\"icon-colles\"></span>&nbsp;Programme de colles</a>\n";
         if ( $r['docs'] )  {
-          $menu .= "  <a href=\"docs?${r['cle']}\"><span class=\"icon-rep\"></span>&nbsp;Documents à télécharger</a>\n";
+          $menu .= "    <a href=\"docs?${r['cle']}\"><span class=\"icon-rep\"></span>&nbsp;Documents à télécharger</a>\n";
           $resultat_doc = $mysqli->query("SELECT id, nom FROM reps WHERE matiere = ${r['id']} AND menu = 1 AND ( $requete_reps )");
           if ( $resultat_doc->num_rows )  {
             while ( $d = $resultat_doc->fetch_assoc() )
-              $menu .= "  <a class=\"menurep\" href=\"docs?rep=${d['id']}\">${d['nom']}</a>\n";        
+              $menu .= "    <a class=\"menurep\" href=\"docs?rep=${d['id']}\">${d['nom']}</a>\n";        
             $resultat_doc->free();
           }
         }
         if ( $r['cdt'] )  {
-          $menu .= "  <a href=\"cdt?${r['cle']}\"><span class=\"icon-cdt\"></span>&nbsp;Cahier de texte</a>\n";
+          $menu .= "    <a href=\"cdt?${r['cle']}\"><span class=\"icon-cdt\"></span>&nbsp;Cahier de texte</a>\n";
           if ( $edition && ( substr($actuel,0,3) == 'cdt' ) && ( substr($actuel,-strlen($r['cle'])-1) == "?${r['cle']}" ) )
             $menu .= "    <a class=\"menurep\" href=\"cdt-seances?${r['cle']}\">Types de séances</a>\n    <a class=\"menurep\" href=\"cdt-raccourcis?${r['cle']}\">Raccourcis de séances</a>\n";
         }
         if ( $r['notes'] )
-          $menu .= "  <a href=\"notes?${r['cle']}\"><span class=\"icon-notes\"></span>&nbsp;Notes</a>\n";
+          $menu .= "    <a href=\"notes?${r['cle']}\"><span class=\"icon-notes\"></span>&nbsp;Notes</a>\n";
       }
       $resultat->free();
     }
@@ -705,25 +704,27 @@
     // Liens d'édition, professeurs seulement
     if ( $autorisation == 5 )
       $menu .= <<<FIN
-  <h3>Gestion du site</h3>
-  <a href="pages">Les pages</a>
-  <a href="matieres">Les matières</a>
-  <a href="utilisateurs">Les utilisateurs</a>
-  <a href="utilisateurs-matieres">Les associations utilisateurs-matières</a>
-  <a href="utilisateurs-mails">Les courriels</a>
-  <a href="groupes">Les groupes</a>
-  <a href="planning">Le planning annuel</a>
+    <h3>Gestion du site</h3>
+    <a href="pages">Les pages</a>
+    <a href="matieres">Les matières</a>
+    <a href="utilisateurs">Les utilisateurs</a>
+    <a href="utilisateurs-matieres">Les associations utilisateurs-matières</a>
+    <a href="utilisateurs-mails">Les courriels</a>
+    <a href="groupes">Les groupes</a>
+    <a href="planning">Le planning annuel</a>
 
 FIN;
-    $menu = str_replace("a href=\"$actuel\"","a id=\"actuel\" href=\"$actuel\"",$menu);
     // Menu final
     $menu = <<<FIN
 <nav>
+  <div id="iconesmenu">
 $icones
-$menu
+  </div>
+  <div id="menu">
+$menu  </div>
 </nav>
-
 FIN;
+    $menu = str_replace("href=\"$actuel\"","id=\"actuel\" href=\"$actuel\"",$menu);
   }
   else
     $menu = '';
@@ -761,8 +762,8 @@
   <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=901">
-  <link rel="stylesheet" href="css/icones.min.css?v=901">$css
+  <link rel="stylesheet" href="css/style.min.css?v=903">
+  <link rel="stylesheet" href="css/icones.min.css?v=904">$css
   <script type="text/javascript" src="js/jquery.min.js"></script>
   <link rel="alternate" type="application/rss+xml" title="Flux RSS" href="rss/$rss/rss.xml">
 </head>
@@ -784,7 +785,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=900"></script>' : '<script type="text/javascript" src="js/fonctions.min.js?v=900"></script>';
+  $js = ( $edition ) ? '<script type="text/javascript" src="js/edition.min.js?v=903"></script>' : '<script type="text/javascript" src="js/fonctions.min.js?v=903"></script>';
   // Affichage de message si $_SESSION['message']
   if ( isset($_SESSION['message']) )  {
     $m = json_decode($_SESSION['message'],true);
Binary files cahier-de-prepa9.0.1/fonts/icomoon.woff and cahier-de-prepa9.0.2/fonts/icomoon.woff differ
diff -urN cahier-de-prepa9.0.1/gestioncompte.php cahier-de-prepa9.0.2/gestioncompte.php
--- cahier-de-prepa9.0.1/gestioncompte.php	2019-08-29 17:38:37.405971059 +0200
+++ cahier-de-prepa9.0.2/gestioncompte.php	2019-09-07 23:07:17.391190063 +0200
@@ -70,7 +70,7 @@
 
 if ( isset($_REQUEST['mail']) )  {
   
-  if ( !strlen($mail = str_replace('__','@',strtolower(trim($_REQUEST['mail'])))) || !filter_var($mail,FILTER_VALIDATE_EMAIL) )  {
+  if ( !($mail = filter_var(str_replace('__','@',strtolower(trim($_REQUEST['mail']))))) )  {
     if ( $_SERVER['REQUEST_METHOD'] == 'GET' )  {
       $mysqli = connectsql();
       debut($mysqli,$titre,'',false);
@@ -225,12 +225,12 @@
         $newmdp = sha1($mdp.$newmdp);
         // Login déterminé automatiquement
         $login = mb_strtolower(mb_substr($prenom,0,1).str_replace(' ','_',$nom));
-        $resultat = $mysqli->query('SELECT GROUP_CONCAT(login) AS logins FROM utilisateurs');
+        $resultat = $mysqli->query("SELECT id FROM utilisateurs WHERE login = '$login'");
         $mysqli->close();
-        $r = $resultat->fetch_assoc();
-        $resultat->free();
-        if ( in_array($login,explode(',',$r['logins'])) )
+        if ( $resultat->num_rows )  {
+          $resultat->free();
           exit('{"etat":"nok_","message":"Un compte avec le même identifiant existe déjà. Merci de vous connecter avec l\'adresse électronique correspondante."}');
+        }
         // Écriture du nouveau compte
         $mysqli = connectsql(true);
         if( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '$mail', mdp = '*$newmdp', autorisation = 2, matieres = CONCAT('0,',(SELECT GROUP_CONCAT(id) AS matieres FROM matieres)), timeout = 3600, mailexp = '$prenom $nom', mailcopie = 1, permconn = ''",$mysqli) )  {
@@ -302,7 +302,7 @@
     <a class="icon-ok" title="Valider"></a>
     <h3>Mot de passe oublié</h3>
     <form onsubmit="return false;">
-      <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>
+      <p>Si vous avez oublié votre mot de passe, vous pouvez le régénérer en saisissant 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="email" name="mail" autofocus placeholder="Adresse électronique">
     </form>
   </article>
@@ -315,7 +315,7 @@
     <a class="icon-ok" title="Valider"></a>
     <h3>Mot de passe oublié</h3>
     <form>
-      <p>Veuillez entrer deux fois votre nouveau mot de passe&nbsp;:</p>
+      <p>Veuillez saisir deux fois votre nouveau mot de passe&nbsp;:</p>
       <input class="ligne" type="password" name="mdp1" autofocus placeholder="Mot de passe">
       <input class="ligne" type="password" name="mdp2" placeholder="Confirmation">
       <input type="hidden" name="p" value="$p">
diff -urN cahier-de-prepa9.0.1/index.php cahier-de-prepa9.0.2/index.php
--- cahier-de-prepa9.0.1/index.php	2019-08-26 01:35:59.880410418 +0200
+++ cahier-de-prepa9.0.2/index.php	2019-09-04 14:45:06.001657083 +0200
@@ -42,7 +42,7 @@
 /////////////////////////////
 // Vérification de l'accès //
 /////////////////////////////
-$edition = acces($page['protection'],$page['mat'],$page['titre'],".?${page['cle']}",$mysqli);
+$edition = acces($page['protection'],$page['mat'],$page['titre'],(($page['id'] == 1)?'.':".?${page['cle']}"),$mysqli);
 
 //////////////
 //// HTML ////
@@ -50,7 +50,7 @@
 if ( $edition && $page['protection'] )
   $icone = ( $page['protection'] == 32 ) ? '<span class="icon-locktotal"></span>' : '<span class="icon-lock"></span>';
 else  $icone = '';
-debut($mysqli,$page['titre'].$icone,$message,$autorisation,".?${page['cle']}",$page['mat']?:false);
+debut($mysqli,$page['titre'].$icone,$message,$autorisation,(($page['id'] == 1)?'.':".?${page['cle']}"),$page['mat']?:false);
 
 // MathJax désactivé par défaut
 $mathjax = false;
diff -urN cahier-de-prepa9.0.1/js/edition.js cahier-de-prepa9.0.2/js/edition.js
--- cahier-de-prepa9.0.1/js/edition.js	2019-08-26 20:32:32.083006540 +0200
+++ cahier-de-prepa9.0.2/js/edition.js	2019-09-04 14:14:36.124907398 +0200
@@ -1372,11 +1372,11 @@
         $('option[value="'+a+'"]', sel).prop('selected',true);
   }
   if ( donnees[0] == 0 )
-    $('#nom,#parent,#menu', form).parent().remove();
+    $('#nom,#parent,#menurep', form).parent().remove();
   else {
     $('#nom', form).val(nom);
     if ( donnees[1] == '1' )
-      $('#menu', form).prop('checked',true);
+      $('#menurep', form).prop('checked',true);
     // Désactivation des déplacements impossibles
     $('[data-parents*=",'+id+',"]', form).prop('disabled', true);
   }
@@ -1683,12 +1683,17 @@
       // Marquage des déjà notés
       marque_dejanotes($('#sid').val());
       // Réglage du jour si hors de la semaine
-      var jour = new Date($('#jour').val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z) {return z+'-'+y+'-'+x; }));
-      var debut = new Date($('#sid option:selected').data('date').replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z) {return z+'-'+y+'-'+x; }));
-      var fin = new Date($('#sid option:selected').next().data('date').replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z) {return z+'-'+y+'-'+x; }));
-      if ( ( jour < debut ) || ( jour > fin ) ) {
-        debut = debut.toJSON();
-        $('#jour').val(debut.substr(8,2)+'/'+debut.substr(5,2)+'/'+debut.substr(0,4));
+      // Ne pas considérer l'option "Choisir la semaine"
+      if ( $('#sid option:selected').val() > 0 )  {
+        if ( !$('#jour').val() )
+          $('#jour').val($('#sid option:eq(1)').data('date'));
+        var jour = new Date($('#jour').val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z) {return z+'-'+y+'-'+x; }));
+        var debut = new Date($('#sid option:selected').data('date').replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z) {return z+'-'+y+'-'+x; }));
+        var fin = new Date($('#sid option:selected').next().data('date').replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z) {return z+'-'+y+'-'+x; }));
+        if ( ( jour < debut ) || ( jour > fin ) ) {
+          debut = debut.toJSON();
+          $('#jour').val(debut.substr(8,2)+'/'+debut.substr(5,2)+'/'+debut.substr(0,4));
+        }
       }
     }).change();
     // Gestion des séances de TD
@@ -2560,12 +2565,12 @@
   // Menu mobile
   $('.icon-menu').on("click", function(e) {
     e.stopPropagation();
-    $('nav').toggleClass('visible');
-    if ( $('nav').hasClass('visible') )  {
+    $('#menu').toggleClass('visible');
+    if ( $('#menu').hasClass('visible') )  {
       $('<div id="menu_fond"></div>').appendTo('body');
       $('#menu_fond').on("click", function() {
         $('#menu_fond').remove();
-        $('nav').removeClass('visible');
+        $('#menu').removeClass('visible');
       });
     }
     else 
@@ -2579,7 +2584,7 @@
             data: { action:'compteglobal' },
             dataType: 'json',
             afficheform: function(data) {
-              popup('<h3>Changer de Cahier</h3><div></div>',true);
+              popup('<h3>Changer de Cahier</h3><div></div><p>Cette liste est éditable sur l\'<a href="/connexion/">interface de connexion globale</a>.</p>',true);
               var f = $('#fenetre');
               // Récupération des valeurs et écriture 
               var cahiers = data['cahiers'];
diff -urN cahier-de-prepa9.0.1/js/edition.min.js cahier-de-prepa9.0.2/js/edition.min.js
--- cahier-de-prepa9.0.1/js/edition.min.js	2019-08-28 19:37:35.077528715 +0200
+++ cahier-de-prepa9.0.2/js/edition.min.js	2019-09-04 14:56:23.913456630 +0200
@@ -1,3 +1,3 @@
 function affiche(message,etat){$("#log").removeClass().addClass(etat).html(message).append('<span class="icon-ferme"></span>').fadeIn().off("click").on("click",function(){window.clearTimeout(extinction);$(this).fadeOut(800)});extinction=window.setTimeout(function(){$("#log").fadeOut(800)},6e3)}function reconnect(settings,light){$("#fenetre,#fenetre_fond").remove();if(settings.url=="recup.php")var action=settings.data.indexOf("prefs")?"récupérer les préférences de cet utilisateur":"récupérer la liste des répertoires et documents disponibles";else{var action="valider cette action";settings.afficheform=Function.prototype}if(light)popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>           <p>Votre connexion est active, mais vous devez saisir de nouveau votre mot de passe pour '+action+'.</p>           <form>           <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>           </form>',true);else popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>           <p>Votre connexion a été automatiquement désactivée. Vous devez vous connecter à nouveau pour '+action+'.</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);$("#fenetre input:first").focus();$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:settings.url,method:"post",data:$("#fenetre form").serialize()+"&"+settings.data,dataType:"json",el:settings.el,afficheform:settings.afficheform,fonction:settings.fonction}).done(function(data){if(data["etat"]!="mdpnok")$("#fenetre,#fenetre_fond").remove()})});$("#fenetre a.icon-ferme").on("click",function(){affiche("Modification non effectuée, connexion nécessaire","nok")});$("#fenetre input").on("keypress",function(e){if(e.which==13){$("#fenetre a.icon-ok").click();return false}})}function popup(contenu,modal){$("#fenetre,#fenetre_fond").remove();var el=$('<article id="fenetre"></article>').appendTo("body").html(contenu).focus();if(modal)$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});else $('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(el).on("click",function(){$("#fenetre_fond").remove();$(this).remove();el.removeAttr("id").insertBefore($("article,#calendrier,#parentsdoc+*").first())});$('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function(){el.remove();$("#fenetre_fond").remove()})}function confirmation(question,element,action){popup("<h3>Demande de confirmation</h3><p>"+question+'</p><p class="confirmation"><button class="icon-ok"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){action(element);$("#fenetre,#fenetre_fond").remove()});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function plie(){var lignes=$(this).parent().parent().nextUntil(".categorie");if($(this).hasClass("icon-deplie")){lignes.children().wrapInner("<div></div>").addClass("cache");lignes.find("div").slideUp(1e3);window.setTimeout(function(){lignes.hide().children().html(function(){return $(this).children().html()})},1e3)}else{lignes.show();lignes.children().wrapInner('<div style="display:none;"></div>');lignes.find("div").slideDown(1e3);window.setTimeout(function(){lignes.children().html(function(){return $(this).children().html()}).removeClass("cache")},1e3)}$(this).toggleClass("icon-plie icon-deplie")}$.fn.textareahtml=function(){this.each(function(){var ta=$(this);var placeholder=this.getAttribute("placeholder");this.setAttribute("placeholder",placeholder+". Formattage en HTML, balises visibles.");var ce=$('<div contenteditable="true" placeholder="'+placeholder+'"></div>').insertAfter(ta.before(boutons)).hide();var boutonretour=ta.prev().children(".icon-retour");if(ta.hasClass("ligne")){ce.addClass("ligne");ta.prev().addClass("ligne")}ta.on("keypress",function(e){if(e.which==13)this.value=nettoie(this.value)}).on("paste cut",function(){var el=this;setTimeout(function(){el.value=nettoie(el.value)},100)});ce.on("keypress",function(e){if(e.which==13)boutonretour.click()}).on("paste cut",function(){var el=this;setTimeout(function(){el.innerHTML=nettoie(el.innerHTML)+"<br>"},100)});ta.prev().children(".icon-nosource").on("click",function(e){e.preventDefault();ta.hide();ce.show().css("min-height",ta.outerHeight());$(this).hide().prev().show();ce.focus().html(nettoie(ta.val())).change();if(window.getSelection){var r=document.createRange();r.selectNodeContents(ce[0]);r.collapse(false);var s=window.getSelection();s.removeAllRanges();s.addRange(r)}else{var r=document.body.createTextRange();r.moveToElementText(ce[0]);r.collapse(false);r.select()}});ta.prev().children(".icon-source").on("click",function(e){e.preventDefault();ce.hide(0);ta.show(0).css("height",ce.height());$(this).hide().next().show();ta.focus().val(nettoie(ce.html()))}).hide();ta.prev().children(".icon-aide").on("click",function(e){e.preventDefault();aidetexte()});ta.prev().children().not(".icon-nosource,.icon-source,.icon-aide").on("click",function(e){e.preventDefault();window["insertion_"+this.className.substring(5)]($(this))})})};$.fn.editinplace=function(){this.each(function(){var el=$(this);el.data("original",el.is("h3")?el.text():el.html());$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transforme)})};function transforme(){var el=$(this).parent().addClass("avecform");if(el.is("div")){if(el.hasClass("majpubli"))el.html('<form><textarea name="val" rows="'+(el.data("original").split(/\r\n|\r|\n/).length+3)+'"></textarea><p class="ligne"><label for="publi">Publier en tant que mise à jour&nbsp;: </label><input type="checkbox" id="publi" name="publi" value="1" checked></p></form>');else el.html('<form><textarea name="val" rows="'+(el.data("original").split(/\r\n|\r|\n/).length+3)+'"></textarea></form>');$("textarea:visible").on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)})}else el.html('<form class="edition" onsubmit="$(this).children(\'a.icon-ok\').click(); return false;"><input type="text" name="val" value=""></form>');var input=el.find('[name="val"]').val(el.data("original")).attr("placeholder",el.attr("placeholder"));if(el.hasClass("edithtml"))input.textareahtml();$('<a class="icon-ok" title="Valider"></a>').appendTo(el.children()).on("click",function(){var id=el.data("id").split("|");if(el.hasClass("edithtml"))input.val(nettoie(input.is(":visible")?input.val():input.next().html()));$.ajax({url:"ajax.php",method:"post",data:{action:id[0],champ:id[1],id:id[2],val:input.val(),publi:el.find(":checkbox").is(":checked")||undefined},dataType:"json",el:el,fonction:function(el){var val=el.find('[name="val"]').val();el.removeClass("avecform").html(val).data("original",val);$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transforme)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(el.children()).on("click",function(){el.removeClass("avecform").html(el.data("original"));$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transforme)});input.focus().val(el.hasClass("edithtml")?nettoie(input.val()):input.val())}$.fn.editinplacecdt=function(){this.each(function(){$(this).wrapInner("<span></span>").data("original",$(this).text());$('<a class="icon-edite" title="Modifier"></a>').appendTo($(this)).on("click",transformecdt)})};function transformecdt(){var el=$(this).parent();$(".icon-edite",el).remove();var form=$('<form class="titrecdt"></form>').insertBefore(el.parent().children("div")).html($("#form-cdt").html());$("input, select",form).attr("id",function(){return this.getAttribute("name")});var valeurs=el.data("donnees");for(var cle in valeurs)$("#"+cle).val(valeurs[cle]);form.init_cdt_boutons();$("textarea",form).on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});$("input,#demigroupe",form).on("change keyup",function(){var t=new Date($("#jour").val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var dg=$("#demigroupe").val()==1?" (en demi-groupe)":"";switch(parseInt(seances[$("#tid").val()])){case 0:var titre=jours[t.getDay()]+" "+$("#jour").val()+" à "+$("#h_debut").val()+" : "+$("#tid option:selected").text()+dg;break;case 1:var titre=jours[t.getDay()]+" "+$("#jour").val()+" de "+$("#h_debut").val()+" à "+$("#h_fin").val()+" : "+$("#tid option:selected").text()+dg;break;case 2:var titre=jours[t.getDay()]+" "+$("#jour").val()+" : "+$("#tid option:selected").text()+" pour le "+$("#pour").val()+dg;break;case 3:var titre=jours[t.getDay()]+" "+$("#jour").val()+" : "+$("#tid option:selected").text()+dg;break;case 4:var titre=jours[t.getDay()]+" "+$("#jour").val();break;case 5:var titre="[Entrée hebdomadaire]"}$("span",el).text(titre)});$('<a class="icon-ok" title="Valider"></a>').appendTo(el).on("click",function(){var id=el.parent().data("id").split("|");$.ajax({url:"ajax.php",method:"post",data:"action=cdt-elems&id="+id[1]+"&"+form.serialize(),dataType:"json",el:el,fonction:function(el){var form=el.siblings("form");el.data("original",$("span",el).text()).data("donnees",{tid:$("#tid").val(),jour:$("#jour").val(),h_debut:$("#h_debut").val(),h_fin:$("#h_fin").val(),pour:$("#pour").val(),demigroupe:$("#demigroupe").val()});form.remove();$("a",el).remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transformecdt)}}).done(function(data){if(data["etat"]=="ok"&&data["reload"]=="oui")location.reload(true)})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(el).on("click",function(){form.remove();$("span",el).html(el.data("original"));$("a",el).remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transformecdt)})}function nettoie(html){if(html.indexOf("cdptmp")>0){var tmp=$("<div>"+html+"</div>");tmp.find(".cdptmp").contents().unwrap();html=tmp.html();if(html.indexOf("cdptmp")>0)html=html.replace(/<span class="cdptmp"><\/span>/g,"")}return html.replace(/(<\/?[A-Z]+)([^>]*>)/g,function(tout,x,y){return x.toLowerCase()+y}).replace(/[\r\n ]+/g," ").replace(/(<br>)+[ ]?<\/(p|div|li|h)/g,function(tout,x,y){return"</"+y}).replace(/<br>/g,"<br>\n").replace(/<(p|div|li|h)/g,function(x){return"\n"+x}).replace(/<\/(p|div|li|h.)>/g,function(x){return x+"\n"}).replace(/<\/?(ul|ol)[^>]*>/g,function(x){return"\n"+x+"\n"}).replace(/^(?!(<p|<div|<ul|<ol|<li|<h))(.+)<br>$/gm,function(tout,x,y){return"<p>"+y+"</p>"}).replace(/^(?!(<(p|div|ul|ol|li)))[ ]?(.+)[ ]?$/gm,function(t,x,y,z){return z.match(/.*(p|div|ul|ol|li|h.)>$/)?z:"<p>"+z+"</p>"}).replace(/^[ ]?(<\/?(br|p|div|h.)>){0,2}[ ]?(<\/(p|div|h.)>)?[ ]?$/gm,"").replace(/^\n/gm,"").replace(/<li/g,"  <li")}function insert(el,debut,fin,milieu){var contenant=el.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(!contenant.hasAttribute("data-selection"))marqueselection(el);var texte=milieu===undefined?debut+"Í"+contenant.getAttribute("data-selection")+"Ì"+fin:debut+"Í"+milieu+"Ì"+fin;var contenu=nettoie(contenant.getAttribute("data-contenu").replace(/Í.*Ì/,texte));if(contenant.tagName=="TEXTAREA")contenant.value=contenu.replace(/[ÍÌ]/g,"");else contenant.innerHTML=contenu.replace(/[ÍÌ]/g,"");marqueselection(el,true);if(contenant.tagName=="TEXTAREA"&&contenant.selectionStart!==undefined){contenant.selectionStart=contenu.indexOf("Í");contenant.selectionEnd=contenu.indexOf("Ì")-1;contenant.focus()}else if(document.selection){if(contenant.tagName!="TEXTAREA")contenu=contenu.replace(/(<([^>]+)>)[\n]*/g,"");range=document.body.createTextRange();range.moveToElementText(contenant);range.collapse(true);range.moveEnd("character",contenu.indexOf("Ì")-1);range.moveStart("character",contenu.indexOf("Í"));range.select()}else if(window.getSelection){contenant.innerHTML=contenu.replace("Í",'<span class="cdptmp">').replace("Ì","</span>")+"<br>";selection=window.getSelection();range=document.createRange();range.selectNodeContents($(contenant).find(".cdptmp")[0]);selection.removeAllRanges();selection.addRange(range);contenant.focus()}}function marqueselection(el,efface){var contenant=el.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(efface){contenant.removeAttribute("data-selection");contenant.removeAttribute("data-contenu");return true}var original=contenant.tagName=="TEXTAREA"?contenant.value:contenant.innerHTML;var sel="";if(contenant.tagName=="TEXTAREA"&&contenant.selectionStart!==undefined){contenant.focus();sel=contenant.value.substring(contenant.selectionStart,contenant.selectionEnd);contenant.value=contenant.value.substr(0,contenant.selectionStart)+"Í"+sel+"Ì"+contenant.value.substring(contenant.selectionEnd)}else if(window.getSelection){var range=window.getSelection().getRangeAt(0);if(contenant==range.commonAncestorContainer||$.contains(contenant,range.commonAncestorContainer)){var sel=window.getSelection().toString();range.deleteContents();range.insertNode(document.createTextNode("Í"+sel+"Ì"))}}else{var range=document.selection.createRange();if(contenant==range.parentElement()||$.contains(contenant,range.parentElement())){var sel=document.selection.createRange().text;document.selection.createRange().text="Í"+sel+"Ì"}}if(contenant.tagName=="TEXTAREA"){var contenu=contenant.value;contenant.value=original}else{var contenu=contenant.innerHTML;$(contenant).html(original)}if(contenu.indexOf("Ì")<0)contenu=contenu+"ÍÌ";contenant.setAttribute("data-selection",sel);contenant.setAttribute("data-contenu",contenu);return sel}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="Aide pour cet éditeur de texte"></button></p>';function insertion_titres(el){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(el)+'" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre input").on("click keyup",function(){var balise="h"+$("[name='titre']:checked").val();$("#apercu").html("<"+balise+">"+($("#texte").val().length?$("#texte").val():"Texte du titre")+"</"+balise+">")}).first().keyup();$("#texte").on("keypress",function(e){if(e.which==13)$("#fenetre a.icon-ok").click()}).focus();$("#fenetre a.icon-ok").on("click",function(){var balise="h"+$("[name='titre']:checked").val();insert(el,"<"+balise+">","</"+balise+">",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_omega(el){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(el,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_sigma(el){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(el,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_ol(el){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(el)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre :input").on("click keyup",function(){var debut=$("#debut").val();debut=debut.length&&debut>1?' start="'+debut+'"':"";$("#apercu").html('<ol type="'+$("[name='type']:checked").val()+'"'+debut+"><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 debut=$("#debut").val();debut=debut.length&&debut>1?' start="'+debut+'"':"";var elements=$("#lignes").val().trim("\n");var index=elements.lastIndexOf("\n");if(index>0){var dernier=elements.substring(index+1);elements=elements.substring(0,index)}else var dernier="";insert(el,'<ol type="'+$("[name='type']:checked").val()+'"'+debut+"><li>"+elements.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",dernier);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_ul(el){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(el)+'</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 elements=$("#lignes").val().trim("\n");var index=elements.lastIndexOf("\n");if(index>0){var dernier=elements.substring(index+1);elements=elements.substring(0,index)}else var dernier="";insert(el,"<ul><li>"+elements.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",dernier);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_lien1(el){var sel=marqueselection(el);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(el,true)});$.ajax({url:"recup.php",method:"post",data:{action:"docs"},dataType:"json"}).done(function(data){var majapercu=function(){var apercu=$("#apercu");var id=$("#doc").val();var texte=$("#doc option:selected").text();if(id==0)apercu.html(texte);else if($("#vue").is(":checked")){var l=$("#largeur").val();if(texte.slice(-4,-1)=="pdf"){if(apercu.children(".pdf").length==0)apercu.html('<div><object data="download?id='+id+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+id+'">'+texte+"</a> </object></div>");else if(apercu.find("object").attr("data").substr(12)!=id)apercu.find("object").attr("data","download?id="+id).html('<a href="download?id='+id+'">'+texte+"</a>");apercu.children().attr("class","pdf "+$("#format").val());if(l){if(l==100)apercu.children().removeAttr("style").children().attr("width","100%").removeAttr("style");else{apercu.children().css("padding-bottom",$('<div class="'+$("#format").val()+'"></div>').css("padding-bottom").slice(0,-1)*l/100+"%");apercu.find("object").attr("width",l+"%").css("left",(100-l)/2+"%")}}}else if("jpgpegpng".indexOf(texte.slice(-4,-1))>-1){if(apercu.children("img").length==0)apercu.css("text-align","").html('<img src="download?id='+id+'">');else if(apercu.children().attr("src").substr(12)!=id)apercu.children().attr("src","download?id="+id);if(l){if(l==100)apercu.children().removeAttr("style");else apercu.children().css("width",l+"%").css("margin-left",(100-l)/2+"%")}}}else $("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")};var affichedocs=function(data){$("#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">'+data.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="'+sel+'" 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(e){if(e.which==13)$("#fenetre a.icon-ok").click();var texte=$("#doc option:selected").text();if($("#texte").attr("data-auto")==1)$("#texte").val(this.value>0?texte.substr(0,texte.lastIndexOf("(")-1):"---");if("pdfjpgpegpng".indexOf(texte.slice(-4,-1))>-1)$("#vue").change().parent().show();else{$("#vue, #largeur, #format").parent().hide();$("#vue").prop("checked",false)}majapercu()});$("#texte").on("change keypress",function(e){if(e.which==0)return;if(e.which==13)$("#fenetre a.icon-ok").click();if(this.value.length==0){$(this).data("auto",1);$("#doc").change()}else{$(this).data("auto",0);majapercu()}});$("#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()}majapercu()});$("#format").on("change keyup",function(e){if(e.which==13)$("#fenetre a.icon-ok").click();majapercu()});$("#largeur").on("keydown",function(e){if(e.which==38)++this.value;else if(e.which==40)--this.value}).on("change keyup",function(e){if(e.which==0)return;if(e.which==13)$("#fenetre a.icon-ok").click();if(this.value!=$(this).data("valeur")){$(this).data("valeur",this.value);majapercu()}}).attr("data-valeur",100);$("#rep").on("change",function(){$("#doc").html(data.docs[this.value]).change()});$("#mat").on("change",function(){$("#rep").html(data.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(el,$("#apercu").html(),"","");else insert(el,'<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("mats"in data)affichedocs(data)})}function insertion_lien2(el){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(el)+'" 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(e){if(e.which==13)$("#fenetre a.icon-ok").click()}).first().keyup().focus();$("#fenetre a.icon-ok").on("click",function(){insert(el,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_tex(el){var chargement=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 sel=marqueselection(el);var type="t1";if(sel.length)switch(sel.substring(0,2)){case"\\[":case"$$":type="t2";case"\\(":sel=sel.substring(2,sel.length-2);break;default:sel=sel.trim("$")}popup(chargement+'<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">'+sel+'</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);$("#"+type).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(el,"$","$",$("#formule").val());else insert(el,"\\[","\\]",$("#formule").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_par1(el){insert(el,"<p>","</p>")}function insertion_par2(el){insert(el,"<div class='note'>","</div>")}function insertion_par3(el){insert(el,"<div class='annonce'>","</div>")}function insertion_retour(el){insert(el,"<br>","")}function insertion_gras(el){insert(el,"<strong>","</strong>")}function insertion_italique(el){insert(el,"<em>","</em>")}function insertion_souligne(el){insert(el,"<u>","</u>")}function insertion_exp(el){insert(el,"<sup>","</sup>")}function insertion_ind(el){insert(el,"<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(el1,el2){if(el1.length&&el2.length){$("article").css("position","relative");el1.css("opacity",.3);el2.css("opacity",.3);el2.animate({top:el1.position().top-el2.position().top},1e3);el1.animate({top:(el2.outerHeight(true)+el2.outerHeight())/2},1e3,function(){el1.css("opacity",1);el2.css("opacity",1);el1.insertAfter(el2);el1.css({position:"static",top:0});el2.css({position:"static",top:0})})}}function cache(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().addClass("cache");el.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().removeClass("cache");el.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().prev().is("article")){el.children(".icon-monte").hide(1e3);el.prev().children(".icon-monte").show(1e3)}if(!el.next().is("article")){el.children(".icon-descend").show(1e3);el.prev().children(".icon-descend").hide(1e3)}echange(el.prev(),el)}})}function descend(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().is("article")){el.children(".icon-monte").show(1e3);el.next().children(".icon-monte").hide(1e3)}if(!el.next().next().is("article")){el.children(".icon-descend").hide(1e3);el.next().children(".icon-descend").show(1e3)}echange(el,el.next())}})}function supprime(el){var parent=el.parent();var prop=parent.data("id").split("|");var item="un élément";switch(prop[0]){case"infos":item="une information";break;case"pages":item="la matière <em>"+$("h3",parent).text()+"</em>. Les informations qui y sont écrites seront aussi supprimées";break;case"reps":item="le répertoire <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>. <strong>Tous les sous-répertoires et documents qui s'y trouvent seront aussi supprimés</strong>";break;case"docs":item="le document <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>";break;case"colles":item="le programme de colle de la "+$(".edition",parent).text().toLowerCase();break;case"cdt-elems":item="un élément du cahier de texte";break;case"cdt-types":item="le type de séances <em>"+$("h3",parent).text()+"</em>. <strong>Les éléments du cahier de texte associés à ce type seront aussi supprimés</strong>";break;case"cdt-raccourcis":item="le raccourci de séance <em>"+$("h3",parent).text()+"</em>. Aucun élément du cahier de texte ne sera supprimé";break;case"notes":parent=parent.parent();item="une colle ou séance sans note du <em>"+$("td:first",parent).text()+"</em>, d'une durée de "+$("td:eq(3)",parent).text()+". Toutes les notes de cette colle seront supprimées";break;case"matieres":item="la matière <em>"+$("h3",parent).text()+"</em>. <p class=\"note\"><strong>ATTENTION&nbsp;: Les programmes de colles, le cahier de texte et les notes correspondantes seront toutes automatiquement supprimées.</strong></p> <p>Les répertoires, les documents, les pages d'informations spécifiques et les éléments de l'agenda associés à la matière seront conservés mais ne seront plus associés à une matière&nbsp;: ils seront désormais visibles dans le contexte «&nbsp;général&nbsp;».<br><strong>Si vous souhaitez simplement réinitialiser la matière, ce n'est pas la bonne méthode</strong>&nbsp;: vous devriez pouvoir faire ce que vous souhaitez avec les possibilités de cette page";break;case"groupes":item="le groupe <em>"+($(".editable",parent).text()||$("input:first",parent).val())+"</em>. Les utilisateurs concernés ne seront pas supprimés";break;case"agenda-elems":item="un événement de l'agenda";break;case"agenda-types":item="le type d'événement <em>"+$("h3",parent).text()+"</em>. <strong>Les événements de l'agenda associés à ce type seront aussi supprimés</strong>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:{supprime:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(prop[0].match(/^(agenda-elems|colles)$/))location.reload(true);else el.remove()}})})}function lock(el){var parent=el.parent();var prop=parent.data("id").split("|");var protection=el.data("val");popup('<a class="icon-ok" title="Valider ce choix"></a><h3>Accès à l\'information</h3><table id="selmult">  <tr class="categorie"><td>Accès public</td><td><input value="0" type="checkbox"></td></tr>  <tr class="categorie"><td>Utilisateurs identifiés</td><td><input value="6" type="checkbox"></td></tr>  <tr class="element"><td>Invités</td><td><input value="1" type="checkbox"></td></tr>  <tr class="element"><td>Élèves</td><td><input value="2" type="checkbox"></td></tr>  <tr class="element"><td>Colleurs</td><td><input value="3" type="checkbox"></td></tr>  <tr class="element"><td>Lycée</td><td><input value="4" type="checkbox"></td></tr>  <tr class="element"><td>Professeurs</td><td><input value="5" type="checkbox"></td></tr>  <tr class="categorie"><td>Information invisible</td><td><input value="32" type="checkbox"></td></tr>  </tbody></table>',true);var f=$("#fenetre");if(protection==0||protection==32)$('input[value="'+protection+'"]',f).prop("checked",true).change();else{$("input[value=6]",f).prop("checked",true).change();for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('input[value="'+a+'"]',f).prop("checked",true).change()}var f=$("#fenetre");$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}});$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$(".icon-ok",f).on("click",function(){if($('input[value="32"]',f).prop("checked"))var val=32;else if($('input[value="0"]',f).prop("checked"))var val=0;else var val=32-$("input:checked:not([value=6])",f).map(function(){return this.value|0}).get().reduce(function(acc,v){return acc+Math.pow(2,v-1)},0);el.data("val",val);$.ajax({url:"ajax.php",method:"post",data:{action:prop[0],id:prop[1],champ:"protection",val:val},dataType:"json",el:parent,fonction:function(el){location.reload(true)}})})}function ajoutecolle(el){var article=el.parent();el.before('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');el.next().addBack().hide();var form=$("<form></form>").appendTo(article).html($("#form-ajoutecolle").html());$("textarea",form).on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});$("textarea",form).textareahtml();$("input",form).attr("id","cache");$(".icon-annule",article).on("click",function(){$("form,.icon-annule,.icon-ok",article).remove();el.next().addBack().show()});$("a.icon-ok",article).on("click",function(){$("textarea",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});var id=article.data("id").split("|")[1];$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action=ajout-colle&id="+id,dataType:"json",el:article,fonction:function(el){var texte=$("textarea",el).val();var cache=$("input",el).is(":checked");if(cache)el.addClass("cache");el.data("id","colles|"+id);$(".icon-aide",el).nextAll().remove();$(".icon-aide",el).after((cache?'<a class="icon-montre" title="Afficher le programme de colles sur la partie publique"></a>':'<a class="icon-cache" title="Rendre invisible le programme de colles sur la partie publique"></a>')+'<a class="icon-supprime" title="Supprimer ce programme de colles"></a><div class="editable edithtml" data-id="colles|texte|'+id+'" placeholder="Texte du programme de colles">'+texte+"</div>");$("a.icon-cache,a.icon-montre,a.icon-supprime",el).on("click",function(){window[this.className.substring(5)]($(this))});$(".editable",el).editinplace()}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",article).click()}})}function valide(){var data="";if($("#planning").length)data="action=planning&"+$("form").serialize();else{var id=$(this).parent().attr("data-id").split("|");data="action="+id[0]+"&id="+id[1]+"&"+$(this).nextAll("form").serialize()}if(data.length)$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",el:this,fonction:function(el){if(el.classList[1]!="noreload")location.reload(true)}}).done(function(data){if(data["etat"]=="confirm_mail"){$('[data-id="prefsperso|3"] p:first').html(data["message"]).addClass("annonce");$('[data-id="prefsperso|3"] p:hidden').show().children("input").attr("disabled",false)}});else affiche("<p>Aucune donnée envoyée.</p>","nok")}function formulaire(){var idform=this.className.split(" ")[0].substring(5);var action=$("#form-"+idform).data("action");$("#epingle").remove();var article=$('<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,#calendrier,#parentsdoc+*").first());var form=$("<form></form>").appendTo(article).html($("#form-"+idform).html());$("textarea",form).on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});$(".edithtml",form).textareahtml();$("input[name], select[name]:not([multiple])",form).attr("id",function(){return this.getAttribute("name")});switch(action){case"reps":$(this).init_reps();break;case"ajout-rep":form.append('<input type="hidden" name="parent" value="'+$(this).parent().data("id").split("|")[1]+'">');break;case"docs":case"ajout-doc":$(this).init_docs(action);break;case"cdt-elems":form.init_cdt_boutons();break;case"ajout-cdt-raccourci":form.init_cdt_raccourcis();break;case"notes":case"ajout-notes":$(this).init_notes(action);break;case"agenda-elems":$(this).init_evenements();break;case"ajout-agenda-types":$('[name="couleur"]',form).colpick();break;case"deplcolle":$("#ancien,#nouveau").each(function(){$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})});break;case"ajout-utilisateurs":form.init_ajout_utilisateurs();break;case"ajout-groupe":$(".usergrp span",form).on("click",utilisateursgroupe);break}$("select[multiple]",form).each(selmult);$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()});$("#epingle a.icon-aide").on("click",function(){popup($("#aide-"+idform).html(),false)});$("#epingle a.icon-ok").on("click",function(){$(".edithtml",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});if(action=="notes"||action=="ajout-notes")$("#epingle select:not(:visible)").val("x");$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action="+action,dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("#epingle a.icon-ok").click()}})}$.fn.init_reps=function(){var el=$(this);var form=$("#epingle form");var sel=$("select[multiple]",form);var id=el.parent().data("id").split("|")[1];var donnees=el.parent().data("donnees").split("|");var protection=donnees[2];var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}if(donnees[0]==0)$("#nom,#parent,#menu",form).parent().remove();else{$("#nom",form).val(nom);if(donnees[1]=="1")$("#menu",form).prop("checked",true);$('[data-parents*=",'+id+',"]',form).prop("disabled",true)}form.append('<input type="hidden" name="id" value="'+id+'">');$('input[type="button"]',form).on("click",function(){var contexte=$(this).parent().find("em").text();confirmation("Vous allez vider le répertoire <em>"+contexte+"</em>. Cela supprimera définitivement l'ensemble de ses sous-répertoires et des documents qu'ils contiennent.<br>Cette opération n'est pas annulable.",this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"reps",id:id,vide:1},dataType:"json",el:"",fonction:function(el){location.reload(true)}})})})};$.fn.init_docs=function(action){var el=$(this);var form=$("#epingle form");var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);var id=el.parent().data("id").split("|")[1];if(action=="docs"){var protection=el.parent().data("protection");form.append('<input type="hidden" name="id" value="'+id+'">');$("#nom",form).val(nom)}else{var protection=el.parent().data("donnees").split("|")[2];$("#fichier",form).on("change",function(){if(!$("#nom",form).val().length){var f=this.value;$("#nom",form).val(f.substring(f.lastIndexOf("\\")+1,f.lastIndexOf("."))||f)}});form.append('<input type="hidden" name="parent" value="'+id+'">')}var sel=$("select[multiple]",form);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}form.append('<input type="hidden" name="action" value="'+action+'">');$("#epingle a.icon-ok").addClass("icon-envoidoc").removeClass("icon-ok").on("click",function(){$.ajax({url:"docs.php",method:"post",data:"connexion=1",dataType:"json",el:"",fonction:function(el){if($("#fichier")[0].files.length>0){window.clearTimeout(extinction);$("#log").html("Envoi du document. Cela peut prendre du temps...")}var data=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",contentType:false,processData:false,el:"",fonction:function(el){location.reload(true)}})}})})};$.fn.init_cdt_boutons=function(){var form=this;$("#jour,#pour").datetimepicker({format:"d/m/Y",timepicker:false});$("#h_debut").datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$("#h_fin").val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$("#h_fin").datetimepicker({format:"Ghi",datepicker:false});var zero=function(n){return String(n).length==1?"0"+n:String(n)};$("#raccourci").on("change keyup",function(){var valeurs=raccourcis[this.value];for(var cle in valeurs){if(cle=="jour"){var t=new Date;var j=parseInt(valeurs["jour"]);t.setDate(j>t.getDay()?t.getDate()-t.getDay()-7+j:t.getDate()-t.getDay()+j);$("#jour").val(zero(t.getDate())+"/"+zero(t.getMonth()+1)+"/"+t.getFullYear())}else $("#"+cle).val(valeurs[cle])}$(this).data("modif",1);$("#tid").change()}).data("modif",0);$("#tid").on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$("#h_debut,#demigroupe").parent().show();$("#h_fin,#pour").parent().hide();break;case 1:$("#h_debut,#h_fin,#demigroupe").parent().show();$("#pour").parent().hide();break;case 2:$("#h_debut,#h_fin").parent().hide();$("#pour,#demigroupe").parent().show();break;case 3:$("#h_debut,#h_fin,#pour").parent().hide();$("#demigroupe").parent().show();break;default:$("#h_debut,#h_fin,#pour,#demigroupe").parent().hide()}$("#jour").change()});$("input,#demigroupe",form).on("change keyup",function(){if($("#raccourci").data("modif")==0)$("#raccourci").val(0);else $("#raccourci").data("modif",0)});$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",el).click()});$("select:first",form).focus();$("#tid").change()};$.fn.init_cdt_raccourcis=function(){this.each(function(){var form=$(this);$('[id^="h_d"]',form).datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$('[id^="h_f"]',form).val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$('[id^="h_fin"]').datetimepicker({format:"Ghi",datepicker:false});$('[id^="type"]',form).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$('[id^="h_d"],[id^="dem"]',form).parent().show();$('[id^="h_f"]',form).parent().hide();break;case 1:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().show();break;case 2:case 3:$('[id^="h_d"],[id^="h_f"]',form).parent().hide();$('[id^="dem"]',form).parent().show();break;default:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().hide()}}).change();$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",form).click()})})};$.fn.init_notes=function(action){var el=$(this);var form=$("#epingle form").append($("#form-notes").html());var table=$("table",form);$("input, select",form).attr("id",function(){return this.getAttribute("name")});$("tr[data-id]",table).append("<td>"+$("div",form).html()+"</td>");$("select",table).attr("name",function(){return"e"+$(this).parent().parent().data("id")});$("div",form).remove();if($("input:checkbox",table).length){$("tr[data-id]",form).hide();$("input:checkbox",table).on("change",function(){if($("input:checkbox:last",table).prop("checked"))return $("tr[data-id]",form).show();var ids=$("input:checked",table).map(function(){return this.value.split(",")}).get().concat();$("tr[data-id]:not(.orig)",table).hide();for(var i=0;i<ids.length;i++)$('tr[data-id="'+ids[i]+'"]',form).show()})}function marque_dejanotes(sid){if(sid==0)return true;var dn=dejanotesautres[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (noté par un autre colleur)"});var dn=dejanotesperso[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]:not(.orig)',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (déjà noté par vous-même)"});$(".dejanote select").prop("disabled",true).val("x")}$("#jour").datetimepicker({format:"d/m/Y",timepicker:false,onShow:function(){if($("#td").is(":checked"))this.setOptions({minDate:$("#form-ajoute option:eq(1)").data("date"),maxDate:new Date(new Date($("#form-ajoute option:last").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()+6*864e5)});else this.setOptions({minDate:debut||$("#sid option:selected").data("date"),maxDate:new Date(new Date((fin||$("#sid option:selected").next().data("date")).replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()-864e5)})}});$("#heure").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"15h30"});$("#duree").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"0h00",step:10}).on("change",function(){$(this).removeClass("auto")});$("select",table).on("change keyup",function(){var nb=$("table select:visible",form).filter(function(){return this.value!="x"}).length;var duree=nb*(dureecolle||20);if($("#duree").is(".auto")||duree>$("#duree").val().replace(/^(\d*)h(\d*)$/,function(tout,x,y){return 60*(x|0)+(y|0)}))$("#duree").val((duree/60|0)+"h"+(duree%60||"")).addClass("auto")});if(action=="ajout-notes"){$("#sid").on("change keyup",function(){$(".dejanote td:first-child").text(function(){return this.textContent.replace(" (noté par un autre colleur)","").replace(" (déjà noté par vous-même)","")});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);marque_dejanotes($("#sid").val());var jour=new Date($("#jour").val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var debut=new Date($("#sid option:selected").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var fin=new Date($("#sid option:selected").next().data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));if(jour<debut||jour>fin){debut=debut.toJSON();$("#jour").val(debut.substr(8,2)+"/"+debut.substr(5,2)+"/"+debut.substr(0,4))}}).change();$("#td").on("change keyup",function(){if(this.checked){$("#sid").parent().hide();$("#description").parent().show();table.hide()}else{$("#sid").parent().show();$("#description").parent().hide();table.show()}});$("#description").parent().hide()}else{var tr=el.parent().parent();if(el.data("sid")){$("#description, #td").parent().remove();var sid=el.data("sid");var debut=$('#form-ajoute option[value="'+sid+'"]').data("date");var fin=$('#form-ajoute option[value="'+sid+'"]').next().data("date");var eleves=el.data("eleves").split("|");var notes=el.data("notes").split("|");for(var i=0;i<eleves.length;i++)$('tr[data-id="'+eleves[i]+'"]',form).addClass("orig").show().find("select").val(notes[i]).on("change",function(){$(this).parent().parent().removeClass("orig")});$("h3",form).text("Modifier des notes - semaine du "+$('select[name="sid"] option[value="'+sid+'"]').text().split(" ").slice(0,3).join(" "));if(el.next().length)marque_dejanotes(sid);else{$('tr:not(.orig), .orig option[value="x"]',table).remove();$("#duree").prop("disabled",true);form.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier quels élèves ont été interrogés ou la durée de la colle. Vous pouvez corriger la date et l'heure (dans la limite de la semaine enregistrée) ou les notes que vous avez mises vous pouvez mettre une note à un élève initialement absent qui a rattrapé sa colle.</p>")}}else{table.remove();$("#td").prop("checked",true).prop("disabled",true);$("#description").val(el.parent().prev().prev().prev().text());$("h3",form).text("Modifier la séance de TD sans note");if(el.next().length==0){$("#duree").prop("disabled",true);form.append("<p>Cette séance a déjà été relevée&nbsp;: il est impossible de modifier sa durée. Vous pouvez corriger la date, l'heure ou la description.</p>")}}$("#id").val(el.parent().data("id").split("|")[1]);$("#jour").val($("td:eq(0)",tr).text().replace(/(.{6})(.{2})/,function(tout,x,y){return x+"20"+y}));$("#heure").val($("td:eq(1)",tr).text().replace("-",""));$("#duree").val($("td:eq(3)",tr).text().replace(/.*m/,function(s){return"0h"+s.slice(0,-1)}))}};$.fn.init_ajout_utilisateurs=function(){$("#autorisation,#saisie").on("change",function(){var f=$("#epingle form");var a=$("#autorisation",f).val();if(a==0){$(".affichesiinvite,.affichesiinvitation,.affichesimotdepasse",f).hide(0);$("textarea",f).prop("disabled",true).attr("placeholder","Zone de saisie des utilisateurs\nSélectionnez d'abord un type d'utilisateur")}else{var inv=a==1;var mdp=$("#saisie",f).val()==2;$("#saisie",f).parent().toggle(!inv);$(".affichesiinvite",f).toggle(inv);$(".affichesiinvitation",f).toggle(!inv&&!mdp);$(".affichesimotdepasse",f).toggle(!inv&&mdp);$("textarea",f).prop("disabled",false).attr("placeholder",function(){if(inv)return"identifiant_1,motdepasse_1\nidentifiant_2,motdepasse_2\nidentifiant_3,motdepasse_3\n...";else if(mdp)return"nom_1,prénom_1,motdepasse_1\nnom_2,prénom_2,motdepasse_2\nnom_3,prénom_3,motdepasse_3\n...";else return"nom_1,prénom_1,adresse_1\nnom_2,prénom_2,adresse_2\nnom_3,prénom_3,adresse_3\n..."})}}).change()};$.fn.init_evenements=function(){var el=$(this);var form=$("#epingle form");$("textarea",form).attr("id","texte");if(el.is(".modifevnmt")){var id=el.attr("id").substr(1);var valeurs=evenements[id];var cles=["type","matiere","debut","fin","texte"];for(var i=0;i<6;i++){$("#"+cles[i]).val(valeurs[cles[i]])}$("#id").val(id);$("#texte").change();$("#jours").prop("checked",valeurs["je"]);$('<a class="icon-supprime" title="Supprimer cette information"></a>').insertBefore($(".icon-ok")).on("click",function(){supprime($(this))}).parent().data("id","agenda-elems|"+id)}$("#debut").datetimepicker({onShow:function(){this.setOptions({maxDate:$("#fin").val()||false})},onClose:function(t,input){$("#fin").val(function(i,v){return v||input.val()})}});$("#fin").datetimepicker({onShow:function(){this.setOptions({minDate:$("#debut").val()||false})},onClose:function(t,input){$("#debut").val(function(i,v){return v||input.val()})}});$("#jours").on("change",function(){var v;if(this.checked){$("#debut,#fin").each(function(){v=this.value.split(" ");$(this).val(v[0]).attr("data-heure",v[1]).datetimepicker({format:"d/m/Y",timepicker:false})})}else{$("#debut,#fin").each(function(){if(this.hasAttribute("data-heure"))$(this).val(this.value+" "+$(this).attr("data-heure")).removeAttr("data-heure");$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})})}}).change()};function selmult(){var sel=$(this);var isacces=this.getAttribute("name").indexOf("protection")+1?1:0;function majselect(sel){sel.prev().children().prop("selected",false).text(function(){var options=$(isacces?"option:selected:not([value=6])":"option:selected",sel);if(isacces&&options.length==5)return"Tout utilisateur identifié";if(options.length==0)return"Choisir ...";else return options.map(function(){return this.textContent}).get().join(", ")}).prop("selected",true)}$("<select id="+sel.prev().attr("for")+"><option selected hidden></option></select>").insertBefore(sel.hide(0)).attr("disabled",sel.attr("disabled")).on("mousedown",function(e){e.preventDefault();this.blur();popup('<a class="icon-ok" title="Valider ce choix"></a><h3>'+sel.prev().prev().text().replace(":","")+'</h3><table id="selmult">'+$("option",sel).map(function(){return"<tr"+(this.selected?' class="sel"':"")+"><td>"+this.textContent+'</td><td><input type="checkbox" '+(this.selected?"checked ":"")+'value="'+this.value+'"></td></tr>'}).get().join("")+"</table>",true);var f=$("#fenetre");if(isacces){$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}})}else{$("#selmult",f).prepend('<tr class="categorie"><th></th><th><a class="icon-cocher"></a></th></tr>');$(".icon-cocher",f).on("click",cocher_utilisateurs)}$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});$(".icon-ok",f).on("click",function(){sel.val($("input:checked",f).map(function(){return this.value}).get());majselect(sel);$("#fenetre, #fenetre_fond").remove()})});majselect(sel)}function cocher_utilisateurs(){$(this).toggleClass("icon-cocher icon-decocher").parent().parent().nextUntil(".categorie").find("input").prop("checked",$(this).hasClass("icon-decocher")).change()}function edite_utilisateur(){var id=$(this).parent().parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"prefs",id:id},dataType:"json",afficheform:function(data){if("nom"in data){popup($("#form-edite").html(),true);var f=$("#fenetre");$("input[name]",f).attr("id",function(){return this.getAttribute("name")});if(data["valide"])$("#comptedesactive, #demande, #invitation",f).remove();else if(data["demande"])$("#compteactif, #comptedesactive, #invitation",f).remove();else if(data["invitation"])$("#compteactif, #comptedesactive, #demande",f).remove();else $("#compteactif, #demande, #invitation",f).remove();if(data["autorisation"]==1)$("#nom, #prenom, #mail1, #mail2",f).parent().remove();$("p:first",f).html(function(i,code){return code.replace("XXX",data["prenom"].length?"de <em>"+data["prenom"]+" "+data["nom"]+"</em>":"<em>"+data["login"]+"</em>").replace("YYY","<em>"+["Invité","Élève","Colleur","Lycée","Professeur"][data["autorisation"]-1]+"</em>")});$('input[type="text"],input[type="email"]',f).val(function(){return data[this.id]});$('input[type="checkbox"]',f).prop("checked",function(){return data[this.id]});if(!data["mailenvoi"])$('[name="mailexp"],[name="mailcopie"]',f).parent().remove();$("a.icon-ok",f).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=utilisateur&modif=prefs&id="+id+"&"+$("form",f).serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input",f).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",f).click()}})}}})}function init_utilisateurs(){$(".icon-cocher").on("click",cocher_utilisateurs);$("td .icon-edite").on("click",edite_utilisateur);$("td .icon-desactive, td .icon-active, td .icon-supprutilisateur, td .icon-validutilisateur").on("click",modif_utilisateur);$("th .icon-desactive, th .icon-active, th .icon-supprutilisateur, th .icon-validutilisateur").on("click",modif_utilisateurs);$("td:not(.icones)").on("click",function(){$(this).parent().find("input").click()});$("#u input").on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});function modif_utilisateur(){var question="";var nom=$(this).parent().siblings().first();var compte=nom.text().length?"de <em>"+nom.next().text()+" "+nom.text()+"</em>":"d'identifiant <em>"+nom.next().next().text()+"</em>";var categorie=$(this).parent().parent().prevUntil(".categorie").last().prev().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver le compte invité "+compte+". Cela signifie que le compte ne sera pas supprimé mais sera non utilisable pour une connexion. Les associations éventuelles avec les matières seront conservées. Ce compte sera listé dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année et dont il faut conserver les notes de colles.";break;case"active":if(categorie=="Invités")question="Vous allez réactiver le compte invité "+compte+". La connexion sera à nouveau possible. Ce compte apparaîtra à nouveau dans la partie principale du tableau.";else question="Vous allez réactiver le compte "+compte+". Cela signifie que l'utilisateur correspondant pourra à nouveau se connecter. Il retrouvera son compte, ses notes de colles éventuelles, ses préférences, ses accès spécifiques éventuels, sans modification. Ce compte apparaîtra à nouveau dans la partie principale du tableau.";break;case"supprutilisateur":if(categorie=="Demandes")question="Vous allez supprimer la demande "+compte+". Cela signifie que cette demande ne conduira pas à une création de compte. Le demandeur ne sera pas prévenu de votre décision.<br> Une fois réalisée, cette opération est définitive, mais rien n'empêche le demandeur d'effectuer une nouvelle demande.<br> <strong>Si vous n'attendez plus de nouvelle demande de création de compte, il est certainement préférable de supprimer cette possibilité à l'aide du réglage accessible en cliquant sur l'icône <span class=\"icon-prefs\"></span> en haut à droite sur cette page</strong>";
-else if(categorie=="Invitations"){var textecolles=$(this).parent().prev().prev().text()=="Élève"?'<p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ce compte seront supprimées. Cette suppression est définitive.</strong></p><p>':"<br>";question="Vous allez supprimer l'invitation "+compte+". Cela signifie que cette invitation ne sera plus valable et que si la personne invitée clique sur le lien reçu par courriel, une erreur apparaîtra devant elle."+textecolles+"<strong>L'invitation envoyée n'a pas de date de péremption&nbsp;: il est n'est pas normal de supprimer l'invitation pour la refaire, à moins de s'être trompé d'adresse électronique. Si la personne invitée vous dit ne pas réussir à s'identifier, proposez-lui de passer par le lien <em>Mot de passe oublié</em>.</strong><br> La personne invitée ne sera pas prévenue de votre décision."}else if(categorie=="Professeurs")question="Vous allez supprimer le compte professeur "+compte+'. <strong>Cela signifie que toutes les préférences de ce compte seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.<br> Les données des matières auxquelles il est associé sont indépendantes&nbsp;: elles ne seront pas supprimées.';else if(categorie=="Lycée")question="Vous allez supprimer le compte lycée "+compte+". Cela signifie que toutes les préférences de ce compte seront perdues.";else if(categorie=="Colleurs")question="Vous allez supprimer le compte colleur "+compte+'. <strong>Cela signifie que toutes les préférences de ce compte seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Élèves")question="Vous allez supprimer le compte élève "+compte+'. <strong>Cela signifie que toutes les données correspondant à ce compte seront perdues. Les groupes où il apparaît seront modifiés, les notes de colles éventuelles seront supprimées.</strong> <p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ce compte seront supprimées. Cette suppression est définitive.<br> Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Invités")question="Vous allez supprimer le compte invité "+compte+". Cela signifie que la connexion par ce compte ne sera plus possible.";else question="Vous allez supprimer le compte "+compte+" déjà désactivé. <strong>Cela signifie que toutes les données correspondant à ce compte seront perdues définitivement. Les groupes où il apparaît seront modifiés, les notes de colles éventuelles seront supprimées.</strong>";if(categorie!="Demandes")question=question+"<br>Une fois réalisée, cette opération est définitive.";break;case"validutilisateur":question="Vous allez valider la demande "+compte+". Son compte sera immédiatement actif et un courriel va immédiatement être envoyé pour le/la prévenir.<br> Il sera automatiquement associé à toutes les matières&nbsp;: <strong>pensez à aller supprimer les matières qui ne le concernent pas sur la page de gestion des associations utilisateurs-matières.</strong>"}confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:el.className.substring(5),id:$(el).parent().parent().data("id")},dataType:"json",el:"",fonction:function(){location.reload(true)}})})}function modif_utilisateurs(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var lignes=cases.parent().parent();var ids=lignes.map(function(){return $(this).data("id")}).get().join(",");var comptes=lignes.map(function(){var nom=$(this).children().first().text();return nom.length?"<em>"+$(this).children().eq(1).text()+" "+nom+"</em>":"<em>"+$(this).children().eq(2).text()+"</em>"}).get().join(", ");var pos=comptes.lastIndexOf(",");if(pos>0)comptes=comptes.substring(0,pos)+" et"+comptes.substring(pos+1);var question="";var categorie=$(this).parent().parent().prev().children().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver les comptes invités "+comptes+". Cela signifie que ces compte ne seront pas supprimés mais seront non utilisables pour une connexion. Les associations éventuelles avec les matières seront conservées. Ces comptes seront listés dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année dont il faut conserver les notes de colles.";question="Vous allez désactiver les comptes de "+comptes+". Cela signifie que ces comptes seront toujours visibles pour les professeurs mais que les utilisateurs correspondant ne pourront plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées aux comptes seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant les comptes.<br> Ces comptes seront listés dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour des élèves ou des colleurs partis en cours d'année et dont il faut conserver les notes de colles.";break;case"active":if(categorie=="Invités")question="Vous allez réactiver les comptes invité "+comptes+". La connexion sera à nouveau possible. Ces comptes apparaîtront à nouveau dans la partie principale du tableau.";else question="Vous allez réactiver les comptes de "+comptes+". Cela signifie que les utilisateurs correspondant pourront à nouveau se connecter. Ils retrouveront leur compte, leurs notes de colles éventuelles, leurs préférences, leurs accès spécifiques éventuels, sans modification. Ces comptes apparaîtront à nouveau dans la partie principale du tableau.";break;case"supprutilisateur":if(categorie=="Demandes")question="Vous allez supprimer les demandes de "+comptes+". Cela signifie que ces demandes ne conduiront pas à des créations de compte. Les demandeurs ne seront pas prévenus de votre décision.<br> Une fois réalisée, cette opération est définitive, mais rien n'empêche les demandeurs d'effectuer une nouvelle demande.<br> <strong>Si vous n'attendez plus de nouvelle demande de création de compte, il est certainement préférable de supprimer cette possibilité à l'aide du réglage accessible en cliquant sur l'icône <span class=\"icon-prefs\"></span> en haut à droite sur cette page</strong>";else if(categorie=="Invitations"){question="Vous allez supprimer les invitations de "+comptes+". Cela signifie que ces invitations ne seront plus valables et que si les personnes invitées cliquent sur le lien reçu par courriel, une erreur apparaîtra devant elles. <p class=\"note\"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur les comptes de types élèves seront supprimées. Ces suppressions sont définitives.</strong></p> <p><strong>Ces invitations envoyées n'ont pas de date de péremption&nbsp;: il n'est pas normal de supprimer une invitation pour la refaire, à moins de s'être trompé d'adresse électronique. Si une personne invitée vous dit ne pas réussir à s'identifier, proposez-lui de passer par le lien <em>Mot de passe oublié</em>.</strong><br> Les personnes invitées ne seront pas prévenues de votre décision."}else if(categorie=="Professeurs")question="Vous allez supprimer les comptes professeurs de "+comptes+'. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.<br> Les données des matières auxquelles ces utilisateurs sont associés sont indépendantes&nbsp;: elles ne seront pas supprimées.';else if(categorie=="Lycée")question="Vous allez supprimer les comptes lycée de "+comptes+". Cela signifie que toutes les préférences de ces comptes seront perdues.";else if(categorie=="Colleurs")question="Vous allez supprimer les comptes colleurs de "+comptes+'. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Élèves")question="Vous allez supprimer les comptes élèves de "+comptes+'. <strong>Cela signifie que toutes les données correspondant à ces comptes seront perdues. Les groupes où ils apparaissent seront modifiés, les notes de colles éventuelles seront supprimées.</strong> <p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ces compte seront supprimées. Cette suppression est définitive.<br> Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Invités")question="Vous allez supprimer les comptes invités de "+comptes+". Cela signifie que la connexion par ces comptes ne sera plus possible.";else question="Vous allez supprimer les comptes de "+comptes+" déjà désactivés. <strong>Cela signifie que toutes les données correspondant à ces comptes seront perdues définitivement. Les groupes où ils apparaîssent seront modifiés, les notes de colles éventuelles seront supprimées. Dans le cas des comptes professeurs, les données des matières associées ne seront pas supprimées.</strong>";if(categorie!="Demandes")question=question+"<br>Une fois réalisée, cette opération est définitive.";break;case"validutilisateur":question="Vous allez valider les demandes de "+comptes+". Leurs comptes seront immédiatement actifs et un courriel va immédiatement leur être envoyé pour les prévenir.<br> Ils seront automatiquement associés à toutes les matières&nbsp;: <strong>pensez à aller supprimer les matières qui ne les concernent pas sur la page de gestion des associations utilisateurs-matières.</strong>"}confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs",modif:el.className.substring(5),ids:ids},dataType:"json",el:"",fonction:function(){location.reload(true)}})})}}function init_utilisateurs_matieres(){$("tr:not(.categorie) td:not(:first-child,:last-child)").each(function(){var valeurs=this.textContent.split("|");this.innerHTML=valeurs[1]==1?'<a class="icon-ok" data-id="'+valeurs[0]+'" title="Supprimer l\'association à la matière"></a>':'<a class="icon-nok" data-id="'+valeurs[0]+'" title="Établir l\'association à la matière"></a>'});$("#umats a").on("click",association_um);$(".categorie [data-id]").on("click",association_ums).hide(0);$(".icon-cocher").on("click",cocher_utilisateurs).on("click",majicones);$('input[type="checkbox"]').on("click",majicones).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});$("td:first-child").on("click",function(){$(this).parent().find("input").click()});function majicones(){var tr=$(this).parent().parent();if(!tr.hasClass("categorie"))tr=tr.prevAll(".categorie").first();var cases=tr.nextUntil(".categorie").find(":checked");if(cases.length==0)$("[data-id]",tr).hide(0);else $("[data-id]",tr).each(function(){var avant=$(this).hasClass("icon-ok");var apres=cases.parent().prevAll().find('.icon-ok[data-id="'+this.getAttribute("data-id")+'"]').length<cases.length/2;if(avant!=apres)$(this).toggleClass("icon-ok icon-nok").attr("title",(apres?"Établir":"Supprimer")+" l'association à la matière de tous les cochés")}).show(0)}function association_um(){var val=$(this).hasClass("icon-ok");$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur-matiere",id:$(this).parent().parent().data("id"),matiere:$(this).data("id"),val:1-val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Établir":"Supprimer")+" l'association à la matière")}})}function association_ums(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var lignes=cases.parent().parent();var ids=lignes.map(function(){return $(this).data("id")}).get().join(",");var comptes=lignes.children(":first-of-type").map(function(){return $(this).text().split("(")[0].trim()}).get().join(", ");var pos=comptes.lastIndexOf(",");if(pos>0)comptes=comptes.substring(0,pos)+" et"+comptes.substring(pos+1);var val=$(this).hasClass("icon-ok");var mid=this.getAttribute("data-id");var question=val?"Vous allez établir l'association à la matière "+$("#m"+mid).text()+" pour les comptes de "+comptes+". Cela signifie que ces utilisateurs auront accès aux ressources liées à cette matière, en fonction de l'autorisation que vous avez fixée pour ces ressources.":"Vous allez supprimer l'association à la matière "+$("#m"+mid).text()+" pour les comptes de "+comptes+". Cela signifie que ces utilisateurs n'auront plus accès aux ressources liées à cette matière. Si des notes de colles ont été saisies, elles seront automatiquement et définitivement supprimées de la base.";confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs-matieres",ids:ids,matiere:mid,val:val|0},dataType:"json",el:"",fonction:function(el){location.reload(true)}})})}}function init_envoimails(){var t=$("#envoimails");$("td",t).each(function(){var valeurs=this.textContent.split("|");this.innerHTML=valeurs[1]==1?'<a class="icon-ok" data-id="'+valeurs[0]+'" title="Supprimer l\'autorisation d\'envoi"></a>':'<a class="icon-nok" data-id="'+valeurs[0]+'" title="Établir l\'autorisation d\'envoi"></a>'});$("td a",t).on("click",function(){var val=$(this).hasClass("icon-nok")|0;$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",mails:1,depuis:$(this).parent().parent().data("id"),vers:$(this).data("id"),val:val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Établir":"Supprimer")+" l'autorisation d'envoi")}})});$("th span",t).on("click",function(){var val=$(this).hasClass("icon-ok");var ligne=$(this).parent().parent();$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",mails:1,depuis:ligne.data("id"),vers:0,val:val|0},dataType:"json",el:ligne,fonction:function(el){el.find("td a").toggleClass("icon-ok",val).toggleClass("icon-nok",!val).attr("title",(val?"Établir":"Supprimer")+" l'autorisation d'envoi")}})});$("#umails .icon-edite").on("click",edite_utilisateur)}function init_utilisateurs_groupes(){$('article input[type="checkbox"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:this.id.substr(0,5),id:this.id.substr(5),val:this.checked|0},dataType:"json",el:"",fonction:function(el){return true}})});$(".usergrp span").append('&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>').on("click",utilisateursgroupe)}function utilisateursgroupe(){popup($("#form-utilisateurs").html(),true);var f=$("#fenetre");var span=$(this);article=span.parent().parent();$("table",f).attr("id","ugrp");$("h3",f).append($(".editable",article).text()||$("input:first",article).val());$(".icon-deplie",f).on("click",plie);$(".icon-cocher",f).on("click",cocher_utilisateurs);$("tr:not(.categorie)",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});var ids=span.data("uids");$("#u"+ids.replace(/,/g,",#u"),f).prop("checked",true).change();$(".icon-ok",f).on("click",function(){var ids=$("input:checked",f).map(function(){return this.id.replace("u","")}).get().join(",");var noms=$("input:checked",f).parent().prev().map(function(){return this.textContent.split("(")[0].trim()}).get().join(", ")||"[Personne]";if(article.is("div")){$("#uids",article).val(ids);span.data("uids",ids);span.html(noms+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>');$("#fenetre, #fenetre_fond").remove()}else $.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:"utilisateurs",id:article.data("id").split("|")[1],uids:ids},dataType:"json",el:span,fonction:function(el){el.data("uids",ids);el.html(noms+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>');$("#fenetre, #fenetre_fond").remove()}})})}function suppressionmultiple(){var prop=$(this).data("id").split("|");var contexte=$(this).parent().find("h3").text();var item="";switch(prop[2]){case"infos":item="toutes les informations de la page <em>"+contexte+"</em>";break;case"colles":item="tous les programmes de colles de la matière <em>"+contexte+"</em>";break;case"cdt":item="tout le contenu du cahier de texte de la matière <em>"+contexte+"</em>";break;case"docs":item="tous les répertoires et documents de la matière <em>"+contexte+"</em>";break;case"notes":item="toutes les notes de la matière <em>"+contexte+"</em>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action="+prop[0]+"&id="+prop[1]+"&supprime_"+prop[2]+"=1",dataType:"json",el:$(el),fonction:function(el){el.remove()}})})}function destinatairesmail(){popup($("#form-destinataires").html(),true);var f=$("#fenetre");$(".icon-deplie",f).on("click",plie);$("tr:not(.gr) input.dest",f).attr("id",function(){return"u"+this.value});$("tr:not(.categorie) td:nth-child(-n+2)",f).on("click",function(e){if(!$(e.target).is("input"))$(this).parent().find("input:first").click()});$("input",f).on("change",function(){var tr=$(this).parent().parent();if(this.checked)tr.find("input:not(."+this.className+")").prop("checked",false);tr.toggleClass("sel",tr.find("input:checked").length>0)});var ids=$('[name="id-copie"]').val();$("#u"+ids.replace(/,/g,",#u")).prop("checked",true).change();ids=$('[name="id-bcc"]').val();$("#u"+ids.replace(/,/g,",#u")).parent().next().children().prop("checked",true).change();$(".categorie a",f).on("click keyup",function(){var classe=this.className.split(" ")[1];var etat=this.className.split(" ")[0]=="icon-cocher";var titre=this.title;$(this).parent().parent().nextUntil(".categorie").find("."+classe+":not(:disabled)").prop("checked",etat).change();this.className=(etat?"icon-decocher ":"icon-cocher ")+classe;this.title=this.title.replace(etat?"Cocher":"Décocher",etat?"Décocher":"Cocher");var classe2=classe=="dest"?"bcc":"dest";$(this).parent().parent().find(".icon-decocher."+classe2).each(function(){this.className="icon-cocher "+classe2;this.title="C"+this.title.substr(3)})});$(".gr input",f).on("click",function(){var ids=this.value;if(this.className=="dest")$("#u"+ids.replace(/,/g,",#u")).prop("checked",this.checked).change();else $("#u"+ids.replace(/,/g,",#u")).parent().next().children().prop("checked",this.checked).change()});$(".icon-ok",f).on("click",function(){$('[name="id-copie"]').val($("tr:not(.gr) .dest:checked",f).map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($("tr:not(.gr) .bcc:checked",f).map(function(){return this.value}).get().join(","));$("#maildest").text($("tr:not(.gr) .dest:checked",f).parent().prev().map(function(){return this.textContent}).get().concat($("tr:not(.gr) .bcc:checked",f).parent().prev().prev().map(function(){return this.textContent+" (CC)"}).get()).join(", ")||"[Personne]");$("#fenetre, #fenetre_fond").remove()})}function envoimail(){if($(".maildest").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 $.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})}function relevenotes(){confirmation("<p>Vous allez réaliser une relève des notes de colles. Cela consiste à marquer comme relevées toutes les heures déclarées jusqu'à maintenant et non encore relevées. Vous pourrez alors télécharger le nouveau relevé au sein du tableau en bas de page.</p><p>Cette opération n'est pas annulable.</p><p>Une fois que vous aurez réalisé ce relevé, les professeurs et colleurs ne pourront pas modifier le nombre d'élèves et la durée correspondant aux colles relevées.</p>",this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action=releve-notes",dataType:"json",el:"",fonction:function(el){location.reload(true)}})})}$(document).ajaxSend(function(ev,xhr,settings){$("#load").show(200);if($("body").attr("data-csrf-token")!=undefined){if(settings.data.append)settings.data.append("csrf-token",$("body").attr("data-csrf-token"));else settings.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+settings.data}}).ajaxStop(function(){$("#load").hide(200)}).ajaxSuccess(function(ev,xhr,settings){var data=xhr.responseJSON;switch(data["etat"]){case"ok":$("body").data("nepassortir",false);affiche(data["message"],"ok");settings.fonction(settings.el);break;case"nok":affiche(data["message"],"nok");break;case"login":case"mdp":reconnect(settings,data["etat"]=="mdp");break;case"recupok":settings.afficheform(data)}});$(function(){$("a.formulaire, .modifevnmt").on("click",formulaire);$("a.icon-aide").on("click",function(){popup($("#aide-"+($(this).parent().data("id")||"page").split("|")[0]).html(),false)});$("a.icon-ok").on("click",valide);$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime,a.icon-lock,a.icon-ajoutecolle").on("click",function(){window[this.className.substring(5)]($(this))});$("#log").hide().on("click",function(){$(this).hide(300)});$(".editable").editinplace();$("a.icon-deconnexion").on("click",function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"deconnexion"},dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$(".icon-menu").on("click",function(e){e.stopPropagation();$("nav").toggleClass("visible");if($("nav").hasClass("visible")){$('<div id="menu_fond"></div>').appendTo("body");$("#menu_fond").on("click",function(){$("#menu_fond").remove();$("nav").removeClass("visible")})}else $("#menu_fond").remove()});$("a.icon-echange").on("click",function(){$.ajax({url:"recup.php",method:"post",data:{action:"compteglobal"},dataType:"json",afficheform:function(data){popup("<h3>Changer de Cahier</h3><div></div>",true);var f=$("#fenetre");var cahiers=data["cahiers"];for(var rep in cahiers)$("div",f).attr("id","cahiers").append('<a href="/'+rep+'/">'+cahiers[rep]+"</a>")}})});$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").init_cdt_raccourcis();$(".icon-mailenvoi").on("click",envoimail);$("#maildest, #maildest + .icon-edite").on("click",destinatairesmail);$(".categorie th:first-child").prepend($('<span class="icon-deplie" title="Déplier/Replier cette catégorie"></span>').on("click",plie));$("article select[multiple]").each(selmult);$(".supprmultiple").on("click",suppressionmultiple);$("#u").each(init_utilisateurs);$("#umats").each(init_utilisateurs_matieres);$("#envoimails").each(init_envoimails);$(".usergrp").first().each(init_utilisateurs_groupes);$("#planning select").change(function(){$(this).parent().prev().children("input").prop("checked",this.value==0)});$("#planning input").change(function(){$(this).parent().next().children("select").val(0)});$("#relevenotes").on("click",relevenotes);$("body").data("nepassortir",false);$("textarea:visible").on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});window.addEventListener("beforeunload",function(e){if($("body").data("nepassortir")){e.preventDefault();e.returnValue=""}})});
\ No newline at end of file
+}function echange(el1,el2){if(el1.length&&el2.length){$("article").css("position","relative");el1.css("opacity",.3);el2.css("opacity",.3);el2.animate({top:el1.position().top-el2.position().top},1e3);el1.animate({top:(el2.outerHeight(true)+el2.outerHeight())/2},1e3,function(){el1.css("opacity",1);el2.css("opacity",1);el1.insertAfter(el2);el1.css({position:"static",top:0});el2.css({position:"static",top:0})})}}function cache(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().addClass("cache");el.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().removeClass("cache");el.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().prev().is("article")){el.children(".icon-monte").hide(1e3);el.prev().children(".icon-monte").show(1e3)}if(!el.next().is("article")){el.children(".icon-descend").show(1e3);el.prev().children(".icon-descend").hide(1e3)}echange(el.prev(),el)}})}function descend(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().is("article")){el.children(".icon-monte").show(1e3);el.next().children(".icon-monte").hide(1e3)}if(!el.next().next().is("article")){el.children(".icon-descend").hide(1e3);el.next().children(".icon-descend").show(1e3)}echange(el,el.next())}})}function supprime(el){var parent=el.parent();var prop=parent.data("id").split("|");var item="un élément";switch(prop[0]){case"infos":item="une information";break;case"pages":item="la matière <em>"+$("h3",parent).text()+"</em>. Les informations qui y sont écrites seront aussi supprimées";break;case"reps":item="le répertoire <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>. <strong>Tous les sous-répertoires et documents qui s'y trouvent seront aussi supprimés</strong>";break;case"docs":item="le document <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>";break;case"colles":item="le programme de colle de la "+$(".edition",parent).text().toLowerCase();break;case"cdt-elems":item="un élément du cahier de texte";break;case"cdt-types":item="le type de séances <em>"+$("h3",parent).text()+"</em>. <strong>Les éléments du cahier de texte associés à ce type seront aussi supprimés</strong>";break;case"cdt-raccourcis":item="le raccourci de séance <em>"+$("h3",parent).text()+"</em>. Aucun élément du cahier de texte ne sera supprimé";break;case"notes":parent=parent.parent();item="une colle ou séance sans note du <em>"+$("td:first",parent).text()+"</em>, d'une durée de "+$("td:eq(3)",parent).text()+". Toutes les notes de cette colle seront supprimées";break;case"matieres":item="la matière <em>"+$("h3",parent).text()+"</em>. <p class=\"note\"><strong>ATTENTION&nbsp;: Les programmes de colles, le cahier de texte et les notes correspondantes seront toutes automatiquement supprimées.</strong></p> <p>Les répertoires, les documents, les pages d'informations spécifiques et les éléments de l'agenda associés à la matière seront conservés mais ne seront plus associés à une matière&nbsp;: ils seront désormais visibles dans le contexte «&nbsp;général&nbsp;».<br><strong>Si vous souhaitez simplement réinitialiser la matière, ce n'est pas la bonne méthode</strong>&nbsp;: vous devriez pouvoir faire ce que vous souhaitez avec les possibilités de cette page";break;case"groupes":item="le groupe <em>"+($(".editable",parent).text()||$("input:first",parent).val())+"</em>. Les utilisateurs concernés ne seront pas supprimés";break;case"agenda-elems":item="un événement de l'agenda";break;case"agenda-types":item="le type d'événement <em>"+$("h3",parent).text()+"</em>. <strong>Les événements de l'agenda associés à ce type seront aussi supprimés</strong>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:{supprime:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(prop[0].match(/^(agenda-elems|colles)$/))location.reload(true);else el.remove()}})})}function lock(el){var parent=el.parent();var prop=parent.data("id").split("|");var protection=el.data("val");popup('<a class="icon-ok" title="Valider ce choix"></a><h3>Accès à l\'information</h3><table id="selmult">  <tr class="categorie"><td>Accès public</td><td><input value="0" type="checkbox"></td></tr>  <tr class="categorie"><td>Utilisateurs identifiés</td><td><input value="6" type="checkbox"></td></tr>  <tr class="element"><td>Invités</td><td><input value="1" type="checkbox"></td></tr>  <tr class="element"><td>Élèves</td><td><input value="2" type="checkbox"></td></tr>  <tr class="element"><td>Colleurs</td><td><input value="3" type="checkbox"></td></tr>  <tr class="element"><td>Lycée</td><td><input value="4" type="checkbox"></td></tr>  <tr class="element"><td>Professeurs</td><td><input value="5" type="checkbox"></td></tr>  <tr class="categorie"><td>Information invisible</td><td><input value="32" type="checkbox"></td></tr>  </tbody></table>',true);var f=$("#fenetre");if(protection==0||protection==32)$('input[value="'+protection+'"]',f).prop("checked",true).change();else{$("input[value=6]",f).prop("checked",true).change();for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('input[value="'+a+'"]',f).prop("checked",true).change()}var f=$("#fenetre");$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}});$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$(".icon-ok",f).on("click",function(){if($('input[value="32"]',f).prop("checked"))var val=32;else if($('input[value="0"]',f).prop("checked"))var val=0;else var val=32-$("input:checked:not([value=6])",f).map(function(){return this.value|0}).get().reduce(function(acc,v){return acc+Math.pow(2,v-1)},0);el.data("val",val);$.ajax({url:"ajax.php",method:"post",data:{action:prop[0],id:prop[1],champ:"protection",val:val},dataType:"json",el:parent,fonction:function(el){location.reload(true)}})})}function ajoutecolle(el){var article=el.parent();el.before('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');el.next().addBack().hide();var form=$("<form></form>").appendTo(article).html($("#form-ajoutecolle").html());$("textarea",form).on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});$("textarea",form).textareahtml();$("input",form).attr("id","cache");$(".icon-annule",article).on("click",function(){$("form,.icon-annule,.icon-ok",article).remove();el.next().addBack().show()});$("a.icon-ok",article).on("click",function(){$("textarea",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});var id=article.data("id").split("|")[1];$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action=ajout-colle&id="+id,dataType:"json",el:article,fonction:function(el){var texte=$("textarea",el).val();var cache=$("input",el).is(":checked");if(cache)el.addClass("cache");el.data("id","colles|"+id);$(".icon-aide",el).nextAll().remove();$(".icon-aide",el).after((cache?'<a class="icon-montre" title="Afficher le programme de colles sur la partie publique"></a>':'<a class="icon-cache" title="Rendre invisible le programme de colles sur la partie publique"></a>')+'<a class="icon-supprime" title="Supprimer ce programme de colles"></a><div class="editable edithtml" data-id="colles|texte|'+id+'" placeholder="Texte du programme de colles">'+texte+"</div>");$("a.icon-cache,a.icon-montre,a.icon-supprime",el).on("click",function(){window[this.className.substring(5)]($(this))});$(".editable",el).editinplace()}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",article).click()}})}function valide(){var data="";if($("#planning").length)data="action=planning&"+$("form").serialize();else{var id=$(this).parent().attr("data-id").split("|");data="action="+id[0]+"&id="+id[1]+"&"+$(this).nextAll("form").serialize()}if(data.length)$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",el:this,fonction:function(el){if(el.classList[1]!="noreload")location.reload(true)}}).done(function(data){if(data["etat"]=="confirm_mail"){$('[data-id="prefsperso|3"] p:first').html(data["message"]).addClass("annonce");$('[data-id="prefsperso|3"] p:hidden').show().children("input").attr("disabled",false)}});else affiche("<p>Aucune donnée envoyée.</p>","nok")}function formulaire(){var idform=this.className.split(" ")[0].substring(5);var action=$("#form-"+idform).data("action");$("#epingle").remove();var article=$('<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,#calendrier,#parentsdoc+*").first());var form=$("<form></form>").appendTo(article).html($("#form-"+idform).html());$("textarea",form).on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});$(".edithtml",form).textareahtml();$("input[name], select[name]:not([multiple])",form).attr("id",function(){return this.getAttribute("name")});switch(action){case"reps":$(this).init_reps();break;case"ajout-rep":form.append('<input type="hidden" name="parent" value="'+$(this).parent().data("id").split("|")[1]+'">');break;case"docs":case"ajout-doc":$(this).init_docs(action);break;case"cdt-elems":form.init_cdt_boutons();break;case"ajout-cdt-raccourci":form.init_cdt_raccourcis();break;case"notes":case"ajout-notes":$(this).init_notes(action);break;case"agenda-elems":$(this).init_evenements();break;case"ajout-agenda-types":$('[name="couleur"]',form).colpick();break;case"deplcolle":$("#ancien,#nouveau").each(function(){$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})});break;case"ajout-utilisateurs":form.init_ajout_utilisateurs();break;case"ajout-groupe":$(".usergrp span",form).on("click",utilisateursgroupe);break}$("select[multiple]",form).each(selmult);$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()});$("#epingle a.icon-aide").on("click",function(){popup($("#aide-"+idform).html(),false)});$("#epingle a.icon-ok").on("click",function(){$(".edithtml",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});if(action=="notes"||action=="ajout-notes")$("#epingle select:not(:visible)").val("x");$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action="+action,dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("#epingle a.icon-ok").click()}})}$.fn.init_reps=function(){var el=$(this);var form=$("#epingle form");var sel=$("select[multiple]",form);var id=el.parent().data("id").split("|")[1];var donnees=el.parent().data("donnees").split("|");var protection=donnees[2];var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}if(donnees[0]==0)$("#nom,#parent,#menurep",form).parent().remove();else{$("#nom",form).val(nom);if(donnees[1]=="1")$("#menurep",form).prop("checked",true);$('[data-parents*=",'+id+',"]',form).prop("disabled",true)}form.append('<input type="hidden" name="id" value="'+id+'">');$('input[type="button"]',form).on("click",function(){var contexte=$(this).parent().find("em").text();confirmation("Vous allez vider le répertoire <em>"+contexte+"</em>. Cela supprimera définitivement l'ensemble de ses sous-répertoires et des documents qu'ils contiennent.<br>Cette opération n'est pas annulable.",this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"reps",id:id,vide:1},dataType:"json",el:"",fonction:function(el){location.reload(true)}})})})};$.fn.init_docs=function(action){var el=$(this);var form=$("#epingle form");var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);var id=el.parent().data("id").split("|")[1];if(action=="docs"){var protection=el.parent().data("protection");form.append('<input type="hidden" name="id" value="'+id+'">');$("#nom",form).val(nom)}else{var protection=el.parent().data("donnees").split("|")[2];$("#fichier",form).on("change",function(){if(!$("#nom",form).val().length){var f=this.value;$("#nom",form).val(f.substring(f.lastIndexOf("\\")+1,f.lastIndexOf("."))||f)}});form.append('<input type="hidden" name="parent" value="'+id+'">')}var sel=$("select[multiple]",form);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}form.append('<input type="hidden" name="action" value="'+action+'">');$("#epingle a.icon-ok").addClass("icon-envoidoc").removeClass("icon-ok").on("click",function(){$.ajax({url:"docs.php",method:"post",data:"connexion=1",dataType:"json",el:"",fonction:function(el){if($("#fichier")[0].files.length>0){window.clearTimeout(extinction);$("#log").html("Envoi du document. Cela peut prendre du temps...")}var data=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",contentType:false,processData:false,el:"",fonction:function(el){location.reload(true)}})}})})};$.fn.init_cdt_boutons=function(){var form=this;$("#jour,#pour").datetimepicker({format:"d/m/Y",timepicker:false});$("#h_debut").datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$("#h_fin").val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$("#h_fin").datetimepicker({format:"Ghi",datepicker:false});var zero=function(n){return String(n).length==1?"0"+n:String(n)};$("#raccourci").on("change keyup",function(){var valeurs=raccourcis[this.value];for(var cle in valeurs){if(cle=="jour"){var t=new Date;var j=parseInt(valeurs["jour"]);t.setDate(j>t.getDay()?t.getDate()-t.getDay()-7+j:t.getDate()-t.getDay()+j);$("#jour").val(zero(t.getDate())+"/"+zero(t.getMonth()+1)+"/"+t.getFullYear())}else $("#"+cle).val(valeurs[cle])}$(this).data("modif",1);$("#tid").change()}).data("modif",0);$("#tid").on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$("#h_debut,#demigroupe").parent().show();$("#h_fin,#pour").parent().hide();break;case 1:$("#h_debut,#h_fin,#demigroupe").parent().show();$("#pour").parent().hide();break;case 2:$("#h_debut,#h_fin").parent().hide();$("#pour,#demigroupe").parent().show();break;case 3:$("#h_debut,#h_fin,#pour").parent().hide();$("#demigroupe").parent().show();break;default:$("#h_debut,#h_fin,#pour,#demigroupe").parent().hide()}$("#jour").change()});$("input,#demigroupe",form).on("change keyup",function(){if($("#raccourci").data("modif")==0)$("#raccourci").val(0);else $("#raccourci").data("modif",0)});$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",el).click()});$("select:first",form).focus();$("#tid").change()};$.fn.init_cdt_raccourcis=function(){this.each(function(){var form=$(this);$('[id^="h_d"]',form).datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$('[id^="h_f"]',form).val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$('[id^="h_fin"]').datetimepicker({format:"Ghi",datepicker:false});$('[id^="type"]',form).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$('[id^="h_d"],[id^="dem"]',form).parent().show();$('[id^="h_f"]',form).parent().hide();break;case 1:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().show();break;case 2:case 3:$('[id^="h_d"],[id^="h_f"]',form).parent().hide();$('[id^="dem"]',form).parent().show();break;default:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().hide()}}).change();$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",form).click()})})};$.fn.init_notes=function(action){var el=$(this);var form=$("#epingle form").append($("#form-notes").html());var table=$("table",form);$("input, select",form).attr("id",function(){return this.getAttribute("name")});$("tr[data-id]",table).append("<td>"+$("div",form).html()+"</td>");$("select",table).attr("name",function(){return"e"+$(this).parent().parent().data("id")});$("div",form).remove();if($("input:checkbox",table).length){$("tr[data-id]",form).hide();$("input:checkbox",table).on("change",function(){if($("input:checkbox:last",table).prop("checked"))return $("tr[data-id]",form).show();var ids=$("input:checked",table).map(function(){return this.value.split(",")}).get().concat();$("tr[data-id]:not(.orig)",table).hide();for(var i=0;i<ids.length;i++)$('tr[data-id="'+ids[i]+'"]',form).show()})}function marque_dejanotes(sid){if(sid==0)return true;var dn=dejanotesautres[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (noté par un autre colleur)"});var dn=dejanotesperso[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]:not(.orig)',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (déjà noté par vous-même)"});$(".dejanote select").prop("disabled",true).val("x")}$("#jour").datetimepicker({format:"d/m/Y",timepicker:false,onShow:function(){if($("#td").is(":checked"))this.setOptions({minDate:$("#form-ajoute option:eq(1)").data("date"),maxDate:new Date(new Date($("#form-ajoute option:last").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()+6*864e5)});else this.setOptions({minDate:debut||$("#sid option:selected").data("date"),maxDate:new Date(new Date((fin||$("#sid option:selected").next().data("date")).replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()-864e5)})}});$("#heure").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"15h30"});$("#duree").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"0h00",step:10}).on("change",function(){$(this).removeClass("auto")});$("select",table).on("change keyup",function(){var nb=$("table select:visible",form).filter(function(){return this.value!="x"}).length;var duree=nb*(dureecolle||20);if($("#duree").is(".auto")||duree>$("#duree").val().replace(/^(\d*)h(\d*)$/,function(tout,x,y){return 60*(x|0)+(y|0)}))$("#duree").val((duree/60|0)+"h"+(duree%60||"")).addClass("auto")});if(action=="ajout-notes"){$("#sid").on("change keyup",function(){$(".dejanote td:first-child").text(function(){return this.textContent.replace(" (noté par un autre colleur)","").replace(" (déjà noté par vous-même)","")});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);marque_dejanotes($("#sid").val());if($("#sid option:selected").val()>0){if(!$("#jour").val())$("#jour").val($("#sid option:eq(1)").data("date"));var jour=new Date($("#jour").val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var debut=new Date($("#sid option:selected").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var fin=new Date($("#sid option:selected").next().data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));if(jour<debut||jour>fin){debut=debut.toJSON();$("#jour").val(debut.substr(8,2)+"/"+debut.substr(5,2)+"/"+debut.substr(0,4))}}}).change();$("#td").on("change keyup",function(){if(this.checked){$("#sid").parent().hide();$("#description").parent().show();table.hide()}else{$("#sid").parent().show();$("#description").parent().hide();table.show()}});$("#description").parent().hide()}else{var tr=el.parent().parent();if(el.data("sid")){$("#description, #td").parent().remove();var sid=el.data("sid");var debut=$('#form-ajoute option[value="'+sid+'"]').data("date");var fin=$('#form-ajoute option[value="'+sid+'"]').next().data("date");var eleves=el.data("eleves").split("|");var notes=el.data("notes").split("|");for(var i=0;i<eleves.length;i++)$('tr[data-id="'+eleves[i]+'"]',form).addClass("orig").show().find("select").val(notes[i]).on("change",function(){$(this).parent().parent().removeClass("orig")});$("h3",form).text("Modifier des notes - semaine du "+$('select[name="sid"] option[value="'+sid+'"]').text().split(" ").slice(0,3).join(" "));if(el.next().length)marque_dejanotes(sid);else{$('tr:not(.orig), .orig option[value="x"]',table).remove();$("#duree").prop("disabled",true);form.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier quels élèves ont été interrogés ou la durée de la colle. Vous pouvez corriger la date et l'heure (dans la limite de la semaine enregistrée) ou les notes que vous avez mises vous pouvez mettre une note à un élève initialement absent qui a rattrapé sa colle.</p>")}}else{table.remove();$("#td").prop("checked",true).prop("disabled",true);$("#description").val(el.parent().prev().prev().prev().text());$("h3",form).text("Modifier la séance de TD sans note");if(el.next().length==0){$("#duree").prop("disabled",true);form.append("<p>Cette séance a déjà été relevée&nbsp;: il est impossible de modifier sa durée. Vous pouvez corriger la date, l'heure ou la description.</p>")}}$("#id").val(el.parent().data("id").split("|")[1]);$("#jour").val($("td:eq(0)",tr).text().replace(/(.{6})(.{2})/,function(tout,x,y){return x+"20"+y}));$("#heure").val($("td:eq(1)",tr).text().replace("-",""));$("#duree").val($("td:eq(3)",tr).text().replace(/.*m/,function(s){return"0h"+s.slice(0,-1)}))}};$.fn.init_ajout_utilisateurs=function(){$("#autorisation,#saisie").on("change",function(){var f=$("#epingle form");var a=$("#autorisation",f).val();if(a==0){$(".affichesiinvite,.affichesiinvitation,.affichesimotdepasse",f).hide(0);$("textarea",f).prop("disabled",true).attr("placeholder","Zone de saisie des utilisateurs\nSélectionnez d'abord un type d'utilisateur")}else{var inv=a==1;var mdp=$("#saisie",f).val()==2;$("#saisie",f).parent().toggle(!inv);$(".affichesiinvite",f).toggle(inv);$(".affichesiinvitation",f).toggle(!inv&&!mdp);$(".affichesimotdepasse",f).toggle(!inv&&mdp);$("textarea",f).prop("disabled",false).attr("placeholder",function(){if(inv)return"identifiant_1,motdepasse_1\nidentifiant_2,motdepasse_2\nidentifiant_3,motdepasse_3\n...";else if(mdp)return"nom_1,prénom_1,motdepasse_1\nnom_2,prénom_2,motdepasse_2\nnom_3,prénom_3,motdepasse_3\n...";else return"nom_1,prénom_1,adresse_1\nnom_2,prénom_2,adresse_2\nnom_3,prénom_3,adresse_3\n..."})}}).change()};$.fn.init_evenements=function(){var el=$(this);var form=$("#epingle form");$("textarea",form).attr("id","texte");if(el.is(".modifevnmt")){var id=el.attr("id").substr(1);var valeurs=evenements[id];var cles=["type","matiere","debut","fin","texte"];for(var i=0;i<6;i++){$("#"+cles[i]).val(valeurs[cles[i]])}$("#id").val(id);$("#texte").change();$("#jours").prop("checked",valeurs["je"]);$('<a class="icon-supprime" title="Supprimer cette information"></a>').insertBefore($(".icon-ok")).on("click",function(){supprime($(this))}).parent().data("id","agenda-elems|"+id)}$("#debut").datetimepicker({onShow:function(){this.setOptions({maxDate:$("#fin").val()||false})},onClose:function(t,input){$("#fin").val(function(i,v){return v||input.val()})}});$("#fin").datetimepicker({onShow:function(){this.setOptions({minDate:$("#debut").val()||false})},onClose:function(t,input){$("#debut").val(function(i,v){return v||input.val()})}});$("#jours").on("change",function(){var v;if(this.checked){$("#debut,#fin").each(function(){v=this.value.split(" ");$(this).val(v[0]).attr("data-heure",v[1]).datetimepicker({format:"d/m/Y",timepicker:false})})}else{$("#debut,#fin").each(function(){if(this.hasAttribute("data-heure"))$(this).val(this.value+" "+$(this).attr("data-heure")).removeAttr("data-heure");$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})})}}).change()};function selmult(){var sel=$(this);var isacces=this.getAttribute("name").indexOf("protection")+1?1:0;function majselect(sel){sel.prev().children().prop("selected",false).text(function(){var options=$(isacces?"option:selected:not([value=6])":"option:selected",sel);if(isacces&&options.length==5)return"Tout utilisateur identifié";if(options.length==0)return"Choisir ...";else return options.map(function(){return this.textContent}).get().join(", ")}).prop("selected",true)}$("<select id="+sel.prev().attr("for")+"><option selected hidden></option></select>").insertBefore(sel.hide(0)).attr("disabled",sel.attr("disabled")).on("mousedown",function(e){e.preventDefault();this.blur();popup('<a class="icon-ok" title="Valider ce choix"></a><h3>'+sel.prev().prev().text().replace(":","")+'</h3><table id="selmult">'+$("option",sel).map(function(){return"<tr"+(this.selected?' class="sel"':"")+"><td>"+this.textContent+'</td><td><input type="checkbox" '+(this.selected?"checked ":"")+'value="'+this.value+'"></td></tr>'}).get().join("")+"</table>",true);var f=$("#fenetre");if(isacces){$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}})}else{$("#selmult",f).prepend('<tr class="categorie"><th></th><th><a class="icon-cocher"></a></th></tr>');$(".icon-cocher",f).on("click",cocher_utilisateurs)}$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});$(".icon-ok",f).on("click",function(){sel.val($("input:checked",f).map(function(){return this.value}).get());majselect(sel);$("#fenetre, #fenetre_fond").remove()})});majselect(sel)}function cocher_utilisateurs(){$(this).toggleClass("icon-cocher icon-decocher").parent().parent().nextUntil(".categorie").find("input").prop("checked",$(this).hasClass("icon-decocher")).change()}function edite_utilisateur(){var id=$(this).parent().parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"prefs",id:id},dataType:"json",afficheform:function(data){if("nom"in data){popup($("#form-edite").html(),true);var f=$("#fenetre");$("input[name]",f).attr("id",function(){return this.getAttribute("name")});if(data["valide"])$("#comptedesactive, #demande, #invitation",f).remove();else if(data["demande"])$("#compteactif, #comptedesactive, #invitation",f).remove();else if(data["invitation"])$("#compteactif, #comptedesactive, #demande",f).remove();else $("#compteactif, #demande, #invitation",f).remove();if(data["autorisation"]==1)$("#nom, #prenom, #mail1, #mail2",f).parent().remove();$("p:first",f).html(function(i,code){return code.replace("XXX",data["prenom"].length?"de <em>"+data["prenom"]+" "+data["nom"]+"</em>":"<em>"+data["login"]+"</em>").replace("YYY","<em>"+["Invité","Élève","Colleur","Lycée","Professeur"][data["autorisation"]-1]+"</em>")});$('input[type="text"],input[type="email"]',f).val(function(){return data[this.id]});$('input[type="checkbox"]',f).prop("checked",function(){return data[this.id]});if(!data["mailenvoi"])$('[name="mailexp"],[name="mailcopie"]',f).parent().remove();$("a.icon-ok",f).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=utilisateur&modif=prefs&id="+id+"&"+$("form",f).serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input",f).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",f).click()}})}}})}function init_utilisateurs(){$(".icon-cocher").on("click",cocher_utilisateurs);$("td .icon-edite").on("click",edite_utilisateur);$("td .icon-desactive, td .icon-active, td .icon-supprutilisateur, td .icon-validutilisateur").on("click",modif_utilisateur);$("th .icon-desactive, th .icon-active, th .icon-supprutilisateur, th .icon-validutilisateur").on("click",modif_utilisateurs);$("td:not(.icones)").on("click",function(){$(this).parent().find("input").click()});$("#u input").on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});function modif_utilisateur(){var question="";var nom=$(this).parent().siblings().first();var compte=nom.text().length?"de <em>"+nom.next().text()+" "+nom.text()+"</em>":"d'identifiant <em>"+nom.next().next().text()+"</em>";var categorie=$(this).parent().parent().prevUntil(".categorie").last().prev().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver le compte invité "+compte+". Cela signifie que le compte ne sera pas supprimé mais sera non utilisable pour une connexion. Les associations éventuelles avec les matières seront conservées. Ce compte sera listé dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année et dont il faut conserver les notes de colles.";break;case"active":if(categorie=="Invités")question="Vous allez réactiver le compte invité "+compte+". La connexion sera à nouveau possible. Ce compte apparaîtra à nouveau dans la partie principale du tableau.";else question="Vous allez réactiver le compte "+compte+". Cela signifie que l'utilisateur correspondant pourra à nouveau se connecter. Il retrouvera son compte, ses notes de colles éventuelles, ses préférences, ses accès spécifiques éventuels, sans modification. Ce compte apparaîtra à nouveau dans la partie principale du tableau.";break;case"supprutilisateur":if(categorie=="Demandes")question="Vous allez supprimer la demande "+compte+". Cela signifie que cette demande ne conduira pas à une création de compte. Le demandeur ne sera pas prévenu de votre décision.<br> Une fois réalisée, cette opération est définitive, mais rien n'empêche le demandeur d'effectuer une nouvelle demande.<br> <strong>Si vous n'attendez plus de nouvelle demande de création de compte, il est certainement préférable de supprimer cette possibilité à l'aide du réglage accessible en cliquant sur l'icône <span class=\"icon-prefs\"></span> en haut à droite sur cette page</strong>";
+else if(categorie=="Invitations"){var textecolles=$(this).parent().prev().prev().text()=="Élève"?'<p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ce compte seront supprimées. Cette suppression est définitive.</strong></p><p>':"<br>";question="Vous allez supprimer l'invitation "+compte+". Cela signifie que cette invitation ne sera plus valable et que si la personne invitée clique sur le lien reçu par courriel, une erreur apparaîtra devant elle."+textecolles+"<strong>L'invitation envoyée n'a pas de date de péremption&nbsp;: il est n'est pas normal de supprimer l'invitation pour la refaire, à moins de s'être trompé d'adresse électronique. Si la personne invitée vous dit ne pas réussir à s'identifier, proposez-lui de passer par le lien <em>Mot de passe oublié</em>.</strong><br> La personne invitée ne sera pas prévenue de votre décision."}else if(categorie=="Professeurs")question="Vous allez supprimer le compte professeur "+compte+'. <strong>Cela signifie que toutes les préférences de ce compte seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.<br> Les données des matières auxquelles il est associé sont indépendantes&nbsp;: elles ne seront pas supprimées.';else if(categorie=="Lycée")question="Vous allez supprimer le compte lycée "+compte+". Cela signifie que toutes les préférences de ce compte seront perdues.";else if(categorie=="Colleurs")question="Vous allez supprimer le compte colleur "+compte+'. <strong>Cela signifie que toutes les préférences de ce compte seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Élèves")question="Vous allez supprimer le compte élève "+compte+'. <strong>Cela signifie que toutes les données correspondant à ce compte seront perdues. Les groupes où il apparaît seront modifiés, les notes de colles éventuelles seront supprimées.</strong> <p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ce compte seront supprimées. Cette suppression est définitive.<br> Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Invités")question="Vous allez supprimer le compte invité "+compte+". Cela signifie que la connexion par ce compte ne sera plus possible.";else question="Vous allez supprimer le compte "+compte+" déjà désactivé. <strong>Cela signifie que toutes les données correspondant à ce compte seront perdues définitivement. Les groupes où il apparaît seront modifiés, les notes de colles éventuelles seront supprimées.</strong>";if(categorie!="Demandes")question=question+"<br>Une fois réalisée, cette opération est définitive.";break;case"validutilisateur":question="Vous allez valider la demande "+compte+". Son compte sera immédiatement actif et un courriel va immédiatement être envoyé pour le/la prévenir.<br> Il sera automatiquement associé à toutes les matières&nbsp;: <strong>pensez à aller supprimer les matières qui ne le concernent pas sur la page de gestion des associations utilisateurs-matières.</strong>"}confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:el.className.substring(5),id:$(el).parent().parent().data("id")},dataType:"json",el:"",fonction:function(){location.reload(true)}})})}function modif_utilisateurs(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var lignes=cases.parent().parent();var ids=lignes.map(function(){return $(this).data("id")}).get().join(",");var comptes=lignes.map(function(){var nom=$(this).children().first().text();return nom.length?"<em>"+$(this).children().eq(1).text()+" "+nom+"</em>":"<em>"+$(this).children().eq(2).text()+"</em>"}).get().join(", ");var pos=comptes.lastIndexOf(",");if(pos>0)comptes=comptes.substring(0,pos)+" et"+comptes.substring(pos+1);var question="";var categorie=$(this).parent().parent().prev().children().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver les comptes invités "+comptes+". Cela signifie que ces compte ne seront pas supprimés mais seront non utilisables pour une connexion. Les associations éventuelles avec les matières seront conservées. Ces comptes seront listés dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année dont il faut conserver les notes de colles.";question="Vous allez désactiver les comptes de "+comptes+". Cela signifie que ces comptes seront toujours visibles pour les professeurs mais que les utilisateurs correspondant ne pourront plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées aux comptes seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant les comptes.<br> Ces comptes seront listés dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour des élèves ou des colleurs partis en cours d'année et dont il faut conserver les notes de colles.";break;case"active":if(categorie=="Invités")question="Vous allez réactiver les comptes invité "+comptes+". La connexion sera à nouveau possible. Ces comptes apparaîtront à nouveau dans la partie principale du tableau.";else question="Vous allez réactiver les comptes de "+comptes+". Cela signifie que les utilisateurs correspondant pourront à nouveau se connecter. Ils retrouveront leur compte, leurs notes de colles éventuelles, leurs préférences, leurs accès spécifiques éventuels, sans modification. Ces comptes apparaîtront à nouveau dans la partie principale du tableau.";break;case"supprutilisateur":if(categorie=="Demandes")question="Vous allez supprimer les demandes de "+comptes+". Cela signifie que ces demandes ne conduiront pas à des créations de compte. Les demandeurs ne seront pas prévenus de votre décision.<br> Une fois réalisée, cette opération est définitive, mais rien n'empêche les demandeurs d'effectuer une nouvelle demande.<br> <strong>Si vous n'attendez plus de nouvelle demande de création de compte, il est certainement préférable de supprimer cette possibilité à l'aide du réglage accessible en cliquant sur l'icône <span class=\"icon-prefs\"></span> en haut à droite sur cette page</strong>";else if(categorie=="Invitations"){question="Vous allez supprimer les invitations de "+comptes+". Cela signifie que ces invitations ne seront plus valables et que si les personnes invitées cliquent sur le lien reçu par courriel, une erreur apparaîtra devant elles. <p class=\"note\"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur les comptes de types élèves seront supprimées. Ces suppressions sont définitives.</strong></p> <p><strong>Ces invitations envoyées n'ont pas de date de péremption&nbsp;: il n'est pas normal de supprimer une invitation pour la refaire, à moins de s'être trompé d'adresse électronique. Si une personne invitée vous dit ne pas réussir à s'identifier, proposez-lui de passer par le lien <em>Mot de passe oublié</em>.</strong><br> Les personnes invitées ne seront pas prévenues de votre décision."}else if(categorie=="Professeurs")question="Vous allez supprimer les comptes professeurs de "+comptes+'. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.<br> Les données des matières auxquelles ces utilisateurs sont associés sont indépendantes&nbsp;: elles ne seront pas supprimées.';else if(categorie=="Lycée")question="Vous allez supprimer les comptes lycée de "+comptes+". Cela signifie que toutes les préférences de ces comptes seront perdues.";else if(categorie=="Colleurs")question="Vous allez supprimer les comptes colleurs de "+comptes+'. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Élèves")question="Vous allez supprimer les comptes élèves de "+comptes+'. <strong>Cela signifie que toutes les données correspondant à ces comptes seront perdues. Les groupes où ils apparaissent seront modifiés, les notes de colles éventuelles seront supprimées.</strong> <p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ces compte seront supprimées. Cette suppression est définitive.<br> Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Invités")question="Vous allez supprimer les comptes invités de "+comptes+". Cela signifie que la connexion par ces comptes ne sera plus possible.";else question="Vous allez supprimer les comptes de "+comptes+" déjà désactivés. <strong>Cela signifie que toutes les données correspondant à ces comptes seront perdues définitivement. Les groupes où ils apparaîssent seront modifiés, les notes de colles éventuelles seront supprimées. Dans le cas des comptes professeurs, les données des matières associées ne seront pas supprimées.</strong>";if(categorie!="Demandes")question=question+"<br>Une fois réalisée, cette opération est définitive.";break;case"validutilisateur":question="Vous allez valider les demandes de "+comptes+". Leurs comptes seront immédiatement actifs et un courriel va immédiatement leur être envoyé pour les prévenir.<br> Ils seront automatiquement associés à toutes les matières&nbsp;: <strong>pensez à aller supprimer les matières qui ne les concernent pas sur la page de gestion des associations utilisateurs-matières.</strong>"}confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs",modif:el.className.substring(5),ids:ids},dataType:"json",el:"",fonction:function(){location.reload(true)}})})}}function init_utilisateurs_matieres(){$("tr:not(.categorie) td:not(:first-child,:last-child)").each(function(){var valeurs=this.textContent.split("|");this.innerHTML=valeurs[1]==1?'<a class="icon-ok" data-id="'+valeurs[0]+'" title="Supprimer l\'association à la matière"></a>':'<a class="icon-nok" data-id="'+valeurs[0]+'" title="Établir l\'association à la matière"></a>'});$("#umats a").on("click",association_um);$(".categorie [data-id]").on("click",association_ums).hide(0);$(".icon-cocher").on("click",cocher_utilisateurs).on("click",majicones);$('input[type="checkbox"]').on("click",majicones).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});$("td:first-child").on("click",function(){$(this).parent().find("input").click()});function majicones(){var tr=$(this).parent().parent();if(!tr.hasClass("categorie"))tr=tr.prevAll(".categorie").first();var cases=tr.nextUntil(".categorie").find(":checked");if(cases.length==0)$("[data-id]",tr).hide(0);else $("[data-id]",tr).each(function(){var avant=$(this).hasClass("icon-ok");var apres=cases.parent().prevAll().find('.icon-ok[data-id="'+this.getAttribute("data-id")+'"]').length<cases.length/2;if(avant!=apres)$(this).toggleClass("icon-ok icon-nok").attr("title",(apres?"Établir":"Supprimer")+" l'association à la matière de tous les cochés")}).show(0)}function association_um(){var val=$(this).hasClass("icon-ok");$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur-matiere",id:$(this).parent().parent().data("id"),matiere:$(this).data("id"),val:1-val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Établir":"Supprimer")+" l'association à la matière")}})}function association_ums(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var lignes=cases.parent().parent();var ids=lignes.map(function(){return $(this).data("id")}).get().join(",");var comptes=lignes.children(":first-of-type").map(function(){return $(this).text().split("(")[0].trim()}).get().join(", ");var pos=comptes.lastIndexOf(",");if(pos>0)comptes=comptes.substring(0,pos)+" et"+comptes.substring(pos+1);var val=$(this).hasClass("icon-ok");var mid=this.getAttribute("data-id");var question=val?"Vous allez établir l'association à la matière "+$("#m"+mid).text()+" pour les comptes de "+comptes+". Cela signifie que ces utilisateurs auront accès aux ressources liées à cette matière, en fonction de l'autorisation que vous avez fixée pour ces ressources.":"Vous allez supprimer l'association à la matière "+$("#m"+mid).text()+" pour les comptes de "+comptes+". Cela signifie que ces utilisateurs n'auront plus accès aux ressources liées à cette matière. Si des notes de colles ont été saisies, elles seront automatiquement et définitivement supprimées de la base.";confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs-matieres",ids:ids,matiere:mid,val:val|0},dataType:"json",el:"",fonction:function(el){location.reload(true)}})})}}function init_envoimails(){var t=$("#envoimails");$("td",t).each(function(){var valeurs=this.textContent.split("|");this.innerHTML=valeurs[1]==1?'<a class="icon-ok" data-id="'+valeurs[0]+'" title="Supprimer l\'autorisation d\'envoi"></a>':'<a class="icon-nok" data-id="'+valeurs[0]+'" title="Établir l\'autorisation d\'envoi"></a>'});$("td a",t).on("click",function(){var val=$(this).hasClass("icon-nok")|0;$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",mails:1,depuis:$(this).parent().parent().data("id"),vers:$(this).data("id"),val:val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Établir":"Supprimer")+" l'autorisation d'envoi")}})});$("th span",t).on("click",function(){var val=$(this).hasClass("icon-ok");var ligne=$(this).parent().parent();$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",mails:1,depuis:ligne.data("id"),vers:0,val:val|0},dataType:"json",el:ligne,fonction:function(el){el.find("td a").toggleClass("icon-ok",val).toggleClass("icon-nok",!val).attr("title",(val?"Établir":"Supprimer")+" l'autorisation d'envoi")}})});$("#umails .icon-edite").on("click",edite_utilisateur)}function init_utilisateurs_groupes(){$('article input[type="checkbox"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:this.id.substr(0,5),id:this.id.substr(5),val:this.checked|0},dataType:"json",el:"",fonction:function(el){return true}})});$(".usergrp span").append('&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>').on("click",utilisateursgroupe)}function utilisateursgroupe(){popup($("#form-utilisateurs").html(),true);var f=$("#fenetre");var span=$(this);article=span.parent().parent();$("table",f).attr("id","ugrp");$("h3",f).append($(".editable",article).text()||$("input:first",article).val());$(".icon-deplie",f).on("click",plie);$(".icon-cocher",f).on("click",cocher_utilisateurs);$("tr:not(.categorie)",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)});var ids=span.data("uids");$("#u"+ids.replace(/,/g,",#u"),f).prop("checked",true).change();$(".icon-ok",f).on("click",function(){var ids=$("input:checked",f).map(function(){return this.id.replace("u","")}).get().join(",");var noms=$("input:checked",f).parent().prev().map(function(){return this.textContent.split("(")[0].trim()}).get().join(", ")||"[Personne]";if(article.is("div")){$("#uids",article).val(ids);span.data("uids",ids);span.html(noms+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>');$("#fenetre, #fenetre_fond").remove()}else $.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:"utilisateurs",id:article.data("id").split("|")[1],uids:ids},dataType:"json",el:span,fonction:function(el){el.data("uids",ids);el.html(noms+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>');$("#fenetre, #fenetre_fond").remove()}})})}function suppressionmultiple(){var prop=$(this).data("id").split("|");var contexte=$(this).parent().find("h3").text();var item="";switch(prop[2]){case"infos":item="toutes les informations de la page <em>"+contexte+"</em>";break;case"colles":item="tous les programmes de colles de la matière <em>"+contexte+"</em>";break;case"cdt":item="tout le contenu du cahier de texte de la matière <em>"+contexte+"</em>";break;case"docs":item="tous les répertoires et documents de la matière <em>"+contexte+"</em>";break;case"notes":item="toutes les notes de la matière <em>"+contexte+"</em>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action="+prop[0]+"&id="+prop[1]+"&supprime_"+prop[2]+"=1",dataType:"json",el:$(el),fonction:function(el){el.remove()}})})}function destinatairesmail(){popup($("#form-destinataires").html(),true);var f=$("#fenetre");$(".icon-deplie",f).on("click",plie);$("tr:not(.gr) input.dest",f).attr("id",function(){return"u"+this.value});$("tr:not(.categorie) td:nth-child(-n+2)",f).on("click",function(e){if(!$(e.target).is("input"))$(this).parent().find("input:first").click()});$("input",f).on("change",function(){var tr=$(this).parent().parent();if(this.checked)tr.find("input:not(."+this.className+")").prop("checked",false);tr.toggleClass("sel",tr.find("input:checked").length>0)});var ids=$('[name="id-copie"]').val();$("#u"+ids.replace(/,/g,",#u")).prop("checked",true).change();ids=$('[name="id-bcc"]').val();$("#u"+ids.replace(/,/g,",#u")).parent().next().children().prop("checked",true).change();$(".categorie a",f).on("click keyup",function(){var classe=this.className.split(" ")[1];var etat=this.className.split(" ")[0]=="icon-cocher";var titre=this.title;$(this).parent().parent().nextUntil(".categorie").find("."+classe+":not(:disabled)").prop("checked",etat).change();this.className=(etat?"icon-decocher ":"icon-cocher ")+classe;this.title=this.title.replace(etat?"Cocher":"Décocher",etat?"Décocher":"Cocher");var classe2=classe=="dest"?"bcc":"dest";$(this).parent().parent().find(".icon-decocher."+classe2).each(function(){this.className="icon-cocher "+classe2;this.title="C"+this.title.substr(3)})});$(".gr input",f).on("click",function(){var ids=this.value;if(this.className=="dest")$("#u"+ids.replace(/,/g,",#u")).prop("checked",this.checked).change();else $("#u"+ids.replace(/,/g,",#u")).parent().next().children().prop("checked",this.checked).change()});$(".icon-ok",f).on("click",function(){$('[name="id-copie"]').val($("tr:not(.gr) .dest:checked",f).map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($("tr:not(.gr) .bcc:checked",f).map(function(){return this.value}).get().join(","));$("#maildest").text($("tr:not(.gr) .dest:checked",f).parent().prev().map(function(){return this.textContent}).get().concat($("tr:not(.gr) .bcc:checked",f).parent().prev().prev().map(function(){return this.textContent+" (CC)"}).get()).join(", ")||"[Personne]");$("#fenetre, #fenetre_fond").remove()})}function envoimail(){if($(".maildest").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 $.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})}function relevenotes(){confirmation("<p>Vous allez réaliser une relève des notes de colles. Cela consiste à marquer comme relevées toutes les heures déclarées jusqu'à maintenant et non encore relevées. Vous pourrez alors télécharger le nouveau relevé au sein du tableau en bas de page.</p><p>Cette opération n'est pas annulable.</p><p>Une fois que vous aurez réalisé ce relevé, les professeurs et colleurs ne pourront pas modifier le nombre d'élèves et la durée correspondant aux colles relevées.</p>",this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action=releve-notes",dataType:"json",el:"",fonction:function(el){location.reload(true)}})})}$(document).ajaxSend(function(ev,xhr,settings){$("#load").show(200);if($("body").attr("data-csrf-token")!=undefined){if(settings.data.append)settings.data.append("csrf-token",$("body").attr("data-csrf-token"));else settings.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+settings.data}}).ajaxStop(function(){$("#load").hide(200)}).ajaxSuccess(function(ev,xhr,settings){var data=xhr.responseJSON;switch(data["etat"]){case"ok":$("body").data("nepassortir",false);affiche(data["message"],"ok");settings.fonction(settings.el);break;case"nok":affiche(data["message"],"nok");break;case"login":case"mdp":reconnect(settings,data["etat"]=="mdp");break;case"recupok":settings.afficheform(data)}});$(function(){$("a.formulaire, .modifevnmt").on("click",formulaire);$("a.icon-aide").on("click",function(){popup($("#aide-"+($(this).parent().data("id")||"page").split("|")[0]).html(),false)});$("a.icon-ok").on("click",valide);$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime,a.icon-lock,a.icon-ajoutecolle").on("click",function(){window[this.className.substring(5)]($(this))});$("#log").hide().on("click",function(){$(this).hide(300)});$(".editable").editinplace();$("a.icon-deconnexion").on("click",function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"deconnexion"},dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$(".icon-menu").on("click",function(e){e.stopPropagation();$("#menu").toggleClass("visible");if($("#menu").hasClass("visible")){$('<div id="menu_fond"></div>').appendTo("body");$("#menu_fond").on("click",function(){$("#menu_fond").remove();$("#menu").removeClass("visible")})}else $("#menu_fond").remove()});$("a.icon-echange").on("click",function(){$.ajax({url:"recup.php",method:"post",data:{action:"compteglobal"},dataType:"json",afficheform:function(data){popup('<h3>Changer de Cahier</h3><div></div><p>Cette liste est éditable sur l\'<a href="/connexion/">interface de connexion globale</a>.</p>',true);var f=$("#fenetre");var cahiers=data["cahiers"];for(var rep in cahiers)$("div",f).attr("id","cahiers").append('<a href="/'+rep+'/">'+cahiers[rep]+"</a>")}})});$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").init_cdt_raccourcis();$(".icon-mailenvoi").on("click",envoimail);$("#maildest, #maildest + .icon-edite").on("click",destinatairesmail);$(".categorie th:first-child").prepend($('<span class="icon-deplie" title="Déplier/Replier cette catégorie"></span>').on("click",plie));$("article select[multiple]").each(selmult);$(".supprmultiple").on("click",suppressionmultiple);$("#u").each(init_utilisateurs);$("#umats").each(init_utilisateurs_matieres);$("#envoimails").each(init_envoimails);$(".usergrp").first().each(init_utilisateurs_groupes);$("#planning select").change(function(){$(this).parent().prev().children("input").prop("checked",this.value==0)});$("#planning input").change(function(){$(this).parent().next().children("select").val(0)});$("#relevenotes").on("click",relevenotes);$("body").data("nepassortir",false);$("textarea:visible").on("change",function(e){$("body").data("nepassortir",true);$(this).off(e)});window.addEventListener("beforeunload",function(e){if($("body").data("nepassortir")){e.preventDefault();e.returnValue=""}})});
diff -urN cahier-de-prepa9.0.1/js/fonctions.js cahier-de-prepa9.0.2/js/fonctions.js
--- cahier-de-prepa9.0.1/js/fonctions.js	2019-08-25 22:52:51.233926037 +0200
+++ cahier-de-prepa9.0.2/js/fonctions.js	2019-09-04 15:18:02.172488391 +0200
@@ -68,6 +68,9 @@
                 case 'nok':
                   affiche(data['message'],'nok');
                   break;
+                // Si 'recupok' : récupération de données (pour l'échange de Cahier)
+                case 'recupok':
+                  settings.afficheform(data);
               }
             });
 
@@ -84,8 +87,10 @@
         $(this).hide();
       });
 
-    // On cache le menu si besoin
-    $('#colonne,nav').removeClass('visible');
+    // Suppression du menu si visible en mode mobile
+    if ( $('#menu').hasClass('visible') )
+      $('.icon-menu').click();
+
     // Création de fenêtre
     var el = $('<div id="fenetre"></div>').appendTo('body').html('\
 <a class="icon-ferme" title="Fermer"></a><a class="icon-ok" title="Valider"></a><h3>Connexion</h3>\
@@ -138,30 +143,17 @@
   });
 
   // Affichage des informations sur le flux RSS
-  $('#aide-rss').each( function() {
-    $('a.icon-recent').replaceWith('<a class="icon-rss" title="Flux RSS"></a>');
-    $('a.icon-rss').on("click", function() {
-/*      var el = $('<div id="fenetre"></div>').appendTo('body').html($('.aide-rss').html());
-      $('<div id="fenetre_fond"></div>').appendTo('body').click(function() {
-        $('#fenetre,#fenetre_fond').remove();
-      });
-      $('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function() {
-        el.remove();
-        $('#fenetre_fond').remove();
-      });*/
-      popup($('#aide-rss').html(),false);
-    });
-  });
+  $('a.icon-rss').on("click", function() { popup($('#aide-rss').html(),false); });
 
   // Menu mobile
   $('.icon-menu').on("click", function(e) {
     e.stopPropagation();
-    $('nav').toggleClass('visible');
-    if ( $('nav').hasClass('visible') )  {
+    $('#menu').toggleClass('visible');
+    if ( $('#menu').hasClass('visible') )  {
       $('<div id="menu_fond"></div>').appendTo('body');
-      $('nav,#menu_fond').on("click", function() {
+      $('#menu,#menu_fond').on("click", function() {
         $('#menu_fond').remove();
-        $('nav').removeClass('visible');
+        $('#menu').removeClass('visible');
       });
     }
     else 
@@ -181,4 +173,21 @@
     });
   });
   
+  // Changement de Cahier si interface globale et si compte global existant contenant au moins un autre Cahier
+  $('a.icon-echange').on("click",function() {
+    $.ajax({url: 'recup.php',
+            method: "post",
+            data: { action:'compteglobal' },
+            dataType: 'json',
+            afficheform: function(data) {
+              popup('<h3>Changer de Cahier</h3><div></div><p>Cette liste est éditable sur l\'<a href="/connexion/">interface de connexion globale</a>.</p>',true);
+              var f = $('#fenetre');
+              // Récupération des valeurs et écriture 
+              var cahiers = data['cahiers'];
+              for ( var rep in cahiers )
+                $('div',f).attr('id','cahiers').append('<a href="/'+rep+'/">'+cahiers[rep]+'</a>');
+            }
+    });
+  });
+
 });
diff -urN cahier-de-prepa9.0.1/js/fonctions.min.js cahier-de-prepa9.0.2/js/fonctions.min.js
--- cahier-de-prepa9.0.1/js/fonctions.min.js	2019-08-28 19:37:35.281530762 +0200
+++ cahier-de-prepa9.0.2/js/fonctions.min.js	2019-09-04 15:22:40.995720805 +0200
@@ -1 +1 @@
-function affiche(message,etat){$("#log").removeClass().addClass(etat).html(message).append('<span class="icon-ferme"></span>').fadeIn().off("click").on("click",function(){window.clearTimeout(extinction);$(this).fadeOut(800)});extinction=window.setTimeout(function(){$("#log").fadeOut(800)},6e3)}function popup(contenu,modal){$("#fenetre,#fenetre_fond").remove();var el=$('<article id="fenetre"></article>').appendTo("body").html(contenu).focus();if(modal)$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});else $('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(el).on("click",function(){$("#fenetre_fond").remove();$(this).remove();el.removeAttr("id").insertBefore($("article,#calendrier,#parentsdoc+*").first())});$('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function(){el.remove();$("#fenetre_fond").remove()})}$(document).ajaxSend(function(ev,xhr,settings){$("#load").show(200);if($("body").attr("data-csrf-token")!=undefined){if(settings.data.append)settings.data.append("csrf-token",$("body").attr("data-csrf-token"));else settings.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+settings.data}}).ajaxStop(function(){$("#load").hide(200)}).ajaxSuccess(function(ev,xhr,settings){var data=xhr.responseJSON;switch(data["etat"]){case"ok":affiche(data["message"],"ok");settings.fonction(settings.el);break;case"nok":affiche(data["message"],"nok");break}});$(function(){$("a.icon-connexion").on("click",function(e){if(!$("#log").length)$('<div id="log"></div>').appendTo("body").hide().on("click",function(){$(this).hide()});$("#colonne,nav").removeClass("visible");var el=$('<div id="fenetre"></div>').appendTo("body").html('<a class="icon-ferme" title="Fermer"></a><a class="icon-ok" title="Valider"></a><h3>Connexion</h3><form>  <p>Veuillez entrer votre identifiant et votre mot de passe&nbsp;:</p>  <input class="ligne" type="text" name="login" placeholder="Identifiant">  <input class="ligne" type="password" name="motdepasse" placeholder="Mot de passe">  <p class="oubli"><label for="permconn">Se souvenir de moi</label><input type="checkbox" name="permconn" id="permconn" value="1">  <p class="oubli"><a href="gestioncompte?oublimdp">Identifiant ou mot de passe oublié&nbsp;?</a></p>  <p class="oubli"><a href="gestioncompte?creation">Créer un compte</a></p></form>');$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme").on("click",function(){$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:$("#fenetre form").serialize()+"&connexion=1",dataType:"json",el:"",beforeSend:function(){$("#load").show(200)},complete:function(){$("#load").hide(200)},fonction:function(el){location.reload(true)}}).done(function(data){if(data["etat"]=="nok")$("#fenetre form p:first").html(data["message"]).addClass("warning")})});$("#fenetre input").on("keypress",function(e){if(e.which==13){$("#fenetre a.icon-ok").click();return false}});$("#fenetre form input:first").focus()});$("a.icon-deconnexion").on("click",function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"deconnexion"},dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("#aide-rss").each(function(){$("a.icon-recent").replaceWith('<a class="icon-rss" title="Flux RSS"></a>');$("a.icon-rss").on("click",function(){popup($("#aide-rss").html(),false)})});$(".icon-menu").on("click",function(e){e.stopPropagation();$("nav").toggleClass("visible");if($("nav").hasClass("visible")){$('<div id="menu_fond"></div>').appendTo("body");$("nav,#menu_fond").on("click",function(){$("#menu_fond").remove();$("nav").removeClass("visible")})}else $("#menu_fond").remove()});$(".evnmt").on("click",function(){var donnees=evenements[this.id.substr(1)];var el=$('<div id="fenetre"></div>').appendTo("body").html("<h3>"+donnees.titrebis+'</h3>\n<h3 style="margin-bottom: 1em;">'+donnees.date+"</h3>\n<p>"+donnees.texte+"</p>").focus();$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});$('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function(){el.remove();$("#fenetre_fond").remove()})})});
\ No newline at end of file
+function affiche(message,etat){$("#log").removeClass().addClass(etat).html(message).append('<span class="icon-ferme"></span>').fadeIn().off("click").on("click",function(){window.clearTimeout(extinction);$(this).fadeOut(800)});extinction=window.setTimeout(function(){$("#log").fadeOut(800)},6e3)}function popup(contenu,modal){$("#fenetre,#fenetre_fond").remove();var el=$('<article id="fenetre"></article>').appendTo("body").html(contenu).focus();if(modal)$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});else $('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(el).on("click",function(){$("#fenetre_fond").remove();$(this).remove();el.removeAttr("id").insertBefore($("article,#calendrier,#parentsdoc+*").first())});$('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function(){el.remove();$("#fenetre_fond").remove()})}$(document).ajaxSend(function(ev,xhr,settings){$("#load").show(200);if($("body").attr("data-csrf-token")!=undefined){if(settings.data.append)settings.data.append("csrf-token",$("body").attr("data-csrf-token"));else settings.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+settings.data}}).ajaxStop(function(){$("#load").hide(200)}).ajaxSuccess(function(ev,xhr,settings){var data=xhr.responseJSON;switch(data["etat"]){case"ok":affiche(data["message"],"ok");settings.fonction(settings.el);break;case"nok":affiche(data["message"],"nok");break;case"recupok":settings.afficheform(data)}});$(function(){$("a.icon-connexion").on("click",function(e){if(!$("#log").length)$('<div id="log"></div>').appendTo("body").hide().on("click",function(){$(this).hide()});if($('#menu').hasClass('visible'))$(".icon-menu").click();var el=$('<div id="fenetre"></div>').appendTo("body").html('<a class="icon-ferme" title="Fermer"></a><a class="icon-ok" title="Valider"></a><h3>Connexion</h3><form>  <p>Veuillez entrer votre identifiant et votre mot de passe&nbsp;:</p>  <input class="ligne" type="text" name="login" placeholder="Identifiant">  <input class="ligne" type="password" name="motdepasse" placeholder="Mot de passe">  <p class="oubli"><label for="permconn">Se souvenir de moi</label><input type="checkbox" name="permconn" id="permconn" value="1">  <p class="oubli"><a href="gestioncompte?oublimdp">Identifiant ou mot de passe oublié&nbsp;?</a></p>  <p class="oubli"><a href="gestioncompte?creation">Créer un compte</a></p></form>');$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme").on("click",function(){$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:$("#fenetre form").serialize()+"&connexion=1",dataType:"json",el:"",beforeSend:function(){$("#load").show(200)},complete:function(){$("#load").hide(200)},fonction:function(el){location.reload(true)}}).done(function(data){if(data["etat"]=="nok")$("#fenetre form p:first").html(data["message"]).addClass("warning")})});$("#fenetre input").on("keypress",function(e){if(e.which==13){$("#fenetre a.icon-ok").click();return false}});$("#fenetre form input:first").focus()});$("a.icon-deconnexion").on("click",function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"deconnexion"},dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("a.icon-rss").on("click",function(){popup($("#aide-rss").html(),false)});$(".icon-menu").on("click",function(e){e.stopPropagation();$("#menu").toggleClass("visible");if($("#menu").hasClass("visible")){$('<div id="menu_fond"></div>').appendTo("body");$("#menu,#menu_fond").on("click",function(){$("#menu_fond").remove();$("#menu").removeClass("visible")})}else $("#menu_fond").remove()});$(".evnmt").on("click",function(){var donnees=evenements[this.id.substr(1)];var el=$('<div id="fenetre"></div>').appendTo("body").html("<h3>"+donnees.titrebis+'</h3>\n<h3 style="margin-bottom: 1em;">'+donnees.date+"</h3>\n<p>"+donnees.texte+"</p>").focus();$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});$('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function(){el.remove();$("#fenetre_fond").remove()})});$("a.icon-echange").on("click",function(){$.ajax({url:"recup.php",method:"post",data:{action:"compteglobal"},dataType:"json",afficheform:function(data){popup('<h3>Changer de Cahier</h3><div></div><p>Cette liste est éditable sur l\'<a href="/connexion/">interface de connexion globale</a>.</p>',true);var f=$("#fenetre");var cahiers=data["cahiers"];for(var rep in cahiers)$("div",f).attr("id","cahiers").append('<a href="/'+rep+'/">'+cahiers[rep]+"</a>")}})})});
diff -urN cahier-de-prepa9.0.1/recent.php cahier-de-prepa9.0.2/recent.php
--- cahier-de-prepa9.0.1/recent.php	2019-08-29 19:25:51.623975610 +0200
+++ cahier-de-prepa9.0.2/recent.php	2019-09-08 10:34:26.313041955 +0200
@@ -57,24 +57,30 @@
 //////////////
 //// HTML ////
 //////////////
-debut($mysqli,'Derniers contenus',$message,$autorisation,'recents');
+debut($mysqli,'Derniers contenus',$message,$autorisation,'recent');
+
+echo "\n  <div id=\"icones\"><a class=\"icon-rss\" title=\"Flux RSS\"></a></div>\n\n";
 
 // Liste des icônes pour affichage
 $icones = array(
   'pdf' => '-pdf', 'dvi' => '-pdf',
+  'py' => '-py', 'sql' => '-sql',
+  'db' => '-db', 'db3' => '-db', 'sqlite' => '-db', 'sq3' => '-db',
   'doc' => '-doc', 'odt' => '-doc', 'docx' => '-doc',
   'xls' => '-xls', 'ods' => '-xls', 'xlsx' => '-xls', 'csv' => '-xls',
   'ppt' => '-ppt', 'odp' => '-ppt', 'pptx' => '-ppt', 'pps' => 'ppt',
-  'jpg' => '-jpg', 'jpeg' => '-jpg', 'png' => '-jpg', 'gif' => '-jpg', 'svg' => '-jpg', 'tif' => '-jpg', 'tiff' => '-jpg', 'bmp' => '-jpg', 'ps' => '-jpg', 'eps' => '-jpg',
+  'jpg' => '-jpg', 'jpeg' => '-jpg', 'jpe' => '-jpg', 'png' => '-jpg', 'gif' => '-jpg', 'svg' => '-jpg', 'tif' => '-jpg', 'tiff' => '-jpg', 'bmp' => '-jpg', 'ps' => '-jpg', 'eps' => '-jpg',
   'mp3' => '-mp3', 'ogg' => '-mp3', 'oga' => '-mp3', 'wma' => '-mp3', 'wav' => '-mp3', 'ra' => '-mp3', 'rm' => '-mp3',
-  'mp4' => '-mp4', 'avi' => '-mp4', 'mpeg' => '-mp4', 'mpg' => '-mp4', 'wmv' => '-mp4', 'mp4' => '-mp4', 'ogv' => '-mp4', 'qt' => '-mp4', 'mov' => '-mp4', 'mkv' => '-mp4', 'flv' => '-mp4',
-  'zip' => '-zip', 'rar' => '-zip', '7z' => '-zip',
-  'py' => '-py', 'exe' => '-py', 'sh' => '-py', 'ml' => '-py', 'mw' => '-py',
-  'db' => '-db', 'db3' => '-db', 'sqlite' => '-db', 'sq3' => '-db',
-  'sql' => '-sql',
-  'txt' => '', 'rtf' => '', '' => ''
+  'mp4' => '-mp4', 'avi' => '-mp4', 'mpeg' => '-mp4', 'mpg' => '-mp4', 'wmv' => '-mp4', 'mp4' => '-mp4', 'ogv' => '-mp4', 'qt' => '-mp4', 'mov' => '-mp4', 'mkv' => '-mp4', 'flv' => '-mp4', 'swf' => '-mp4',
+  'zip' => '-zip', 'rar' => '-zip', '7z' => '-zip', 'apk' => '-zip', 'dmg' => '-zip', 'jar' => '-zip', 
+  'apk' => '-apk',
+  'exe' => '-exe', 'sh' => '-exe', 'ml' => '-exe', 'mw' => '-exe', 'msi' => '-exe',
+  'tex' => '-tex',
+  'ggb' => '-cod', 'htm' => '-cod', 'mht' => '-cod', 'rw3' => '-cod', 'sce' => '-cod', 'slx' => '-cod', 'vpp' => '-cod'
 );
 
+
+
 // Affichage des éléments récents à afficher
 $resultat = $mysqli->query("SELECT type, UNIX_TIMESTAMP(publi) AS publi, UNIX_TIMESTAMP(maj) AS maj, titre, lien, texte FROM recents
                             WHERE $requete AND ( DATEDIFF(NOW(),publi) < 180 OR DATEDIFF(NOW(),maj) < 180 ) 
@@ -108,7 +114,7 @@
           $icone = '<span class="icon-colles"></span>';
           break;
         case 3:
-          $icone = '<span class="icon-doc'.$icones[substr(strtok($r['texte'],'|'),1)].'"></span>';
+          $icone = '<span class="icon-doc'.( $icones[strtolower(substr(strtok($r['texte'],'|'),1))] ?? '' ).'"></span>';
           $r['texte'] = '<p>Document de '.strtok('|').', dans <a href="docs?rep='.strtok('|').'">'.strtok('|').'</a></p>';
           break;
         case 4 :
