diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/ajax.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/ajax.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/ajax.php	2015-09-20 21:45:42.138241645 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/ajax.php	2015-10-24 02:45:24.000000000 +0200
@@ -27,7 +27,7 @@
       $_SESSION['autorisation'] = $autorisation = $r['autorisation'];
       $_SESSION['matieres'] = $r['matieres'];
       $_SESSION['timeout'] = $r['timeout'];
-      $_SESSION['time'] = time()+$_SESSION['timeout'];
+      $_SESSION['time'] = time()+$_SESSION['timeout']+14400*($_SESSION['timeout'] == 0);
       // Pour sécurisation des requêtes AJAX
       $_SESSION['csrf-token'] = ( isset($_REQUEST['csrf-token']) ) ? $_REQUEST['csrf-token'] : md5(uniqid(rand(), true)); 
       break;
@@ -51,7 +51,7 @@
   exit($_SESSION['message'] = '{"etat":"ok","message":"Déconnexion réussie"}');
 }
 // Vérification du token CSRF
-if ( !isset($_REQUEST['csrf-token']) || ( $_REQUEST['csrf-token'] != $_SESSION['csrf-token'] ) )
+if ( !isset($_REQUEST['csrf-token']) || isset($_SESSION['csrf-token']) && ( $_REQUEST['csrf-token'] != $_SESSION['csrf-token'] ) )
   exit('{"etat":"nok","message":"Accès non autorisé"}');
 // Si non autorisé, la session a dû expirer : il faut se reconnecter
 if ( !$autorisation )
@@ -130,75 +130,127 @@
   }
 }
 
+if ( $autorisation > 2 )  {
 /////////////////////////////////////////
 // Accès colleur et professeur : notes //
 /////////////////////////////////////////
-elseif ( ( $autorisation > 2 ) and ( isset($_REQUEST['notes']) or isset($_REQUEST['supprime']) and ( $_REQUEST['table'] == 'notes' ) ) and isset($_REQUEST['id']) and preg_match('/\d*-\d*/',$_REQUEST['id']) )  {
-  // id : semaine-matiere
-  list($semaine,$matiere) = explode('-',$_REQUEST['id']);
-
-  // Vérification que l'identifiant est valide
-  $resultat = $mysqli->query("SELECT SUM(colleur = ${_SESSION['id']}) AS n, GROUP_CONCAT(IF(colleur != ${_SESSION['id']},n.eleve,NULL)) AS eleves
-                              FROM semaines AS s LEFT JOIN (SELECT * FROM notes WHERE matiere = ${matiere['id']}) AS n ON n.semaine = s.id
-                              WHERE s.id = $semaine AND s.colle GROUP BY s.id");
-  if ( in_array($matiere,explode(',',$_SESSION['matieres'])) && ( $resultat->num_rows ) )  {
-    $r = $resultat->fetch_assoc();
-    $resultat->free();
-    // Suppression
-    if ( isset($_REQUEST['supprime']) )
-      $message = ( requete('notes',"DELETE FROM notes WHERE semaine = $semaine AND colleur = ${_SESSION['id']} AND matiere = $matiere",$mysqli) ) ? "{\"etat\":\"ok\",\"message\":\"${r['n']} notes supprimées\"}" : '{"etat":"nok","message":"Les notes à supprimer n\'ont pas pu l\'être. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
+  if ( ( isset($_REQUEST['notes']) or isset($_REQUEST['supprime']) and ( $_REQUEST['table'] == 'notes' ) ) and isset($_REQUEST['id']) and preg_match('/\d*-\d*/',$_REQUEST['id']) )  {
+    // id : semaine-matiere
+    list($semaine,$matiere) = explode('-',$_REQUEST['id']);
 
-    // Ajout/Modification
-    else  {
-      $dejanotes = explode(',',$r['eleves']);
-      $effacer = $r['n'];
-      // Récupération des élèves associés à la matière
-      $resultat = $mysqli->query("SELECT GROUP_CONCAT(id) FROM utilisateurs WHERE autorisation = 2 AND FIND_IN_SET($matiere,matieres)");
-      $r = $resultat->fetch_row();
+    // Vérification que l'identifiant est valide
+    $resultat = $mysqli->query("SELECT SUM(colleur = ${_SESSION['id']}) AS n, GROUP_CONCAT(IF(colleur != ${_SESSION['id']},n.eleve,NULL)) AS eleves
+                                FROM semaines AS s LEFT JOIN (SELECT * FROM notes WHERE matiere = $matiere) AS n ON n.semaine = s.id
+                                WHERE s.id = $semaine AND s.colle GROUP BY s.id");
+    if ( in_array($matiere,explode(',',$_SESSION['matieres'])) && ( $resultat->num_rows ) )  {
+      $r = $resultat->fetch_assoc();
       $resultat->free();
-      $eleves = explode(',',$r[0]);
-      // Remarque : le zéro dans la liste cause un bug, car 0=="str" est vrai
-      $notes = array("1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","0,5","1,5","2,5","3,5","4,5","5,5","6,5","7,5","8,5","9,5","10,5","11,5","12,5","13,5","14,5","15,5","16,5","17,5","18,5","19,5","abs");
-      $requete = array();
-      // Vérification des notes envoyées et préparation de la requête
-      foreach ( $_REQUEST AS $eleve => $note )
-        if ( in_array($eleve=substr($eleve,1),$eleves) && in_array($note, $notes,true) && !in_array($eleve,$dejanotes) )
-          $requete[] = "($semaine,$eleve,${_SESSION['id']},$matiere,'$note')";
-      // Suppression des notes de la semaine à modifier
-      if ( $effacer )
-        requete('notes',"DELETE FROM notes WHERE semaine = $semaine AND colleur = ${_SESSION['id']} AND matiere = $matiere",$mysqli);
-      // Ajout
-      $message = $_SESSION['message'] = requete('notes','INSERT INTO notes (semaine,eleve,colleur,matiere,note) VALUES '.implode(',',$requete),$mysqli) ? '{"etat":"ok","message":"'.count($requete).' notes '.(($effacer)?'modifiées':'ajoutées').'"}' : '{"etat":"nok","message":"Aucune note n\'a pu être ajoutée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
+      // Suppression
+      if ( isset($_REQUEST['supprime']) )
+        $message = ( requete('notes',"DELETE FROM notes WHERE semaine = $semaine AND colleur = ${_SESSION['id']} AND matiere = $matiere",$mysqli) ) ? "{\"etat\":\"ok\",\"message\":\"${r['n']} notes supprimées\"}" : '{"etat":"nok","message":"Les notes à supprimer n\'ont pas pu l\'être. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
+
+      // Ajout/Modification
+      else  {
+        $dejanotes = explode(',',$r['eleves']);
+        $effacer = $r['n'];
+        // Récupération des élèves associés à la matière
+        $resultat = $mysqli->query("SELECT GROUP_CONCAT(id) FROM utilisateurs WHERE autorisation = 2 AND FIND_IN_SET($matiere,matieres)");
+        $r = $resultat->fetch_row();
+        $resultat->free();
+        $eleves = explode(',',$r[0]);
+        $notes = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','0,5','1,5','2,5','3,5','4,5','5,5','6,5','7,5','8,5','9,5','10,5','11,5','12,5','13,5','14,5','15,5','16,5','17,5','18,5','19,5','abs');
+        $requete = array();
+        // Vérification des notes envoyées et préparation de la requête
+        foreach ( $_REQUEST AS $eleve => $note )
+          if ( in_array($eleve=substr($eleve,1),$eleves) && in_array($note, $notes,true) && !in_array($eleve,$dejanotes) )
+            $requete[] = "($semaine,$eleve,${_SESSION['id']},$matiere,'$note')";
+        // Suppression des notes de la semaine à modifier
+        if ( $effacer )
+          requete('notes',"DELETE FROM notes WHERE semaine = $semaine AND colleur = ${_SESSION['id']} AND matiere = $matiere",$mysqli);
+        // Ajout
+        $message = $_SESSION['message'] = requete('notes','INSERT INTO notes (semaine,eleve,colleur,matiere,note) VALUES '.implode(',',$requete),$mysqli) ? '{"etat":"ok","message":"'.count($requete).' notes '.(($effacer)?'modifiées':'ajoutées').'"}' : '{"etat":"nok","message":"Aucune note n\'a pu être ajoutée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
+      }
+      // Mise à jour des champs 'notes' dans la table 'matieres' (pour le menu)
+      $mysqli->query('UPDATE matieres SET notes = IF((SELECT id FROM notes WHERE matiere = matieres.id LIMIT 1),1,0)');
     }
-    // Mise à jour des champs 'notes' dans la table 'matieres' (pour le menu)
-    $mysqli->query('UPDATE matieres SET notes = IF((SELECT id FROM notes WHERE matiere = matieres.id LIMIT 1),1,0)');
+    else 
+      $message = '{"etat":"nok","message":"Identifiant non valide"}';
   }
-  else 
-    $message = '{"etat":"nok","message":"Identifiant non valide"}';
-}
 
 //////////////////////////////////////////////////////////////////
 // Accès colleur et professeur : mailexp, mail (depuis mail.php)//
 //////////////////////////////////////////////////////////////////
-elseif ( ( $autorisation > 2 ) and isset($_REQUEST['table']) and ( $_REQUEST['table'] == 'mailprefs' ) && isset($_REQUEST['champ']) && isset($_REQUEST['val']) )  {
-  if ( !strlen($val = $_REQUEST['val']) )
-    $message = '{"etat":"nok","message":"Cette valeur ne peut pas être vide."}';
-  elseif ( $_REQUEST['champ'] == 'mailexp' )
-    $message = ( requete('utilisateurs','UPDATE utilisateurs SET mailexp = "'.$mysqli->real_escape_string($val)."\" WHERE id = ${_SESSION['id']}",$mysqli) ) ? '{"etat":"ok","message":"Nom d\'expéditeur modifié"}' : '{"etat":"nok","message":"Le nom d\'expéditeur n\'a pas pu être modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
-  elseif ( ( $_REQUEST['champ'] == 'mailcopy' ) && in_array($val,array(0,1)) )
-    $message = ( requete('utilisateurs',"UPDATE utilisateurs SET mailcopy = $val WHERE id = ${_SESSION['id']}",$mysqli) ) ? '{"etat":"ok","message":"Mise en copie modifiée"}' : '{"etat":"nok","message":"La mise en copie n\'a pas pu être modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
-  else  {
-    if ( !filter_var($val,FILTER_VALIDATE_EMAIL) )
-      $message = '{"etat":"nok","message":"Adresse mail non valide"}';
+  elseif ( isset($_REQUEST['table']) and ( $_REQUEST['table'] == 'mailprefs' ) && isset($_REQUEST['champ']) && isset($_REQUEST['val']) )  {
+    if ( !strlen($val = $_REQUEST['val']) )
+      $message = '{"etat":"nok","message":"Cette valeur ne peut pas être vide."}';
+    elseif ( $_REQUEST['champ'] == 'mailexp' )
+      $message = ( requete('utilisateurs','UPDATE utilisateurs SET mailexp = "'.$mysqli->real_escape_string($val)."\" WHERE id = ${_SESSION['id']}",$mysqli) ) ? '{"etat":"ok","message":"Nom d\'expéditeur modifié"}' : '{"etat":"nok","message":"Le nom d\'expéditeur n\'a pas pu être modifié. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
+    elseif ( ( $_REQUEST['champ'] == 'mailcopy' ) && in_array($val,array(0,1)) )
+      $message = ( requete('utilisateurs',"UPDATE utilisateurs SET mailcopy = $val WHERE id = ${_SESSION['id']}",$mysqli) ) ? '{"etat":"ok","message":"Mise en copie modifiée"}' : '{"etat":"nok","message":"La mise en copie n\'a pas pu être modifiée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
     else  {
-      // Mail : vérification qu'il n'existe pas déjà
-      $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) AS mails FROM utilisateurs WHERE id != ${_SESSION['id']} AND LENGTH(mail)");
-      $s = $resultat->fetch_assoc();
-      $resultat->free();
-      if ( in_array($mail = strtolower($mysqli->real_escape_string($val)),explode(',',$s['mails'])) )
-        $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
-      elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mail = '$mail' WHERE id = ${_SESSION['id']}",$mysqli) )
-        $message = '{"etat":"ok","message":"Adresse mail modifiée"}';
+      if ( !filter_var($val,FILTER_VALIDATE_EMAIL) )
+        $message = '{"etat":"nok","message":"Adresse mail non valide"}';
+      else  {
+        // Mail : vérification qu'il n'existe pas déjà
+        $resultat = $mysqli->query("SELECT GROUP_CONCAT(mail) AS mails FROM utilisateurs WHERE id != ${_SESSION['id']} AND LENGTH(mail)");
+        $s = $resultat->fetch_assoc();
+        $resultat->free();
+        if ( in_array($mail = strtolower($mysqli->real_escape_string($val)),explode(',',$s['mails'])) )
+          $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
+        elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mail = '$mail' WHERE id = ${_SESSION['id']}",$mysqli) )
+          $message = '{"etat":"ok","message":"Adresse mail modifiée"}';
+      }
+    }
+  }
+
+/////////////////////////////////////////////////
+// Accès colleur et professeur : envoi de mail //
+/////////////////////////////////////////////////
+  elseif ( isset($_REQUEST['envoimail']) && isset($_REQUEST['id-copie']) && isset($_REQUEST['sujet']) && isset($_REQUEST['texte'])  )  {
+    // Récupération des données de l'utilisateur courant
+    $resultat = $mysqli->query("SELECT mailexp, mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
+    $u = $resultat->fetch_assoc();
+    $resultat->free();
+    // Récupération des destinataires
+    $resultat = $mysqli->query("SELECT id, IF(LENGTH(nom),CONCAT(nom,' ',prenom),login) AS nom, mail
+                                FROM utilisateurs WHERE LENGTH(mail) AND LENGTH(mdp)=40 AND id != ${_SESSION['id']} ORDER BY autorisation DESC, nom");
+    while ( $r = $resultat->fetch_assoc() )
+      $utilisateurs[$r['id']] = $r;
+    $resultat->free();
+    $dests = '';
+    $ids = explode(',',$_REQUEST['id-copie']);
+    foreach ( $ids as $i )
+      if ( isset($utilisateurs[$i]) )  {
+        $dests .= $utilisateurs[$i]['nom'].' <'.$utilisateurs[$i]['mail'].'>, ';
+        unset($utilisateurs[$i]);
+      }
+    if ( !strlen($dests) )
+      $message = '{"etat":"nok","message":"Pas de destinataire valide : mail non envoyé"}';
+    elseif ( !strlen($sujet = $_REQUEST['sujet']) )
+      $message = '{"etat":"nok","message":"Pas de sujet : mail non envoyé"}';
+    elseif ( !strlen($texte = $_REQUEST['texte']) )
+      $message = '{"etat":"nok","message":"Pas de texte : mail non envoyé"}';
+    else  {
+      $dests = substr($dests,0,-2);
+      $bcc = ( isset($_REQUEST['copie']) ) ? "${u['mailexp']} <${u['mail']}>, " : '';
+      if ( isset($_REQUEST['id-bcc']) )
+        $ids = explode(',',$_REQUEST['id-bcc']);
+        foreach ( $ids as $i )
+          if ( isset($utilisateurs[$i]) )  {
+            $bcc .= $utilisateurs[$i]['nom'].' <'.$utilisateurs[$i]['mail'].'>, ';
+            unset($utilisateurs[$i]);
+          }
+      $bcc = ( strlen($bcc) ) ? 'Bcc: '.substr($bcc,0,-2) : '';
+      mail($dests,'=?UTF-8?B?'.base64_encode($sujet).'?=',$texte,'From: =?UTF-8?B?'.base64_encode($u['mailexp'])."?= <${u['mail']}>\r\nContent-type: text/plain; charset=UTF-8\r\n$bcc","-f${u['mail']}");
+      
+      // Message de confirmation d'envoi
+      $n1 = substr_count($dests,'<');
+      $n2 = substr_count($bcc,'<') - isset($_REQUEST['copie']);
+      if ( $n2 )
+        $message = 'Mail envoyé à '.($n1+$n2).' destinataires (dont '.$n2.' en copie cachée)';
+      else
+        $message = ( $n1 > 1 ) ? "Mail envoyé à $n1 destinataires." : 'Mail envoyé à 1 destinataire';
+      $message = $_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"$message\"}";
     }
   }
 }
@@ -246,59 +298,10 @@
   exit(json_encode(array('etat'=>'ok_','mats'=>$mats,'reps'=>$reps,'docs'=>$docs)));
 }
 
-///////////////////
-// Envoi de mail //
-///////////////////
-if ( isset($_REQUEST['envoimail']) && isset($_REQUEST['id-copie']) && isset($_REQUEST['sujet']) && isset($_REQUEST['texte'])  )  {
-  // Récupération des données de l'utilisateur courant
-  $resultat = $mysqli->query("SELECT mailexp, mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
-  $u = $resultat->fetch_assoc();
-  $resultat->free();
-  // Récupération des destinataires
-  $resultat = $mysqli->query("SELECT id, IF(LENGTH(nom),CONCAT(nom,' ',prenom),login) AS nom, mail
-                              FROM utilisateurs WHERE LENGTH(mail) AND LENGTH(mdp)=40 AND id != ${_SESSION['id']} ORDER BY autorisation DESC, nom");
-  while ( $r = $resultat->fetch_assoc() )
-    $utilisateurs[$r['id']] = $r;
-  $resultat->free();
-  $dests = '';
-  $ids = explode(',',$_REQUEST['id-copie']);
-  foreach ( $ids as $i )
-    if ( isset($utilisateurs[$i]) )  {
-      $dests .= $utilisateurs[$i]['nom'].' <'.$utilisateurs[$i]['mail'].'>, ';
-      unset($utilisateurs[$i]);
-    }
-  if ( !strlen($dests) )
-    $message = '{"etat":"nok","message":"Pas de destinataire valide : mail non envoyé"}';
-  elseif ( !strlen($sujet = $_REQUEST['sujet']) )
-    $message = '{"etat":"nok","message":"Pas de sujet : mail non envoyé"}';
-  elseif ( !strlen($texte = $_REQUEST['texte']) )
-    $message = '{"etat":"nok","message":"Pas de texte : mail non envoyé"}';
-  else  {
-    $dests = substr($dests,0,-2);
-    $bcc = ( isset($_REQUEST['copie']) ) ? "${u['mailexp']} <${u['mail']}>, " : '';
-    if ( isset($_REQUEST['id-bcc']) )
-      $ids = explode(',',$_REQUEST['id-bcc']);
-      foreach ( $ids as $i )
-        if ( isset($utilisateurs[$i]) )  {
-          $bcc .= $utilisateurs[$i]['nom'].' <'.$utilisateurs[$i]['mail'].'>, ';
-          unset($utilisateurs[$i]);
-        }
-    $bcc = ( strlen($bcc) ) ? 'Bcc: '.substr($bcc,0,-2) : '';
-    mail($dests,'=?UTF-8?B?'.base64_encode($sujet).'?=',$texte,'From: =?UTF-8?B?'.base64_encode($u['mailexp'])."?= <${u['mail']}>\r\nContent-type: text/plain; charset=UTF-8\r\n$bcc",'-f'.( ( isset($mailadmin) ) ? $mailadmin : 'admin@cahier-de-prepa.fr'));
-    
-    // Message de confirmation d'envoi
-    $n1 = substr_count($dests,'<');
-    $n2 = substr_count($bcc,'<') - isset($_REQUEST['copie']);
-    if ( $n2 )
-      $message = 'Mail envoyé à '.($n1+$n2).' destinataires (dont '.$n2.' en copie cachée)';
-    else
-      $message = ( $n1 > 1 ) ? "Mail envoyé à $n1 destinataires." : 'Mail envoyé à 1 destinataire';
-    $message = $_SESSION['message'] = "{\"etat\":\"ok\",\"message\":\"$message\"}";
-  }
-}
-
-
-elseif ( isset($_REQUEST['table']) )  {
+/////////////////////////////////////////////////////////////////////////
+// Gestion des demandes en fonction de la valeur de $_REQUEST['table'] //
+/////////////////////////////////////////////////////////////////////////
+if ( isset($_REQUEST['table']) )  {
   // Fonction PHP pour le stockage dans la base MySQL de l'ordre "naturel" (1,2,10,11 et non 1,10,11,2)
   // Remplace tout nombre par un nombre égal mais écrit sur 10 chiffres, complété par des zéros à gauche
   // Utilisé pour les documents et les groupes
@@ -506,10 +509,10 @@
         // Écriture
         elseif ( requete('infos',"UPDATE infos SET ordre = (ordre+1) WHERE page = $page",$mysqli)
           && requete('infos',"INSERT INTO infos SET ordre = 1, page = $page, texte = '$texte', titre = '$titre', cache = $cache",$mysqli) )  {
-          $mysqli->query('ALTER TABLE infos ORDER BY page,ordre');
           $message = $_SESSION['message'] = '{"etat":"ok","message":"Information ajoutée"}';
           if ( !$cache )
-            recent($mysqli,1,$id,array('titre'=>"<span class=\"icon-infos\"></span> $titre", 'lien'=>".?${r['cle']}", 'texte'=>$texte, 'matiere'=>$r['mat'], 'protection'=>$r['protection']));
+            recent($mysqli,1,$mysqli->insert_id,array('titre'=>"<span class=\"icon-infos\"></span> $titre", 'lien'=>".?${r['cle']}", 'texte'=>$texte, 'matiere'=>$r['mat'], 'protection'=>$r['protection']));
+          $mysqli->query('ALTER TABLE infos ORDER BY page,ordre');
         }
         else
           $message = '{"etat":"nok","message":"L\'information n\'a pas pu être ajoutée. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
@@ -543,12 +546,12 @@
             $message = '{"etat":"nok","message":"Le programme de colle n\'a pas pu être modifié. Texte non vide nécessaire."}';
           elseif ( requete('colles',"UPDATE colles SET texte = '$valeur' WHERE id = ${r['id']}",$mysqli) )  {
             $message = '{"etat":"ok","message":"Programme de colles modifié"}';
-            if ( !$cache )  {
+            if ( !$r['cache'] )  {
               // Fabrication des données pour les informations récentes
-              $resultat = $mysqli->query("SELECT cle, colles_protection FROM matieres WHERE id = $mid");
-              $r = $resultat->fetch_assoc();
+              $resultat = $mysqli->query("SELECT nom, cle, colles_protection FROM matieres WHERE id = $mid");
+              $s = $resultat->fetch_assoc();
               $resultat->free();
-              recent($mysqli,1,$r['id'],array('titre'=>"<span class=\"icon-colles\"></span> Colles du ${r['debut']} en ${r['nom']}", 'lien'=>"colles?${r['cle']}&amp;n=$sid", 'texte'=>$valeur, 'matiere'=>$mid, 'protection'=>$r['colles_protection']));
+              recent($mysqli,2,$r['id'],array('titre'=>"<span class=\"icon-colles\"></span> Colles du ${r['debut']} en ${s['nom']}", 'lien'=>"colles?${s['cle']}&amp;n=$sid", 'texte'=>$valeur, 'matiere'=>$mid, 'protection'=>$s['colles_protection']));
             }
           }
           else
@@ -563,7 +566,7 @@
             $resultat = $mysqli->query("SELECT nom, cle, colles_protection FROM matieres WHERE id = $mid");
             $s = $resultat->fetch_assoc();
             $resultat->free();
-            recent($mysqli,2,$r['id'],array('titre'=>"<span class=\"icon-colles\"></span> Colles du ${r['debut']} en ${s['nom']}", 'lien'=>"colles?${s['cle']}&amp;n=$sid", 'texte'=>$valeur, 'matiere'=>$mid, 'protection'=>$s['colles_protection']));
+            recent($mysqli,2,$r['id'],array('titre'=>"<span class=\"icon-colles\"></span> Colles du ${r['debut']} en ${s['nom']}", 'lien'=>"colles?${s['cle']}&amp;n=$sid", 'texte'=>$r['texte'], 'matiere'=>$mid, 'protection'=>$s['colles_protection']));
           }
           else
             $message = '{"etat":"nok","message":"Le programme de colles n\'a pas pu être diffusé. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}';
@@ -723,11 +726,17 @@
     }
     
     // Nouvel élément du cahier de texte
-    elseif ( !strlen($message) && isset($h_debut) && isset($_REQUEST['matiere']) && in_array($matiere = $_REQUEST['matiere'], explode(',',$_SESSION['matieres'])) )  {
+    elseif ( !strlen($message) && isset($demigroupe) && isset($_REQUEST['matiere']) && in_array($matiere = $_REQUEST['matiere'], explode(',',$_SESSION['matieres'])) )  {
       $texte = $mysqli->real_escape_string($_REQUEST['texte']);
       $cache = ( isset($_REQUEST['cache']) ) ? 1 : 0;
       if ( !strlen($texte) )
-            $message = '{"etat":"nok","message":"L\'élément du cahier de texte n\'a pas pu être ajouté. Texte non vide nécessaire."}';
+        $message = '{"etat":"nok","message":"L\'élément du cahier de texte n\'a pas pu être ajouté. Texte non vide nécessaire."}';
+      elseif ( is_null($h_debut) )
+        $message = '{"etat":"nok","message":"L\'élément du cahier de texte n\'a pas pu être ajouté. Horaire de début non vide nécessaire."}';
+      elseif ( is_null($h_fin) )
+        $message = '{"etat":"nok","message":"L\'élément du cahier de texte n\'a pas pu être ajouté. Horaire de fin non vide nécessaire."}';
+      elseif ( is_null($pour) )
+        $message = '{"etat":"nok","message":"L\'élément du cahier de texte n\'a pas pu être ajouté. Date d\'échéance non vide nécessaire."}';
       // Écriture dans la base de données
       elseif ( requete('cdt',"INSERT INTO cdt SET matiere = $matiere, semaine = $semaine, jour = '$jour', h_debut = '$h_debut', h_fin = '$h_fin',
                               pour = '$pour', type = $tid, texte = '$texte', demigroupe = $demigroupe, cache = $cache", $mysqli) )  {
@@ -1049,11 +1058,11 @@
         elseif ( isset($_REQUEST['supprime_docs']) )  {
           if ( requete('reps',"DELETE FROM reps WHERE matiere = $id AND parent > 0",$mysqli) )  {
             // Suppression physique
-            $resultat = $mysqli->query("SELECT GROUP_CONCAT(CONCAT('documents/',lien) SEPARATOR ' ') AS chemins FROM docs WHERE matiere = $id");
+            $resultat = $mysqli->query("SELECT lien FROM docs WHERE matiere = $id");
             if ( $resultat->num_rows )  {
-              $r = $resultat->fetch_assoc();
+              while ( $r = $resultat->fetch_row() )
+                exec("rm -rf documents/${r[0]}");
               $resultat->free();
-              exec("rm -rf ${r['chemins']}");
               requete('docs',"DELETE FROM docs WHERE matiere = $id",$mysqli);
             }
             requete('matieres',"UPDATE matieres SET docs = 0 WHERE id = $id",$mysqli);
@@ -1075,7 +1084,7 @@
         $message = '{"etat":"nok","message":"La matière n\'a pas pu être ajoutée. Nom et clé non vides nécessaires."}';
       else  {
         // Vérification que la clé n'existe pas déjà
-        $resultat = $mysqli->query("SELECT cle FROM matieres WHERE id != $id");
+        $resultat = $mysqli->query('SELECT cle FROM matieres');
         if ( $resultat->num_rows )  {
           while ( $r = $resultat->fetch_assoc() )
             if ( $r['cle'] == $cle )  {
@@ -1171,8 +1180,13 @@
                   $message = '{"etat":"nok","message":"Adresse mail déjà prise"}';
                 elseif ( requete('utilisateurs',"UPDATE utilisateurs SET mail = '$mail' WHERE id = $id",$mysqli) )  {
                   $message = "{\"etat\":\"ok\",\"message\":\"Adresse mail de ${r['nom']} modifiée (utilisateur prévenu par mail)\"}";
+                  // Récupération de l'adresse mail du professeur connecté
+                  $resultat = $mysqli->query("SELECT mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
+                  $s = $resultat->fetch_row();
+                  $resultat->free();
                   if ( !isset($mailadmin) )
                     $mailadmin = 'admin@cahier-de-prepa.fr';
+                  $returnpath = ( strlen($s[0]) ) ? $s[0] : $mailadmin;
                   mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Changement d\'adresse mail').'?=',
 'Bonjour
 
@@ -1183,7 +1197,7 @@
 Cordialement,
 -- 
 Cahier de Prépa
-",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
+",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$returnpath");
                 }
               }
             }
@@ -1265,7 +1279,7 @@
 
     // Ajout de nouveaux utilisateurs
     elseif ( isset($_REQUEST['utilisateurs']) && isset($_REQUEST['autorisation']) && in_array($autorisation = $_REQUEST['autorisation'],array(1,2,3,4)) && isset($_REQUEST['matiere']) )  {
-      $utilisateurs = explode("\n",$_REQUEST['utilisateurs']);
+      $utilisateurs = explode("\n",trim($_REQUEST['utilisateurs']));
       // Récupération des identifiants
       $resultat = $mysqli->query('SELECT GROUP_CONCAT(login) FROM utilisateurs');
       $r = $resultat->fetch_row();
@@ -1290,7 +1304,7 @@
             $m .= "<br>Ligne $i : identifiant déjà existant";
           else  {
             $newmdp = sha1($u[1]);
-            if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', mdp = '$newmdp', autorisation = 1, matieres = '$matiere'",$mysqli) )  {
+            if ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', mdp = '$newmdp', autorisation = 1, matieres = '$matiere', timeout=900",$mysqli) )  {
               $m .= "<br>Ligne $i : ok (identifiant $login)";
               $n = $n+1;
             }
@@ -1335,8 +1349,13 @@
                 $n = $n+1;
                 if ( $mail )  {
                   $lien = ( $https ? 'https' : 'http' )."://$site/connexion?reponseinvitation&mail=$mail&p=".sha1($site.$mdp.$mail);
+                  // Récupération de l'adresse mail du professeur connecté
+                  $resultat = $mysqli->query("SELECT mail FROM utilisateurs WHERE id = ${_SESSION['id']}");
+                  $s = $resultat->fetch_row();
+                  $resultat->free();
                   if ( !isset($mailadmin) )
                     $mailadmin = 'admin@cahier-de-prepa.fr';
+                  $returnpath = ( strlen($s[0]) ) ? $s[0] : $mailadmin;
                   mail($mail,'=?UTF-8?B?'.base64_encode('[Cahier de Prépa] Invitation').'?=',
 'Bonjour
 
@@ -1352,7 +1371,7 @@
 Cordialement,
 -- 
 Cahier de Prépa
-",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
+",'From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$returnpath");
                 }
               }
               else
@@ -1461,11 +1480,11 @@
             $message = '{"etat":"nok","message":"Les répertoires racine des matières ne sont pas supprimables."}';
           elseif ( requete('reps',"DELETE FROM reps WHERE id = $id OR FIND_IN_SET($id,parents)",$mysqli) )  {
             // Suppression physique
-            $resultat = $mysqli->query("SELECT GROUP_CONCAT(CONCAT('documents/',lien) SEPARATOR ' ') AS chemins FROM docs WHERE FIND_IN_SET($id,parents)");
+            $resultat = $mysqli->query("SELECT lien FROM docs WHERE FIND_IN_SET($id,parents)");
             if ( $resultat->num_rows )  {
-              $r = $resultat->fetch_assoc();
+              while ( $r = $resultat->fetch_row() )
+                exec("rm -rf documents/${r[0]}");
               $resultat->free();
-              exec("rm -rf ${r['chemins']}");
               requete('docs',"DELETE FROM docs WHERE FIND_IN_SET($id,parents)",$mysqli);
             }
             $message = '{"etat":"ok","message":"Répertoire supprimé"}';
@@ -1486,7 +1505,7 @@
         $resultat->free();
         $protection = ( in_array($_REQUEST['protection'],array(0,1,2,3,4,5)) ) ? $_REQUEST['protection'] : 0;
         $menu = isset($_REQUEST['menu']) ? 1 : 0;
-        if ( requete('reps',"INSERT INTO reps SET parent = $parent, parents = '${s[parents]},$parent', nom = '$nom', matiere = ${s['matiere']},
+        if ( requete('reps',"INSERT INTO reps SET parent = $parent, parents = '${s['parents']},$parent', nom = '$nom', matiere = ${s['matiere']},
                              nbrep = 0, nbrep_v = 0, nbdoc = 0, nbdoc_v = 0, protection = $protection, menu = $menu",$mysqli) )
           $message = $_SESSION['message'] = '{"etat":"ok","message":"Répertoire ajouté"}';
         else
@@ -1524,9 +1543,9 @@
         if ( isset($_REQUEST['champ']) && ( $_REQUEST['champ'] == 'nom' ) )  {
           if ( !strlen( $valeur = trim($_REQUEST['val']) ) )
             $message = '{"etat":"nok","message":"Le document n\'a pas pu être modifié. Nom non vide nécessaire."}';
-          else  {
+          elseif ( $valeur != $r['nom'] )  {
             setlocale(LC_CTYPE, "fr_FR.UTF-8");
-            $nom = basename(str_replace($r['ext'],'',str_replace('/','-',$valeur)));
+            $nom = substr((str_replace(array($r['ext'],'\\','/'),array('','-','-'),$valeur)),0,100);
             // real_escape_string seulement pour la requête SQL
             if ( requete('docs','UPDATE docs SET nom = \''.$mysqli->real_escape_string($nom).'\', nom_nat = \''.zpad($mysqli->real_escape_string($nom))."' WHERE id = $id",$mysqli) )  {
               exec('mv documents/'.escapeshellarg("${r['lien']}/${r['nom']}${r['ext']}").' documents/'.escapeshellarg("${r['lien']}/$nom${r['ext']}"));
@@ -1544,7 +1563,7 @@
           $etat = 'ok';
           // Modification du nom et de la protection
           setlocale(LC_CTYPE, "fr_FR.UTF-8");
-          $nom = basename(str_replace($r['ext'],'',str_replace('/','-',$nom)));
+          $nom = substr(basename(str_replace(array($r['ext'],'\\'),array('','/'),$nom)),0,100);
           $protection = ( in_array($_REQUEST['protection'],array(0,1,2,3,4,5)) ) ? $_REQUEST['protection'] : 0;
           if ( $nom != $r['nom'] )  {
             // real_escape_string seulement pour la requête SQL
@@ -1609,7 +1628,7 @@
                 '.txt' => '-txt', '.rtf' => '-txt', '' => '-txt'
               );
               $icone = ( isset($icones[$ext=strtolower($r['ext'])]) ) ? $icones[$ext] : '-txt';
-              recent($mysqli,3,$id,array('titre'=>"<span class=\"icon-doc$icone\"></span> $path", 'lien'=>"download?id=$id", 'texte'=>'<p>Nouveau document&nbsp;: <a href=\"download?id=$id\">$path</a></p>', 'matiere'=>$s['matiere'], 'protection'=>$s['protection']));
+              recent($mysqli,3,$id,array('titre'=>"<span class=\"icon-doc$icone\"></span> $path", 'lien'=>"download?id=$id", 'texte'=>"<p>Modification du document&nbsp;: <a href=\"download?id=$id\">$path</a></p>", 'matiere'=>$s['matiere'], 'protection'=>$s['protection']));
             }
             // Si $protection = 5, on cherche à supprimer.
             else
@@ -1652,7 +1671,7 @@
                   '.txt' => '-txt', '.rtf' => '-txt', '' => '-txt'
                 );
                 $icone = ( isset($icones[$ext=strtolower($r['ext'])]) ) ? $icones[$ext] : '-txt';
-                recent($mysqli,3,$id,array('titre'=>"<span class=\"icon-doc$icone\"></span> $path", 'lien'=>"download?id=$id", 'texte'=>'<p>Nouveau document&nbsp;: <a href=\"download?id=$id\">$path</a></p>', 'matiere'=>$s['matiere'], 'protection'=>$s['protection']));
+                recent($mysqli,3,$id,array('titre'=>"<span class=\"icon-doc$icone\"></span> $path", 'lien'=>"download?id=$id", 'texte'=>"<p>Mise à jour du document&nbsp;: <a href=\"download?id=$id\">$path</a></p>", 'matiere'=>$s['matiere'], 'protection'=>$s['protection']));
               }
               $message[] = 'Document mis à jour';
             }
@@ -1693,7 +1712,7 @@
         // $est ne doit pas faire plus de 4 caractères sinon fichier plus accessible
         $ext = ( strpos($nom,'.') ) ? substr(strrchr($nom,'.'),0,4) : '';
         setlocale(LC_CTYPE, "fr_FR.UTF-8");
-        $nom = basename(str_replace('/','-',str_replace($ext,'', ( strlen($_REQUEST['nom']) ) ? $_REQUEST['nom'] : $nom )));
+        $nom = substr(basename(str_replace(array($ext,'\\'),array('','/'), ( strlen($_REQUEST['nom']) ) ? $_REQUEST['nom'] : $nom )),0,100);
         $protection = ( in_array($_REQUEST['protection'],array(0,1,2,3,4,5)) ) ? $_REQUEST['protection'] : 0;
         // Création du répertoire particulier
         $lien = substr(sha1(mt_rand()),0,15);
@@ -1713,11 +1732,11 @@
             $message = $_SESSION['message'] = '{"etat":"ok","message":"Document ajouté"}';
             // Mise à jour des informations récentes
             if ( $protection < 5 )  {
-              $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path
+              $resultat = $mysqli->query("SELECT GROUP_CONCAT( reps.nom ORDER BY FIND_IN_SET(reps.id,docs.parents) SEPARATOR '/' ) AS path, docs.protection, docs.matiere
                                           FROM docs LEFT JOIN reps ON FIND_IN_SET(reps.id,docs.parents) WHERE docs.id = $id");
               $s = $resultat->fetch_assoc();
               $resultat->free();
-              $path = $mysqli->real_escape_string("${s['path']}/$nom}");
+              $path = $mysqli->real_escape_string("${s['path']}/$nom");
               // Liste des icônes pour affichage
               $icones = array(
                 '.pdf' => '-pdf',
@@ -1731,8 +1750,8 @@
                 '.py' => '-pyt', '.exe' => '-pyt', '.sh' => '-pyt', '.ml' => '-pyt', '.mw' => '-pyt',
                 '.txt' => '-txt', '.rtf' => '-txt', '' => '-txt'
               );
-              $icone = array_key_exists(strtolower($r['ext']),$icones) ? $icones[strtolower($r['ext'])] : '-txt';
-              recent($mysqli,3,$id,array('titre'=>"<span class=\"icon-doc$icone\"></span> $path", 'lien'=>"download?id=$id", 'texte'=>'<p>Mise à jour du document&nbsp;: <a href=\"download?id=$id\">$path</a></p>', 'matiere'=>$s['matiere'], 'protection'=>$s['protection']));
+              $icone = ( isset($icones[$ext]) ) ? $icones[$ext] : '-txt';
+              recent($mysqli,3,$id,array('titre'=>"<span class=\"icon-doc$icone\"></span> $path", 'lien'=>"download?id=$id", 'texte'=>"<p>Nouveau document&nbsp;: <a href=\"download?id=$id\">$path</a></p>", 'matiere'=>$s['matiere'], 'protection'=>$s['protection']));
             }
           }
           else  {
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/cdt.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/cdt.php	2015-09-12 20:25:13.508780758 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/cdt.php	2015-10-04 00:47:30.000000000 +0200
@@ -141,11 +141,11 @@
     $requete .= " AND t.cle = '$seance'";
   }
 }
-// Vue de la semaine en cours à partir du samedi
+// Vue de la semaine en cours à partir du lundi
 // Vue de la semaine précédente et de la semaine en cours jusqu'au vendredi
 // $n est false si non trouvé (hors année scolaire)
 else  {
-  if ( ( ( $n = array_search(date('yW', strtotime('Monday this week',time()+86400)),$semaines_id) ) !== false ) )  {
+  if ( ( ( $n = array_search(date('yW', strtotime('Monday this week',time()-86400)),$semaines_id) ) !== false ) )  {
     $requete = "AND cdt.semaine >= $n";
     $nb = ( date('N') > 5 ) ? 1 : 2;
   }
@@ -154,7 +154,7 @@
 ////////////
 /// HTML ///
 ////////////
-debut($mysqli,"Cahier de texte - ${matiere['nom']}",$message,$autorisation,"cdt?${matiere['cle']}");
+debut($mysqli,"Cahier de texte - ${matiere['nom']}",$message,$autorisation,"cdt?${matiere['cle']}",$matiere['id']);
 
 // MathJax désactivé par défaut
 $mathjax = false;
@@ -309,7 +309,7 @@
     $visible
     <a class="icon-supprime" title="Supprimer cet élément du cahier de texte"></a>
     <p class="titrecdt edition" data-donnees='{"tid":${r['tid']},"jour":"${r['date']}","h_debut":"${r['h_debut']}","h_fin":"${r['h_fin']}","pour":"${r['pour']}","demigroupe":$demigroupe}'>$titre</p>
-    <div class="editable edithtml mat${matiere['id']}" data-id="cdt|texte|${r['id']}" data-placeholder="Texte de l'élément du cahier de texte">
+    <div class="editable edithtml" data-id="cdt|texte|${r['id']}" data-placeholder="Texte de l'élément du cahier de texte">
 ${r['texte']}
     </div>
   </article>
@@ -397,7 +397,7 @@
     <p class="ligne"><label for="demigroupe">Séance en demi-groupe&nbsp;: </label>
       <select id="demigroupe" name="demigroupe"><option value="0">Classe entière</option><option value="1">Demi-groupe</option></select>
     </p>
-    <textarea name="texte" class="edithtml mat<?php echo $matiere['id']; ?>" rows="10" cols="100" data-placeholder="Texte de l'élément du cahier de texte (obligatoire)"></textarea>
+    <textarea name="texte" class="edithtml" rows="10" cols="100" data-placeholder="Texte de l'élément du cahier de texte (obligatoire)"></textarea>
     <p class="ligne"><label for="cache">Ne pas diffuser sur la partie publique&nbsp;: </label><input type="checkbox" id="cache" name="cache" value="1"></p>
     <input type="hidden" name="table" value="cdt">
     <input type="hidden" name="matiere" value="<?php echo $matiere['id']; ?>">
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/CHANGELOG.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/CHANGELOG.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/CHANGELOG.php	2015-10-27 14:51:13.677744072 +0100
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/CHANGELOG.php	2015-10-27 14:54:14.000000000 +0100
@@ -1,4 +1,4 @@
-Version actuelle : 5.0.0 (20/09/15)
+Version actuelle : 5.0.1 (27/09/15)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -177,19 +177,30 @@
   * Possibilité pour les professeurs de corriger les adresses mails erronées
   * Possibilité de mettre des notes de colles en demi-point
   * (Certaines documentations sont manquantes)
+5.0.1 27/09/15 Corrections de bugs multiples... (merci L. Beau, S. Ravier,
+  P. Moreau, F. Evrard, E. Blairon, F. Baux, T. Perruchot, L. Whiteley,
+  E. Droguet, P. Tondelier, C. Chevalier)
+  * Retour du bandeau pour prévenir d'utilisateurs en attente de validation
+  * Retour des documentations des pages : utilisateurs, mail, docs, pages, notes  
 
 ===================
 
 Todo :
 
 [ 5.1 ] Octobre 2015
-  * Correction des bugs :)
-  * Ajout des documentations des pages : utilisateurs, mail, docs, pages, notes
   * Flux RSS séparés par matières ; flux RSS correspondant aux accès de chacun
+  * Mails : clic possible sur le nom des destinataires
+  * Mails/Notes : hover
+  * Mail : problème d'encodage sur les noms/prénoms des destinataires
+  * Couleurs ?
+  * Mise en évidence des éléments cachés
+  * Visualisation du niveau de protection des répertoires/documents
 
 [ 5.2 ] Février 2016
   * Récupération des documents en .zip
   * Récupération des données de la base (via la sauvegarde)
+  * Validation/Suppression multiple d'utilisateurs
+  * Correction des mises à jour multiples vers les informations récentes
 
 [ 6.0 ] Août 2016
   * Agenda
@@ -202,4 +213,3 @@
   * Protection individuelle des informations (possibilité de régler pour chaque
   information si les invités/élèves/colleurs peuvent la voir)
   * Programme de colles par quinzaine
-  
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/colles.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/colles.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/colles.php	2015-09-15 23:53:54.675260927 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/colles.php	2015-09-28 00:29:04.000000000 +0200
@@ -121,7 +121,7 @@
 ////////////
 /// HTML ///
 ////////////
-debut($mysqli,"Programme de colles - ${matiere['nom']}",$message,$autorisation,"colles?${matiere['cle']}");
+debut($mysqli,"Programme de colles - ${matiere['nom']}",$message,$autorisation,"colles?${matiere['cle']}",$matiere['id']);
 
 // MathJax désactivé par défaut
 $mathjax = false;
@@ -239,7 +239,7 @@
     <a class="icon-cache" style="display:none;" title="Rendre invisible le programme de colles sur la partie publique"></a>
     <a class="icon-supprime" style="display:none;" title="Supprimer ce programme de colles"></a>
     <a class="icon-ajoute" data-id="ajoute" data-remplace="${r['id']}-${matiere['id']}" title="Entrer ce programme de colles"></a>
-    <div class="editable-remplace edithtml mat${matiere['id']}" data-id="colles|texte|${r['id']}-${matiere['id']}" data-placeholder="Texte du programme de colles">
+    <div class="editable-remplace edithtml" data-id="colles|texte|${r['id']}-${matiere['id']}" data-placeholder="Texte du programme de colles">
       <p>Le programme de colles de cette semaine n'est pas encore défini.</p>
     </div>
   </article>
@@ -296,7 +296,7 @@
 ?>
 
   <form id="form-ajoute">
-    <textarea name="texte" class="edithtml mat<?php echo $matiere['id']; ?>" rows="10" cols="100" data-placeholder="Texte du programme de colles (obligatoire)"></textarea>
+    <textarea name="texte" class="edithtml" rows="10" cols="100" data-placeholder="Texte du programme de colles (obligatoire)"></textarea>
     <p class="ligne"><label for="cache">Ne pas diffuser sur la partie publique&nbsp;: </label><input type="checkbox" id="cache" name="cache" value="1"></p>
     <input type="hidden" name="id" value="">
     <input type="hidden" name="table" value="colles">
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/connexion.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/connexion.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/connexion.php	2015-09-20 23:18:15.189038048 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/connexion.php	2015-10-02 11:37:12.000000000 +0200
@@ -30,7 +30,7 @@
   $resultat->free();
   if ( !isset($utilisateur) )  {
     $mysqli->close();
-    exit('{"etat":"nok_","message":"Le mail donné est inconnu. Si vous venez de demander la création de votre compte, le mot de passe n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un mail quand cela sera effectif."}');
+    exit('{"etat":"nok_","message":"Le mail donné est inconnu. Si vous venez de demander la création de votre compte, le mot de passe n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un mail quand cela sera effectif.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
   }
 
   // Retour de mail : variable $_REQUEST['p'] 
@@ -79,7 +79,7 @@
 Cahier de Prépa
 ','From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
     $mysqli->close();
-    exit('{"etat":"ok_","message":"Un mail vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>. Si vous ne voyez rien, pensez à regarder dans les mails marqués comme spam. Vérifiez bien qu\'il n\'y a pas d\'erreur dans cette adresse, car vous ne pourrez pas continuer sans elle si elle est fausse.<br>Le mail qui vous a été envoyé contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de modifier votre mot de passe. Vous pouvez fermer cette fenêtre."}');
+    exit('{"etat":"ok_","message":"Un mail vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>. Si vous ne voyez rien, pensez à regarder dans les mails marqués comme spam. Vérifiez bien qu\'il n\'y a pas d\'erreur dans cette adresse, car vous ne pourrez pas continuer sans elle si elle est fausse.<br>Le mail qui vous a été envoyé contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de modifier votre mot de passe.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
   }
 }
 
@@ -108,7 +108,7 @@
     $resultat->free();
     if ( in_array($mail,$mails = explode(',',$r['mails'])) || in_array("@$mail",$mails) )  {
       $mysqli->close();
-      exit('{"etat":"nok_","message":"Un compte avec cette adresse mail existe déjà. Si vous venez de demander la création de votre compte, le compte n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un mail quand cela sera effectif. Si ce compte a déjà été validé par les professeurs, vous pouvez <a href=&quot;?oublimdp&quot;>changer le mot de passe</a>."}');
+      exit('{"etat":"nok_","message":"Un compte avec cette adresse mail existe déjà. Si vous venez de demander la création de votre compte, le compte n\'est pas modifiable tant que les professeurs de la classe n\'ont pas validé l\'inscription. Vous recevrez un mail quand cela sera effectif. Si ce compte a déjà été validé par les professeurs, vous pouvez <a href=\"?oublimdp\">changer le mot de passe</a>.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
     }
 
     // Retour de mail : variable $_REQUEST['p'] 
@@ -145,20 +145,22 @@
           if ( in_array($login,explode(',',$r['logins'])) )
             $message = '{"etat":"nok_","message":"Un compte avec le même identifiant existe déjà. Merci de vous connecter avec l\'adresse mail correspondante."}';
           else  {
+            // Récupération des matières
+            $resultat = $mysqli->query('SELECT GROUP_CONCAT(id) AS matieres FROM matieres');
+            $r = $resultat->fetch_row();
+            $resultat->free();
             // Si "colleur" choisi, autorisation vaut 3. Sinon, 2 (élève)
             if ( $_REQUEST['autorisation'] == 2 )  {
               $autorisation = 3;
               // Vérification de la matière
-              $resultat = $mysqli->query('SELECT GROUP_CONCAT(id) AS matieres FROM matieres');
-              $r = $resultat->fetch_assoc();
-              $resultat->free();
-              $matiere = ( isset($_REQUEST['matiere']) && in_array($_REQUEST['matiere'],explode(',',$r['matieres'])) ) ? "0,${_REQUEST['matiere']}" : 0;
+              $matiere = ( isset($_REQUEST['matiere']) && in_array($_REQUEST['matiere'],explode(',',$r['0'])) ) ? "0,${_REQUEST['matiere']}" : 0;
               $mailexp = "$prenom $nom";
               $mailcopy = 1;
             }
             else  {
               $autorisation = 2;
-              $matiere = 0;
+              // De base : toutes matières
+              $matiere = "0,${r[0]}";
               $mailexp = '';
               $mailcopy = 0;
             }
@@ -167,7 +169,7 @@
             $mysqli = connectsql(true);
             $message = ( requete('utilisateurs',"INSERT INTO utilisateurs SET login = '$login', prenom = '$prenom', nom = '$nom', mail = '@$mail',
                        mdp = '*$newmdp', autorisation = $autorisation, matieres = '$matiere', timeout = 900, mailexp = '$mailexp', mailcopy = $mailcopy",$mysqli) )
-                       ? '{"etat":"ok_","message":"Votre demande d\'inscription est en attente de validation par les professeurs de la classe. Vous recevrez un mail lorsque votre inscription sera validée.</p><p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}'
+                       ? '{"etat":"ok_","message":"Votre demande d\'inscription est terminée. Elle est maintenant en attente de validation par les professeurs de la classe. Vous recevrez un mail lorsque votre inscription sera validée.</p><p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}'
                        : '{"etat":"nok_","message":"Votre demande d\'inscription n\'a pas pu être enregistrée suite à une erreur technique."}';
           }
         }
@@ -199,7 +201,7 @@
 Cahier de Prépa
 ','From: =?UTF-8?B?'.base64_encode('Cahier de Prépa')."?= <$mailadmin>\r\nContent-type: text/plain; charset=UTF-8","-f$mailadmin");
       $mysqli->close();
-      exit('{"etat":"ok_","message":"Un mail vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>. Si vous ne voyez rien, pensez à regarder dans les mails marqués comme spam. Ce mail contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de terminer votre inscription. Vous pouvez fermer cette fenêtre."}');
+      exit('{"etat":"ok_","message":"Un mail vient de vous être envoyé à l\'adresse <code>'.$mail.'</code>. Si vous ne voyez rien, pensez à regarder dans les mails marqués comme spam.<br>Ce mail contiendra un lien, valable jusqu\'à '.date('G\h00',$t+3600).', vous permettant de terminer votre inscription.<p class=\"warning\"><a href=\".\">Retourner au Cahier de Prépa</a></p>"}');
     }
   }
 }
@@ -207,7 +209,7 @@
 // Réponse à une invitation
 elseif ( isset($_REQUEST['reponseinvitation']) && isset($_REQUEST['mail']) && strlen($mail = $_REQUEST['mail']) && isset($_REQUEST['p']) && ( $_REQUEST['p'] == sha1($site.$mdp.$mail) ) )  {
   // Recherche du mail dans la base de données
-  $resultat = $mysqli->query('SELECT id, login, mail FROM utilisateurs WHERE LENGTH(mail)');
+  $resultat = $mysqli->query('SELECT id, login, mail, LENGTH(mdp) AS lmdp FROM utilisateurs WHERE LENGTH(mail)');
   while ( $r = $resultat->fetch_assoc() )
     if ( $r['mail'] == $mail )  {
       $utilisateur = $r;
@@ -215,10 +217,16 @@
     }
   $resultat->free();
   if ( !isset($utilisateur) )  {
+    debut($mysqli,$titre,'Le mail donné est inconnu. Le compte pour lequel vous avez été invité a peut-être été supprimé.',false);
     $mysqli->close();
-    exit('{"etat":"nok_","message":"Le mail donné est inconnu. Le compte pour lequel vous avez été invité a peut-être été supprimé, ou vous avez peut-être fait une erreur en tapant l\'adresse."}');
+    fin();
   }
-
+  if ( $r['lmdp'] == 40 )  {
+    debut($mysqli,$titre,'Le mot de passe a déjà été défini. Si vous souhaitez le modifier, vous pouvez utiliser le formulaire de <a href="?oublimdp">mot de passe oublié</a>.',false);
+    $mysqli->close();
+    fin();
+  }
+  
   // Modification du mot de passe
   if ( isset($_REQUEST['mdp1']) && strlen($newmdp = $_REQUEST['mdp1']) )  {
     if ( $newmdp != $_REQUEST['mdp2'] )  {
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/css/icones-min.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/icones-min.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/css/icones-min.css	1970-01-01 01:00:00.000000000 +0100
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/icones-min.css	2015-09-26 01:48:50.000000000 +0200
@@ -0,0 +1 @@
+@font-face{font-family:'icomoon';src:url('../fonts/icomoon.eot?-hrwqqn');src:url('../fonts/icomoon.eot?#iefix-hrwqqn') format('embedded-opentype'),url('../fonts/icomoon.ttf?-hrwqqn') format('truetype'),url('../fonts/icomoon.woff?-hrwqqn') format('woff'),url('../fonts/icomoon.svg?-hrwqqn#icomoon') format('svg');font-weight:normal;font-style:normal}[class^="icon-"],[class*=" icon-"]{font-family:'icomoon';color:black;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}a[class^="icon-"]{cursor:pointer;float:right;margin-left:5px;padding-top:.2em;text-decoration:none;font-weight:500}span.icon-lock{position:relative!important;left:-0.3em;top:.1em;color:#777;margin-right:-0.5em}.icon-montre:before{content:"\e600"}.icon-cache:before{content:"\e601"}.icon-aide:before{content:"\e602"}.icon-ajoute:before{content:"\e603"}.icon-supprime:before{content:"\e604"}.icon-annule:before{content:"\e605"}.icon-ok:before{content:"\e606"}.icon-prefs:before{content:"\e607"}.icon-monte:before{content:"\e608"}.icon-descend:before{content:"\e609"}.icon-ferme:before{content:"\e60a"}.icon-epingle:before{content:"\e60b"}.icon-par1:before{content:"\e60c"}.icon-par2:before{content:"\e60d"}.icon-par3:before{content:"\e60e"}.icon-gras:before{content:"\e60f"}.icon-italique:before{content:"\e610"}.icon-souligne:before{content:"\e611"}.icon-omega:before{content:"\e612"}.icon-sigma:before{content:"\e613"}.icon-exp:before{content:"\e614"}.icon-ind:before{content:"\e615"}.icon-ol:before{content:"\e616"}.icon-ul:before{content:"\e617"}.icon-lien1:before{content:"\e618"}.icon-lien2:before{content:"\e619"}.icon-retour:before{content:"\e61a"}.icon-source:before{content:"\e61b"}.icon-nosource:before{content:"\e61c"}.icon-tex:before{content:"\e61d"}.icon-titres:before{content:"\e61e"}.icon-edite:before{content:"\e61f"}.icon-precedent:before{content:"\e620"}.icon-suivant:before{content:"\e621"}.icon-recherche:before{content:"\e622"}.icon-voirtout:before{content:"\e623"}.icon-accueil:before{content:"\e624"}.icon-imprime:before{content:"\e625"}.icon-connexion:before{content:"\e626"}.icon-deconnexion:before{content:"\e627"}.icon-mail:before{content:"\e628"}.icon-menu:before{content:"\e629"}.icon-cocher:before{content:"\e62a"}.icon-decocher:before{content:"\e62b"}.icon-rep:before{content:"\e62c"}.icon-rep-open:before{content:"\e62d"}.icon-download:before{content:"\e62e"}.icon-lock:before{content:"\e62f"}.icon-alphaasc:before{content:"\e630"}.icon-alphadesc:before{content:"\e631"}.icon-chronoasc:before{content:"\e632"}.icon-chronodesc:before{content:"\e633"}.icon-ajouterep:before{content:"\e634"}.icon-ajoutedoc:before{content:"\e635"}.icon-doc:before{content:"\e636"}.icon-doc-txt:before{content:"\e636"}.icon-doc-pdf:before{content:"\e637"}.icon-doc-doc:before{content:"\e638"}.icon-doc-xls:before{content:"\e639"}.icon-doc-ppt:before{content:"\e63a"}.icon-doc-jpg:before{content:"\e63b"}.icon-doc-zip:before{content:"\e63c"}.icon-doc-mp3:before{content:"\e63d"}.icon-doc-mp4:before{content:"\e63e"}.icon-doc-pyt:before{content:"\e63f"}.icon-rss:before{content:"\e640"}.icon-infos:before{content:"\e641"}.icon-colles:before{content:"\e642"}.icon-recent:before{content:"\e643"}
\ Pas de fin de ligne à la fin du fichier
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/css/style.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/css/style.css	2015-09-20 07:44:06.020199027 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style.css	2015-10-13 02:03:44.000000000 +0200
@@ -25,7 +25,7 @@
   nav { margin: 0; padding: 1em 20px 0.7em; }
   .icon-menu, .icon-recent { display: none; }
   #recent { margin-top: 1.5em; padding: 1em 20px; }
-  section { position: relative; margin: 0 30px 0 340px; padding: 0 0px 3em;  }
+  section { position: relative; margin: 0 30px 0 340px; padding: 0 0 3em;  }
   header + section { width: 96%; margin: 0 auto; max-width: 1500px; text-align: center;}
   footer { font-size: 0.8em; }
 }
@@ -35,11 +35,11 @@
   #colonne, nav, #recent { display: none; }
   #colonne.visible { display: block; }
   nav.visible, #recent.visible { display: block; position: fixed; z-index: 2; top: 3.3em; left: 0.5em; padding: 1em 20px 0.7em;
-                                 width: 80%; min-width: 200px; max-width: 280px; max-height: 80%; overflow: auto;
+                                 width: 80%; min-width: 200px; max-width: 280px; max-height: 70%; overflow: auto;
                                  box-shadow: 0.5em 0.5em 0.5em #777; -moz-box-shadow: 0.5em 0.5em 0.5em #777; -webkit-box-shadow: 0.5em 0.5em 0.5em #777; }
   .icon-menu, .icon-recent { position: fixed; z-index: 2; top: 0.8em; left: 0.5em; font-size: 1.2em; cursor: pointer; }
   .icon-recent { left: 2.5em; }
-  section { position: relative; width:96%; margin: 0 2%; padding: 0; }
+  section { position: relative; width:96%; margin: 0 2%; padding: 0 0 3em; }
   header + section { text-align: center; }
   footer { font-size: 0.6em; }
 }
@@ -226,7 +226,15 @@
 
 /* Pour l'impression */
 @media print {
-  #colonne, [id^="aide-"], [id^="form-"] { display: none; }
+  #colonne, #recherchecolle, #recherchecdt, [id^="aide-"], [id^="form-"], footer, a[class^="icon-"] { display: none; }
+  .editable, .titrecdt.edition, form.titrecdt, .editabledest { border: none; }
+  h1 { font-size: 1.7em; text-align: center; margin: 0; padding: 0 0 1em; }
+  h2 { font-size: 1.5em; margin: 0.7em 0; padding: 0; }
+  h3 { font-size: 1.35em; margin: 0.6em 0; padding: 0 1% 0; }
+  h4 { font-size: 1.2em; margin: 0.4em 0 0.2em; padding: 0 2.5% 0; }
+  h5 { font-size: 1.1em; margin: 0.2em 0 0; padding: 0 4% 0; }
+  h6 { font-size: 1em; margin: 0.2em 0 0; padding: 0 5.5% 0; }
+  article { border: 1px solid #999; }
 }
 
 /*//////////////////////////////////////////////////////////
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/css/style-min.css /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style-min.css
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/css/style-min.css	1970-01-01 01:00:00.000000000 +0100
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/css/style-min.css	2015-10-13 02:04:30.000000000 +0200
@@ -0,0 +1 @@
+html,body{height:100%}body{font-size:100%;font-family:Arial,Helvetica,sans-serif;position:relative;width:100%;margin:0 auto;max-width:1500px}h1{font-size:2.2em;text-align:center;margin:0;padding:1em 2em}h2{font-size:1.8em;margin:1em 0 .8em;padding:0}h3{font-size:1.5em;margin:1em 0 .5em;padding:0 1% 0}h4{font-size:1.3em;margin:.5em 0 .2em;padding:0 2.5% 0}h5{font-size:1.1em;margin:.2em 0 0;padding:0 4% 0}h6{font-size:1em;margin:.2em 0 0;padding:0 5.5% 0}ul{margin:.5em 0;padding:0 2% 0 6%}p{margin:0;padding:0 2%}p+p{margin-top:.5em}div,form{margin:0;padding:0}img{border:0;max-width:100%}div,p,section,article{text-align:justify}article>*:first-child{margin-top:0}article>*:last-child{margin-bottom:0}section>h2:first-child{margin-top:0}@media screen and (min-width:800px){#colonne{width:280px;float:left;margin:0 30px 3em}nav{margin:0;padding:1em 20px .7em}.icon-menu,.icon-recent{display:none}#recent{margin-top:1.5em;padding:1em 20px}section{position:relative;margin:0 30px 0 340px;padding:0 0 3em}header+section{width:96%;margin:0 auto;max-width:1500px;text-align:center}footer{font-size:.8em}}@media screen and (max-width:800px){h1{font-size:1.8em;padding:.3em 3em}h2{font-size:1.65em}#colonne,nav,#recent{display:none}#colonne.visible{display:block}nav.visible,#recent.visible{display:block;position:fixed;z-index:2;top:3.3em;left:.5em;padding:1em 20px .7em;width:80%;min-width:200px;max-width:280px;max-height:70%;overflow:auto;box-shadow:.5em .5em .5em #777;-moz-box-shadow:.5em .5em .5em #777;-webkit-box-shadow:.5em .5em .5em #777}.icon-menu,.icon-recent{position:fixed;z-index:2;top:.8em;left:.5em;font-size:1.2em;cursor:pointer}.icon-recent{left:2.5em}section{position:relative;width:96%;margin:0 2%;padding:0 0 3em}header+section{text-align:center}footer{font-size:.6em}}article{margin:1em 0;padding:1em 2%;background-color:#EEE}article:first-child,.general+article{margin-top:0!important}footer{text-align:center;width:90%;padding:1em 5%;clear:both;position:fixed;left:0;bottom:0;z-index:6;border-top:1px solid black;background-color:#EEE;opacity:.97;filter:alpha(opacity=97)}.pdf{height:0;width:100%;overflow:hidden;position:relative}.portrait{padding-bottom:138%}.paysage{padding-bottom:74%}.hauteur50{padding-bottom:50%}.pdf object{position:absolute}.warning{text-align:center;width:50%;margin:1em auto;padding:.5em 3%}.annonce{margin:1em 3%;padding:.5em 4%}.note{margin:.5em 2%;padding:0 4%}.warning,.annonce{color:#a31f35;border:1px solid #882c3c}.note{color:#a31f35}.oubli{font-size:.8em;text-align:center}.oubli a{text-decoration:none;color:#333}p.titrecdt{text-align:right;text-decoration:underline}.titrecdt.edition{text-align:left;text-decoration:none;padding-right:1%}.topbarre{height:1.5em;background-color:#DDD;border:1px solid #BBB;width:auto;padding:0;margin-bottom:0;border-radius:4px}#recherchecdt a,#recherchecolle a{float:none!important;margin-left:.5em}.topbarre select#semaines{margin-left:1.3em;width:8em;height:1.7em}.topbarre select#seances{margin-left:1.3em;width:10.5em;height:1.7em}.topbarre input{position:absolute;margin:0 .8em 0 1.5em;padding-left:1.8em;width:-moz-available;height:1.7em}.topbarre span{position:relative;left:1.9em;cursor:pointer;top:.1em}@media screen and (max-width:980px) and (min-width:800px),screen and (max-width:600px){#recherchecdt input{display:none;top:1.8em;padding-left:.1em;right:2em;margin-left:2em!important}#recherchecdt span{left:1.3em}}@media screen and (max-width:450px){#recherchecdt a,#recherchecdt select{margin-left:.3em!important}#recherchecdt input{margin-left:.3em}#recherchecdt select{width:6em!important}#recherchecdt span{left:.3em}}@media screen and (max-width:400px){#recherchecolle a,#recherchecolle select{margin-left:.3em!important}#recherchecolle input{margin-left:0!important}#recherchecolle select{width:6em}#recherchecolle span{left:.3em}}@media screen and (max-width:350px){#recherchecolle input{display:none;top:1.8em;padding-left:.1em;right:2em;margin-left:2em!important}}@media screen and (-webkit-min-device-pixel-ratio:0){.topbarre{height:1.4em;vertical-align:bottom}#recherchecolle input{width:40%}.topbarre span{top:.2em}#recherchecdt a,#recherchecolle a{vertical-align:middle}.topbarre select{height:1.7em}}#parentsdoc{margin-bottom:1.5em;padding:.3em 2% 0}#parentsdoc *{padding-top:0}#parentsdoc span{position:static;cursor:auto}.rep,.doc{padding:0;margin-left:2%;margin-right:2%;border-bottom:1px dotted #BBB}.repcontenu,.docdonnees{float:right;font-size:.8em;padding-top:.2em;padding-left:.5em}#parentsdoc a,.rep a,.doc a{text-decoration:none;color:black}#parentsdoc .nom,.rep .nom,.doc .nom{font-weight:700;margin-left:.5em}.general{position:absolute;top:-4.1em;right:1em}.general+.general{right:2.2em}.general+.general+.general{right:3.4em}.general+.general+.general+.general{right:4.6em}.edition{display:inline;text-align:left;padding-right:3em}h3.edition.editable{padding-right:1%}.edition ~ div,.edition+p,.edition ~ form{margin-top:.75em}article.cache{color:#999;background-color:#f4f4f4}#log{position:fixed;top:3%;left:3%;padding:.3em 2%;z-index:6;margin-right:3%}#log.ok{background-color:#EFE;color:#090;border:1px solid #090}#log.nok{background-color:#FEE;color:#D00;border:1px solid #D00}#log.ok span{color:#090}#log.nok span{color:#D00}#log span{cursor:pointer;position:relative;right:-0.8em;top:.1em}#fenetre_fond{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#000;opacity:.2;filter:alpha(opacity=20);z-index:3}#fenetre{position:fixed;left:50%;z-index:4;padding:0 2% 1em;overflow:auto;background-color:#EEE;opacity:.97;filter:alpha(opacity=97);box-shadow:.5em .5em .5em #777;-moz-box-shadow:.5em .5em .5em #777;-webkit-box-shadow:.5em .5em .5em #777}@media screen and (min-width:800px){#fenetre{top:10%;width:70%;margin-left:-37%;max-height:80%}}@media screen and (max-width:800px){.general{top:-2.2em}#fenetre{top:4%;width:92%;margin-left:-48%;max-height:92%}}#fenetre a[class^="icon-"]{margin-top:1.5em}#fenetre hr{margin:1.5em 0}#epingle{margin-top:1.5em}#epingle h3{padding-left:0}[id^="aide-"],[id^="form-"]{display:none}#fenetre [name="titre"]{margin:2em 0 1em}#fenetre [name="titre"]+*{display:inline}form.titrecdt{padding:.2em 0 .5em;margin-top:.2em}.suppression{text-align:center}#fenetre.usermat h3{margin-bottom:0}#fenetre.usermat a.icon-ajoute,#fenetre a.icon-supprime{margin-top:.8em}#fenetre.usermat .ligne,#fenetre.usergrp .ligne{border-bottom:1px dotted #BBB}#fenetre.usermat input,#fenetre.usergrp input{margin-top:.2em}#fenetre th+th,#fenetre td+td{text-align:center;width:2em;padding:.15em}#fenetre th a{float:none}#fenetre th{border:none!important}#fenetre td{border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px dotted #BBB!important}#planning{text-align:center}.labelchecked{color:#999}input,select,textarea{box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box}p.ligne{padding:0;clear:right}.ligne label{font-weight:700}.ligne input,.ligne select,.ligne code{width:65%;float:right;margin-top:-0.2em}.ligne input[type="checkbox"],.ligne input[type="radio"]{width:1em;margin-top:.2em}input.ligne{width:100%;margin-bottom:.5em;display:block}.supprmultiple{margin-top:.3em;margin-bottom:0!important}.usermat{margin-top:.5em;padding:0;clear:right}.usermat a{padding:0!important}table{width:100%;margin:1em 0;border-collapse:collapse;border:medium solid #999}table td{padding:.15em .5%}table th{padding:.15em 3%}table td,table th{border:thin solid #AAA!important}table td .icon-edite{float:left!important;margin:0 .2em 0 .1em}div.placeholder:before{content:attr(data-placeholder);color:#AAA;margin-left:4px;z-index:2}span.placeholder{color:#AAA;position:absolute;margin:.2em 2.5% 0 5px;z-index:2}#fenetre span.placeholder,#fenetre div.placeholder:before{z-index:5}.editable,.titrecdt.edition,form.titrecdt,.editabledest{border:1px dotted #BBB;position:relative}.editable a[class^="icon-"],p.titrecdt a[class^="icon-"],.editabledest a[class^="icon-"]{float:none}.avecform{padding:0;border:none!important}h3.editable a[class^="icon-"],h3 span.editable a[class^="icon-"]{font-weight:500;font-size:.67em;padding-top:.1em}h3.avecform span{font-weight:500;font-size:.67em;margin-top:.4em;width:80%;overflow:hidden;white-space:nowrap}h3.avecform input{width:50%}textarea{width:100%;margin:0 0 .2em}textarea+div{min-height:6em;border:1px dotted #CCC;background-color:#FFF}.boutons{clear:right;background-color:#DDD;border:1px solid #BBB;width:auto;padding:0;margin-bottom:0;border-radius:4px}.boutons button{cursor:default;background-color:transparent;border-top:0;border-left:none;border-bottom:1px solid #BBB;border-right:1px solid #BBB;height:1.5em;font-size:100%;width:2em}.boutons button+button{margin-left:-0.2em}div.editable a[class^="icon-"]{position:absolute;right:3px;top:0}div.editable a.icon-annule{top:1.5em}div.edithtml a.icon-ok{top:1.6em}div.edithtml a.icon-annule{top:3.1em}nav,#recent{background-color:#999}nav a[class^="icon-"]{float:none!important;display:inline!important;margin:.5em 3% 1em}nav a{display:block;margin-bottom:.2em;padding:0;text-decoration:none;color:black}nav h3{font-size:1.2em;margin:.5em 3% .1em;padding-top:.3em;border-top:1px solid black}nav hr{margin:.5em 3% .5em;color:black;border-top:1px solid black;border-bottom:0}nav a.menurep{padding-left:3%;font-size:.9em}#actuel{font-style:italic}nav h3 span{font-weight:500;font-size:.83em;margin-right:.2em}#recent .icone{height:1.2em;vertical-align:bottom;margin-right:.2em}#recent a{display:block;margin-bottom:.4em;padding:0;text-decoration:none;color:black;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#recent h3{font-size:1.2em;margin:0 3% .5em}th.semaines{vertical-align:bottom;padding:1.6em 0;text-align:center}td.semaines{padding-bottom:1em!important;vertical-align:bottom;text-align:center;padding:.2em 5px}td.semaines span{display:block;font-weight:700;margin:0;padding:0;width:1.2em;transform:rotate(-90deg);-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);white-space:nowrap;zoom:1}td.pasnote{font-style:italic;text-align:center}.collsel{font-weight:700}.collnosel,.dejanote{color:#AAA}#recherchenote{padding:0 1em}#notes td+td{text-align:right}@media print{#colonne,#recherchecolle,#recherchecdt,[id^="aide-"],[id^="form-"],footer,a[class^="icon-"]{display:none}.editable,.titrecdt.edition,form.titrecdt,.editabledest{border:0}h1{font-size:1.7em;text-align:center;margin:0;padding:0 0 1em}h2{font-size:1.5em;margin:.7em 0;padding:0}h3{font-size:1.35em;margin:.6em 0;padding:0 1% 0}h4{font-size:1.2em;margin:.4em 0 .2em;padding:0 2.5% 0}h5{font-size:1.1em;margin:.2em 0 0;padding:0 4% 0}h6{font-size:1em;margin:.2em 0 0;padding:0 5.5% 0}article{border:1px solid #999}}.timeEntry-control{float:right;margin:0 5px 0 0}.datepick-trigger{float:right;margin:.1em 7px 0 0}.datepick{background-color:#fff;color:#000;border:1px solid #444;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em;font-family:Arial,Helvetica,Sans-serif;font-size:90%}.datepick-rtl{direction:rtl}.datepick-popup{z-index:2}.datepick-disable{position:absolute;z-index:1;background-color:white;opacity:.5;filter:alpha(opacity=50)}.datepick a{color:#fff;text-decoration:none}.datepick a.datepick-disabled{color:#888;cursor:auto}.datepick button{margin:.25em;padding:.125em 0;background-color:#fcc;border:0;border-radius:.25em;-moz-border-radius:.25em;-webkit-border-radius:.25em;font-weight:bold}.datepick-nav,.datepick-ctrl{float:left;width:100%;background-color:#000;color:#fff;font-size:90%;font-weight:bold}.datepick-ctrl{background-color:#600}.datepick-cmd{width:30%}.datepick-cmd:hover{background-color:#777}.datepick-ctrl .datepick-cmd:hover{background-color:#f08080}.datepick-cmd-prevJump,.datepick-cmd-nextJump{width:8%}a.datepick-cmd{height:1.5em}button.datepick-cmd{text-align:center}.datepick-cmd-prev,.datepick-cmd-prevJump,.datepick-cmd-clear{float:left;padding-left:2%}.datepick-cmd-current,.datepick-cmd-today{float:left;width:35%;text-align:center}.datepick-cmd-next,.datepick-cmd-nextJump,.datepick-cmd-close{float:right;padding-right:2%;text-align:right}.datepick-rtl .datepick-cmd-prev,.datepick-rtl .datepick-cmd-prevJump,.datepick-rtl .datepick-cmd-clear{float:right;padding-left:0;padding-right:2%;text-align:right}.datepick-rtl .datepick-cmd-current,.datepick-rtl .datepick-cmd-today{float:right}.datepick-rtl .datepick-cmd-next,.datepick-rtl .datepick-cmd-nextJump,.datepick-rtl .datepick-cmd-close{float:left;padding-left:2%;padding-right:0;text-align:left}.datepick-month-nav{float:left;background-color:#777;text-align:center}.datepick-month-nav div{float:left;width:12.5%;margin:1%;padding:1%}.datepick-month-nav span{color:#888}.datepick-month-row{clear:left}.datepick-month{float:left;width:15em;border:1px solid #444;text-align:center}.datepick-month-header,.datepick-month-header select,.datepick-month-header input{height:1.5em;background-color:#444;color:#fff;font-weight:bold}.datepick-month-header select,.datepick-month-header input{height:1.4em;margin:0;padding:0;border:0;font-size:100%}.datepick-month-header input{position:absolute;display:none}.datepick-month table{width:100%;border-collapse:collapse}.datepick-month thead{border-bottom:1px solid #aaa}.datepick-month th,.datepick-month td{margin:0;padding:0;font-weight:normal;text-align:center}.datepick-month th{border:1px solid #777}.datepick-month th,.datepick-month th a{background-color:#777;color:#fff}.datepick-month td{background-color:#eee;border:1px solid #aaa}.datepick-month td.datepick-week{border:1px solid #777}.datepick-month td.datepick-week *{background-color:#777;color:#fff;border:0}.datepick-month a{display:block;width:100%;padding:.125em 0;background-color:#eee;color:#000;text-decoration:none}.datepick-month span{display:block;width:100%;padding:.125em 0}.datepick-month td span{color:#888}.datepick-month td .datepick-other-month{background-color:#fff}.datepick-month td .datepick-weekend{background-color:#ddd}.datepick-month td .datepick-today{background-color:#f0c0c0}.datepick-month td .datepick-highlight{background-color:#f08080}.datepick-month td .datepick-selected{background-color:#777;color:#fff}.datepick-month th.datepick-week{background-color:#777;color:#fff}.datepick-status{clear:both;background-color:#ddd;text-align:center}.datepick-clear-fix{clear:both}.timeEntry-control{vertical-align:middle;margin-left:2px}
\ Pas de fin de ligne à la fin du fichier
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/def_sql.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/def_sql.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/def_sql.php	2015-09-20 23:13:46.609858759 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/def_sql.php	2015-09-30 18:46:18.000000000 +0200
@@ -40,13 +40,13 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE `utilisateurs` (
-  `id` tinyint(2) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  `id` smallint(2) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `login` varchar(50) NOT NULL UNIQUE,
   `nom` varchar(50) NOT NULL,
   `prenom` varchar(50) NOT NULL,
   `mail` varchar(50) NOT NULL,
   `autorisation` tinyint(1) UNSIGNED NOT NULL,
-  `mdp` char(41) NOT NULL,
+  `mdp` varchar(41) NOT NULL,
   `matieres` varchar(30) NOT NULL,
   `timeout` smallint(4) UNSIGNED NOT NULL,
   `mailexp` varchar(50) NOT NULL,
@@ -85,7 +85,7 @@
 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
 
 CREATE TABLE `colles` (
-  `id` tinyint(3) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
+  `id` smallint(3) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `semaine` tinyint(2) unsigned NOT NULL,
   `matiere` tinyint(2) unsigned NOT NULL,
   `texte` text NOT NULL,
@@ -185,8 +185,8 @@
 CREATE TABLE notes (
   `id` smallint(5) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
   `semaine` tinyint(2) unsigned NOT NULL,
-  `eleve` tinyint(2) unsigned NOT NULL,
-  `colleur` tinyint(2) unsigned NOT NULL,
+  `eleve` smallint(3) unsigned NOT NULL,
+  `colleur` smallint(3) unsigned NOT NULL,
   `matiere` tinyint(2) unsigned NOT NULL,
   `note` varchar(4) NOT NULL
 ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/fonctions.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonctions.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/fonctions.php	2015-09-20 05:58:13.055128277 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/fonctions.php	2015-10-13 02:05:30.000000000 +0200
@@ -29,7 +29,7 @@
   }
   // Tout est ok : session valide pendant timeout
   else  {
-    $_SESSION['time'] = time()+$_SESSION['timeout'];
+    $_SESSION['time'] = time()+$_SESSION['timeout']+14400*!$_SESSION['timeout'];
     $autorisation = $_SESSION['autorisation'];
   }
 }
@@ -232,12 +232,17 @@
 ////////////
 
 // En-têtes HTML et début de page
-function debut($mysqli,$titre,$message,$autorisation,$actuel=false,$mathjax=false)  {
+function debut($mysqli,$titre,$message,$autorisation,$actuel=false,$matiere=false)  {
   // Menu seulement si $actuel non vide
   if ( $actuel )  {
     // Récupération et affichage des pages
-    $menu = "<span class=\"icon-menu\" title=\"Afficher le menu\"></span>\n<div id=\"colonne\">\n  <nav>\n";
-    $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0'.( $autorisation ? " AND (id = 1 OR protection <= $autorisation)" : '' ) );
+    $menu = "<a class=\"icon-menu\" title=\"Afficher le menu\"></a>\n<div id=\"colonne\">\n  <nav>\n";
+    if ( !$autorisation )
+      $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0 AND protection < 5');
+    elseif ( $autorisation == 4 )
+      $resultat = $mysqli->query('SELECT cle, nom FROM pages WHERE mat = 0');
+    else 
+      $resultat = $mysqli->query("SELECT cle, nom FROM pages WHERE mat = 0 AND (id = 1 OR protection <= $autorisation)");
     $r = $resultat->fetch_assoc();
     // Page d'accueil
     $menu .= "    <a class=\"icon-accueil\" href=\".?${r['cle']}\" title=\"${r['nom']}\"></a>\n";
@@ -270,13 +275,12 @@
     // Invité/Élèves/Colleurs : on voit ce qui est non vide et autorisé
     if ( !$autorisation )
       $resultat = $mysqli->query("SELECT m.id, m.cle, m.nom, m.colles, m.cdt, m.docs, 0 AS notes, GROUP_CONCAT(CONCAT(m.cle,'/',p.cle) SEPARATOR '//') AS pcle, GROUP_CONCAT(p.nom SEPARATOR '//') AS pnom
-                                  FROM matieres AS m LEFT JOIN pages AS p ON p.mat = m.id
-                                  WHERE m.colles+m.cdt+m.docs OR ( p.nom IS NOT NULL AND p.protection < 5 ) GROUP BY m.id ORDER BY m.ordre, p.ordre");
+                                  FROM matieres AS m LEFT JOIN (SELECT * FROM pages WHERE protection < 5) AS p ON p.mat = m.id
+                                  WHERE m.colles+m.cdt+m.docs OR p.nom IS NOT NULL GROUP BY m.id ORDER BY m.ordre, p.ordre");
     elseif ( $autorisation == 4 )
       $resultat = $mysqli->query("SELECT m.id, m.cle, m.nom, m.colles, m.cdt, m.docs, m.notes, GROUP_CONCAT(CONCAT(m.cle,'/',p.cle) SEPARATOR '//') AS pcle, GROUP_CONCAT(p.nom SEPARATOR '//') AS pnom
-                                  FROM matieres AS m LEFT JOIN pages AS p ON p.mat = m.id
-                                  WHERE m.colles+m.cdt+m.docs+m.notes OR FIND_IN_SET(m.id,'${_SESSION['matieres']}') OR ( p.nom IS NOT NULL AND p.protection < 5 )
-                                  GROUP BY m.id ORDER BY m.ordre, p.ordre");
+                                  FROM matieres AS m LEFT JOIN (SELECT * FROM pages WHERE protection < 5 OR FIND_IN_SET(mat,'${_SESSION['matieres']}')) AS p ON p.mat = m.id
+                                  WHERE m.colles+m.cdt+m.docs+m.notes OR p.nom IS NOT NULL OR FIND_IN_SET(m.id,'${_SESSION['matieres']}') GROUP BY m.id ORDER BY m.ordre, p.ordre");
     else  {
       if ( $autorisation == 1 )
         $notes = '0';
@@ -287,13 +291,14 @@
       $resultat = $mysqli->query("SELECT m.id, m.cle, m.nom, (colles AND colles_protection<=$autorisation ) AS colles,
                                   (cdt AND  cdt_protection<=$autorisation ) AS cdt, (docs AND r.protection<=$autorisation ) AS docs,
                                   $notes AS notes, GROUP_CONCAT(CONCAT(m.cle,'/',p.cle) SEPARATOR '//') AS pcle, GROUP_CONCAT(p.nom SEPARATOR '//') AS pnom
-                                  FROM matieres AS m LEFT JOIN pages AS p ON p.mat = m.id LEFT JOIN reps AS r ON r.matiere = m.id AND r.parent = 0
-                                  WHERE FIND_IN_SET(m.id,'${_SESSION['matieres']}') AND ( $notes OR (docs AND r.protection<=$autorisation ) OR (colles AND colles_protection<=$autorisation ) OR (cdt AND cdt_protection<=$autorisation ) OR ( p.nom IS NOT NULL AND p.protection<=$autorisation ) )
+                                  FROM matieres AS m LEFT JOIN (SELECT * FROM pages WHERE protection <=$autorisation ) AS p ON p.mat = m.id LEFT JOIN reps AS r ON r.matiere = m.id AND r.parent = 0
+                                  WHERE FIND_IN_SET(m.id,'${_SESSION['matieres']}') AND ( $notes OR (docs AND r.protection<=$autorisation ) OR (colles AND colles_protection<=$autorisation ) OR (cdt AND cdt_protection<=$autorisation ) OR p.nom IS NOT NULL )
                                   GROUP BY m.id ORDER BY m.ordre, p.ordre");
     }
     if ( $resultat->num_rows )  {
       while ( $r = $resultat->fetch_assoc() )  {
-        if ( ( $autorisation == 4 ) && ( in_array($r['id'],explode(',',$_SESSION['matieres'])) ) )  {
+        $edition = ( $autorisation == 4 ) && ( in_array($r['id'],explode(',',$_SESSION['matieres'])) );
+        if ( $edition )  {
           $menu .= "    <h3><span class=\"icon-edite\"></span>${r['nom']}</h3>\n";
           $r['colles'] = $r['cdt'] = $r['docs'] = $r['notes'] = 1;
         }
@@ -312,7 +317,7 @@
           $menu .= "    <a href=\"colles?${r['cle']}\">Programme de colles</a>\n";
         if ( $r['cdt'] )  {
           $menu .= "    <a href=\"cdt?${r['cle']}\">Cahier de texte</a>\n";
-          if ( ( substr($actuel,0,3) == 'cdt' ) && ( substr($actuel,-strlen($r['cle'])-1) == "?${r['cle']}" ) )
+          if ( $edition && ( substr($actuel,0,3) == 'cdt' ) && ( substr($actuel,-strlen($r['cle'])-1) == "?${r['cle']}" ) )
             $menu .= "      <a class=\"menurep\" href=\"cdt-seances?${r['cle']}\">Types de séances</a>\n      <a class=\"menurep\" href=\"cdt-raccourcis?${r['cle']}\">Raccourcis de séances</a>\n";
         }
         if ( $r['docs'] )  {
@@ -348,7 +353,7 @@
     $recent = '';
     $resultat = $mysqli->query('SELECT titre, lien FROM recents WHERE DATEDIFF(NOW(),heure) < 10'.( ($autorisation) ? " AND FIND_IN_SET(matiere,'${_SESSION['matieres']}')" : '' ).' LIMIT 20');
     if ( $resultat->num_rows )  {
-      $menu = "<span class=\"icon-recent\" title=\"Afficher les informations récentes\"></span>\n$menu";
+      $menu = "<a class=\"icon-recent\" title=\"Afficher les informations récentes\"></a>\n$menu";
       while ( $r = $resultat->fetch_assoc() )
         $recent .= "\n    <a href=\"${r['lien']}\" title=\"".substr($r['titre'],strpos($r['titre'],'/span>')+7)."\">${r['titre']}</a>";
       $resultat->free();
@@ -370,8 +375,18 @@
   // Message si non vide
   if ( strlen($message) )
     $message = "  <div class=\"warning\">$message</div>\n";
+  elseif ( $autorisation == 4 )  {
+    $resultat = $mysqli->query('SELECT id FROM utilisateurs WHERE LENGTH(mdp)=41');
+    if ( $n = $resultat->num_rows )  {
+      $resultat->free();
+      $n = ( $n > 1 ) ? "$n comptes" : "1 compte";
+      $message = '  <div class="warning">Il y a actuellement '.(( $n > 1 ) ? "$n comptes" : "1 compte").' en attente de validation de votre part. C\'est assez urgent... Il faut aller sur la page de gestion des <a href="utilisateurs">utilisateurs</a> pour les valider.</div>';
+    }
+  }
   // Token CSRF
   $token = ( isset($_SESSION['csrf-token']) ) ? " data-csrf-token=\"${_SESSION['csrf-token']}\"" : '';
+  // Matière
+  $matiere = ( $matiere ) ? " data-matiere=\"$matiere\"" : '';
   // Affichage
   echo <<<FIN
 <!doctype html>
@@ -380,14 +395,14 @@
   <title>$titre</title>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0">
-  <link rel="stylesheet" href="css/style.css" media="screen">
-  <link rel="stylesheet" href="css/icones.css" media="screen">
+  <link rel="stylesheet" href="css/style-min.css?v=2">
+  <link rel="stylesheet" href="css/icones-min.css">
   <script type="text/javascript" src="js/jquery.min.js"></script>
   <link rel="alternate" type="application/rss+xml" title="Flux RSS" href="documents/rss/$rss/rss.xml">
   <!--[if lte IE 8]><script src="js/html5shiv.min.js"></script><![endif]--> 
   <!--[if lte IE 8]><script src="js/respond.min.js"></script><![endif]--> 
 </head>
-<body$token>
+<body$token$matiere>
 <header><h1>$titre</h1></header>
 
 $menu
@@ -405,7 +420,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.js"></script>' : '<script type="text/javascript" src="js/fonctions.js"></script>';
+  $js = ( $edition ) ? '<script type="text/javascript" src="js/edition-min.js?v=4"></script>' : '<script type="text/javascript" src="js/fonctions-min.js"></script>';
   // Affichage de message si $_SESSION['message']
   if ( isset($_SESSION['message']) )  {
     $m = json_decode($_SESSION['message'],true);
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/groupes.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/groupes.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/groupes.php	2015-09-13 01:26:05.594463024 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/groupes.php	2015-10-02 11:01:40.000000000 +0200
@@ -92,7 +92,7 @@
     <div>
       <input type="input" class="ligne" name="nom" value="" size="50" data-placeholder="Nom du groupe (Ex: 1, A, LV2 Espagnol...)">
       <p class="ligne"><label for="mailnotes">Utilisation&nbsp;: </label>
-        <select id="mailnotes" name="mailnotes"><?php echo str_replace("\"2\"","\"2\" selected",$select_mailnotes); ?>
+        <select id="mailnotes" name="mailnotes"><?php echo str_replace("\"3\"","\"3\" selected",$select_mailnotes); ?>
         </select>
       </p>
       <p class="ligne usergrp"><a class="icon-edite" data-uid=""></a><label>Élèves&nbsp;:</label> <span>[Aucun]</span></p>
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/index.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/index.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/index.php	2015-09-13 16:20:35.222652930 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/index.php	2015-09-28 00:27:08.000000000 +0200
@@ -57,7 +57,7 @@
 //////////////
 //// HTML ////
 //////////////
-debut($mysqli,$page['titre'],$message,$autorisation,".?${page['cle']}");
+debut($mysqli,$page['titre'],$message,$autorisation,".?${page['cle']}",( $page['mat'] ) ? $page['mat'] : false);
 
 // MathJax désactivé par défaut
 $mathjax = false;
@@ -88,7 +88,6 @@
 
 // Affichage professeur éditeur
 else  {
-  $classe_mat = ( $page['mat'] ) ? ' mat'.$page['mat'] : '';
   echo <<<FIN
 
   <a class="icon-aide general" data-id="page" title="Aide pour les modifications de cette page"></a>
@@ -125,7 +124,7 @@
     <a class="icon-descend"$descend title="Déplacer cette information vers le bas"></a>
     <a class="icon-supprime" title="Supprimer cette information"></a>
     <h3 class="edition editable" data-id="infos|titre|${r['id']}" data-placeholder="Titre de l'information (non obligatoire)">${r['titre']}</h3>
-    <div class="editable edithtml$classe_mat" data-id="infos|texte|${r['id']}" data-placeholder="Texte de l'information (obligatoire)">
+    <div class="editable edithtml" data-id="infos|texte|${r['id']}" data-placeholder="Texte de l'information (obligatoire)">
 ${r['texte']}
     </div>
   </article>
@@ -153,7 +152,7 @@
     <h3 class="edition">Ajouter une nouvelle information</h3>
     <div>
       <input class="ligne" type="text" name="titre" size=50 data-placeholder="Titre de l'information (non obligatoire)">
-      <textarea name="texte" class="edithtml<?php echo $classe_mat; ?>" rows="10" cols="100" data-placeholder="Texte de l'information (obligatoire)"></textarea>
+      <textarea name="texte" class="edithtml" rows="10" cols="100" data-placeholder="Texte de l'information (obligatoire)"></textarea>
       <p class="ligne"><label for="cache">Ne pas diffuser sur la partie publique&nbsp;: </label><input type="checkbox" id="cache" name="cache" value="1"></p>
     </div>
     <input type="hidden" name="page" value="<?php echo $page['id']; ?>">
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/js/edition.js /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition.js
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/js/edition.js	2015-09-20 14:56:05.383863757 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition.js	2015-10-03 23:49:28.000000000 +0200
@@ -161,14 +161,20 @@
           this.value = nettoie(this.value);
       })
       .on("paste cut",function() {
-        this.value = nettoie(this.value);
+        var el = this;
+        setTimeout(function() {
+          el.value = nettoie(el.value);
+        }, 100);
       });
     ce.on("keypress",function(e) {
         if (e.which == 13)
           boutonretour.click();
       })
       .on("paste cut",function() {
-        this.innerHTML = nettoie(this.innerHTML)+'<br>';
+        var el = this;
+        setTimeout(function() {
+          el.innerHTML = nettoie(el.innerHTML)+'<br>';
+        }, 100);
       });
     // Clic bouton "nosource" : passage de textarea à div
     ta.prev().children('.icon-nosource').on("click", function(e) {
@@ -374,7 +380,8 @@
       // Modification de la date (prochain lundi/mardi..)
       if ( cle == 'jour' ) {
         var t = new Date;
-        t.setDate(t.getDate()-7+parseInt(valeurs['jour'])-t.getDay());
+        var j = parseInt(valeurs['jour']);
+        t.setDate( ( j > t.getDay() ) ? t.getDate()-t.getDay()-7+j : t.getDate()-t.getDay()+j );
         form.find('[name="jour"]').val(zero(t.getDate())+'/'+zero(t.getMonth()+1)+'/'+t.getFullYear());
       }
       // Modification des autres jours
@@ -959,9 +966,10 @@
             $('#fenetre,#fenetre_fond').remove();
           }
         });
-        // Sélection a priori d'une matière (programme de colle, cahier de texte...)
+        // Sélection a priori d'une matière (programme de colle, cahier de texte,
+        // pages associées à une matière)
         $('#mat option').each( function() {
-          if ( el.parents('.avecform').hasClass('mat'+this.value) )
+          if ( $('body').attr('data-matiere') == this.value )
             $('#mat').val(this.value).change();
         });
       }
@@ -1348,8 +1356,10 @@
   });
   // Envoi par appui sur Entrée
   form.find('input,select').on('keypress',function (e) {
-    if ( e.which == 13 )
+    if ( e.which == 13 ) {
+      e.preventDefault();
       article.children('a.icon-ok').click();
+    }
   });
 }
 
@@ -1745,7 +1755,7 @@
     form.find('#fichier').on('change',function () {
       if ( !form.find('#nom').val().length )
         var f = this.value;
-        form.find('#nom').val(f.substring(0,f.lastIndexOf('.')) || f);
+        form.find('#nom').val(f.substring(f.lastIndexOf('\\')+1,f.lastIndexOf('.')) || f);
     });
   }
   // Actions des boutons fermeture, annulation, aide, envoi
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/js/edition-min.js /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition-min.js
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/js/edition-min.js	2015-09-20 07:36:00.012678727 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/js/edition-min.js	2015-10-22 10:37:40.000000000 +0200
@@ -1 +1 @@
-function affiche(c,a){$("#log").removeClass().addClass(a).html(c).append('<span class="icon-ferme"></span>').show().off("click").on("click",function(){window.clearTimeout(b);$(this).hide(500)});var b=window.setTimeout(function(){$("#log").hide(500)},10000)}function afficher_login(a){$("#fenetre,#fenetre_fond").remove();popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>  <p>Vous avez été automatiquement déconnecté. Vous devez vous connecter à nouveau pour valider vos modifications.</p>  <form>  <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>  <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>  </form>',true);$("#login").focus();$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:$("#fenetre form").serialize()+"&"+a.data,dataType:"json",el:"",fonction:function(){return true}}).success(function(b){if(b.etat=="login_nok"){$("#fenetre > p").html(b.message).addClass("warning")}else{$("#fenetre,#fenetre_fond").remove();if(b.etat=="ok"){a.fonction(a.el)}}})});$("#fenetre a.icon-ferme").on("click",function(){affiche("Modification non effectuée, connexion nécessaire","nok")});$("#fenetre input").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}})}function popup(b,c){$("#fenetre,#fenetre_fond").remove();var a=$('<div id="fenetre"></div>').appendTo("body").html(b).focus();if(c){$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()})}else{$('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(a).on("click",function(){$("#fenetre_fond").remove();$(this).remove();$("section").children("div,article").first().before(a.removeAttr("id"))})}$('<a class="icon-ferme" title="Fermer"></a>').prependTo(a).on("click",function(){a.remove();$("#fenetre_fond").remove()})}$.fn.placeholder=function(){this.each(function(){var a=$(this);if(a.is("div")){a.on("change keyup mouseup",function(){if($(this).text().length){$(this).removeClass("placeholder")}else{$(this).addClass("placeholder")}}).change()}else{$('<span class="placeholder">'+this.getAttribute("data-placeholder")+"</span>").insertBefore(a).on("click",function(){$(this).next().focus()}).hide();a.on("change keyup mouseup",function(){if(!(this.value.length)&&($(this).is(":visible"))){$(this).prev().css("display","inline")}else{$(this).prev().hide()}}).change()}})};$.fn.textareahtml=function(){this.each(function(){var a=$(this);var c=this.getAttribute("data-placeholder");this.setAttribute("data-placeholder",c+". Formattage en HTML, balises visibles.");var b=$('<div contenteditable="true" data-placeholder="'+c+'"></div>').insertAfter(a.before(boutons)).hide();var d=a.prev().children(".icon-retour");a.on("keypress",function(f){if(f.which==13){this.value=nettoie(this.value)}}).on("paste cut",function(){this.value=nettoie(this.value)});b.on("keypress",function(f){if(f.which==13){d.click()}}).on("paste cut",function(){this.innerHTML=nettoie(this.innerHTML)+"<br>"});a.prev().children(".icon-nosource").on("click",function(h){h.preventDefault();a.hide();a.prev().hide();b.show().css("min-height",a.outerHeight());$(this).hide().prev().show();b.focus().html(nettoie(a.val())).change();if(window.getSelection){var g=document.createRange();g.selectNodeContents(b[0]);g.collapse(false);var f=window.getSelection();f.removeAllRanges();f.addRange(g)}else{var g=document.body.createTextRange();g.moveToElementText(b[0]);g.collapse(false);g.select()}});a.prev().children(".icon-source").on("click",function(f){f.preventDefault();b.hide(0);a.show(0).css("height",b.height());$(this).hide().next().show();a.focus().val(nettoie(b.html())).change()}).hide();a.prev().children(".icon-aide").on("click",function(f){f.preventDefault();aidetexte()});a.prev().children().not(".icon-nosource,.icon-source,.icon-aide").on("click",function(f){f.preventDefault();window["insertion_"+this.className.substring(5)]($(this))})})};$.fn.editinplace=function(){this.each(function(){var a=$(this);this.setAttribute("data-original",(a.is("h3"))?a.text():a.html());$('<a class="icon-edite" title="Modifier"></a>').appendTo(a).on("click",transforme)})};function transforme(){var b=$(this).parent().addClass("avecform");if(b.is("div")){b.html('<form><textarea name="val" rows="'+(b.attr("data-original").split(/\r\n|\r|\n/).length+3)+'"></textarea></form>')}else{b.html('<form class="edition" onsubmit="$(this).children(\'a.icon-ok\').click(); return false;"><input type="text" name="val" value=""></form>')}var a=b.find('[name="val"]').val(b.attr("data-original"));if(b.attr("data-placeholder")){a.attr("data-placeholder",b.attr("data-placeholder"));if(b.hasClass("edithtml")){a.textareahtml();a.next().placeholder()}a.placeholder()}$('<a class="icon-ok" title="Valider"></a>').appendTo(b.children()).on("click",function(){var c=b.attr("data-id").split("|");if(b.hasClass("edithtml")){a.val(nettoie((a.is(":visible"))?a.val():a.next().html()))}$.ajax({url:"ajax.php",method:"post",data:{table:c[0],champ:c[1],id:c[2],val:a.val()},dataType:"json",el:b,fonction:function(d){var e=d.find('[name="val"]').val();d.removeClass("avecform").html(e).attr("data-original",e);$('<a class="icon-edite" title="Modifier"></a>').appendTo(d).on("click",transforme)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b.children()).on("click",function(){b.removeClass("avecform").html(b.attr("data-original"));$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transforme)});a.focus().val((b.hasClass("edithtml"))?nettoie(a.val()):a.val())}$.fn.editinplacecdt=function(){this.each(function(){$(this).wrapInner("<span></span>").attr("data-original",$(this).text());$('<a class="icon-edite" title="Modifier"></a>').appendTo($(this)).on("click",transformecdt)})};function transformecdt(){var b=$(this).parent();b.children(".icon-edite").remove();var c=$('<form class="titrecdt"></form>').insertBefore(b.parent().children("div")).html($("#form-cdt").html());c.boutonscdt();c.find('input,[name="demigroupe"]').on("change keyup",function(){var e=new Date(c.find('[name="jour"]').val().replace(/(.{2})\/(.{2})\/(.{4})/,function(i,h,k,j){return j+"-"+k+"-"+h}));var f=(c.find('[name="demigroupe"]').val()==1)?" (en demi-groupe)":"";switch(parseInt(seances[c.find('[name="tid"]').val()])){case 0:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" à "+c.find('[name="h_debut"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 1:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" de "+c.find('[name="h_debut"]').val()+" à "+c.find('[name="h_fin"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 2:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+" pour le "+c.find('[name="pour"]').val()+f;break;case 3:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 4:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val();break;case 5:var g="[Entrée hebdomadaire]"}b.children("span").text(g)});var d=$.parseJSON(b.attr("data-donnees"));for(var a in d){c.find('[name="'+a+'"]').val(d[a])}$('<a class="icon-ok" title="Valider"></a>').appendTo(b).on("click",function(){var e=b.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:"table=cdt&id="+e[1]+"&"+c.serialize(),dataType:"json",el:b,fonction:function(f){var g=f.siblings("form");f.attr("data-original",f.children("span").text()).attr("data-donnees",'{"tid":'+g.find('[name="tid"]').val()+',"jour":"'+g.find('[name="jour"]').val()+'","h_debut":"'+g.find('[name="h_debut"]').val()+'","h_fin":"'+g.find('[name="h_fin"]').val()+'","pour":"'+g.find('[name="pour"]').val()+'","demigroupe":'+g.find('[name="demigroupe"]').val()+"}");g.remove();f.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(f).on("click",transformecdt)}}).success(function(f){if((f.etat=="ok")&&(f.reload=="oui")){location.reload(true)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b).on("click",function(){c.remove();b.children("span").html(b.attr("data-original"));b.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transformecdt)})}$.fn.boutonscdt=function(){form=this;form.find(".date").datepick({dateFormat:"dd/mm/yyyy",showTrigger:'<img src="js/calendar-blue.gif">',onSelect:function(){form.find('[name="h_debut"]').change()}});form.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});var a=function(b){return(String(b).length==1)?"0"+b:String(b)};form.find('[name="raccourci"]').on("change keyup",function(){var d=raccourcis[this.value];for(var c in d){if(c=="jour"){var b=new Date;b.setDate(b.getDate()-7+parseInt(d.jour)-b.getDay());form.find('[name="jour"]').val(a(b.getDate())+"/"+a(b.getMonth()+1)+"/"+b.getFullYear())}else{form.find('[name="'+c+'"]').val(d[c])}}this.setAttribute("data-modif",1);form.find('[name="tid"]').change()}).attr("data-modif",0);form.find('[name="tid"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 1:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().show();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 2:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().show();form.find('[name="demigroupe"]').parent().show();break;case 3:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;default:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().hide();break}form.find('[name="jour"]').change()});form.find('input,[name="demigroupe"]').on("change keyup",function(){if(form.find('[name="raccourci"]').attr("data-modif")==0){form.find('[name="raccourci"]').val(0)}else{form.find('[name="raccourci"]').attr("data-modif",0)}});form.find("input,select").on("keypress",function(b){if(b.which==13){el.find("a.icon-ok").click()}});form.find("select:first").focus();form.find('[name="tid"]').change()};$.fn.affichechamps=function(){this.each(function(){var a=$(this);a.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});a.find('[name="type"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 1:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().show();a.find('[name="demigroupe"]').parent().show();break;case 2:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 3:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;default:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().hide();break}}).change();a.find("input,select").on("keypress",function(b){if(b.which==13){a.find("a.icon-ok").click()}})})};function nettoie(b){if(b.indexOf("cdptmp")>0){var a=$("<div>"+b+"</div>");a.find(".cdptmp").contents().unwrap();b=a.html();if(b.indexOf("cdptmp")>0){b=b.replace(/<span class="cdptmp"><\/span>/g,"")}}return b.replace(/(<\/?[A-Z]+)([^>]*>)/g,function(d,c,e){return c.toLowerCase()+e}).replace(/[\r\n ]+/g," ").replace(/(<br>)+[ ]?<\/(p|div|li|h)/g,function(d,c,e){return"</"+e}).replace(/<br>/g,"<br>\n").replace(/<(p|div|li|h)/g,function(c){return"\n"+c}).replace(/<\/(p|div|li|h.)>/g,function(c){return c+"\n"}).replace(/<\/?(ul|ol)[^>]*>/g,function(c){return"\n"+c+"\n"}).replace(/^(?!(<p|<div|<ul|<ol|<li|<h))(.+)<br>$/gm,function(d,c,e){return"<p>"+e+"</p>"}).replace(/^(?!(<(p|div|ul|ol|li)))[ ]?(.+)[ ]?$/gm,function(d,c,f,e){return(e.match(/.*(p|div|ul|ol|li|h.)>$/))?e:"<p>"+e+"</p>"}).replace(/^[ ]?(<\/?(br|p|div|h.)>){0,2}[ ]?(<\/(p|div|h.)>)?[ ]?$/gm,"").replace(/^\n/gm,"").replace(/<li/g,"  <li")}function insert(d,a,g,e){var b=d.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(!b.hasAttribute("data-selection")){marqueselection(d)}var f=(e===undefined)?a+"Í"+b.getAttribute("data-selection")+"Ì"+g:a+"Í"+e+"Ì"+g;var c=nettoie(b.getAttribute("data-contenu").replace(/Í.*Ì/,f));if(b.tagName=="TEXTAREA"){b.value=c.replace(/[ÍÌ]/g,"")}else{b.innerHTML=c.replace(/[ÍÌ]/g,"")}marqueselection(d,true);$(b).change();if((b.tagName=="TEXTAREA")&&(b.selectionStart!==undefined)){b.selectionStart=c.indexOf("Í");b.selectionEnd=c.indexOf("Ì")-1;b.focus()}else{if(document.selection){if(b.tagName!="TEXTAREA"){c=c.replace(/(<([^>]+)>)[\n]*/g,"")}range=document.body.createTextRange();range.moveToElementText(b);range.collapse(true);range.moveEnd("character",c.indexOf("Ì")-1);range.moveStart("character",c.indexOf("Í"));range.select()}else{if(window.getSelection){b.innerHTML=c.replace("Í",'<span class="cdptmp">').replace("Ì","</span>")+"<br>";selection=window.getSelection();range=document.createRange();range.selectNodeContents($(b).find(".cdptmp")[0]);selection.removeAllRanges();selection.addRange(range);b.focus()}}}}function marqueselection(f,c){var a=f.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(c){a.removeAttribute("data-selection");a.removeAttribute("data-contenu");return true}var d=(a.tagName=="TEXTAREA")?a.value:a.innerHTML;var g="";if((a.tagName=="TEXTAREA")&&(a.selectionStart!==undefined)){a.focus();g=a.value.substring(a.selectionStart,a.selectionEnd);a.value=a.value.substr(0,a.selectionStart)+"Í"+g+"Ì"+a.value.substring(a.selectionEnd)}else{if(window.getSelection){var b=window.getSelection().getRangeAt(0);if((a==b.commonAncestorContainer)||$.contains(a,b.commonAncestorContainer)){var g=window.getSelection().toString();b.deleteContents();b.insertNode(document.createTextNode("Í"+g+"Ì"))}}else{var b=document.selection.createRange();if((a==b.parentElement())||$.contains(a,b.parentElement())){var g=document.selection.createRange().text;document.selection.createRange().text="Í"+g+"Ì"}}}if(a.tagName=="TEXTAREA"){var e=a.value;a.value=d}else{var e=a.innerHTML;$(a).html(d)}if(e.indexOf("Ì")<0){e=e+"ÍÌ"}a.setAttribute("data-selection",g);a.setAttribute("data-contenu",e);return g}var boutons='<p class="boutons">  <button class="icon-titres" title="Niveaux de titres"></button>  <button class="icon-par1" title="Paragraphe"></button>  <button class="icon-par2" title="Paragraphe important"></button>  <button class="icon-par3" title="Paragraphe très important"></button>  <button class="icon-retour" title="Retour à la ligne"></button>  <button class="icon-gras" title="Gras"></button>  <button class="icon-italique" title="Italique"></button>  <button class="icon-souligne" title="Souligné"></button>  <button class="icon-omega" title="Insérer une lettre grecque"></button>  <button class="icon-sigma" title="Insérer un signe mathématique"></button>  <button class="icon-exp" title="Exposant"></button>  <button class="icon-ind" title="Indice"></button>  <button class="icon-ol" title="Liste énumérée"></button>  <button class="icon-ul" title="Liste à puces"></button>  <button class="icon-lien1" title="Lien vers un document du site"></button>  <button class="icon-lien2" title="Lien internet"></button>  <button class="icon-tex" title="LATEX!"></button>  <button class="icon-source" title="Voir et éditer le code html"></button>  <button class="icon-nosource" title="Voir et éditer le texte formaté"></button>  <button class="icon-aide" title="Voir et éditer le texte formaté"></button></p>';function insertion_titres(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un titre</h3>  <p>Choisissez le type du titre ci-dessous. Vous pouvez éventuellement modifier le texte (ou pourrez le faire ultérieurement). Il est conseillé d\'utiliser des titres de niveau 2 pour les titres dans les programmes de colle.</p>  <input type="radio" name="titre" id="t3" value="3" checked><h3><label for="t3">Titre de niveau 1 (pour les I,II...)</label></h3><br>  <input type="radio" name="titre" id="t4" value="4"><h4><label for="t4">Titre de niveau 2 (pour les 1,2...)</label></h4><br>  <input type="radio" name="titre" id="t5" value="5"><h5><label for="t5">Titre de niveau 3 (pour les a,b...)</label></h5><br>  <input type="radio" name="titre" id="t6" value="6"><h6><label for="t6">Titre de niveau 4</label></h6><br>  <p class="ligne"><label for="texte">Texte&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre input").on("click keyup",function(){var b="h"+$("[name='titre']:checked").val();$("#apercu").html("<"+b+">"+(($("#texte").val().length)?$("#texte").val():"Texte du titre")+"</"+b+">")}).first().keyup();$("#texte").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).focus();$("#fenetre a.icon-ok").on("click",function(){var b="h"+$("[name='titre']:checked").val();insert(a,"<"+b+">","</"+b+">",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_omega(a){popup("<h3>Insertion d'une lettre grecque</h3>  <p>Cliquez sur la lettre à insérer&nbsp;:</p>  <button>&alpha;</button> <button>&beta;</button> <button>&gamma;</button> <button>&Delta;</button> <button>&delta;</button> <button>&epsilon;</button> <button>&eta;</button> <button>&Theta;</button> <button>&theta;</button> <button>&Lambda;</button> <button>&lambda;</button> <button>&mu;</button> <button>&nu;</button> <button>&xi;</button> <button>&Pi;</button> <button>&pi;</button> <button>&rho;</button> <button>&Sigma;</button> <button>&sigma;</button> <button>&tau;</button> <button>&upsilon;</button> <button>&Phi;</button> <button>&phi;</button> <button>&Psi;</button> <button>&psi;</button> <button>&Omega;</button> <button>&omega;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_sigma(a){popup("<h3>Insertion d'un symbole mathématique</h3>  <p>Cliquez sur le symbole à insérer&nbsp;:</p>  <button>&forall;</button> <button>&exist;</button> <button>&part;</button> <button>&nabla;</button> <button>&prod;</button> <button>&sum;</button> <button>&plusmn;</button> <button>&radic;</button> <button>&infin;</button> <button>&int;</button> <button>&prop;</button> <button>&sim;</button> <button>&cong;</button> <button>&asymp;</button> <button>&ne;</button> <button>&equiv;</button> <button>&le;</button> <button>&ge;</button> <button>&sub;</button> <button>&sup;</button> <button>&nsub;</button> <button>&sube;</button> <button>&supe;</button> <button>&isin;</button> <button>&notin;</button> <button>&ni;</button> <button>&oplus;</button> <button>&otimes;</button> <button>&sdot;</button> <button>&and;</button> <button>&or;</button> <button>&cap;</button> <button>&cup;</button> <button>&real;</button> <button>&image;</button> <button>&empty;</button> <button>&deg;</button> <button>&prime;</button> <button>&micro;</button> <button>&larr;</button> <button>&uarr;</button> <button>&rarr;</button> <button>&darr;</button> <button>&harr;</button> <button>&lArr;</button> <button>&uArr;</button> <button>&rArr;</button> <button>&dArr;</button> <button>&hArr;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_ol(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste numérotée</h3>  <p>Choisissez le type de numérotation et la valeur de départ de la liste ci-dessous. Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne. Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <p class="ligne"><label for="t1">Numérotation numérique (1, 2, 3...)</label><input type="radio" name="type" id="t1" value="1" checked></p>  <p class="ligne"><label for="t2">Numérotation alphabétique majuscule (A, B, C...)</label><input type="radio" name="type" id="t2" value="A"></p>  <p class="ligne"><label for="t3">Numérotation alphabétique minuscule (a, b, c...)</label><input type="radio" name="type" id="t3" value="a"></p>  <p class="ligne"><label for="t4">Numérotation romaine majuscule (I, II, III...)</label><input type="radio" name="type" id="t4" value="I"></p>  <p class="ligne"><label for="t5">Numérotation romaine minuscule (i, ii, iii...)</label><input type="radio" name="type" id="t5" value="i"></p>  <p class="ligne"><label for="debut">Valeur de début (numérique)</label><input type="text" id="debut" value="1"></p>  <p class="ligne"><label for="lignes">Textes (chaque ligne correspond à un élément de la liste)&nbsp;: </label></p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre :input").on("click keyup",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";$("#apercu").html('<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ol>")}).first().keyup();$("#lignes").focus();$("#fenetre a.icon-ok").on("click",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";var e=$("#lignes").val().trim("\n");var c=e.lastIndexOf("\n");if(c>0){var d=e.substring(c+1);e=e.substring(0,c)}else{var d=""}insert(a,'<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+e.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",d);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_ul(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste à puces</h3>  <p>Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne (chaque ligne correspond à un élément de la la liste). Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#lignes").on("click keyup",function(){$("#apercu").html("<ul><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ul>")}).keyup().focus();$("#fenetre a.icon-ok").on("click",function(){var d=$("#lignes").val().trim("\n");var b=d.lastIndexOf("\n");if(b>0){var c=d.substring(b+1);d=d.substring(0,b)}else{var c=""}insert(a,"<ul><li>"+d.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",c);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_lien1(a){var b=marqueselection(a);popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien vers un document de Cahier de Prépa</h3>  <div><p style="text-align:center; margin: 2em 0;">[Récupération des listes de documents]</p></div>  <div style="display:none;"><hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Veuillez choisir un document]</div></div>',true);$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)});$.ajax({url:"ajax.php",method:"post",data:{recupdoc:""},dataType:"json"}).success(function(d){var e=function(){var g=$("#apercu");var i=$("#doc").val();var h=$("#doc option:selected").text();if(i==0){g.html(h)}else{if($("#vue").is(":checked")){var f=$("#largeur").val();if(h.slice(-4,-1)=="pdf"){if(g.children(".pdf").length==0){g.html('<div><object data="download?id='+i+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+i+'">'+h+"</a> </object></div>")}else{if(g.find("object").attr("data").substr(12)!=i){g.find("object").attr("data","download?id="+i).html('<a href="download?id='+i+'">'+h+"</a>")}}g.children().attr("class","pdf "+$("#format").val());if(f){if(f==100){g.children().removeAttr("style").children().attr("width","100%").removeAttr("style")}else{g.children().css("padding-bottom",($('<div class="'+$("#format").val()+'"></div>').css("padding-bottom").slice(0,-1)*f/100)+"%");g.find("object").attr("width",f+"%").css("left",(100-f)/2+"%")}}}else{if("jpgpegpng".indexOf(h.slice(-4,-1))>-1){if(g.children("img").length==0){g.css("text-align","").html('<img src="download?id='+i+'">')}else{if(g.children().attr("src").substr(12)!=i){g.children().attr("src","download?id="+i)}}if(f){if(f==100){g.children().removeAttr("style")}else{g.children().css("width",f+"%").css("margin-left",(100-f)/2+"%")}}}}}else{$("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")}}};var c=function(f){$("#fenetre > div:first").html('  <p>Choisissez ci-dessous le répertoire puis le document à insérer. Vous pouvez aussi modifier le texte visible. Cela reste modifiable ultérieurement&nbsp;: le texte est situé entre les deux balises &lt;a...&gt; et &lt;/a&gt;.</p>  <p class="ligne"><label for="mat">Matière&nbsp;:</label><select id="mat">'+f.mats+'</select></p>  <p class="ligne"><label for="rep">Répertoire&nbsp;:</label><select id="rep"></select></p>  <p class="ligne"><label for="doc">Document&nbsp;:</label><select id="doc"></select></p>  <p class="ligne"><label for="texte">Texte visible&nbsp;:</label><input type="text" id="texte" value="'+b+'" size="80" data-auto="1"></p>  <p class="ligne"><label for="vue">Afficher dans la page (PDF et image uniquement)</label><input type="checkbox" id="vue">  <p class="ligne"><label for="largeur">Largeur en %&nbsp;:</label><input type="text" id="largeur" value="100" size="3"></p>  <p class="ligne"><label for="format">Format (PDF uniquement)</label><select id="format">    <option value="portrait">A4 vertical</option><option value="paysage">A4 horizontal</option><option value="hauteur50">Hauteur 50%</option>  </select>');$("#fenetre > div:last").show();if($("#texte").val().length){$("#texte").attr("data-auto",0)}$("#doc").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}var h=$("#doc option:selected").text();if($("#texte").attr("data-auto")==1){$("#texte").val((this.value>0)?h.substr(0,h.lastIndexOf("(")-1):"---")}if("pdfjpgpegpng".indexOf(h.slice(-4,-1))>-1){$("#vue").change().parent().show()}else{$("#vue, #largeur, #format").parent().hide()}e()});$("#texte").on("change keypress",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value.length==0){this.setAttribute("data-auto",1);$("#doc").change()}else{this.setAttribute("data-auto",0);e()}});$("#vue").on("change",function(){if($("#vue").is(":checked")){if($("#doc option:selected").text().slice(-4,-1)=="pdf"){$("#largeur, #format").parent().show();$("#texte").parent().hide()}else{if("jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1){$("#largeur").parent().show();$("#format, #texte").parent().hide()}}}else{$("#texte").parent().show();$("#largeur, #format").parent().hide()}e()});$("#format").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}e()});$("#largeur").on("keydown",function(g){if(g.which==38){++this.value}else{if(g.which==40){--this.value}}}).on("change keyup",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value!=this.getAttribute("data-valeur")){this.setAttribute("data-valeur",this.value);e()}}).attr("data-valeur",100);$("#rep").on("change",function(){$("#doc").html(f.docs[this.value]).change()});$("#mat").on("change",function(){$("#rep").html(f.reps[this.value]).change()}).focus().change();$("#fenetre a.icon-ok").on("click",function(){if($("#doc").val()){if($("#vue").is(":checked")&&("pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1)){insert(a,$("#apercu").html(),"","")}else{insert(a,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val())}$("#fenetre,#fenetre_fond").remove()}});$("#mat option").each(function(){if(a.parents(".avecform").hasClass("mat"+this.value)){$("#mat").val(this.value).change()}})};if(d.etat=="login_"){$("#fenetre > div:first").html('<p>Vous n\'êtes actuellement plus connecté. Vous devez vous identifier à nouveau pour récupérer la liste des répertoires et documents disponibles.</p>        <form>        <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>        <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>        </form>');$("#fenetre input").on("keypress",function(f){if(f.which==13){$("#fenetre a.icon-ok").click()}});$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:{login:$("#login").val(),motdepasse:$("#motdepasse").val(),recupdoc:""},dataType:"json"}).success(function(f){if(f.etat=="login_nok"){$("#fenetre > div:first > p:first").html(f.message).addClass("warning")}else{if(f.etat=="ok_"){c(f)}}})})}else{if(d.etat=="ok_"){c(d)}}})}function insertion_lien2(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien</h3>  <p class="ligne"><label for="texte">Texte visible&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <p class="ligne"><label for="url">Adresse&nbsp;: </label><input type="text" id="url" value="http://" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;"></div>',true);$("#fenetre input").on("click keyup",function(){$("#apercu").html(($("#texte").val().length)?'<a onclick="return false;" href="'+$("#url").val()+'">'+$("#texte").val()+"</a>":"[Écrivez un texte visible]")}).on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).first().keyup().focus();$("#fenetre a.icon-ok").on("click",function(){insert(a,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_tex(b){var d=(typeof MathJax=="undefined")?'<script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"><\/script><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax:{inlineMath:[["$","$"],["\\\\(","\\\\)"]]}});<\/script>':"";var c=marqueselection(b);var a="t1";if(c.length){switch(c.substring(0,2)){case"\\[":case"$$":a="t2";case"\\(":c=c.substring(2,c.length-2);break;default:c=c.trim("$")}}popup(d+'<a class="icon-montre" title="Mettre à jour l\'aperçu"></a><a class="icon-ok" title="Valider"></a><h3>Insertion de formules LaTeX</h3>  <p>Vous pouvez ci-dessous entrer et modifier une formule LaTeX. L\'aperçu présent en bas sera mis à jour uniquement lorsque vous cliquez sur l\'icône <span class="icon-montre"></span>.</p>  <p class="ligne"><label for="t1">La formule est en ligne (pas de retour)</label><input type="radio" name="type" id="t1" value="1"></p>  <p class="ligne"><label for="t2">La formule est hors ligne (formule centrée)</label><input type="radio" name="type" id="t2" value="2"></p>  <textarea id="formule" rows="3">'+c+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Demandez l\'aperçu en cliquant sur l\'icône <span class="icon-montre"></span>]</div>',true);$("#"+a).prop("checked",true);$("#formule").focus();$("#fenetre a.icon-montre").on("click",function(){if($("#formule").val().length){$("#apercu").html(($("#t1").is(":checked"))?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left");MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])}else{$("#apercu").html("[Écrivez une formule]").css("text-align","center")}});$("#fenetre a.icon-ok").on("click",function(){if($("#t1").is("checked")){insert(b,"$","$",$("#formule").val())}else{insert(b,"\\[","\\]",$("#formule").val())}$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(b,true)})}function insertion_par1(a){insert(a,"<p>","</p>")}function insertion_par2(a){insert(a,"<div class='note'>","</div>")}function insertion_par3(a){insert(a,"<div class='annonce'>","</div>")}function insertion_retour(a){insert(a,"<br>","")}function insertion_gras(a){insert(a,"<strong>","</strong>")}function insertion_italique(a){insert(a,"<em>","</em>")}function insertion_souligne(a){insert(a,"<u>","</u>")}function insertion_exp(a){insert(a,"<sup>","</sup>")}function insertion_ind(a){insert(a,"<sub>","</sub>")}function aidetexte(){popup('<h3>Aide et explications</h3>  <p>Il y a deux modes d\'éditions possibles pour éditer un texte&nbsp;: le mode «&nbsp;balises visibles&nbsp;» et le mode «&nbsp;balises invisibles&nbsp;». Il est possible de passer de l\'un à l\'autre&nbsp;:</p>  <ul>    <li><span class="icon-source"></span> permet de passer en mode «&nbsp;balises visibles&nbsp;» (par défaut), où le texte à taper est le code HTML de l\'article. Ce mode est plus précis. Les boutons aux dessus aident à utiliser les bonnes balises.</li>    <li><span class="icon-nosource"></span> permet de passer en mode «&nbsp;balises invisibles&nbsp;», où le texte est tel qu\'il sera affiché sur la partie publique, et modifiable. Ce mode est moins précis, mais permet le copié-collé depuis une page web ou un document Word/LibreOffice.  </ul>  <p>Une fonction de nettoyage du code HTML, permettant d\'assurer une homogénéité et une qualité d\'affichage optimales, est lancée à chaque commutation entre les deux modes, à chaque clic sur un des boutons disponibles, à chaque copie/coupe de texte et à chaque passage à la ligne.</p>  <p>En HTML, toutes les mises en formes sont réalisées par un encadrement de texte entre deux balises&nbsp;: &lt;h3&gt; et &lt;/h3&gt; pour un gros titre, &lt;p&gt; et &lt;/p&gt; pour un paragraphe. Le retour à la ligne simple, qui ne doit exister que très rarement, est une balise simple &lt;br&gt;. Mais les boutons disponibles sont là pour vous permettre de réaliser le formattage que vous souhaitez&nbsp;:</p>  <ul>    <li><span class="icon-titres"></span>&nbsp;: différentes tailles de titres (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-par1"></span>&nbsp;: paragraphe classique, qui doit obligatoirement encadrer au minimum chaque ligne de texte. Apparaît automatiquement au passage à la ligne si on l\'oublie.</li>    <li><span class="icon-par2"></span>&nbsp;: paragraphe important, écrit en rouge</li>    <li><span class="icon-par3"></span>&nbsp;: paragraphe très important, écrit en rouge et encadré</li>    <li><span class="icon-retour"></span>&nbsp;: retour à la ligne. Identique à un appui sur Entrée, et souvent inutile.</li>    <li><span class="icon-gras"></span>&nbsp;: mise en gras du texte entre les balises</li>    <li><span class="icon-italique"></span>&nbsp;: mise en italique du texte entre les balises</li>    <li><span class="icon-souligne"></span>&nbsp;: soulignement du texte entre les balises</li>    <li><span class="icon-omega"></span>&nbsp;: lettres grecques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-sigma"></span>&nbsp;: symboles mathématiques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-exp"></span>&nbsp;: mise en exposant du texte entre les balises</li>    <li><span class="icon-ind"></span>&nbsp;: mise en indice du texte entre les balises</li>    <li><span class="icon-ol"></span>&nbsp;: liste numérotée. Une fenêtre supplémentaire permet de choisir le type (1,A,a,I,i) et la première valeur. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-ul"></span>&nbsp;: liste à puces. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-lien1"></span>&nbsp;: lien d\'un document disponible ici (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-lien2"></span>&nbsp;: lien vers un autre site web (fenêtre supplémentaire pour entre l\'adresse)</li>    <li><span class="icon-tex"></span>&nbsp;: insertion de code LaTeX (fenêtre supplémentaire pour le taper)</li>  </ul>  <p class="tex2jax_ignore">Il est possible d\'insérer du code en LaTeX, sur une ligne séparée (balises \\[...\\] ou balises $$...$$) ou au sein d\'une phrase (balises $...$ ou balises \\(...\\)). Il faut ensuite taper du code en LaTeX à l\'intérieur. La prévisualisation est réalisée en direct.</p>',false)}function echange(b,a){if(b.length&&a.length){$("article").css("position","relative");b.css("opacity",0.3);a.css("opacity",0.3);a.animate({top:b.position().top-a.position().top},1000);b.animate({top:(a.outerHeight(true)+a.outerHeight())/2},1000,function(){b.css("opacity",1);a.css("opacity",1);b.insertAfter(a);b.css({position:"static",top:0});a.css({position:"static",top:0})})}}function cache(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().addClass("cache");c.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().removeClass("cache");c.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().prev().is("article"))){d.children(".icon-monte").hide(1000);d.prev().children(".icon-monte").show(1000)}if(!(d.next().is("article"))){d.children(".icon-descend").show(1000);d.prev().children(".icon-descend").hide(1000)}echange(d.prev(),d)}})}function descend(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().is("article"))){d.children(".icon-monte").show(1000);d.next().children(".icon-monte").hide(1000)}if(!(d.next().next().is("article"))){d.children(".icon-descend").hide(1000);d.next().children(".icon-descend").show(1000)}echange(d,d.next())}})}function supprime(b){var a=b.parent();popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){$("#fenetre,#fenetre_fond").remove();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{supprime:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(c[0]=="colles"){d.removeClass("cache");d.children(".icon-cache,.icon-montre,.icon-supprime").remove();d.children(".icon-ajoute").show();d.children("div.editable").each(function(){this.setAttribute("class",this.getAttribute("class").replace("editable","editable-remplace"))}).html("<p>Le programme de colles de cette semaine n'est pas encore défini.</p>")}else{if(c[0]=="utilisateurs"){location.reload(true)}else{d.remove()}}}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function formulaire(a){var c=a.getAttribute("data-id");if(!c){$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:$(a).parent().attr("data-id")},dataType:"json",el:a,fonction:function(e){location.reload(true)}});return true}if(a.hasAttribute("data-remplace")){var d=$("article#"+a.getAttribute("data-remplace"));d.children(".icon-ajoute").after('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');d.children('[class*="-remplace"],.icon-ajoute').hide();var b=$("<form></form>").appendTo(d).html($("#form-"+c).html());b.children('[name="id"]').val(a.getAttribute("data-remplace"))}else{$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertBefore("article:first");var b=$("<form></form>").appendTo(d).html($("#form-"+c).html())}b.find(".edithtml").textareahtml();b.find("[data-placeholder]").placeholder();if(b.children('[name="table"]').val()=="cdt"){b.boutonscdt()}else{if(b.children('[name="table"]').val()=="cdt-seances"){b.affichechamps()}else{if($("table#notes").length){notes(a)}}}b.find(".usergrp > .icon-edite").on("click",function(){utilisateursgroupe(this)});d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children(".icon-annule").on("click",function(){d.children("form,.icon-annule,.icon-ok").remove();d.children('[class*="-remplace"],.icon-ajoute').show()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){b.children(".edithtml").each(function(){this.value=nettoie(($(this).is(":visible"))?this.value:$(this).next().html())});if(b.children('[name="table"]').val()=="notes"){$("#epingle select:not(:visible)").val("x")}$.ajax({url:"ajax.php",method:"post",data:b.serialize(),dataType:"json",el:d,fonction:function(e){if(e.attr("id")=="epingle"){if(!$("#epingle #autoriser").length){location.reload(true)}}else{e.children(".icon-supprime").show();if(e.find('[name="cache"]').is(":checked")){e.children(".icon-montre").show();e.addClass("cache")}else{e.children(".icon-cache").show()}e.children('[class*="-remplace"]').show().each(function(){this.setAttribute("class",this.getAttribute("class").replace("-remplace",""));var f=this.getAttribute("data-id");$(this).html(d.find('[name="'+f.slice(f.indexOf("|")+1,f.lastIndexOf("|"))+'"]').val())});e.children(".editable").editinplace();e.children(".icon-annule,.icon-ok,form").remove()}}})});b.find("input,select").on("keypress",function(f){if(f.which==13){d.children("a.icon-ok").click()}})}function valide(a){var c="";if($("#mail").length){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le mail.","nok")}else{if(!$('[name="sujet"]').val().length){affiche("Il faut un sujet non vide pour envoyer le mail.","nok")}else{c=$("#mail").serialize()}}}else{if($("#planning").length){c=$("form").serialize()}else{var b=$(a).parent();var d=b.parent().attr("data-id").split("|");c="table="+d[0]+"&id="+d[1]+"&"+b.serialize()}}if(c.length){$.ajax({url:"ajax.php",method:"post",data:c,dataType:"json",el:a,fonction:function(e){if(!$(e).is("[data-noreload]")){location.reload(true)}}})}}function suppressionmultiple(a){popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){var b=a.getAttribute("data-id").split("|");$("#fenetre,#fenetre_fond").remove();$.ajax({url:"ajax.php",method:"post",data:"table="+b[0]+"&id="+b[1]+"&supprime_"+b[2]+"=1",dataType:"json",el:$(a),fonction:function(c){c.remove()}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function utilisateursmatiere(a){var d=a;var c=d.getAttribute("data-matiere").split("|");popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usermat").children("h3").append(c[0]);$("#fenetre :checkbox").attr("id",function(){return this.name}).on("change",function(){var e=this;var f=e.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:f,matiere:c[1],ok:(e.checked?1:0)},dataType:"json",el:e,fonction:function(i){if(i.checked){b=b+","+f;$(e).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+f+",",",").slice(1,-1);$(e).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);var k=$("#fenetre .a4:checked").length;var m=$("#fenetre .a3:checked").length;var j=$("#fenetre .a2:checked").length;var h=$("#fenetre .a1:checked").length;var l=k+m+j+h;if(l){var g="";if(k){g+=", "+k+" professeur"+(k>1?"s":"")}if(m){g+=", "+m+" colleur"+(m>1?"s":"")}if(j){g+=", "+j+" élève"+(j>1?"s":"")}if(h){g+=", "+h+" invité"+(h>1?"s":"")}$(d).parent().children("span").text("Cette matière concerne "+l+" utilisateur"+(l>1?"s":"")+" dont "+g.substr(1)+".")}else{$(d).parent().children("span").text("Cette matière ne concerne aucun utilisateur.")}}}).success(function(g){if(g.etat!="ok"){e.checked=!e.checked}})});var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursgroupe(a){var d=a;var c=$(a).parent().parent();popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usergrp").children("h3").append(c.find("span.editable").text()||c.find("input").val());$("#fenetre :checkbox").attr("id",function(){return this.name});if(c.is("div")){$("#fenetre :checkbox").on("change",function(){$(this).prev().toggleClass("labelchecked",a.checked)});$('<a class="icon-ok" title="Valider"></a>').insertAfter("#fenetre .icon-ferme").on("click",function(){var e=$("#fenetre input:checked").map(function(){return this.id.replace("u","")}).get().join();d.setAttribute("data-uid",e);$(d).parent().next().val(e);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "));$("#fenetre, #fenetre_fond").remove()})}else{$("#fenetre :checkbox").on("change",function(){var f=this;var e=f.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",id:c.attr("data-id").split("|")[1],eleve:e,ok:(f.checked?1:0)},dataType:"json",el:f,fonction:function(g){if(g.checked){b=b+","+e;$(f).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+e+",",",").slice(1,-1);$(f).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "))}}).success(function(g){if(g.etat!="ok"){f.checked=!f.checked}})})}var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursmail(c){popup($("#form-utilisateurs").html(),true);var b=$('[name="id-copie"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest[]"][value="'+b[a]+'"]').prop("checked",true)}b=$('[name="id-bcc"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest_bcc[]"][value="'+b[a]+'"]').prop("checked",true)}$("#fenetre .icon-cocher").on("click keyup",function(){var d=this.getAttribute("data-classe");$("#fenetre ."+d+":not(:disabled)").prop("checked",true);$(this).hide();$(this).next().show();d=(d.indexOf("bcc")>0)?d.replace("bcc","c"):d.replace("c","bcc");$("#fenetre ."+d+":not(:disabled)").prop("checked",false);$('#fenetre .icon-cocher[data-classe="'+d+'"]').show();$('#fenetre .icon-decocher[data-classe="'+d+'"]').hide()});$("#fenetre .icon-decocher").on("click keyup",function(){$("#fenetre ."+this.getAttribute("data-classe")+":not(:disabled)").prop("checked",false);$(this).hide();$(this).prev().show()}).hide();$("#fenetre :checkbox[name]").on("change",function(){if($(this).is(":checked")){$('#fenetre :checkbox[name][value="'+this.value+'"][name!="'+this.name+'"]').prop("checked",false)}});$("#fenetre :checkbox:not([name])").on("click",function(){var e=this.value.split(",");for(var d=0;d<e.length;d++){$('#fenetre :checkbox[name="'+this.className+'[]"][value="'+e[d]+'"]').prop("checked",$(this).prop("checked")).change()}if($(this).is(":checked")){$('#fenetre :checkbox[class="'+((this.className=="dest")?"dest_bcc":"dest")+'"][value="'+this.value+'"]').prop("checked",false)}});$("#fenetre .icon-ok").on("click",function(){$('[name="id-copie"]').val($('#fenetre [name="dest[]"]:checked').map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($('#fenetre [name="dest_bcc[]"]:checked').map(function(){return this.value}).get().join(","));$(c).prev().text($('#fenetre [name="dest[]"]:checked').parent().prev().map(function(){return $(this).text().replace(" (identifiant)","")}).get().concat($('#fenetre [name="dest_bcc[]"]:checked').parent().prev().prev().map(function(){return $(this).text().replace(" (identifiant)","")+" (CC)"}).get()).join(", "));if(!$(c).prev().text().length){$(c).prev().text("[Personne]")}$("#fenetre, #fenetre_fond").remove()})}function notes(e){if($("#epingle :checkbox").length){$("#epingle tr[data-id]").hide()}$("#epingle :checkbox").on("click",function(){var g=$("#epingle .grpnote:checked").map(function(){return this.value.split(",")}).get().concat();$("#epingle tr[data-id]").hide();for(var f=0;f<g.length;f++){$('#epingle tr[data-id="'+g[f]+'"]').show()}});$("#epingle tr[data-id]").each(function(){$(this).children("td:last").html($("#epingle div").html());$(this).find("select").attr("name","e"+$(this).attr("data-id"))});$("#epingle div").remove();if(e.getAttribute("data-eleves")){$("#epingle h4").text($(e).parent().children("h3").text());$('#epingle [name="id"]').val($(e).parent().attr("data-id").split("|")[1]);var b=e.getAttribute("data-eleves").split("|");var d=e.getAttribute("data-notes").split("|");for(var c=0;c<b.length;c++){$('#epingle tr[data-id="'+b[c]+'"]').show().find("select").val(d[c])}var a=dejanotes[$('#epingle [name="id"]').val().split("-")[0]].split(",");for(c=0;c<a.length;c++){$('#epingle tr[data-id="'+a[c]+'"]:not(:visible)').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}else{$("#epingle #semaine").on("change keyup",function(){var f=$(this).val().split("-")[0];$(".dejanote td:first-child").each(function(){$(this).text($(this).text().replace(" (noté par un autre colleur)",""))});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);if(f>0){var g=dejanotes[f].split(",");for(var h=0;h<g.length;h++){$('#epingle tr[data-id="'+g[h]+'"]').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}})}}function envoimail(a){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le mail.","nok")}else{$.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(b){location.reload(true)}})}}function modifierepertoire(b){var d=(b.className=="icon-edite")?"repertoire":"ajouterep";$("#epingle").remove();var e=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");var c=$('<form onsubmit="return false;"></form>').appendTo(e).html($("#form-"+d).html());if(d=="repertoire"){var g=$(b).parent().attr("data-id").split("|")[1];var f=$(b).parent().attr("data-donnees").split("|");var a=$(b).parent().children(".nom").text().split("/").pop()||$(b).parent().find("input").val();c.find("em").text(a);if(f[0]==0){c.find("#nom,#parent,#menu").parent().remove()}else{c.find("#nom").val(a);c.find('[data-parents*=",'+g+',"]').prop("disabled",true);if(f[1]=="1"){c.find("#menu").prop("checked",true)}}$('#protection option[value="'+f[2]+'"]').prop("selected",true);c.find('[name="id"]').val(g)}e.children(".icon-ferme").on("click",function(){$("#epingle").remove()});e.children("a.icon-aide").on("click",function(){popup($("#aide-"+d).html(),false)});e.children("a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:c.serialize(),dataType:"json",el:e,fonction:function(h){location.reload(true)}})});c.find("input,select").on("keypress",function(h){if(h.which==13){e.children("a.icon-ok").click()}})}function modifiedocument(b){var c=(b.className=="icon-edite")?"document":"ajoutedoc";$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");form=$('<form onsubmit="return false;"></form>').appendTo(d).html($("#form-"+c).html());var a=$(b).parent().children(".nom").text()||$(b).parent().find("input").val();form.find("em").text(a);if(c=="document"){form.find("#nom").val(a);$('#protection option[value="'+$(b).parent().attr("data-protection")+'"]').prop("selected",true);form.find('[name="id"]').val($(b).parent().attr("data-id").split("|")[1])}else{$('#protection option[value="'+$(b).parent().attr("data-donnees").split("|")[2]+'"]').prop("selected",true);form.find('[name="parent"]').val($(b).parent().attr("data-id").split("|")[1]);form.find("#fichier").on("change",function(){if(!form.find("#nom").val().length){var e=this.value}form.find("#nom").val(e.substring(0,e.lastIndexOf("."))||e)})}d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){var e=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:e,dataType:"json",contentType:false,processData:false,el:d,fonction:function(f){location.reload(true)}})});form.find("input,select").on("keypress",function(f){if(f.which==13){d.children("a.icon-ok").click()}})}$(document).ajaxSend(function(b,c,a){$("body").css("cursor","wait");if(a.data.append){a.data.append("csrf-token",$("body").attr("data-csrf-token"))}else{a.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+a.data}}).ajaxStop(function(){$("body").css("cursor","auto")}).ajaxSuccess(function(b,d,a){var c=d.responseJSON;switch(c.etat){case"ok":affiche(c.message,"ok");a.fonction(a.el);break;case"nok":affiche(c.message,"nok");break;case"login":afficher_login(a)}});$(function(){$(".editable").editinplace();$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").affichechamps();$(".supprmultiple").on("click",function(){suppressionmultiple(this)});$(".usermat .icon-edite").on("click",function(){utilisateursmatiere(this)});$(".editabledest .icon-edite").on("click",function(){utilisateursmail(this)});$('[name="copie"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"mailprefs",champ:"mailcopy",id:0,val:$(this).prop("checked")?1:0},dataType:"json",el:"",fonction:function(a){return true}})});$("#parentsdoc .icon-edite, .rep > .icon-edite, .icon-ajouterep").on("click",function(){modifierepertoire(this)});$(".doc > .icon-edite, .icon-ajoutedoc").on("click",function(){modifiedocument(this)});$('[name="mailnotes"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",champ:"mailnotes",id:$(this).attr("id").substr(9),val:$(this).find("option:selected").val()},dataType:"json",el:"",fonction:function(a){return true}})});$(".usergrp .icon-edite").on("click",function(){utilisateursgroupe(this)});$("#log").hide().on("click",function(){$(this).hide()});$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime").on("click",function(){window[this.className.substring(5)]($(this))});$("a.icon-aide").on("click",function(){popup($("#aide-"+this.getAttribute("data-id")).html(),false)});$("a.icon-prefs.general,a.icon-ajoute").on("click",function(){formulaire(this)});$("a.icon-ok").on("click",function(){valide(this)});$("a.icon-deconnexion").on("click",function(a){$.ajax({url:"ajax.php",method:"post",data:{deconnexion:1},dataType:"json",el:"",fonction:function(b){location.reload(true)}})});$(".icon-menu").on("click",function(){$("#colonne,nav").toggleClass("visible")})});
\ Pas de fin de ligne à la fin du fichier
+function affiche(c,a){$("#log").removeClass().addClass(a).html(c).append('<span class="icon-ferme"></span>').show().off("click").on("click",function(){window.clearTimeout(b);$(this).hide(500)});var b=window.setTimeout(function(){$("#log").hide(500)},10000)}function afficher_login(a){$("#fenetre,#fenetre_fond").remove();popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>  <p>Vous avez été automatiquement déconnecté. Vous devez vous connecter à nouveau pour valider vos modifications.</p>  <form>  <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>  <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>  </form>',true);$("#login").focus();$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:$("#fenetre form").serialize()+"&"+a.data,dataType:"json",el:"",fonction:function(){return true}}).success(function(b){if(b.etat=="login_nok"){$("#fenetre > p").html(b.message).addClass("warning")}else{$("#fenetre,#fenetre_fond").remove();if(b.etat=="ok"){a.fonction(a.el)}}})});$("#fenetre a.icon-ferme").on("click",function(){affiche("Modification non effectuée, connexion nécessaire","nok")});$("#fenetre input").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}})}function popup(b,c){$("#fenetre,#fenetre_fond").remove();var a=$('<div id="fenetre"></div>').appendTo("body").html(b).focus();if(c){$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()})}else{$('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(a).on("click",function(){$("#fenetre_fond").remove();$(this).remove();$("section").children("div,article").first().before(a.removeAttr("id"))})}$('<a class="icon-ferme" title="Fermer"></a>').prependTo(a).on("click",function(){a.remove();$("#fenetre_fond").remove()})}$.fn.placeholder=function(){this.each(function(){var a=$(this);if(a.is("div")){a.on("change keyup mouseup",function(){if($(this).text().length){$(this).removeClass("placeholder")}else{$(this).addClass("placeholder")}}).change()}else{$('<span class="placeholder">'+this.getAttribute("data-placeholder")+"</span>").insertBefore(a).on("click",function(){$(this).next().focus()}).hide();a.on("change keyup mouseup",function(){if(!(this.value.length)&&($(this).is(":visible"))){$(this).prev().css("display","inline")}else{$(this).prev().hide()}}).change()}})};$.fn.textareahtml=function(){this.each(function(){var a=$(this);var c=this.getAttribute("data-placeholder");this.setAttribute("data-placeholder",c+". Formattage en HTML, balises visibles.");var b=$('<div contenteditable="true" data-placeholder="'+c+'"></div>').insertAfter(a.before(boutons)).hide();var d=a.prev().children(".icon-retour");a.on("keypress",function(f){if(f.which==13){this.value=nettoie(this.value)}}).on("paste cut",function(){var e=this;setTimeout(function(){e.value=nettoie(e.value)},100)});b.on("keypress",function(f){if(f.which==13){d.click()}}).on("paste cut",function(){var e=this;setTimeout(function(){e.innerHTML=nettoie(e.innerHTML)+"<br>"},100)});a.prev().children(".icon-nosource").on("click",function(h){h.preventDefault();a.hide();a.prev().hide();b.show().css("min-height",a.outerHeight());$(this).hide().prev().show();b.focus().html(nettoie(a.val())).change();if(window.getSelection){var g=document.createRange();g.selectNodeContents(b[0]);g.collapse(false);var f=window.getSelection();f.removeAllRanges();f.addRange(g)}else{var g=document.body.createTextRange();g.moveToElementText(b[0]);g.collapse(false);g.select()}});a.prev().children(".icon-source").on("click",function(f){f.preventDefault();b.hide(0);a.show(0).css("height",b.height());$(this).hide().next().show();a.focus().val(nettoie(b.html())).change()}).hide();a.prev().children(".icon-aide").on("click",function(f){f.preventDefault();aidetexte()});a.prev().children().not(".icon-nosource,.icon-source,.icon-aide").on("click",function(f){f.preventDefault();window["insertion_"+this.className.substring(5)]($(this))})})};$.fn.editinplace=function(){this.each(function(){var a=$(this);this.setAttribute("data-original",(a.is("h3"))?a.text():a.html());$('<a class="icon-edite" title="Modifier"></a>').appendTo(a).on("click",transforme)})};function transforme(){var b=$(this).parent().addClass("avecform");if(b.is("div")){b.html('<form><textarea name="val" rows="'+(b.attr("data-original").split(/\r\n|\r|\n/).length+3)+'"></textarea></form>')}else{b.html('<form class="edition" onsubmit="$(this).children(\'a.icon-ok\').click(); return false;"><input type="text" name="val" value=""></form>')}var a=b.find('[name="val"]').val(b.attr("data-original"));if(b.attr("data-placeholder")){a.attr("data-placeholder",b.attr("data-placeholder"));if(b.hasClass("edithtml")){a.textareahtml();a.next().placeholder()}a.placeholder()}$('<a class="icon-ok" title="Valider"></a>').appendTo(b.children()).on("click",function(){var c=b.attr("data-id").split("|");if(b.hasClass("edithtml")){a.val(nettoie((a.is(":visible"))?a.val():a.next().html()))}$.ajax({url:"ajax.php",method:"post",data:{table:c[0],champ:c[1],id:c[2],val:a.val()},dataType:"json",el:b,fonction:function(d){var e=d.find('[name="val"]').val();d.removeClass("avecform").html(e).attr("data-original",e);$('<a class="icon-edite" title="Modifier"></a>').appendTo(d).on("click",transforme)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b.children()).on("click",function(){b.removeClass("avecform").html(b.attr("data-original"));$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transforme)});a.focus().val((b.hasClass("edithtml"))?nettoie(a.val()):a.val())}$.fn.editinplacecdt=function(){this.each(function(){$(this).wrapInner("<span></span>").attr("data-original",$(this).text());$('<a class="icon-edite" title="Modifier"></a>').appendTo($(this)).on("click",transformecdt)})};function transformecdt(){var b=$(this).parent();b.children(".icon-edite").remove();var c=$('<form class="titrecdt"></form>').insertBefore(b.parent().children("div")).html($("#form-cdt").html());c.boutonscdt();c.find('input,[name="demigroupe"]').on("change keyup",function(){var e=new Date(c.find('[name="jour"]').val().replace(/(.{2})\/(.{2})\/(.{4})/,function(i,h,k,j){return j+"-"+k+"-"+h}));var f=(c.find('[name="demigroupe"]').val()==1)?" (en demi-groupe)":"";switch(parseInt(seances[c.find('[name="tid"]').val()])){case 0:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" à "+c.find('[name="h_debut"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 1:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" de "+c.find('[name="h_debut"]').val()+" à "+c.find('[name="h_fin"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 2:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+" pour le "+c.find('[name="pour"]').val()+f;break;case 3:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val()+" : "+c.find('[name="tid"] option:selected').text()+f;break;case 4:var g=jours[e.getDay()]+" "+c.find('[name="jour"]').val();break;case 5:var g="[Entrée hebdomadaire]"}b.children("span").text(g)});var d=$.parseJSON(b.attr("data-donnees"));for(var a in d){c.find('[name="'+a+'"]').val(d[a])}$('<a class="icon-ok" title="Valider"></a>').appendTo(b).on("click",function(){var e=b.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:"table=cdt&id="+e[1]+"&"+c.serialize(),dataType:"json",el:b,fonction:function(f){var g=f.siblings("form");f.attr("data-original",f.children("span").text()).attr("data-donnees",'{"tid":'+g.find('[name="tid"]').val()+',"jour":"'+g.find('[name="jour"]').val()+'","h_debut":"'+g.find('[name="h_debut"]').val()+'","h_fin":"'+g.find('[name="h_fin"]').val()+'","pour":"'+g.find('[name="pour"]').val()+'","demigroupe":'+g.find('[name="demigroupe"]').val()+"}");g.remove();f.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(f).on("click",transformecdt)}}).success(function(f){if((f.etat=="ok")&&(f.reload=="oui")){location.reload(true)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(b).on("click",function(){c.remove();b.children("span").html(b.attr("data-original"));b.children("a").remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(b).on("click",transformecdt)})}$.fn.boutonscdt=function(){form=this;form.find(".date").datepick({dateFormat:"dd/mm/yyyy",showTrigger:'<img src="js/calendar-blue.gif">',onSelect:function(){form.find('[name="h_debut"]').change()}});form.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});var a=function(b){return(String(b).length==1)?"0"+b:String(b)};form.find('[name="raccourci"]').on("change keyup",function(){var e=raccourcis[this.value];for(var d in e){if(d=="jour"){var c=new Date;var b=parseInt(e.jour);c.setDate((b>c.getDay())?c.getDate()-c.getDay()-7+b:c.getDate()-c.getDay()+b);form.find('[name="jour"]').val(a(c.getDate())+"/"+a(c.getMonth()+1)+"/"+c.getFullYear())}else{form.find('[name="'+d+'"]').val(e[d])}}this.setAttribute("data-modif",1);form.find('[name="tid"]').change()}).attr("data-modif",0);form.find('[name="tid"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 1:form.find('[name="h_debut"]').parent().show();form.find('[name="h_fin"]').parent().show();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;case 2:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().show();form.find('[name="demigroupe"]').parent().show();break;case 3:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().show();break;default:form.find('[name="h_debut"]').parent().hide();form.find('[name="h_fin"]').parent().hide();form.find('[name="pour"]').parent().hide();form.find('[name="demigroupe"]').parent().hide();break}form.find('[name="jour"]').change()});form.find('input,[name="demigroupe"]').on("change keyup",function(){if(form.find('[name="raccourci"]').attr("data-modif")==0){form.find('[name="raccourci"]').val(0)}else{form.find('[name="raccourci"]').attr("data-modif",0)}});form.find("input,select").on("keypress",function(b){if(b.which==13){el.find("a.icon-ok").click()}});form.find("select:first").focus();form.find('[name="tid"]').change()};$.fn.affichechamps=function(){this.each(function(){var a=$(this);a.find(".heure").timeEntry({timeSteps:[1,15,0],separator:"h",spinnerImage:"js/spinnerDefault.png"});a.find('[name="type"]').on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 1:a.find('[name="h_debut"]').parent().show();a.find('[name="h_fin"]').parent().show();a.find('[name="demigroupe"]').parent().show();break;case 2:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;case 3:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().show();break;default:a.find('[name="h_debut"]').parent().hide();a.find('[name="h_fin"]').parent().hide();a.find('[name="demigroupe"]').parent().hide();break}}).change();a.find("input,select").on("keypress",function(b){if(b.which==13){a.find("a.icon-ok").click()}})})};function nettoie(b){if(b.indexOf("cdptmp")>0){var a=$("<div>"+b+"</div>");a.find(".cdptmp").contents().unwrap();b=a.html();if(b.indexOf("cdptmp")>0){b=b.replace(/<span class="cdptmp"><\/span>/g,"")}}return b.replace(/(<\/?[A-Z]+)([^>]*>)/g,function(d,c,e){return c.toLowerCase()+e}).replace(/[\r\n ]+/g," ").replace(/(<br>)+[ ]?<\/(p|div|li|h)/g,function(d,c,e){return"</"+e}).replace(/<br>/g,"<br>\n").replace(/<(p|div|li|h)/g,function(c){return"\n"+c}).replace(/<\/(p|div|li|h.)>/g,function(c){return c+"\n"}).replace(/<\/?(ul|ol)[^>]*>/g,function(c){return"\n"+c+"\n"}).replace(/^(?!(<p|<div|<ul|<ol|<li|<h))(.+)<br>$/gm,function(d,c,e){return"<p>"+e+"</p>"}).replace(/^(?!(<(p|div|ul|ol|li)))[ ]?(.+)[ ]?$/gm,function(d,c,f,e){return(e.match(/.*(p|div|ul|ol|li|h.)>$/))?e:"<p>"+e+"</p>"}).replace(/^[ ]?(<\/?(br|p|div|h.)>){0,2}[ ]?(<\/(p|div|h.)>)?[ ]?$/gm,"").replace(/^\n/gm,"").replace(/<li/g,"  <li")}function insert(d,a,g,e){var b=d.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(!b.hasAttribute("data-selection")){marqueselection(d)}var f=(e===undefined)?a+"Í"+b.getAttribute("data-selection")+"Ì"+g:a+"Í"+e+"Ì"+g;var c=nettoie(b.getAttribute("data-contenu").replace(/Í.*Ì/,f));if(b.tagName=="TEXTAREA"){b.value=c.replace(/[ÍÌ]/g,"")}else{b.innerHTML=c.replace(/[ÍÌ]/g,"")}marqueselection(d,true);$(b).change();if((b.tagName=="TEXTAREA")&&(b.selectionStart!==undefined)){b.selectionStart=c.indexOf("Í");b.selectionEnd=c.indexOf("Ì")-1;b.focus()}else{if(document.selection){if(b.tagName!="TEXTAREA"){c=c.replace(/(<([^>]+)>)[\n]*/g,"")}range=document.body.createTextRange();range.moveToElementText(b);range.collapse(true);range.moveEnd("character",c.indexOf("Ì")-1);range.moveStart("character",c.indexOf("Í"));range.select()}else{if(window.getSelection){b.innerHTML=c.replace("Í",'<span class="cdptmp">').replace("Ì","</span>")+"<br>";selection=window.getSelection();range=document.createRange();range.selectNodeContents($(b).find(".cdptmp")[0]);selection.removeAllRanges();selection.addRange(range);b.focus()}}}}function marqueselection(f,c){var a=f.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(c){a.removeAttribute("data-selection");a.removeAttribute("data-contenu");return true}var d=(a.tagName=="TEXTAREA")?a.value:a.innerHTML;var g="";if((a.tagName=="TEXTAREA")&&(a.selectionStart!==undefined)){a.focus();g=a.value.substring(a.selectionStart,a.selectionEnd);a.value=a.value.substr(0,a.selectionStart)+"Í"+g+"Ì"+a.value.substring(a.selectionEnd)}else{if(window.getSelection){var b=window.getSelection().getRangeAt(0);if((a==b.commonAncestorContainer)||$.contains(a,b.commonAncestorContainer)){var g=window.getSelection().toString();b.deleteContents();b.insertNode(document.createTextNode("Í"+g+"Ì"))}}else{var b=document.selection.createRange();if((a==b.parentElement())||$.contains(a,b.parentElement())){var g=document.selection.createRange().text;document.selection.createRange().text="Í"+g+"Ì"}}}if(a.tagName=="TEXTAREA"){var e=a.value;a.value=d}else{var e=a.innerHTML;$(a).html(d)}if(e.indexOf("Ì")<0){e=e+"ÍÌ"}a.setAttribute("data-selection",g);a.setAttribute("data-contenu",e);return g}var boutons='<p class="boutons">  <button class="icon-titres" title="Niveaux de titres"></button>  <button class="icon-par1" title="Paragraphe"></button>  <button class="icon-par2" title="Paragraphe important"></button>  <button class="icon-par3" title="Paragraphe très important"></button>  <button class="icon-retour" title="Retour à la ligne"></button>  <button class="icon-gras" title="Gras"></button>  <button class="icon-italique" title="Italique"></button>  <button class="icon-souligne" title="Souligné"></button>  <button class="icon-omega" title="Insérer une lettre grecque"></button>  <button class="icon-sigma" title="Insérer un signe mathématique"></button>  <button class="icon-exp" title="Exposant"></button>  <button class="icon-ind" title="Indice"></button>  <button class="icon-ol" title="Liste énumérée"></button>  <button class="icon-ul" title="Liste à puces"></button>  <button class="icon-lien1" title="Lien vers un document du site"></button>  <button class="icon-lien2" title="Lien internet"></button>  <button class="icon-tex" title="LATEX!"></button>  <button class="icon-source" title="Voir et éditer le code html"></button>  <button class="icon-nosource" title="Voir et éditer le texte formaté"></button>  <button class="icon-aide" title="Voir et éditer le texte formaté"></button></p>';function insertion_titres(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un titre</h3>  <p>Choisissez le type du titre ci-dessous. Vous pouvez éventuellement modifier le texte (ou pourrez le faire ultérieurement). Il est conseillé d\'utiliser des titres de niveau 2 pour les titres dans les programmes de colle.</p>  <input type="radio" name="titre" id="t3" value="3" checked><h3><label for="t3">Titre de niveau 1 (pour les I,II...)</label></h3><br>  <input type="radio" name="titre" id="t4" value="4"><h4><label for="t4">Titre de niveau 2 (pour les 1,2...)</label></h4><br>  <input type="radio" name="titre" id="t5" value="5"><h5><label for="t5">Titre de niveau 3 (pour les a,b...)</label></h5><br>  <input type="radio" name="titre" id="t6" value="6"><h6><label for="t6">Titre de niveau 4</label></h6><br>  <p class="ligne"><label for="texte">Texte&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre input").on("click keyup",function(){var b="h"+$("[name='titre']:checked").val();$("#apercu").html("<"+b+">"+(($("#texte").val().length)?$("#texte").val():"Texte du titre")+"</"+b+">")}).first().keyup();$("#texte").on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).focus();$("#fenetre a.icon-ok").on("click",function(){var b="h"+$("[name='titre']:checked").val();insert(a,"<"+b+">","</"+b+">",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_omega(a){popup("<h3>Insertion d'une lettre grecque</h3>  <p>Cliquez sur la lettre à insérer&nbsp;:</p>  <button>&alpha;</button> <button>&beta;</button> <button>&gamma;</button> <button>&Delta;</button> <button>&delta;</button> <button>&epsilon;</button> <button>&eta;</button> <button>&Theta;</button> <button>&theta;</button> <button>&Lambda;</button> <button>&lambda;</button> <button>&mu;</button> <button>&nu;</button> <button>&xi;</button> <button>&Pi;</button> <button>&pi;</button> <button>&rho;</button> <button>&Sigma;</button> <button>&sigma;</button> <button>&tau;</button> <button>&upsilon;</button> <button>&Phi;</button> <button>&phi;</button> <button>&Psi;</button> <button>&psi;</button> <button>&Omega;</button> <button>&omega;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_sigma(a){popup("<h3>Insertion d'un symbole mathématique</h3>  <p>Cliquez sur le symbole à insérer&nbsp;:</p>  <button>&forall;</button> <button>&exist;</button> <button>&part;</button> <button>&nabla;</button> <button>&prod;</button> <button>&sum;</button> <button>&plusmn;</button> <button>&radic;</button> <button>&infin;</button> <button>&int;</button> <button>&prop;</button> <button>&sim;</button> <button>&cong;</button> <button>&asymp;</button> <button>&ne;</button> <button>&equiv;</button> <button>&le;</button> <button>&ge;</button> <button>&sub;</button> <button>&sup;</button> <button>&nsub;</button> <button>&sube;</button> <button>&supe;</button> <button>&isin;</button> <button>&notin;</button> <button>&ni;</button> <button>&oplus;</button> <button>&otimes;</button> <button>&sdot;</button> <button>&and;</button> <button>&or;</button> <button>&cap;</button> <button>&cup;</button> <button>&real;</button> <button>&image;</button> <button>&empty;</button> <button>&deg;</button> <button>&prime;</button> <button>&micro;</button> <button>&larr;</button> <button>&uarr;</button> <button>&rarr;</button> <button>&darr;</button> <button>&harr;</button> <button>&lArr;</button> <button>&uArr;</button> <button>&rArr;</button> <button>&dArr;</button> <button>&hArr;</button>",true);$("#fenetre button").on("click",function(){insert(a,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_ol(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste numérotée</h3>  <p>Choisissez le type de numérotation et la valeur de départ de la liste ci-dessous. Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne. Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <p class="ligne"><label for="t1">Numérotation numérique (1, 2, 3...)</label><input type="radio" name="type" id="t1" value="1" checked></p>  <p class="ligne"><label for="t2">Numérotation alphabétique majuscule (A, B, C...)</label><input type="radio" name="type" id="t2" value="A"></p>  <p class="ligne"><label for="t3">Numérotation alphabétique minuscule (a, b, c...)</label><input type="radio" name="type" id="t3" value="a"></p>  <p class="ligne"><label for="t4">Numérotation romaine majuscule (I, II, III...)</label><input type="radio" name="type" id="t4" value="I"></p>  <p class="ligne"><label for="t5">Numérotation romaine minuscule (i, ii, iii...)</label><input type="radio" name="type" id="t5" value="i"></p>  <p class="ligne"><label for="debut">Valeur de début (numérique)</label><input type="text" id="debut" value="1"></p>  <p class="ligne"><label for="lignes">Textes (chaque ligne correspond à un élément de la liste)&nbsp;: </label></p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre :input").on("click keyup",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";$("#apercu").html('<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ol>")}).first().keyup();$("#lignes").focus();$("#fenetre a.icon-ok").on("click",function(){var b=$("#debut").val();b=(b.length&&(b>1))?' start="'+b+'"':"";var e=$("#lignes").val().trim("\n");var c=e.lastIndexOf("\n");if(c>0){var d=e.substring(c+1);e=e.substring(0,c)}else{var d=""}insert(a,'<ol type="'+$("[name='type']:checked").val()+'"'+b+"><li>"+e.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",d);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_ul(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste à puces</h3>  <p>Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne (chaque ligne correspond à un élément de la la liste). Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <textarea id="lignes" rows="5">'+marqueselection(a)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#lignes").on("click keyup",function(){$("#apercu").html("<ul><li>"+(($("#lignes").val().length)?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ul>")}).keyup().focus();$("#fenetre a.icon-ok").on("click",function(){var d=$("#lignes").val().trim("\n");var b=d.lastIndexOf("\n");if(b>0){var c=d.substring(b+1);d=d.substring(0,b)}else{var c=""}insert(a,"<ul><li>"+d.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",c);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_lien1(a){var b=marqueselection(a);popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien vers un document de Cahier de Prépa</h3>  <div><p style="text-align:center; margin: 2em 0;">[Récupération des listes de documents]</p></div>  <div style="display:none;"><hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Veuillez choisir un document]</div></div>',true);$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)});$.ajax({url:"ajax.php",method:"post",data:{recupdoc:""},dataType:"json"}).success(function(d){var e=function(){var g=$("#apercu");var i=$("#doc").val();var h=$("#doc option:selected").text();if(i==0){g.html(h)}else{if($("#vue").is(":checked")){var f=$("#largeur").val();if(h.slice(-4,-1)=="pdf"){if(g.children(".pdf").length==0){g.html('<div><object data="download?id='+i+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+i+'">'+h+"</a> </object></div>")}else{if(g.find("object").attr("data").substr(12)!=i){g.find("object").attr("data","download?id="+i).html('<a href="download?id='+i+'">'+h+"</a>")}}g.children().attr("class","pdf "+$("#format").val());if(f){if(f==100){g.children().removeAttr("style").children().attr("width","100%").removeAttr("style")}else{g.children().css("padding-bottom",($('<div class="'+$("#format").val()+'"></div>').css("padding-bottom").slice(0,-1)*f/100)+"%");g.find("object").attr("width",f+"%").css("left",(100-f)/2+"%")}}}else{if("jpgpegpng".indexOf(h.slice(-4,-1))>-1){if(g.children("img").length==0){g.css("text-align","").html('<img src="download?id='+i+'">')}else{if(g.children().attr("src").substr(12)!=i){g.children().attr("src","download?id="+i)}}if(f){if(f==100){g.children().removeAttr("style")}else{g.children().css("width",f+"%").css("margin-left",(100-f)/2+"%")}}}}}else{$("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")}}};var c=function(f){$("#fenetre > div:first").html('  <p>Choisissez ci-dessous le répertoire puis le document à insérer. Vous pouvez aussi modifier le texte visible. Cela reste modifiable ultérieurement&nbsp;: le texte est situé entre les deux balises &lt;a...&gt; et &lt;/a&gt;.</p>  <p class="ligne"><label for="mat">Matière&nbsp;:</label><select id="mat">'+f.mats+'</select></p>  <p class="ligne"><label for="rep">Répertoire&nbsp;:</label><select id="rep"></select></p>  <p class="ligne"><label for="doc">Document&nbsp;:</label><select id="doc"></select></p>  <p class="ligne"><label for="texte">Texte visible&nbsp;:</label><input type="text" id="texte" value="'+b+'" size="80" data-auto="1"></p>  <p class="ligne"><label for="vue">Afficher dans la page (PDF et image uniquement)</label><input type="checkbox" id="vue">  <p class="ligne"><label for="largeur">Largeur en %&nbsp;:</label><input type="text" id="largeur" value="100" size="3"></p>  <p class="ligne"><label for="format">Format (PDF uniquement)</label><select id="format">    <option value="portrait">A4 vertical</option><option value="paysage">A4 horizontal</option><option value="hauteur50">Hauteur 50%</option>  </select>');$("#fenetre > div:last").show();if($("#texte").val().length){$("#texte").attr("data-auto",0)}$("#doc").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}var h=$("#doc option:selected").text();if($("#texte").attr("data-auto")==1){$("#texte").val((this.value>0)?h.substr(0,h.lastIndexOf("(")-1):"---")}if("pdfjpgpegpng".indexOf(h.slice(-4,-1))>-1){$("#vue").change().parent().show()}else{$("#vue, #largeur, #format").parent().hide()}e()});$("#texte").on("change keypress",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value.length==0){this.setAttribute("data-auto",1);$("#doc").change()}else{this.setAttribute("data-auto",0);e()}});$("#vue").on("change",function(){if($("#vue").is(":checked")){if($("#doc option:selected").text().slice(-4,-1)=="pdf"){$("#largeur, #format").parent().show();$("#texte").parent().hide()}else{if("jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1){$("#largeur").parent().show();$("#format, #texte").parent().hide()}}}else{$("#texte").parent().show();$("#largeur, #format").parent().hide()}e()});$("#format").on("change keyup",function(g){if(g.which==13){$("#fenetre a.icon-ok").click()}e()});$("#largeur").on("keydown",function(g){if(g.which==38){++this.value}else{if(g.which==40){--this.value}}}).on("change keyup",function(g){if(g.which==0){return}if(g.which==13){$("#fenetre a.icon-ok").click()}if(this.value!=this.getAttribute("data-valeur")){this.setAttribute("data-valeur",this.value);e()}}).attr("data-valeur",100);$("#rep").on("change",function(){$("#doc").html(f.docs[this.value]).change()});$("#mat").on("change",function(){$("#rep").html(f.reps[this.value]).change()}).focus().change();$("#fenetre a.icon-ok").on("click",function(){if($("#doc").val()){if($("#vue").is(":checked")&&("pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1)){insert(a,$("#apercu").html(),"","")}else{insert(a,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val())}$("#fenetre,#fenetre_fond").remove()}});$("#mat option").each(function(){if($("body").attr("data-matiere")==this.value){$("#mat").val(this.value).change()}})};if(d.etat=="login_"){$("#fenetre > div:first").html('<p>Vous n\'êtes actuellement plus connecté. Vous devez vous identifier à nouveau pour récupérer la liste des répertoires et documents disponibles.</p>        <form>        <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>        <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>        </form>');$("#fenetre input").on("keypress",function(f){if(f.which==13){$("#fenetre a.icon-ok").click()}});$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:{login:$("#login").val(),motdepasse:$("#motdepasse").val(),recupdoc:""},dataType:"json"}).success(function(f){if(f.etat=="login_nok"){$("#fenetre > div:first > p:first").html(f.message).addClass("warning")}else{if(f.etat=="ok_"){c(f)}}})})}else{if(d.etat=="ok_"){c(d)}}})}function insertion_lien2(a){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien</h3>  <p class="ligne"><label for="texte">Texte visible&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(a)+'" size="80"></p>  <p class="ligne"><label for="url">Adresse&nbsp;: </label><input type="text" id="url" value="http://" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;"></div>',true);$("#fenetre input").on("click keyup",function(){$("#apercu").html(($("#texte").val().length)?'<a onclick="return false;" href="'+$("#url").val()+'">'+$("#texte").val()+"</a>":"[Écrivez un texte visible]")}).on("keypress",function(b){if(b.which==13){$("#fenetre a.icon-ok").click()}}).first().keyup().focus();$("#fenetre a.icon-ok").on("click",function(){insert(a,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(a,true)})}function insertion_tex(b){var d=(typeof MathJax=="undefined")?'<script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"><\/script><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax:{inlineMath:[["$","$"],["\\\\(","\\\\)"]]}});<\/script>':"";var c=marqueselection(b);var a="t1";if(c.length){switch(c.substring(0,2)){case"\\[":case"$$":a="t2";case"\\(":c=c.substring(2,c.length-2);break;default:c=c.trim("$")}}popup(d+'<a class="icon-montre" title="Mettre à jour l\'aperçu"></a><a class="icon-ok" title="Valider"></a><h3>Insertion de formules LaTeX</h3>  <p>Vous pouvez ci-dessous entrer et modifier une formule LaTeX. L\'aperçu présent en bas sera mis à jour uniquement lorsque vous cliquez sur l\'icône <span class="icon-montre"></span>.</p>  <p class="ligne"><label for="t1">La formule est en ligne (pas de retour)</label><input type="radio" name="type" id="t1" value="1"></p>  <p class="ligne"><label for="t2">La formule est hors ligne (formule centrée)</label><input type="radio" name="type" id="t2" value="2"></p>  <textarea id="formule" rows="3">'+c+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Demandez l\'aperçu en cliquant sur l\'icône <span class="icon-montre"></span>]</div>',true);$("#"+a).prop("checked",true);$("#formule").focus();$("#fenetre a.icon-montre").on("click",function(){if($("#formule").val().length){$("#apercu").html(($("#t1").is(":checked"))?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left");MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])}else{$("#apercu").html("[Écrivez une formule]").css("text-align","center")}});$("#fenetre a.icon-ok").on("click",function(){if($("#t1").is(":checked")){insert(b,"$","$",$("#formule").val())}else{insert(b,"\\[","\\]",$("#formule").val())}$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(b,true)})}function insertion_par1(a){insert(a,"<p>","</p>")}function insertion_par2(a){insert(a,"<div class='note'>","</div>")}function insertion_par3(a){insert(a,"<div class='annonce'>","</div>")}function insertion_retour(a){insert(a,"<br>","")}function insertion_gras(a){insert(a,"<strong>","</strong>")}function insertion_italique(a){insert(a,"<em>","</em>")}function insertion_souligne(a){insert(a,"<u>","</u>")}function insertion_exp(a){insert(a,"<sup>","</sup>")}function insertion_ind(a){insert(a,"<sub>","</sub>")}function aidetexte(){popup('<h3>Aide et explications</h3>  <p>Il y a deux modes d\'éditions possibles pour éditer un texte&nbsp;: le mode «&nbsp;balises visibles&nbsp;» et le mode «&nbsp;balises invisibles&nbsp;». Il est possible de passer de l\'un à l\'autre&nbsp;:</p>  <ul>    <li><span class="icon-source"></span> permet de passer en mode «&nbsp;balises visibles&nbsp;» (par défaut), où le texte à taper est le code HTML de l\'article. Ce mode est plus précis. Les boutons aux dessus aident à utiliser les bonnes balises.</li>    <li><span class="icon-nosource"></span> permet de passer en mode «&nbsp;balises invisibles&nbsp;», où le texte est tel qu\'il sera affiché sur la partie publique, et modifiable. Ce mode est moins précis, mais permet le copié-collé depuis une page web ou un document Word/LibreOffice.  </ul>  <p>Une fonction de nettoyage du code HTML, permettant d\'assurer une homogénéité et une qualité d\'affichage optimales, est lancée à chaque commutation entre les deux modes, à chaque clic sur un des boutons disponibles, à chaque copie/coupe de texte et à chaque passage à la ligne.</p>  <p>En HTML, toutes les mises en formes sont réalisées par un encadrement de texte entre deux balises&nbsp;: &lt;h3&gt; et &lt;/h3&gt; pour un gros titre, &lt;p&gt; et &lt;/p&gt; pour un paragraphe. Le retour à la ligne simple, qui ne doit exister que très rarement, est une balise simple &lt;br&gt;. Mais les boutons disponibles sont là pour vous permettre de réaliser le formattage que vous souhaitez&nbsp;:</p>  <ul>    <li><span class="icon-titres"></span>&nbsp;: différentes tailles de titres (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-par1"></span>&nbsp;: paragraphe classique, qui doit obligatoirement encadrer au minimum chaque ligne de texte. Apparaît automatiquement au passage à la ligne si on l\'oublie.</li>    <li><span class="icon-par2"></span>&nbsp;: paragraphe important, écrit en rouge</li>    <li><span class="icon-par3"></span>&nbsp;: paragraphe très important, écrit en rouge et encadré</li>    <li><span class="icon-retour"></span>&nbsp;: retour à la ligne. Identique à un appui sur Entrée, et souvent inutile.</li>    <li><span class="icon-gras"></span>&nbsp;: mise en gras du texte entre les balises</li>    <li><span class="icon-italique"></span>&nbsp;: mise en italique du texte entre les balises</li>    <li><span class="icon-souligne"></span>&nbsp;: soulignement du texte entre les balises</li>    <li><span class="icon-omega"></span>&nbsp;: lettres grecques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-sigma"></span>&nbsp;: symboles mathématiques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-exp"></span>&nbsp;: mise en exposant du texte entre les balises</li>    <li><span class="icon-ind"></span>&nbsp;: mise en indice du texte entre les balises</li>    <li><span class="icon-ol"></span>&nbsp;: liste numérotée. Une fenêtre supplémentaire permet de choisir le type (1,A,a,I,i) et la première valeur. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-ul"></span>&nbsp;: liste à puces. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-lien1"></span>&nbsp;: lien d\'un document disponible ici (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-lien2"></span>&nbsp;: lien vers un autre site web (fenêtre supplémentaire pour entre l\'adresse)</li>    <li><span class="icon-tex"></span>&nbsp;: insertion de code LaTeX (fenêtre supplémentaire pour le taper)</li>  </ul>  <p class="tex2jax_ignore">Il est possible d\'insérer du code en LaTeX, sur une ligne séparée (balises \\[...\\] ou balises $$...$$) ou au sein d\'une phrase (balises $...$ ou balises \\(...\\)). Il faut ensuite taper du code en LaTeX à l\'intérieur. La prévisualisation est réalisée en direct.</p>',false)}function echange(b,a){if(b.length&&a.length){$("article").css("position","relative");b.css("opacity",0.3);a.css("opacity",0.3);a.animate({top:b.position().top-a.position().top},1000);b.animate({top:(a.outerHeight(true)+a.outerHeight())/2},1000,function(){b.css("opacity",1);a.css("opacity",1);b.insertAfter(a);b.css({position:"static",top:0});a.css({position:"static",top:0})})}}function cache(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().addClass("cache");c.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(a){var b=a.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,table:b[0],id:b[1]},dataType:"json",el:a,fonction:function(c){c.parent().removeClass("cache");c.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().prev().is("article"))){d.children(".icon-monte").hide(1000);d.prev().children(".icon-monte").show(1000)}if(!(d.next().is("article"))){d.children(".icon-descend").show(1000);d.prev().children(".icon-descend").hide(1000)}echange(d.prev(),d)}})}function descend(b){var a=b.parent();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(!(d.prev().is("article"))){d.children(".icon-monte").show(1000);d.next().children(".icon-monte").hide(1000)}if(!(d.next().next().is("article"))){d.children(".icon-descend").hide(1000);d.next().children(".icon-descend").show(1000)}echange(d,d.next())}})}function supprime(b){var a=b.parent();popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){$("#fenetre,#fenetre_fond").remove();var c=a.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{supprime:1,table:c[0],id:c[1]},dataType:"json",el:a,fonction:function(d){if(c[0]=="colles"){d.removeClass("cache");d.children(".icon-cache,.icon-montre,.icon-supprime").remove();d.children(".icon-ajoute").show();d.children("div.editable").each(function(){this.setAttribute("class",this.getAttribute("class").replace("editable","editable-remplace"))}).html("<p>Le programme de colles de cette semaine n'est pas encore défini.</p>")}else{if(c[0]=="utilisateurs"){location.reload(true)}else{d.remove()}}}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function formulaire(a){var c=a.getAttribute("data-id");if(!c){$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:$(a).parent().attr("data-id").split("|")[1]},dataType:"json",el:a,fonction:function(e){location.reload(true)}});return true}if(a.hasAttribute("data-remplace")){var d=$("article#"+a.getAttribute("data-remplace"));d.children(".icon-ajoute").after('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');d.children('[class*="-remplace"],.icon-ajoute').hide();var b=$("<form></form>").appendTo(d).html($("#form-"+c).html());b.children('[name="id"]').val(a.getAttribute("data-remplace"))}else{$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertBefore("article:first");var b=$("<form></form>").appendTo(d).html($("#form-"+c).html())}b.find(".edithtml").textareahtml();b.find("[data-placeholder]").placeholder();if(b.children('[name="table"]').val()=="cdt"){b.boutonscdt()}else{if(b.children('[name="table"]').val()=="cdt-seances"){b.affichechamps()}else{if($("table#notes").length){notes(a)}}}b.find(".usergrp > .icon-edite").on("click",function(){utilisateursgroupe(this)});d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children(".icon-annule").on("click",function(){d.children("form,.icon-annule,.icon-ok").remove();d.children('[class*="-remplace"],.icon-ajoute').show()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){b.children(".edithtml").each(function(){this.value=nettoie(($(this).is(":visible"))?this.value:$(this).next().html())});if(b.children('[name="table"]').val()=="notes"){$("#epingle select:not(:visible)").val("x")}$.ajax({url:"ajax.php",method:"post",data:b.serialize(),dataType:"json",el:d,fonction:function(e){if(e.attr("id")=="epingle"){if(!$("#epingle #autoriser").length){location.reload(true)}}else{e.children(".icon-supprime").show();if(e.find('[name="cache"]').is(":checked")){e.children(".icon-montre").show();e.addClass("cache")}else{e.children(".icon-cache").show()}e.children('[class*="-remplace"]').show().each(function(){this.setAttribute("class",this.getAttribute("class").replace("-remplace",""));var f=this.getAttribute("data-id");$(this).html(d.find('[name="'+f.slice(f.indexOf("|")+1,f.lastIndexOf("|"))+'"]').val())});e.children(".editable").editinplace();e.children(".icon-annule,.icon-ok,form").remove()}}})});b.find("input,select").on("keypress",function(f){if(f.which==13){f.preventDefault();d.children("a.icon-ok").click()}})}function valide(a){var c="";if($("#mail").length){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le mail.","nok")}else{if(!$('[name="sujet"]').val().length){affiche("Il faut un sujet non vide pour envoyer le mail.","nok")}else{c=$("#mail").serialize()}}}else{if($("#planning").length){c=$("form").serialize()}else{var b=$(a).parent();var d=b.parent().attr("data-id").split("|");c="table="+d[0]+"&id="+d[1]+"&"+b.serialize()}}if(c.length){$.ajax({url:"ajax.php",method:"post",data:c,dataType:"json",el:a,fonction:function(e){if(!$(e).is("[data-noreload]")){location.reload(true)}}})}}function suppressionmultiple(a){popup('<h3>Confirmer la demande de suppression</h3><p class="suppression"><button class="icon-ok" title="Confirmer la suppression"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule" title="Sortir sans supprimer"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){var b=a.getAttribute("data-id").split("|");$("#fenetre,#fenetre_fond").remove();$.ajax({url:"ajax.php",method:"post",data:"table="+b[0]+"&id="+b[1]+"&supprime_"+b[2]+"=1",dataType:"json",el:$(a),fonction:function(c){c.remove()}})});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function utilisateursmatiere(a){var d=a;var c=d.getAttribute("data-matiere").split("|");popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usermat").children("h3").append(c[0]);$("#fenetre :checkbox").attr("id",function(){return this.name}).on("change",function(){var e=this;var f=e.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"utilisateurs",id:f,matiere:c[1],ok:(e.checked?1:0)},dataType:"json",el:e,fonction:function(i){if(i.checked){b=b+","+f;$(e).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+f+",",",").slice(1,-1);$(e).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);var k=$("#fenetre .a4:checked").length;var m=$("#fenetre .a3:checked").length;var j=$("#fenetre .a2:checked").length;var h=$("#fenetre .a1:checked").length;var l=k+m+j+h;if(l){var g="";if(k){g+=", "+k+" professeur"+(k>1?"s":"")}if(m){g+=", "+m+" colleur"+(m>1?"s":"")}if(j){g+=", "+j+" élève"+(j>1?"s":"")}if(h){g+=", "+h+" invité"+(h>1?"s":"")}$(d).parent().children("span").text("Cette matière concerne "+l+" utilisateur"+(l>1?"s":"")+" dont "+g.substr(1)+".")}else{$(d).parent().children("span").text("Cette matière ne concerne aucun utilisateur.")}}}).success(function(g){if(g.etat!="ok"){e.checked=!e.checked}})});var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursgroupe(a){var d=a;var c=$(a).parent().parent();popup($("#form-utilisateurs").html(),true);$("#fenetre").addClass("usergrp").children("h3").append(c.find("span.editable").text()||c.find("input").val());$("#fenetre :checkbox").attr("id",function(){return this.name});if(c.is("div")){$("#fenetre :checkbox").on("change",function(){$(this).prev().toggleClass("labelchecked",a.checked)});$('<a class="icon-ok" title="Valider"></a>').insertAfter("#fenetre .icon-ferme").on("click",function(){var e=$("#fenetre input:checked").map(function(){return this.id.replace("u","")}).get().join();d.setAttribute("data-uid",e);$(d).parent().next().val(e);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "));$("#fenetre, #fenetre_fond").remove()})}else{$("#fenetre :checkbox").on("change",function(){var f=this;var e=f.id.substr(1);$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",id:c.attr("data-id").split("|")[1],eleve:e,ok:(f.checked?1:0)},dataType:"json",el:f,fonction:function(g){if(g.checked){b=b+","+e;$(f).prev().addClass("labelchecked")}else{b=(","+b+",").replace(","+e+",",",").slice(1,-1);$(f).prev().removeClass("labelchecked")}d.setAttribute("data-uid",b);$(d).parent().children("span").text($("#fenetre input:checked").parent().map(function(){return $(this).text().replace(" (identifiant)","").trim()}).get().join(", "))}}).success(function(g){if(g.etat!="ok"){f.checked=!f.checked}})})}var b=d.getAttribute("data-uid");$("#u"+b.replace(/,/g,",#u")).prop("checked",true);$("#fenetre :checked").prev().addClass("labelchecked")}function utilisateursmail(c){popup($("#form-utilisateurs").html(),true);var b=$('[name="id-copie"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest[]"][value="'+b[a]+'"]').prop("checked",true)}b=$('[name="id-bcc"]').val().split(",");for(var a=0;a<b.length;a++){$('#fenetre [name="dest_bcc[]"][value="'+b[a]+'"]').prop("checked",true)}$("#fenetre .icon-cocher").on("click keyup",function(){var d=this.getAttribute("data-classe");$("#fenetre ."+d+":not(:disabled)").prop("checked",true);$(this).hide();$(this).next().show();d=(d.indexOf("bcc")>0)?d.replace("bcc","c"):d.replace("c","bcc");$("#fenetre ."+d+":not(:disabled)").prop("checked",false);$('#fenetre .icon-cocher[data-classe="'+d+'"]').show();$('#fenetre .icon-decocher[data-classe="'+d+'"]').hide()});$("#fenetre .icon-decocher").on("click keyup",function(){$("#fenetre ."+this.getAttribute("data-classe")+":not(:disabled)").prop("checked",false);$(this).hide();$(this).prev().show()}).hide();$("#fenetre :checkbox[name]").on("change",function(){if($(this).is(":checked")){$('#fenetre :checkbox[name][value="'+this.value+'"][name!="'+this.name+'"]').prop("checked",false)}});$("#fenetre :checkbox:not([name])").on("click",function(){var e=this.value.split(",");for(var d=0;d<e.length;d++){$('#fenetre :checkbox[name="'+this.className+'[]"][value="'+e[d]+'"]').prop("checked",$(this).prop("checked")).change()}if($(this).is(":checked")){$('#fenetre :checkbox[class="'+((this.className=="dest")?"dest_bcc":"dest")+'"][value="'+this.value+'"]').prop("checked",false)}});$("#fenetre .icon-ok").on("click",function(){$('[name="id-copie"]').val($('#fenetre [name="dest[]"]:checked').map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($('#fenetre [name="dest_bcc[]"]:checked').map(function(){return this.value}).get().join(","));$(c).prev().text($('#fenetre [name="dest[]"]:checked').parent().prev().map(function(){return $(this).text().replace(" (identifiant)","")}).get().concat($('#fenetre [name="dest_bcc[]"]:checked').parent().prev().prev().map(function(){return $(this).text().replace(" (identifiant)","")+" (CC)"}).get()).join(", "));if(!$(c).prev().text().length){$(c).prev().text("[Personne]")}$("#fenetre, #fenetre_fond").remove()})}function notes(e){if($("#epingle :checkbox").length){$("#epingle tr[data-id]").hide()}$("#epingle :checkbox").on("click",function(){var g=$("#epingle .grpnote:checked").map(function(){return this.value.split(",")}).get().concat();$("#epingle tr[data-id]").hide();for(var f=0;f<g.length;f++){$('#epingle tr[data-id="'+g[f]+'"]').show()}});$("#epingle tr[data-id]").each(function(){$(this).children("td:last").html($("#epingle div").html());$(this).find("select").attr("name","e"+$(this).attr("data-id"))});$("#epingle div").remove();if(e.getAttribute("data-eleves")){$("#epingle h4").text($(e).parent().children("h3").text());$('#epingle [name="id"]').val($(e).parent().attr("data-id").split("|")[1]);var b=e.getAttribute("data-eleves").split("|");var d=e.getAttribute("data-notes").split("|");for(var c=0;c<b.length;c++){$('#epingle tr[data-id="'+b[c]+'"]').show().find("select").val(d[c])}var a=dejanotes[$('#epingle [name="id"]').val().split("-")[0]].split(",");for(c=0;c<a.length;c++){$('#epingle tr[data-id="'+a[c]+'"]:not(:visible)').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}else{$("#epingle #semaine").on("change keyup",function(){var f=$(this).val().split("-")[0];$(".dejanote td:first-child").each(function(){$(this).text($(this).text().replace(" (noté par un autre colleur)",""))});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);if(f>0){var g=dejanotes[f].split(",");for(var h=0;h<g.length;h++){$('#epingle tr[data-id="'+g[h]+'"]').addClass("dejanote").find("select").prop("disabled",true)}$(".dejanote td:first-child").each(function(){$(this).text($(this).text()+" (noté par un autre colleur)")})}})}}function envoimail(a){if($(".editabledest").children("span").text()=="[Personne]"){affiche("Il faut au moins un destinataire pour envoyer le mail.","nok")}else{$.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(b){location.reload(true)}})}}function modifierepertoire(b){var d=(b.className=="icon-edite")?"repertoire":"ajouterep";$("#epingle").remove();var e=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");var c=$('<form onsubmit="return false;"></form>').appendTo(e).html($("#form-"+d).html());if(d=="repertoire"){var g=$(b).parent().attr("data-id").split("|")[1];var f=$(b).parent().attr("data-donnees").split("|");var a=$(b).parent().children(".nom").text().split("/").pop()||$(b).parent().find("input").val();c.find("em").text(a);if(f[0]==0){c.find("#nom,#parent,#menu").parent().remove()}else{c.find("#nom").val(a);c.find('[data-parents*=",'+g+',"]').prop("disabled",true);if(f[1]=="1"){c.find("#menu").prop("checked",true)}}$('#protection option[value="'+f[2]+'"]').prop("selected",true);c.find('[name="id"]').val(g)}e.children(".icon-ferme").on("click",function(){$("#epingle").remove()});e.children("a.icon-aide").on("click",function(){popup($("#aide-"+d).html(),false)});e.children("a.icon-ok").on("click",function(){$.ajax({url:"ajax.php",method:"post",data:c.serialize(),dataType:"json",el:e,fonction:function(h){location.reload(true)}})});c.find("input,select").on("keypress",function(h){if(h.which==13){e.children("a.icon-ok").click()}})}function modifiedocument(b){var c=(b.className=="icon-edite")?"document":"ajoutedoc";$("#epingle").remove();var d=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertAfter("#parentsdoc");form=$('<form onsubmit="return false;"></form>').appendTo(d).html($("#form-"+c).html());var a=$(b).parent().children(".nom").text()||$(b).parent().find("input").val();form.find("em").text(a);if(c=="document"){form.find("#nom").val(a);$('#protection option[value="'+$(b).parent().attr("data-protection")+'"]').prop("selected",true);form.find('[name="id"]').val($(b).parent().attr("data-id").split("|")[1])}else{$('#protection option[value="'+$(b).parent().attr("data-donnees").split("|")[2]+'"]').prop("selected",true);form.find('[name="parent"]').val($(b).parent().attr("data-id").split("|")[1]);form.find("#fichier").on("change",function(){if(!form.find("#nom").val().length){var e=this.value}form.find("#nom").val(e.substring(e.lastIndexOf("\\")+1,e.lastIndexOf("."))||e)})}d.children(".icon-ferme").on("click",function(){$("#epingle").remove()});d.children("a.icon-aide").on("click",function(){popup($("#aide-"+c).html(),false)});d.children("a.icon-ok").on("click",function(){var e=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:e,dataType:"json",contentType:false,processData:false,el:d,fonction:function(f){location.reload(true)}})});form.find("input,select").on("keypress",function(f){if(f.which==13){d.children("a.icon-ok").click()}})}$(document).ajaxSend(function(b,c,a){$("body").css("cursor","wait");if(a.data.append){a.data.append("csrf-token",$("body").attr("data-csrf-token"))}else{a.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+a.data}}).ajaxStop(function(){$("body").css("cursor","auto")}).ajaxSuccess(function(b,d,a){var c=d.responseJSON;switch(c.etat){case"ok":affiche(c.message,"ok");a.fonction(a.el);break;case"nok":affiche(c.message,"nok");break;case"login":afficher_login(a)}});$(function(){$(".editable").editinplace();$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").affichechamps();$(".supprmultiple").on("click",function(){suppressionmultiple(this)});$(".usermat .icon-edite").on("click",function(){utilisateursmatiere(this)});$(".editabledest .icon-edite").on("click",function(){utilisateursmail(this)});$('[name="copie"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"mailprefs",champ:"mailcopy",id:0,val:$(this).prop("checked")?1:0},dataType:"json",el:"",fonction:function(a){return true}})});$("#parentsdoc .icon-edite, .rep > .icon-edite, .icon-ajouterep").on("click",function(){modifierepertoire(this)});$(".doc > .icon-edite, .icon-ajoutedoc").on("click",function(){modifiedocument(this)});$('[name="mailnotes"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{table:"groupes",champ:"mailnotes",id:$(this).attr("id").substr(9),val:$(this).find("option:selected").val()},dataType:"json",el:"",fonction:function(a){return true}})});$(".usergrp .icon-edite").on("click",function(){utilisateursgroupe(this)});$("#log").hide().on("click",function(){$(this).hide()});$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime").on("click",function(){window[this.className.substring(5)]($(this))});$("a.icon-aide").on("click",function(){popup($("#aide-"+this.getAttribute("data-id")).html(),false)});$("a.icon-prefs.general,a.icon-ajoute").on("click",function(){formulaire(this)});$("a.icon-ok").on("click",function(){valide(this)});$("a.icon-deconnexion").on("click",function(a){$.ajax({url:"ajax.php",method:"post",data:{deconnexion:1},dataType:"json",el:"",fonction:function(b){location.reload(true)}})});$(".icon-menu").on("click",function(){$("#colonne,nav").toggleClass("visible")})});
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/MAJSQL.sql /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/MAJSQL.sql
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/MAJSQL.sql	2015-09-20 21:33:37.090626012 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/MAJSQL.sql	2015-09-30 18:46:34.000000000 +0200
@@ -208,6 +208,7 @@
 -- Semaines 2015-2016 -> Suppression des cahiers de texte et programmes de colles
 TRUNCATE TABLE cdt;
 TRUNCATE TABLE colles;
+TRUNCATE TABLE notes;
 UPDATE matieres SET colles = 0, cdt = 0;
 TRUNCATE TABLE semaines;
 INSERT INTO semaines (debut) VALUES ('2015-09-01'),('2015-09-07'),('2015-09-14'),('2015-09-21'),('2015-09-28'),
@@ -218,10 +219,11 @@
   ('2016-06-06'),('2016-06-13'),('2016-06-20'),('2016-06-27'),('2016-07-04');
 UPDATE semaines SET colle = 1;
 ALTER TABLE utilisateurs
-  MODIFY mdp VARCHAR(41),
+  MODIFY id SMALLINT( 3 ) NOT NULL AUTO_INCREMENT,
+  MODIFY mdp VARCHAR( 41 ) NOT NULL,
   DROP genre,
-  CHANGE matieres matieres VARCHAR( 30 ) NOT NULL,
-  CHANGE mailexp mailexp VARCHAR( 50 ) NOT NULL;
+  MODIFY matieres VARCHAR( 30 ) NOT NULL,
+  MODIFY mailexp VARCHAR( 50 ) NOT NULL;
 UPDATE utilisateurs SET matieres = CONCAT_WS(",","0",IF(matieres="",(SELECT GROUP_CONCAT(id) FROM matieres),matieres));
 UPDATE utilisateurs SET mailexp = CONCAT(prenom,' ',nom) WHERE autorisation > 2;
 UPDATE utilisateurs SET mailexp = '' WHERE autorisation < 3;
@@ -229,7 +231,12 @@
 UPDATE utilisateurs SET mdp='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' WHERE mdp='pas de mot de passe';
 ALTER TABLE groupes CHANGE colle mailnotes TINYINT(1) UNSIGNED NOT NULL;
 UPDATE groupes SET mailnotes = 1+2*mailnotes;
-ALTER TABLE notes CHANGE note note VARCHAR( 4 ) NOT NULL;
+ALTER TABLE notes
+  MODIFY eleve SMALLINT( 3 ) UNSIGNED NOT NULL,
+  MODIFY colleur SMALLINT( 3 ) UNSIGNED NOT NULL,
+  MODIFY note VARCHAR( 4 ) NOT NULL;
+ALTER TABLE colles
+  MODIFY id SMALLINT( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT;
 ALTER TABLE recents
   ADD protection TINYINT( 1 ) UNSIGNED NOT NULL,
   ADD matiere TINYINT( 2 ) UNSIGNED NOT NULL;
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/notes.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/notes.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/notes.php	2015-09-20 21:45:45.090191326 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/notes.php	2015-10-07 22:46:56.000000000 +0200
@@ -61,7 +61,7 @@
   // Recherche des notes concernées
   $resultat = $mysqli->query("SELECT nom, GROUP_CONCAT( IFNULL(note,'') ORDER BY sid SEPARATOR '|') AS notes
                               FROM ( SELECT s.id AS sid, u.id AS eid, IF(LENGTH(nom),CONCAT(nom,' ',prenom),CONCAT(login,' (identifiant)')) AS nom
-                                     FROM semaines AS s LEFT JOIN utilisateurs AS u ON 1 WHERE colle AND u.autorisation=2 ORDER BY IF(LENGTH(nom),nom,login)) AS t
+                                     FROM semaines AS s LEFT JOIN utilisateurs AS u ON 1 WHERE colle AND u.autorisation=2 AND FIND_IN_SET(${matiere['id']},u.matieres) ORDER BY IF(LENGTH(nom),nom,login)) AS t
                               LEFT JOIN notes ON sid = semaine AND eid = eleve AND matiere = ${matiere['id']} GROUP BY eid ORDER BY nom,sid");
   if ( $resultat->num_rows )  {
     // Fonctions de saisie
@@ -112,15 +112,14 @@
 if ( $autorisation == 2 )  {
   
   // Récupération de l'ensemble des notes, semaines, colleurs
-  $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS d, n.note,
-                              IF(LENGTH(u.nom),u.nom,u.login) AS colleur
+  $resultat = $mysqli->query("SELECT DATE_FORMAT(s.debut,'%w%Y%m%e') AS debut, n.note, IF(LENGTH(u.nom),u.nom,u.login) AS colleur
                               FROM notes AS n LEFT JOIN semaines AS s ON n.semaine=s.id LEFT JOIN utilisateurs AS u ON n.colleur=u.id
                               WHERE n.eleve = ${_SESSION['id']} AND n.matiere = ${matiere['id']} ORDER BY s.id");
 
   // Affichage des notes concernées
   if ( $resultat->num_rows )  {
     while ( $r = $resultat->fetch_assoc() )
-      echo '<article><h3>Semaine du '.format_date($r['d'])."</h3><p>${r['note']} (${r['c']})</p></article>\n\n";
+      echo '<article><h3>Semaine du '.format_date($r['debut'])."</h3><p>${r['note']} (${r['colleur']})</p></article>\n\n";
     $resultat->free();
   }
   else
@@ -165,7 +164,7 @@
       // Recherche des notes concernées
       $resultat = $mysqli->query("SELECT nom, GROUP_CONCAT( IF(ISNULL(note),'<td></td>',CONCAT('<td data-colleur=\"',colleur,'\">',note,'</td>')) ORDER BY sid SEPARATOR '') AS notes
                                   FROM ( SELECT s.id AS sid,  u.id AS eid, CONCAT('<td>',IF(LENGTH(nom),CONCAT(nom,' ',prenom),CONCAT(login,' (identifiant)')),'</td>') AS nom
-                                         FROM semaines AS s LEFT JOIN utilisateurs AS u ON 1 WHERE colle AND u.autorisation=2 ORDER BY IF(LENGTH(nom),nom,login)) AS t
+                                         FROM semaines AS s LEFT JOIN utilisateurs AS u ON 1 WHERE colle AND u.autorisation=2 AND FIND_IN_SET(${matiere['id']},u.matieres) ORDER BY IF(LENGTH(nom),nom,login)) AS t
                                   LEFT JOIN notes ON sid = semaine AND eid = eleve AND matiere = ${matiere['id']} GROUP BY eid ORDER BY nom,sid");
       if ( $resultat->num_rows )  {
         echo "  <table>\n    <thead>\n      <tr><th class=\"semaines\">Nom</th>";
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/planning.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/planning.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/planning.php	2015-09-13 17:39:13.277377811 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/planning.php	2015-09-25 01:49:16.000000000 +0200
@@ -50,7 +50,6 @@
 // Récupération et affichage des matières
 $semaine = array('Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi');
 $resultat = $mysqli->query('SELECT id, DATE_FORMAT(debut,\'%w\') AS jour, DATE_FORMAT(debut,\'%d/%m/%Y\') AS debut, IF(colle=1,\' checked\',\'\') AS colle, vacances FROM semaines');
-$mysqli->close();
 while ( $r = $resultat->fetch_assoc() )  {
   $select = str_replace("\"${r['vacances']}\"","\"${r['vacances']}\" selected",'<option value="0">Période scolaire</option><option value="1">Vacances de Toussaint</option><option value="2">Vacances de Noël</option><option value="3">Vacances d\'hiver</option><option value="4">Vacances de printemps</option>');
   $r['jour'] = $semaine[$r['jour']];
diff -urN /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/rss.php /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/rss.php
--- /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.0/rss.php	2015-09-20 06:14:08.730454893 +0200
+++ /documents/cahier-de-prepa-dev/cahier-de-prepa5.0.1/rss.php	2015-09-23 23:36:04.000000000 +0200
@@ -22,5 +22,5 @@
 <?php
 
 $mysqli->close();
-fin($edition,false);
+fin(false,false);
 ?>
