diff -urN cahier-de-prepa12.0.0/ajaxadmin.php cahier-de-prepa12.0.1/ajaxadmin.php
--- cahier-de-prepa12.0.0/ajaxadmin.php	2025-08-16 17:41:04.881779009 +0200
+++ cahier-de-prepa12.0.1/ajaxadmin.php	2025-08-29 03:13:29.305625705 +0200
@@ -526,10 +526,12 @@
 ////////////////////////////////////
 // Ajout de nouveaux utilisateurs //
 ////////////////////////////////////
-elseif ( ( $action == 'ajout-utilisateurs' ) && in_array($autorisation = intval($_REQUEST['autorisation'] ?? 0),array(1,2,3,4,5)) && isset($_REQUEST['saisie']) && count($matieres = array_filter($_REQUEST['matieres'] ?? array(),'ctype_digit')) )  {
+elseif ( ( $action == 'ajout-utilisateurs' ) && in_array($autorisation = intval($_REQUEST['autorisation'] ?? 0),array(1,2,3,4,5)) && isset($_REQUEST['saisie']) )  {
   
   // Vérification des matières -- on ne garde que les identifiants existants,
   // et on prend silencieusement par défaut l'ensemble des matières
+  if ( !count($matieres = array_filter($_REQUEST['matieres'] ?? array(),'ctype_digit')) )
+    exit('{"etat":"nok","message":"Choix de matières non valide"}');  
   if ( $matieres[0] )  {
     $resultat = $mysqli->query('SELECT GROUP_CONCAT(id ORDER BY id) AS matieres FROM matieres');
     $r = $resultat->fetch_row();
@@ -651,8 +653,8 @@
   // 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>'.stripslashes($message).'"}');
-  exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"<strong>$n $nouveaucompte</strong>".stripslashes($message).'","reload":"2"}');
+    exit("{\"etat\":\"nok\",\"message\":\"<strong>$n $nouveaucompte et $e erreur".($e>1?'s':'').'</strong>'.str_replace('"','\"',stripslashes($message)).'"}');
+  exit($_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"<strong>$n $nouveaucompte</strong>".str_replace('"','\"',stripslashes($message)).'","reload":"2"}');
 }
 
 ///////////////////////////////////////////////////////////////
diff -urN cahier-de-prepa12.0.0/ajaxautres.php cahier-de-prepa12.0.1/ajaxautres.php
--- cahier-de-prepa12.0.0/ajaxautres.php	2025-08-22 23:33:02.197050845 +0200
+++ cahier-de-prepa12.0.1/ajaxautres.php	2025-08-27 15:53:48.957581067 +0200
@@ -36,7 +36,7 @@
   $aut_dest = implode(',',array_keys(str_split('00'.strrev(decbin($aut_envoi))),1));
   $resultat->free();
   // Récupération des destinataires, comptes valides uniquement
-  $resultat = $mysqli->query("SELECT id, mail, IF(LENGTH(mailexp),mailexp, CONCAT(prenom,' ',nom)) AS mailexp FROM utilisateurs WHERE mail > '' AND mdp > '0' AND id != ${_SESSION['id']} AND FIND_IN_SET(autorisation%10,'$aut_dest') ORDER BY autorisation%10 DESC, nom");
+  $resultat = $mysqli->query("SELECT id, mail, IF(LENGTH(mailexp),mailexp, CONCAT(prenom,' ',nom)) AS mailexp FROM utilisateurs WHERE mail != '' AND mdp > '0' AND id != ${_SESSION['id']} AND FIND_IN_SET(autorisation%10,'$aut_dest') ORDER BY autorisation%10 DESC, nom");
   $mysqli->close();
   $utilisateurs = array();
   while ( $r = $resultat->fetch_assoc() )
@@ -47,9 +47,7 @@
   foreach ( $ids as $k => $i )
     if ( isset($utilisateurs[$i]) )  {
       // Tous les 10 destinataires, on ajoute un retour à la ligne pour respecter la RFC 5322
-      if ( $k%10 == 9 )
-        $dests .= "\r\n\t$dests";
-      $dests .= encode_mailheaders($utilisateurs[$i]['mailexp'])." <{$utilisateurs[$i]['mail']}>, ";
+      $dests .= ( ( $k%10 == 9 ) ? "\r\n\t" : '' ) . encode_mailheaders($utilisateurs[$i]['mailexp'])." <{$utilisateurs[$i]['mail']}>, ";
       unset($utilisateurs[$i]);
     }
   // Formatage des destinataires et initialisation des copies cachées
@@ -88,16 +86,20 @@
     $sep = md5(uniqid());
     $corps = "--$sep\r\nContent-type: text/plain; charset=UTF-8\r\nContent-Transfer-Encoding: 8bit\r\n\r\n$texte\r\n\r\n";
     // Traitement de chaque fichier envoyé 
+    $tailletotale = 0;
     for ( $i = 0 ; $i < ( $n = count($_FILES['pj']['tmp_name']) ) ; $i++ )  {
       $ext = strtolower(trim(htmlspecialchars(strrchr($_FILES['pj']['name'][$i],'.'),ENT_COMPAT)));
       $nom = htmlspecialchars(trim(substr(basename(str_ireplace(array($ext,'\\','/'), array('','_','_'), ( $_REQUEST['nom'][$i] ?? '' ) ?: $_FILES['pj']['name'][$i] )),0,100)),ENT_COMPAT);
       if ( !is_uploaded_file($_FILES['pj']['tmp_name'][$i]) || !( $contenu = file_get_contents($_FILES['pj']['tmp_name'][$i]) ) )
-        exit("{\"etat\":\"nok\",\"message\":\"Le courriel n'a pas été envoyé, le fichier <em>$nom$ext</em> n'a pas pu être correctement récupéré.'\"}");
+        exit("{\"etat\":\"nok\",\"message\":\"Le courriel n'a pas été envoyé, le fichier <em>$nom$ext</em> n'a pas pu être correctement récupéré.\"}");
       if ( $_FILES['pj']['size'][$i] > 5*1048576 )
-        exit("{\"etat\":\"nok\",\"message\":\"Le courriel n'a pas été envoyé, le fichier <em>$nom$ext</em> est trop lourd (dépasse 5&nbsp;Mo).'\"}");
+        exit("{\"etat\":\"nok\",\"message\":\"Le courriel n'a pas été envoyé, le fichier <em>$nom$ext</em> est trop lourd (dépasse 5&nbsp;Mo).\"}");
+      $tailletotale += $_FILES['pj']['size'][$i];
       $nom = encode_mailheaders($nom.$ext);
       $corps .= "--$sep\r\nContent-Type: ".transforme_extension(substr($ext,1),1)."; name=\"$nom\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"$nom\"\r\n\r\n".chunk_split(base64_encode($contenu))."\r\n\r\n";
     }
+    if ( $tailletotale > 20*1048576 )
+      exit('{"etat":"nok","message":"Le courriel n\'a pas été envoyé, les fichiers sont trop lourds (plus de 20&nbsp;Mo au total)."}');
     mail($dests,encode_mailheaders($sujet),"$corps--$sep--","MIME-Version: 1.0\r\nList-Unsubscribe: <mailto:contact".strstr($mailadmin,'@')."?subject=unsubscribe>\r\nContent-type: multipart/mixed; boundary=\"$sep\"\r\nFrom: $mailexp <$exp>\r\nReply-To: $mailexp <${u['mail']}>\r\n$bcc\r\n","-f$exp");
   }
   // Message de confirmation d'envoi avec décompte
diff -urN cahier-de-prepa12.0.0/ajaxediteur.php cahier-de-prepa12.0.1/ajaxediteur.php
--- cahier-de-prepa12.0.0/ajaxediteur.php	2025-08-18 09:47:10.945615670 +0200
+++ cahier-de-prepa12.0.1/ajaxediteur.php	2025-08-25 11:12:58.445192318 +0200
@@ -506,15 +506,17 @@
       // Suppression des sous-répertoires dans la base
       if ( !requete('reps',"DELETE FROM reps WHERE FIND_IN_SET(id,'$rids')",$mysqli) )
         exit("{\"etat\":\"nok\",\"message\":\"Les sous-répertoires de <em>${r['nom']}</em> qui devaient être supprimés ne l'ont pas été. Vous devriez signaler ce problème à l'administrateur. Erreur MySQL n°".$mysqli->errno.', «'.$mysqli->error.'»."}');
+      $requete .= ( $dids ) ? " OR FIND_IN_SET(parent,'$rids')" : "FIND_IN_SET(parent,'$rids')";
+      $nr = count(explode(',',$rids));
     }
-    $requete .= ( $dids ) ? " OR FIND_IN_SET(parent,'$rids')" : "FIND_IN_SET(parent,'$rids')";
-    $nr = count(explode(',',$rids));
   }
   
   // Récupération des documents concernés
-  $resultat = $mysqli->query("SELECT GROUP_CONCAT(id) FROM docs WHERE $requete");
-  $dids = $resultat->fetch_row()[0];
-  $resultat->free();
+  if ( $requete )  {
+    $resultat = $mysqli->query("SELECT GROUP_CONCAT(id) FROM docs WHERE $requete");
+    $dids = $resultat->fetch_row()[0];
+    $resultat->free();
+  }
   if ( !($nr+strlen($dids)) )
     exit('{"etat":"nok","message":"Aucun répertoire/document à supprimer"}');
   // Suppression des documents
@@ -800,14 +802,17 @@
   $ok = 0;
   $message = '';
   for ( $i = 0 ; $i < ( $n = count($_FILES['fichier']['tmp_name']) ) ; $i++ )  {
+    // Vérifications des données envoyées (on fait confiance aux utilisateurs connectés pour ne pas envoyer de scripts malsains)
+    // $ext doit être en minusculte et ne pas dépasser 10 caractères, mais modification à l'écriture du fichier
+    $ext = substr(strtolower(htmlspecialchars( strrchr($_FILES['fichier']['name'][$i],'.') ,ENT_COMPAT)),1,10);
+    if ( !($nom = substr(htmlspecialchars(trim(basename(str_replace(array("$ext",'\\','/'),array('','_','_'), ( $_REQUEST['nom'][$i] ?? '' ) ?: $_FILES['fichier']['name'][$i] ))),ENT_COMPAT),0,100)) )  {
+      $message .= '<br>Le document <em>'.$_FILES['fichier']['tmp_name'][$i].'</em>  n\'a pas été ajouté, vous n\'avez pas précisé de nom et ce n\'est pas autorisé.';
+      continue;
+    }
     if ( !is_uploaded_file($_FILES['fichier']['tmp_name'][$i]) )  {
       $message .= '<br>Le document <em>'.$_FILES['fichier']['tmp_name'][$i].'</em> n\'a pas été ajouté : le fichier a mal été envoyé. Vous devriez en informer l\'administrateur.';
       continue;
     }
-    // Vérifications des données envoyées (on fait confiance aux utilisateurs connectés pour ne pas envoyer de scripts malsains)
-    // $ext doit être en minusculte et ne pas dépasser 10 caractères, mais modification à l'écriture du fichier
-    $ext = substr(strtolower(htmlspecialchars( strrchr($_FILES['fichier']['name'][$i],'.') ,ENT_COMPAT)),1,10);
-    $nom = substr(htmlspecialchars(trim(basename(str_replace(array("$ext",'\\','/'),array('','_','_'), ( $_REQUEST['nom'][$i] ?? '' ) ?: $_FILES['fichier']['name'][$i] ))),ENT_COMPAT),0,100);
     // Création du répertoire particulier
     $lien = substr(sha1(mt_rand()),0,15);
     while ( is_dir("documents/$lien") )
@@ -879,11 +884,12 @@
     exit('{"etat":"nok","message":"La fonctionnalité agenda a été désactivée. Vous devez la réactiver sur la page de gestion des réglages."}');
   
   // Vérification de l'accès
+  // * les administrateurs peuvent tout faire
   // * les professeurs de la matière peuvent tout faire
   // * les éditeurs de l'événement peuvent éditer titre et texte
   // * les éditeurs de l'agenda seulement ne peuvent rien faire
   // * les éditeurs de l'événement et de l'agenda peuvent tout faire
-  if ( ( $autorisation == 5 ) && $r['matiereassociee'] )
+  if ( $_SESSION['admin'] || ( $autorisation == 5 ) && $r['matiereassociee'] )
     $editionglobale = true;
   // Pour les utilisateurs autorisés à l'édition de l'information, professeurs hors de la matière
   // ou autres utilisateurs associés à la matière, seuls titre et texte sont modifiables
@@ -935,7 +941,11 @@
       $resultat->free();
       if ( $mid )  {
         $resultat = $mysqli->query("SELECT nom FROM matieres WHERE id = $mid");
-        if ( !$resultat->num_rows )
+        // Seuls les administrateurs ou les profs/éditeurs associés à la matière peuvent écrire
+        // Dernière partie : cas des professeurs-colleurs
+        if ( !( $resultat->num_rows && ( $_SESSION['admin'] || in_array($mid,explode(',',$_SESSION['matieres'])) || 
+             ( $autorisation == 5 ) && strpos($_SESSION['matieres'],'c') && in_array("c$mid",explode(',',$_SESSION['matieres'])) && ( ($edition_agenda-1) & 4 )
+                                       ) ) )
           exit('{"etat":"nok","message":"Matière non valide."}');
         $matiere = ' en '.$mysqli->real_escape_string($resultat->fetch_row()[0]);
         $resultat->free();
@@ -1082,7 +1092,11 @@
   $matiere = '';
   if ( $mid )  {
     $resultat = $mysqli->query("SELECT nom FROM matieres WHERE id = $mid");
-    if ( !$resultat->num_rows )
+    // Seuls les administrateurs ou les profs/éditeurs associés à la matière peuvent écrire
+    // Dernière partie : cas des professeurs-colleurs
+    if ( !( $resultat->num_rows && ( $_SESSION['admin'] || in_array($mid,explode(',',$_SESSION['matieres'])) || 
+         ( $autorisation == 5 ) && strpos($_SESSION['matieres'],'c') && in_array("c$mid",explode(',',$_SESSION['matieres'])) && ( ($edition_agenda-1) & 4 )
+                                   ) ) )
       exit('{"etat":"nok","message":"Matière non valide."}');
     $matiere = 'en '.$mysqli->real_escape_string($resultat->fetch_row()[0]);
     $resultat->free();
diff -urN cahier-de-prepa12.0.0/ajaxprofs.php cahier-de-prepa12.0.1/ajaxprofs.php
--- cahier-de-prepa12.0.0/ajaxprofs.php	2025-08-11 01:39:53.266019571 +0200
+++ cahier-de-prepa12.0.1/ajaxprofs.php	2025-08-25 05:13:50.788536340 +0200
@@ -361,7 +361,7 @@
   $resultat->free();
 
   // Traitement d'une modification
-  if ( ctype_digit($type = $_REQUEST['type'] ?? '') && isset($_REQUEST['template']) && in_array( $jour = intval($_REQUEST['jour'] ?? 0),array(1,2,3,4,5,6,7)) )  {
+  if ( ctype_digit($type = $_REQUEST['type'] ?? '') && isset($_REQUEST['template']) && ctype_digit( $jour = $_REQUEST['jour'] ?? 1 ) )  {
     if ( !( $nom = $mysqli->real_escape_string(trim($_REQUEST['nom'] ?? '')) ) )
       exit("{\"etat\":\"nok\",\"message\":\"Le raccourci de séance <em>${r['nom']}</em> n'a pas été modifié. Le nom doit être non vide.\"}");
     $template = trim($mysqli->real_escape_string($_REQUEST['template']));
@@ -413,7 +413,7 @@
 ///////////////////////////////////////////////
 // Ajout d'un raccourci des cahiers de texte //
 ///////////////////////////////////////////////
-elseif ( ( $action == 'ajout-cdt-raccourci' ) && ctype_digit($type = $_REQUEST['type'] ?? '') && isset($_REQUEST['template']) && in_array( $jour = intval($_REQUEST['jour'] ?? 0),array(1,2,3,4,5,6,7)) )  {
+elseif ( ( $action == 'ajout-cdt-raccourci' ) && ctype_digit($type = $_REQUEST['type'] ?? '') && isset($_REQUEST['template']) && ctype_digit( $jour = $_REQUEST['jour'] ?? 1 ) )  {
   if ( !( $nom = $mysqli->real_escape_string(trim($_REQUEST['nom'] ?? '')) ) )
     exit('{"etat":"nok","message":"Le raccourci de séance n\'a pas été ajouté. Le nom doit être non vide."}');
   $template = trim($mysqli->real_escape_string($_REQUEST['template']));
diff -urN cahier-de-prepa12.0.0/blogcdp.php cahier-de-prepa12.0.1/blogcdp.php
--- cahier-de-prepa12.0.0/blogcdp.php	2025-01-05 19:26:20.997926628 +0100
+++ cahier-de-prepa12.0.1/blogcdp.php	2025-08-26 15:45:41.163349725 +0200
@@ -6,7 +6,6 @@
 // Fonctions
 include('fonctions.php');
 
-$interfaceglobale = '../connexion/';
 $mysqli = connectsql();
 
 // Les messages sont stockés dans la base globale, table "messsages"
@@ -63,7 +62,6 @@
 $mysqli = connectsql(false,$interfaceglobale);
 
 // Accès à un article spécifique
-//$requeteprotection = ( $autorisation ? 'protection = 0 OR ' . ( $admin ? 'protection <= 32' : "( (protection-1)>>($autorisation-1) & 1 ) = 0" ) : 'protection = 0' );
 $requeteprotection = ( $admin ? 'protection <= 32' : "protection = 0 OR ( (protection-1)>>($autorisation-1) & 1 ) = 0" );
 $requeteid = ( isset($_REQUEST['article']) && ctype_digit($id = $_REQUEST['article']) ) ? "AND id = $id" : '';
 $resultat = $mysqli->query("SELECT id, titre, texte, protection, DATE_FORMAT(publi,'%w%Y%m%e %kh%i') AS date FROM messages WHERE ( $requeteprotection ) $requeteid AND publi < NOW() ORDER BY publi DESC");
diff -urN cahier-de-prepa12.0.0/cdt.php cahier-de-prepa12.0.1/cdt.php
--- cahier-de-prepa12.0.0/cdt.php	2025-01-04 01:33:37.827433370 +0100
+++ cahier-de-prepa12.0.1/cdt.php	2025-08-26 03:26:01.710724693 +0200
@@ -113,7 +113,7 @@
 // Recherche et type/semaine sont exclusifs
 // n peut être nul pour afficher toute l'année
 // $lien sert pour les boutons de la barre de recherche
-$recherche = $lien_n = $lien_voir = '';
+$recherche = $lien_n = $lien_voir = $requete = '';
 if ( $_REQUEST['recherche'] ?? '' )  {
   $requete = 'AND cdt.texte LIKE \'%'.$mysqli->real_escape_string($recherche = htmlspecialchars($_REQUEST['recherche'])).'%\'';
   $n = 0;
diff -urN cahier-de-prepa12.0.0/cdt-raccourcis.php cahier-de-prepa12.0.1/cdt-raccourcis.php
--- cahier-de-prepa12.0.0/cdt-raccourcis.php	2021-08-28 22:27:13.602286982 +0200
+++ cahier-de-prepa12.0.1/cdt-raccourcis.php	2025-08-25 04:47:51.450247758 +0200
@@ -24,7 +24,7 @@
   $resultat->free();
 }
 // Select sur les jours de la semaine et pour les demigroupes
-$select_jours = '<option value="1">Lundi</option><option value="2">Mardi</option><option value="3">Mercredi</option><option value="4">Jeudi</option><option value="5">Vendredi</option><option value="6">Samedi</option><option value="0">Dimanche</option>';
+$select_jours = '<option value="1">Lundi précédent</option><option value="2">Mardi précédent</option><option value="3">Mercredi précédent</option><option value="4">Jeudi précédent</option><option value="5">Vendredi précédent</option><option value="6">Samedi précédent</option><option value="8">Lundi suivant</option><option value="9">Mardi suivant</option><option value="10">Mercredi suivant</option><option value="11">Jeudi suivant</option><option value="12">Vendredi suivant</option><option value="13">Samedi suivant</option>';
 $select_dg = '<option value="0">Classe entière</option><option value="1">Demi-groupe</option>';
 
 //////////////
diff -urN cahier-de-prepa12.0.0/CHANGELOG.php cahier-de-prepa12.0.1/CHANGELOG.php
--- cahier-de-prepa12.0.0/CHANGELOG.php	2025-08-23 12:27:06.855561545 +0200
+++ cahier-de-prepa12.0.1/CHANGELOG.php	2025-08-26 03:19:58.761818081 +0200
@@ -1,4 +1,4 @@
-Version actuelle : 12.0.0 (23/08/25)
+Version actuelle : 12.0.1 (26/08/25)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -315,6 +315,12 @@
   * Correction de bugs : MathJax dans les indications de transferts, édition 
   des élèves dans l'agenda, nom de fichiers avec une apostrophe, lignes longues
   coupées dans les entêtes des mails.
+12.0.1 26/08/2025 
+  * Corrections de bugs (suppression de documents, noms de fichiers, 
+  autorisation d'édition de l'agenda)
+  * Raccourcis du cahier de texte : possibilité de choisir le sens d'ajustement
+  du jour (précédent ou suivant)
+  * Planning : décompte total des semaines
 ===================
 
 Todo :
@@ -334,6 +340,7 @@
   * Pseudo-tableau modifiable par tous
   * Image en bandeau sous le titre
   * Suppression d'un événement par un prof hors de sa matières
+  * Template de renommage des transferts
 
 =======
 
diff -urN cahier-de-prepa12.0.0/def_sql.php cahier-de-prepa12.0.1/def_sql.php
--- cahier-de-prepa12.0.0/def_sql.php	2025-08-17 02:20:14.558055606 +0200
+++ cahier-de-prepa12.0.1/def_sql.php	2025-08-30 23:35:49.860030686 +0200
@@ -85,7 +85,7 @@
   `login` varchar(50) NOT NULL UNIQUE,
   `nom` varchar(50) NOT NULL,
   `prenom` varchar(50) NOT NULL,
-  `mail` varchar(50) NOT NULL,
+  `mail` varchar(60) NOT NULL,
   `autorisation` tinyint(1) UNSIGNED NOT NULL,
   `mdp` char(41) NOT NULL,
   `matieres` varchar(50) NOT NULL,
@@ -409,29 +409,27 @@
 
 INSERT INTO `agenda-types` (id,ordre,nom,cle,couleur,index_nbmax,index_datemax)
   VALUES (1, 1, 'Cours', 'cours', 'CC6633', 10, 7),
-         (5, 2, 'Devoir surveillé', 'DS', '6633CC', 10, 7),
-         (6, 3, 'Devoir maison', 'DM', '99CC33', 10, 7),
-         (7, 4, 'Divers','div', 'CCCC33', 10, 7),
+         (4, 2, 'Devoir surveillé', 'DS', '6633CC', 10, 7),
+         (5, 3, 'Devoir maison', 'DM', '99CC33', 10, 7),
+         (6, 4, 'Divers','div', 'CCCC33', 10, 7),
          (2, 5, 'Jour férié', 'fer', 'CC3333', 10, 7),
          (3, 6, 'Vacances', 'vac', '66CC33', 10, 7);
 
-
 -- 
--- Valeurs du calendrier, exemple pour 2019-2020
+-- Valeurs du calendrier, exemple pour 2025-2026
 -- 
 -- INSERT INTO semaines (id,debut) VALUES 
---  ( 1,'2019-09-02'), (2,'2019-09-09'), (3,'2019-09-16'), (4,'2019-09-23'), (5,'2019-09-30'),
---  ( 6,'2019-10-07'), (7,'2019-10-14'), (8,'2019-10-21'), (9,'2019-10-28'),(10,'2019-11-04'),
---  (11,'2019-11-11'),(12,'2019-11-18'),(13,'2019-11-25'),(14,'2019-12-02'),(15,'2019-12-09'),
---  (16,'2019-12-16'),(17,'2019-12-23'),(18,'2019-12-30'),(19,'2020-01-06'),(20,'2020-01-13'),
---  (21,'2020-01-20'),(22,'2020-01-27'),(23,'2020-02-03'),(24,'2020-02-10'),(25,'2020-02-17'),
---  (26,'2020-02-24'),(27,'2020-03-02'),(28,'2020-03-09'),(29,'2020-03-16'),(30,'2020-03-23'),
---  (31,'2020-03-30'),(32,'2020-04-06'),(33,'2020-04-13'),(34,'2020-04-20'),(35,'2020-04-27'),
---  (36,'2020-05-04'),(37,'2020-05-11'),(38,'2020-05-18'),(39,'2020-05-25'),(40,'2020-06-01'),
---  (41,'2020-06-08'),(42,'2020-06-15'),(43,'2020-06-22'),(44,'2020-06-29');
+--  (1,'2025-09-01'), (2,'2025-09-08'), (3,'2025-09-15'), (4,'2025-09-22'), (5,'2025-09-29'),
+--  (6,'2025-10-06'), (7,'2025-10-13'), (8,'2025-10-20'), (9,'2025-10-27'),(10,'2025-11-03'),
+--  (11,'2025-11-10'),(12,'2025-11-17'),(13,'2025-11-24'),(14,'2025-12-01'),(15,'2025-12-08'),
+--  (16,'2025-12-15'),(17,'2025-12-22'),(18,'2025-12-29'),(19,'2026-01-05'),(20,'2026-01-12'),
+--  (21,'2026-01-19'),(22,'2026-01-26'),(23,'2026-02-02'),(24,'2026-02-09'),(25,'2026-02-16'),
+--  (26,'2026-02-23'),(27,'2026-03-02'),(28,'2026-03-09'),(29,'2026-03-16'),(30,'2026-03-23'),
+--  (31,'2026-03-30'),(32,'2026-04-06'),(33,'2026-04-13'),(34,'2026-04-20'),(35,'2026-04-27'),
+--  (36,'2026-05-04'),(37,'2026-05-11'),(38,'2026-05-18'),(39,'2026-05-25'),(40,'2026-06-01'),
+--  (41,'2026-06-08'),(42,'2026-06-15'),(43,'2026-06-22'),(44,'2026-06-29'),(45,'2026-07-06');
 
 -- INSERT INTO vacances (id, nom) VALUES
---   (0, ''),
 --   (1, 'Vacances de la Toussaint'),
 --   (2, 'Vacances de Noël'),
 --   (3, "Vacances d'hiver"),
@@ -440,28 +438,28 @@
 -- Planning de la zone C
 -- UPDATE semaines SET vacances = 1 WHERE id = 8 OR id = 9;
 -- UPDATE semaines SET vacances = 2 WHERE id = 17 OR id = 18;
--- UPDATE semaines SET vacances = 3 WHERE id = 24 OR id = 25;
--- UPDATE semaines SET vacances = 4 WHERE id = 32 OR id = 33;
+-- UPDATE semaines SET vacances = 3 WHERE id = 26 OR id = 27;
+-- UPDATE semaines SET vacances = 4 WHERE id = 34 OR id = 35;
 -- UPDATE semaines SET colle = 1 WHERE vacances = 0;  
 
 -- INSERT INTO agenda (id, matiere, type, debut, fin, texte) VALUES
---   ( 1, 0, 1, '2021-09-02 00:00:00', '2021-09-02 00:00:00', '<div class=\"annonce\">C\'est la rentrée ! Bon courage pour cette nouvelle année&nbsp;!</div>'),
---   ( 2, 0, 2, '2021-11-01 00:00:00', '2021-11-01 00:00:00', '<p>Toussaint</p>'),
---   ( 3, 0, 2, '2021-11-11 00:00:00', '2021-11-11 00:00:00', '<p>Armistice 1918</p>'),
---   ( 4, 0, 2, '2021-12-25 00:00:00', '2021-12-25 00:00:00', '<p>Noël</p>'),
---   ( 5, 0, 2, '2022-01-01 00:00:00', '2022-01-01 00:00:00', '<p>Jour de l\'an</p>'),
---   ( 6, 0, 2, '2022-04-18 00:00:00', '2022-04-18 00:00:00', '<p>Lundi de Pâques</p>'),
---   ( 7, 0, 2, '2022-05-01 00:00:00', '2022-05-01 00:00:00', '<p>Fête du travail</p>'),
---   ( 8, 0, 2, '2022-05-08 00:00:00', '2022-05-08 00:00:00', '<p>Armistice 1945</p>'),
---   ( 9, 0, 2, '2022-05-26 00:00:00', '2022-05-29 00:00:00', '<p>Pont de l\'Ascension</p>'),
---   (10, 0, 2, '2022-06-06 00:00:00', '2022-06-06 00:00:00', '<p>Lundi de Pentecôte</p>'),
---   (11, 0, 2, '2022-07-14 00:00:00', '2022-07-14 00:00:00', '<p>Fête Nationale</p>'),
---   (12, 0, 3, '2021-07-05 00:00:00', '2021-09-01 00:00:00', '<p>Vacances d\'été</p>'),
---   (13, 0, 3, '2021-10-18 00:00:00', '2021-11-01 00:00:00', '<p>Vacances de la Toussaint</p>'),
---   (14, 0, 3, '2021-12-20 00:00:00', '2022-01-03 00:00:00', '<p>Vacances de Noël</p>'),
---   (15, 0, 3, '2022-02-14 00:00:00', '2022-02-28 00:00:00', '<p>Vacances d\'hiver</p>'),
---   (16, 0, 3, '2022-04-18 00:00:00', '2022-05-02 00:00:00', '<p>Vacances de printemps</p>'),
---   (17, 0, 3, '2022-07-07 00:00:00', '2022-09-01 00:00:00', '<p>Vacances d\'été</p>');
+--   ( 1, 0, 1, '2025-09-01 00:00:00', '2025-09-01 00:00:00', '<div class=\"annonce\">C\'est la rentrée ! Bon courage pour cette nouvelle année&nbsp;!</div>'),
+--   ( 2, 0, 2, '2025-11-01 00:00:00', '2025-11-01 00:00:00', '<p>Toussaint</p>'),
+--   ( 3, 0, 2, '2025-11-11 00:00:00', '2025-11-11 00:00:00', '<p>Armistice 1918</p>'),
+--   ( 4, 0, 2, '2025-12-25 00:00:00', '2025-12-25 00:00:00', '<p>Noël</p>'),
+--   ( 5, 0, 2, '2026-01-01 00:00:00', '2026-01-01 00:00:00', '<p>Jour de l\'an</p>'),
+--   ( 6, 0, 2, '2025-04-06 00:00:00', '2025-04-06 00:00:00', '<p>Lundi de Pâques</p>'),
+--   ( 7, 0, 2, '2026-05-01 00:00:00', '2026-05-01 00:00:00', '<p>Fête du travail</p>'),
+--   ( 8, 0, 2, '2026-05-08 00:00:00', '2026-05-08 00:00:00', '<p>Armistice 1945</p>'),
+--   ( 9, 0, 2, '2025-05-14 00:00:00', '2025-05-17 00:00:00', '<p>Pont de l\'Ascension</p>'),
+--   (10, 0, 2, '2025-05-25 00:00:00', '2025-05-25 00:00:00', '<p>Lundi de Pentecôte</p>'),
+--   (11, 0, 2, '2026-07-14 00:00:00', '2026-07-14 00:00:00', '<p>Fête Nationale</p>'),
+--   (12, 0, 3, '2025-07-06 00:00:00', '2025-08-31 00:00:00', '<p>Vacances d\'été</p>'),
+--   (13, 0, 3, '2025-10-19 00:00:00', '2025-11-02 00:00:00', '<p>Vacances de la Toussaint</p>'),
+--   (14, 0, 3, '2025-12-21 00:00:00', '2026-01-04 00:00:00', '<p>Vacances de Noël</p>'),
+--   (15, 0, 3, '2026-02-22 00:00:00', '2026-03-08 00:00:00', '<p>Vacances d\'hiver</p>'),
+--   (16, 0, 3, '2026-04-19 00:00:00', '2026-05-04 00:00:00', '<p>Vacances de printemps</p>'),
+--   (17, 0, 3, '2026-07-05 00:00:00', '2026-08-30 00:00:00', '<p>Vacances d\'été</p>');
 
 FIN;
 ?>
diff -urN cahier-de-prepa12.0.0/fonctions.php cahier-de-prepa12.0.1/fonctions.php
--- cahier-de-prepa12.0.0/fonctions.php	2025-08-22 23:27:04.504122584 +0200
+++ cahier-de-prepa12.0.1/fonctions.php	2025-08-29 02:29:36.345767542 +0200
@@ -222,7 +222,7 @@
       // Identifiant global de l'utilisateur = 1000*idCahier+idUtilisateur
       // On cherche uniquement un compte correspondant à au moins deux connexions
       $resultat = $mysqli->query("SELECT id FROM comptes 
-                                  WHERE FIND_IN_SET( (SELECT id FROM cahiers WHERE rep = TRIM(BOTH '/' FROM '${GLOBALS['chemin']}'))*1000+${r['id']}, connexions) AND LOCATE(',',connexions)");
+                                  WHERE LOCATE(',',connexions) AND FIND_IN_SET( (SELECT id FROM cahiers WHERE rep = TRIM(BOTH '/' FROM '${GLOBALS['chemin']}'))*1000+${r['id']}, connexions)");
       if ( $resultat->num_rows )  {
         $_SESSION['compteglobal'] = $resultat->fetch_row()[0];
         $resultat->free();
@@ -461,8 +461,7 @@
     }
   }
   // Lancement unique de la mise à jour des flux rss
-  if ( $matieres )
-    return rss($mysqli,$matieres,32-$autorisations);
+  return ( $matieres ) ? rss($mysqli,$matieres,32-$autorisations) : true;
 }
 
 // Fonction de mise à jour des flux RSS
@@ -936,7 +935,8 @@
           $menurep = '';
           if ( $bloc && ( $bloc[0] == 'r' ) )  {
             foreach( explode(',',substr($bloc,2,strpos($bloc,';')-2)) as $rid )
-                $menurep .= ( $rid > 1 ) ? "    <a class=\"menurep\" href=\"docs?rep={$reps[$rid]['id']}\">{$reps[$rid]['nom']}</a>\n" : ' ';
+              // Protection par isset : pour éviter une erreur si répertoire supprimé
+              $menurep .= ( ( $rid > 1 ) && isset($reps[$rid]) ) ? "    <a class=\"menurep\" href=\"docs?rep={$reps[$rid]['id']}\">{$reps[$rid]['nom']}</a>\n" : ' ';
             $bloc = substr($bloc,strpos($bloc,';')+1);
             // Si documents généraux : on affiche ça en début de menu
             if ( !$mid && $menurep )
@@ -1175,7 +1175,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=1200"></script>' : '<script type="text/javascript" src="js/lecture.min.js?v=1200"></script>';
+  $js = ( $edition ) ? '<script type="text/javascript" src="js/edition.min.js?v=1201"></script>' : '<script type="text/javascript" src="js/lecture.min.js?v=1201"></script>';
   if ( $script )  {
     $js .= "\n<script type=\"text/javascript\" src=\"js/$script.min.js?v=1200\"></script>";
     if ( $script2 )
diff -urN cahier-de-prepa12.0.0/gestioncompte.php cahier-de-prepa12.0.1/gestioncompte.php
--- cahier-de-prepa12.0.0/gestioncompte.php	2024-12-31 20:50:35.045676849 +0100
+++ cahier-de-prepa12.0.1/gestioncompte.php	2025-08-27 15:53:35.362731274 +0200
@@ -104,9 +104,9 @@
 
       // Recherche de l'adresse électronique dans la base de données
       // Les comptes non encore validés et suspendus ont un mdp commençant par
-      // '*' ou '!', codes ascii inférieurs à '+'.
+      // '*' ou '!', codes ascii inférieurs à '0'.
       $mysqli = connectsql();
-      $resultat = $mysqli->query('SELECT id, login, mail FROM utilisateurs WHERE mdp > \'+\' AND mail > \'\'');
+      $resultat = $mysqli->query('SELECT id, login, mail FROM utilisateurs WHERE mdp > \'0\' AND mail != \'\'');
       $mysqli->close();
       while ( $r = $resultat->fetch_assoc() )
         if ( $r['mail'] == $mail )  {
diff -urN cahier-de-prepa12.0.0/js/edition.js cahier-de-prepa12.0.1/js/edition.js
--- cahier-de-prepa12.0.0/js/edition.js	2025-08-22 23:38:07.718579214 +0200
+++ cahier-de-prepa12.0.1/js/edition.js	2025-08-28 00:29:29.172011965 +0200
@@ -1798,8 +1798,7 @@
   
   // Changement d'icône pour éviter le comportement par défaut de formulaire()
   $('#epingle .icon-ok').removeClass('icon-ok').addClass('icon-download').on("click",function() {
-    var cases = $('input:checked',form);
-    if ( cases.length == 0 ) {
+    if ( $('input:checked',table).length == 0 ) {
       affiche('<p>Aucune case n\'est cochée.</p>','nok');
       return
     }
@@ -1893,14 +1892,17 @@
       return ;
     var valeurs = raccourcis[this.value];
     for ( var cle in valeurs ) {
-      // Modification de la date (prochain lundi/mardi..)
+      // Modification de la date (j=1->6 : lundi/mardi précédents ; j=8->13 : suivants)
+      // t.getDate()-t.getDay() est la date du dimanche précédent, auquel on
+      // ajoute j%7 +/- 7 en fonction de où on est dans la semaine
       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 );
+        if ( j%7 != t.getDay() )
+          t.setDate( t.getDate() - t.getDay() + j - ( j%7 < t.getDay() ? 0 : 7 ) );
         $('#jour',form).val(zero(t.getDate())+'/'+zero(t.getMonth()+1)+'/'+t.getFullYear());
       }
-      // Modification des autres jours
+      // Modification des autres champs
       else
         $('#'+cle,form).val(valeurs[cle]);
     }
@@ -3271,9 +3273,11 @@
   // Reprise de init_docs
   $('input[type="file"]').attr('id','pj').on('change',function() {
     var fichiers = this;
+    var tailletotale = 0;
     $('input[id^="nom"]').parent().remove();
     for (var i = 0, n = fichiers.files.length, s = 0, taille = ''; i < n; i++) {
       s = fichiers.files[i].size;
+      tailletotale += s;
       taille = ( s < 1048576 ) ? Math.floor(s/1024)+' ko' : Math.floor(s/1048576)+' Mo';
       $('.ligne',form).last().after('<p class="ligne"><label for="nom'+i+'">Fichier '+(i+1)+'&nbsp;('+taille+')&nbsp;: </label><input type="text" name="nom[]" id="nom'+i+'" value="" size="50"></p>');
       $('#nom'+i).val(fichiers.files[i].name);
@@ -3281,7 +3285,7 @@
         $('.ligne',form).last().addClass('fichierlourd');
     }
     $('#videpj,#infopj').toggle(!!fichiers.files.length);
-    $('#infotaillepj').toggle(!!$('.fichierlourd').length);
+    $('#infotaillepj').toggle(tailletotale > 20*1048576 || !!$('.fichierlourd').length);
   });
   
   // Bouton de vidage des pièces jointes, nécessaire ici
@@ -3645,13 +3649,16 @@
 
   // Modification des valeurs du planning
   $('#planning select').on("change",function() {
-    $(this).parent().parent().find('input').prop('checked',this.value == 0);
+    $(this).parent().parent().find('input').prop('checked',this.value == 0).change();
   });
   $('#planning input').on("change",function() {
     if ( this.checked )  {
-      $(this).parent().siblings().children('input').prop('checked',false);
+      $(this).parent().siblings().children('input').prop('checked',false).change();
       $(this).parent().siblings().children('select').val(0);
     }
+    // Modification du total
+    var d = $(this).attr('name').substr(0,1); // "c" ou "o"
+    $('#n'+d).html( $('input[name^="'+d+'"]:checked').length );
   });
   
   //////////////////////////////////////////////
diff -urN cahier-de-prepa12.0.0/js/edition.min.js cahier-de-prepa12.0.1/js/edition.min.js
--- cahier-de-prepa12.0.0/js/edition.min.js	2025-08-22 22:30:05.499116044 +0200
+++ cahier-de-prepa12.0.1/js/edition.min.js	2025-08-28 00:29:29.172011965 +0200
@@ -9,11 +9,11 @@
 `);s>0?(o=n.substring(s+1),n=n.substring(0,s)):(o=""),insert(e,'<ol type="'+$("[name='type']:checked").val()+'"'+t+"><li>"+n.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",o),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_ul(e){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(e)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',!0),$("#lignes").on("click keyup",function(){$("#apercu").html("<ul><li>"+($("#lignes").val().length?$("#lignes").val().trim(`
 `).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 s,t=$("#lignes").val().trim(`
 `),n=t.lastIndexOf(`
-`);n>0?(s=t.substring(n+1),t=t.substring(0,n)):(s=""),insert(e,"<ul><li>"+t.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",s),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_lien1(e){var t=marqueselection(e);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>`,!0),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)}),$.ajax({url:"recup.php",method:"post",data:{action:"docs"},dataType:"json"}).done(function(n){var s=function(){var t,o,e=$("#apercu"),n=$("#doc").val(),s=$("#doc option:selected").text();if(n==0)e.html(s);else if($("#vue").is(":checked"))if(t=$("#largeur").val(),s.slice(-4,-1)=="pdf"){if(e.children(".pdf").length==0?e.html('<div><object data="download?id='+n+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+n+'">'+s+"</a> </object></div>"):e.find("object").attr("data").substr(12)!=n&&e.find("object").attr("data","download?id="+n).html('<a href="download?id='+n+'">'+s+"</a>"),e.children().attr("class","pdf "+$("#format").val()),t)if(t==100)e.children().removeAttr("style").children().attr("width","100%").removeAttr("style");else{switch($("#format").val()){case"portrait":o=1.38;break;case"paysage":o=.74;break;case"hauteur50":o=.5;break}e.children().css("padding-bottom",o*t+"%"),e.find("object").attr("width",t+"%").css("left",(100-t)/2+"%")}}else"jpgpegpng".indexOf(s.slice(-4,-1))>-1&&(e.children("img").length==0?e.css("text-align","").html('<img src="download?id='+n+'">'):e.children().attr("src").substr(12)!=n&&e.children().attr("src","download?id="+n),t&&(t==100?e.children().removeAttr("style"):e.children().css("width",t+"%").css("margin-left",(100-t)/2+"%")));else $("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")},o=function(n){$("#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">'+n.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="'+t+'" 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(0),$("#texte").val().length&&$("#texte").data("auto",0),$("#doc").on("change keyup",function(e){e.which==13&&$("#fenetre a.icon-ok").click();var t=$("#doc option:selected").text();$("#texte").data("auto")==1&&$("#texte").val(this.value>0?t.substr(0,t.lastIndexOf("(")-1):"---"),"pdfjpgpegpng".indexOf(t.slice(-4,-1))>-1?$("#vue").change().parent().show(0):($("#vue, #largeur, #format").parent().hide(0),$("#vue").prop("checked",!1)),s()}),$("#texte").on("change keypress",function(e){if(e.which==0)return;e.which==13&&$("#fenetre a.icon-ok").click(),this.value.length==0?($(this).data("auto",1),$("#doc").change()):($(this).data("auto",0),s())}),$("#vue").on("change",function(){$("#vue").is(":checked")?$("#doc option:selected").text().slice(-4,-1)=="pdf"?($("#largeur, #format").parent().show(0),$("#texte").parent().hide(0)):"jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1&&($("#largeur").parent().show(0),$("#format, #texte").parent().hide(0)):($("#texte").parent().show(0),$("#largeur, #format").parent().hide(0)),s()}),$("#format").on("change keyup",function(e){e.which==13&&$("#fenetre a.icon-ok").click(),s()}),$("#largeur").on("keydown",function(e){e.which==38?++this.value:e.which==40&&--this.value}).on("change keyup",function(e){if(e.which==0)return;e.which==13&&$("#fenetre a.icon-ok").click(),this.value!=$(this).data("valeur")&&($(this).data("valeur",this.value),s())}).data("valeur",100),$("#rep").on("change",function(){$("#doc").html(n.docs[this.value]).change()}),$("#mat").on("change",function(){$("#rep").html(n.reps[this.value]).change()}).focus().change(),$("#fenetre a.icon-ok").on("click",function(){$("#doc").val()&&($("#vue").is(":checked")&&"pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1?insert(e,$("#apercu").html(),"",""):insert(e,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val()),$("#fenetre,#fenetre_fond").remove())}),$("#mat option").each(function(){$("body").data("matiere")==this.value&&$("#mat").val(this.value).change()})};"mats"in n&&o(n)})}function insertion_lien2(e){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(e)+'" 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>',!0),$("#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){e.which==13&&$("#fenetre a.icon-ok").click()}).first().keyup().focus(),$("#fenetre a.icon-ok").on("click",function(){insert(e,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val()),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_tex(e){var s=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>':"",t=marqueselection(e),n="t1";if(t.length)switch(t.substring(0,2)){case"\\[":case"$$":n="t2";case"\\(":t=t.substring(2,t.length-2);break;default:t=t.trim("$")}popup(s+`<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">`+t+`</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>`,!0),$("#"+n).prop("checked",!0),$("#formule").focus(),$("#fenetre a.icon-montre").on("click",function(){$("#formule").val().length?($("#apercu").html($("#t1").is(":checked")?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left"),MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])):$("#apercu").html("[Écrivez une formule]").css("text-align","center")}),$("#fenetre a.icon-ok").on("click",function(){$("#t1").is(":checked")?insert(e,"$","$",$("#formule").val()):insert(e,"\\[","\\]",$("#formule").val()),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_par1(e){insert(e,"<p>","</p>")}function insertion_par2(e){insert(e,"<div class='note'>","</div>")}function insertion_par3(e){insert(e,"<div class='annonce'>","</div>")}function insertion_retour(e){insert(e,"<br>","")}function insertion_gras(e){insert(e,"<strong>","</strong>")}function insertion_italique(e){insert(e,"<em>","</em>")}function insertion_souligne(e){insert(e,"<u>","</u>")}function insertion_exp(e){insert(e,"<sup>","</sup>")}function insertion_ind(e){insert(e,"<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>`,!1)}function echange(e,t){e.length&&t.length&&(op1=e.css("opacity"),op2=t.css("opacity"),$("article").css("position","relative"),e.css("opacity",.3),t.css("opacity",.3),t.animate({top:e.position().top-t.position().top},1e3),e.animate({top:(t.outerHeight(!0)+t.outerHeight())/2},1e3,function(){e.css("opacity",op1),t.css("opacity",op2),e.insertAfter(t),e.css({position:"static",top:0}),t.css({position:"static",top:0})}))}function cache(e){var t=e.parent(),n=t.data("action")||$("body").data("action");n=="reps"?confirmation("Vous allez cacher le répertoire <em>"+(e.siblings(".nom").text()||t.find("input").val())+`</em> ainsi que tout son contenu, sous-répertoires et documents qui s'y trouvent. Ils seront donc tous invisibles.<br>Ensuite, vous pourrez remettre chaque document visible individuellement à l'aide de l'icône <span class="icon-montre"></span> sur la ligne de chaque document ou globalement à l'aide de la même icône sur la ligne d'un répertoire.<br>Tous les éventuels affichages différés de documents seront supprimés.<br>Utiliser cette fonction revient au même que de régler la protection du répertoire sur «&nbsp;Répertoire invisible&nbsp;» à l'aide de l'icône <span class="icon-lock"></span> puis cocher «&nbsp;Propager ce choix d'accès&nbsp;».`,e,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"reps",id:t.data("id"),matiere:$("body").data("matiere"),cache:1},dataType:"json",el:t})}):$.ajax({url:"ajax.php",method:"post",data:{action:n,id:t.data("id"),matiere:$("body").data("matiere"),cache:1},dataType:"json",el:e,fonction:function(e){e.parent().addClass("cache"),e.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau"),e.parent("[data-protection]").data("protection",32),e.parent("[data-edition]").data("edition",0)}})}function montre(e){var t=e.parent(),n=t.data("action")||$("body").data("action");n=="reps"?confirmation("Vous allez montrer (rendre visible) le répertoire <em>"+(e.siblings(".nom").text()||t.find("input").val())+"</em> ainsi que tout son contenu, sous-répertoires et documents qui s'y trouvent. Ils seront donc tous visibles, avec la même protection que le répertoire affiché sur cette page.<br>Si des documents sont déjà visibles, leur protection sera modifiée. Si un affichage différé a été enregistré, le réglage sera conservé.",e,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"reps",id:t.data("id"),matiere:$("body").data("matiere"),montre:1},dataType:"json",el:t})}):$.ajax({url:"ajax.php",method:"post",data:{action:n,id:t.data("id"),matiere:$("body").data("matiere"),montre:1},dataType:"json",el:e,fonction:function(e){e.parent().removeClass("cache"),e.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau"),e.parent("[data-protection]").data("protection",$("body").data("protection")),e.parent("[data-edition]").data("edition",$("body").data("edition"))}})}function monte(e){$.ajax({url:"ajax.php",method:"post",data:{action:$("body").data("action"),id:e.parent().data("id"),matiere:$("body").data("matiere"),monte:1},dataType:"json",el:e.parent(),fonction:function(e){e.prev().prev().is("article")||(e.children(".icon-monte").hide(1e3),e.prev().children(".icon-monte").show(1e3)),e.next().is("article")||(e.children(".icon-descend").show(1e3),e.prev().children(".icon-descend").hide(1e3)),echange(e.prev(),e)}})}function descend(e){$.ajax({url:"ajax.php",method:"post",data:{action:$("body").data("action"),id:e.parent().data("id"),matiere:$("body").data("matiere"),descend:1},dataType:"json",el:e.parent(),fonction:function(e){e.prev().is("article")||(e.children(".icon-monte").show(1e3),e.next().children(".icon-monte").hide(1e3)),e.next().next().is("article")||(e.children(".icon-descend").hide(1e3),e.next().children(".icon-descend").show(1e3)),echange(e,e.next())}})}function supprime(e){var n="un élément",t=e.parent(),s=t.data("action")||$("body").data("action"),o=$("body").data("matiere");switch(s){case"infos":n="une information";break;case"pages":n="la page <em>"+t.find("h3").text()+"</em>. Les informations qui y sont écrites seront aussi supprimées";break;case"reps":n="le répertoire <em>"+t.find(".nom").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":n="le   document <em>"+t.find(".nom").map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>";break;case"progcolles":n="le programme de colles de la "+t.find(".edition").text().toLowerCase();break;case"cdt":n="un élément du cahier de texte";break;case"cdt-types":n="le type de séances <em>"+t.find("h3").text()+"</em>. <strong>Les éléments du cahier de texte associés à ce type seront aussi supprimés</strong>";break;case"cdt-raccourcis":n="le raccourci de séance <em>"+t.find("h3").text()+"</em>. Aucun élément du cahier de texte ne sera supprimé";break;case"notescolles":n="une colle du <em>"+t.parent().find("td").eq(0).text()+"</em>, d'une durée de "+t.parent().find("td").eq(3).text()+". Toutes les notes de cette colle seront supprimées";break;case"notescollesgestion":n="une colle effectuée le "+t.parent().find("td").eq(1).text()+" par "+t.parent().find("td").eq(0).text()+" d'une durée de "+t.parent().find("td").eq(4).text()+". Toutes les notes de cette colle seront supprimées";break;case"matieres":n="la matière <em>"+t.find("h3").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`,o=t.data("id");break;case"groupes":n="le groupe <em>"+(t.find(".editable").text()||t.find("input").first().val())+"</em>. Les utilisateurs concernés ne seront pas supprimés";break;case"agenda":n="un événement de l'agenda";break;case"agenda-types":n="le type d'événement <em>"+t.find("h3").text()+"</em>. <strong>Les événements de l'agenda associés à ce type seront aussi supprimés</strong>";break;case"transferts":n="le transfert de documents <em>"+t.children("h3").text()+"</em>. <strong>Tous les documents associés à ce transfert seront automatiquement supprimés</strong>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",n),e,function(){$.ajax({url:"ajax.php",method:"post",data:{action:s,id:t.data("id"),matiere:o,supprime:1},dataType:"json",el:t,fonction:function(e){s.substring(0,5)=="notes"?e.parent().remove():($("#transferts").find("td[data-id="+e.data("id")+"]").parent().remove(),e.remove())}})})}function comms(t){var n=t.parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"commentairescolles",id:n},dataType:"json",afficheform:function(n){var s=n.notes,o=n.comms,i=$("body").data("action")=="notescolles"?"<h3>Colle du "+t.parent().siblings()[0].innerText+"</h3>":"<h3>Colle du "+t.parent().siblings()[1].innerText+", de "+t.parent().siblings()[0].innerText+"</h3>";for(e in s)comm=e in o?decodeURIComponent(window.atob(o[e])):"Pas de commentaire",i+="<p><strong>"+$("#form-notes").find("[data-id="+e+"]").text()+"</strong> - "+s[e]+"<br>"+comm+"</p>";popup(i)}})}function ajoutecolle(e){var t,n=e.parent();e.before('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>').hide(0),t=$("<form></form>").appendTo(n).html($("#form-ajouteprogcolle").html()),$("input",t).attr("id",function(){return this.getAttribute("name")}),$("#dispo",t).each(function(){$("#dispo",t).val(e.parent().data("dispo")||"").datetimepicker({format:"d/m/Y Ghi",timepicker:!0,onShow:function(){this.setOptions({minDate:new Date})}}),$("#affdiff",t).prop("checked",!!e.parent().data("dispo")).on("click change",function(){$("#dispo",t).parent().toggle(this.checked)}).change()}),$("textarea",t).bloque().textareahtml(),$("input",t).bloque().entreevalide(t),$("#cache",t).on("click",function(){$("#affdiff",t).parent().toggle(!this.checked),this.checked&&$("#dispo",t).val("").parent().hide(0)}),$("#affdiff",t).on("click",function(){$("#cache",t).parent().toggle(!this.checked)}),$(".icon-annule",n).on("click",function(){$("form,.icon-annule,.icon-ok",n).remove(),n.children().show(0),$("a.icon-aide").off("click").on("click",function(){popup($("#aide-progcolles").html(),!1)})}),$("a.icon-aide").off("click").on("click",function(){popup($("#aide-ajoute").html(),!1)}),$("a.icon-ok",n).on("click",function(){$("textarea",t).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())}),$.ajax({url:"ajax.php",method:"post",data:t.serialize()+"&action=ajout-progcolle&id="+n.data("id")+"&matiere="+$("body").data("matiere"),dataType:"json",el:n})})}function valide(){var e="action="+$("body").data("action");$("body").data("matiere")>0&&(e+="&matiere="+$("body").data("matiere")),$(this).parent().data("id")&&(e+="&id="+$(this).parent().data("id")),$.ajax({url:"ajax.php",method:"post",data:e+"&"+($("body").data("action")=="planning"?$("form"):$(this).nextAll("form")).serialize(),dataType:"json",el:!1,fonction:Function.prototype}).done(function(e){if(e.etat=="confirm_mail"){var t=$('[data-id="mail"] form');$("p:not(.ligne)",t).remove(),t.prepend($('<p class="annonce"></p>').html(e.message)),$("#mail").attr("readonly",!0),$("p:hidden",t).show(0).children("input").attr("disabled",!1)}})}function formulaire(){var e,t=$(this),s=this.className.split(" ")[0].substring(5),n=$("#form-"+s).data("action")||$("body").data("action");switch($("#epingle").remove(),$('<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>').prependTo($("section")).append($("<form></form>").html($("#form-"+s).html())),e=$("#epingle").find("form"),$(".edithtml",e).textareahtml(),$("input[name], select[name]:not([multiple])",e).attr("id",function(){return this.getAttribute("name")}),t.parent().data("id")&&e.append('<input type="hidden" name="id" value="'+t.parent().data("id")+'">'),n){case"supprime-infos":t.init_supprimeinfos();break;case"infolock":t.init_lock(),n="infos";break;case"ajout-rep":case"reps":t.init_reps(n);break;case"docs":case"maj-doc":case"ajout-doc":t.init_docs(n);break;case"vide-rep":t.init_viderep();break;case"download-rep":t.init_downloadrep();break;case"cdt":e.init_cdt_boutons();break;case"ajout-cdt-raccourci":e.init_cdt_raccourcis();break;case"notescolles":case"ajout-notescolles":case"notescollesgestion":t.init_notes(n);break;case"ajout-agenda":t.init_evenements();break;case"agendalock":t.init_lock(),n="agenda";break;case"ajout-utilisateurs":e.init_ajout_utilisateurs();break;case"ajout-groupe":$(".usergrp span",e).on("click",utilisateursgroupe);break;case"transferts":case"ajout-transfert":t.init_transferts();break;case"voir-transdocs":case"ajout-transdocs":t.init_transdocs(n);break;case"pages":case"prefsmatiere":case"ajout-cdt-type":e.append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');break;case"ajout-page":t.init_page()}$("#couleur",e).each(function(){$(this).colpick()}),$("select[multiple]",e).init_selmult(t),$("#dispo",e).each(function(){$("#dispo",e).val(t.parent().data("dispo")||"").datetimepicker({format:"d/m/Y Ghi",timepicker:!0,onShow:function(){this.setOptions({minDate:new Date})}}),$("#affdiff",e).prop("checked",!!t.parent().data("dispo")).on("click change",function(){$("#dispo",e).parent().toggle(this.checked),$("#publi",e).parent().toggle($("#fichier",e).length&&$("#fichier",e)[0].files.length&&!this.checked)}).change(),$("#protection",e).next().on("change",function(){$("#protection",e).val()==32?$("#edition,#affdiff,#dispo",e).parent().hide(0):$("#edition,#affdiff",e).change().parent().show(0)})}),$("input,select",e).not(".nonbloque").bloque().entreevalide(e),$("textarea",e).bloque(),$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()}),$("#epingle a.icon-aide").on("click",function(){popup($("#aide-"+s).html(),!1)}),e.append('<input type="hidden" name="action" value="'+n+'">'),$("#epingle a.icon-ok").on("click",function(){$(".edithtml",e).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())}),(n=="notes"||n=="ajout-notes")&&$("#epingle select:not(:visible)").val("x"),$.ajax({url:"ajax.php",method:"post",data:e.serialize(),dataType:"json"})}),$("#epingle").deplace_viewport()}$.fn.init_selmult=function(e){return this.each(function(){var s,t=$(this),i=e??t,a=this.getAttribute("name").slice(0,-2),o=$("body").data("matiere")||i.parent().parent().parent().data("matiere"),n=0;if(a.indexOf("protection")+1?n=1:a.indexOf("edition")+1?n=2:a=="accestransfert"&&(n=3),$("<select id="+a+"><option selected hidden></option></select>").insertBefore(t.hide(0)),n){switch(n){case 1:s=i.parent().is("#icones")?$("body").data("protection"):i.parent().data("protection"),$("body").data("action")=="matieres"?(t.data("n",7).html('<option value="0">Accès public</option><option value="7">Accès aux utilisateurs identifiés</option><option value="1">Invités</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option><option value="5">Professeurs non associés à la matière</option><option value="6">Professeurs associés à la matière</option><option value="33">Fonction désactivée</option>'),s==32&&(s=-32)):t.data("n",5+!!o).html('<option value="0">Accès public</option><option value="7">Accès aux utilisateurs identifiés</option><option value="1">Invités</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option>'+(o?'<option value="5">Professeurs non associés à la matière</option>':"")+'<option value="32">'+$(this).data("val32")+"</option>");break;case 2:s=i.parent().is("#icones")?$("body").data("edition"):i.parent().data("edition"),t.data("n",4+!!o).html(o?'<option value="0">Édition par les professeurs de la matière uniquement</option><option value="7">Édition également possible par les utilisateurs</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option><option value="5">Professeurs non associés à la matière</option>':'<option value="0">Édition par les professeurs uniquement</option><option value="7">Édition également possible par les utilisateurs</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option>');break;case 3:t.data("n",3+!!o).html(o?'<option value="0">Professeurs de la matière uniquement</option><option value="7">Accès également aux utilisateurs</option><option value="2">Colleurs</option><option value="3">Lycée</option><option value="4">Professeurs non associés à la matière</option>':'<option value="0">Professeurs uniquement</option><option value="7">Accès également aux utilisateurs</option><option value="2">Colleurs</option><option value="3">Lycée</option>'),s=0}t.removeAttr("name").prev().attr("name",a),t.val(s==0||s>31?s:[7,6].concat([1,2,3,4,5].filter(function(e,t){return(s-1>>t&1)==n-1})))}r(t);function r(e){var s,o,i,t=e.prev().children().prop("selected",!1);if(n){switch(o=e.val(),o.length){case 0:t.text("Choisir ...");break;case 1:t.text($("option:selected",e).text());break;case e.data("n"):t.text("Tout utilisateur identifié");break;default:s=$("option:selected",e).filter(function(){return this.value<6}).map(function(){return this.textContent.split(" ")[0]}).get().join(", "),s.length||(s="Professeurs associés à la matière seulement"),n==3&&$("option[value=7]",e).prop("selected")&&(s="Professeurs, "+s+(s.indexOf("Professeurs")>0?" non associés":"")),t.text(s.replace(/,([^,]+)$/," et$1"))}o.length==1?t.val(o[0]):(i=o.reduce(function(e,t){return e+(t<6?Math.pow(2,t-1):0)},0),t.val(n==1?32-i:3-n+i))}else t.text(e.val().length?$("option:selected",e).map(function(){return this.textContent}).get().join(", ").replace(/,([^,]+)$/," et$1"):"Choisir ...");t.prop("selected",!0)}t.prev().attr("disabled",t.attr("disabled")).on("mousedown",function(e){e.preventDefault(),this.blur(),popup('<a class="icon-ok" title="Valider ce choix"></a><h3>'+t.prev().prev().text().replace(":","")+'</h3><table id="selmult">'+$("option",t).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>",!0);var s=$("#fenetre");n?($("input",s).filter(function(){return this.value==0||this.value>6}).parent().parent().addClass("categorie"),$("tr:not(.categorie)",s).addClass("element"),$("input[value=6]",s).prop("disabled",!0),$("input",s).on("click",function(){this.value==0||this.value>31?($(this).prop("checked",!0).parent().parent().siblings().find("input[type=checkbox]").prop("checked",!1).change(),$("input[value=6]",s).prop("disabled",!1)):($("input[value=0],input[value=32],input[value=33]",s).prop("checked",!1),$("input[value=6]",s).prop({disabled:!0,checked:!0}),$("input[value=7]",s).prop("checked",!0),this.value==7&&$("tr:not(.categorie) input",s).prop("checked",!0),$("input:checked",s).length==1&&$("input[value=32],input[value=33],input[value=0]:first",s).click(),$("input",s).change())})):($("#selmult",s).prepend('<tr class="categorie"><th></th><th><a class="icon-cocher"></a></th></tr>'),$(".icon-cocher",s).on("click",cocher_utilisateurs),$("input[value=0]",s).on("click",function(){this.checked&&$("input:checked",s).not("[value=0]").prop("checked",!1).change()}),$("input[value!=0]",s).on("click",function(){$("[value=0]",s).prop("checked",!1).change()})),$("tr",s).on("click",function(e){$(e.target).is("input")||$(this).find("input").click()}),$("input",s).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$(".icon-ok",s).on("click",function(){t.val($("input:checked",s).map(function(){return this.value}).get()),r(t),$("#fenetre, #fenetre_fond").remove(),t.change(),t.prev().focus()})})})},$.fn.init_supprimeinfos=function(){var t=$("#epingle form"),e=$("#epingle table");$("article:not(#epingle)").find("h3.titreinfos").each(function(){var t=$(this),n=t.parent().hasClass("cache")?' class="cache"':"";e.append("<tr"+n+"><td>"+(t.text()||"Information sans titre")+'</td><td class="icones"><input type="checkbox" name="infos[]" value="'+t.parent().data("id")+'"></td></tr>')}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$("#infoscachees",t).on("click",function(){$("tr.cache input",e).prop("checked",this.checked).change()}),$(".icon-cocher",t).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",t).prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()})},$.fn.init_lock=function(){var e=$("#epingle");$('input[type="button"]',e).on("click",function(){$("[multiple]",e).each(function(){$(this).attr("name",$(this).prev().remove().attr("name")+"[]").init_selmult($("#icones .icon-prefs"))})})},$.fn.init_reps=function(e){var s,t=$(this),n=$("#epingle form");e!="ajout-rep"&&(s=t.siblings(".nom").text()||t.parent().find("input").val()||t.parent().data("nom"),$("em",n).text(s),$("#nom",n).val(s),$("#menurep",n).prop("checked",t.parent().data("menu")),$('[data-parents*=",'+t.parent().data("id")+',"]',n).prop("disabled",!0)),$("#download",n).val(t.parent().data("zip"))},$.fn.init_docs=function(e){var n=$(this),t=$("#epingle form").addClass("formdoc"),s=n.siblings(".nom").text()||n.parent().find("input").val()||n.parent().data("nom");if($("em",t).text(s),$("#nom",t).val(s),e=="docs")return;e=="ajout-doc"&&$('input[type="file"]',t).attr("id","fichier").on("change",function(){s=this,$('input[id^="nom"]',t).parent().remove();for(var s,e=0,o=s.files.length,n="";e<o;e++)$(".ligne",t).last().after('<p class="ligne"><label for="nom'+e+'">Nom à afficher'+(o>1?" (fichier "+(e+1)+")":"")+'&nbsp;: </label><input type="text" name="nom[]" id="nom'+e+'" value="" size="50"></p>'),n=s.files[e].name,$("#nom"+e,t).val(n.substring(n.lastIndexOf("\\")+1,n.lastIndexOf("."))||n).entreevalide(t)}),$("#epingle a.icon-ok").removeClass("icon-ok").addClass("icon-envoidoc").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:function(){$("#log").hide(0);var n=new FormData(t[0]);$.ajax({url:"ajax.php",xhr:function(){var e,n,t=$.ajaxSettings.xhr();return t.upload&&$("#fichier")[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),n=$("#load p").css("background"),e=0,t.upload.addEventListener("progress",function(t){t.lengthComputable&&(e=Math.round(t.loaded/t.total*100),$("#load span").html(" - "+e+"%"),$("#load p").css("background",n.replace(/0%/g,e+"%")))},!1)),t},method:"post",data:n,dataType:"json",contentType:!1,processData:!1})}})})},$.fn.init_viderep=function(){var t=$("#epingle form"),e=$("#epingle table");$("section > p[data-id]").each(function(){var t=$(this),n=t.hasClass("nodispo")?' class="cache"':"";t.hasClass("rep")?e.append("<tr"+n+'><td><span class="icon-rep"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="reps[]" value="'+t.data("id")+'"></td></tr>'):e.append("<tr"+n+'><td><span class="icon-doc"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="docs[]" value="'+t.data("id")+'"></td></tr>')}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$("#docscaches",t).on("click",function(){$("tr.cache input",e).prop("checked",this.checked).change()}),$(".icon-cocher",t).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",t).prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()})},$.fn.init_downloadrep=function(){var t=$("#epingle form"),e=$("#epingle table"),n=$(".topbarre .icon-downloadrep").data("zip");$("p.zip"+n,t).siblings("p:not(.ligne)").hide(0),$("section > p[data-id]").each(function(){var t=$(this),s=t.data("zip")??n,o=s?s==1?"Les connectés":"Tous les visiteurs":"Personne sauf vous",i=t.hasClass("nodispo")?' class="cache"':"";t.hasClass("rep")?e.append("<tr"+i+'><td><span class="icon-rep"></span>&nbsp;'+t.find("span.nom").text()+"</td><td>"+o+'</td><td class="icones"><input type="checkbox" name="reps[]" value="'+t.data("id")+'"></td></tr>'):e.append("<tr"+i+'><td><span class="icon-doc"></span>&nbsp;'+t.find("span.nom").text()+"</td><td>"+o+'</td><td class="icones"><input type="checkbox" name="docs[]" value="'+t.data("id")+'"></td></tr>')}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked),this.checked&&$(this).parent().parent().hasClass("cache")&&$("#docscaches",t).prop("checked",!1)}),$("#docscaches",t).on("click",function(){this.checked?$("tr.cache input",e).prop("checked",!1).change().prop("disabled",!0):$("tr.cache input",e).prop("disabled",!1)}),$(".icon-cocher",e).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",e).not(":disabled").prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()}),$("#epingle .icon-ok").removeClass("icon-ok").addClass("icon-download").on("click",function(){var e=$("input:checked",t);if(e.length==0){affiche("<p>Aucune case n'est cochée.</p>","nok");return}$("body").data("async",!0),affiche("Récupération de la liste des documents","ok"),$.ajax({url:"recup.php",method:"post",data:"id="+$("#icones").data("id")+"&"+t.serialize(),dataType:"json",afficheform:async function(e){var t,n,s,i,a,r,c,o=e.dids.split(","),l=e.verifs.split(","),d=e.taille;if(o.length){$("#log").hide(0),$("#load").html('<p>Téléchargement en cours<span></span></p><img src="js/ajax-loader.gif">').show(0),i=[],a=0;try{for(r=$("#load p").css("background"),s=0,t=0;t<o.length;t++)i[t]=await fetch("download?zip&r="+$("#icones").data("id")+"&d="+o[t]+"&verif="+l[t]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:i,value:o}=await n.read(),t,n;if(i)break;t.push(o),a+=o.length,s=Math.min(100,Math.round(a/d*100)),$("#load span").html(" - "+s+"%"),$("#load p").css("background",r.replace(/0%/g,s+"%"))}if(e.headers.get("Content-Length")==="0")return;return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",r.replace(/0%/g,"100%")),c=await downloadZip(i).blob(),n=document.createElement("a"),n.href=URL.createObjectURL(c),n.download=e.nom+".zip",$("#load").fadeOut(),$("body").data("async",!1),n.click(),URL.revokeObjectURL(n.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}else affiche("Il n'y a rien à télécharger par ici.","nok"),$("#load").fadeOut(),$("body").data("async",!1)}})})},$.fn.init_cdt_boutons=function(){var t,e=this.append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');$("#jour,#pour",e).datetimepicker({format:"d/m/Y",timepicker:!1}),$("#h_debut",e).datetimepicker({format:"Ghi",datepicker:!1,onClose:function(t,n){$("#h_fin",e).val(function(e,t){return t||(n.val().length?parseInt(n.val().slice(0,-3))+2+n.val().slice(-3):"")})}}),$("#h_fin",e).datetimepicker({format:"Ghi",datepicker:!1}),t=function(e){return String(e).length==1?"0"+e:String(e)},$("#raccourci",e).on("change keyup",function(){if(this.value=="0")return;var n,o,i,s=raccourcis[this.value];for(i in s)i=="jour"?(n=new Date,o=parseInt(s.jour),n.setDate(o>n.getDay()?n.getDate()-n.getDay()-7+o:n.getDate()-n.getDay()+o),$("#jour",e).val(t(n.getDate())+"/"+t(n.getMonth()+1)+"/"+n.getFullYear())):$("#"+i,e).val(s[i]);$("textarea",e).val(s.template),$(this).data("modif",1),$("#tid",e).change()}).data("modif",0),$("#tid",e).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$("#h_debut,#demigroupe",e).parent().show(0),$("#h_fin,#pour",e).parent().hide(0);break;case 1:$("#h_debut,#h_fin,#demigroupe",e).parent().show(0),$("#pour",e).parent().hide(0);break;case 2:$("#h_debut,#h_fin",e).parent().hide(0),$("#pour,#demigroupe",e).parent().show(0);break;case 3:$("#h_debut,#h_fin,#pour",e).parent().hide(0),$("#demigroupe",e).parent().show(0);break;default:$("#h_debut,#h_fin,#pour,#demigroupe",e).parent().hide(0)}$("#jour",e).change()}),$("input,#demigroupe",e).on("change keyup",function(){$("#raccourci",e).data("modif")==0?$("#raccourci",e).val(0):$("#raccourci",e).data("modif",0)}),$("#cache",e).on("click",function(){$("#affdiff",e).parent().toggle(!this.checked),this.checked&&$("#dispo",e).val("").parent().hide(0)}),$("#affdiff",e).on("click",function(){$("#cache",e).parent().toggle(!this.checked)}),$("select:first",e).focus(),$("#tid",e).change()},$.fn.init_cdt_raccourcis=function(){this.each(function(){var e=$(this).append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');$('[id^="h_d"]',e).datetimepicker({format:"Ghi",datepicker:!1,onClose:function(t,n){$('[id^="h_f"]',e).val(function(e,t){return t||(n.val().length?parseInt(n.val().slice(0,-3))+2+n.val().slice(-3):"")})}}),$('[id^="h_fin"]').datetimepicker({format:"Ghi",datepicker:!1}),$('[id^="type"]',e).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$('[id^="h_d"],[id^="dem"]',e).parent().show(0),$('[id^="h_f"]',e).parent().hide(0);break;case 1:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',e).parent().show(0);break;case 2:case 3:$('[id^="h_d"],[id^="h_f"]',e).parent().hide(0),$('[id^="dem"]',e).parent().show(0);break;default:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',e).parent().hide(0)}}).change().bloque().prev().addBack().removeClass("nepassortir"),$("textarea",e).bloque().textareahtml()})},$.fn.init_notes=function(e){var n,i,c,l,d,h,o=$(this),t=$("#epingle form").append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">'),s=$("table",t).html($("#form-notes table").html());$('input[name="comms"]',s).attr("id","comms"),$("tr[data-id]",s).append("<td>"+$("#form-notes div").html()+"</td>"),$("select",s).attr("name",function(){return"e"+$(this).parent().parent().data("id")});function u(e,t,n){$(t).next().is(".comms")||$(t).after('<tr class="comms"><td colspan="2"><textarea name="c'+$(t).data("id")+'" placeholder="Ajouter un commentaire ici">'+(n??"")+"</textarea></td></tr>")}$("input:checkbox",s).length>1&&($("tr[data-id]",t).hide(0),$("input:checkbox",s).on("change",function(){$("input:checkbox",s).last().prop("checked")?$("tr[data-id]",t).show(0):($("tr[data-id]:not(.orig)",s).hide(0),$("input:checked",s).each(function(){this.value.split(",").forEach(function(e){$('tr[data-id="'+e+'"]',t).show(0)})})),$("#comms",t).is(":checked")&&($("tr[data-id]:not(:visible) + tr.comms",t).remove(),$("tr[data-id]:visible",t).not(".dejanote").each(u))})),$("tr td:first-child",s).on("click",function(){$(this).parent().find("input").click()});function a(e){return new Date(e.replace(/(.{2})\/(.{2})\/(.{4})/,function(e,t,n,s){return s+"-"+n+"-"+t}))}l=a($("#form-ajoute option").eq(1).data("date")),h=new Date(a($("#form-ajoute option").last().data("date")).getTime()+6*864e5);function r(e){var s,e=e??0,n=e==0?l:a($('#form-ajoute option[value="'+e+'"]').data("date")),o=e==0||e==$("#form-ajoute option").last().val()?h:new Date(a($('#form-ajoute option[value="'+e+'"]').next().data("date")).getTime()-864e5);$("#jour",t).datetimepicker({minDate:n,maxDate:o}),s=$("#jour").val()?a($("#jour").val()):new Date(l.getTime()-864e5),(s<n||s>o)&&(n=n.toJSON(),$("#jour").val(n.substr(8,2)+"/"+n.substr(5,2)+"/"+n.substr(0,4)))}function m(e){if(e==0)return!0;var n=!$("#form-ajoute option[value="+e+"]").data("oraux");dejanotesautres[e].split(",").forEach(function(e){$('tr[data-id="'+e+'"]',t).toggleClass("dejanote",n).find("td").first().text(function(){return this.textContent+" (noté(e) par un autre colleur)"})}),dejanotesperso[e].split(",").forEach(function(e){$('tr[data-id="'+e+'"]:not(.orig)',t).toggleClass("dejanote",n).find("td").first().text(function(){return this.textContent+" (déjà noté(e) par vous-même)"})}),$(".dejanote select").prop("disabled",!0).val("x")}switch($("#jour",t).datetimepicker({format:"d/m/Y",timepicker:!1}),$("#rattrapage",t).datetimepicker({format:"d/m/Y",timepicker:!1,minDate:l,maxDate:h}),$("#duree",t).datetimepicker({format:"Ghi",datepicker:!1,defaultTime:"0h00",step:10}).on("change",function(){$(this).removeClass("auto")}),$("select",s).on("change keyup",function(){if(typeof heurescolles!="undefined"){var e=$("table select:visible",t).filter(function(){return this.value!="x"}).length,n=heurescolles?60*Math.ceil(e*dureecolles/60):e*(dureecolles||20);$("#duree").val((n/60|0)+"h"+(n%60||""))}}),$("#comms",t).on("click",function(){this.checked?$("tr[data-id]:visible",t).not(".dejanote").each(u):$(".comms",t).remove()}),e){case"ajout-notescolles":{$("#description").parent().hide(0),$("#sid").on("change keyup",function(){$("td:first-child").text(function(){return this.textContent.replace(" (noté(e) par un autre colleur)","").replace(" (déjà noté(e) par vous-même)","")}),$(".dejanote").removeClass("dejanote").find("select").prop("disabled",!1),m($("#sid").val()),r($("#sid option:selected").val()||0)}).change(),$("#td",t).on("change keyup",function(){this.checked?($("h3",t).text("Ajouter une séance de TD sans note"),$("#sid",t).parent().hide(0),$("#jour",t).prev().text("Jour :"),$("#rattrapage",t).parent().hide(0),$("#description",t).parent().show(0),$("#duree",t).prop("readonly",!1).prev().text("Durée :"),s.hide(0),r()):($("h3",t).text("Ajouter des notes de colles"),$("#sid",t).parent().show(0),$("#jour",t).prev().text("Jour dans le colloscope :"),$("#rattrapage",t).parent().show(0),$("#description",t).parent().hide(0),$("#duree",t).prop("readonly",!0).prev().text("Durée (modifiée automatiquement) :"),s.show(0),r($("#sid option:selected").val()||0))});break}case"notescolles":{n=o.parent().parent(),$("#jour",t).val($("td",n).eq(0).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("td",n).eq(1).text().length>1&&$("#rattrapage",t).val($("td",n).eq(1).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("#duree",t).val($("td",n).eq(3).text().replace(/.*m/,function(e){return"0h"+e.slice(0,-1)})),o.data("sid")?($("#description",t).parent().remove(),i=o.data("sid"),r(i),c=o.data("eleves").toString().split("|"),d=o.data("notes").toString().split("|"),c.forEach(function(e,n){$('tr[data-id="'+e+'"]',t).addClass("orig").show(0).find("select").val(d[n]).on("change",function(){$(this).parent().parent().removeClass("orig")})}),$("#comms",t).parent().parent().addClass("orig"),n.find("u").length&&($("#comms",t).prop("checked",!0),$.ajax({url:"recup.php",method:"post",data:{action:"commentairescolles",id:o.parent().data("id")},dataType:"json",attente:"Récupération des commentaires",afficheform:function(e){var n=e.comms;c.forEach(function(e){$('tr[data-id="'+e+'"]',t).each(function(t,s){u(t,s,decodeURIComponent(window.atob(n[e]||"")))})})}})),$("h3",t).text("Modifier des notes - semaine du "+$('select[name="sid"] option[value="'+i+'"]').text().split(" ").slice(0,3).join(" ")),$("td",n).eq(4).text().length==1?m(i):($('tr:not(.orig), .orig option[value="x"]',s).remove(),t.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier quels élèves ont été interrogés. Vous pouvez corriger la date et l'heure (dans la limite de la semaine enregistrée) ou les notes ou commentaires que vous avez saisis. Vous pouvez aussi mettre une note à un élève initialement absent qui a rattrapé sa colle.</p>"))):(s.remove(),$("h3",t).text("Modifier une séance de TD sans note"),$("#jour",t).prev().text("Jour :"),$("#rattrapage",t).parent().remove(),$("#description",t).val($("td",n).eq(2).text()),$("td",n).eq(4).text().length==1?$("#duree",t).prop("readonly",!1).prev().text("Durée :"):t.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>"));break}case"notescollesgestion":n=o.parent().parent(),$("#colleur",t).val($("td",n).eq(0).text()),$("#jour",t).val($("td",n).eq(1).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("td",n).eq(2).text().length>1&&$("#rattrapage",t).val($("td",n).eq(2).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("#duree",t).val($("td",n).eq(4).text().replace(/.*m/,function(e){return"0h"+e.slice(0,-1)})),$("td",n).eq(5).text().length>1&&($("#duree",t).prop("disabled",!0),t.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier sa durée.</p>")),o.data("sid")?($("#description",t).parent().remove(),i=o.data("sid"),r(i),c=o.data("eleves").toString().split("|"),d=o.data("notes").toString().split("|"),c.forEach(function(e,n){$('tr[data-id="'+e+'"]',t).addClass("orig").show(0).find("select").val(d[n])}),$('tr:not(.orig), .orig option[value="x"]',s).remove()):(s.remove(),$("h3",t).text("Modifier une séance de TD sans note"),$("#jour",t).prev().text("Jour :"),$("#rattrapage",t).parent().remove(),$("#description",t).val($("td",n).eq(3).text()))}},$.fn.init_evenements=function(){var e=$("#epingle form");$("textarea",e).attr("id","texte"),$("#debut").datetimepicker({onShow:function(){this.setOptions({maxDate:$("#fin").val()||!1})},onClose:function(e,t){$("#fin").val(function(e,n){return n||t.val()}),$("#recur_fin").val(function(e,n){var s=t.val().substring(0,10),o=n||s;return s.substr(8,2)+s.substr(3,2)+s.substr(0,2)>o.substr(8,2)+o.substr(3,2)+o.substr(0,2)?s:o})}}),$("#fin").datetimepicker({onShow:function(){this.setOptions({minDate:$("#debut").val()||!1})},onClose:function(e,t){$("#debut").val(function(e,n){return n||t.val()})}}),$("#jours").on("change",function(){var e;this.checked?$("#debut,#fin").each(function(){e=this.value.split(" "),$(this).val(e[0]).attr("data-heure",e[1]).datetimepicker({format:"d/m/Y",timepicker:!1})}):$("#debut,#fin").each(function(){this.hasAttribute("data-heure")&&$(this).val(this.value+" "+$(this).attr("data-heure")).removeAttr("data-heure"),$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:!0})})}),$("#recur_fin",e).datetimepicker({format:"d/m/Y",timepicker:!1,onShow:function(){this.setOptions({minDate:$("#debut").val()||!1})}}),$("#recur",e).on("click change",function(){$("#recur_step, #recur_fin",e).parent().toggle(this.checked)}).change()},$.fn.init_ajout_utilisateurs=function(){var t,e=$("#epingle form");$(".affichesiinvite,.affichesiinvitation,.affichesimotdepasse",e).hide(0),$("#admin,#matieres,#saisie,#ordre",e).parent().hide(0),$("textarea",e).prop("disabled",!0).attr("placeholder",`Zone de saisie des utilisateurs
+`);n>0?(s=t.substring(n+1),t=t.substring(0,n)):(s=""),insert(e,"<ul><li>"+t.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",s),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_lien1(e){var t=marqueselection(e);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>`,!0),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)}),$.ajax({url:"recup.php",method:"post",data:{action:"docs"},dataType:"json"}).done(function(n){var s=function(){var t,o,e=$("#apercu"),n=$("#doc").val(),s=$("#doc option:selected").text();if(n==0)e.html(s);else if($("#vue").is(":checked"))if(t=$("#largeur").val(),s.slice(-4,-1)=="pdf"){if(e.children(".pdf").length==0?e.html('<div><object data="download?id='+n+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+n+'">'+s+"</a> </object></div>"):e.find("object").attr("data").substr(12)!=n&&e.find("object").attr("data","download?id="+n).html('<a href="download?id='+n+'">'+s+"</a>"),e.children().attr("class","pdf "+$("#format").val()),t)if(t==100)e.children().removeAttr("style").children().attr("width","100%").removeAttr("style");else{switch($("#format").val()){case"portrait":o=1.38;break;case"paysage":o=.74;break;case"hauteur50":o=.5;break}e.children().css("padding-bottom",o*t+"%"),e.find("object").attr("width",t+"%").css("left",(100-t)/2+"%")}}else"jpgpegpng".indexOf(s.slice(-4,-1))>-1&&(e.children("img").length==0?e.css("text-align","").html('<img src="download?id='+n+'">'):e.children().attr("src").substr(12)!=n&&e.children().attr("src","download?id="+n),t&&(t==100?e.children().removeAttr("style"):e.children().css("width",t+"%").css("margin-left",(100-t)/2+"%")));else $("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")},o=function(n){$("#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">'+n.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="'+t+'" 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(0),$("#texte").val().length&&$("#texte").data("auto",0),$("#doc").on("change keyup",function(e){e.which==13&&$("#fenetre a.icon-ok").click();var t=$("#doc option:selected").text();$("#texte").data("auto")==1&&$("#texte").val(this.value>0?t.substr(0,t.lastIndexOf("(")-1):"---"),"pdfjpgpegpng".indexOf(t.slice(-4,-1))>-1?$("#vue").change().parent().show(0):($("#vue, #largeur, #format").parent().hide(0),$("#vue").prop("checked",!1)),s()}),$("#texte").on("change keypress",function(e){if(e.which==0)return;e.which==13&&$("#fenetre a.icon-ok").click(),this.value.length==0?($(this).data("auto",1),$("#doc").change()):($(this).data("auto",0),s())}),$("#vue").on("change",function(){$("#vue").is(":checked")?$("#doc option:selected").text().slice(-4,-1)=="pdf"?($("#largeur, #format").parent().show(0),$("#texte").parent().hide(0)):"jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1&&($("#largeur").parent().show(0),$("#format, #texte").parent().hide(0)):($("#texte").parent().show(0),$("#largeur, #format").parent().hide(0)),s()}),$("#format").on("change keyup",function(e){e.which==13&&$("#fenetre a.icon-ok").click(),s()}),$("#largeur").on("keydown",function(e){e.which==38?++this.value:e.which==40&&--this.value}).on("change keyup",function(e){if(e.which==0)return;e.which==13&&$("#fenetre a.icon-ok").click(),this.value!=$(this).data("valeur")&&($(this).data("valeur",this.value),s())}).data("valeur",100),$("#rep").on("change",function(){$("#doc").html(n.docs[this.value]).change()}),$("#mat").on("change",function(){$("#rep").html(n.reps[this.value]).change()}).focus().change(),$("#fenetre a.icon-ok").on("click",function(){$("#doc").val()&&($("#vue").is(":checked")&&"pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1?insert(e,$("#apercu").html(),"",""):insert(e,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val()),$("#fenetre,#fenetre_fond").remove())}),$("#mat option").each(function(){$("body").data("matiere")==this.value&&$("#mat").val(this.value).change()})};"mats"in n&&o(n)})}function insertion_lien2(e){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(e)+'" 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>',!0),$("#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){e.which==13&&$("#fenetre a.icon-ok").click()}).first().keyup().focus(),$("#fenetre a.icon-ok").on("click",function(){insert(e,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val()),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_tex(e){var s=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>':"",t=marqueselection(e),n="t1";if(t.length)switch(t.substring(0,2)){case"\\[":case"$$":n="t2";case"\\(":t=t.substring(2,t.length-2);break;default:t=t.trim("$")}popup(s+`<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">`+t+`</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>`,!0),$("#"+n).prop("checked",!0),$("#formule").focus(),$("#fenetre a.icon-montre").on("click",function(){$("#formule").val().length?($("#apercu").html($("#t1").is(":checked")?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left"),MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])):$("#apercu").html("[Écrivez une formule]").css("text-align","center")}),$("#fenetre a.icon-ok").on("click",function(){$("#t1").is(":checked")?insert(e,"$","$",$("#formule").val()):insert(e,"\\[","\\]",$("#formule").val()),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(e,!0)})}function insertion_par1(e){insert(e,"<p>","</p>")}function insertion_par2(e){insert(e,"<div class='note'>","</div>")}function insertion_par3(e){insert(e,"<div class='annonce'>","</div>")}function insertion_retour(e){insert(e,"<br>","")}function insertion_gras(e){insert(e,"<strong>","</strong>")}function insertion_italique(e){insert(e,"<em>","</em>")}function insertion_souligne(e){insert(e,"<u>","</u>")}function insertion_exp(e){insert(e,"<sup>","</sup>")}function insertion_ind(e){insert(e,"<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>`,!1)}function echange(e,t){e.length&&t.length&&(op1=e.css("opacity"),op2=t.css("opacity"),$("article").css("position","relative"),e.css("opacity",.3),t.css("opacity",.3),t.animate({top:e.position().top-t.position().top},1e3),e.animate({top:(t.outerHeight(!0)+t.outerHeight())/2},1e3,function(){e.css("opacity",op1),t.css("opacity",op2),e.insertAfter(t),e.css({position:"static",top:0}),t.css({position:"static",top:0})}))}function cache(e){var t=e.parent(),n=t.data("action")||$("body").data("action");n=="reps"?confirmation("Vous allez cacher le répertoire <em>"+(e.siblings(".nom").text()||t.find("input").val())+`</em> ainsi que tout son contenu, sous-répertoires et documents qui s'y trouvent. Ils seront donc tous invisibles.<br>Ensuite, vous pourrez remettre chaque document visible individuellement à l'aide de l'icône <span class="icon-montre"></span> sur la ligne de chaque document ou globalement à l'aide de la même icône sur la ligne d'un répertoire.<br>Tous les éventuels affichages différés de documents seront supprimés.<br>Utiliser cette fonction revient au même que de régler la protection du répertoire sur «&nbsp;Répertoire invisible&nbsp;» à l'aide de l'icône <span class="icon-lock"></span> puis cocher «&nbsp;Propager ce choix d'accès&nbsp;».`,e,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"reps",id:t.data("id"),matiere:$("body").data("matiere"),cache:1},dataType:"json",el:t})}):$.ajax({url:"ajax.php",method:"post",data:{action:n,id:t.data("id"),matiere:$("body").data("matiere"),cache:1},dataType:"json",el:e,fonction:function(e){e.parent().addClass("cache"),e.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau"),e.parent("[data-protection]").data("protection",32),e.parent("[data-edition]").data("edition",0)}})}function montre(e){var t=e.parent(),n=t.data("action")||$("body").data("action");n=="reps"?confirmation("Vous allez montrer (rendre visible) le répertoire <em>"+(e.siblings(".nom").text()||t.find("input").val())+"</em> ainsi que tout son contenu, sous-répertoires et documents qui s'y trouvent. Ils seront donc tous visibles, avec la même protection que le répertoire affiché sur cette page.<br>Si des documents sont déjà visibles, leur protection sera modifiée. Si un affichage différé a été enregistré, le réglage sera conservé.",e,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"reps",id:t.data("id"),matiere:$("body").data("matiere"),montre:1},dataType:"json",el:t})}):$.ajax({url:"ajax.php",method:"post",data:{action:n,id:t.data("id"),matiere:$("body").data("matiere"),montre:1},dataType:"json",el:e,fonction:function(e){e.parent().removeClass("cache"),e.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau"),e.parent("[data-protection]").data("protection",$("body").data("protection")),e.parent("[data-edition]").data("edition",$("body").data("edition"))}})}function monte(e){$.ajax({url:"ajax.php",method:"post",data:{action:$("body").data("action"),id:e.parent().data("id"),matiere:$("body").data("matiere"),monte:1},dataType:"json",el:e.parent(),fonction:function(e){e.prev().prev().is("article")||(e.children(".icon-monte").hide(1e3),e.prev().children(".icon-monte").show(1e3)),e.next().is("article")||(e.children(".icon-descend").show(1e3),e.prev().children(".icon-descend").hide(1e3)),echange(e.prev(),e)}})}function descend(e){$.ajax({url:"ajax.php",method:"post",data:{action:$("body").data("action"),id:e.parent().data("id"),matiere:$("body").data("matiere"),descend:1},dataType:"json",el:e.parent(),fonction:function(e){e.prev().is("article")||(e.children(".icon-monte").show(1e3),e.next().children(".icon-monte").hide(1e3)),e.next().next().is("article")||(e.children(".icon-descend").hide(1e3),e.next().children(".icon-descend").show(1e3)),echange(e,e.next())}})}function supprime(e){var n="un élément",t=e.parent(),s=t.data("action")||$("body").data("action"),o=$("body").data("matiere");switch(s){case"infos":n="une information";break;case"pages":n="la page <em>"+t.find("h3").text()+"</em>. Les informations qui y sont écrites seront aussi supprimées";break;case"reps":n="le répertoire <em>"+t.find(".nom").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":n="le   document <em>"+t.find(".nom").map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>";break;case"progcolles":n="le programme de colles de la "+t.find(".edition").text().toLowerCase();break;case"cdt":n="un élément du cahier de texte";break;case"cdt-types":n="le type de séances <em>"+t.find("h3").text()+"</em>. <strong>Les éléments du cahier de texte associés à ce type seront aussi supprimés</strong>";break;case"cdt-raccourcis":n="le raccourci de séance <em>"+t.find("h3").text()+"</em>. Aucun élément du cahier de texte ne sera supprimé";break;case"notescolles":n="une colle du <em>"+t.parent().find("td").eq(0).text()+"</em>, d'une durée de "+t.parent().find("td").eq(3).text()+". Toutes les notes de cette colle seront supprimées";break;case"notescollesgestion":n="une colle effectuée le "+t.parent().find("td").eq(1).text()+" par "+t.parent().find("td").eq(0).text()+" d'une durée de "+t.parent().find("td").eq(4).text()+". Toutes les notes de cette colle seront supprimées";break;case"matieres":n="la matière <em>"+t.find("h3").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`,o=t.data("id");break;case"groupes":n="le groupe <em>"+(t.find(".editable").text()||t.find("input").first().val())+"</em>. Les utilisateurs concernés ne seront pas supprimés";break;case"agenda":n="un événement de l'agenda";break;case"agenda-types":n="le type d'événement <em>"+t.find("h3").text()+"</em>. <strong>Les événements de l'agenda associés à ce type seront aussi supprimés</strong>";break;case"transferts":n="le transfert de documents <em>"+t.children("h3").text()+"</em>. <strong>Tous les documents associés à ce transfert seront automatiquement supprimés</strong>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",n),e,function(){$.ajax({url:"ajax.php",method:"post",data:{action:s,id:t.data("id"),matiere:o,supprime:1},dataType:"json",el:t,fonction:function(e){s.substring(0,5)=="notes"?e.parent().remove():($("#transferts").find("td[data-id="+e.data("id")+"]").parent().remove(),e.remove())}})})}function comms(t){var n=t.parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"commentairescolles",id:n},dataType:"json",afficheform:function(n){var s=n.notes,o=n.comms,i=$("body").data("action")=="notescolles"?"<h3>Colle du "+t.parent().siblings()[0].innerText+"</h3>":"<h3>Colle du "+t.parent().siblings()[1].innerText+", de "+t.parent().siblings()[0].innerText+"</h3>";for(e in s)comm=e in o?decodeURIComponent(window.atob(o[e])):"Pas de commentaire",i+="<p><strong>"+$("#form-notes").find("[data-id="+e+"]").text()+"</strong> - "+s[e]+"<br>"+comm+"</p>";popup(i)}})}function ajoutecolle(e){var t,n=e.parent();e.before('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>').hide(0),t=$("<form></form>").appendTo(n).html($("#form-ajouteprogcolle").html()),$("input",t).attr("id",function(){return this.getAttribute("name")}),$("#dispo",t).each(function(){$("#dispo",t).val(e.parent().data("dispo")||"").datetimepicker({format:"d/m/Y Ghi",timepicker:!0,onShow:function(){this.setOptions({minDate:new Date})}}),$("#affdiff",t).prop("checked",!!e.parent().data("dispo")).on("click change",function(){$("#dispo",t).parent().toggle(this.checked)}).change()}),$("textarea",t).bloque().textareahtml(),$("input",t).bloque().entreevalide(t),$("#cache",t).on("click",function(){$("#affdiff",t).parent().toggle(!this.checked),this.checked&&$("#dispo",t).val("").parent().hide(0)}),$("#affdiff",t).on("click",function(){$("#cache",t).parent().toggle(!this.checked)}),$(".icon-annule",n).on("click",function(){$("form,.icon-annule,.icon-ok",n).remove(),n.children().show(0),$("a.icon-aide").off("click").on("click",function(){popup($("#aide-progcolles").html(),!1)})}),$("a.icon-aide").off("click").on("click",function(){popup($("#aide-ajoute").html(),!1)}),$("a.icon-ok",n).on("click",function(){$("textarea",t).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())}),$.ajax({url:"ajax.php",method:"post",data:t.serialize()+"&action=ajout-progcolle&id="+n.data("id")+"&matiere="+$("body").data("matiere"),dataType:"json",el:n})})}function valide(){var e="action="+$("body").data("action");$("body").data("matiere")>0&&(e+="&matiere="+$("body").data("matiere")),$(this).parent().data("id")&&(e+="&id="+$(this).parent().data("id")),$.ajax({url:"ajax.php",method:"post",data:e+"&"+($("body").data("action")=="planning"?$("form"):$(this).nextAll("form")).serialize(),dataType:"json",el:!1,fonction:Function.prototype}).done(function(e){if(e.etat=="confirm_mail"){var t=$('[data-id="mail"] form');$("p:not(.ligne)",t).remove(),t.prepend($('<p class="annonce"></p>').html(e.message)),$("#mail").attr("readonly",!0),$("p:hidden",t).show(0).children("input").attr("disabled",!1)}})}function formulaire(){var e,t=$(this),s=this.className.split(" ")[0].substring(5),n=$("#form-"+s).data("action")||$("body").data("action");switch($("#epingle").remove(),$('<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>').prependTo($("section")).append($("<form></form>").html($("#form-"+s).html())),e=$("#epingle").find("form"),$(".edithtml",e).textareahtml(),$("input[name], select[name]:not([multiple])",e).attr("id",function(){return this.getAttribute("name")}),t.parent().data("id")&&e.append('<input type="hidden" name="id" value="'+t.parent().data("id")+'">'),n){case"supprime-infos":t.init_supprimeinfos();break;case"infolock":t.init_lock(),n="infos";break;case"ajout-rep":case"reps":t.init_reps(n);break;case"docs":case"maj-doc":case"ajout-doc":t.init_docs(n);break;case"vide-rep":t.init_viderep();break;case"download-rep":t.init_downloadrep();break;case"cdt":e.init_cdt_boutons();break;case"ajout-cdt-raccourci":e.init_cdt_raccourcis();break;case"notescolles":case"ajout-notescolles":case"notescollesgestion":t.init_notes(n);break;case"ajout-agenda":t.init_evenements();break;case"agendalock":t.init_lock(),n="agenda";break;case"ajout-utilisateurs":e.init_ajout_utilisateurs();break;case"ajout-groupe":$(".usergrp span",e).on("click",utilisateursgroupe);break;case"transferts":case"ajout-transfert":t.init_transferts();break;case"voir-transdocs":case"ajout-transdocs":t.init_transdocs(n);break;case"pages":case"prefsmatiere":case"ajout-cdt-type":e.append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');break;case"ajout-page":t.init_page()}$("#couleur",e).each(function(){$(this).colpick()}),$("select[multiple]",e).init_selmult(t),$("#dispo",e).each(function(){$("#dispo",e).val(t.parent().data("dispo")||"").datetimepicker({format:"d/m/Y Ghi",timepicker:!0,onShow:function(){this.setOptions({minDate:new Date})}}),$("#affdiff",e).prop("checked",!!t.parent().data("dispo")).on("click change",function(){$("#dispo",e).parent().toggle(this.checked),$("#publi",e).parent().toggle($("#fichier",e).length&&$("#fichier",e)[0].files.length&&!this.checked)}).change(),$("#protection",e).next().on("change",function(){$("#protection",e).val()==32?$("#edition,#affdiff,#dispo",e).parent().hide(0):$("#edition,#affdiff",e).change().parent().show(0)})}),$("input,select",e).not(".nonbloque").bloque().entreevalide(e),$("textarea",e).bloque(),$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()}),$("#epingle a.icon-aide").on("click",function(){popup($("#aide-"+s).html(),!1)}),e.append('<input type="hidden" name="action" value="'+n+'">'),$("#epingle a.icon-ok").on("click",function(){$(".edithtml",e).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())}),(n=="notes"||n=="ajout-notes")&&$("#epingle select:not(:visible)").val("x"),$.ajax({url:"ajax.php",method:"post",data:e.serialize(),dataType:"json"})}),$("#epingle").deplace_viewport()}$.fn.init_selmult=function(e){return this.each(function(){var s,t=$(this),i=e??t,a=this.getAttribute("name").slice(0,-2),o=$("body").data("matiere")||i.parent().parent().parent().data("matiere"),n=0;if(a.indexOf("protection")+1?n=1:a.indexOf("edition")+1?n=2:a=="accestransfert"&&(n=3),$("<select id="+a+"><option selected hidden></option></select>").insertBefore(t.hide(0)),n){switch(n){case 1:s=i.parent().is("#icones")?$("body").data("protection"):i.parent().data("protection"),$("body").data("action")=="matieres"?(t.data("n",7).html('<option value="0">Accès public</option><option value="7">Accès aux utilisateurs identifiés</option><option value="1">Invités</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option><option value="5">Professeurs non associés à la matière</option><option value="6">Professeurs associés à la matière</option><option value="33">Fonction désactivée</option>'),s==32&&(s=-32)):t.data("n",5+!!o).html('<option value="0">Accès public</option><option value="7">Accès aux utilisateurs identifiés</option><option value="1">Invités</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option>'+(o?'<option value="5">Professeurs non associés à la matière</option>':"")+'<option value="32">'+$(this).data("val32")+"</option>");break;case 2:s=i.parent().is("#icones")?$("body").data("edition"):i.parent().data("edition"),t.data("n",4+!!o).html(o?'<option value="0">Édition par les professeurs de la matière uniquement</option><option value="7">Édition également possible par les utilisateurs</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option><option value="5">Professeurs non associés à la matière</option>':'<option value="0">Édition par les professeurs uniquement</option><option value="7">Édition également possible par les utilisateurs</option><option value="2">Élèves</option><option value="3">Colleurs</option><option value="4">Lycée</option>');break;case 3:t.data("n",3+!!o).html(o?'<option value="0">Professeurs de la matière uniquement</option><option value="7">Accès également aux utilisateurs</option><option value="2">Colleurs</option><option value="3">Lycée</option><option value="4">Professeurs non associés à la matière</option>':'<option value="0">Professeurs uniquement</option><option value="7">Accès également aux utilisateurs</option><option value="2">Colleurs</option><option value="3">Lycée</option>'),s=0}t.removeAttr("name").prev().attr("name",a),t.val(s==0||s>31?s:[7,6].concat([1,2,3,4,5].filter(function(e,t){return(s-1>>t&1)==n-1})))}r(t);function r(e){var s,o,i,t=e.prev().children().prop("selected",!1);if(n){switch(o=e.val(),o.length){case 0:t.text("Choisir ...");break;case 1:t.text($("option:selected",e).text());break;case e.data("n"):t.text("Tout utilisateur identifié");break;default:s=$("option:selected",e).filter(function(){return this.value<6}).map(function(){return this.textContent.split(" ")[0]}).get().join(", "),s.length||(s="Professeurs associés à la matière seulement"),n==3&&$("option[value=7]",e).prop("selected")&&(s="Professeurs, "+s+(s.indexOf("Professeurs")>0?" non associés":"")),t.text(s.replace(/,([^,]+)$/," et$1"))}o.length==1?t.val(o[0]):(i=o.reduce(function(e,t){return e+(t<6?Math.pow(2,t-1):0)},0),t.val(n==1?32-i:3-n+i))}else t.text(e.val().length?$("option:selected",e).map(function(){return this.textContent}).get().join(", ").replace(/,([^,]+)$/," et$1"):"Choisir ...");t.prop("selected",!0)}t.prev().attr("disabled",t.attr("disabled")).on("mousedown",function(e){e.preventDefault(),this.blur(),popup('<a class="icon-ok" title="Valider ce choix"></a><h3>'+t.prev().prev().text().replace(":","")+'</h3><table id="selmult">'+$("option",t).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>",!0);var s=$("#fenetre");n?($("input",s).filter(function(){return this.value==0||this.value>6}).parent().parent().addClass("categorie"),$("tr:not(.categorie)",s).addClass("element"),$("input[value=6]",s).prop("disabled",!0),$("input",s).on("click",function(){this.value==0||this.value>31?($(this).prop("checked",!0).parent().parent().siblings().find("input[type=checkbox]").prop("checked",!1).change(),$("input[value=6]",s).prop("disabled",!1)):($("input[value=0],input[value=32],input[value=33]",s).prop("checked",!1),$("input[value=6]",s).prop({disabled:!0,checked:!0}),$("input[value=7]",s).prop("checked",!0),this.value==7&&$("tr:not(.categorie) input",s).prop("checked",!0),$("input:checked",s).length==1&&$("input[value=32],input[value=33],input[value=0]:first",s).click(),$("input",s).change())})):($("#selmult",s).prepend('<tr class="categorie"><th></th><th><a class="icon-cocher"></a></th></tr>'),$(".icon-cocher",s).on("click",cocher_utilisateurs),$("input[value=0]",s).on("click",function(){this.checked&&$("input:checked",s).not("[value=0]").prop("checked",!1).change()}),$("input[value!=0]",s).on("click",function(){$("[value=0]",s).prop("checked",!1).change()})),$("tr",s).on("click",function(e){$(e.target).is("input")||$(this).find("input").click()}),$("input",s).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$(".icon-ok",s).on("click",function(){t.val($("input:checked",s).map(function(){return this.value}).get()),r(t),$("#fenetre, #fenetre_fond").remove(),t.change(),t.prev().focus()})})})},$.fn.init_supprimeinfos=function(){var t=$("#epingle form"),e=$("#epingle table");$("article:not(#epingle)").find("h3.titreinfos").each(function(){var t=$(this),n=t.parent().hasClass("cache")?' class="cache"':"";e.append("<tr"+n+"><td>"+(t.text()||"Information sans titre")+'</td><td class="icones"><input type="checkbox" name="infos[]" value="'+t.parent().data("id")+'"></td></tr>')}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$("#infoscachees",t).on("click",function(){$("tr.cache input",e).prop("checked",this.checked).change()}),$(".icon-cocher",t).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",t).prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()})},$.fn.init_lock=function(){var e=$("#epingle");$('input[type="button"]',e).on("click",function(){$("[multiple]",e).each(function(){$(this).attr("name",$(this).prev().remove().attr("name")+"[]").init_selmult($("#icones .icon-prefs"))})})},$.fn.init_reps=function(e){var s,t=$(this),n=$("#epingle form");e!="ajout-rep"&&(s=t.siblings(".nom").text()||t.parent().find("input").val()||t.parent().data("nom"),$("em",n).text(s),$("#nom",n).val(s),$("#menurep",n).prop("checked",t.parent().data("menu")),$('[data-parents*=",'+t.parent().data("id")+',"]',n).prop("disabled",!0)),$("#download",n).val(t.parent().data("zip"))},$.fn.init_docs=function(e){var n=$(this),t=$("#epingle form").addClass("formdoc"),s=n.siblings(".nom").text()||n.parent().find("input").val()||n.parent().data("nom");if($("em",t).text(s),$("#nom",t).val(s),e=="docs")return;e=="ajout-doc"&&$('input[type="file"]',t).attr("id","fichier").on("change",function(){s=this,$('input[id^="nom"]',t).parent().remove();for(var s,e=0,o=s.files.length,n="";e<o;e++)$(".ligne",t).last().after('<p class="ligne"><label for="nom'+e+'">Nom à afficher'+(o>1?" (fichier "+(e+1)+")":"")+'&nbsp;: </label><input type="text" name="nom[]" id="nom'+e+'" value="" size="50"></p>'),n=s.files[e].name,$("#nom"+e,t).val(n.substring(n.lastIndexOf("\\")+1,n.lastIndexOf("."))||n).entreevalide(t)}),$("#epingle a.icon-ok").removeClass("icon-ok").addClass("icon-envoidoc").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:function(){$("#log").hide(0);var n=new FormData(t[0]);$.ajax({url:"ajax.php",xhr:function(){var e,n,t=$.ajaxSettings.xhr();return t.upload&&$("#fichier")[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),n=$("#load p").css("background"),e=0,t.upload.addEventListener("progress",function(t){t.lengthComputable&&(e=Math.round(t.loaded/t.total*100),$("#load span").html(" - "+e+"%"),$("#load p").css("background",n.replace(/0%/g,e+"%")))},!1)),t},method:"post",data:n,dataType:"json",contentType:!1,processData:!1})}})})},$.fn.init_viderep=function(){var t=$("#epingle form"),e=$("#epingle table");$("section > p[data-id]").each(function(){var t=$(this),n=t.hasClass("nodispo")?' class="cache"':"";t.hasClass("rep")?e.append("<tr"+n+'><td><span class="icon-rep"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="reps[]" value="'+t.data("id")+'"></td></tr>'):e.append("<tr"+n+'><td><span class="icon-doc"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="docs[]" value="'+t.data("id")+'"></td></tr>')}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$("#docscaches",t).on("click",function(){$("tr.cache input",e).prop("checked",this.checked).change()}),$(".icon-cocher",t).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",t).prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()})},$.fn.init_downloadrep=function(){var t=$("#epingle form"),e=$("#epingle table"),n=$(".topbarre .icon-downloadrep").data("zip");$("p.zip"+n,t).siblings("p:not(.ligne)").hide(0),$("section > p[data-id]").each(function(){var t=$(this),s=t.data("zip")??n,o=s?s==1?"Les connectés":"Tous les visiteurs":"Personne sauf vous",i=t.hasClass("nodispo")?' class="cache"':"";t.hasClass("rep")?e.append("<tr"+i+'><td><span class="icon-rep"></span>&nbsp;'+t.find("span.nom").text()+"</td><td>"+o+'</td><td class="icones"><input type="checkbox" name="reps[]" value="'+t.data("id")+'"></td></tr>'):e.append("<tr"+i+'><td><span class="icon-doc"></span>&nbsp;'+t.find("span.nom").text()+"</td><td>"+o+'</td><td class="icones"><input type="checkbox" name="docs[]" value="'+t.data("id")+'"></td></tr>')}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked),this.checked&&$(this).parent().parent().hasClass("cache")&&$("#docscaches",t).prop("checked",!1)}),$("#docscaches",t).on("click",function(){this.checked?$("tr.cache input",e).prop("checked",!1).change().prop("disabled",!0):$("tr.cache input",e).prop("disabled",!1)}),$(".icon-cocher",e).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",e).not(":disabled").prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()}),$("#epingle .icon-ok").removeClass("icon-ok").addClass("icon-download").on("click",function(){if($("input:checked",e).length==0){affiche("<p>Aucune case n'est cochée.</p>","nok");return}$("body").data("async",!0),affiche("Récupération de la liste des documents","ok"),$.ajax({url:"recup.php",method:"post",data:"id="+$("#icones").data("id")+"&"+t.serialize(),dataType:"json",afficheform:async function(e){var t,n,s,i,a,r,c,o=e.dids.split(","),l=e.verifs.split(","),d=e.taille;if(o.length){$("#log").hide(0),$("#load").html('<p>Téléchargement en cours<span></span></p><img src="js/ajax-loader.gif">').show(0),i=[],a=0;try{for(r=$("#load p").css("background"),s=0,t=0;t<o.length;t++)i[t]=await fetch("download?zip&r="+$("#icones").data("id")+"&d="+o[t]+"&verif="+l[t]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:i,value:o}=await n.read(),t,n;if(i)break;t.push(o),a+=o.length,s=Math.min(100,Math.round(a/d*100)),$("#load span").html(" - "+s+"%"),$("#load p").css("background",r.replace(/0%/g,s+"%"))}if(e.headers.get("Content-Length")==="0")return;return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",r.replace(/0%/g,"100%")),c=await downloadZip(i).blob(),n=document.createElement("a"),n.href=URL.createObjectURL(c),n.download=e.nom+".zip",$("#load").fadeOut(),$("body").data("async",!1),n.click(),URL.revokeObjectURL(n.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}else affiche("Il n'y a rien à télécharger par ici.","nok"),$("#load").fadeOut(),$("body").data("async",!1)}})})},$.fn.init_cdt_boutons=function(){var t,e=this.append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');$("#jour,#pour",e).datetimepicker({format:"d/m/Y",timepicker:!1}),$("#h_debut",e).datetimepicker({format:"Ghi",datepicker:!1,onClose:function(t,n){$("#h_fin",e).val(function(e,t){return t||(n.val().length?parseInt(n.val().slice(0,-3))+2+n.val().slice(-3):"")})}}),$("#h_fin",e).datetimepicker({format:"Ghi",datepicker:!1}),t=function(e){return String(e).length==1?"0"+e:String(e)},$("#raccourci",e).on("change keyup",function(){if(this.value=="0")return;var n,o,i,s=raccourcis[this.value];for(i in s)i=="jour"?(n=new Date,o=parseInt(s.jour),o%7!=n.getDay()&&n.setDate(n.getDate()-n.getDay()+o-(o%7<n.getDay()?0:7)),$("#jour",e).val(t(n.getDate())+"/"+t(n.getMonth()+1)+"/"+n.getFullYear())):$("#"+i,e).val(s[i]);$("textarea",e).val(s.template),$(this).data("modif",1),$("#tid",e).change()}).data("modif",0),$("#tid",e).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$("#h_debut,#demigroupe",e).parent().show(0),$("#h_fin,#pour",e).parent().hide(0);break;case 1:$("#h_debut,#h_fin,#demigroupe",e).parent().show(0),$("#pour",e).parent().hide(0);break;case 2:$("#h_debut,#h_fin",e).parent().hide(0),$("#pour,#demigroupe",e).parent().show(0);break;case 3:$("#h_debut,#h_fin,#pour",e).parent().hide(0),$("#demigroupe",e).parent().show(0);break;default:$("#h_debut,#h_fin,#pour,#demigroupe",e).parent().hide(0)}$("#jour",e).change()}),$("input,#demigroupe",e).on("change keyup",function(){$("#raccourci",e).data("modif")==0?$("#raccourci",e).val(0):$("#raccourci",e).data("modif",0)}),$("#cache",e).on("click",function(){$("#affdiff",e).parent().toggle(!this.checked),this.checked&&$("#dispo",e).val("").parent().hide(0)}),$("#affdiff",e).on("click",function(){$("#cache",e).parent().toggle(!this.checked)}),$("select:first",e).focus(),$("#tid",e).change()},$.fn.init_cdt_raccourcis=function(){this.each(function(){var e=$(this).append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');$('[id^="h_d"]',e).datetimepicker({format:"Ghi",datepicker:!1,onClose:function(t,n){$('[id^="h_f"]',e).val(function(e,t){return t||(n.val().length?parseInt(n.val().slice(0,-3))+2+n.val().slice(-3):"")})}}),$('[id^="h_fin"]').datetimepicker({format:"Ghi",datepicker:!1}),$('[id^="type"]',e).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$('[id^="h_d"],[id^="dem"]',e).parent().show(0),$('[id^="h_f"]',e).parent().hide(0);break;case 1:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',e).parent().show(0);break;case 2:case 3:$('[id^="h_d"],[id^="h_f"]',e).parent().hide(0),$('[id^="dem"]',e).parent().show(0);break;default:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',e).parent().hide(0)}}).change().bloque().prev().addBack().removeClass("nepassortir"),$("textarea",e).bloque().textareahtml()})},$.fn.init_notes=function(e){var n,i,c,l,d,h,o=$(this),t=$("#epingle form").append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">'),s=$("table",t).html($("#form-notes table").html());$('input[name="comms"]',s).attr("id","comms"),$("tr[data-id]",s).append("<td>"+$("#form-notes div").html()+"</td>"),$("select",s).attr("name",function(){return"e"+$(this).parent().parent().data("id")});function u(e,t,n){$(t).next().is(".comms")||$(t).after('<tr class="comms"><td colspan="2"><textarea name="c'+$(t).data("id")+'" placeholder="Ajouter un commentaire ici">'+(n??"")+"</textarea></td></tr>")}$("input:checkbox",s).length>1&&($("tr[data-id]",t).hide(0),$("input:checkbox",s).on("change",function(){$("input:checkbox",s).last().prop("checked")?$("tr[data-id]",t).show(0):($("tr[data-id]:not(.orig)",s).hide(0),$("input:checked",s).each(function(){this.value.split(",").forEach(function(e){$('tr[data-id="'+e+'"]',t).show(0)})})),$("#comms",t).is(":checked")&&($("tr[data-id]:not(:visible) + tr.comms",t).remove(),$("tr[data-id]:visible",t).not(".dejanote").each(u))})),$("tr td:first-child",s).on("click",function(){$(this).parent().find("input").click()});function a(e){return new Date(e.replace(/(.{2})\/(.{2})\/(.{4})/,function(e,t,n,s){return s+"-"+n+"-"+t}))}l=a($("#form-ajoute option").eq(1).data("date")),h=new Date(a($("#form-ajoute option").last().data("date")).getTime()+6*864e5);function r(e){var s,e=e??0,n=e==0?l:a($('#form-ajoute option[value="'+e+'"]').data("date")),o=e==0||e==$("#form-ajoute option").last().val()?h:new Date(a($('#form-ajoute option[value="'+e+'"]').next().data("date")).getTime()-864e5);$("#jour",t).datetimepicker({minDate:n,maxDate:o}),s=$("#jour").val()?a($("#jour").val()):new Date(l.getTime()-864e5),(s<n||s>o)&&(n=n.toJSON(),$("#jour").val(n.substr(8,2)+"/"+n.substr(5,2)+"/"+n.substr(0,4)))}function m(e){if(e==0)return!0;var n=!$("#form-ajoute option[value="+e+"]").data("oraux");dejanotesautres[e].split(",").forEach(function(e){$('tr[data-id="'+e+'"]',t).toggleClass("dejanote",n).find("td").first().text(function(){return this.textContent+" (noté(e) par un autre colleur)"})}),dejanotesperso[e].split(",").forEach(function(e){$('tr[data-id="'+e+'"]:not(.orig)',t).toggleClass("dejanote",n).find("td").first().text(function(){return this.textContent+" (déjà noté(e) par vous-même)"})}),$(".dejanote select").prop("disabled",!0).val("x")}switch($("#jour",t).datetimepicker({format:"d/m/Y",timepicker:!1}),$("#rattrapage",t).datetimepicker({format:"d/m/Y",timepicker:!1,minDate:l,maxDate:h}),$("#duree",t).datetimepicker({format:"Ghi",datepicker:!1,defaultTime:"0h00",step:10}).on("change",function(){$(this).removeClass("auto")}),$("select",s).on("change keyup",function(){if(typeof heurescolles!="undefined"){var e=$("table select:visible",t).filter(function(){return this.value!="x"}).length,n=heurescolles?60*Math.ceil(e*dureecolles/60):e*(dureecolles||20);$("#duree").val((n/60|0)+"h"+(n%60||""))}}),$("#comms",t).on("click",function(){this.checked?$("tr[data-id]:visible",t).not(".dejanote").each(u):$(".comms",t).remove()}),e){case"ajout-notescolles":{$("#description").parent().hide(0),$("#sid").on("change keyup",function(){$("td:first-child").text(function(){return this.textContent.replace(" (noté(e) par un autre colleur)","").replace(" (déjà noté(e) par vous-même)","")}),$(".dejanote").removeClass("dejanote").find("select").prop("disabled",!1),m($("#sid").val()),r($("#sid option:selected").val()||0)}).change(),$("#td",t).on("change keyup",function(){this.checked?($("h3",t).text("Ajouter une séance de TD sans note"),$("#sid",t).parent().hide(0),$("#jour",t).prev().text("Jour :"),$("#rattrapage",t).parent().hide(0),$("#description",t).parent().show(0),$("#duree",t).prop("readonly",!1).prev().text("Durée :"),s.hide(0),r()):($("h3",t).text("Ajouter des notes de colles"),$("#sid",t).parent().show(0),$("#jour",t).prev().text("Jour dans le colloscope :"),$("#rattrapage",t).parent().show(0),$("#description",t).parent().hide(0),$("#duree",t).prop("readonly",!0).prev().text("Durée (modifiée automatiquement) :"),s.show(0),r($("#sid option:selected").val()||0))});break}case"notescolles":{n=o.parent().parent(),$("#jour",t).val($("td",n).eq(0).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("td",n).eq(1).text().length>1&&$("#rattrapage",t).val($("td",n).eq(1).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("#duree",t).val($("td",n).eq(3).text().replace(/.*m/,function(e){return"0h"+e.slice(0,-1)})),o.data("sid")?($("#description",t).parent().remove(),i=o.data("sid"),r(i),c=o.data("eleves").toString().split("|"),d=o.data("notes").toString().split("|"),c.forEach(function(e,n){$('tr[data-id="'+e+'"]',t).addClass("orig").show(0).find("select").val(d[n]).on("change",function(){$(this).parent().parent().removeClass("orig")})}),$("#comms",t).parent().parent().addClass("orig"),n.find("u").length&&($("#comms",t).prop("checked",!0),$.ajax({url:"recup.php",method:"post",data:{action:"commentairescolles",id:o.parent().data("id")},dataType:"json",attente:"Récupération des commentaires",afficheform:function(e){var n=e.comms;c.forEach(function(e){$('tr[data-id="'+e+'"]',t).each(function(t,s){u(t,s,decodeURIComponent(window.atob(n[e]||"")))})})}})),$("h3",t).text("Modifier des notes - semaine du "+$('select[name="sid"] option[value="'+i+'"]').text().split(" ").slice(0,3).join(" ")),$("td",n).eq(4).text().length==1?m(i):($('tr:not(.orig), .orig option[value="x"]',s).remove(),t.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier quels élèves ont été interrogés. Vous pouvez corriger la date et l'heure (dans la limite de la semaine enregistrée) ou les notes ou commentaires que vous avez saisis. Vous pouvez aussi mettre une note à un élève initialement absent qui a rattrapé sa colle.</p>"))):(s.remove(),$("h3",t).text("Modifier une séance de TD sans note"),$("#jour",t).prev().text("Jour :"),$("#rattrapage",t).parent().remove(),$("#description",t).val($("td",n).eq(2).text()),$("td",n).eq(4).text().length==1?$("#duree",t).prop("readonly",!1).prev().text("Durée :"):t.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>"));break}case"notescollesgestion":n=o.parent().parent(),$("#colleur",t).val($("td",n).eq(0).text()),$("#jour",t).val($("td",n).eq(1).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("td",n).eq(2).text().length>1&&$("#rattrapage",t).val($("td",n).eq(2).text().replace(/(.{6})(.{2})/,function(e,t,n){return t+"20"+n})),$("#duree",t).val($("td",n).eq(4).text().replace(/.*m/,function(e){return"0h"+e.slice(0,-1)})),$("td",n).eq(5).text().length>1&&($("#duree",t).prop("disabled",!0),t.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier sa durée.</p>")),o.data("sid")?($("#description",t).parent().remove(),i=o.data("sid"),r(i),c=o.data("eleves").toString().split("|"),d=o.data("notes").toString().split("|"),c.forEach(function(e,n){$('tr[data-id="'+e+'"]',t).addClass("orig").show(0).find("select").val(d[n])}),$('tr:not(.orig), .orig option[value="x"]',s).remove()):(s.remove(),$("h3",t).text("Modifier une séance de TD sans note"),$("#jour",t).prev().text("Jour :"),$("#rattrapage",t).parent().remove(),$("#description",t).val($("td",n).eq(3).text()))}},$.fn.init_evenements=function(){var e=$("#epingle form");$("textarea",e).attr("id","texte"),$("#debut").datetimepicker({onShow:function(){this.setOptions({maxDate:$("#fin").val()||!1})},onClose:function(e,t){$("#fin").val(function(e,n){return n||t.val()}),$("#recur_fin").val(function(e,n){var s=t.val().substring(0,10),o=n||s;return s.substr(8,2)+s.substr(3,2)+s.substr(0,2)>o.substr(8,2)+o.substr(3,2)+o.substr(0,2)?s:o})}}),$("#fin").datetimepicker({onShow:function(){this.setOptions({minDate:$("#debut").val()||!1})},onClose:function(e,t){$("#debut").val(function(e,n){return n||t.val()})}}),$("#jours").on("change",function(){var e;this.checked?$("#debut,#fin").each(function(){e=this.value.split(" "),$(this).val(e[0]).attr("data-heure",e[1]).datetimepicker({format:"d/m/Y",timepicker:!1})}):$("#debut,#fin").each(function(){this.hasAttribute("data-heure")&&$(this).val(this.value+" "+$(this).attr("data-heure")).removeAttr("data-heure"),$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:!0})})}),$("#recur_fin",e).datetimepicker({format:"d/m/Y",timepicker:!1,onShow:function(){this.setOptions({minDate:$("#debut").val()||!1})}}),$("#recur",e).on("click change",function(){$("#recur_step, #recur_fin",e).parent().toggle(this.checked)}).change()},$.fn.init_ajout_utilisateurs=function(){var t,e=$("#epingle form");$(".affichesiinvite,.affichesiinvitation,.affichesimotdepasse",e).hide(0),$("#admin,#matieres,#saisie,#ordre",e).parent().hide(0),$("textarea",e).prop("disabled",!0).attr("placeholder",`Zone de saisie des utilisateurs
 Sélectionnez d'abord un type d'utilisateur`),$("#autorisation,#saisie").on("change",function(){var n=$("#autorisation",e).val()==1,s=$("#saisie",e).val()==2;$("#saisie,#ordre",e).parent().toggle(!n),$(".affichesiinvite",e).toggle(n),$(".affichesinoninvite",e).toggle(!n),$(".affichesiinvitation",e).toggle(!n&&!s),$(".affichesiinvitation.eleves",e).toggle(!n&&!s&&$("#autorisation",e).val()==2),$(".affichesimotdepasse",e).toggle(!n&&s),$("#admin",e).parent().toggle($("#autorisation",e).val()>2),$("textarea",e).prop("disabled",!1).attr("placeholder",function(){return t(e,n)})}),$("#ordre",e).on("change",function(){$(".ordre").text($(".ordre"+$("#ordre",e).val(),e).show(0).text()+","+$(".ordre"+(3-$("#ordre",e).val()),e).hide(0).text()),$("textarea",e).attr("placeholder",function(){return t(e,$("#autorisation",e).val()==1)})}),$(".ordre2,.affichesinoninvite",e).hide(0),t=function(e,t){if(t)return`identifiant_1,motdepasse_1
 identifiant_2,motdepasse_2
 identifiant_3,motdepasse_3
 ...`;var n=$(".annonce:visible",e).text().substring(9);return n.replace(/,/g,"_1,")+`_1
 `+n.replace(/,/g,"_2,")+`_2
 `+n.replace(/,/g,"_3,")+`_3
-...`}},$.fn.init_transferts=function(){var e=$(this).parent(),t=$("#epingle form").append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');$("#deadline",t).val(e.data("deadline")||"").datetimepicker({format:"d/m/Y Ghi",timepicker:!0,onShow:function(){this.setOptions({minDate:new Date})}}),$("#echeance",t).prop("checked",!!e.data("deadline")).on("click change",function(){$("#deadline",t).parent().toggle(this.checked)}).change(),e.data("id")&&($("#titre",t).val(e.children("h3").text()),$("#prefixe",t).val(e.data("prefixe")),$("textarea",t).val($(".indications",e).supprimeMathJax().html()||""))},$.fn.init_transdocs=function(e){var o,t=$("#epingle form").data("ordre","alphaasc"),n=t.find('input[name="id"]').val(),i=$("article[data-id="+$(this).parent().data("id")+"] h3").text();$("h3.edition",t).html(e=="ajout-transdocs"?"Envoyer des documents - <em>"+i+"</em>":"Détails du transfert <em>"+i+"</em>"),$("a.icon-actualise",t).insertBefore(t).on("click",s),$("p.icones",t).children().insertBefore(t).on("click",function(){$(this).addClass("actuel").siblings().removeClass("actuel"),t.data("ordre",this.className.slice(5,-7)),$("#epingle a.icon-actualise").click()}),$("p.icones",t).remove(),$("em.prefixe",t).text($("article[data-id="+n+"]").data("prefixe")),e=="voir-transdocs"&&$("#epingle .icon-ok").hide(0);function s(){$("tr",t).slice(1).addClass("a_supprimer"),$("#liste",t).addClass("a_supprimer"),$.ajax({url:"recup.php",method:"post",data:{action:"transdocs",id:n,ordre:t.data("ordre")},dataType:"json",attente:"Récupération de la liste des documents",afficheform:function(e){$("tr.a_supprimer").remove();var o,i,r,a=e.lignes,s=$("tbody",t);a.length?(o=[],a.forEach(function(e){e.length==3?s.append('<tr data-id="'+e[0]+'"><td>'+e[2]+'</td><td colspan="5"><em>Document envoyé par un autre utilisateur</em></td></tr>'):s.append('<tr data-id="'+e[0]+'" data-verif="'+e[6]+'"><td>'+e[2]+"</td><td>"+e[3]+"</td><td>"+e[4]+"</td><td>"+e[5]+'</td>                                  <td class="icones"><a class="icon-download" title="Télécharger ce document"></a> <a class="icon-supprime" title="Supprimer ce document"></a></td>                                  <td class="icones"><input type="checkbox"></td></tr>'),o.push(parseInt(e[1]))}),$("tr",t).find("td:not(:nth-last-child(1), :nth-last-child(2))").on("click",function(){$(this).parent().find("input").click().change()}),$("input:checkbox",t).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked),$("th.icones a",t).not(".icon-cocher").toggleClass("noact",!$("input:checked",t).length)}),$("th.icones a",t).not(".icon-cocher").addClass("noact"),$(".icon-cocher",t).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input:checkbox",t).prop("checked",$(this).hasClass("icon-decocher")).change()}),i=enoms.reduce(function(e,t,n){return o.indexOf(eids[n])==-1?e+", "+t.split(",").reverse().join(" "):e},"").substr(2),r=eids.reduce(function(e,t,n){return o.indexOf(eids[n])==-1?e+","+t:e},"").substr(1),s.parent().before(i?'<p id="liste"><strong><a class="icon-mail" href="mail?enr_dests&uids='+r+'" title="Leur envoyer un mail"></a>&nbsp;Élèves absents du tableau&nbsp;:</strong> '+i+".</p>":'<p id="liste">Tous les élèves sont présents dans ce tableau.</p>')):s.append('<tr><td class="centre" colspan="6">Aucun résultat trouvé</td></tr>'),$(".a_supprimer").remove(),$("td a.icon-download",s).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:$(this).parent().parent(),fonction:function(e){$("#log").hide(0),window.location.href="transferts.php?dl="+e.data("id")+"&t="+n+"&verif="+e.data("verif")}})}),$("td a.icon-supprime",s).on("click",function(){var e=$(this).parent().parent();confirmation("Vous allez supprimer un document. Cette action n'est pas annulable.",e,function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"suppr-transdocs",id:e.data("id"),transfert:n},dataType:"json",el:e,fonction:function(e){e.remove()}})})})}})}s(),$("th .icon-download",t).on("click",function(){var e=$("input:checked",t);if(e.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}$("body").data("async",!0),$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:async function(){$("#log").hide(0),$("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">');var s,o,i,r,u,a=e.parent().parent(),c=a.map(function(){return $(this).data("id")}).get(),h=a.map(function(){return $(this).data("verif")}).get(),l=[],d=0,m=a.map(function(){return eval("("+$(this).find("td:eq(2)").text().replace("Mo","+0.5)*1024*1024").replace("ko","+0.5)*1024"))}).get().reduce((e,t)=>e+t);try{for(r=$("#load p").css("background"),i=0,s=0;s<c.length;s++)l[s]=await fetch("transferts?zip&dl="+c[s]+"&t="+n+"&verif="+h[s]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:o,value:s}=await n.read(),t,n;if(o)break;t.push(s),d+=s.length,i=Math.min(100,Math.round(d/m*100)),$("#load span").html(" - "+i+"%"),$("#load p").css("background",r.replace(/0%/g,i+"%"))}if(e.headers.get("Content-Length")==="0")return;return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",r.replace(/0%/g,"100%")),u=await downloadZip(l).blob(),o=document.createElement("a"),o.href=URL.createObjectURL(u),o.download=$("article[data-id="+n+"]").data("prefixe")+".zip",$("#load").fadeOut(),$("body").data("async",!1),o.click(),URL.revokeObjectURL(o.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}})}),$("th .icon-supprime",t).on("click",function(){var n,s,e=$("input:checked",t);if(e.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}n=e.parent().parent(),s=n.map(function(){return $(this).data("id")}).get().join(","),confirmation("Vous allez supprimer "+e.length+" documents. Cette opération n'est pas annulable.",this,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"suppr-transdocs",ids:s,transfert:id},dataType:"json",el:"",fonction:function(){$("#epingle a.icon-actualise").click()}})})}),e=="ajout-transdocs"&&(t.addClass("formdoc"),o=$("<select multiple></select>"),enoms.forEach(function(e,t){o.append('<option value="'+eids[t]+'">'+e.replace(","," ")+"</option>")}),$('input[type="file"]',t).attr("id","fichier").on("change",function(){i=this,$('select[id^="eleve"]',t).parent().remove();for(var i,n=0,a=i.files.length,e="",s=!1;n<a;n++)e=i.files[n].name,$('<p class="ligne"><label for="eleve'+n+'">'+e+"&nbsp;: </label></p>").append(o.clone().attr("id","eleve"+n).attr("name","eid"+n+"[]")).insertAfter($(".ligne",t).last()),s=!1,e=(e.substring(e.lastIndexOf("\\")+1,e.lastIndexOf("."))||e).toLowerCase(),enoms.forEach(function(t,o){!s&&e.indexOf(t.replace(","," ").toLowerCase())>-1&&($("#eleve"+n).val(eids[o]),s=!0)}),enoms.forEach(function(t,o){!s&&e.indexOf(t.split(",")[0].toLowerCase())>-1&&($("#eleve"+n).val(eids[o]),s=!0)});$("select",t).init_selmult().on("change",function(){$(this).prev().toggleClass("nok",this.value.length==0)}).change(),$("select",t).entreevalide(t)}),$("#epingle a.icon-ok").removeClass("icon-ok").addClass("icon-envoidoc").on("click",function(){if($("select.nok",t).length){affiche("Certains documents n'ont pas d'élève associé.","nok");return}$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:function(){$("#log").hide(0);var n=new FormData(t[0]);$.ajax({url:"ajax.php",xhr:function(){var e,n,t=$.ajaxSettings.xhr();return t.upload&&$("#fichier")[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),n=$("#load p").css("background"),e=0,t.upload.addEventListener("progress",function(t){t.lengthComputable&&(e=Math.round(t.loaded/t.total*100),$("#load span").html(" - "+e+"%"),$("#load p").css("background",n.replace(/0%/g,e+"%")))},!1)),t},method:"post",data:n,dataType:"json",contentType:!1,processData:!1,fonction:function(){$("select",t).parent().remove(),$("#fichier").val(""),s()}})}})}))},$.fn.init_page=function(){$("#epingle").data("matiere",0),$("body").data("protection",0),$("body").data("edition",0);var e=$("#epingle form");$("#matiere",e).on("change",function(){$("#epingle").data("matiere",parseInt(this.value)),$("#protection",e).next().attr("name","protection[]").parent().data("protection",$("#protection",e).val()),$("#edition",e).next().attr("name","edition[]").parent().data("edition",$("#edition",e).val()),$("#protection,#edition",e).remove(),$("select[multiple]",e).init_selmult()})};function download_transfert(){var t=$(this).parent().parent(),e=t.data("id"),n=t.data("prefixe");$("body").data("async",!0),affiche("Récupération de la liste des documents","ok"),$.ajax({url:"recup.php",method:"post",data:{action:"transdocs",id:e},dataType:"json",afficheform:async function(t){var n,s,o,i,a,r,c,l,d,h,u=t.lignes;if(u){$("#log").hide(0),$("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">').show(0),o=[],a=[],r=[],c=0,l=0,u.forEach(function(e){e.length>3&&(o.push(e[0]),a.push(e[6]),l+=eval("("+e[4].replace("&nbsp;","").replace("Mo","+0.5)*1024*1024").replace("ko","+0.5)*1024")))});try{for(d=$("#load p").css("background"),i=0,n=0;n<o.length;n++)r[n]=await fetch("transferts?zip&dl="+o[n]+"&t="+e+"&verif="+a[n]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:o,value:s}=await n.read(),t,n;if(o)break;t.push(s),c+=s.length,i=Math.min(100,Math.round(c/l*100)),$("#load span").html(" - "+i+"%"),$("#load p").css("background",d.replace(/0%/g,i+"%"))}return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",d.replace(/0%/g,"100%")),h=await downloadZip(r).blob(),s=document.createElement("a"),s.href=URL.createObjectURL(h),s.download=$("article[data-id="+e+"]").data("prefixe")+".zip",$("#load").fadeOut(),$("body").data("async",!1),s.click(),URL.revokeObjectURL(s.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}else affiche("Il n'y a rien à télécharger par ici.","nok"),$("#load").fadeOut(),$("body").data("async",!1)}})}function recherche_utilisateurs(){var e=$("table.utilisateurs");this.value.length>=2?($('tr:not(.categorie):not(:has(th)):not(:icontains("'+this.value+'"))',e).hide(0),$('tr:not(.categorie):not(:has(th)):icontains("'+this.value+'")',e).show(0),$(".icon-cocher",e).hide(0)):($("tr:not(.categorie):not(:has(th))",e).filter(function(){return $(".cache",this).length}).hide(0),$("tr:not(.categorie):not(:has(th))",e).filter(function(){return!$(".cache",this).length}).show(0),$(".icon-cocher",e).show(0))}function cocher_utilisateurs(){$(this).toggleClass("icon-cocher icon-decocher").parent().parent().nextUntil(".categorie").find("input").prop("checked",$(this).hasClass("icon-decocher")).change(),$(this).parent().prev().find("a").toggleClass("noact",$(this).hasClass("icon-cocher")),$("input[value=0]").prop("checked",!1).change()}function edite_utilisateur(){var e=$(this).parent().parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"prefs",id:e},dataType:"json",attente:"Récupération des données",afficheform:function(t){if("nom"in t){popup($("#form-edite").html(),!0);var n=$("#fenetre");$("input,select",n).attr("id",function(){return this.getAttribute("name")}),t.valide?$("#comptedesactive, #demande, #invitation",n).remove():t.demande?$("#compteactif, #comptedesactive, #invitation",n).remove():t.invitation?$("#compteactif, #comptedesactive, #demande",n).remove():$("#compteactif, #demande, #invitation",n).remove(),t.autorisation==1&&($("#nom, #prenom, #mail1, #mail2",n).parent().remove(),$("hr",n).nextAll().addBack().remove()),$(".admin"+(1-t.admin),n).remove(),$("p:first",n).html(function(e,n){return n.replace("XXX",t.prenom.length?"de <em>"+t.prenom+" "+t.nom+"</em>":"<em>"+t.login+"</em>").replace("YYY","<em>"+["Invité","Élève","Colleur","Lycée","Professeur"][t.autorisation-1]+"</em>")}),$('input[type="text"],input[type="email"],select',n).val(function(){return t[this.id]}),$('input[type="checkbox"]',n).prop("checked",function(){return t[this.id]}),t.mailenvoi||$("#mailcopie",n).parent().remove(),$("#autorisation",n).on("change",function(){$("#admin",n).prop("disabled",this.value<=2).parent().toggle(this.value>2)}).change(),$("input,select",n).bloque().entreevalide(n),$("a.icon-ok",n).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=utilisateur&modif=prefs&id="+e+"&"+$("form",n).serialize(),dataType:"json",el:!1,fonction:Function.prototype})})}}})}function init_utilisateurs(){$("#creation_compte").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=prefsglobales&id=creation_compte&val="+(this.checked|0),dataType:"json",el:!1,fonction:Function.prototype})}),$(".ordre_nom").on("click",function(){window.location="?type="+$("#type").val()+"&amp;matiere="+$("#matiere").val()+"&amp;ordre=nom"}),$(".ordre_type").on("click",function(){window.location="?type="+$("#type").val()+"&amp;matiere="+$("#matiere").val()+"&amp;ordre=type"}),$("th.icones a").not(".icon-cocher").addClass("noact"),$(".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, td .icon-renvoiinvite").on("click",e),$("th .icon-desactive, th .icon-active, th .icon-supprutilisateur, th .icon-validutilisateur, th .icon-renvoiinvite").on("click",t),$("td:not(.icones)").on("click",function(){$(this).parent().find("input").click()}),$("#u input").on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked);var e=$(this).parent().parent().prevUntil(".categorie").last();e.find("a").not(".icon-cocher").toggleClass("noact",!e.nextUntil(".categorie").find(":checked").length)});function e(){var o,e="",s=$(this).parent().siblings().first(),t=s.text().length?"de <em>"+s.next().text()+" "+s.text()+"</em>":"d'identifiant <em>"+s.next().next().text()+"</em>",n=$(this).parent().parent().prevUntil(".categorie").last().prev().text(),n=n.split(" ")[1]=="actuellement"?$(this).parent().prev().text().split(" ")[0]:n.split(" ")[0];switch(this.className.substring(5)){case"desactive":n=="Invité"?e="Vous allez désactiver le compte invité "+t+". 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.":e="Vous allez désactiver le compte "+t+". Cela signifie que le compte sera toujours visible pour les administrateurs 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":n=="Invité"?e="Vous allez réactiver le compte invité "+t+". La connexion sera à nouveau possible. Ce compte apparaîtra à nouveau dans la partie principale du tableau.":e="Vous allez réactiver le compte "+t+". 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":n=="Demandes"?e="Vous allez supprimer la demande "+t+". 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é en décochant la case ci-dessus.</strong>":n=="Invitations"?(o=$(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>",e="Vous allez supprimer l'invitation "+t+". 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."+o+`<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.</strong><br>Si la personne invitée vous dit avoir perdu l'invitation, vous pouvez la lui renvoyer en cliquant sur <span class="icon-actualise"></span>.<br>Si elle ne l'a jamais reçue, vérifiez bien avec elle l'adresse électronique que vous avez saisie avant de la supprimer.<br> La personne invitée ne sera pas prévenue de votre décision.`):n=="Professeur"?e="Vous allez supprimer le compte professeur "+t+`. <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.`:n=="Lycée"?e="Vous allez supprimer le compte lycée "+t+". Cela signifie que toutes les préférences de ce compte seront perdues.":n=="Colleur"?e="Vous allez supprimer le compte colleur "+t+`. <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>.`:n=="Élève"?e="Vous allez supprimer le compte élève "+t+`. <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>.`:n=="Invité"?e="Vous allez supprimer le compte invité "+t+". Cela signifie que la connexion par ce compte ne sera plus possible.":e="Vous allez supprimer le compte "+t+" 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>",n!="Demandes"&&(e=e+"<br>Une fois réalisée, cette opération est définitive.");break;case"validutilisateur":e="Vous allez valider la demande "+t+". 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>";break;case"renvoiinvite":e="Vous allez renvoyer un courriel d'invitation à "+t.substring(3)+`. Ce courriel devrait être reçu immédiatement. Ne réalisez cette action que si la personne concernée est sûre de ne pas avoir le courriel déjà envoyé une première fois. Si plusieurs envois ne changent rien, <strong>pensez à vérifier l'adresse électronique</strong>.<p class="annonce">Il est fréquent qu'une adresse recopiée depuis une feuille manuscrite soit fausse, merci de faire attention à ne pas envoyer des courriels à des adresses inexistantes.</p> Les grands gestionnaires de courriels se servent de cet indicateur pour dépister les spammeurs et ce site pourrait être pris comme tel. Vous pouvez demander à l'administrateur si des retours de courriels non délivrés ont été observés sur cette adresse.`}confirmation(e,this,function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:e.className.substring(5),id:$(e).parent().parent().data("id")},dataType:"json"})})}function t(){var e,t,n,s,o,i,r,a=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(a.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}switch(n=a.parent().parent(),r=n.map(function(){return $(this).data("id")}).get().join(","),e=n.map(function(){var e=$(this).children().first().text();return e.length?"<em>"+$(this).children().eq(1).text()+" "+e+"</em>":"<em>"+$(this).children().eq(2).text()+"</em>"}).get().join(", "),s=e.lastIndexOf(","),s>0&&(e=e.substring(0,s)+" et"+e.substring(s+1)),t="",o=$(this).parent().parent().prev().children().text().split(" ")[0],this.className.substring(5)){case"desactive":t="Vous allez désactiver les comptes de "+e+". Cela signifie que ces comptes seront toujours visibles pour les administrateurs 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":t="Vous allez réactiver les comptes de "+e+". 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":o=="Demandes"?t="Vous allez supprimer les demandes de "+e+`. 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>`:o=="Invitations"?t="Vous allez supprimer les invitations de "+e+`. 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.<br>Une fois réalisée, cette opération est définitive.`:(t="Vous allez supprimer les comptes de "+e+`. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles ou transferts de documents qui leur sont liés.</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>.<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.<br>Une fois réalisée, cette opération est définitive.`,i=n.find("td:eq(3)").text(),i.indexOf("Prof")>=0&&i.indexOf("Élève")>=0&&(t=t+`<br><p class="note"><strong>Vous allez supprimer simultanément des comptes de professeurs et des comptes d'élèves. Est-ce normal&nbsp;?`));break;case"validutilisateur":t="Vous allez valider les demandes de "+e+". 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>";break;case"renvoiinvite":t="Vous allez renvoyer un courriel d'invitation à "+e+". Ces courriels devraient être reçus immédiatement. Ne réalisez cette action que si les personnes concernées sont sûres de ne pas avoir le courriel déjà envoyé une première fois. Si plusieurs envois ne changent rien, pensez à vérifier les adresses électroniques. Vous pouvez demander à l'administrateur si des retours de courriels non délivrés ont été observés sur ces adresses."}confirmation(t,this,function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs",modif:e.className.substring(5),ids:r},dataType:"json"})})}}function init_utilisateurs_matieres(){$("tr:not(.categorie) td:not(:first-child,:last-child)").each(function(){var e=this.textContent.split("|");switch(e[1]){case"0":this.innerHTML=`<a class="icon-nok" title="Établir l'association à la matière"></a>`;break;case"1":this.innerHTML=`<a class="icon-ok" title="Supprimer l'association à la matière"></a>`;break;case"2":this.innerHTML='<a class="icon-ok" title="Association à la matière non modifiable"></a>';break;case"3":this.innerHTML='<a title="Colleur dans cette matière"><strong>C</strong></a>';break;case"4":this.innerHTML='<a title="Professeur dans cette matière"><strong>P</strong></a>'}e[1]>1&&this.classList.add("fixe"),this.childNodes[0].dataset.id=e[0]}),$("#umats").show(0),$("#umats a").on("click",t),$("#umats a").parent().on("mouseenter",function(){var e=this.childNodes[0].dataset.id;$("#m"+e+", a[data-id="+e+"], span[data-id="+e+"]").parent().addClass("sel")}).on("mouseleave",function(){var e=this.childNodes[0].dataset.id;$("#m"+e+", a[data-id="+e+"], span[data-id="+e+"]").parent().removeClass("sel")}),$(".categorie [data-id]").on("click",n).hide(0),$(".icon-cocher").on("click",cocher_utilisateurs).on("click",e),$('input[type="checkbox"]').on("click",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$("td:first-child").on("click",function(){$(this).parent().find("input").click()}),$("#ajoutprof").on("click",function(){$.ajax({url:"recup.php",method:"post",data:{action:"listeprofs"},dataType:"json",attente:"Récupération de la liste des professeurs",afficheform:function(e){if("ids"in e){popup($("#form-ajoutprof").html(),!0);var t=$("#fenetre"),n=e.ids,s=e.noms,o=e.matieres;for(cle in n)$("table",t).append('<tr><td data-id="'+n[cle]+'" data-matieres="'+o[cle]+'">'+s[cle]+"</td></tr>");$("td",t).on("click",function(){var n,e=$("#ajoutprof").parent().parent().next().clone(!0,!0);e[0].dataset.id="c"+this.dataset.id,n=this.dataset.matieres+",",$("td:first-child",e).text(this.textContent+" (Professeur)"),$(".icon-ferme",t).click(),$("thead span").each(function(){var t=this.id.substring(1);n.indexOf(","+t+",")>0?$("a[data-id="+t+"]",e).attr("title","Professeur dans cette matière").html("<strong>P</strong>").removeClass().parent().addClass("fixe"):$("a[data-id="+t+"]",e).attr("title","Établir l'association à la matière en tant que colleur").html("").removeClass().addClass("icon-nok").parent().removeClass("fixe")}),$("#ajoutprof").parent().parent().after(e)})}else popup(`<p class="annonce">Il n'y a aucun professeur à ajouter parmi les colleurs.</p>`,!0)}})});function e(){var t,e=$(this).parent().parent();e.hasClass("categorie")||(e=e.prevAll(".categorie").first()),t=e.nextUntil(".categorie").find(":checked"),t.length==0?$("[data-id]",e).hide(0):$("[data-id]",e).each(function(){var n=$(this).hasClass("icon-ok"),e=t.parent().prevAll().find('.icon-ok[data-id="'+this.getAttribute("data-id")+'"]').length<t.length/2;n!=e&&$(this).toggleClass("icon-ok icon-nok").attr("title",(e?"Établir":"Supprimer")+" l'association à la matière de tous les cochés")}).show(0)}function t(){if($(this).parent().hasClass("fixe"))switch(this.text){case"":popup(`<p class="annonce">Il n'est pas possible de supprimer l'association de cette matière avec cet utilisateur : des notes de colles ou des transferts de documents sont concernés. Il faut les supprimer avant de supprimer l'association utilisateur-matière.</p>`,!0);break;case"P":popup(`<p class="annonce">Il n'est pas possible de supprimer l'association de cette matière avec cet utilisateur : il est professeur (l'association est peut-être supprimable dans la partie «&nbsp;Professeurs&nbsp;»).</p>`,!0);break;case"C":popup(`<p class="annonce">Il n'est pas possible de supprimer l'association de cette matière avec cet utilisateur : il est colleur (l'association est peut-être supprimable dans la partie «&nbsp;Colleurs&nbsp;»).</p>`,!0)}else{var e=$(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-e},dataType:"json",el:$(this),fonction:function(t){t.toggleClass("icon-ok icon-nok").attr("title",(e?"Établir":"Supprimer")+" l'association à la matière")}})}}function n(){var e,t,n,s,o,a,r,i=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(i.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}s=i.parent().parent(),a=s.map(function(){return $(this).data("id")}).get().join(","),e=s.children(":first-of-type").map(function(){return $(this).text().split("(")[0].trim()}).get().join(", "),t=e.lastIndexOf(","),t>0&&(e=e.substring(0,t)+" et"+e.substring(t+1)),o=$(this).hasClass("icon-ok"),n=this.getAttribute("data-id"),r=o?"Vous allez établir l'association à la matière "+$("#m"+n).text()+" pour les comptes de "+e+". 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"+n).text()+" pour les comptes de "+e+`. Cela signifie que ces utilisateurs n'auront plus accès aux ressources liées à cette matière. Cela n'est possible que si cela ne supprime pas des contenus parmi les notes de colles ou les transferts de documents. Les utilisateurs pour lesquels l'association est matérialisée par un bouton <span class="icon-ok"></span> grisé ne seront pas traités.`,confirmation(r,this,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs-matieres",ids:a,matiere:n,val:o|0},dataType:"json"})})}}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(){return!0}})}),$(".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(),!0);var n,e=$("#fenetre"),t=$(this);article=t.parent().parent(),$("table",e).attr("id","ugrp"),$("h3",e).append($(".editable",article).text()||$("input:first",article).val()),$(".icon-deplie",e).on("click",plie),$(".icon-cocher",e).on("click",cocher_utilisateurs),$("tr:not(.categorie)",e).on("click",function(e){$(e.target).is("input")||$(this).find("input").click()}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),n=t.data("uids").toString(),$("#u"+n.replace(/,/g,",#u"),e).prop("checked",!0).change(),$(".icon-ok",e).on("click",function(){var n=$("input:checked",e).map(function(){return this.id.replace("u","")}).get().join(","),s=$("input:checked",e).parent().prev().map(function(){return this.textContent.split("(")[0].trim()}).get().join(", ")||"[Personne]";article.is("div")?($("#uids",article).val(n),t.data("uids",n),t.html(s+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>'),$("#fenetre, #fenetre_fond").remove()):$.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:"utilisateurs",id:article.data("id"),uids:n},dataType:"json",el:t,fonction:function(e){e.data("uids",n),e.html(s+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>'),$("#fenetre, #fenetre_fond").remove()}})})}function suppressionmultiple(){var n=$(this).data("type"),t=$(this).parent().find("h3").text(),s=$(this).parent().data("id"),e="";switch(n){case"infos":e="toutes les informations de la page <em>"+t+"</em>";break;case"progcolles":e="tous les programmes de colles de la matière <em>"+t+"</em>";break;case"cdt":e="tout le contenu du cahier de texte de la matière <em>"+t+"</em>";break;case"docs":e="tous les répertoires et documents de la matière <em>"+t+"</em>";break;case"notescolles":e="toutes les notes de la matière <em>"+t+"</em>";break;case"transferts":e="tous les transferts de documents personnels de la matière <em>"+t+"</em>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",e),this,function(e){$.ajax({url:"ajax.php",method:"post",data:"action="+$("body").data("action")+"&id="+s+"&supprime_"+n+"=1",dataType:"json",el:$(e),fonction:function(e){e.remove()}})})}$.fn.init_envoimail=function(){var e=$("#mail");$('input[type="file"]').attr("id","pj").on("change",function(){n=this,$('input[id^="nom"]').parent().remove();for(var n,t=0,i=n.files.length,s=0,o="";t<i;t++)s=n.files[t].size,o=s<1048576?Math.floor(s/1024)+" ko":Math.floor(s/1048576)+" Mo",$(".ligne",e).last().after('<p class="ligne"><label for="nom'+t+'">Fichier '+(t+1)+"&nbsp;("+o+')&nbsp;: </label><input type="text" name="nom[]" id="nom'+t+'" value="" size="50"></p>'),$("#nom"+t).val(n.files[t].name),s>5*1048576&&$(".ligne",e).last().addClass("fichierlourd");$("#videpj,#infopj").toggle(!!n.files.length),$("#infotaillepj").toggle(!!$(".fichierlourd").length)}),$("#videpj").on("click",function(){$("#pj").wrap("<form>").closest("form").get(0).reset(),$("#pj").unwrap().removeClass("nepassortir nok").bloque().prev().removeClass("nepassortir nok"),$('input[id^="nom"]').parent().remove(),$("#videpj,#infopj,#infotaillepj").hide(0)}),$("#mat").on("change",function(){$("#rep").html(reps[this.value]).change()}),$("#rep").on("change",function(){$("#doc").html(docs[this.value]).change()}),$("#doc").on("change",function(){this.value<1?$("#liendoc").val("Copier le lien vers le document").prop("disabled",!0).off("click").removeClass("ok"):$("#liendoc").val("Copier le lien vers le document "+$("#doc :selected").text()).prop("disabled",!1).on("click",function(){var e=this.value;navigator.clipboard.writeText(window.location.href.replace(/mail.*/,"download?id="+$("#doc").val())).then($(this).addClass("ok").val("Copié !")).then(window.setTimeout(function(){$("#liendoc").val(e).removeClass("ok")},2e3))})}),$("#form-destinataires tr.gr input:checked").each(function(){$("#form-destinataires").find(".dest[value="+this.value.replace(/,/g,"],.dest[value=")+"]").prop("checked",!0)}),$("#form-destinataires tr:not(.gr) .dest:checked").length&&($('[name="id-copie"]').val($("#form-destinataires tr:not(.gr) .dest:checked").map(function(){return this.value}).get().join(",")),$("#maildest").text($("#form-destinataires tr:not(.gr) .dest:checked").parent().prev().map(function(){return this.textContent}).get().join(", "))),$("#form-destinataires input:checked").attr("checked",!1)};function destinatairesmail(){popup($("#form-destinataires").html(),!0);var t,e=$("#fenetre");$(".icon-deplie",e).on("click",plie),$("tr.plie_init",e).nextUntil(".categorie").hide(0).children().addClass("cache"),$("tr.plie_init",e).find(".icon-deplie").removeClass("icon-deplie").addClass("icon-plie"),$("tr:not(.gr) input.dest",e).attr("id",function(){return"u"+this.value}),$("tr:not(.categorie) td:nth-child(-n+2)",e).on("click",function(e){$(e.target).is("input")||$(this).parent().find("input:first").click()}),$('input[type="checkbox"]',e).on("change",function(){var t=$(this).parent().parent();this.checked&&t.find("input:not(."+this.className+")").prop("checked",!1),t.toggleClass("sel",t.find("input:checked").length>0),$(".nc",e).text($("tr:not(.gr) .dest:checked",e).length),$(".ncs",e).text($("tr:not(.gr) .dest:checked",e).length>1?"s":""),$(".ncc",e).text($("tr:not(.gr) .bcc:checked",e).length)}),t=$('[name="id-copie"]').val(),$("#u"+t.replace(/,/g,",#u")).prop("checked",!0).change(),t=$('[name="id-bcc"]').val(),$("#u"+t.replace(/,/g,",#u")).parent().next().children().prop("checked",!0).change(),$(".categorie a",e).on("click keyup",function(){var n,t=this.className.split(" ")[1],e=this.className.split(" ")[0]=="icon-cocher";$(this).parent().parent().nextUntil(".categorie").find("."+t+":not(:disabled)").prop("checked",e).change(),this.className=(e?"icon-decocher ":"icon-cocher ")+t,this.title=this.title.replace(e?"Cocher":"Décocher",e?"Décocher":"Cocher"),n=t=="dest"?"bcc":"dest",$(this).parent().parent().find(".icon-decocher."+n).each(function(){this.className="icon-cocher "+n,this.title="C"+this.title.substr(3)})}),$(".gr input",e).on("click",function(){var e=this.value;this.className=="dest"?$("#u"+e.replace(/,/g,",#u")).prop("checked",this.checked).change():$("#u"+e.replace(/,/g,",#u")).parent().next().children().prop("checked",this.checked).change()}),$('input[type="text"]',e).attr("id","recherche").on("input",function(){this.value.length>=2?($('tr:not(.categorie):not(:icontains("'+this.value+'"))',e).slice(1).hide(0),$('tr:not(.categorie):icontains("'+this.value+'")',e).show(0)):($("tr:not(.categorie)",e).filter(function(){return $(".cache",this).length}).hide(0),$("tr:not(.categorie)",e).filter(function(){return!$(".cache",this).length}).show(0))}),$(".icon-aide",e).on("click",function(){$("p.aide",e).toggle()}).click(),$(".icon-ok",e).on("click",function(){$('[name="id-copie"]').val($("tr:not(.gr) .dest:checked",e).map(function(){return this.value}).get().join(",")),$('[name="id-bcc"]').val($("tr:not(.gr) .bcc:checked",e).map(function(){return this.value}).get().join(","));var t=$("tr:not(.gr) .dest:checked",e).parent().prev().map(function(){return this.textContent}).get();t.length?$("textarea").next().show(0):(t=["Vous"],$("textarea").next().hide(0)),$("#maildest").text(t.concat($("tr:not(.gr) .bcc:checked",e).parent().prev().prev().map(function(){return this.textContent+" (CC)"}).get()).join(", ")||"[Personne]"),$("#fenetre, #fenetre_fond").remove()})}function envoimail(){return $('[name="sujet"]').val().length?$("#pj")[0].files.length?$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:function(){$("#log").hide(0);var t=new FormData($("#mail")[0]);$.ajax({url:"ajax.php",xhr:function(){var e,n,t=$.ajaxSettings.xhr();return t.upload&&$("#pj")[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),n=$("#load p").css("background"),e=0,t.upload.addEventListener("progress",function(t){t.lengthComputable&&(e=Math.round(t.loaded/t.total*100),$("#load span").html(" - "+e+"%"),$("#load p").css("background",n.replace(/0%/g,e+"%")))},!1)),t},method:"post",data:t,dataType:"json",contentType:!1,processData:!1})}}):$.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json"}):affiche("Il faut un sujet non vide pour envoyer le courriel.","nok"),!1}function init_envoimails(){var e=$("#envoimails");$("td",e).each(function(){var e=this.textContent.split("|");this.innerHTML=e[1]==1?'<a class="icon-ok" data-id="'+e[0]+`" title="Supprimer l'autorisation d'envoi"></a>`:'<a class="icon-nok" data-id="'+e[0]+`" title="Établir l'autorisation d'envoi"></a>`}),$("td a",e).on("click",function(){var e=$(this).hasClass("icon-nok")|0;$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",id:"mails",depuis:$(this).parent().parent().data("id"),vers:$(this).data("id"),val:e},dataType:"json",el:$(this),fonction:function(t){t.toggleClass("icon-ok icon-nok").attr("title",(e?"Établir":"Supprimer")+" l'autorisation d'envoi")}})}),$("th span",e).on("click",function(){var e=$(this).hasClass("icon-ok"),t=$(this).parent().parent();$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",id:"mails",depuis:t.data("id"),vers:0,val:e|0},dataType:"json",el:t,fonction:function(t){t.find("td a").toggleClass("icon-ok",e).toggleClass("icon-nok",!e).attr("title",(e?"Établir":"Supprimer")+" l'autorisation d'envoi")}})})}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(){$.ajax({url:"ajax.php",method:"post",data:"action=releve-notes&datemax="+$("#datemax").val(),dataType:"json"})})}$(function(){$("#icones a").length>2&&$("header h1").css("padding-right",(1+$("#icones a").length)*.6+"em"),$(".affichable").attr("title",function(){return($(this).data("title")||$("#aide-"+this.id).text()).replace(/(<([^>]+)>)/gi,"")}).on("click",affiche_titleplus),$("#icones .icon-lecture").reglagelecture(),$("a.formulaire").on("click",formulaire),$("a.icon-aide").on("click",function(){popup($("#aide-"+($(this).parent().data("action")||$("body").data("action"))).html(),!1)}),$("a.icon-ok").on("click",valide),$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime,a.icon-ajoutecolle,a.icon-comms").on("click",function(){window[this.className.substring(5)]($(this))}),$(".editable").editinplace(),$("form:visible").each(function(){$(this).find("input,select").not(".nonbloque").bloque().entreevalide($(this)),$('[name="couleur"]').each(function(){$(this).colpick()})}),$("p.titrecdt").editinplacecdt(),$(".cdt-raccourcis").init_cdt_raccourcis(),$("p.titreagenda").editinplaceagenda(),$("#transferts .icon-voir").on("click",function(){$("article[data-id="+$(this).parent().data("id")+"]").remove("flash").deplace_viewport().addClass("flash")}),$("article.transfert .icon-download").on("click",download_transfert),$(".icon-mailenvoi").on("click",envoimail),$("#maildest, #maildest + .icon-edite").on("click",destinatairesmail),$("form#mail").on("submit",envoimail).init_envoimail(),$("#rechercheutilisateurs input").on("input change",recherche_utilisateurs),$(".categorie th:first-child").prepend($('<span class="icon-deplie" title="Déplier/Replier cette catégorie"></span>').on("click",plie)),$("article select[multiple]").init_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").on("change",function(){$(this).parent().parent().find("input").prop("checked",this.value==0)}),$("#planning input").on("change",function(){this.checked&&($(this).parent().siblings().children("input").prop("checked",!1),$(this).parent().siblings().children("select").val(0))}),$("#relevenotes").on("click",relevenotes)})
\ No newline at end of file
+...`}},$.fn.init_transferts=function(){var e=$(this).parent(),t=$("#epingle form").append('<input type="hidden" name="matiere" value="'+$("body").data("matiere")+'">');$("#deadline",t).val(e.data("deadline")||"").datetimepicker({format:"d/m/Y Ghi",timepicker:!0,onShow:function(){this.setOptions({minDate:new Date})}}),$("#echeance",t).prop("checked",!!e.data("deadline")).on("click change",function(){$("#deadline",t).parent().toggle(this.checked)}).change(),e.data("id")&&($("#titre",t).val(e.children("h3").text()),$("#prefixe",t).val(e.data("prefixe")),$("textarea",t).val($(".indications",e).supprimeMathJax().html()||""))},$.fn.init_transdocs=function(e){var o,t=$("#epingle form").data("ordre","alphaasc"),n=t.find('input[name="id"]').val(),i=$("article[data-id="+$(this).parent().data("id")+"] h3").text();$("h3.edition",t).html(e=="ajout-transdocs"?"Envoyer des documents - <em>"+i+"</em>":"Détails du transfert <em>"+i+"</em>"),$("a.icon-actualise",t).insertBefore(t).on("click",s),$("p.icones",t).children().insertBefore(t).on("click",function(){$(this).addClass("actuel").siblings().removeClass("actuel"),t.data("ordre",this.className.slice(5,-7)),$("#epingle a.icon-actualise").click()}),$("p.icones",t).remove(),$("em.prefixe",t).text($("article[data-id="+n+"]").data("prefixe")),e=="voir-transdocs"&&$("#epingle .icon-ok").hide(0);function s(){$("tr",t).slice(1).addClass("a_supprimer"),$("#liste",t).addClass("a_supprimer"),$.ajax({url:"recup.php",method:"post",data:{action:"transdocs",id:n,ordre:t.data("ordre")},dataType:"json",attente:"Récupération de la liste des documents",afficheform:function(e){$("tr.a_supprimer").remove();var o,i,r,a=e.lignes,s=$("tbody",t);a.length?(o=[],a.forEach(function(e){e.length==3?s.append('<tr data-id="'+e[0]+'"><td>'+e[2]+'</td><td colspan="5"><em>Document envoyé par un autre utilisateur</em></td></tr>'):s.append('<tr data-id="'+e[0]+'" data-verif="'+e[6]+'"><td>'+e[2]+"</td><td>"+e[3]+"</td><td>"+e[4]+"</td><td>"+e[5]+'</td>                                  <td class="icones"><a class="icon-download" title="Télécharger ce document"></a> <a class="icon-supprime" title="Supprimer ce document"></a></td>                                  <td class="icones"><input type="checkbox"></td></tr>'),o.push(parseInt(e[1]))}),$("tr",t).find("td:not(:nth-last-child(1), :nth-last-child(2))").on("click",function(){$(this).parent().find("input").click().change()}),$("input:checkbox",t).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked),$("th.icones a",t).not(".icon-cocher").toggleClass("noact",!$("input:checked",t).length)}),$("th.icones a",t).not(".icon-cocher").addClass("noact"),$(".icon-cocher",t).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input:checkbox",t).prop("checked",$(this).hasClass("icon-decocher")).change()}),i=enoms.reduce(function(e,t,n){return o.indexOf(eids[n])==-1?e+", "+t.split(",").reverse().join(" "):e},"").substr(2),r=eids.reduce(function(e,t,n){return o.indexOf(eids[n])==-1?e+","+t:e},"").substr(1),s.parent().before(i?'<p id="liste"><strong><a class="icon-mail" href="mail?enr_dests&uids='+r+'" title="Leur envoyer un mail"></a>&nbsp;Élèves absents du tableau&nbsp;:</strong> '+i+".</p>":'<p id="liste">Tous les élèves sont présents dans ce tableau.</p>')):s.append('<tr><td class="centre" colspan="6">Aucun résultat trouvé</td></tr>'),$(".a_supprimer").remove(),$("td a.icon-download",s).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:$(this).parent().parent(),fonction:function(e){$("#log").hide(0),window.location.href="transferts.php?dl="+e.data("id")+"&t="+n+"&verif="+e.data("verif")}})}),$("td a.icon-supprime",s).on("click",function(){var e=$(this).parent().parent();confirmation("Vous allez supprimer un document. Cette action n'est pas annulable.",e,function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"suppr-transdocs",id:e.data("id"),transfert:n},dataType:"json",el:e,fonction:function(e){e.remove()}})})})}})}s(),$("th .icon-download",t).on("click",function(){var e=$("input:checked",t);if(e.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}$("body").data("async",!0),$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:async function(){$("#log").hide(0),$("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">');var s,o,i,r,u,a=e.parent().parent(),c=a.map(function(){return $(this).data("id")}).get(),h=a.map(function(){return $(this).data("verif")}).get(),l=[],d=0,m=a.map(function(){return eval("("+$(this).find("td:eq(2)").text().replace("Mo","+0.5)*1024*1024").replace("ko","+0.5)*1024"))}).get().reduce((e,t)=>e+t);try{for(r=$("#load p").css("background"),i=0,s=0;s<c.length;s++)l[s]=await fetch("transferts?zip&dl="+c[s]+"&t="+n+"&verif="+h[s]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:o,value:s}=await n.read(),t,n;if(o)break;t.push(s),d+=s.length,i=Math.min(100,Math.round(d/m*100)),$("#load span").html(" - "+i+"%"),$("#load p").css("background",r.replace(/0%/g,i+"%"))}if(e.headers.get("Content-Length")==="0")return;return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",r.replace(/0%/g,"100%")),u=await downloadZip(l).blob(),o=document.createElement("a"),o.href=URL.createObjectURL(u),o.download=$("article[data-id="+n+"]").data("prefixe")+".zip",$("#load").fadeOut(),$("body").data("async",!1),o.click(),URL.revokeObjectURL(o.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}})}),$("th .icon-supprime",t).on("click",function(){var n,s,e=$("input:checked",t);if(e.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}n=e.parent().parent(),s=n.map(function(){return $(this).data("id")}).get().join(","),confirmation("Vous allez supprimer "+e.length+" documents. Cette opération n'est pas annulable.",this,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"suppr-transdocs",ids:s,transfert:id},dataType:"json",el:"",fonction:function(){$("#epingle a.icon-actualise").click()}})})}),e=="ajout-transdocs"&&(t.addClass("formdoc"),o=$("<select multiple></select>"),enoms.forEach(function(e,t){o.append('<option value="'+eids[t]+'">'+e.replace(","," ")+"</option>")}),$('input[type="file"]',t).attr("id","fichier").on("change",function(){i=this,$('select[id^="eleve"]',t).parent().remove();for(var i,n=0,a=i.files.length,e="",s=!1;n<a;n++)e=i.files[n].name,$('<p class="ligne"><label for="eleve'+n+'">'+e+"&nbsp;: </label></p>").append(o.clone().attr("id","eleve"+n).attr("name","eid"+n+"[]")).insertAfter($(".ligne",t).last()),s=!1,e=(e.substring(e.lastIndexOf("\\")+1,e.lastIndexOf("."))||e).toLowerCase(),enoms.forEach(function(t,o){!s&&e.indexOf(t.replace(","," ").toLowerCase())>-1&&($("#eleve"+n).val(eids[o]),s=!0)}),enoms.forEach(function(t,o){!s&&e.indexOf(t.split(",")[0].toLowerCase())>-1&&($("#eleve"+n).val(eids[o]),s=!0)});$("select",t).init_selmult().on("change",function(){$(this).prev().toggleClass("nok",this.value.length==0)}).change(),$("select",t).entreevalide(t)}),$("#epingle a.icon-ok").removeClass("icon-ok").addClass("icon-envoidoc").on("click",function(){if($("select.nok",t).length){affiche("Certains documents n'ont pas d'élève associé.","nok");return}$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:function(){$("#log").hide(0);var n=new FormData(t[0]);$.ajax({url:"ajax.php",xhr:function(){var e,n,t=$.ajaxSettings.xhr();return t.upload&&$("#fichier")[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),n=$("#load p").css("background"),e=0,t.upload.addEventListener("progress",function(t){t.lengthComputable&&(e=Math.round(t.loaded/t.total*100),$("#load span").html(" - "+e+"%"),$("#load p").css("background",n.replace(/0%/g,e+"%")))},!1)),t},method:"post",data:n,dataType:"json",contentType:!1,processData:!1,fonction:function(){$("select",t).parent().remove(),$("#fichier").val(""),s()}})}})}))},$.fn.init_page=function(){$("#epingle").data("matiere",0),$("body").data("protection",0),$("body").data("edition",0);var e=$("#epingle form");$("#matiere",e).on("change",function(){$("#epingle").data("matiere",parseInt(this.value)),$("#protection",e).next().attr("name","protection[]").parent().data("protection",$("#protection",e).val()),$("#edition",e).next().attr("name","edition[]").parent().data("edition",$("#edition",e).val()),$("#protection,#edition",e).remove(),$("select[multiple]",e).init_selmult()})};function download_transfert(){var t=$(this).parent().parent(),e=t.data("id"),n=t.data("prefixe");$("body").data("async",!0),affiche("Récupération de la liste des documents","ok"),$.ajax({url:"recup.php",method:"post",data:{action:"transdocs",id:e},dataType:"json",afficheform:async function(t){var n,s,o,i,a,r,c,l,d,h,u=t.lignes;if(u){$("#log").hide(0),$("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">').show(0),o=[],a=[],r=[],c=0,l=0,u.forEach(function(e){e.length>3&&(o.push(e[0]),a.push(e[6]),l+=eval("("+e[4].replace("&nbsp;","").replace("Mo","+0.5)*1024*1024").replace("ko","+0.5)*1024")))});try{for(d=$("#load p").css("background"),i=0,n=0;n<o.length;n++)r[n]=await fetch("transferts?zip&dl="+o[n]+"&t="+e+"&verif="+a[n]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:o,value:s}=await n.read(),t,n;if(o)break;t.push(s),c+=s.length,i=Math.min(100,Math.round(c/l*100)),$("#load span").html(" - "+i+"%"),$("#load p").css("background",d.replace(/0%/g,i+"%"))}return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",d.replace(/0%/g,"100%")),h=await downloadZip(r).blob(),s=document.createElement("a"),s.href=URL.createObjectURL(h),s.download=$("article[data-id="+e+"]").data("prefixe")+".zip",$("#load").fadeOut(),$("body").data("async",!1),s.click(),URL.revokeObjectURL(s.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}else affiche("Il n'y a rien à télécharger par ici.","nok"),$("#load").fadeOut(),$("body").data("async",!1)}})}function recherche_utilisateurs(){var e=$("table.utilisateurs");this.value.length>=2?($('tr:not(.categorie):not(:has(th)):not(:icontains("'+this.value+'"))',e).hide(0),$('tr:not(.categorie):not(:has(th)):icontains("'+this.value+'")',e).show(0),$(".icon-cocher",e).hide(0)):($("tr:not(.categorie):not(:has(th))",e).filter(function(){return $(".cache",this).length}).hide(0),$("tr:not(.categorie):not(:has(th))",e).filter(function(){return!$(".cache",this).length}).show(0),$(".icon-cocher",e).show(0))}function cocher_utilisateurs(){$(this).toggleClass("icon-cocher icon-decocher").parent().parent().nextUntil(".categorie").find("input").prop("checked",$(this).hasClass("icon-decocher")).change(),$(this).parent().prev().find("a").toggleClass("noact",$(this).hasClass("icon-cocher")),$("input[value=0]").prop("checked",!1).change()}function edite_utilisateur(){var e=$(this).parent().parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"prefs",id:e},dataType:"json",attente:"Récupération des données",afficheform:function(t){if("nom"in t){popup($("#form-edite").html(),!0);var n=$("#fenetre");$("input,select",n).attr("id",function(){return this.getAttribute("name")}),t.valide?$("#comptedesactive, #demande, #invitation",n).remove():t.demande?$("#compteactif, #comptedesactive, #invitation",n).remove():t.invitation?$("#compteactif, #comptedesactive, #demande",n).remove():$("#compteactif, #demande, #invitation",n).remove(),t.autorisation==1&&($("#nom, #prenom, #mail1, #mail2",n).parent().remove(),$("hr",n).nextAll().addBack().remove()),$(".admin"+(1-t.admin),n).remove(),$("p:first",n).html(function(e,n){return n.replace("XXX",t.prenom.length?"de <em>"+t.prenom+" "+t.nom+"</em>":"<em>"+t.login+"</em>").replace("YYY","<em>"+["Invité","Élève","Colleur","Lycée","Professeur"][t.autorisation-1]+"</em>")}),$('input[type="text"],input[type="email"],select',n).val(function(){return t[this.id]}),$('input[type="checkbox"]',n).prop("checked",function(){return t[this.id]}),t.mailenvoi||$("#mailcopie",n).parent().remove(),$("#autorisation",n).on("change",function(){$("#admin",n).prop("disabled",this.value<=2).parent().toggle(this.value>2)}).change(),$("input,select",n).bloque().entreevalide(n),$("a.icon-ok",n).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=utilisateur&modif=prefs&id="+e+"&"+$("form",n).serialize(),dataType:"json",el:!1,fonction:Function.prototype})})}}})}function init_utilisateurs(){$("#creation_compte").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=prefsglobales&id=creation_compte&val="+(this.checked|0),dataType:"json",el:!1,fonction:Function.prototype})}),$(".ordre_nom").on("click",function(){window.location="?type="+$("#type").val()+"&amp;matiere="+$("#matiere").val()+"&amp;ordre=nom"}),$(".ordre_type").on("click",function(){window.location="?type="+$("#type").val()+"&amp;matiere="+$("#matiere").val()+"&amp;ordre=type"}),$("th.icones a").not(".icon-cocher").addClass("noact"),$(".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, td .icon-renvoiinvite").on("click",e),$("th .icon-desactive, th .icon-active, th .icon-supprutilisateur, th .icon-validutilisateur, th .icon-renvoiinvite").on("click",t),$("td:not(.icones)").on("click",function(){$(this).parent().find("input").click()}),$("#u input").on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked);var e=$(this).parent().parent().prevUntil(".categorie").last();e.find("a").not(".icon-cocher").toggleClass("noact",!e.nextUntil(".categorie").find(":checked").length)});function e(){var o,e="",s=$(this).parent().siblings().first(),t=s.text().length?"de <em>"+s.next().text()+" "+s.text()+"</em>":"d'identifiant <em>"+s.next().next().text()+"</em>",n=$(this).parent().parent().prevUntil(".categorie").last().prev().text(),n=n.split(" ")[1]=="actuellement"?$(this).parent().prev().text().split(" ")[0]:n.split(" ")[0];switch(this.className.substring(5)){case"desactive":n=="Invité"?e="Vous allez désactiver le compte invité "+t+". 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.":e="Vous allez désactiver le compte "+t+". Cela signifie que le compte sera toujours visible pour les administrateurs 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":n=="Invité"?e="Vous allez réactiver le compte invité "+t+". La connexion sera à nouveau possible. Ce compte apparaîtra à nouveau dans la partie principale du tableau.":e="Vous allez réactiver le compte "+t+". 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":n=="Demandes"?e="Vous allez supprimer la demande "+t+". 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é en décochant la case ci-dessus.</strong>":n=="Invitations"?(o=$(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>",e="Vous allez supprimer l'invitation "+t+". 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."+o+`<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.</strong><br>Si la personne invitée vous dit avoir perdu l'invitation, vous pouvez la lui renvoyer en cliquant sur <span class="icon-actualise"></span>.<br>Si elle ne l'a jamais reçue, vérifiez bien avec elle l'adresse électronique que vous avez saisie avant de la supprimer.<br> La personne invitée ne sera pas prévenue de votre décision.`):n=="Professeur"?e="Vous allez supprimer le compte professeur "+t+`. <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.`:n=="Lycée"?e="Vous allez supprimer le compte lycée "+t+". Cela signifie que toutes les préférences de ce compte seront perdues.":n=="Colleur"?e="Vous allez supprimer le compte colleur "+t+`. <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>.`:n=="Élève"?e="Vous allez supprimer le compte élève "+t+`. <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>.`:n=="Invité"?e="Vous allez supprimer le compte invité "+t+". Cela signifie que la connexion par ce compte ne sera plus possible.":e="Vous allez supprimer le compte "+t+" 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>",n!="Demandes"&&(e=e+"<br>Une fois réalisée, cette opération est définitive.");break;case"validutilisateur":e="Vous allez valider la demande "+t+". 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>";break;case"renvoiinvite":e="Vous allez renvoyer un courriel d'invitation à "+t.substring(3)+`. Ce courriel devrait être reçu immédiatement. Ne réalisez cette action que si la personne concernée est sûre de ne pas avoir le courriel déjà envoyé une première fois. Si plusieurs envois ne changent rien, <strong>pensez à vérifier l'adresse électronique</strong>.<p class="annonce">Il est fréquent qu'une adresse recopiée depuis une feuille manuscrite soit fausse, merci de faire attention à ne pas envoyer des courriels à des adresses inexistantes.</p> Les grands gestionnaires de courriels se servent de cet indicateur pour dépister les spammeurs et ce site pourrait être pris comme tel. Vous pouvez demander à l'administrateur si des retours de courriels non délivrés ont été observés sur cette adresse.`}confirmation(e,this,function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:e.className.substring(5),id:$(e).parent().parent().data("id")},dataType:"json"})})}function t(){var e,t,n,s,o,i,r,a=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(a.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}switch(n=a.parent().parent(),r=n.map(function(){return $(this).data("id")}).get().join(","),e=n.map(function(){var e=$(this).children().first().text();return e.length?"<em>"+$(this).children().eq(1).text()+" "+e+"</em>":"<em>"+$(this).children().eq(2).text()+"</em>"}).get().join(", "),s=e.lastIndexOf(","),s>0&&(e=e.substring(0,s)+" et"+e.substring(s+1)),t="",o=$(this).parent().parent().prev().children().text().split(" ")[0],this.className.substring(5)){case"desactive":t="Vous allez désactiver les comptes de "+e+". Cela signifie que ces comptes seront toujours visibles pour les administrateurs 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":t="Vous allez réactiver les comptes de "+e+". 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":o=="Demandes"?t="Vous allez supprimer les demandes de "+e+`. 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>`:o=="Invitations"?t="Vous allez supprimer les invitations de "+e+`. 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.<br>Une fois réalisée, cette opération est définitive.`:(t="Vous allez supprimer les comptes de "+e+`. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles ou transferts de documents qui leur sont liés.</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>.<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.<br>Une fois réalisée, cette opération est définitive.`,i=n.find("td:eq(3)").text(),i.indexOf("Prof")>=0&&i.indexOf("Élève")>=0&&(t=t+`<br><p class="note"><strong>Vous allez supprimer simultanément des comptes de professeurs et des comptes d'élèves. Est-ce normal&nbsp;?`));break;case"validutilisateur":t="Vous allez valider les demandes de "+e+". 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>";break;case"renvoiinvite":t="Vous allez renvoyer un courriel d'invitation à "+e+". Ces courriels devraient être reçus immédiatement. Ne réalisez cette action que si les personnes concernées sont sûres de ne pas avoir le courriel déjà envoyé une première fois. Si plusieurs envois ne changent rien, pensez à vérifier les adresses électroniques. Vous pouvez demander à l'administrateur si des retours de courriels non délivrés ont été observés sur ces adresses."}confirmation(t,this,function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs",modif:e.className.substring(5),ids:r},dataType:"json"})})}}function init_utilisateurs_matieres(){$("tr:not(.categorie) td:not(:first-child,:last-child)").each(function(){var e=this.textContent.split("|");switch(e[1]){case"0":this.innerHTML=`<a class="icon-nok" title="Établir l'association à la matière"></a>`;break;case"1":this.innerHTML=`<a class="icon-ok" title="Supprimer l'association à la matière"></a>`;break;case"2":this.innerHTML='<a class="icon-ok" title="Association à la matière non modifiable"></a>';break;case"3":this.innerHTML='<a title="Colleur dans cette matière"><strong>C</strong></a>';break;case"4":this.innerHTML='<a title="Professeur dans cette matière"><strong>P</strong></a>'}e[1]>1&&this.classList.add("fixe"),this.childNodes[0].dataset.id=e[0]}),$("#umats").show(0),$("#umats a").on("click",t),$("#umats a").parent().on("mouseenter",function(){var e=this.childNodes[0].dataset.id;$("#m"+e+", a[data-id="+e+"], span[data-id="+e+"]").parent().addClass("sel")}).on("mouseleave",function(){var e=this.childNodes[0].dataset.id;$("#m"+e+", a[data-id="+e+"], span[data-id="+e+"]").parent().removeClass("sel")}),$(".categorie [data-id]").on("click",n).hide(0),$(".icon-cocher").on("click",cocher_utilisateurs).on("click",e),$('input[type="checkbox"]').on("click",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$("td:first-child").on("click",function(){$(this).parent().find("input").click()}),$("#ajoutprof").on("click",function(){$.ajax({url:"recup.php",method:"post",data:{action:"listeprofs"},dataType:"json",attente:"Récupération de la liste des professeurs",afficheform:function(e){if("ids"in e){popup($("#form-ajoutprof").html(),!0);var t=$("#fenetre"),n=e.ids,s=e.noms,o=e.matieres;for(cle in n)$("table",t).append('<tr><td data-id="'+n[cle]+'" data-matieres="'+o[cle]+'">'+s[cle]+"</td></tr>");$("td",t).on("click",function(){var n,e=$("#ajoutprof").parent().parent().next().clone(!0,!0);e[0].dataset.id="c"+this.dataset.id,n=this.dataset.matieres+",",$("td:first-child",e).text(this.textContent+" (Professeur)"),$(".icon-ferme",t).click(),$("thead span").each(function(){var t=this.id.substring(1);n.indexOf(","+t+",")>0?$("a[data-id="+t+"]",e).attr("title","Professeur dans cette matière").html("<strong>P</strong>").removeClass().parent().addClass("fixe"):$("a[data-id="+t+"]",e).attr("title","Établir l'association à la matière en tant que colleur").html("").removeClass().addClass("icon-nok").parent().removeClass("fixe")}),$("#ajoutprof").parent().parent().after(e)})}else popup(`<p class="annonce">Il n'y a aucun professeur à ajouter parmi les colleurs.</p>`,!0)}})});function e(){var t,e=$(this).parent().parent();e.hasClass("categorie")||(e=e.prevAll(".categorie").first()),t=e.nextUntil(".categorie").find(":checked"),t.length==0?$("[data-id]",e).hide(0):$("[data-id]",e).each(function(){var n=$(this).hasClass("icon-ok"),e=t.parent().prevAll().find('.icon-ok[data-id="'+this.getAttribute("data-id")+'"]').length<t.length/2;n!=e&&$(this).toggleClass("icon-ok icon-nok").attr("title",(e?"Établir":"Supprimer")+" l'association à la matière de tous les cochés")}).show(0)}function t(){if($(this).parent().hasClass("fixe"))switch(this.text){case"":popup(`<p class="annonce">Il n'est pas possible de supprimer l'association de cette matière avec cet utilisateur : des notes de colles ou des transferts de documents sont concernés. Il faut les supprimer avant de supprimer l'association utilisateur-matière.</p>`,!0);break;case"P":popup(`<p class="annonce">Il n'est pas possible de supprimer l'association de cette matière avec cet utilisateur : il est professeur (l'association est peut-être supprimable dans la partie «&nbsp;Professeurs&nbsp;»).</p>`,!0);break;case"C":popup(`<p class="annonce">Il n'est pas possible de supprimer l'association de cette matière avec cet utilisateur : il est colleur (l'association est peut-être supprimable dans la partie «&nbsp;Colleurs&nbsp;»).</p>`,!0)}else{var e=$(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-e},dataType:"json",el:$(this),fonction:function(t){t.toggleClass("icon-ok icon-nok").attr("title",(e?"Établir":"Supprimer")+" l'association à la matière")}})}}function n(){var e,t,n,s,o,a,r,i=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(i.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}s=i.parent().parent(),a=s.map(function(){return $(this).data("id")}).get().join(","),e=s.children(":first-of-type").map(function(){return $(this).text().split("(")[0].trim()}).get().join(", "),t=e.lastIndexOf(","),t>0&&(e=e.substring(0,t)+" et"+e.substring(t+1)),o=$(this).hasClass("icon-ok"),n=this.getAttribute("data-id"),r=o?"Vous allez établir l'association à la matière "+$("#m"+n).text()+" pour les comptes de "+e+". 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"+n).text()+" pour les comptes de "+e+`. Cela signifie que ces utilisateurs n'auront plus accès aux ressources liées à cette matière. Cela n'est possible que si cela ne supprime pas des contenus parmi les notes de colles ou les transferts de documents. Les utilisateurs pour lesquels l'association est matérialisée par un bouton <span class="icon-ok"></span> grisé ne seront pas traités.`,confirmation(r,this,function(){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs-matieres",ids:a,matiere:n,val:o|0},dataType:"json"})})}}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(){return!0}})}),$(".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(),!0);var n,e=$("#fenetre"),t=$(this);article=t.parent().parent(),$("table",e).attr("id","ugrp"),$("h3",e).append($(".editable",article).text()||$("input:first",article).val()),$(".icon-deplie",e).on("click",plie),$(".icon-cocher",e).on("click",cocher_utilisateurs),$("tr:not(.categorie)",e).on("click",function(e){$(e.target).is("input")||$(this).find("input").click()}),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),n=t.data("uids").toString(),$("#u"+n.replace(/,/g,",#u"),e).prop("checked",!0).change(),$(".icon-ok",e).on("click",function(){var n=$("input:checked",e).map(function(){return this.id.replace("u","")}).get().join(","),s=$("input:checked",e).parent().prev().map(function(){return this.textContent.split("(")[0].trim()}).get().join(", ")||"[Personne]";article.is("div")?($("#uids",article).val(n),t.data("uids",n),t.html(s+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>'),$("#fenetre, #fenetre_fond").remove()):$.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:"utilisateurs",id:article.data("id"),uids:n},dataType:"json",el:t,fonction:function(e){e.data("uids",n),e.html(s+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>'),$("#fenetre, #fenetre_fond").remove()}})})}function suppressionmultiple(){var n=$(this).data("type"),t=$(this).parent().find("h3").text(),s=$(this).parent().data("id"),e="";switch(n){case"infos":e="toutes les informations de la page <em>"+t+"</em>";break;case"progcolles":e="tous les programmes de colles de la matière <em>"+t+"</em>";break;case"cdt":e="tout le contenu du cahier de texte de la matière <em>"+t+"</em>";break;case"docs":e="tous les répertoires et documents de la matière <em>"+t+"</em>";break;case"notescolles":e="toutes les notes de la matière <em>"+t+"</em>";break;case"transferts":e="tous les transferts de documents personnels de la matière <em>"+t+"</em>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",e),this,function(e){$.ajax({url:"ajax.php",method:"post",data:"action="+$("body").data("action")+"&id="+s+"&supprime_"+n+"=1",dataType:"json",el:$(e),fonction:function(e){e.remove()}})})}$.fn.init_envoimail=function(){var e=$("#mail");$('input[type="file"]').attr("id","pj").on("change",function(){s=this,o=0,$('input[id^="nom"]').parent().remove();for(var s,o,t=0,a=s.files.length,n=0,i="";t<a;t++)n=s.files[t].size,o+=n,i=n<1048576?Math.floor(n/1024)+" ko":Math.floor(n/1048576)+" Mo",$(".ligne",e).last().after('<p class="ligne"><label for="nom'+t+'">Fichier '+(t+1)+"&nbsp;("+i+')&nbsp;: </label><input type="text" name="nom[]" id="nom'+t+'" value="" size="50"></p>'),$("#nom"+t).val(s.files[t].name),n>5*1048576&&$(".ligne",e).last().addClass("fichierlourd");$("#videpj,#infopj").toggle(!!s.files.length),$("#infotaillepj").toggle(o>20*1048576||!!$(".fichierlourd").length)}),$("#videpj").on("click",function(){$("#pj").wrap("<form>").closest("form").get(0).reset(),$("#pj").unwrap().removeClass("nepassortir nok").bloque().prev().removeClass("nepassortir nok"),$('input[id^="nom"]').parent().remove(),$("#videpj,#infopj,#infotaillepj").hide(0)}),$("#mat").on("change",function(){$("#rep").html(reps[this.value]).change()}),$("#rep").on("change",function(){$("#doc").html(docs[this.value]).change()}),$("#doc").on("change",function(){this.value<1?$("#liendoc").val("Copier le lien vers le document").prop("disabled",!0).off("click").removeClass("ok"):$("#liendoc").val("Copier le lien vers le document "+$("#doc :selected").text()).prop("disabled",!1).on("click",function(){var e=this.value;navigator.clipboard.writeText(window.location.href.replace(/mail.*/,"download?id="+$("#doc").val())).then($(this).addClass("ok").val("Copié !")).then(window.setTimeout(function(){$("#liendoc").val(e).removeClass("ok")},2e3))})}),$("#form-destinataires tr.gr input:checked").each(function(){$("#form-destinataires").find(".dest[value="+this.value.replace(/,/g,"],.dest[value=")+"]").prop("checked",!0)}),$("#form-destinataires tr:not(.gr) .dest:checked").length&&($('[name="id-copie"]').val($("#form-destinataires tr:not(.gr) .dest:checked").map(function(){return this.value}).get().join(",")),$("#maildest").text($("#form-destinataires tr:not(.gr) .dest:checked").parent().prev().map(function(){return this.textContent}).get().join(", "))),$("#form-destinataires input:checked").attr("checked",!1)};function destinatairesmail(){popup($("#form-destinataires").html(),!0);var t,e=$("#fenetre");$(".icon-deplie",e).on("click",plie),$("tr.plie_init",e).nextUntil(".categorie").hide(0).children().addClass("cache"),$("tr.plie_init",e).find(".icon-deplie").removeClass("icon-deplie").addClass("icon-plie"),$("tr:not(.gr) input.dest",e).attr("id",function(){return"u"+this.value}),$("tr:not(.categorie) td:nth-child(-n+2)",e).on("click",function(e){$(e.target).is("input")||$(this).parent().find("input:first").click()}),$('input[type="checkbox"]',e).on("change",function(){var t=$(this).parent().parent();this.checked&&t.find("input:not(."+this.className+")").prop("checked",!1),t.toggleClass("sel",t.find("input:checked").length>0),$(".nc",e).text($("tr:not(.gr) .dest:checked",e).length),$(".ncs",e).text($("tr:not(.gr) .dest:checked",e).length>1?"s":""),$(".ncc",e).text($("tr:not(.gr) .bcc:checked",e).length)}),t=$('[name="id-copie"]').val(),$("#u"+t.replace(/,/g,",#u")).prop("checked",!0).change(),t=$('[name="id-bcc"]').val(),$("#u"+t.replace(/,/g,",#u")).parent().next().children().prop("checked",!0).change(),$(".categorie a",e).on("click keyup",function(){var n,t=this.className.split(" ")[1],e=this.className.split(" ")[0]=="icon-cocher";$(this).parent().parent().nextUntil(".categorie").find("."+t+":not(:disabled)").prop("checked",e).change(),this.className=(e?"icon-decocher ":"icon-cocher ")+t,this.title=this.title.replace(e?"Cocher":"Décocher",e?"Décocher":"Cocher"),n=t=="dest"?"bcc":"dest",$(this).parent().parent().find(".icon-decocher."+n).each(function(){this.className="icon-cocher "+n,this.title="C"+this.title.substr(3)})}),$(".gr input",e).on("click",function(){var e=this.value;this.className=="dest"?$("#u"+e.replace(/,/g,",#u")).prop("checked",this.checked).change():$("#u"+e.replace(/,/g,",#u")).parent().next().children().prop("checked",this.checked).change()}),$('input[type="text"]',e).attr("id","recherche").on("input",function(){this.value.length>=2?($('tr:not(.categorie):not(:icontains("'+this.value+'"))',e).slice(1).hide(0),$('tr:not(.categorie):icontains("'+this.value+'")',e).show(0)):($("tr:not(.categorie)",e).filter(function(){return $(".cache",this).length}).hide(0),$("tr:not(.categorie)",e).filter(function(){return!$(".cache",this).length}).show(0))}),$(".icon-aide",e).on("click",function(){$("p.aide",e).toggle()}).click(),$(".icon-ok",e).on("click",function(){$('[name="id-copie"]').val($("tr:not(.gr) .dest:checked",e).map(function(){return this.value}).get().join(",")),$('[name="id-bcc"]').val($("tr:not(.gr) .bcc:checked",e).map(function(){return this.value}).get().join(","));var t=$("tr:not(.gr) .dest:checked",e).parent().prev().map(function(){return this.textContent}).get();t.length?$("textarea").next().show(0):(t=["Vous"],$("textarea").next().hide(0)),$("#maildest").text(t.concat($("tr:not(.gr) .bcc:checked",e).parent().prev().prev().map(function(){return this.textContent+" (CC)"}).get()).join(", ")||"[Personne]"),$("#fenetre, #fenetre_fond").remove()})}function envoimail(){return $('[name="sujet"]').val().length?$("#pj")[0].files.length?$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:"",fonction:function(){$("#log").hide(0);var t=new FormData($("#mail")[0]);$.ajax({url:"ajax.php",xhr:function(){var e,n,t=$.ajaxSettings.xhr();return t.upload&&$("#pj")[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),n=$("#load p").css("background"),e=0,t.upload.addEventListener("progress",function(t){t.lengthComputable&&(e=Math.round(t.loaded/t.total*100),$("#load span").html(" - "+e+"%"),$("#load p").css("background",n.replace(/0%/g,e+"%")))},!1)),t},method:"post",data:t,dataType:"json",contentType:!1,processData:!1})}}):$.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json"}):affiche("Il faut un sujet non vide pour envoyer le courriel.","nok"),!1}function init_envoimails(){var e=$("#envoimails");$("td",e).each(function(){var e=this.textContent.split("|");this.innerHTML=e[1]==1?'<a class="icon-ok" data-id="'+e[0]+`" title="Supprimer l'autorisation d'envoi"></a>`:'<a class="icon-nok" data-id="'+e[0]+`" title="Établir l'autorisation d'envoi"></a>`}),$("td a",e).on("click",function(){var e=$(this).hasClass("icon-nok")|0;$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",id:"mails",depuis:$(this).parent().parent().data("id"),vers:$(this).data("id"),val:e},dataType:"json",el:$(this),fonction:function(t){t.toggleClass("icon-ok icon-nok").attr("title",(e?"Établir":"Supprimer")+" l'autorisation d'envoi")}})}),$("th span",e).on("click",function(){var e=$(this).hasClass("icon-ok"),t=$(this).parent().parent();$.ajax({url:"ajax.php",method:"post",data:{action:"prefsglobales",id:"mails",depuis:t.data("id"),vers:0,val:e|0},dataType:"json",el:t,fonction:function(t){t.find("td a").toggleClass("icon-ok",e).toggleClass("icon-nok",!e).attr("title",(e?"Établir":"Supprimer")+" l'autorisation d'envoi")}})})}function relevecolles(){confirmation("<p>Vous allez réaliser une relève des déclarations 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(){$.ajax({url:"ajax.php",method:"post",data:"action=releve-colles&datemax="+$("#datemax").val(),dataType:"json"})})}$(function(){$("#icones a").length>2&&$("header h1").css("padding-right",(1+$("#icones a").length)*.6+"em"),$(".affichable").attr("title",function(){return($(this).data("title")||$("#aide-"+this.id).text()).replace(/(<([^>]+)>)/gi,"")}).on("click",affiche_titleplus),$("#icones .icon-lecture").reglagelecture(),$("a.formulaire").on("click",formulaire),$("a.icon-aide").on("click",function(){popup($("#aide-"+($(this).parent().data("action")||$("body").data("action"))).html(),!1)}),$("a.icon-ok").on("click",valide),$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime,a.icon-ajoutecolle,a.icon-comms").on("click",function(){window[this.className.substring(5)]($(this))}),$(".editable").editinplace(),$("form:visible").each(function(){$(this).find("input,select").not(".nonbloque").bloque().entreevalide($(this)),$('[name="couleur"]').each(function(){$(this).colpick()})}),$("p.titrecdt").editinplacecdt(),$(".cdt-raccourcis").init_cdt_raccourcis(),$("p.titreagenda").editinplaceagenda(),$("#transferts .icon-voir").on("click",function(){$("article[data-id="+$(this).parent().data("id")+"]").remove("flash").deplace_viewport().addClass("flash")}),$("article.transfert .icon-download").on("click",download_transfert),$(".icon-mailenvoi").on("click",envoimail),$("#maildest, #maildest + .icon-edite").on("click",destinatairesmail),$("form#mail").on("submit",envoimail).init_envoimail(),$("#rechercheutilisateurs input").on("input change",recherche_utilisateurs),$(".categorie th:first-child").prepend($('<span class="icon-deplie" title="Déplier/Replier cette catégorie"></span>').on("click",plie)),$("article select[multiple]").init_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").on("change",function(){$(this).parent().parent().find("input").prop("checked",this.value==0).change()}),$("#planning input").on("change",function(){this.checked&&($(this).parent().siblings().children("input").prop("checked",!1).change(),$(this).parent().siblings().children("select").val(0));var e=$(this).attr("name").substr(0,1);$("#n"+e).html($('input[name^="'+e+'"]:checked').length)}),$("#relevecolles").on("click",relevecolles)})
\ No newline at end of file
diff -urN cahier-de-prepa12.0.0/js/lecture.js cahier-de-prepa12.0.1/js/lecture.js
--- cahier-de-prepa12.0.0/js/lecture.js	2025-08-18 14:06:19.270213642 +0200
+++ cahier-de-prepa12.0.1/js/lecture.js	2025-08-28 00:30:03.463624757 +0200
@@ -142,8 +142,7 @@
     $('#epingle .icon-ferme').on("click",function() { $('#epingle').remove(); });
     // Bouton de validation
     $('#epingle .icon-download').on("click",function() {
-      var cases = $('input:checked',table);
-      if ( cases.length == 0 ) {
+      if ( $('input:checked',table).length == 0 ) {
         affiche('<p>Aucune case n\'est cochée.</p>','nok');
         return
       }
diff -urN cahier-de-prepa12.0.0/js/lecture.min.js cahier-de-prepa12.0.1/js/lecture.min.js
--- cahier-de-prepa12.0.0/js/lecture.min.js	2025-08-18 14:06:19.270213642 +0200
+++ cahier-de-prepa12.0.1/js/lecture.min.js	2025-08-28 00:30:03.463624757 +0200
@@ -1 +1 @@
-$(function(){$(".transfert button.icon-ok").on("click",function(e){e.preventDefault(),$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:$(this),fonction:function(e){var t=e.parent().parent(),n=new FormData(t[0]);n.append("id",t.parent().data("id")),$.ajax({url:"ajax.php",xhr:function(){var t,s,n=$.ajaxSettings.xhr();return $("#log").hide(0),n.upload&&e.prev()[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),s=$("#load p").css("background"),t=0,n.upload.addEventListener("progress",function(e){e.lengthComputable&&(t=Math.round(e.loaded/e.total*100),$("#load span").html(" - "+t+"%"),$("#load p").css("background",s.replace(/0%/g,t+"%")))},!1)),n},method:"post",data:n,dataType:"json",contentType:!1,processData:!1})}})}),$(".transfert a span").parent().css("cursor","pointer").on("click",function(){$(this).siblings(".icon-download").click()}),$(".transfert a.icon-download").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:$(this).parent(),fonction:function(e){$("#log").hide(0),window.location.href="transferts.php?dl="+e.data("id")+"&t="+e.parent().data("id")+"&verif="+e.data("verif")}})}),$(".transfert a.icon-supprime").on("click",function(){var e=$(this).parent();popup(`<h3>Demande de confirmation</h3><p>Vous allez supprimer un document que vous avez envoyé. Vos professeurs/colleurs qui pouvaient le voir ne pourront plus le récupérer après cela. Cette action n'est pas annulable.</p><p class="confirmation"><button class="icon-ok"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule"></button></p>`,!0),$("#fenetre .icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:{action:"suppr-transdocs",id:e.data("id"),transfert:e.parent().data("id")},dataType:"json",el:e,fonction:function(e){e.remove()}}),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}),$("#parentsdoc a.icon-downloadrep").on("click",function(){$("#epingle").remove(),$(`<article id="epingle"><a class="icon-ferme" title="Fermer"></a><a class="icon-download" title="Valider"></a>       <h3 class="edition">Télécharger le contenu d'un répertoire</h3>       <form><table><thead><tr><th>Nom</th><th class="icones"><a class="icon-cocher" title="Tout cocher"></a></th></tr></thead><tbody></tbody></table>       </form></article>`).prependTo($("section")).append($("#aide-download").html());var e=$("#epingle table");$("section > p[data-id]").each(function(){var t=$(this);t.hasClass("rep")?e.append('<tr><td><span class="icon-rep"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="reps[]" value="'+t.data("id")+'"></td></tr>'):e.append('<tr><td><span class="icon-doc"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="docs[]" value="'+t.data("id")+'"></td></tr>')}),$("#iconesmenu .icon-connexion").length&&$("#epingle form").append('<input type="hidden" name="auto0" value="1">'),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$(".icon-cocher",e).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",e).prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()}),$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()}),$("#epingle .icon-download").on("click",function(){var t,n=$("input:checked",e);if(n.length==0){affiche("<p>Aucune case n'est cochée.</p>","nok");return}$("body").data("async",!0),affiche("Récupération de la liste des documents","ok"),t=$("#parentsdoc a.icon-downloadrep").data("id"),$.ajax({url:"recup.php",method:"post",data:"action=download-rep&id="+t+"&"+$("#epingle form").serialize(),dataType:"json",afficheform:async function(e){var n,s,o,a,r,c,l,i=e.dids.split(","),d=e.verifs.split(","),u=e.taille;if(i.length){$("#log").hide(0),$("#load").html('<p>Téléchargement en cours<span></span></p><img src="js/ajax-loader.gif">').show(0),a=[],r=0;try{for(c=$("#load p").css("background"),o=0,n=0;n<i.length;n++)a[n]=await fetch("download?zip&r="+t+"&d="+i[n]+"&verif="+d[n]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:i,value:s}=await n.read(),t,n;if(i)break;t.push(s),r+=s.length,o=Math.min(100,Math.round(r/u*100)),$("#load span").html(" - "+o+"%"),$("#load p").css("background",c.replace(/0%/g,o+"%"))}if(e.headers.get("Content-Length")==="0")return;return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",c.replace(/0%/g,"100%")),l=await downloadZip(a).blob(),s=document.createElement("a"),s.href=URL.createObjectURL(l),s.download=e.nom+".zip",$("#load").fadeOut(),$("body").data("async",!1),s.click(),URL.revokeObjectURL(s.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}else affiche("Il n'y a rien à télécharger par ici.","nok"),$("#load").fadeOut(),$("body").data("async",!1)}})}),$("#epingle").deplace_viewport()})})
\ No newline at end of file
+$(function(){$(".transfert button.icon-ok").on("click",function(e){e.preventDefault(),$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:$(this),fonction:function(e){var t=e.parent().parent(),n=new FormData(t[0]);n.append("id",t.parent().data("id")),$.ajax({url:"ajax.php",xhr:function(){var t,s,n=$.ajaxSettings.xhr();return $("#log").hide(0),n.upload&&e.prev()[0].files.length>0&&($("#load").html('<p>Transfert en cours<span></span></p><img src="js/ajax-loader.gif">'),s=$("#load p").css("background"),t=0,n.upload.addEventListener("progress",function(e){e.lengthComputable&&(t=Math.round(e.loaded/e.total*100),$("#load span").html(" - "+t+"%"),$("#load p").css("background",s.replace(/0%/g,t+"%")))},!1)),n},method:"post",data:n,dataType:"json",contentType:!1,processData:!1})}})}),$(".transfert a span").parent().css("cursor","pointer").on("click",function(){$(this).siblings(".icon-download").click()}),$(".transfert a.icon-download").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"verifconnexion=1",dataType:"json",el:$(this).parent(),fonction:function(e){$("#log").hide(0),window.location.href="transferts.php?dl="+e.data("id")+"&t="+e.parent().data("id")+"&verif="+e.data("verif")}})}),$(".transfert a.icon-supprime").on("click",function(){var e=$(this).parent();popup(`<h3>Demande de confirmation</h3><p>Vous allez supprimer un document que vous avez envoyé. Vos professeurs/colleurs qui pouvaient le voir ne pourront plus le récupérer après cela. Cette action n'est pas annulable.</p><p class="confirmation"><button class="icon-ok"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule"></button></p>`,!0),$("#fenetre .icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:{action:"suppr-transdocs",id:e.data("id"),transfert:e.parent().data("id")},dataType:"json",el:e,fonction:function(e){e.remove()}}),$("#fenetre,#fenetre_fond").remove()}),$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}),$("#parentsdoc a.icon-downloadrep").on("click",function(){$("#epingle").remove(),$(`<article id="epingle"><a class="icon-ferme" title="Fermer"></a><a class="icon-download" title="Valider"></a>       <h3 class="edition">Télécharger le contenu d'un répertoire</h3>       <form><table><thead><tr><th>Nom</th><th class="icones"><a class="icon-cocher" title="Tout cocher"></a></th></tr></thead><tbody></tbody></table>       </form></article>`).prependTo($("section")).append($("#aide-download").html());var e=$("#epingle table");$("section > p[data-id]").each(function(){var t=$(this);t.hasClass("rep")?e.append('<tr><td><span class="icon-rep"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="reps[]" value="'+t.data("id")+'"></td></tr>'):e.append('<tr><td><span class="icon-doc"></span>&nbsp;'+t.find("span.nom").text()+'</td><td class="icones"><input type="checkbox" name="docs[]" value="'+t.data("id")+'"></td></tr>')}),$("#iconesmenu .icon-connexion").length&&$("#epingle form").append('<input type="hidden" name="auto0" value="1">'),$("input",e).on("change",function(){$(this).parent().parent().toggleClass("sel",this.checked)}),$(".icon-cocher",e).on("click",function(){$(this).toggleClass("icon-cocher icon-decocher"),$("input",e).prop("checked",$(this).hasClass("icon-decocher")).change()}),$("tr",e).find("td:not(:last-child)").on("click",function(){$(this).parent().find("input").click().change()}),$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()}),$("#epingle .icon-download").on("click",function(){if($("input:checked",e).length==0){affiche("<p>Aucune case n'est cochée.</p>","nok");return}$("body").data("async",!0),affiche("Récupération de la liste des documents","ok");var t=$("#parentsdoc a.icon-downloadrep").data("id");$.ajax({url:"recup.php",method:"post",data:"action=download-rep&id="+t+"&"+$("#epingle form").serialize(),dataType:"json",afficheform:async function(e){var n,s,o,a,r,c,l,i=e.dids.split(","),d=e.verifs.split(","),u=e.taille;if(i.length){$("#log").hide(0),$("#load").html('<p>Téléchargement en cours<span></span></p><img src="js/ajax-loader.gif">').show(0),a=[],r=0;try{for(c=$("#load p").css("background"),o=0,n=0;n<i.length;n++)a[n]=await fetch("download?zip&r="+t+"&d="+i[n]+"&verif="+d[n]).then(async function(e){for(n=e.body.getReader(),t=[];!0;){var{done:i,value:s}=await n.read(),t,n;if(i)break;t.push(s),r+=s.length,o=Math.min(100,Math.round(r/u*100)),$("#load span").html(" - "+o+"%"),$("#load p").css("background",c.replace(/0%/g,o+"%"))}if(e.headers.get("Content-Length")==="0")return;return{name:decodeURIComponent(e.headers.get("Content-Disposition").split('="')[1]).slice(0,-1),input:new Blob(t)}});$("#load span").html(" - 100%"),$("#load p").css("background",c.replace(/0%/g,"100%")),l=await downloadZip(a).blob(),s=document.createElement("a"),s.href=URL.createObjectURL(l),s.download=e.nom+".zip",$("#load").fadeOut(),$("body").data("async",!1),s.click(),URL.revokeObjectURL(s.href)}catch(e){affiche("Il y a eu une erreur pendant le téléchargement. Vous devriez prévenir l'administrateur. Le message d'erreur est « "+e.message+" »","nok"),$("#load").fadeOut(),$("body").data("async",!1)}}else affiche("Il n'y a rien à télécharger par ici.","nok"),$("#load").fadeOut(),$("body").data("async",!1)}})}),$("#epingle").deplace_viewport()})})
\ No newline at end of file
diff -urN cahier-de-prepa12.0.0/mail.php cahier-de-prepa12.0.1/mail.php
--- cahier-de-prepa12.0.0/mail.php	2025-08-22 16:45:05.056449590 +0200
+++ cahier-de-prepa12.0.1/mail.php	2025-08-26 00:55:22.823607310 +0200
@@ -132,7 +132,7 @@
       <p class="ligne"><label for="pj">Pièces jointes éventuelles&nbsp;: </label><input type="file" name="pj[]" multiple></p>
       <input id="videpj" class="ligne" type="button" value="Vider la liste des pièces jointes" style="display: none;">
       <p id="infopj" class="annonce" style="display: none;"><?php echo $annonce; ?></p>
-      <p id="infotaillepj" class="annonce" style="display: none;">Les fichiers envoyés par courriel ne doivent pas dépasser <strong>5&nbsp;Mo</strong>.</p>
+      <p id="infotaillepj" class="annonce" style="display: none;">Les fichiers envoyés par courriel ne doivent pas dépasser <strong>5&nbsp;Mo chacun</strong> et <strong>20&nbsp;Mo au total</strong>.</p>
       <input type="hidden" name="id-copie" value="">
       <input type="hidden" name="id-bcc" value="">
       <input type="hidden" name="action" value="courriel">
diff -urN cahier-de-prepa12.0.0/MAJSQL.sql cahier-de-prepa12.0.1/MAJSQL.sql
--- cahier-de-prepa12.0.0/MAJSQL.sql	2025-08-17 02:19:52.815306570 +0200
+++ cahier-de-prepa12.0.1/MAJSQL.sql	2025-08-26 23:37:58.069124339 +0200
@@ -741,3 +741,12 @@
 
 ALTER TABLE reps
   ADD zip TINYINT(1) UNSIGNED NOT NULL;
+
+--
+-- Voilà les modifications à effectuer sur chaque base pour passer de Cahier de
+-- Prépa 12.0.0 à Cahier de Prépa 12.0.1
+--
+
+ALTER table utilisateurs
+  CHANGE mail mail VARCHAR(60) NOT NULL;
+
diff -urN cahier-de-prepa12.0.0/notescolles.php cahier-de-prepa12.0.1/notescolles.php
--- cahier-de-prepa12.0.0/notescolles.php	2025-08-17 01:37:38.634644795 +0200
+++ cahier-de-prepa12.0.1/notescolles.php	2025-08-27 15:51:25.251167045 +0200
@@ -316,7 +316,7 @@
 
 // Récupération de l'ensemble des élèves associés à la matière
 $resultat = $mysqli->query("SELECT id, IF(LENGTH(nom),CONCAT(nom,' ',prenom),login) AS nomcomplet,
-                            IF(LENGTH(nom),CONCAT(LEFT(prenom,1),'. ',nom),login) AS initiale, IF(mdp>'0',1,0) AS actif
+                            IF(LENGTH(nom),CONCAT(LEFT(prenom,1),'. ',nom),login) AS initiale, IF(mdp > '0', 1, 0) AS actif
                             FROM utilisateurs WHERE autorisation = 2 AND FIND_IN_SET($mid,matieres) ORDER BY IF(LENGTH(nom),nom,login)");
 $eleves = array();
 while ( $r = $resultat->fetch_assoc() )
diff -urN cahier-de-prepa12.0.0/notescolles-tableau.php cahier-de-prepa12.0.1/notescolles-tableau.php
--- cahier-de-prepa12.0.0/notescolles-tableau.php	2025-08-16 11:42:55.730216368 +0200
+++ cahier-de-prepa12.0.1/notescolles-tableau.php	2025-08-27 15:51:58.693798331 +0200
@@ -52,14 +52,14 @@
 
 // Élèves actifs
 if ( isset($_REQUEST['elevesactifs']) && $_REQUEST['elevesactifs'] )  {
-  $elevesactifs = 'AND mdp>\'0\'';
+  $elevesactifs = 'AND mdp > \'0\'';
   $mentionnom = '';
   $ea = 1;
   $select_ea = "\n        <option value=\"0\">Voir tous les élèves</option>\n        <option value=\"1\" selected>Voir seulement les élèves actifs</option>";
 }
 else  {
   $elevesactifs = '';
-  $mentionnom = ',IF(mdp>\'0\',\'\',\' (compte désactivé)\')';
+  $mentionnom = ',IF(mdp > \'0\', \'\', \' (compte désactivé)\')';
   $ea = 0;
   $select_ea = "\n        <option value=\"0 selected\">Voir tous les élèves</option>\n        <option value=\"1\">Voir seulement les élèves actifs</option>";
 }
diff -urN cahier-de-prepa12.0.0/planning.php cahier-de-prepa12.0.1/planning.php
--- cahier-de-prepa12.0.0/planning.php	2025-08-17 01:22:44.881383772 +0200
+++ cahier-de-prepa12.0.1/planning.php	2025-08-25 13:07:57.258521547 +0200
@@ -64,12 +64,16 @@
                                    colle, vacances, '. ( $_SESSION['admin'] ? 'COUNT(semaine)' : '1' ) .' AS readonly
                             FROM semaines LEFT JOIN (SELECT DISTINCT semaine FROM notescolles UNION SELECT DISTINCT semaine FROM progcolles ) AS np ON semaine = id
                             GROUP BY id ORDER BY id');
+$nc = $no = 0;
 while ( $r = $resultat->fetch_assoc() )  {
   $select = str_replace("\"${r['vacances']}\"","\"${r['vacances']}\" selected",$select_vacances);
   $r['jour'] = $semaine[$r['jour']];
   $readonly = ( $r['readonly'] > 0 ) ? ' disabled' : '';
-  $colle = ( $r['colle'] == 1 ) ? ' checked' : '';
-  $oral = ( $r['colle'] == 2 ) ? ' checked' : '';
+  $colle = $oral = '';
+  switch ( $r['colle'] )  {
+    case 1: $colle = ' checked'; $nc += 1; break;
+    case 2: $oral  = ' checked'; $no += 1; break;
+  }
   echo <<<FIN
           <tr>
             <td>${r['jour']} ${r['debut']}</td>
@@ -84,6 +88,7 @@
 
 // Fin du formulaire
 ?>
+          <tr><td>Total cochées</td><td id="nc"><?php echo $nc; ?></td><td id="no"><?php echo $no; ?></td><td></td></tr>
         </tbody>
       </table>
     </form>
diff -urN cahier-de-prepa12.0.0/recup.php cahier-de-prepa12.0.1/recup.php
--- cahier-de-prepa12.0.0/recup.php	2025-08-18 11:06:36.316403455 +0200
+++ cahier-de-prepa12.0.1/recup.php	2025-08-29 01:33:40.768813252 +0200
@@ -20,8 +20,8 @@
   exit("{\"val\":${r[0]}}");
 }
 
-// Reconnexion demandée si déconnecté
-if ( !$autorisation && isset($_REQUEST['auto0']) && ( $_REQUEST['action'] != 'download-rep' ) )
+// Reconnexion demandée si déconnecté, sauf pour le téléchargement de répertoire
+if ( !$autorisation || isset($_REQUEST['auto0']) && ( $_REQUEST['action'] != 'download-rep' ) )
   exit('{"etat":"login"}'); 
 
 // Récupération de l'action
@@ -140,6 +140,8 @@
   // qui évite la gestion de l'accès dans download.php
   // On prend la protection et la dispo du document dans le code de vérif, et 
   // l'id du parent et sa valeur zip : si ça change, le code est caduque.
+  if ( !$requete )
+    exit('{"etat":"nok","message":"Aucun document à télécharger"}');
   if ( $requete_protection ) 
     $requete_protection .= ' AND dispo < NOW()';
   $resultat = $mysqli->query("SELECT id, lien, taille, protection, dispo, rid, zip
diff -urN cahier-de-prepa12.0.0/transferts.php cahier-de-prepa12.0.1/transferts.php
--- cahier-de-prepa12.0.0/transferts.php	2025-08-22 15:46:50.811193818 +0200
+++ cahier-de-prepa12.0.1/transferts.php	2025-08-26 21:07:52.125317764 +0200
@@ -39,12 +39,22 @@
   $editionjs = true;
 }
 
+//////////////////
+// Autorisation //
+//////////////////
+$mysqli = connectsql();
+// Accès aux professeurs, lycée, colleurs, élèves connectés uniquement
+if ( !$autorisation )  {
+  $titre = 'Transferts de documents personnels';
+  $actuel = false;
+  include('login.php');
+}
+
 ////////////////////////////////
 // Récupération d'un document //
 ////////////////////////////////
 if ( ctype_digit($id = $_REQUEST['dl'] ?? '') && ctype_digit($tid = $_REQUEST['t'] ?? '') && isset($_REQUEST['verif']) && ( $verif = $_REQUEST['verif'] )
   || strpos($id,',') && ( count($params = explode(',',$id)) == 3 ) && ( list($id,$tid,$verif) = $params ) && ctype_digit($id) && ctype_digit($tid) ) {
-  $mysqli = connectsql();
   
   // Pas en mode lecture
   if ( $mode_lecture )  {
@@ -167,17 +177,6 @@
   exit();
 }
 
-//////////////////
-// Autorisation //
-//////////////////
-$mysqli = connectsql();
-// Accès aux professeurs, lycée, colleurs, élèves connectés uniquement
-if ( !$autorisation )  {
-  $titre = 'Transferts de documents personnels';
-  $actuel = false;
-  include('login.php');
-}
-
 // Table étendue des matières
 $resultat = $mysqli->query('SELECT GROUP_CONCAT(val) FROM prefs WHERE nom LIKE "transferts%" ORDER BY nom');
 list($transferts,$protection) = explode(',',$resultat->fetch_row()[0]);
diff -urN cahier-de-prepa12.0.0/utilisateurs-mails.php cahier-de-prepa12.0.1/utilisateurs-mails.php
--- cahier-de-prepa12.0.0/utilisateurs-mails.php	2023-08-31 03:51:23.680466428 +0200
+++ cahier-de-prepa12.0.1/utilisateurs-mails.php	2025-08-27 15:54:51.058894508 +0200
@@ -36,7 +36,7 @@
   // Recherche des utilisateurs concernés : comptes validés hors comptes invités
   // et hors comptes sans nom et sans mail (identifiant seul)
   $resultat = $mysqli->query('SELECT nom, prenom, IF(LENGTH(mail),mail,"Pas d\'adresse") AS mail, autorisation%10 AS autorisation FROM utilisateurs
-                              WHERE mdp > \'0\' AND autorisation > 1 AND nom > \'\' OR prenom > \'\' OR mail > \'\'
+                              WHERE mdp > \'0\' AND autorisation > 1 AND nom > \'\' OR prenom > \'\' OR mail != \'\'
                               ORDER BY autorisation DESC, IF(LENGTH(nom),CONCAT(nom,prenom),login)');
   $mysqli->close();
   if ( $resultat->num_rows )  {
diff -urN cahier-de-prepa12.0.0/utilisateurs.php cahier-de-prepa12.0.1/utilisateurs.php
--- cahier-de-prepa12.0.0/utilisateurs.php	2025-08-22 23:36:03.597990207 +0200
+++ cahier-de-prepa12.0.1/utilisateurs.php	2025-08-27 15:54:27.698152867 +0200
@@ -46,7 +46,7 @@
   $resultat = $mysqli->query('SELECT u.nom, prenom, IF(LENGTH(mail),mail,"Pas d\'adresse") AS mail, autorisation%10 AS autorisation,
                               autorisation > 10 AS admin, GROUP_CONCAT(m.nom ORDER BY m.ordre SEPARATOR \', \') AS mats 
                               FROM utilisateurs AS u JOIN matieres AS m ON FIND_IN_SET(m.id,u.matieres)
-                              WHERE mdp > \'0\' AND autorisation > 1 AND u.nom > \'\' OR prenom > \'\' OR mail > \'\'
+                              WHERE mdp > \'0\' AND autorisation > 1 AND u.nom > \'\' OR prenom > \'\' OR mail != \'\'
                               GROUP BY u.id ORDER BY autorisation DESC, IF(LENGTH(u.nom),CONCAT(u.nom,prenom),login)');
   $mysqli->close();
   if ( $resultat->num_rows )  {
