diff -urN cahier-de-prepa8.1.0/agenda-types.php cahier-de-prepa8.1.1/agenda-types.php
--- cahier-de-prepa8.1.0/agenda-types.php	2018-10-14 17:44:20.702417813 +0200
+++ cahier-de-prepa8.1.1/agenda-types.php	2018-11-06 10:19:04.699957078 +0100
@@ -80,7 +80,7 @@
 // Aide et formulaire d'ajout
 ?>
 
-  <form id="form-ajoute" action="ajout-agenda-types">
+  <form id="form-ajoute" data-action="ajout-agenda-types">
     <h3 class="edition">Ajouter un nouveau type d'événements</h3>
     <div>
       <input type="text" class="ligne" name="nom" value="" size="50" placeholder="Nom pour l'affichage (Commence par majuscule, singulier)">
diff -urN cahier-de-prepa8.1.0/ajax.php cahier-de-prepa8.1.1/ajax.php
--- cahier-de-prepa8.1.0/ajax.php	2018-10-30 10:34:46.535499386 +0100
+++ cahier-de-prepa8.1.1/ajax.php	2018-11-10 22:28:33.857051342 +0100
@@ -2638,7 +2638,7 @@
   // Préférence de création de compte, venant de utilisateurs.php
   if ( isset($_REQUEST['creation_compte']) )  {
     if ( requete('prefs','UPDATE prefs SET val = '.intval(isset($_REQUEST['autoriser'])).' WHERE nom="creation_compte"',$mysqli) )
-      exit($_SESSION['message'] = '{"etat":"ok","message":"Les préférences de l\'agenda ont été modifiées."}');
+      exit($_SESSION['message'] = '{"etat":"ok","message":"Les créations de compte ont été '.( intval(isset($_REQUEST['autoriser'])) ? 'autorisées' : 'interdites' ).'."}');
     exit('{"etat":"nok","message":"Les préférences globales de l\'agenda n\'ont pas été modifiées. Erreur MySQL n°'.$mysqli->errno.', «'.$mysqli->error.'»."}');
   }
 }
diff -urN cahier-de-prepa8.1.0/CHANGELOG.php cahier-de-prepa8.1.1/CHANGELOG.php
--- cahier-de-prepa8.1.0/CHANGELOG.php	2018-10-31 03:59:47.004088147 +0100
+++ cahier-de-prepa8.1.1/CHANGELOG.php	2018-11-11 00:57:39.075674052 +0100
@@ -1,4 +1,4 @@
-Version actuelle : 8.1.0 (31/10/18)
+Version actuelle : 8.1.1 (11/11/18)
 ===================
 Changements :
 1.0   31/08/11 Première version
@@ -223,6 +223,7 @@
 8.1.0 30/10/18 Correction de bugs et améliorations des notes de colles :
   * Possibilité d'impression du relevé de colles pour le compte administratif
   * Possibilité de déclaration de séances de cours ou TD sans note 
+8.1.1 11/11/18 Correction de bugs
 
 ===================
 
@@ -257,6 +258,7 @@
   * Raccourcis cdt : texte pré-défini
   * Système de récupération des données/documents
   * Paramétrage des styles pour les titres, des couleurs
+  * Renvoi d'invitation
 
 
 =======
diff -urN cahier-de-prepa8.1.0/fonctions.php cahier-de-prepa8.1.1/fonctions.php
--- cahier-de-prepa8.1.0/fonctions.php	2018-10-31 04:00:11.408376567 +0100
+++ cahier-de-prepa8.1.1/fonctions.php	2018-11-11 00:24:48.449894371 +0100
@@ -110,7 +110,7 @@
   elseif ( $_SESSION['light'] && isset($_REQUEST['motdepasse']) )  {
     $mysqli = connectsql();
     // Récupération des logins/mdp dans la base MySQL et comparaison
-    $resultat = $mysqli->query('SELECT timeout FROM utilisateurs WHERE mdp = \''.sha1($mdp.$_REQUEST['motdepasse']).'\' OR mdp = \''.sha1($_REQUEST['motdepasse'])."' AND id = ${_SESSION['id']}");
+    $resultat = $mysqli->query('SELECT timeout FROM utilisateurs WHERE ( mdp = \''.sha1($mdp.$_REQUEST['motdepasse']).'\' OR mdp = \''.sha1($_REQUEST['motdepasse'])."' ) AND id = ${_SESSION['id']}");
     $mysqli->close();
     if ( $resultat->num_rows )  {
       $r = $resultat->fetch_row();
@@ -129,8 +129,10 @@
     else
       exit('{"etat":"'.(isset($_REQUEST['connexion'])?'':'mdp').'nok","message":"Mauvais mot de passe"}');
   }
-  // Déconnexion automatique
-  elseif ( ( $_SESSION['time'] < time() ) || ( $_SESSION['client'] != $_SERVER['HTTP_USER_AGENT'] ) || ( $_SESSION['ip'] != $_SERVER['REMOTE_ADDR'] ) )  {
+  // Déconnexion automatique si Timeout ou changement de UserAgent ou d'IP
+  // Changement d'IP: on ne regarde pas le dernier élément, certains lycées
+  // on des adresses dynamiques à ce niveau
+  elseif ( ( $_SESSION['time'] < time() ) || ( $_SESSION['client'] != $_SERVER['HTTP_USER_AGENT'] ) || ( substr($_SESSION['ip'],0,-3) != substr($_SERVER['REMOTE_ADDR'],0,-3) ) )  {
     // Écriture de la déconnexion dans le fichier de log
     logconnect(3,$_SESSION['login']);
     // Suppression du cookie et des données de session
@@ -563,7 +565,7 @@
         $requete_matieres = "WHERE FIND_IN_SET(m.id,'${_SESSION['matieres']}')";
         $requete_pages = $requete_reps = "protection = 0 OR ( (protection-1)>>($autorisation-1) & 1 ) = 0";
         $requete_collesdocscdt = "( X_protection = 0 OR ( (X_protection-1)>>($autorisation-1) & 1 ) = 0 )";
-        $requete_notes = ( ( $autorisation == 3 ) ? "notes < 2 AND FIND_IN_SET(m.id,'${_SESSION['matieres']}')" : 'notes = 1');
+        $requete_notes = ( ( $autorisation == 4 || $autorisation == 1 ) ? '0' : 'notes < 2' );
         $requete_rss = "FIND_IN_SET(matiere,'${_SESSION['matieres']}') AND ( protection = 0 OR ( (protection-1)>>($autorisation-1) & 1 ) = 0 )";
     }
     
diff -urN cahier-de-prepa8.1.0/gestioncompte.php cahier-de-prepa8.1.1/gestioncompte.php
--- cahier-de-prepa8.1.0/gestioncompte.php	2018-10-16 22:38:26.652841918 +0200
+++ cahier-de-prepa8.1.1/gestioncompte.php	2018-11-08 00:16:10.612404999 +0100
@@ -103,9 +103,10 @@
     case 'oublimdp': {
 
       // Recherche de l'adresse électronique dans la base de données
-      // Les comptes non encore validés et suspendus ont un mdp de 41 caractères.
+      // Les comptes non encore validés et suspendus ont un mdp commençant par
+      // '*' ou '!', codes ascii inférieurs à '+'.
       $mysqli = connectsql();
-      $resultat = $mysqli->query('SELECT id, login, mail FROM utilisateurs WHERE mdp > \'\' AND mail > \'\'');
+      $resultat = $mysqli->query('SELECT id, login, mail FROM utilisateurs WHERE mdp > \'+\' AND mail > \'\'');
       $mysqli->close();
       while ( $r = $resultat->fetch_assoc() )
         if ( $r['mail'] == $mail )  {
diff -urN cahier-de-prepa8.1.0/js/edition.js cahier-de-prepa8.1.1/js/edition.js
--- cahier-de-prepa8.1.0/js/edition.js	2018-10-30 23:30:32.437052507 +0100
+++ cahier-de-prepa8.1.1/js/edition.js	2018-11-11 00:20:29.815056064 +0100
@@ -1274,6 +1274,7 @@
     case 'notes':
     case 'ajout-notes': $(this).init_notes(action); break;
     case 'agenda-elems': $(this).init_evenements(); break;
+    case 'ajout-agenda-types': $('[name="couleur"]',form).colpick(); break;
     case 'deplcolle': $('#ancien,#nouveau').each( function() { $(this).datetimepicker({ format: 'd/m/Y Ghi', timepicker: true }); }); break;
     case 'ajout-utilisateurs': form.init_ajout_utilisateurs(); break;
     case 'ajout-groupe': $('.usergrp span',form).on("click", utilisateursgroupe); break;
@@ -1837,7 +1838,7 @@
   }
   
   // Faux élément select de remplacement, correspondant au label, générant au clic une fenêtre de sélection
-  $('<select id='+sel.prev().attr('for')+'><option selected hidden></select>').insertBefore(sel.hide(0)).attr('disabled',sel.attr('disabled')).on("click",function(e)  {
+  $('<select id='+sel.prev().attr('for')+'><option selected hidden></option></select>').insertBefore(sel.hide(0)).attr('disabled',sel.attr('disabled')).on("mousedown",function(e)  {
     e.preventDefault();
     this.blur();
     // Fenêtre de sélection
diff -urN cahier-de-prepa8.1.0/js/edition.min.js cahier-de-prepa8.1.1/js/edition.min.js
--- cahier-de-prepa8.1.0/js/edition.min.js	2018-10-31 03:51:26.586252895 +0100
+++ cahier-de-prepa8.1.1/js/edition.min.js	2018-11-11 00:24:14.529519147 +0100
@@ -1,3 +1,3 @@
 function affiche(message,etat){$("#log").removeClass().addClass(etat).html(message).append('<span class="icon-ferme"></span>').fadeIn().off("click").on("click",function(){window.clearTimeout(extinction);$(this).fadeOut(800)});extinction=window.setTimeout(function(){$("#log").fadeOut(800)},6e3)}function reconnect(settings,light){$("#fenetre,#fenetre_fond").remove();if(settings.url=="recup.php")var action=settings.data.indexOf("prefs")?"récupérer les préférences de cet utilisateur":"récupérer la liste des répertoires et documents disponibles";else{var action="valider cette action";settings.afficheform=Function.prototype}if(light)popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>           <p>Vous êtes déjà connecté, mais vous devez saisir de nouveau votre mot de passe pour '+action+'.</p>           <form>           <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>           </form>',true);else popup('<a class="icon-ok" title="Valider"></a><h3>Connexion nécessaire</h3>           <p>Vous avez été automatiquement déconnecté. Vous devez vous connecter à nouveau pour '+action+'.</p>           <form>           <p class="ligne"><label for="login">Identifiant&nbsp;: </label><input type="text" name="login" id="login"></p>           <p class="ligne"><label for="motdepasse">Mot de passe&nbsp;: </label><input type="password" name="motdepasse" id="motdepasse"></p>           </form>',true);$("#fenetre input:first").focus();$("#fenetre a.icon-ok").on("click",function(){$.ajax({url:settings.url,method:"post",data:$("#fenetre form").serialize()+"&"+settings.data,dataType:"json",el:settings.el,afficheform:settings.afficheform,fonction:settings.fonction}).done(function(data){if(data["etat"]!="mdpnok")$("#fenetre,#fenetre_fond").remove()})});$("#fenetre a.icon-ferme").on("click",function(){affiche("Modification non effectuée, connexion nécessaire","nok")});$("#fenetre input").on("keypress",function(e){if(e.which==13){$("#fenetre a.icon-ok").click();return false}})}function popup(contenu,modal){$("#fenetre,#fenetre_fond").remove();var el=$('<article id="fenetre"></article>').appendTo("body").html(contenu).focus();if(modal)$('<div id="fenetre_fond"></div>').appendTo("body").click(function(){$("#fenetre,#fenetre_fond").remove()});else $('<a class="icon-epingle" title="Épingler à la page"></a>').prependTo(el).on("click",function(){$("#fenetre_fond").remove();$(this).remove();el.removeAttr("id").insertBefore($("article,#calendrier,#parentsdoc+*").first())});$('<a class="icon-ferme" title="Fermer"></a>').prependTo(el).on("click",function(){el.remove();$("#fenetre_fond").remove()})}function confirmation(question,element,action){popup("<h3>Demande de confirmation</h3><p>"+question+'</p><p class="confirmation"><button class="icon-ok"></button>&nbsp;&nbsp;&nbsp;<button class="icon-annule"></button></p>',true);$("#fenetre .icon-ok").on("click",function(){action(element);$("#fenetre,#fenetre_fond").remove()});$("#fenetre .icon-annule").on("click",function(){$("#fenetre,#fenetre_fond").remove()})}function plie(){$(this).parent().parent().nextUntil(".categorie").fadeToggle("slow");$(this).toggleClass("icon-plie icon-deplie")}$.fn.textareahtml=function(){this.each(function(){var ta=$(this);var placeholder=this.getAttribute("placeholder");this.setAttribute("placeholder",placeholder+". Formattage en HTML, balises visibles.");var ce=$('<div contenteditable="true" placeholder="'+placeholder+'"></div>').insertAfter(ta.before(boutons)).hide();var boutonretour=ta.prev().children(".icon-retour");if(ta.hasClass("ligne")){ce.addClass("ligne");ta.prev().addClass("ligne")}ta.on("keypress",function(e){if(e.which==13)this.value=nettoie(this.value)}).on("paste cut",function(){var el=this;setTimeout(function(){el.value=nettoie(el.value)},100)});ce.on("keypress",function(e){if(e.which==13)boutonretour.click()}).on("paste cut",function(){var el=this;setTimeout(function(){el.innerHTML=nettoie(el.innerHTML)+"<br>"},100)});ta.prev().children(".icon-nosource").on("click",function(e){e.preventDefault();ta.hide();ce.show().css("min-height",ta.outerHeight());$(this).hide().prev().show();ce.focus().html(nettoie(ta.val())).change();if(window.getSelection){var r=document.createRange();r.selectNodeContents(ce[0]);r.collapse(false);var s=window.getSelection();s.removeAllRanges();s.addRange(r)}else{var r=document.body.createTextRange();r.moveToElementText(ce[0]);r.collapse(false);r.select()}});ta.prev().children(".icon-source").on("click",function(e){e.preventDefault();ce.hide(0);ta.show(0).css("height",ce.height());$(this).hide().next().show();ta.focus().val(nettoie(ce.html()))}).hide();ta.prev().children(".icon-aide").on("click",function(e){e.preventDefault();aidetexte()});ta.prev().children().not(".icon-nosource,.icon-source,.icon-aide").on("click",function(e){e.preventDefault();window["insertion_"+this.className.substring(5)]($(this))})})};$.fn.editinplace=function(){this.each(function(){var el=$(this);el.data("original",el.is("h3")?el.text():el.html());$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transforme)})};function transforme(){var el=$(this).parent().addClass("avecform");if(el.is("div"))el.html('<form><textarea name="val" rows="'+(el.data("original").split(/\r\n|\r|\n/).length+3)+'"></textarea></form>');else el.html('<form class="edition" onsubmit="$(this).children(\'a.icon-ok\').click(); return false;"><input type="text" name="val" value=""></form>');var input=el.find('[name="val"]').val(el.data("original")).attr("placeholder",el.attr("placeholder"));if(el.hasClass("edithtml"))input.textareahtml();$('<a class="icon-ok" title="Valider"></a>').appendTo(el.children()).on("click",function(){var id=el.data("id").split("|");if(el.hasClass("edithtml"))input.val(nettoie(input.is(":visible")?input.val():input.next().html()));$.ajax({url:"ajax.php",method:"post",data:{action:id[0],champ:id[1],id:id[2],val:input.val()},dataType:"json",el:el,fonction:function(el){var val=el.find('[name="val"]').val();el.removeClass("avecform").html(val).data("original",val);$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transforme)}})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(el.children()).on("click",function(){el.removeClass("avecform").html(el.data("original"));$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transforme)});input.focus().val(el.hasClass("edithtml")?nettoie(input.val()):input.val())}$.fn.editinplacecdt=function(){this.each(function(){$(this).wrapInner("<span></span>").data("original",$(this).text());$('<a class="icon-edite" title="Modifier"></a>').appendTo($(this)).on("click",transformecdt)})};function transformecdt(){var el=$(this).parent();$(".icon-edite",el).remove();var form=$('<form class="titrecdt"></form>').insertBefore(el.parent().children("div")).html($("#form-cdt").html());$("input, select",form).attr("id",function(){return this.getAttribute("name")});var valeurs=el.data("donnees");for(var cle in valeurs)$("#"+cle).val(valeurs[cle]);form.init_cdt_boutons();$("input,#demigroupe",form).on("change keyup",function(){var t=new Date($("#jour").val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var dg=$("#demigroupe").val()==1?" (en demi-groupe)":"";switch(parseInt(seances[$("#tid").val()])){case 0:var titre=jours[t.getDay()]+" "+$("#jour").val()+" à "+$("#h_debut").val()+" : "+$("#tid option:selected").text()+dg;break;case 1:var titre=jours[t.getDay()]+" "+$("#jour").val()+" de "+$("#h_debut").val()+" à "+$("#h_fin").val()+" : "+$("#tid option:selected").text()+dg;break;case 2:var titre=jours[t.getDay()]+" "+$("#jour").val()+" : "+$("#tid option:selected").text()+" pour le "+$("#pour").val()+dg;break;case 3:var titre=jours[t.getDay()]+" "+$("#jour").val()+" : "+$("#tid option:selected").text()+dg;break;case 4:var titre=jours[t.getDay()]+" "+$("#jour").val();break;case 5:var titre="[Entrée hebdomadaire]"}$("span",el).text(titre)});$('<a class="icon-ok" title="Valider"></a>').appendTo(el).on("click",function(){var id=el.parent().data("id").split("|");$.ajax({url:"ajax.php",method:"post",data:"action=cdt-elems&id="+id[1]+"&"+form.serialize(),dataType:"json",el:el,fonction:function(el){var form=el.siblings("form");el.data("original",$("span",el).text()).data("donnees",{tid:$("#tid").val(),jour:$("#jour").val(),h_debut:$("#h_debut").val(),h_fin:$("#h_fin").val(),pour:$("#pour").val(),demigroupe:$("#demigroupe").val()});form.remove();$("a",el).remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transformecdt)}}).done(function(data){if(data["etat"]=="ok"&&data["reload"]=="oui")location.reload(true)})});$('<a class="icon-annule" title="Annuler"></a>').appendTo(el).on("click",function(){form.remove();$("span",el).html(el.data("original"));$("a",el).remove();$('<a class="icon-edite" title="Modifier"></a>').appendTo(el).on("click",transformecdt)})}function nettoie(html){if(html.indexOf("cdptmp")>0){var tmp=$("<div>"+html+"</div>");tmp.find(".cdptmp").contents().unwrap();html=tmp.html();if(html.indexOf("cdptmp")>0)html=html.replace(/<span class="cdptmp"><\/span>/g,"")}return html.replace(/(<\/?[A-Z]+)([^>]*>)/g,function(tout,x,y){return x.toLowerCase()+y}).replace(/[\r\n ]+/g," ").replace(/(<br>)+[ ]?<\/(p|div|li|h)/g,function(tout,x,y){return"</"+y}).replace(/<br>/g,"<br>\n").replace(/<(p|div|li|h)/g,function(x){return"\n"+x}).replace(/<\/(p|div|li|h.)>/g,function(x){return x+"\n"}).replace(/<\/?(ul|ol)[^>]*>/g,function(x){return"\n"+x+"\n"}).replace(/^(?!(<p|<div|<ul|<ol|<li|<h))(.+)<br>$/gm,function(tout,x,y){return"<p>"+y+"</p>"}).replace(/^(?!(<(p|div|ul|ol|li)))[ ]?(.+)[ ]?$/gm,function(t,x,y,z){return z.match(/.*(p|div|ul|ol|li|h.)>$/)?z:"<p>"+z+"</p>"}).replace(/^[ ]?(<\/?(br|p|div|h.)>){0,2}[ ]?(<\/(p|div|h.)>)?[ ]?$/gm,"").replace(/^\n/gm,"").replace(/<li/g,"  <li")}function insert(el,debut,fin,milieu){var contenant=el.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(!contenant.hasAttribute("data-selection"))marqueselection(el);var texte=milieu===undefined?debut+"Í"+contenant.getAttribute("data-selection")+"Ì"+fin:debut+"Í"+milieu+"Ì"+fin;var contenu=nettoie(contenant.getAttribute("data-contenu").replace(/Í.*Ì/,texte));if(contenant.tagName=="TEXTAREA")contenant.value=contenu.replace(/[ÍÌ]/g,"");else contenant.innerHTML=contenu.replace(/[ÍÌ]/g,"");marqueselection(el,true);if(contenant.tagName=="TEXTAREA"&&contenant.selectionStart!==undefined){contenant.selectionStart=contenu.indexOf("Í");contenant.selectionEnd=contenu.indexOf("Ì")-1;contenant.focus()}else if(document.selection){if(contenant.tagName!="TEXTAREA")contenu=contenu.replace(/(<([^>]+)>)[\n]*/g,"");range=document.body.createTextRange();range.moveToElementText(contenant);range.collapse(true);range.moveEnd("character",contenu.indexOf("Ì")-1);range.moveStart("character",contenu.indexOf("Í"));range.select()}else if(window.getSelection){contenant.innerHTML=contenu.replace("Í",'<span class="cdptmp">').replace("Ì","</span>")+"<br>";selection=window.getSelection();range=document.createRange();range.selectNodeContents($(contenant).find(".cdptmp")[0]);selection.removeAllRanges();selection.addRange(range);contenant.focus()}}function marqueselection(el,efface){var contenant=el.parent().siblings("textarea,[contenteditable]").filter(":visible")[0];if(efface){contenant.removeAttribute("data-selection");contenant.removeAttribute("data-contenu");return true}var original=contenant.tagName=="TEXTAREA"?contenant.value:contenant.innerHTML;var sel="";if(contenant.tagName=="TEXTAREA"&&contenant.selectionStart!==undefined){contenant.focus();sel=contenant.value.substring(contenant.selectionStart,contenant.selectionEnd);contenant.value=contenant.value.substr(0,contenant.selectionStart)+"Í"+sel+"Ì"+contenant.value.substring(contenant.selectionEnd)}else if(window.getSelection){var range=window.getSelection().getRangeAt(0);if(contenant==range.commonAncestorContainer||$.contains(contenant,range.commonAncestorContainer)){var sel=window.getSelection().toString();range.deleteContents();range.insertNode(document.createTextNode("Í"+sel+"Ì"))}}else{var range=document.selection.createRange();if(contenant==range.parentElement()||$.contains(contenant,range.parentElement())){var sel=document.selection.createRange().text;document.selection.createRange().text="Í"+sel+"Ì"}}if(contenant.tagName=="TEXTAREA"){var contenu=contenant.value;contenant.value=original}else{var contenu=contenant.innerHTML;$(contenant).html(original)}if(contenu.indexOf("Ì")<0)contenu=contenu+"ÍÌ";contenant.setAttribute("data-selection",sel);contenant.setAttribute("data-contenu",contenu);return sel}var boutons='<p class="boutons">  <button class="icon-titres" title="Niveaux de titres"></button>  <button class="icon-par1" title="Paragraphe"></button>  <button class="icon-par2" title="Paragraphe important"></button>  <button class="icon-par3" title="Paragraphe très important"></button>  <button class="icon-retour" title="Retour à la ligne"></button>  <button class="icon-gras" title="Gras"></button>  <button class="icon-italique" title="Italique"></button>  <button class="icon-souligne" title="Souligné"></button>  <button class="icon-omega" title="Insérer une lettre grecque"></button>  <button class="icon-sigma" title="Insérer un signe mathématique"></button>  <button class="icon-exp" title="Exposant"></button>  <button class="icon-ind" title="Indice"></button>  <button class="icon-ol" title="Liste énumérée"></button>  <button class="icon-ul" title="Liste à puces"></button>  <button class="icon-lien1" title="Lien vers un document du site"></button>  <button class="icon-lien2" title="Lien internet"></button>  <button class="icon-tex" title="LATEX!"></button>  <button class="icon-source" title="Voir et éditer le code html"></button>  <button class="icon-nosource" title="Voir et éditer le texte formaté"></button>  <button class="icon-aide" title="Aide pour cet éditeur de texte"></button></p>';function insertion_titres(el){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un titre</h3>  <p>Choisissez le type du titre ci-dessous. Vous pouvez éventuellement modifier le texte (ou pourrez le faire ultérieurement). Il est conseillé d\'utiliser des titres de niveau 2 pour les titres dans les programmes de colle.</p>  <input type="radio" name="titre" id="t3" value="3" checked><h3><label for="t3">Titre de niveau 1 (pour les I,II...)</label></h3><br>  <input type="radio" name="titre" id="t4" value="4"><h4><label for="t4">Titre de niveau 2 (pour les 1,2...)</label></h4><br>  <input type="radio" name="titre" id="t5" value="5"><h5><label for="t5">Titre de niveau 3 (pour les a,b...)</label></h5><br>  <input type="radio" name="titre" id="t6" value="6"><h6><label for="t6">Titre de niveau 4</label></h6><br>  <p class="ligne"><label for="texte">Texte&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(el)+'" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre input").on("click keyup",function(){var balise="h"+$("[name='titre']:checked").val();$("#apercu").html("<"+balise+">"+($("#texte").val().length?$("#texte").val():"Texte du titre")+"</"+balise+">")}).first().keyup();$("#texte").on("keypress",function(e){if(e.which==13)$("#fenetre a.icon-ok").click()}).focus();$("#fenetre a.icon-ok").on("click",function(){var balise="h"+$("[name='titre']:checked").val();insert(el,"<"+balise+">","</"+balise+">",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_omega(el){popup("<h3>Insertion d'une lettre grecque</h3>  <p>Cliquez sur la lettre à insérer&nbsp;:</p>  <button>&alpha;</button> <button>&beta;</button> <button>&gamma;</button> <button>&Delta;</button> <button>&delta;</button> <button>&epsilon;</button> <button>&eta;</button> <button>&Theta;</button> <button>&theta;</button> <button>&Lambda;</button> <button>&lambda;</button> <button>&mu;</button> <button>&nu;</button> <button>&xi;</button> <button>&Pi;</button> <button>&pi;</button> <button>&rho;</button> <button>&Sigma;</button> <button>&sigma;</button> <button>&tau;</button> <button>&upsilon;</button> <button>&Phi;</button> <button>&phi;</button> <button>&Psi;</button> <button>&psi;</button> <button>&Omega;</button> <button>&omega;</button>",true);$("#fenetre button").on("click",function(){insert(el,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_sigma(el){popup("<h3>Insertion d'un symbole mathématique</h3>  <p>Cliquez sur le symbole à insérer&nbsp;:</p>  <button>&forall;</button> <button>&exist;</button> <button>&part;</button> <button>&nabla;</button> <button>&prod;</button> <button>&sum;</button> <button>&plusmn;</button> <button>&radic;</button> <button>&infin;</button> <button>&int;</button> <button>&prop;</button> <button>&sim;</button> <button>&cong;</button> <button>&asymp;</button> <button>&ne;</button> <button>&equiv;</button> <button>&le;</button> <button>&ge;</button> <button>&sub;</button> <button>&sup;</button> <button>&nsub;</button> <button>&sube;</button> <button>&supe;</button> <button>&isin;</button> <button>&notin;</button> <button>&ni;</button> <button>&oplus;</button> <button>&otimes;</button> <button>&sdot;</button> <button>&and;</button> <button>&or;</button> <button>&cap;</button> <button>&cup;</button> <button>&real;</button> <button>&image;</button> <button>&empty;</button> <button>&deg;</button> <button>&prime;</button> <button>&micro;</button> <button>&larr;</button> <button>&uarr;</button> <button>&rarr;</button> <button>&darr;</button> <button>&harr;</button> <button>&lArr;</button> <button>&uArr;</button> <button>&rArr;</button> <button>&dArr;</button> <button>&hArr;</button>",true);$("#fenetre button").on("click",function(){insert(el,"","",$(this).text());$("#fenetre,#fenetre_fond").remove()})}function insertion_ol(el){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste numérotée</h3>  <p>Choisissez le type de numérotation et la valeur de départ de la liste ci-dessous. Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne. Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <p class="ligne"><label for="t1">Numérotation numérique (1, 2, 3...)</label><input type="radio" name="type" id="t1" value="1" checked></p>  <p class="ligne"><label for="t2">Numérotation alphabétique majuscule (A, B, C...)</label><input type="radio" name="type" id="t2" value="A"></p>  <p class="ligne"><label for="t3">Numérotation alphabétique minuscule (a, b, c...)</label><input type="radio" name="type" id="t3" value="a"></p>  <p class="ligne"><label for="t4">Numérotation romaine majuscule (I, II, III...)</label><input type="radio" name="type" id="t4" value="I"></p>  <p class="ligne"><label for="t5">Numérotation romaine minuscule (i, ii, iii...)</label><input type="radio" name="type" id="t5" value="i"></p>  <p class="ligne"><label for="debut">Valeur de début (numérique)</label><input type="text" id="debut" value="1"></p>  <p class="ligne"><label for="lignes">Textes (chaque ligne correspond à un élément de la liste)&nbsp;: </label></p>  <textarea id="lignes" rows="5">'+marqueselection(el)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#fenetre :input").on("click keyup",function(){var debut=$("#debut").val();debut=debut.length&&debut>1?' start="'+debut+'"':"";$("#apercu").html('<ol type="'+$("[name='type']:checked").val()+'"'+debut+"><li>"+($("#lignes").val().length?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ol>")}).first().keyup();$("#lignes").focus();$("#fenetre a.icon-ok").on("click",function(){var debut=$("#debut").val();debut=debut.length&&debut>1?' start="'+debut+'"':"";var elements=$("#lignes").val().trim("\n");var index=elements.lastIndexOf("\n");if(index>0){var dernier=elements.substring(index+1);elements=elements.substring(0,index)}else var dernier="";insert(el,'<ol type="'+$("[name='type']:checked").val()+'"'+debut+"><li>"+elements.replace(/\n/g,"</li><li>")+"</li><li>","</li></ol>",dernier);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_ul(el){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'une liste à puces</h3>  <p>Vous pouvez éventuellement modifier les différents éléments en les écrivant ligne par ligne (chaque ligne correspond à un élément de la la liste). Vous pourrez ajouter un élément ultérieurement en l\'encadrant par les balises &lt;li&gt; et &lt;/li&gt;.</p>  <textarea id="lignes" rows="5">'+marqueselection(el)+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu"></div>',true);$("#lignes").on("click keyup",function(){$("#apercu").html("<ul><li>"+($("#lignes").val().length?$("#lignes").val().trim("\n").replace(/\n/g,"</li><li>"):"Première ligne</li><li>Deuxième ligne</li><li>...")+"</li></ul>")}).keyup().focus();$("#fenetre a.icon-ok").on("click",function(){var elements=$("#lignes").val().trim("\n");var index=elements.lastIndexOf("\n");if(index>0){var dernier=elements.substring(index+1);elements=elements.substring(0,index)}else var dernier="";insert(el,"<ul><li>"+elements.replace(/\n/g,"</li><li>")+"</li><li>","</li></ul>",dernier);$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_lien1(el){var sel=marqueselection(el);popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien vers un document de Cahier de Prépa</h3>  <div><p style="text-align:center; margin: 2em 0;">[Récupération des listes de documents]</p></div>  <div style="display:none;"><hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Veuillez choisir un document]</div></div>',true);$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)});$.ajax({url:"recup.php",method:"post",data:{action:"docs"},dataType:"json"}).done(function(data){var majapercu=function(){var apercu=$("#apercu");var id=$("#doc").val();var texte=$("#doc option:selected").text();if(id==0)apercu.html(texte);else if($("#vue").is(":checked")){var l=$("#largeur").val();if(texte.slice(-4,-1)=="pdf"){if(apercu.children(".pdf").length==0)apercu.html('<div><object data="download?id='+id+'" type="application/pdf" height="100%" width="100%"> <a href="download?id='+id+'">'+texte+"</a> </object></div>");else if(apercu.find("object").attr("data").substr(12)!=id)apercu.find("object").attr("data","download?id="+id).html('<a href="download?id='+id+'">'+texte+"</a>");apercu.children().attr("class","pdf "+$("#format").val());if(l){if(l==100)apercu.children().removeAttr("style").children().attr("width","100%").removeAttr("style");else{apercu.children().css("padding-bottom",$('<div class="'+$("#format").val()+'"></div>').css("padding-bottom").slice(0,-1)*l/100+"%");apercu.find("object").attr("width",l+"%").css("left",(100-l)/2+"%")}}}else if("jpgpegpng".indexOf(texte.slice(-4,-1))>-1){if(apercu.children("img").length==0)apercu.css("text-align","").html('<img src="download?id='+id+'">');else if(apercu.children().attr("src").substr(12)!=id)apercu.children().attr("src","download?id="+id);if(l){if(l==100)apercu.children().removeAttr("style");else apercu.children().css("width",l+"%").css("margin-left",(100-l)/2+"%")}}}else $("#apercu").css("text-align","center").html('<a onclick="return false;" href="download?id='+this.value+'">'+$("#texte").val()+"</a>")};var affichedocs=function(data){$("#fenetre > div:first").html('  <p>Choisissez ci-dessous le répertoire puis le document à insérer. Vous pouvez aussi modifier le texte visible. Cela reste modifiable ultérieurement&nbsp;: le texte est situé entre les deux balises &lt;a...&gt; et &lt;/a&gt;.</p>  <p class="ligne"><label for="mat">Matière&nbsp;:</label><select id="mat">'+data.mats+'</select></p>  <p class="ligne"><label for="rep">Répertoire&nbsp;:</label><select id="rep"></select></p>  <p class="ligne"><label for="doc">Document&nbsp;:</label><select id="doc"></select></p>  <p class="ligne"><label for="texte">Texte visible&nbsp;:</label><input type="text" id="texte" value="'+sel+'" size="80" data-auto="1"></p>  <p class="ligne"><label for="vue">Afficher dans la page (PDF et image uniquement)</label><input type="checkbox" id="vue">  <p class="ligne"><label for="largeur">Largeur en %&nbsp;:</label><input type="text" id="largeur" value="100" size="3"></p>  <p class="ligne"><label for="format">Format (PDF uniquement)</label><select id="format">    <option value="portrait">A4 vertical</option><option value="paysage">A4 horizontal</option><option value="hauteur50">Hauteur 50%</option>  </select>');$("#fenetre > div:last").show();if($("#texte").val().length)$("#texte").attr("data-auto",0);$("#doc").on("change keyup",function(e){if(e.which==13)$("#fenetre a.icon-ok").click();var texte=$("#doc option:selected").text();if($("#texte").attr("data-auto")==1)$("#texte").val(this.value>0?texte.substr(0,texte.lastIndexOf("(")-1):"---");if("pdfjpgpegpng".indexOf(texte.slice(-4,-1))>-1)$("#vue").change().parent().show();else{$("#vue, #largeur, #format").parent().hide();$("#vue").prop("checked",false)}majapercu()});$("#texte").on("change keypress",function(e){if(e.which==0)return;if(e.which==13)$("#fenetre a.icon-ok").click();if(this.value.length==0){$(this).data("auto",1);$("#doc").change()}else{$(this).data("auto",0);majapercu()}});$("#vue").on("change",function(){if($("#vue").is(":checked")){if($("#doc option:selected").text().slice(-4,-1)=="pdf"){$("#largeur, #format").parent().show();$("#texte").parent().hide()}else if("jpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1){$("#largeur").parent().show();$("#format, #texte").parent().hide()}}else{$("#texte").parent().show();$("#largeur, #format").parent().hide()}majapercu()});$("#format").on("change keyup",function(e){if(e.which==13)$("#fenetre a.icon-ok").click();majapercu()});$("#largeur").on("keydown",function(e){if(e.which==38)++this.value;else if(e.which==40)--this.value}).on("change keyup",function(e){if(e.which==0)return;if(e.which==13)$("#fenetre a.icon-ok").click();if(this.value!=$(this).data("valeur")){$(this).data("valeur",this.value);majapercu()}}).attr("data-valeur",100);$("#rep").on("change",function(){$("#doc").html(data.docs[this.value]).change()});$("#mat").on("change",function(){$("#rep").html(data.reps[this.value]).change()}).focus().change();$("#fenetre a.icon-ok").on("click",function(){if($("#doc").val()){if($("#vue").is(":checked")&&"pdfjpgpegpng".indexOf($("#doc option:selected").text().slice(-4,-1))>-1)insert(el,$("#apercu").html(),"","");else insert(el,'<a href="download?id='+$("#doc").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()}});$("#mat option").each(function(){if($("body").attr("data-matiere")==this.value)$("#mat").val(this.value).change()})};if("mats"in data)affichedocs(data)})}function insertion_lien2(el){popup('<a class="icon-ok" title="Valider"></a><h3>Insertion d\'un lien</h3>  <p class="ligne"><label for="texte">Texte visible&nbsp;: </label><input type="text" id="texte" value="'+marqueselection(el)+'" size="80"></p>  <p class="ligne"><label for="url">Adresse&nbsp;: </label><input type="text" id="url" value="http://" size="80"></p>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;"></div>',true);$("#fenetre input").on("click keyup",function(){$("#apercu").html($("#texte").val().length?'<a onclick="return false;" href="'+$("#url").val()+'">'+$("#texte").val()+"</a>":"[Écrivez un texte visible]")}).on("keypress",function(e){if(e.which==13)$("#fenetre a.icon-ok").click()}).first().keyup().focus();$("#fenetre a.icon-ok").on("click",function(){insert(el,'<a href="'+$("#url").val()+'">',"</a>",$("#texte").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_tex(el){var chargement=typeof MathJax=="undefined"?'<script type="text/javascript" src="/MathJax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script><script type="text/x-mathjax-config">MathJax.Hub.Config({tex2jax:{inlineMath:[["$","$"],["\\\\(","\\\\)"]]}});</script>':"";var sel=marqueselection(el);var type="t1";if(sel.length)switch(sel.substring(0,2)){case"\\[":case"$$":type="t2";case"\\(":sel=sel.substring(2,sel.length-2);break;default:sel=sel.trim("$")}popup(chargement+'<a class="icon-montre" title="Mettre à jour l\'aperçu"></a><a class="icon-ok" title="Valider"></a><h3>Insertion de formules LaTeX</h3>  <p>Vous pouvez ci-dessous entrer et modifier une formule LaTeX. L\'aperçu présent en bas sera mis à jour uniquement lorsque vous cliquez sur l\'icône <span class="icon-montre"></span>.</p>  <p class="ligne"><label for="t1">La formule est en ligne (pas de retour)</label><input type="radio" name="type" id="t1" value="1"></p>  <p class="ligne"><label for="t2">La formule est hors ligne (formule centrée)</label><input type="radio" name="type" id="t2" value="2"></p>  <textarea id="formule" rows="3">'+sel+'</textarea>  <hr><h3>Aperçu</h3><div id="apercu" style="text-align:center;">[Demandez l\'aperçu en cliquant sur l\'icône <span class="icon-montre"></span>]</div>',true);$("#"+type).prop("checked",true);$("#formule").focus();$("#fenetre a.icon-montre").on("click",function(){if($("#formule").val().length){$("#apercu").html($("#t1").is(":checked")?"$"+$("#formule").val()+"$":"\\["+$("#formule").val()+"\\]").css("text-align","left");MathJax.Hub.Queue(["Typeset",MathJax.Hub,"apercu"])}else $("#apercu").html("[Écrivez une formule]").css("text-align","center")});$("#fenetre a.icon-ok").on("click",function(){if($("#t1").is(":checked"))insert(el,"$","$",$("#formule").val());else insert(el,"\\[","\\]",$("#formule").val());$("#fenetre,#fenetre_fond").remove()});$("#fenetre a.icon-ferme,#fenetre_fond").on("click",function(){marqueselection(el,true)})}function insertion_par1(el){insert(el,"<p>","</p>")}function insertion_par2(el){insert(el,"<div class='note'>","</div>")}function insertion_par3(el){insert(el,"<div class='annonce'>","</div>")}function insertion_retour(el){insert(el,"<br>","")}function insertion_gras(el){insert(el,"<strong>","</strong>")}function insertion_italique(el){insert(el,"<em>","</em>")}function insertion_souligne(el){insert(el,"<u>","</u>")}function insertion_exp(el){insert(el,"<sup>","</sup>")}function insertion_ind(el){insert(el,"<sub>","</sub>")}function aidetexte(){popup('<h3>Aide et explications</h3>  <p>Il y a deux modes d\'éditions possibles pour éditer un texte&nbsp;: le mode «&nbsp;balises visibles&nbsp;» et le mode «&nbsp;balises invisibles&nbsp;». Il est possible de passer de l\'un à l\'autre&nbsp;:</p>  <ul>    <li><span class="icon-source"></span> permet de passer en mode «&nbsp;balises visibles&nbsp;» (par défaut), où le texte à taper est le code HTML de l\'article. Ce mode est plus précis. Les boutons aux dessus aident à utiliser les bonnes balises.</li>    <li><span class="icon-nosource"></span> permet de passer en mode «&nbsp;balises invisibles&nbsp;», où le texte est tel qu\'il sera affiché sur la partie publique, et modifiable. Ce mode est moins précis, mais permet le copié-collé depuis une page web ou un document Word/LibreOffice.  </ul>  <p>Une fonction de nettoyage du code HTML, permettant d\'assurer une homogénéité et une qualité d\'affichage optimales, est lancée à chaque commutation entre les deux modes, à chaque clic sur un des boutons disponibles, à chaque copie/coupe de texte et à chaque passage à la ligne.</p>  <p>En HTML, toutes les mises en formes sont réalisées par un encadrement de texte entre deux balises&nbsp;: &lt;h3&gt; et &lt;/h3&gt; pour un gros titre, &lt;p&gt; et &lt;/p&gt; pour un paragraphe. Le retour à la ligne simple, qui ne doit exister que très rarement, est une balise simple &lt;br&gt;. Mais les boutons disponibles sont là pour vous permettre de réaliser le formattage que vous souhaitez&nbsp;:</p>  <ul>    <li><span class="icon-titres"></span>&nbsp;: différentes tailles de titres (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-par1"></span>&nbsp;: paragraphe classique, qui doit obligatoirement encadrer au minimum chaque ligne de texte. Apparaît automatiquement au passage à la ligne si on l\'oublie.</li>    <li><span class="icon-par2"></span>&nbsp;: paragraphe important, écrit en rouge</li>    <li><span class="icon-par3"></span>&nbsp;: paragraphe très important, écrit en rouge et encadré</li>    <li><span class="icon-retour"></span>&nbsp;: retour à la ligne. Identique à un appui sur Entrée, et souvent inutile.</li>    <li><span class="icon-gras"></span>&nbsp;: mise en gras du texte entre les balises</li>    <li><span class="icon-italique"></span>&nbsp;: mise en italique du texte entre les balises</li>    <li><span class="icon-souligne"></span>&nbsp;: soulignement du texte entre les balises</li>    <li><span class="icon-omega"></span>&nbsp;: lettres grecques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-sigma"></span>&nbsp;: symboles mathématiques (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-exp"></span>&nbsp;: mise en exposant du texte entre les balises</li>    <li><span class="icon-ind"></span>&nbsp;: mise en indice du texte entre les balises</li>    <li><span class="icon-ol"></span>&nbsp;: liste numérotée. Une fenêtre supplémentaire permet de choisir le type (1,A,a,I,i) et la première valeur. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-ul"></span>&nbsp;: liste à puces. Les différentes lignes de la liste sont constituées par les balises &lt;li&gt; et &lt;/li&gt;</li>    <li><span class="icon-lien1"></span>&nbsp;: lien d\'un document disponible ici (fenêtre supplémentaire pour choisir)</li>    <li><span class="icon-lien2"></span>&nbsp;: lien vers un autre site web (fenêtre supplémentaire pour entre l\'adresse)</li>    <li><span class="icon-tex"></span>&nbsp;: insertion de code LaTeX (fenêtre supplémentaire pour le taper)</li>  </ul>  <p class="tex2jax_ignore">Il est possible d\'insérer du code en LaTeX, sur une ligne séparée (balises \\[...\\] ou balises $$...$$) ou au sein d\'une phrase (balises $...$ ou balises \\(...\\)). Il faut ensuite taper du code en LaTeX à l\'intérieur. La prévisualisation est réalisée en direct.</p>',false)
-}function echange(el1,el2){if(el1.length&&el2.length){$("article").css("position","relative");el1.css("opacity",.3);el2.css("opacity",.3);el2.animate({top:el1.position().top-el2.position().top},1e3);el1.animate({top:(el2.outerHeight(true)+el2.outerHeight())/2},1e3,function(){el1.css("opacity",1);el2.css("opacity",1);el1.insertAfter(el2);el1.css({position:"static",top:0});el2.css({position:"static",top:0})})}}function cache(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().addClass("cache");el.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().removeClass("cache");el.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().prev().is("article")){el.children(".icon-monte").hide(1e3);el.prev().children(".icon-monte").show(1e3)}if(!el.next().is("article")){el.children(".icon-descend").show(1e3);el.prev().children(".icon-descend").hide(1e3)}echange(el.prev(),el)}})}function descend(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().is("article")){el.children(".icon-monte").show(1e3);el.next().children(".icon-monte").hide(1e3)}if(!el.next().next().is("article")){el.children(".icon-descend").hide(1e3);el.next().children(".icon-descend").show(1e3)}echange(el,el.next())}})}function supprime(el){var parent=el.parent();var prop=parent.data("id").split("|");var item="un élément";switch(prop[0]){case"infos":item="une information";break;case"pages":item="la matière <em>"+$("h3",parent).text()+"</em>. Les informations qui y sont écrites seront aussi supprimées";break;case"reps":item="le répertoire <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>. <strong>Tous les sous-répertoires et documents qui s'y trouvent seront aussi supprimés</strong>";break;case"docs":item="le document <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>";break;case"colles":item="le programme de colle de la "+$(".edition",parent).text().toLowerCase();break;case"cdt-elems":item="un élément du cahier de texte";break;case"cdt-types":item="le type de séances <em>"+$("h3",parent).text()+"</em>. <strong>Les éléments du cahier de texte associés à ce type seront aussi supprimés</strong>";break;case"cdt-raccourcis":item="le raccourci de séance <em>"+$("h3",parent).text()+"</em>. Aucun élément du cahier de texte ne sera supprimé";break;case"notes":parent=parent.parent();item="une colle ou séance sans note du <em>"+$("td:first",parent).text()+"</em>, d'une durée de "+$("td:eq(3)",parent).text()+". Toutes les notes de cette colle seront supprimées";break;case"matieres":item="la matière <em>"+$("h3",parent).text()+"</em>. <p class=\"note\"><strong>ATTENTION&nbsp;: Les programmes de colles, le cahier de texte et les notes correspondantes seront toutes automatiquement supprimées.</strong></p> <p>Les répertoires, les documents, les pages d'informations spécifiques et les éléments de l'agenda associés à la matière seront conservés mais ne seront plus associés à une matière&nbsp;: ils seront désormais visibles dans le contexte «&nbsp;général&nbsp;».<br><strong>Si vous souhaitez simplement réinitialiser la matière, ce n'est pas la bonne méthode</strong>&nbsp;: vous devriez pouvoir faire ce que vous souhaitez avec les possibilités de cette page";break;case"groupes":item="le groupe <em>"+($(".editable",parent).text()||$("input:first",parent).val())+"</em>. Les utilisateurs concernés ne seront pas supprimés";break;case"agenda-elems":item="un événement de l'agenda";break;case"agenda-types":item="le type d'événement <em>"+$("h3",parent).text()+"</em>. <strong>Les événements de l'agenda associés à ce type seront aussi supprimés</strong>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:{supprime:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(prop[0].match(/^(agenda|colles)$/))location.reload(true);else el.remove()}})})}function lock(el){var parent=el.parent();var prop=parent.data("id").split("|");var protection=el.data("val");popup('<a class="icon-ok" title="Valider ce choix"></a><h3>Accès à l\'information</h3><table id="selmult">  <tr class="categorie"><td>Accès public</td><td><input value="0" type="checkbox"></td></tr>  <tr class="categorie"><td>Utilisateurs identifiés</td><td><input value="6" type="checkbox"></td></tr>  <tr class="element"><td>Invités</td><td><input value="1" type="checkbox"></td></tr>  <tr class="element"><td>Élèves</td><td><input value="2" type="checkbox"></td></tr>  <tr class="element"><td>Colleurs</td><td><input value="3" type="checkbox"></td></tr>  <tr class="element"><td>Administratifs</td><td><input value="4" type="checkbox"></td></tr>  <tr class="element"><td>Professeurs</td><td><input value="5" type="checkbox"></td></tr>  <tr class="categorie"><td>Information invisible</td><td><input value="32" type="checkbox"></td></tr>  </tbody></table>',true);var f=$("#fenetre");if(protection==0||protection==32)$('input[value="'+protection+'"]',f).prop("checked",true).change();else{$("input[value=6]",f).prop("checked",true).change();for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('input[value="'+a+'"]',f).prop("checked",true).change()}var f=$("#fenetre");$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}});$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$(".icon-ok",f).on("click",function(){if($('input[value="32"]',f).prop("checked"))var val=32;else if($('input[value="0"]',f).prop("checked"))var val=0;else var val=32-$("input:checked:not([value=6])",f).map(function(){return this.value|0}).get().reduce(function(acc,v){return acc+Math.pow(2,v-1)},0);el.data("val",val);$.ajax({url:"ajax.php",method:"post",data:{action:prop[0],id:prop[1],champ:"protection",val:val},dataType:"json",el:parent,fonction:function(el){location.reload(true)}})})}function ajoutecolle(el){var article=el.parent();el.before('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');el.next().addBack().hide();var form=$("<form></form>").appendTo(article).html($("#form-ajoutecolle").html());$("textarea",form).textareahtml();$("input",form).attr("id","cache");$(".icon-annule",article).on("click",function(){$("form,.icon-annule,.icon-ok",article).remove();el.next().addBack().show()});$("a.icon-ok",article).on("click",function(){$("textarea",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});var id=article.data("id").split("|")[1];$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action=ajout-colle&id="+id,dataType:"json",el:article,fonction:function(el){var texte=$("textarea",el).val();var cache=$("input",el).is(":checked");if(cache)el.addClass("cache");el.data("id","colles|"+id);$(".icon-aide",el).nextAll().remove();$(".icon-aide",el).after((cache?'<a class="icon-montre" title="Afficher le programme de colles sur la partie publique"></a>':'<a class="icon-cache" title="Rendre invisible le programme de colles sur la partie publique"></a>')+'<a class="icon-supprime" title="Supprimer ce programme de colles"></a><div class="editable edithtml" data-id="colles|texte|'+id+'" placeholder="Texte du programme de colles">'+texte+"</div>");$("a.icon-cache,a.icon-montre,a.icon-supprime",el).on("click",function(){window[this.className.substring(5)]($(this))});$(".editable",el).editinplace()}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",article).click()}})}function valide(){var data="";if($("#planning").length)data="action=planning&"+$("form").serialize();else{var id=$(this).parent().attr("data-id").split("|");data="action="+id[0]+"&id="+id[1]+"&"+$(this).nextAll("form").serialize()}if(data.length)$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",el:this,fonction:function(el){if(el.classList[1]!="noreload")location.reload(true)}});else affiche("<p>Aucune donnée envoyée.</p>","nok")}function formulaire(){var idform=this.className.split(" ")[0].substring(5);var action=$("#form-"+idform).data("action");$("#epingle").remove();var article=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertBefore($("article,#calendrier,#parentsdoc+*").first());var form=$("<form></form>").appendTo(article).html($("#form-"+idform).html());$(".edithtml",form).textareahtml();$("input[name], select[name]:not([multiple])",form).attr("id",function(){return this.getAttribute("name")});switch(action){case"reps":$(this).init_reps();break;case"ajout-rep":form.append('<input type="hidden" name="parent" value="'+$(this).parent().data("id").split("|")[1]+'">');break;case"docs":case"ajout-doc":$(this).init_docs(action);break;case"cdt-elems":form.init_cdt_boutons();break;case"ajout-cdt-raccourci":form.init_cdt_raccourcis();break;case"notes":case"ajout-notes":$(this).init_notes(action);break;case"agenda-elems":$(this).init_evenements();break;case"deplcolle":$("#ancien,#nouveau").each(function(){$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})});break;case"ajout-utilisateurs":form.init_ajout_utilisateurs();break;case"ajout-groupe":$(".usergrp span",form).on("click",utilisateursgroupe);break}$("select[multiple]",form).each(selmult);$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()});$("#epingle a.icon-aide").on("click",function(){popup($("#aide-"+idform).html(),false)});$("#epingle a.icon-ok").on("click",function(){$(".edithtml",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});if(action=="notes"||action=="ajout-notes")$("#epingle select:not(:visible)").val("x");$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action="+action,dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("#epingle a.icon-ok").click()}})}$.fn.init_reps=function(){var el=$(this);var form=$("#epingle form");var sel=$("select[multiple]",form);var id=el.parent().data("id").split("|")[1];var donnees=el.parent().data("donnees").split("|");var protection=donnees[2];var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}if(donnees[0]==0)$("#nom,#parent,#menu",form).parent().remove();else{$("#nom",form).val(nom);if(donnees[1]=="1")$("#menu",form).prop("checked",true);$('[data-parents*=",'+id+',"]',form).prop("disabled",true)}form.append('<input type="hidden" name="id" value="'+id+'">');$('input[type="button"]',form).on("click",function(){var action=this.value.substring(0,4)=="Prop"?"propage":"vide";var contexte=$(this).parent().find("em").text();var texte=action=="propage"?"Vous allez propager le réglage d'accès du répertoire <em>"+contexte+"</em> à l'ensemble de ses sous-répertoires et des documents qu'ils contiennent.<br>Vous pourrez modifier à nouveau le réglage de chaque document ou répertoire, de façon individuelle.":"Vous allez vider le répertoire <em>"+contexte+"</em>. Cela supprimera définitivement l'ensemble de ses sous-répertoires et des documents qu'ils contiennent.<br>Cette opération n'est pas annulable.";confirmation(texte,this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action=reps&id="+id+"&"+action+"=1",dataType:"json",el:"",fonction:function(el){location.reload(true)}})})})};$.fn.init_docs=function(action){var el=$(this);var form=$("#epingle form");var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);var id=el.parent().data("id").split("|")[1];if(action=="docs"){var protection=el.parent().data("protection");form.append('<input type="hidden" name="id" value="'+id+'">');$("#nom",form).val(nom)}else{var protection=el.parent().data("donnees").split("|")[2];$("#fichier",form).on("change",function(){if(!$("#nom",form).val().length){var f=this.value;$("#nom",form).val(f.substring(f.lastIndexOf("\\")+1,f.lastIndexOf("."))||f)}});form.append('<input type="hidden" name="parent" value="'+id+'">')}var sel=$("select[multiple]",form);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}form.append('<input type="hidden" name="action" value="'+action+'">');$("#epingle a.icon-ok").addClass("icon-envoidoc").removeClass("icon-ok").on("click",function(){$.ajax({url:"docs.php",method:"post",data:"connexion=1",dataType:"json",el:"",fonction:function(el){if($("#fichier")[0].files.length>0){window.clearTimeout(extinction);$("#log").html("Envoi du document. Cela peut prendre du temps...")}var data=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",contentType:false,processData:false,el:"",fonction:function(el){location.reload(true)}})}})})};$.fn.init_cdt_boutons=function(){var form=this;$("#jour,#pour").datetimepicker({format:"d/m/Y",timepicker:false});$("#h_debut").datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$("#h_fin").val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$("#h_fin").datetimepicker({format:"Ghi",datepicker:false});var zero=function(n){return String(n).length==1?"0"+n:String(n)};$("#raccourci").on("change keyup",function(){var valeurs=raccourcis[this.value];for(var cle in valeurs){if(cle=="jour"){var t=new Date;var j=parseInt(valeurs["jour"]);t.setDate(j>t.getDay()?t.getDate()-t.getDay()-7+j:t.getDate()-t.getDay()+j);$("#jour").val(zero(t.getDate())+"/"+zero(t.getMonth()+1)+"/"+t.getFullYear())}else $("#"+cle).val(valeurs[cle])}$(this).data("modif",1);$("#tid").change()}).data("modif",0);$("#tid").on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$("#h_debut,#demigroupe").parent().show();$("#h_fin,#pour").parent().hide();break;case 1:$("#h_debut,#h_fin,#demigroupe").parent().show();$("#pour").parent().hide();break;case 2:$("#h_debut,#h_fin").parent().hide();$("#pour,#demigroupe").parent().show();break;case 3:$("#h_debut,#h_fin,#pour").parent().hide();$("#demigroupe").parent().show();break;default:$("#h_debut,#h_fin,#pour,#demigroupe").parent().hide()}$("#jour").change()});$("input,#demigroupe",form).on("change keyup",function(){if($("#raccourci").data("modif")==0)$("#raccourci").val(0);else $("#raccourci").data("modif",0)});$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",el).click()});$("select:first",form).focus();$("#tid").change()};$.fn.init_cdt_raccourcis=function(){this.each(function(){var form=$(this);$('[id^="h_d"]',form).datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$('[id^="h_f"]',form).val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$('[id^="h_fin"]').datetimepicker({format:"Ghi",datepicker:false});$('[id^="type"]',form).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$('[id^="h_d"],[id^="dem"]',form).parent().show();$('[id^="h_f"]',form).parent().hide();break;case 1:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().show();break;case 2:case 3:$('[id^="h_d"],[id^="h_f"]',form).parent().hide();$('[id^="dem"]',form).parent().show();break;default:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().hide()}}).change();$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",form).click()})})};$.fn.init_notes=function(action){var el=$(this);var form=$("#epingle form").append($("#form-notes").html());var table=$("table",form);$("input, select",form).attr("id",function(){return this.getAttribute("name")});$("tr[data-id]",table).append("<td>"+$("div",form).html()+"</td>");$("select",table).attr("name",function(){return"e"+$(this).parent().parent().data("id")});$("div",form).remove();if($("input:checkbox",table).length){$("tr[data-id]",form).hide();$("input:checkbox",table).on("change",function(){if($("input:checkbox:last",table).prop("checked"))return $("tr[data-id]",form).show();var ids=$("input:checked",table).map(function(){return this.value.split(",")}).get().concat();$("tr[data-id]:not(.orig)",table).hide();for(var i=0;i<ids.length;i++)$('tr[data-id="'+ids[i]+'"]',form).show()})}function marque_dejanotes(sid){if(sid==0)return true;var dn=dejanotesautres[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (noté par un autre colleur)"});var dn=dejanotesperso[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]:not(.orig)',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (déjà noté par vous-même)"});$(".dejanote select").prop("disabled",true).val("x")}$("#jour").datetimepicker({format:"d/m/Y",timepicker:false,onShow:function(){if($("#td").is(":checked"))this.setOptions({minDate:$("#form-ajoute option:eq(1)").data("date"),maxDate:new Date(new Date($("#form-ajoute option:last").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()+6*864e5)});else this.setOptions({minDate:debut||$("#sid option:selected").data("date"),maxDate:new Date(new Date((fin||$("#sid option:selected").next().data("date")).replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()-864e5)})}});$("#heure").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"15h30"});$("#duree").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"0h00",step:10}).on("change",function(){$(this).removeClass("auto")});$("select",table).on("change keyup",function(){var nb=$("table select:visible",form).filter(function(){return this.value!="x"}).length;var duree=nb*(dureecolle||20);if($("#duree").is(".auto")||duree>$("#duree").val().replace(/^(\d*)h(\d*)$/,function(tout,x,y){return 60*(x|0)+(y|0)}))$("#duree").val((duree/60|0)+"h"+(duree%60||"")).addClass("auto")});if(action=="ajout-notes"){$("#sid").on("change keyup",function(){$(".dejanote td:first-child").text(function(){return this.textContent.replace(" (noté par un autre colleur)","").replace(" (déjà noté par vous-même)","")});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);marque_dejanotes($("#sid").val());var jour=new Date($("#jour").val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var debut=new Date($("#sid option:selected").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var fin=new Date($("#sid option:selected").next().data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));if(jour<debut||jour>fin){debut=debut.toJSON();$("#jour").val(debut.substr(8,2)+"/"+debut.substr(5,2)+"/"+debut.substr(0,4))}}).change();$("#td").on("change keyup",function(){if(this.checked){$("#sid").parent().hide();$("#description").parent().show();table.hide()}else{$("#sid").parent().show();$("#description").parent().hide();table.show()}});$("#description").parent().hide()}else{var tr=el.parent().parent();if(el.data("sid")){$("#description, #td").parent().remove();var sid=el.data("sid");var debut=$('#form-ajoute option[value="'+sid+'"]').data("date");var fin=$('#form-ajoute option[value="'+sid+'"]').next().data("date");var eleves=el.data("eleves").split("|");var notes=el.data("notes").split("|");for(var i=0;i<eleves.length;i++)$('tr[data-id="'+eleves[i]+'"]',form).addClass("orig").show().find("select").val(notes[i]).on("change",function(){$(this).parent().parent().removeClass("orig")});$("h3",form).text("Modifier des notes - semaine du "+$('select[name="sid"] option[value="'+sid+'"]').text().split(" ").slice(0,3).join(" "));if(el.next().length)marque_dejanotes(sid);else{$('tr:not(.orig), .orig option[value="x"]',table).remove();$("#duree").prop("disabled",true);form.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier quels élèves ont été interrogés ou la durée de la colle. Vous pouvez corriger la date et l'heure (dans la limite de la semaine enregistrée) ou les notes que vous avez mises vous pouvez mettre une note à un élève initialement absent qui a rattrapé sa colle.</p>")}}else{table.remove();$("#td").prop("checked",true).prop("disabled",true);$("#description").val(el.parent().prev().prev().prev().text());$("h3",form).text("Modifier la séance de TD sans note");if(el.next().length==0){$("#duree").prop("disabled",true);form.append("<p>Cette séance a déjà été relevée&nbsp;: il est impossible de modifier sa durée. Vous pouvez corriger la date, l'heure ou la description.</p>")}}$("#id").val(el.parent().data("id").split("|")[1]);$("#jour").val($("td:eq(0)",tr).text().replace(/(.{6})(.{2})/,function(tout,x,y){return x+"20"+y}));$("#heure").val($("td:eq(1)",tr).text().replace("-",""));$("#duree").val($("td:eq(3)",tr).text())}};$.fn.init_ajout_utilisateurs=function(){$("#autorisation,#saisie").on("change",function(){var f=$("#epingle form");var a=$("#autorisation",f).val();if(a==0){$(".affichesiinvite,.affichesiinvitation,.affichesimotdepasse,.mailenvoi,.mailliste",f).hide(0);$("textarea",f).prop("disabled",true).attr("placeholder","Zone de saisie des utilisateurs\nSélectionnez d'abord un type d'utilisateur")}else{var inv=a==1;var mdp=$("#saisie",f).val()==2;$("#saisie",f).parent().toggle(!inv);$(".affichesiinvite",f).toggle(inv);$(".affichesiinvitation",f).toggle(!inv&&!mdp);$(".affichesimotdepasse",f).toggle(!inv&&mdp);$(".mailenvoi",f).toggle(!inv);$(".mailliste",f).toggle(a>2);$("#mailenvoi",f).prop("disabled",mdp).change();$("textarea",f).prop("disabled",false).attr("placeholder",function(){if(inv)return"identifiant_1,motdepasse_1\nidentifiant_2,motdepasse_2\nidentifiant_3,motdepasse_3\n...";else if(mdp)return"nom_1,prénom_1,motdepasse_1\nnom_2,prénom_2,motdepasse_2\nnom_3,prénom_3,motdepasse_3\n...";else return"nom_1,prénom_1,adresse_1\nnom_2,prénom_2,adresse_2\nnom_3,prénom_3,adresse_3\n..."})}}).change();$("#epingle #mailenvoi").on("change",function(){$("#epingle #mailliste").attr("disabled",!this.checked||this.disabled)}).change()};$.fn.init_evenements=function(){var el=$(this);var form=$("#epingle form");$("textarea",form).attr("id","texte");if(el.is(".modifevnmt")){var id=el.attr("id").substr(1);var valeurs=evenements[id];var cles=["type","matiere","debut","fin","texte"];for(var i=0;i<6;i++){$("#"+cles[i]).val(valeurs[cles[i]])}$("#id").val(id);$("#texte").change();$("#jours").prop("checked",valeurs["je"]);$('<a class="icon-supprime" title="Supprimer cette information"></a>').insertBefore($(".icon-ok")).on("click",function(){supprime($(this))}).parent().data("id","agenda-elems|"+id)}$("#debut").datetimepicker({onShow:function(){this.setOptions({maxDate:$("#fin").val()||false})},onClose:function(t,input){$("#fin").val(function(i,v){return v||input.val()})}});$("#fin").datetimepicker({onShow:function(){this.setOptions({minDate:$("#debut").val()||false})},onClose:function(t,input){$("#debut").val(function(i,v){return v||input.val()})}});$("#jours").on("change",function(){var v;if(this.checked){$("#debut,#fin").each(function(){v=this.value.split(" ");$(this).val(v[0]).attr("data-heure",v[1]).datetimepicker({format:"d/m/Y",timepicker:false})})}else{$("#debut,#fin").each(function(){if(this.hasAttribute("data-heure"))$(this).val(this.value+" "+$(this).attr("data-heure")).removeAttr("data-heure");$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})})}}).change()};function selmult(){var sel=$(this);var isacces=this.getAttribute("name").indexOf("protection")+1?1:0;function majselect(sel){sel.prev().children().prop("selected",false).text(function(){var options=$(isacces?"option:selected:not([value=6])":"option:selected",sel);if(isacces&&options.length==5)return"Tout utilisateur identifié";if(options.length==0)return"Choisir ...";else return options.map(function(){return this.textContent}).get().join(", ")}).prop("selected",true)}$("<select id="+sel.prev().attr("for")+"><option selected hidden></select>").insertBefore(sel.hide(0)).attr("disabled",sel.attr("disabled")).on("click",function(e){e.preventDefault();this.blur();popup('<a class="icon-ok" title="Valider ce choix"></a><h3>'+sel.prev().prev().text().replace(":","")+'</h3><table id="selmult">'+$("option",sel).map(function(){return"<tr"+(this.selected?' class="sel"':"")+"><td>"+this.textContent+'</td><td><input type="checkbox" '+(this.selected?"checked ":"")+'value="'+this.value+'"></td></tr>'}).get().join("")+"</table>",true);var f=$("#fenetre");if(isacces){$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}})}else{$("#selmult",f).prepend('<tr class="categorie"><th></th><th><a class="icon-cocher"></a></th></tr>');$(".icon-cocher",f).on("click",cocher_utilisateurs)}$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$(".icon-ok",f).on("click",function(){sel.val($("input:checked",f).map(function(){return this.value}).get());majselect(sel);$("#fenetre, #fenetre_fond").remove()})});majselect(sel)}function cocher_utilisateurs(){$(this).toggleClass("icon-cocher icon-decocher").parent().parent().nextUntil(".categorie").find("input").prop("checked",$(this).hasClass("icon-decocher")).change()}function init_utilisateurs(){$(".icones.mailenvoi").each(function(){this.innerHTML=this.textContent==1?'<a class="icon-ok" title="Supprimer la possibilité d\'envoyer des courriels"></a>':'<a class="icon-nok" title="Accorder la possibilité d\'envoyer des courriels"></a>'});$(".mailenvoi a").on("click",mail_utilisateur);$("th .icon-mail").on("click",mail_utilisateurs);$(".icon-cocher").on("click",cocher_utilisateurs);$("td .icon-edite").on("click",edite_utilisateur);$("td .icon-desactive, td .icon-active, td .icon-supprutilisateur, td .icon-validutilisateur").on("click",modif_utilisateur);$("th .icon-desactive, th .icon-active, th .icon-supprutilisateur, th .icon-validutilisateur").on("click",modif_utilisateurs);$("td:not(.icones)").on("click",function(e){$(this).parent().find("input").click()});$("#utilisateurs input").on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});function mail_utilisateur(){var val=$(this).hasClass("icon-ok");$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:"mailenvoi",id:$(this).parent().parent().data("id"),val:1-val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Accorder":"Supprimer")+" la possibilité d'envoyer des courriels")}})}function edite_utilisateur(){var id=$(this).parent().parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"prefs",id:id},dataType:"json",afficheform:function(data){if("nom"in data){popup($("#form-edite").html(),true);var f=$("#fenetre");$("input[name]",f).attr("id",function(){return this.getAttribute("name")});if(data["valide"])$("#comptedesactive, #demande, #invitation",f).remove();else if(data["demande"])$("#compteactif, #comptedesactive, #invitation",f).remove();else if(data["invitation"])$("#compteactif, #comptedesactive, #demande",f).remove();else $("#compteactif, #demande, #invitation",f).remove();if(data["autorisation"]==2)$("#mailliste",f).parent().remove();else if(data["autorisation"]==1)$("#mailenvoi, #mailexp, #mailcopie, #mailliste",f).parent().remove();$("p:first",f).html(function(i,code){return code.replace("XXX",data["prenom"].length?"de <em>"+data["prenom"]+" "+data["nom"]+"</em>":"<em>"+data["login"]+"</em>").replace("YYY","<em>"+["Invité","Élève","Colleur","Administratif","Professeur"][data["autorisation"]-1]+"</em>")});$('input[type="text"],input[type="email"]',f).val(function(){return data[this.id]});$('input[type="checkbox"]',f).prop("checked",function(){return data[this.id]});$("#mailenvoi",f).on("click",function(){$("#mailexp, #mailcopie, #mailliste",f).prop("disabled",!this.checked);if(this.checked&&!$("#mailexp",f).val())$("#mailexp",f).val(data["prenom"]+" "+data["nom"])});$("#mailexp, #mailcopie, #mailliste",f).prop("disabled",!$("#mailenvoi",f).prop("checked"));$("a.icon-ok",f).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=utilisateur&modif=prefs&id="+id+"&"+$("form",f).serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input",f).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",f).click()}})}}})}function modif_utilisateur(){var question="";var compte=$(this).parent().siblings().first().text();compte=compte.length?"de <em>"+compte+"</em>":"d'identifiant <em>"+$(this).parent().siblings().first().next().text()+"</em>";var categorie=$(this).parent().parent().prevUntil(".categorie").last().prev().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver le compte invité "+compte+". Cela signifie que le compte ne sera pas supprimé mais sera non utilisable pour une connexion. Les associations éventuelles avec les matières seront conservées. Ce compte sera listé dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année et dont il faut conserver les notes de colles.";
+}function echange(el1,el2){if(el1.length&&el2.length){$("article").css("position","relative");el1.css("opacity",.3);el2.css("opacity",.3);el2.animate({top:el1.position().top-el2.position().top},1e3);el1.animate({top:(el2.outerHeight(true)+el2.outerHeight())/2},1e3,function(){el1.css("opacity",1);el2.css("opacity",1);el1.insertAfter(el2);el1.css({position:"static",top:0});el2.css({position:"static",top:0})})}}function cache(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{cache:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().addClass("cache");el.removeClass("icon-cache").addClass("icon-montre").off("click").on("click",function(){montre($(this))}).attr("title","Montrer à nouveau")}})}function montre(el){var prop=el.parent().attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{montre:1,action:prop[0],id:prop[1]},dataType:"json",el:el,fonction:function(el){el.parent().removeClass("cache");el.removeClass("icon-montre").addClass("icon-cache").off("click").on("click",function(){cache($(this))}).attr("title","Cacher à nouveau")}})}function monte(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{monte:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().prev().is("article")){el.children(".icon-monte").hide(1e3);el.prev().children(".icon-monte").show(1e3)}if(!el.next().is("article")){el.children(".icon-descend").show(1e3);el.prev().children(".icon-descend").hide(1e3)}echange(el.prev(),el)}})}function descend(el){var parent=el.parent();var prop=parent.attr("data-id").split("|");$.ajax({url:"ajax.php",method:"post",data:{descend:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(!el.prev().is("article")){el.children(".icon-monte").show(1e3);el.next().children(".icon-monte").hide(1e3)}if(!el.next().next().is("article")){el.children(".icon-descend").hide(1e3);el.next().children(".icon-descend").show(1e3)}echange(el,el.next())}})}function supprime(el){var parent=el.parent();var prop=parent.data("id").split("|");var item="un élément";switch(prop[0]){case"infos":item="une information";break;case"pages":item="la matière <em>"+$("h3",parent).text()+"</em>. Les informations qui y sont écrites seront aussi supprimées";break;case"reps":item="le répertoire <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>. <strong>Tous les sous-répertoires et documents qui s'y trouvent seront aussi supprimés</strong>";break;case"docs":item="le document <em>"+$(".nom",parent).map(function(){return this.textContent||$(this).find("input").val()}).get(0)+"</em>";break;case"colles":item="le programme de colle de la "+$(".edition",parent).text().toLowerCase();break;case"cdt-elems":item="un élément du cahier de texte";break;case"cdt-types":item="le type de séances <em>"+$("h3",parent).text()+"</em>. <strong>Les éléments du cahier de texte associés à ce type seront aussi supprimés</strong>";break;case"cdt-raccourcis":item="le raccourci de séance <em>"+$("h3",parent).text()+"</em>. Aucun élément du cahier de texte ne sera supprimé";break;case"notes":parent=parent.parent();item="une colle ou séance sans note du <em>"+$("td:first",parent).text()+"</em>, d'une durée de "+$("td:eq(3)",parent).text()+". Toutes les notes de cette colle seront supprimées";break;case"matieres":item="la matière <em>"+$("h3",parent).text()+"</em>. <p class=\"note\"><strong>ATTENTION&nbsp;: Les programmes de colles, le cahier de texte et les notes correspondantes seront toutes automatiquement supprimées.</strong></p> <p>Les répertoires, les documents, les pages d'informations spécifiques et les éléments de l'agenda associés à la matière seront conservés mais ne seront plus associés à une matière&nbsp;: ils seront désormais visibles dans le contexte «&nbsp;général&nbsp;».<br><strong>Si vous souhaitez simplement réinitialiser la matière, ce n'est pas la bonne méthode</strong>&nbsp;: vous devriez pouvoir faire ce que vous souhaitez avec les possibilités de cette page";break;case"groupes":item="le groupe <em>"+($(".editable",parent).text()||$("input:first",parent).val())+"</em>. Les utilisateurs concernés ne seront pas supprimés";break;case"agenda-elems":item="un événement de l'agenda";break;case"agenda-types":item="le type d'événement <em>"+$("h3",parent).text()+"</em>. <strong>Les événements de l'agenda associés à ce type seront aussi supprimés</strong>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:{supprime:1,action:prop[0],id:prop[1]},dataType:"json",el:parent,fonction:function(el){if(prop[0].match(/^(agenda|colles)$/))location.reload(true);else el.remove()}})})}function lock(el){var parent=el.parent();var prop=parent.data("id").split("|");var protection=el.data("val");popup('<a class="icon-ok" title="Valider ce choix"></a><h3>Accès à l\'information</h3><table id="selmult">  <tr class="categorie"><td>Accès public</td><td><input value="0" type="checkbox"></td></tr>  <tr class="categorie"><td>Utilisateurs identifiés</td><td><input value="6" type="checkbox"></td></tr>  <tr class="element"><td>Invités</td><td><input value="1" type="checkbox"></td></tr>  <tr class="element"><td>Élèves</td><td><input value="2" type="checkbox"></td></tr>  <tr class="element"><td>Colleurs</td><td><input value="3" type="checkbox"></td></tr>  <tr class="element"><td>Administratifs</td><td><input value="4" type="checkbox"></td></tr>  <tr class="element"><td>Professeurs</td><td><input value="5" type="checkbox"></td></tr>  <tr class="categorie"><td>Information invisible</td><td><input value="32" type="checkbox"></td></tr>  </tbody></table>',true);var f=$("#fenetre");if(protection==0||protection==32)$('input[value="'+protection+'"]',f).prop("checked",true).change();else{$("input[value=6]",f).prop("checked",true).change();for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('input[value="'+a+'"]',f).prop("checked",true).change()}var f=$("#fenetre");$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}});$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$(".icon-ok",f).on("click",function(){if($('input[value="32"]',f).prop("checked"))var val=32;else if($('input[value="0"]',f).prop("checked"))var val=0;else var val=32-$("input:checked:not([value=6])",f).map(function(){return this.value|0}).get().reduce(function(acc,v){return acc+Math.pow(2,v-1)},0);el.data("val",val);$.ajax({url:"ajax.php",method:"post",data:{action:prop[0],id:prop[1],champ:"protection",val:val},dataType:"json",el:parent,fonction:function(el){location.reload(true)}})})}function ajoutecolle(el){var article=el.parent();el.before('<a class="icon-annule" title="Annuler"></a><a class="icon-ok" title="Valider"></a>');el.next().addBack().hide();var form=$("<form></form>").appendTo(article).html($("#form-ajoutecolle").html());$("textarea",form).textareahtml();$("input",form).attr("id","cache");$(".icon-annule",article).on("click",function(){$("form,.icon-annule,.icon-ok",article).remove();el.next().addBack().show()});$("a.icon-ok",article).on("click",function(){$("textarea",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});var id=article.data("id").split("|")[1];$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action=ajout-colle&id="+id,dataType:"json",el:article,fonction:function(el){var texte=$("textarea",el).val();var cache=$("input",el).is(":checked");if(cache)el.addClass("cache");el.data("id","colles|"+id);$(".icon-aide",el).nextAll().remove();$(".icon-aide",el).after((cache?'<a class="icon-montre" title="Afficher le programme de colles sur la partie publique"></a>':'<a class="icon-cache" title="Rendre invisible le programme de colles sur la partie publique"></a>')+'<a class="icon-supprime" title="Supprimer ce programme de colles"></a><div class="editable edithtml" data-id="colles|texte|'+id+'" placeholder="Texte du programme de colles">'+texte+"</div>");$("a.icon-cache,a.icon-montre,a.icon-supprime",el).on("click",function(){window[this.className.substring(5)]($(this))});$(".editable",el).editinplace()}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",article).click()}})}function valide(){var data="";if($("#planning").length)data="action=planning&"+$("form").serialize();else{var id=$(this).parent().attr("data-id").split("|");data="action="+id[0]+"&id="+id[1]+"&"+$(this).nextAll("form").serialize()}if(data.length)$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",el:this,fonction:function(el){if(el.classList[1]!="noreload")location.reload(true)}});else affiche("<p>Aucune donnée envoyée.</p>","nok")}function formulaire(){var idform=this.className.split(" ")[0].substring(5);var action=$("#form-"+idform).data("action");$("#epingle").remove();var article=$('<article id="epingle"><a class="icon-ferme" title="Fermer"></a>  <a class="icon-aide" title="Aide pour ce formulaire"></a>  <a class="icon-ok" title="Valider"></a></article>').insertBefore($("article,#calendrier,#parentsdoc+*").first());var form=$("<form></form>").appendTo(article).html($("#form-"+idform).html());$(".edithtml",form).textareahtml();$("input[name], select[name]:not([multiple])",form).attr("id",function(){return this.getAttribute("name")});switch(action){case"reps":$(this).init_reps();break;case"ajout-rep":form.append('<input type="hidden" name="parent" value="'+$(this).parent().data("id").split("|")[1]+'">');break;case"docs":case"ajout-doc":$(this).init_docs(action);break;case"cdt-elems":form.init_cdt_boutons();break;case"ajout-cdt-raccourci":form.init_cdt_raccourcis();break;case"notes":case"ajout-notes":$(this).init_notes(action);break;case"agenda-elems":$(this).init_evenements();break;case"ajout-agenda-types":$('[name="couleur"]',form).colpick();break;case"deplcolle":$("#ancien,#nouveau").each(function(){$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})});break;case"ajout-utilisateurs":form.init_ajout_utilisateurs();break;case"ajout-groupe":$(".usergrp span",form).on("click",utilisateursgroupe);break}$("select[multiple]",form).each(selmult);$("#epingle .icon-ferme").on("click",function(){$("#epingle").remove()});$("#epingle a.icon-aide").on("click",function(){popup($("#aide-"+idform).html(),false)});$("#epingle a.icon-ok").on("click",function(){$(".edithtml",form).each(function(){this.value=nettoie($(this).is(":visible")?this.value:$(this).next().html())});if(action=="notes"||action=="ajout-notes")$("#epingle select:not(:visible)").val("x");$.ajax({url:"ajax.php",method:"post",data:form.serialize()+"&action="+action,dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input,select",form).on("keypress",function(e){if(e.which==13){e.preventDefault();$("#epingle a.icon-ok").click()}})}$.fn.init_reps=function(){var el=$(this);var form=$("#epingle form");var sel=$("select[multiple]",form);var id=el.parent().data("id").split("|")[1];var donnees=el.parent().data("donnees").split("|");var protection=donnees[2];var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}if(donnees[0]==0)$("#nom,#parent,#menu",form).parent().remove();else{$("#nom",form).val(nom);if(donnees[1]=="1")$("#menu",form).prop("checked",true);$('[data-parents*=",'+id+',"]',form).prop("disabled",true)}form.append('<input type="hidden" name="id" value="'+id+'">');$('input[type="button"]',form).on("click",function(){var action=this.value.substring(0,4)=="Prop"?"propage":"vide";var contexte=$(this).parent().find("em").text();var texte=action=="propage"?"Vous allez propager le réglage d'accès du répertoire <em>"+contexte+"</em> à l'ensemble de ses sous-répertoires et des documents qu'ils contiennent.<br>Vous pourrez modifier à nouveau le réglage de chaque document ou répertoire, de façon individuelle.":"Vous allez vider le répertoire <em>"+contexte+"</em>. Cela supprimera définitivement l'ensemble de ses sous-répertoires et des documents qu'ils contiennent.<br>Cette opération n'est pas annulable.";confirmation(texte,this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action=reps&id="+id+"&"+action+"=1",dataType:"json",el:"",fonction:function(el){location.reload(true)}})})})};$.fn.init_docs=function(action){var el=$(this);var form=$("#epingle form");var nom=el.siblings(".nom").text().split(/\/\s/).pop()||el.parent().find("input").val();$("em",form).text(nom);var id=el.parent().data("id").split("|")[1];if(action=="docs"){var protection=el.parent().data("protection");form.append('<input type="hidden" name="id" value="'+id+'">');$("#nom",form).val(nom)}else{var protection=el.parent().data("donnees").split("|")[2];$("#fichier",form).on("change",function(){if(!$("#nom",form).val().length){var f=this.value;$("#nom",form).val(f.substring(f.lastIndexOf("\\")+1,f.lastIndexOf("."))||f)}});form.append('<input type="hidden" name="parent" value="'+id+'">')}var sel=$("select[multiple]",form);if(protection==0||protection==32)sel.val(protection);else{sel.val(6);for(var a=1;a<6;a++)if((protection-1>>a-1&1)==0)$('option[value="'+a+'"]',sel).prop("selected",true)}form.append('<input type="hidden" name="action" value="'+action+'">');$("#epingle a.icon-ok").addClass("icon-envoidoc").removeClass("icon-ok").on("click",function(){$.ajax({url:"docs.php",method:"post",data:"connexion=1",dataType:"json",el:"",fonction:function(el){if($("#fichier")[0].files.length>0){window.clearTimeout(extinction);$("#log").html("Envoi du document. Cela peut prendre du temps...")}var data=new FormData(form[0]);$.ajax({url:"ajax.php",method:"post",data:data,dataType:"json",contentType:false,processData:false,el:"",fonction:function(el){location.reload(true)}})}})})};$.fn.init_cdt_boutons=function(){var form=this;$("#jour,#pour").datetimepicker({format:"d/m/Y",timepicker:false});$("#h_debut").datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$("#h_fin").val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$("#h_fin").datetimepicker({format:"Ghi",datepicker:false});var zero=function(n){return String(n).length==1?"0"+n:String(n)};$("#raccourci").on("change keyup",function(){var valeurs=raccourcis[this.value];for(var cle in valeurs){if(cle=="jour"){var t=new Date;var j=parseInt(valeurs["jour"]);t.setDate(j>t.getDay()?t.getDate()-t.getDay()-7+j:t.getDate()-t.getDay()+j);$("#jour").val(zero(t.getDate())+"/"+zero(t.getMonth()+1)+"/"+t.getFullYear())}else $("#"+cle).val(valeurs[cle])}$(this).data("modif",1);$("#tid").change()}).data("modif",0);$("#tid").on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$("#h_debut,#demigroupe").parent().show();$("#h_fin,#pour").parent().hide();break;case 1:$("#h_debut,#h_fin,#demigroupe").parent().show();$("#pour").parent().hide();break;case 2:$("#h_debut,#h_fin").parent().hide();$("#pour,#demigroupe").parent().show();break;case 3:$("#h_debut,#h_fin,#pour").parent().hide();$("#demigroupe").parent().show();break;default:$("#h_debut,#h_fin,#pour,#demigroupe").parent().hide()}$("#jour").change()});$("input,#demigroupe",form).on("change keyup",function(){if($("#raccourci").data("modif")==0)$("#raccourci").val(0);else $("#raccourci").data("modif",0)});$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",el).click()});$("select:first",form).focus();$("#tid").change()};$.fn.init_cdt_raccourcis=function(){this.each(function(){var form=$(this);$('[id^="h_d"]',form).datetimepicker({format:"Ghi",datepicker:false,onClose:function(t,input){$('[id^="h_f"]',form).val(function(i,v){return v||(input.val().length?parseInt(input.val().slice(0,-3))+2+input.val().slice(-3):"")})}});$('[id^="h_fin"]').datetimepicker({format:"Ghi",datepicker:false});$('[id^="type"]',form).on("change keyup",function(){switch(parseInt(seances[this.value])){case 0:$('[id^="h_d"],[id^="dem"]',form).parent().show();$('[id^="h_f"]',form).parent().hide();break;case 1:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().show();break;case 2:case 3:$('[id^="h_d"],[id^="h_f"]',form).parent().hide();$('[id^="dem"]',form).parent().show();break;default:$('[id^="h_d"],[id^="h_f"],[id^="dem"]',form).parent().hide()}}).change();$("input,select",form).on("keypress",function(e){if(e.which==13)$("a.icon-ok",form).click()})})};$.fn.init_notes=function(action){var el=$(this);var form=$("#epingle form").append($("#form-notes").html());var table=$("table",form);$("input, select",form).attr("id",function(){return this.getAttribute("name")});$("tr[data-id]",table).append("<td>"+$("div",form).html()+"</td>");$("select",table).attr("name",function(){return"e"+$(this).parent().parent().data("id")});$("div",form).remove();if($("input:checkbox",table).length){$("tr[data-id]",form).hide();$("input:checkbox",table).on("change",function(){if($("input:checkbox:last",table).prop("checked"))return $("tr[data-id]",form).show();var ids=$("input:checked",table).map(function(){return this.value.split(",")}).get().concat();$("tr[data-id]:not(.orig)",table).hide();for(var i=0;i<ids.length;i++)$('tr[data-id="'+ids[i]+'"]',form).show()})}function marque_dejanotes(sid){if(sid==0)return true;var dn=dejanotesautres[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (noté par un autre colleur)"});var dn=dejanotesperso[sid].split(",");for(var i=0;i<dn.length;i++)$('tr[data-id="'+dn[i]+'"]:not(.orig)',form).addClass("dejanote").find("td:eq(0)").text(function(){return this.textContent+" (déjà noté par vous-même)"});$(".dejanote select").prop("disabled",true).val("x")}$("#jour").datetimepicker({format:"d/m/Y",timepicker:false,onShow:function(){if($("#td").is(":checked"))this.setOptions({minDate:$("#form-ajoute option:eq(1)").data("date"),maxDate:new Date(new Date($("#form-ajoute option:last").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()+6*864e5)});else this.setOptions({minDate:debut||$("#sid option:selected").data("date"),maxDate:new Date(new Date((fin||$("#sid option:selected").next().data("date")).replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x})).getTime()-864e5)})}});$("#heure").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"15h30"});$("#duree").datetimepicker({format:"Ghi",datepicker:false,defaultTime:"0h00",step:10}).on("change",function(){$(this).removeClass("auto")});$("select",table).on("change keyup",function(){var nb=$("table select:visible",form).filter(function(){return this.value!="x"}).length;var duree=nb*(dureecolle||20);if($("#duree").is(".auto")||duree>$("#duree").val().replace(/^(\d*)h(\d*)$/,function(tout,x,y){return 60*(x|0)+(y|0)}))$("#duree").val((duree/60|0)+"h"+(duree%60||"")).addClass("auto")});if(action=="ajout-notes"){$("#sid").on("change keyup",function(){$(".dejanote td:first-child").text(function(){return this.textContent.replace(" (noté par un autre colleur)","").replace(" (déjà noté par vous-même)","")});$(".dejanote").removeClass("dejanote").find("select").prop("disabled",false);marque_dejanotes($("#sid").val());var jour=new Date($("#jour").val().replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var debut=new Date($("#sid option:selected").data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));var fin=new Date($("#sid option:selected").next().data("date").replace(/(.{2})\/(.{2})\/(.{4})/,function(tout,x,y,z){return z+"-"+y+"-"+x}));if(jour<debut||jour>fin){debut=debut.toJSON();$("#jour").val(debut.substr(8,2)+"/"+debut.substr(5,2)+"/"+debut.substr(0,4))}}).change();$("#td").on("change keyup",function(){if(this.checked){$("#sid").parent().hide();$("#description").parent().show();table.hide()}else{$("#sid").parent().show();$("#description").parent().hide();table.show()}});$("#description").parent().hide()}else{var tr=el.parent().parent();if(el.data("sid")){$("#description, #td").parent().remove();var sid=el.data("sid");var debut=$('#form-ajoute option[value="'+sid+'"]').data("date");var fin=$('#form-ajoute option[value="'+sid+'"]').next().data("date");var eleves=el.data("eleves").split("|");var notes=el.data("notes").split("|");for(var i=0;i<eleves.length;i++)$('tr[data-id="'+eleves[i]+'"]',form).addClass("orig").show().find("select").val(notes[i]).on("change",function(){$(this).parent().parent().removeClass("orig")});$("h3",form).text("Modifier des notes - semaine du "+$('select[name="sid"] option[value="'+sid+'"]').text().split(" ").slice(0,3).join(" "));if(el.next().length)marque_dejanotes(sid);else{$('tr:not(.orig), .orig option[value="x"]',table).remove();$("#duree").prop("disabled",true);form.append("<p>Cette colle a déjà été relevée&nbsp;: il est impossible de modifier quels élèves ont été interrogés ou la durée de la colle. Vous pouvez corriger la date et l'heure (dans la limite de la semaine enregistrée) ou les notes que vous avez mises vous pouvez mettre une note à un élève initialement absent qui a rattrapé sa colle.</p>")}}else{table.remove();$("#td").prop("checked",true).prop("disabled",true);$("#description").val(el.parent().prev().prev().prev().text());$("h3",form).text("Modifier la séance de TD sans note");if(el.next().length==0){$("#duree").prop("disabled",true);form.append("<p>Cette séance a déjà été relevée&nbsp;: il est impossible de modifier sa durée. Vous pouvez corriger la date, l'heure ou la description.</p>")}}$("#id").val(el.parent().data("id").split("|")[1]);$("#jour").val($("td:eq(0)",tr).text().replace(/(.{6})(.{2})/,function(tout,x,y){return x+"20"+y}));$("#heure").val($("td:eq(1)",tr).text().replace("-",""));$("#duree").val($("td:eq(3)",tr).text())}};$.fn.init_ajout_utilisateurs=function(){$("#autorisation,#saisie").on("change",function(){var f=$("#epingle form");var a=$("#autorisation",f).val();if(a==0){$(".affichesiinvite,.affichesiinvitation,.affichesimotdepasse,.mailenvoi,.mailliste",f).hide(0);$("textarea",f).prop("disabled",true).attr("placeholder","Zone de saisie des utilisateurs\nSélectionnez d'abord un type d'utilisateur")}else{var inv=a==1;var mdp=$("#saisie",f).val()==2;$("#saisie",f).parent().toggle(!inv);$(".affichesiinvite",f).toggle(inv);$(".affichesiinvitation",f).toggle(!inv&&!mdp);$(".affichesimotdepasse",f).toggle(!inv&&mdp);$(".mailenvoi",f).toggle(!inv);$(".mailliste",f).toggle(a>2);$("#mailenvoi",f).prop("disabled",mdp).change();$("textarea",f).prop("disabled",false).attr("placeholder",function(){if(inv)return"identifiant_1,motdepasse_1\nidentifiant_2,motdepasse_2\nidentifiant_3,motdepasse_3\n...";else if(mdp)return"nom_1,prénom_1,motdepasse_1\nnom_2,prénom_2,motdepasse_2\nnom_3,prénom_3,motdepasse_3\n...";else return"nom_1,prénom_1,adresse_1\nnom_2,prénom_2,adresse_2\nnom_3,prénom_3,adresse_3\n..."})}}).change();$("#epingle #mailenvoi").on("change",function(){$("#epingle #mailliste").attr("disabled",!this.checked||this.disabled)}).change()};$.fn.init_evenements=function(){var el=$(this);var form=$("#epingle form");$("textarea",form).attr("id","texte");if(el.is(".modifevnmt")){var id=el.attr("id").substr(1);var valeurs=evenements[id];var cles=["type","matiere","debut","fin","texte"];for(var i=0;i<6;i++){$("#"+cles[i]).val(valeurs[cles[i]])}$("#id").val(id);$("#texte").change();$("#jours").prop("checked",valeurs["je"]);$('<a class="icon-supprime" title="Supprimer cette information"></a>').insertBefore($(".icon-ok")).on("click",function(){supprime($(this))}).parent().data("id","agenda-elems|"+id)}$("#debut").datetimepicker({onShow:function(){this.setOptions({maxDate:$("#fin").val()||false})},onClose:function(t,input){$("#fin").val(function(i,v){return v||input.val()})}});$("#fin").datetimepicker({onShow:function(){this.setOptions({minDate:$("#debut").val()||false})},onClose:function(t,input){$("#debut").val(function(i,v){return v||input.val()})}});$("#jours").on("change",function(){var v;if(this.checked){$("#debut,#fin").each(function(){v=this.value.split(" ");$(this).val(v[0]).attr("data-heure",v[1]).datetimepicker({format:"d/m/Y",timepicker:false})})}else{$("#debut,#fin").each(function(){if(this.hasAttribute("data-heure"))$(this).val(this.value+" "+$(this).attr("data-heure")).removeAttr("data-heure");$(this).datetimepicker({format:"d/m/Y Ghi",timepicker:true})})}}).change()};function selmult(){var sel=$(this);var isacces=this.getAttribute("name").indexOf("protection")+1?1:0;function majselect(sel){sel.prev().children().prop("selected",false).text(function(){var options=$(isacces?"option:selected:not([value=6])":"option:selected",sel);if(isacces&&options.length==5)return"Tout utilisateur identifié";if(options.length==0)return"Choisir ...";else return options.map(function(){return this.textContent}).get().join(", ")}).prop("selected",true)}$("<select id="+sel.prev().attr("for")+"><option selected hidden></option></select>").insertBefore(sel.hide(0)).attr("disabled",sel.attr("disabled")).on("mousedown",function(e){e.preventDefault();this.blur();popup('<a class="icon-ok" title="Valider ce choix"></a><h3>'+sel.prev().prev().text().replace(":","")+'</h3><table id="selmult">'+$("option",sel).map(function(){return"<tr"+(this.selected?' class="sel"':"")+"><td>"+this.textContent+'</td><td><input type="checkbox" '+(this.selected?"checked ":"")+'value="'+this.value+'"></td></tr>'}).get().join("")+"</table>",true);var f=$("#fenetre");if(isacces){$("input[value=0],input[value=6],input[value=32]",f).parent().parent().addClass("categorie");$("tr:not(.categorie)",f).addClass("element");$("input",f).on("click",function(){if(this.value==0||this.value==32)$(this).parent().parent().siblings().find("input[type=checkbox]").prop("checked",false).change();else{$("input[value=0],input[value=32]",f).prop("checked",false).change();$("input[value=6]",f).prop("checked",true).change();if(this.value==6)$("tr:not(.categorie) input",f).prop("checked",true).change()}})}else{$("#selmult",f).prepend('<tr class="categorie"><th></th><th><a class="icon-cocher"></a></th></tr>');$(".icon-cocher",f).on("click",cocher_utilisateurs)}$("tr",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$(".icon-ok",f).on("click",function(){sel.val($("input:checked",f).map(function(){return this.value}).get());majselect(sel);$("#fenetre, #fenetre_fond").remove()})});majselect(sel)}function cocher_utilisateurs(){$(this).toggleClass("icon-cocher icon-decocher").parent().parent().nextUntil(".categorie").find("input").prop("checked",$(this).hasClass("icon-decocher")).change()}function init_utilisateurs(){$(".icones.mailenvoi").each(function(){this.innerHTML=this.textContent==1?'<a class="icon-ok" title="Supprimer la possibilité d\'envoyer des courriels"></a>':'<a class="icon-nok" title="Accorder la possibilité d\'envoyer des courriels"></a>'});$(".mailenvoi a").on("click",mail_utilisateur);$("th .icon-mail").on("click",mail_utilisateurs);$(".icon-cocher").on("click",cocher_utilisateurs);$("td .icon-edite").on("click",edite_utilisateur);$("td .icon-desactive, td .icon-active, td .icon-supprutilisateur, td .icon-validutilisateur").on("click",modif_utilisateur);$("th .icon-desactive, th .icon-active, th .icon-supprutilisateur, th .icon-validutilisateur").on("click",modif_utilisateurs);$("td:not(.icones)").on("click",function(e){$(this).parent().find("input").click()});$("#utilisateurs input").on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});function mail_utilisateur(){var val=$(this).hasClass("icon-ok");$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:"mailenvoi",id:$(this).parent().parent().data("id"),val:1-val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Accorder":"Supprimer")+" la possibilité d'envoyer des courriels")}})}function edite_utilisateur(){var id=$(this).parent().parent().data("id");$.ajax({url:"recup.php",method:"post",data:{action:"prefs",id:id},dataType:"json",afficheform:function(data){if("nom"in data){popup($("#form-edite").html(),true);var f=$("#fenetre");$("input[name]",f).attr("id",function(){return this.getAttribute("name")});if(data["valide"])$("#comptedesactive, #demande, #invitation",f).remove();else if(data["demande"])$("#compteactif, #comptedesactive, #invitation",f).remove();else if(data["invitation"])$("#compteactif, #comptedesactive, #demande",f).remove();else $("#compteactif, #demande, #invitation",f).remove();if(data["autorisation"]==2)$("#mailliste",f).parent().remove();else if(data["autorisation"]==1)$("#mailenvoi, #mailexp, #mailcopie, #mailliste",f).parent().remove();$("p:first",f).html(function(i,code){return code.replace("XXX",data["prenom"].length?"de <em>"+data["prenom"]+" "+data["nom"]+"</em>":"<em>"+data["login"]+"</em>").replace("YYY","<em>"+["Invité","Élève","Colleur","Administratif","Professeur"][data["autorisation"]-1]+"</em>")});$('input[type="text"],input[type="email"]',f).val(function(){return data[this.id]});$('input[type="checkbox"]',f).prop("checked",function(){return data[this.id]});$("#mailenvoi",f).on("click",function(){$("#mailexp, #mailcopie, #mailliste",f).prop("disabled",!this.checked);if(this.checked&&!$("#mailexp",f).val())$("#mailexp",f).val(data["prenom"]+" "+data["nom"])});$("#mailexp, #mailcopie, #mailliste",f).prop("disabled",!$("#mailenvoi",f).prop("checked"));$("a.icon-ok",f).on("click",function(){$.ajax({url:"ajax.php",method:"post",data:"action=utilisateur&modif=prefs&id="+id+"&"+$("form",f).serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$("input",f).on("keypress",function(e){if(e.which==13){e.preventDefault();$("a.icon-ok",f).click()}})}}})}function modif_utilisateur(){var question="";var compte=$(this).parent().siblings().first().text();compte=compte.length?"de <em>"+compte+"</em>":"d'identifiant <em>"+$(this).parent().siblings().first().next().text()+"</em>";var categorie=$(this).parent().parent().prevUntil(".categorie").last().prev().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver le compte invité "+compte+". Cela signifie que le compte ne sera pas supprimé mais sera non utilisable pour une connexion. Les associations éventuelles avec les matières seront conservées. Ce compte sera listé dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année et dont il faut conserver les notes de colles.";
 break;case"active":if(categorie=="Invités")question="Vous allez réactiver le compte invité "+compte+". La connexion sera à nouveau possible. Ce compte apparaîtra à nouveau dans la partie principale du tableau.";else question="Vous allez réactiver le compte "+compte+". Cela signifie que l'utilisateur correspondant pourra à nouveau se connecter. Il retrouvera son compte, ses notes de colles éventuelles, ses préférences, ses accès spécifiques éventuels, sans modification. Ce compte apparaîtra à nouveau dans la partie principale du tableau.";break;case"supprutilisateur":if(categorie=="Demandes")question="Vous allez supprimer la demande "+compte+". Cela signifie que cette demande ne conduira pas à une création de compte. Le demandeur ne sera pas prévenu de votre décision.<br> Une fois réalisée, cette opération est définitive, mais rien n'empêche le demandeur d'effectuer une nouvelle demande.<br> <strong>Si vous n'attendez plus de nouvelle demande de création de compte, il est certainement préférable de supprimer cette possibilité à l'aide du réglage accessible en cliquant sur l'icône <span class=\"icon-prefs\"></span> en haut à droite sur cette page</strong>";else if(categorie=="Invitations"){var textecolles=$(this).parent().prev().prev().text()=="Élève"?'<p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ce compte seront supprimées. Cette suppression est définitive.</strong></p><p>':"<br>";question="Vous allez supprimer l'invitation "+compte+". Cela signifie que cette invitation ne sera plus valable et que si la personne invitée clique sur le lien reçu par courriel, une erreur apparaîtra devant elle."+textecolles+"<strong>L'invitation envoyée n'a pas de date de péremption&nbsp;: il est n'est pas normal de supprimer l'invitation pour la refaire, à moins de s'être trompé d'adresse électronique. Si la personne invitée vous dit ne pas réussir à s'identifier, proposez-lui de passer par le lien <em>Mot de passe oublié</em>.</strong><br> La personne invitée ne sera pas prévenue de votre décision."}else if(categorie=="Professeurs")question="Vous allez supprimer le compte professeur "+compte+'. <strong>Cela signifie que toutes les préférences de ce compte seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.<br> Les données des matières auxquelles il est associé sont indépendantes&nbsp;: elles ne seront pas supprimées.';else if(categorie=="Administratifs")question="Vous allez supprimer le compte administratif "+compte+". Cela signifie que toutes les préférences de ce compte seront perdues.";else if(categorie=="Colleurs")question="Vous allez supprimer le compte colleur "+compte+'. <strong>Cela signifie que toutes les préférences de ce compte seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Élèves")question="Vous allez supprimer le compte élève "+compte+'. <strong>Cela signifie que toutes les données correspondant à ce compte seront perdues. Les groupes où il apparaît seront modifiés, les notes de colles éventuelles seront supprimées.</strong> <p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ce compte seront supprimées. Cette suppression est définitive.<br> Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur du compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données de l\'utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Invités")question="Vous allez supprimer le compte invité "+compte+". Cela signifie que la connexion par ce compte ne sera plus possible.";else question="Vous allez supprimer le compte "+compte+" déjà désactivé. <strong>Cela signifie que toutes les données correspondant à ce compte seront perdues définitivement. Les groupes où il apparaît seront modifiés, les notes de colles éventuelles seront supprimées.</strong>";if(categorie!="Demandes")question=question+"<br>Une fois réalisée, cette opération est définitive.";break;case"validutilisateur":question="Vous allez valider la demande "+compte+". Son compte sera immédiatement actif et un courriel va immédiatement être envoyé pour le/la prévenir.<br> Il sera automatiquement associé à toutes les matières&nbsp;: <strong>pensez à aller supprimer les matières qui ne le concernent pas sur la page de gestion des associations utilisateurs-matières.</strong>"}confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur",modif:el.className.substring(5),id:$(el).parent().parent().data("id")},dataType:"json",el:"",fonction:function(){location.reload(true)}})})}function mail_utilisateurs(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var ids=cases.map(function(){return $(this).parent().parent().data("id")}).get().join(",");var tds=cases.parent().prev().prev();var val=tds.find(".icon-ok").length>=tds.find(".icon-nok").length?0:1;$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs",modif:"mailenvoi",ids:ids,val:val},dataType:"json",el:"",fonction:function(){location.reload(true)}})}function modif_utilisateurs(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var ids=cases.map(function(){return $(this).parent().parent().data("id")}).get().join(",");var comptes=cases.map(function(){var compte=$(this).parent().siblings().first().text();return compte.length?"<em>"+compte+"</em>":"<em>"+$(this).parent().siblings().first().next().text()+"</em>"}).get().join(", ");var pos=comptes.lastIndexOf(",");if(pos>0)comptes=comptes.substring(0,pos)+" et"+comptes.substring(pos+1);var question="";var categorie=$(this).parent().parent().prev().children().text().split(" ")[0];switch(this.className.substring(5)){case"desactive":if(categorie=="Invités")question="Vous allez désactiver les comptes invités "+comptes+". Cela signifie que ces compte ne seront pas supprimés mais seront non utilisables pour une connexion. Les associations éventuelles avec les matières seront conservées. Ces comptes seront listés dans la partie inférieure du tableau.";else question="Vous allez désactiver le compte "+compte+". Cela signifie que le compte sera toujours visible pour les professeurs mais que l'utilisateur correspondant ne pourra plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées au compte seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant le compte.<br> Ce compte sera listé dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour un élève ou un colleur parti en cours d'année dont il faut conserver les notes de colles.";question="Vous allez désactiver les comptes de "+comptes+". Cela signifie que ces comptes seront toujours visibles pour les professeurs mais que les utilisateurs correspondant ne pourront plus se connecter. <strong>Les notes de colles éventuelles seront conservées. Les données associées aux comptes seront conservées.</strong><br> Les accès spécifiques éventuels pourront être rétablis en réactivant les comptes.<br> Ces comptes seront listés dans la partie inférieure du tableau.<br> Cette possibilité est particulièrement utile pour des élèves ou des colleurs partis en cours d'année et dont il faut conserver les notes de colles.";break;case"active":if(categorie=="Invités")question="Vous allez réactiver les comptes invité "+comptes+". La connexion sera à nouveau possible. Ces comptes apparaîtront à nouveau dans la partie principale du tableau.";else question="Vous allez réactiver les comptes de "+comptes+". Cela signifie que les utilisateurs correspondant pourront à nouveau se connecter. Ils retrouveront leur compte, leurs notes de colles éventuelles, leurs préférences, leurs accès spécifiques éventuels, sans modification. Ces comptes apparaîtront à nouveau dans la partie principale du tableau.";break;case"supprutilisateur":if(categorie=="Demandes")question="Vous allez supprimer les demandes de "+comptes+". Cela signifie que ces demandes ne conduiront pas à des créations de compte. Les demandeurs ne seront pas prévenus de votre décision.<br> Une fois réalisée, cette opération est définitive, mais rien n'empêche les demandeurs d'effectuer une nouvelle demande.<br> <strong>Si vous n'attendez plus de nouvelle demande de création de compte, il est certainement préférable de supprimer cette possibilité à l'aide du réglage accessible en cliquant sur l'icône <span class=\"icon-prefs\"></span> en haut à droite sur cette page</strong>";else if(categorie=="Invitations"){question="Vous allez supprimer les invitations de "+comptes+". Cela signifie que ces invitations ne seront plus valables et que si les personnes invitées cliquent sur le lien reçu par courriel, une erreur apparaîtra devant elles. <p class=\"note\"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur les comptes de types élèves seront supprimées. Ces suppressions sont définitives.</strong></p> <p><strong>Ces invitations envoyées n'ont pas de date de péremption&nbsp;: il n'est pas normal de supprimer une invitation pour la refaire, à moins de s'être trompé d'adresse électronique. Si une personne invitée vous dit ne pas réussir à s'identifier, proposez-lui de passer par le lien <em>Mot de passe oublié</em>.</strong><br> Les personnes invitées ne seront pas prévenues de votre décision."}else if(categorie=="Professeurs")question="Vous allez supprimer les comptes professeurs de "+comptes+'. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.<br> Les données des matières auxquelles ces utilisateurs sont associés sont indépendantes&nbsp;: elles ne seront pas supprimées.';else if(categorie=="Administratifs")question="Vous allez supprimer les comptes administratifs de "+comptes+". Cela signifie que toutes les préférences de ces comptes seront perdues.";else if(categorie=="Colleurs")question="Vous allez supprimer les comptes colleurs de "+comptes+'. <strong>Cela signifie que toutes les préférences de ces comptes seront perdues, ainsi que les éventuelles notes de colles.</strong> <p class="note"><strong>Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Élèves")question="Vous allez supprimer les comptes élèves de "+comptes+'. <strong>Cela signifie que toutes les données correspondant à ces comptes seront perdues. Les groupes où ils apparaissent seront modifiés, les notes de colles éventuelles seront supprimées.</strong> <p class="note"><strong>ATTENTION : toutes les notes de colles qui ont déjà pu être déclarées sur ces compte seront supprimées. Cette suppression est définitive.<br> Supprimer un compte pour le recréer n\'est pas la bonne méthode pour réinitialiser un compte,</strong></p><p> par exemple si l\'utilisateur d\'un compte vous indique ne pas arriver à se connecter. Dans ce cas, proposez-lui de passer par le lien <em>Mot de passe oublié</em>. Vous pouvez modifier sur la <a href="utilisateurs">gestion des utilisateurs</a> les nom, prénom, identifiant de connexion et adresse électronique de chaque utilisateur.<br> Pour conserver les données d\'un utilisateur mais lui empêcher la connexion, vous pouvez désactiver le compte en cliquant sur <span class="icon-desactive"></span>.';else if(categorie=="Invités")question="Vous allez supprimer les comptes invités de "+comptes+". Cela signifie que la connexion par ces comptes ne sera plus possible.";else question="Vous allez supprimer les comptes de "+comptes+" déjà désactivés. <strong>Cela signifie que toutes les données correspondant à ces comptes seront perdues définitivement. Les groupes où ils apparaîssent seront modifiés, les notes de colles éventuelles seront supprimées. Dans le cas des comptes professeurs, les données des matières associées ne seront pas supprimées.</strong>";if(categorie!="Demandes")question=question+"<br>Une fois réalisée, cette opération est définitive.";break;case"validutilisateur":question="Vous allez valider les demandes de "+comptes+". Leurs comptes seront immédiatement actifs et un courriel va immédiatement leur être envoyé pour les prévenir.<br> Ils seront automatiquement associés à toutes les matières&nbsp;: <strong>pensez à aller supprimer les matières qui ne les concernent pas sur la page de gestion des associations utilisateurs-matières.</strong>"}confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs",modif:el.className.substring(5),ids:ids},dataType:"json",el:"",fonction:function(){location.reload(true)}})})}}function init_utilisateurs_matieres(){$("tbody tr:not(.categorie) td:not(:first-child,:last-child)").each(function(){var valeurs=this.textContent.split("|");this.innerHTML=valeurs[1]==1?'<a class="icon-ok" data-id="'+valeurs[0]+'" title="Supprimer l\'association à la matière"></a>':'<a class="icon-nok" data-id="'+valeurs[0]+'" title="Établir l\'association à la matière"></a>'});$("tbody tr:not(.categorie) a").on("click",association_um);$(".categorie [data-id]").on("click",association_ums).hide(0);$(".icon-cocher").on("click",cocher_utilisateurs).on("click",majicones);$('input[type="checkbox"]').on("click",majicones).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});$("td:first-child").on("click",function(){$(this).parent().find("input").click()});function majicones(){var tr=$(this).parent().parent();if(!tr.hasClass("categorie"))tr=tr.prevAll(".categorie").first();var cases=tr.nextUntil(".categorie").find(":checked");if(cases.length==0){$("[data-id]",tr).hide(0);return}$("[data-id]",tr).each(function(){var avant=$(this).hasClass("icon-ok");var apres=cases.parent().prevAll().find('.icon-ok[data-id="'+this.getAttribute("data-id")+'"]').length<cases.length/2;if(avant!=apres)$(this).toggleClass("icon-ok icon-nok").attr("title",(apres?"Établir":"Supprimer")+" l'association à la matière de tous les cochés")}).show(0)}function association_um(){var val=$(this).hasClass("icon-ok");$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateur-matiere",id:$(this).parent().parent().data("id"),matiere:$(this).data("id"),val:1-val},dataType:"json",el:$(this),fonction:function(el){el.toggleClass("icon-ok icon-nok").attr("title",(val?"Établir":"Supprimer")+" l'association à la matière")}})}function association_ums(){var cases=$(this).parent().parent().nextUntil(".categorie").find(":checked");if(cases.length==0){affiche("<p>Aucune case n'est cochée, aucune action ne peut être réalisée.</p>","nok");return}var ids=cases.map(function(){return $(this).parent().parent().data("id")}).get().join(",");var comptes=cases.map(function(){return $(this).parent().siblings().first().text().split("(")[0].trim()}).get().join(", ");var pos=comptes.lastIndexOf(",");if(pos>0)comptes=comptes.substring(0,pos)+" et"+comptes.substring(pos+1);var val=$(this).hasClass("icon-ok");var mid=this.getAttribute("data-id");var question=val?"Vous allez établir l'association à la matière "+$("#m"+mid).text()+" pour les comptes de "+comptes+". Cela signifie que ces utilisateurs auront accès aux ressources liées à cette matière, en fonction de l'autorisation que vous avez fixée pour ces ressources.":"Vous allez supprimer l'association à la matière "+$("#m"+mid).text()+" pour les comptes de "+comptes+". Cela signifie que ces utilisateurs n'auront plus accès aux ressources liées à cette matière. Si des notes de colles ont été saisies, elles seront automatiquement et définitivement supprimées de la base.";confirmation(question,this,function(el){$.ajax({url:"ajax.php",method:"post",data:{action:"utilisateurs-matieres",ids:ids,matiere:mid,val:val|0},dataType:"json",el:"",fonction:function(el){location.reload(true)}})})}}function init_utilisateurs_groupes(){$('article input[type="checkbox"]').on("change",function(){$.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:this.id.substr(0,5),id:this.id.substr(5),val:this.checked|0},dataType:"json",el:"",fonction:function(el){return true}})});$(".usergrp span").append('&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>').on("click",utilisateursgroupe)}function utilisateursgroupe(){popup($("#form-utilisateurs").html(),true);var f=$("#fenetre");var span=$(this);article=span.parent().parent();$("table",f).attr("id","utilisateurs");$("h3",f).append($(".editable",article).text()||$("input:first",article).val());$(".icon-deplie",f).on("click",plie);$(".icon-cocher",f).on("click",cocher_utilisateurs);$("tr:not(.categorie)",f).on("click",function(e){if(!$(e.target).is("input"))$(this).find("input").click()});$("input",f).on("change",function(){$(this).parent().parent().removeClass("sel");if(this.checked)$(this).parent().parent().addClass("sel")});var ids=span.data("uids");$("#u"+ids.replace(/,/g,",#u"),f).prop("checked",true).change();$(".icon-ok",f).on("click",function(){var ids=$("input:checked",f).map(function(){return this.id.replace("u","")}).get().join(",");var noms=$("input:checked",f).parent().prev().map(function(){return this.textContent.split("(")[0].trim()}).get().join(", ")||"[Personne]";if(article.is("div")){$("#uids",article).val(ids);span.data("uids",ids);span.html(noms+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>');$("#fenetre, #fenetre_fond").remove()}else $.ajax({url:"ajax.php",method:"post",data:{action:"groupes",champ:"utilisateurs",id:article.data("id").split("|")[1],uids:ids},dataType:"json",el:span,fonction:function(el){el.data("uids",ids);el.html(noms+'&nbsp;<a class="icon-edite" title="Éditer les utilisateurs de ce groupe"></a>');$("#fenetre, #fenetre_fond").remove()}})})}function suppressionmultiple(){var prop=$(this).data("id").split("|");var contexte=$(this).parent().find("h3").text();var item="";switch(prop[2]){case"infos":item="toutes les informations de la page <em>"+contexte+"</em>";break;case"colles":item="tous les programmes de colles de la matière <em>"+contexte+"</em>";break;case"cdt":item="tout le contenu du cahier de texte de la matière <em>"+contexte+"</em>";break;case"docs":item="tous les répertoires et documents de la matière <em>"+contexte+"</em>";break;case"notes":item="toutes les notes de la matière <em>"+contexte+"</em>";break}confirmation("Vous allez supprimer XXX.<br>Cette opération n'est pas annulable.".replace("XXX",item),this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action="+prop[0]+"&id="+prop[1]+"&supprime_"+prop[2]+"=1",dataType:"json",el:$(el),fonction:function(el){el.remove()}})})}function destinatairesmail(){popup($("#form-destinataires").html(),true);var f=$("#fenetre");$("table",f).attr("id","utilisateurs");$(".icon-deplie",f).on("click",plie);$("tr:not(.gr) input.dest",f).attr("id",function(){return"u"+this.value});$("tr:not(.categorie) td:nth-child(-n+2)",f).on("click",function(e){if(!$(e.target).is("input"))$(this).parent().find("input:first").click()});$("input",f).on("change",function(){var tr=$(this).parent().parent().removeClass("sel");if(this.checked)tr.find("input:not(."+this.className+")").prop("checked",false);if(tr.find("input:checked").length)tr.addClass("sel")});var ids=$('[name="id-copie"]').val();$("#u"+ids.replace(/,/g,",#u")).prop("checked",true).change();ids=$('[name="id-bcc"]').val();$("#u"+ids.replace(/,/g,",#u")).parent().next().children().prop("checked",true).change();$(".categorie a",f).on("click keyup",function(){var classe=this.className.split(" ")[1];var etat=this.className.split(" ")[0]=="icon-cocher";var titre=this.title;$(this).parent().parent().nextUntil(".categorie").find("."+classe+":not(:disabled)").prop("checked",etat).change();this.className=(etat?"icon-decocher ":"icon-cocher ")+classe;this.title=this.title.replace(etat?"Cocher":"Décocher",etat?"Décocher":"Cocher");var classe2=classe=="dest"?"bcc":"dest";$(this).parent().parent().find(".icon-decocher."+classe2).each(function(){this.className="icon-cocher "+classe2;this.title="C"+this.title.substr(3)})});$(".gr input",f).on("click",function(){var ids=this.value;if(this.className=="dest")$("#u"+ids.replace(/,/g,",#u")).prop("checked",this.checked).change();else $("#u"+ids.replace(/,/g,",#u")).parent().next().children().prop("checked",this.checked).change()});$(".icon-ok",f).on("click",function(){$('[name="id-copie"]').val($("tr:not(.gr) .dest:checked",f).map(function(){return this.value}).get().join(","));$('[name="id-bcc"]').val($("tr:not(.gr) .bcc:checked",f).map(function(){return this.value}).get().join(","));$("#maildest").text($("tr:not(.gr) .dest:checked",f).parent().prev().map(function(){return this.textContent}).get().concat($("tr:not(.gr) .bcc:checked",f).parent().prev().prev().map(function(){return this.textContent+" (CC)"}).get()).join(", ")||"[Personne]");$("#fenetre, #fenetre_fond").remove()})}function envoimail(){if($(".maildest").children("span").text()=="[Personne]")affiche("Il faut au moins un destinataire pour envoyer le courriel.","nok");else if(!$('[name="sujet"]').val().length)affiche("Il faut un sujet non vide pour envoyer le courriel.","nok");else $.ajax({url:"ajax.php",method:"post",data:$("#mail").serialize(),dataType:"json",el:"",fonction:function(el){location.reload(true)}})}function relevenotes(){confirmation("<p>Vous allez réaliser une relève des notes de colles. Cela consiste à marquer comme relevées toutes les heures déclarées jusqu'à maintenant et non encore relevées. Vous pourrez alors télécharger le nouveau relevé au sein du tableau en bas de page.</p><p>Cette opération n'est pas annulable.</p><p>Une fois que vous aurez réalisé ce relevé, les professeurs et colleurs ne pourront pas modifier le nombre d'élèves et la durée correspondant aux colles relevées.</p>",this,function(el){$.ajax({url:"ajax.php",method:"post",data:"action=releve-notes",dataType:"json",el:"",fonction:function(el){location.reload(true)}})})}$(document).ajaxSend(function(ev,xhr,settings){$("#load").show(200);if(settings.data.append)settings.data.append("csrf-token",$("body").attr("data-csrf-token"));else settings.data="csrf-token="+$("body").attr("data-csrf-token")+"&"+settings.data}).ajaxStop(function(){$("#load").hide(200)}).ajaxSuccess(function(ev,xhr,settings){var data=xhr.responseJSON;switch(data["etat"]){case"ok":affiche(data["message"],"ok");settings.fonction(settings.el);break;case"nok":affiche(data["message"],"nok");break;case"login":case"mdp":reconnect(settings,data["etat"]=="mdp");break;case"recupok":settings.afficheform(data)}});$(function(){$("a.formulaire, .modifevnmt").on("click",formulaire);$("a.icon-aide").on("click",function(){popup($("#aide-"+($(this).parent().data("id")||"page").split("|")[0]).html(),false)});$("a.icon-ok").on("click",valide);$("a.icon-cache,a.icon-montre,a.icon-monte,a.icon-descend,a.icon-supprime,a.icon-lock,a.icon-ajoutecolle").on("click",function(){window[this.className.substring(5)]($(this))});$("#log").hide().on("click",function(){$(this).hide(300)});$(".editable").editinplace();$("a.icon-deconnexion").on("click",function(e){$.ajax({url:"ajax.php",method:"post",data:{action:"deconnexion"},dataType:"json",el:"",fonction:function(el){location.reload(true)}})});$(".titrecdt").editinplacecdt();$(".cdt-raccourcis").init_cdt_raccourcis();$(".icon-mailenvoi").on("click",envoimail);$("#maildest, #maildest + .icon-edite").on("click",destinatairesmail);$(".categorie th:first-child").prepend($('<span class="icon-deplie" title="Déplier/Replier cette catégorie"></span>').on("click",plie));$("article select[multiple]").each(selmult);$(".supprmultiple").on("click",suppressionmultiple);$("#utilisateurs").each(init_utilisateurs);$("#utilisateurs-matieres").each(init_utilisateurs_matieres);$(".usergrp").first().each(init_utilisateurs_groupes);$("#planning select").change(function(){$(this).parent().prev().children("input").prop("checked",this.value==0)});$("#planning input").change(function(){$(this).parent().next().children("select").val(0)});$("#relevenotes").on("click",relevenotes);$(".icon-menu").on("click",function(){$("#colonne,nav").toggleClass("visible")})});
\ No newline at end of file
diff -urN cahier-de-prepa8.1.0/notes.php cahier-de-prepa8.1.1/notes.php
--- cahier-de-prepa8.1.0/notes.php	2018-10-30 05:17:45.144160493 +0100
+++ cahier-de-prepa8.1.1/notes.php	2018-11-06 01:19:05.638505108 +0100
@@ -162,7 +162,7 @@
     if ( isset($_REQUEST['tableau']) )  {
       // Récupération des colleurs
       $resultat = $mysqli->query("SELECT id, IF(LENGTH(nom),CONCAT(prenom,' ',nom),login) AS nom
-                                  FROM utilisateurs WHERE autorisation > 2 AND FIND_IN_SET($mid,matieres) ORDER BY IF(LENGTH(nom),nom,login)");
+                                  FROM utilisateurs WHERE ( autorisation = 3 OR autorisation = 5 ) AND FIND_IN_SET($mid,matieres) ORDER BY IF(LENGTH(nom),nom,login)");
       $select_colleurs = '';
       while ( $r = $resultat->fetch_assoc() )
         $select_colleurs .= "\n      <option value=\"${r['id']}\">${r['nom']}</option>";
@@ -487,7 +487,7 @@
   if ( $resultat->num_rows )  {
     $table .= "        <tr><th>Groupes de colles</th><th></th></tr>\n";
     while ( $r = $resultat->fetch_assoc() )
-      $table .= "        <tr><td>Groupe ${r['nom']}&nbsp;: ${r['eleves']}</td><td><input type=\"checkbox\" class=\"grpnote\" value=\"${r['eid']}\"></td></tr>\n";
+      $table .= "        <tr><td><label for=\"g${r['id']}\">Groupe ${r['nom']}&nbsp;: ${r['eleves']}</label></td><td><input type=\"checkbox\" class=\"grpnote\" name=\"g${r['id']}\" value=\"${r['eid']}\"></td></tr>\n";
     $resultat->free();
     $table .= "        <tr><td><strong>Voir tous les élèves</strong></td><td><input type=\"checkbox\"></td></tr>\n";
   }
