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 #-----------------------------------------------------#
9 @define('_URL_CONTRIB', 'http://www.spip-contrib.net/?article');
11 include_spip('inc/texte');
12 include_spip('inc/layer');
13 include_spip("inc/presentation");
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(); }
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; }'
25 <style type
='text/css'>$a
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; }
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; }
70 width
:9.6%
; /* pour IE6 */
85 div
.categorie span
.light
{
91 echo "<script type=\"text/javascript\"><!--
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;
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();
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');
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);
114 msg=\"".unicode_to_javascript(addslashes(html2unicode(_T('couteauprive:outil_permuter'))))."\";
115 msg=msg.replace(/@text@/, jQuery('a.outil_on').text());
117 if (!confirm(msg)) return false;
118 jQuery('#cs_selection').attr('value', cs_selected.join(','));
119 document.csform.submit();
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
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);
144 set_categ(this.nextSibling.id);
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();
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
160 .css('opacity', '0.5')
162 .prepend(ajax_image_searching)
163 .load('".generer_url_ecrire('charger_description_outil', 'source='._request('exec').'&outil=', '\\x26')."'+this.name);
164 // annulation du clic
167 .dblclick(function(){
168 jQuery('a.outil_on').removeClass('outil_on');
169 jQuery('div.categorie span').addClass('light');
170 jQuery(this).addClass('outil_on');
172 set_categ(this.parentNode.id);
177 // clic surle bouton de permutation
178 jQuery('#cs_toggle_a').click( function() {
180 // annulation du clic
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
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');
198 // annulation du clic
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')."');
210 dixans.setFullYear(dixans.getFullYear()+10);
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' : '');
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));
231 function cs_LireCookie(nom){
234 var clen=document.cookie.length;
238 if (document.cookie.substring(i, j)==arg) return cs_getCookieVal(j);
239 i=document.cookie.indexOf(' ',i)+1;
244 function cs_EffaceCookie(nom){
246 date.setFullYear(date.getFullYear()-1);
247 cs_EcrireCookie(nom,null,date);
250 function cs_Categorie(nom){
251 c=cs_LireCookie(nom);
252 return (window.jQuery && (c===null || c=='+cs_hidden'))?'cs_hidden':'';
254 function cs_Titre(nom){
255 c=cs_LireCookie(nom);
256 return (window.jQuery && (c===null || c=='+cs_hidden'))?'':' cs_hidden';
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
268 if(isset($_GET['outil'])) $toggle[] = $_GET['outil'];
269 elseif(isset($_POST['cs_selection'])) $toggle = explode(',', $_POST['cs_selection']);
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};
283 include_spip('inc/plugin');
286 cs_log(" FIN : enregistre_modif_outils()");
289 function cout_exec_redirige($p = '') {
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
));
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;
304 if (!cout_autoriser()) {
305 include_spip('inc/minipres');
306 echo defined('_SPIP19100')?
minipres( _T('avis_non_acces_page')):minipres();
309 $cmd = _request('cmd');
310 $exec = _request('exec');
312 @unlink(_DIR_TMP
."couteau-suisse.plat");
313 include_spip('inc/plugin');
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;
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);
327 $metas_vars = $metas_outils = array();
328 // ici, pas d'initialisation...
329 include_spip('cout_lancement');
330 cout_exec_redirige('cmd=resetjs');
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();
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");
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");
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();
363 // afficher la description d'un outil ?
364 $afficher_outil = ($cmd=='descrip' OR $cmd=='toggle')?
$_GET['outil']:'';
366 // initialisation generale forcee : recuperation de $outils;
367 cs_initialisation(true
);
368 cs_installe_outils();
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":'');
379 if(defined('_SPIP19100'))
380 debut_page(_T('couteauprive:titre'), 'configuration', 'couteau_suisse');
382 $commencer_page = charger_fonction('commencer_page', 'inc');
383 echo $commencer_page(_T('couteauprive:titre'), "configuration", 'couteau_suisse');
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'];
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']; }
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érieure ou égale à 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épendances du plugin.');
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);
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),
431 'pack' => '['._T('couteauprive:pack_titre').'|'._T('couteauprive:pack_alt').'->'.generer_url_ecrire($exec,'cmd=pack#cs_infos').']',
433 echo debut_boite_info(true
), propre($aide), fin_boite_info(true
);
434 $aide = cs_aide_raccourcis();
436 echo debut_boite_info(true
), $aide, fin_boite_info(true
);
437 $aide = cs_aide_pipelines();
439 echo debut_boite_info(true
), $aide, fin_boite_info(true
);
440 echo pipeline('affiche_gauche',array('args'=>array('exec'=>$exec),'data'=>''));
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');
448 echo debut_cadre_trait_couleur(find_in_path('img/couteau-24.gif'),true
,'',' '._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'>";
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>',
464 "</td></tr></table>\n",
465 fin_cadre_trait_couleur(true
),
467 pipeline('affiche_milieu',array('args'=>array('exec'=>$exec),'data'=>'')),
468 fin_gauche(), fin_page();
469 cs_log(" FIN : exec_admin_couteau_suisse()");
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
);