Mise en route du suivi.
[aidenligne_francais_universite.git] / plugins / couteau_suisse / exec / admin_couteau_suisse.php
1 <?php
2 #-----------------------------------------------------#
3 # Plugin : Couteau Suisse - Licence : GPL #
4 # Auteur : Patrice Vanneufville, 2006 #
5 # Contact : patrice¡.!vanneufville¡@!laposte¡.!net #
6 # Infos : http://www.spip-contrib.net/?article2166 #
7 #-----------------------------------------------------#
8
9 @define('_URL_CONTRIB', 'http://www.spip-contrib.net/?article');
10
11 include_spip('inc/texte');
12 include_spip('inc/layer');
13 include_spip("inc/presentation");
14
15 // compatibilite spip 1.9
16 if(defined('_SPIP19100') && !function_exists('fin_gauche')) { function fin_gauche(){return '';} }
17 function cs_compat_boite($b) {if(defined('_SPIP19200')) echo $b('', true); else $b(); }
18
19 function cs_admin_styles_et_js($cs_version) {
20 global $afficher_outil;
21 $a = defined('_SPIP19100')||defined('_SPIP19200')
22 ?'div.cadre-info a { background:none; padding:0; border:0; } div.cadre-info { margin-bottom:1em; }'
23 :'';
24 echo <<<EOF
25 <style type='text/css'>$a
26
27 .cs_hidden { display:none; }
28 div.cadre-padding form{ padding:0; margin:0; }
29 div.cadre_padding form{ padding:0; margin:0; }
30 div.cs-cadre{ padding:0.5em; margin:1px; width=100%; border:1px solid #666666; }
31 div.cs-cadre h3 { margin:0.2em 0; border-bottom:1px solid #666666; }
32 div.cs_infos { }
33 div.cs_infos p { margin:0.3em 1em 0.3em 0pt; padding:0pt; }
34 div.cs_infos h3.titrem { border-bottom:solid 1px; font-weight:bold; display:block; }
35 div.cs_infos legend { font-weight:bold; }
36 div.cs_infos fieldset { margin:.8em 4em .5em 4em; /* -moz-border-radius:8px; */ }
37 div.cs_infos sup { font-size:85%; font-variant:normal; vertical-align:super; }
38 div.cs_infos hr { border:0; border-top:1px solid #67707F; }
39
40 .conteneur {
41 clear:both;
42 width:100%;
43 margin:0.8em 0 0 0;
44 padding:0;
45 }
46
47 a.cs_href {
48 font-weight:normal;
49 }
50 a.outil_on {
51 font-weight:bold;
52 border:1px dotted;
53 }
54 div.cs_liste {
55 float:left;
56 width:45%;
57 }
58
59 div.cs_outils {
60 clear:both;
61 float:none;
62 width:100%;
63 }
64
65 div.cs_actifs {
66 float:right;
67 }
68 div.cs_toggle {
69 float:left;
70 width:9.6%; /* pour IE6 */
71 text-align:center;
72 margin:50px 0 0 0;
73 }
74
75 div.categorie {
76 margin-top:.6em;
77 padding:2px;
78 font-weight:bold;
79 display:block;
80 cursor:pointer;
81 }
82 div.categorie span {
83 font-size:85%;
84 }
85 div.categorie span.light {
86 font-weight:normal;
87 }
88
89 </style>
90 EOF;
91 echo "<script type=\"text/javascript\"><!--
92
93 var cs_selected, cs_descripted;
94 function set_selected() {
95 cs_selected = new Array();
96 jQuery('a.outil_on').each( function(i){
97 cs_selected[i] = this.name;
98 });
99 if(cs_selected.length) {
100 jQuery('div.cs_toggle div').show();
101 jQuery('#cs_toggle_p').html('('+cs_selected.length+')');
102 } else jQuery('div.cs_toggle div').hide();
103 }
104 function set_categ(id) {
105 nb = jQuery('#'+id+' a.outil_on').length;
106 if(nb>0) jQuery('#'+id).prev().children().removeClass('light');
107 else jQuery('#'+id).prev().children().addClass('light');
108 }
109 function outils_toggle() {
110 if(cs_selected.length>1) {
111 msg=\"".unicode_to_javascript(addslashes(html2unicode(_T('couteauprive:outils_permuter_gras2'))))."\";
112 msg=msg.replace(/@nb@/, cs_selected.length);
113 } else {
114 msg=\"".unicode_to_javascript(addslashes(html2unicode(_T('couteauprive:outil_permuter'))))."\";
115 msg=msg.replace(/@text@/, jQuery('a.outil_on').text());
116 }
117 if (!confirm(msg)) return false;
118 jQuery('#cs_selection').attr('value', cs_selected.join(','));
119 document.csform.submit();
120 }
121
122 if (window.jQuery) jQuery(function(){
123 jQuery('div.cs_liste script').remove();
124 // clic sur un titre de categorie
125 jQuery('div.categorie').click( function() {
126 jQuery(this).children().toggleClass('cs_hidden');
127 next = jQuery(this).next();
128 next.toggleClass('cs_hidden');
129 cs_EcrireCookie(next[0].id, '+'+next[0].className, dixans);
130 // annulation du clic
131 return false;
132 })
133 .dblclick(function(){
134 id = '#'+this.nextSibling.id;
135 a = jQuery(id+' a.outil_on').length;
136 b = jQuery(id+' a.cs_href').length;
137 if(a==b) jQuery(id+' a.outil_on').removeClass('outil_on');
138 else jQuery(id+' a.cs_href').addClass('outil_on');
139 jQuery(this).children().addClass('cs_hidden');
140 next = jQuery(this).next();
141 next.removeClass('cs_hidden');
142 cs_EcrireCookie(next[0].id, '+'+next[0].className, dixans);
143 set_selected();
144 set_categ(this.nextSibling.id);
145 return false;
146 });
147
148 // clic sur un outil
149 jQuery('a.cs_href').click( function() {
150 //alert(jQuery('#cs_infos')[0].className);
151 jQuery(this).toggleClass('outil_on');
152 //jQuery('#cs_infos').show();
153 set_selected();
154 set_categ(this.parentNode.id);
155 // on s'en va si l'outil est deja affiche
156 if(cs_descripted==this.name) return false;
157 cs_descripted=this.name;
158 // on charge la nouvelle description
159 jQuery('#cs_infos')
160 .css('opacity', '0.5')
161 .parent()
162 .prepend(ajax_image_searching)
163 .load('".generer_url_ecrire('charger_description_outil', 'source='._request('exec').'&outil=', '\\x26')."'+this.name);
164 // annulation du clic
165 return false;
166 })
167 .dblclick(function(){
168 jQuery('a.outil_on').removeClass('outil_on');
169 jQuery('div.categorie span').addClass('light');
170 jQuery(this).addClass('outil_on');
171 set_selected();
172 set_categ(this.parentNode.id);
173 outils_toggle();
174 return false;
175 });
176
177 // clic surle bouton de permutation
178 jQuery('#cs_toggle_a').click( function() {
179 outils_toggle();
180 // annulation du clic
181 return false;
182 });
183
184 // clic sur le bouton de reset
185 jQuery('#cs_reset_a').click( function() {
186 jQuery('a.outil_on').removeClass('outil_on');
187 jQuery('div.cs_toggle div').hide();
188 jQuery('div.categorie span').addClass('light');
189 // annulation du clic
190 return false;
191 });
192
193 // clic sur le bouton 'tous les actifs'
194 jQuery('#cs_tous_a').click( function() {
195 jQuery('div.cs_actifs a.cs_href').addClass('outil_on');
196 jQuery('div.categorie span').removeClass('light');
197 set_selected();
198 // annulation du clic
199 return false;
200 });
201
202 // verifier la version du CS
203 jQuery('span.cs_version').load('".generer_url_ecrire('cs_version', 'version='.$cs_version, true)."');
204 // afficher la boite rss, si elle existe
205 jQuery('div.cs_boite_rss').load('".generer_url_ecrire('cs_boite_rss')."');
206
207 });
208
209 var dixans=new Date;
210 dixans.setFullYear(dixans.getFullYear()+10);
211
212 // ref : http://www.actulab.com/ecrire-les-cookies.php
213 function cs_EcrireCookie(nom, valeur){
214 var argv=cs_EcrireCookie.arguments;
215 var argc=cs_EcrireCookie.arguments.length;
216 var expires=(argc > 2) ? argv[2] : null;
217 var path=(argc > 3) ? argv[3] : null;
218 var domain=(argc > 4) ? argv[4] : null;
219 var secure=(argc > 5) ? argv[5] : false;
220 document.cookie=nom+'='+escape(valeur)+
221 ((expires==null) ? '' : ('; expires='+expires.toGMTString()))+
222 ((path==null) ? '' : ('; path='+path))+
223 ((domain==null) ? '' : ('; domain='+domain))+
224 ((secure==true) ? '; secure' : '');
225 }
226 function cs_getCookieVal(offset){
227 var endstr=document.cookie.indexOf (';', offset);
228 if (endstr==-1) endstr=document.cookie.length;
229 return unescape(document.cookie.substring(offset, endstr));
230 }
231 function cs_LireCookie(nom){
232 var arg=nom+'=';
233 var alen=arg.length;
234 var clen=document.cookie.length;
235 var i=0;
236 while (i<clen){
237 var j=i+alen;
238 if (document.cookie.substring(i, j)==arg) return cs_getCookieVal(j);
239 i=document.cookie.indexOf(' ',i)+1;
240 if (i==0) break;
241 }
242 return null;
243 }
244 function cs_EffaceCookie(nom){
245 date=new Date;
246 date.setFullYear(date.getFullYear()-1);
247 cs_EcrireCookie(nom,null,date);
248 }
249
250 function cs_Categorie(nom){
251 c=cs_LireCookie(nom);
252 return (window.jQuery && (c===null || c=='+cs_hidden'))?'cs_hidden':'';
253 }
254 function cs_Titre(nom){
255 c=cs_LireCookie(nom);
256 return (window.jQuery && (c===null || c=='+cs_hidden'))?'':' cs_hidden';
257 }
258
259 //--></script>";
260 }
261
262 // mise a jour des donnees si envoi via formulaire
263 function enregistre_modif_outils($cmd){
264 cs_log("INIT : enregistre_modif_outils()");
265 global $outils, $metas_outils;
266 // recuperer les outils dans $_POST ou $_GET
267 $toggle = array();
268 if(isset($_GET['outil'])) $toggle[] = $_GET['outil'];
269 elseif(isset($_POST['cs_selection'])) $toggle = explode(',', $_POST['cs_selection']);
270 else return;
271 $_GET['outil'] = ($cmd!='hide' && count($toggle)==1)?$toggle[0]:'';
272 $i = $cmd=='hide'?'cache':'actif';
273 ${$i} = isset($GLOBALS['meta']["tweaks_{$i}s"])?unserialize($GLOBALS['meta']["tweaks_{$i}s"]):array();
274 foreach($toggle as $o) if(isset(${$i}[$o][$i]))
275 unset(${$i}[$o][$i]);
276 else ${$i}[$o][$i] = 1;
277 if(defined('_SPIP19300')) $connect_id_auteur = $GLOBALS['auteur_session']['id_auteur'];
278 else global $connect_id_auteur;
279 spip_log("Changement de statut ($i) des outils par l'auteur id=$connect_id_auteur : ".implode(', ',array_keys(${$i})));
280 ecrire_meta("tweaks_{$i}s", serialize(${$i}));
281 if($cmd=='toggle') $metas_outils = ${$i};
282
283 include_spip('inc/plugin');
284 verif_plugin();
285
286 cs_log(" FIN : enregistre_modif_outils()");
287 }
288
289 function cout_exec_redirige($p = '') {
290 ecrire_metas();
291 cs_initialisation(true);
292 include_spip('inc/invalideur');
293 purger_repertoire(_DIR_SKELS);
294 purger_repertoire(_DIR_CACHE);
295 if (defined('_SPIP19200')) include_spip('inc/headers');
296 redirige_par_entete(generer_url_ecrire(_request('exec'), $p, true));
297 }
298
299 function exec_admin_couteau_suisse() {
300 cs_log("INIT : exec_admin_couteau_suisse()");
301 global $spip_lang_right;
302 global $outils, $afficher_outil, $metas_vars, $metas_outils;
303
304 if (!cout_autoriser()) {
305 include_spip('inc/minipres');
306 echo defined('_SPIP19100')?minipres( _T('avis_non_acces_page')):minipres();
307 exit;
308 }
309 $cmd = _request('cmd');
310 $exec = _request('exec');
311
312 @unlink(_DIR_TMP."couteau-suisse.plat");
313 include_spip('inc/plugin');
314 verif_plugin();
315
316 // id de l'auteur en session
317 if(defined('_SPIP19300')) $connect_id_auteur = $GLOBALS['auteur_session']['id_auteur'];
318 else global $connect_id_auteur;
319
320 // reset general
321 if ($cmd=='resetall'){
322 spip_log("Reset General du Couteau Suisse par l'auteur id=$connect_id_auteur");
323 foreach(array_keys($GLOBALS['meta']) as $meta) {
324 if(strpos($meta, 'tweaks_') === 0) effacer_meta($meta);
325 if(strpos($meta, 'cs_') === 0) effacer_meta($meta);
326 }
327 $metas_vars = $metas_outils = array();
328 // ici, pas d'initialisation...
329 include_spip('cout_lancement');
330 cout_exec_redirige('cmd=resetjs');
331 }
332 // installation personnalisee
333 if ($cmd=='install' && isset($_GET['pack']) && isset($GLOBALS['cs_installer'][$_GET['pack']]['outils'])){
334 spip_log("Installation peronnalisee de '$_GET[outils]' par l'auteur id=$connect_id_auteur");
335 $pack = &$GLOBALS['cs_installer'][$_GET['pack']];
336 effacer_meta('tweaks_actifs');
337 $metas_outils = array();
338 foreach(explode('|', $pack['outils']) as $o) $metas_outils[trim($o)]['actif'] = 1;
339 if(isset($pack['variables'])) foreach($pack['variables'] as $i=>$v) $metas_vars[$i] = $v;
340 ecrire_meta('tweaks_actifs', serialize($metas_outils));
341 ecrire_meta('tweaks_variables', serialize($metas_vars));
342 cout_exec_redirige();
343 }
344 // reset des variables d'un outil
345 if ($cmd=='reset' && strlen($_GET['outil'])){
346 spip_log("Reset des variables de '$_GET[outil]' par l'auteur id=$connect_id_auteur");
347 global $outils;
348 include_spip('cout_utils');
349 include_spip('config_outils');
350 include_spip('inc/cs_outils');
351 cs_initialisation_d_un_outil($_GET['outil'], charger_fonction('description_outil', 'inc'), true);
352 foreach ($outils[$_GET['outil']]['variables'] as $a) unset($metas_vars[$a]);
353 ecrire_meta('tweaks_variables', serialize($metas_vars));
354 cout_exec_redirige("cmd=descrip&outil={$_GET[outil]}#cs_infos");
355 }
356 // reset de l'affichage
357 if ($cmd=='showall'){
358 spip_log("Reset de tous les affichages du Couteau Suisse par l'auteur id=$connect_id_auteur");
359 effacer_meta('tweaks_caches');
360 cout_exec_redirige();
361 }
362
363 // afficher la description d'un outil ?
364 $afficher_outil = ($cmd=='descrip' OR $cmd=='toggle')?$_GET['outil']:'';
365
366 // initialisation generale forcee : recuperation de $outils;
367 cs_initialisation(true);
368 cs_installe_outils();
369
370 // mise a jour des donnees si envoi via formulaire
371 // sinon fait une passe de verif sur les outils
372 if ($cmd=='toggle' OR $cmd=='hide'){
373 enregistre_modif_outils($cmd);
374 cout_exec_redirige(strlen($_GET['outil'])?"cmd=descrip&outil={$_GET[outil]}#cs_infos":'');
375 }
376 // else
377 // verif_outils();
378
379 if(defined('_SPIP19100'))
380 debut_page(_T('couteauprive:titre'), 'configuration', 'couteau_suisse');
381 else {
382 $commencer_page = charger_fonction('commencer_page', 'inc');
383 echo $commencer_page(_T('couteauprive:titre'), "configuration", 'couteau_suisse');
384 }
385 // pour la version du plugin
386 include_spip('inc/plugin');
387 if(isset($GLOBALS['meta']['plugin'])) {
388 $t = unserialize($GLOBALS['meta']['plugin']);
389 $dir = $t['COUTEAU_SUISSE']['dir'];
390 $cs_version = $t['COUTEAU_SUISSE']['version'];
391 $bt_dir = $t['BARRETYPOENRICHIE']['dir'];
392 $bt_version = $t['BARRETYPOENRICHIE']['version'];
393 unset($t);
394 }
395 if(!strlen($dir)) $dir = 'couteau_suisse';
396 if(!strlen($bt_dir)) $bt_dir = 'barre_typo_v2';
397 if(!strlen($cs_version)) { $cs_version = plugin_get_infos($dir); $cs_version = $cs_version['version']; }
398 if(!strlen($bt_version)) { $bt_version = plugin_get_infos($bt_dir); $bt_version = $bt_version['version']; }
399
400 cs_admin_styles_et_js($cs_version);
401 echo "<br /><br /><br />";
402 gros_titre(_T('couteauprive:titre'), '', false);
403 echo barre_onglets("configuration", 'couteau_suisse');
404 echo '<div style="font-size:85%"><p style="color:red;">Ancienne interface : <a href="', generer_url_ecrire('admin_couteau_suisse_old'), '">par ici</a></p>';
405 // verification d'une base venant de SPIP 1.8
406 $res = spip_query("DESCRIBE spip_meta valeur");
407 $resultat = function_exists('spip_fetch_array')?spip_fetch_array($res):sql_fetch($res);
408 if($resultat['Type']!='text') echo "<p style=\"color:red;\">Attention : votre base semble ancienne et le Couteau Suisse ne va pas bien fonctionner.</p><p>La table 'spip_meta' a pour type de valeur '$resultat[Type]' au lieu de 'text'.</p>";
409 // verification de la barre typo V2
410 if (strlen($bt_version) and (version_compare($bt_version,'2.4.0','<'))) echo "<p><span style=\"color:red;\">Attention :</span> la barre typographique (version $bt_version) semble ancienne.<br />Le Couteau Suisse est compatible avec une version sup&eacute;rieure ou &eacute;gale &agrave; 2.4.0.</p>";
411 echo "<script type=\"text/javascript\"><!--
412 if (!window.jQuery) document.write('<p><span style=\"color:red;\">Note :</span> jQuery semble inactif sur cette page. Veuillez consulter <a href=\"http://www.spip-contrib.net/?article2166\">ici</a> le paragraphe sur les d&eacute;pendances du plugin.');
413 //--></script>";
414 echo '</div>';
415
416 cs_compat_boite('debut_gauche');
417 // pour la liste des docs sur spip-contrib
418 $contribs = isset($GLOBALS['meta']['tweaks_contribs'])?unserialize($GLOBALS['meta']['tweaks_contribs']):array();
419 foreach($contribs as $i=>$v) $contribs[$i] = preg_replace('/@@(.*?)@@/e', "couper(_T('\\1'), 25)", $v);
420 sort($contribs);
421 $aide = '';
422 if(isset($GLOBALS['cs_installer'])) foreach(array_keys($GLOBALS['cs_installer']) as $pack)
423 $aide .= "\n_ " . _T('couteauprive:pack_du', array('pack'=>"{[{$pack}|"._T('couteauprive:pack_installe').'->' . generer_url_ecrire($exec,'cmd=install&pack='.urlencode($pack)) . ']}'));
424 $aide = _T('couteauprive:help', array(
425 'reset' => generer_url_ecrire($exec,'cmd=resetall'),
426 'hide' => generer_url_ecrire($exec,'cmd=showall'),
427 'version' => $cs_version,
428 'distant' => '<br/><span class="cs_version">'._T('version_distante').'</span>',
429 'contribs' => join('', $contribs),
430 'install' => $aide,
431 'pack' => '['._T('couteauprive:pack_titre').'|'._T('couteauprive:pack_alt').'->'.generer_url_ecrire($exec,'cmd=pack#cs_infos').']',
432 ));
433 echo debut_boite_info(true), propre($aide), fin_boite_info(true);
434 $aide = cs_aide_raccourcis();
435 if(strlen($aide))
436 echo debut_boite_info(true), $aide, fin_boite_info(true);
437 $aide = cs_aide_pipelines();
438 if(strlen($aide))
439 echo debut_boite_info(true), $aide, fin_boite_info(true);
440 echo pipeline('affiche_gauche',array('args'=>array('exec'=>$exec),'data'=>''));
441
442 cs_compat_boite('creer_colonne_droite');
443 // on telecharge les news...
444 if (defined('boites_privees_CS')) cs_boite_rss(!$quiet);
445 echo pipeline('affiche_droite',array('args'=>array('exec'=>$exec),'data'=>''));
446 cs_compat_boite('debut_droite');
447
448 echo debut_cadre_trait_couleur(find_in_path('img/couteau-24.gif'),true,'','&nbsp;'._T('couteauprive:outils_liste')),
449 _T('couteauprive:outil_intro'),
450 "\n<table border='0' cellspacing='0' cellpadding='5' style='width:100%;'><tr><td class='sansserif'>";
451
452 include_spip('inc/cs_outils');
453 $_GET['source'] = $exec;
454 echo '<div class="conteneur">', liste_outils(),
455 '</div><br class="conteneur" /><div class="conteneur">',
456 $cmd=='pack'?cs_description_pack():description_outil2($afficher_outil),
457 '<script type="text/javascript"><!--
458 var cs_descripted = "', $afficher_outil, '";
459 document.write("<style>#csjs{display:none;}</style>");
460 //--></script><div id="csjs" style="color:red;"><br/>', _T('couteauprive:erreur:js'),'</div>
461 <noscript><style>#csjs{display:none;}</style><div style="color:red;"><br/>', _T('couteauprive:erreur:nojs'),
462 $_GET['modif']=='oui'?'<br/>'._T('couteauprive:vars_modifiees').'.':'','</div></noscript>',
463 '</div>',
464 "</td></tr></table>\n",
465 fin_cadre_trait_couleur(true),
466
467 pipeline('affiche_milieu',array('args'=>array('exec'=>$exec),'data'=>'')),
468 fin_gauche(), fin_page();
469 cs_log(" FIN : exec_admin_couteau_suisse()");
470 }
471
472 function cs_boite_rss($force) {
473 echo debut_boite_info(true), '<p><b>'._T('couteauprive:rss_titre').'</b></p><div class="cs_boite_rss"><p>'._T('couteauprive:rss_attente').'</p><noscript>'._T('couteauprive:outil_inactif').' !</noscript></div>'
474 /*.'<div style="text-align: right; font-size: 87%;"><a title="'._T('couteauprive:rss_desactiver').'" href="'
475 .generer_url_ecrire(_request('exec'),'cmd=toggle&outil=rss_couteau_suisse').'">'._T('couteauprive:supprimer_cadre').'</a></div>'*/
476 , fin_boite_info(true);
477 }
478
479 ?>