[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / couteau_suisse / couteau_suisse / outils / blocs_fonctions.php
1 <?php
2
3 /* Trois ou quatre balises pour creer des blocs depliables :
4
5 #BLOC_TITRE / {une_URL} si ajax, {un_numero} si bloc numerote, {visible} si bloc deplie /
6 Mon titre
7 #BLOC_RESUME / facultatif /
8 Mon resume qui disparait si on clique
9 #BLOC_DEBUT
10 Mon bloc depliable / qui est aussi l'emplacement pour l'Ajax si le fragment est donne /
11 #BLOC_FIN
12
13 */
14
15 @define('_BLOC_TITRE_H', 'h4');
16
17 // Pour la balise suivante, l'ordre des arguments importe peu
18 // Un bloc replie, titre simple : #BLOC_TITRE
19 // Un bloc replie AJAX : #BLOC_TITRE{fragment} (fragment est une URLs)
20 // Un bloc replie numerote : #BLOC_TITRE{numero} (numero est un nombre entier)
21 // Un bloc deplie ou replie : ajouter l'argument 'visible' ou 'invisible' : #BLOC_TITRE{visible}
22 // Par defaut : les blocs sont replies
23 function balise_BLOC_TITRE($p) {
24 // Les arguments : 'visible' ou 'invisible', un numero, une URL
25 $p->code = "blocs_balises('titre', array(".blocs_arguments($p).'))';
26 $p->interdire_scripts = false;
27 return $p;
28 }
29
30 function blocs_arguments(&$p) {
31 $i = 0; $args = array();
32 while(($a = interprete_argument_balise(++$i,$p)) != NULL) $args[] = $a;
33 return join(",", $args);
34 }
35
36 // 3 balises obsoletes
37 function balise_BLOC_TITRE_NUM(&$p) {return balise_BLOC_TITRE($p);}
38 function balise_BLOC_VISIBLE_TITRE_NUM(&$p) {return balise_BLOC_VISIBLE_TITRE($p);}
39 function balise_BLOC_VISIBLE_TITRE(&$p) {
40 // Produire le premier argument {visible}
41 $texte = new Texte; $texte->type='texte'; $texte->texte='visible';
42 array_unshift($p->param, array(0=>NULL, 1=>array(0=>$texte)));
43 return balise_BLOC_TITRE($p);
44 }
45
46 function balise_BLOC_RESUME($p) {
47 $p->code = "blocs_balises('resume')";
48 $p->interdire_scripts = false;
49 return $p;
50 }
51
52 function balise_BLOC_DEBUT($p) {
53 $p->code = "blocs_balises('debut', array(".blocs_arguments($p).'))';
54 $p->interdire_scripts = false;
55 return $p;
56 }
57
58 function balise_BLOC_FIN($p) {
59 $p->code = "blocs_balises('fin')";
60 $p->interdire_scripts = false;
61 return $p;
62 }
63
64 function balise_BLOC_TITRE_DEBUT($p) {
65 $p->code = "blocs_balises('titre_debut', array(".blocs_arguments($p).'))';
66 $p->interdire_scripts = false;
67 return $p;
68 }
69
70 function balise_BLOC_TITRE_FIN($p) {
71 $p->code = "blocs_balises('titre_fin')";
72 $p->interdire_scripts = false;
73 return $p;
74 }
75
76 // Renvoie un code JQuery pour deplier un bloc au chargement de la page.
77 // Exemple pour deplier le 5eme bloc : #BLOC_DEPLIER{4} (l'index commence a zero)
78 function balise_BLOC_DEPLIER($p) {
79 $eq = interprete_argument_balise(1, $p);
80 $p->code = "bloc_deplier_script(intval($eq))";
81 $p->interdire_scripts = false;
82 return $p;
83 }
84 // Renvoie un code JQuery pour deplier un bloc numerote au chargement de la page.
85 // Exemple pour deplier le bloc .cs_bloc4 : #BLOC_DEPLIER_NUM{4}
86 function balise_BLOC_DEPLIER_NUM($p) {
87 $eq = interprete_argument_balise(1, $p);
88 $p->code = "bloc_num_deplier_script(intval($eq))";
89 $p->interdire_scripts = false;
90 return $p;
91 }
92
93 // Renvoie un code JQuery pour courcuiter la variable configurant les blocs uniques
94 // Argument : oui/non ou 0/1
95 function balise_BLOC_UNIQUE($p) {
96 $arg = interprete_argument_balise(1, $p);
97 $p->code = "bloc_unique_script($arg)";
98 $p->interdire_scripts = false;
99 return $p;
100 }
101
102 // fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_DEPLIER
103 function bloc_deplier_script($num=0) {
104 return $num<0?'':http_script("jQuery(document).ready(function() { jQuery('"._BLOC_TITRE_H.".blocs_titre').eq($num).click(); });");
105 }
106 // fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_DEPLIER_NUM
107 function bloc_num_deplier_script($num=-1) {
108 return $num<0?'':http_script("jQuery(document).ready(function() { jQuery('div.cs_bloc$num').children('.blocs_titre').eq(0).click(); });");
109 }
110 // fonction (SPIP>=2.0) pour le calcul de la balise #BLOC_UNIQUE
111 function bloc_unique_script($num=1) {
112 $num = ($num==='oui' || intval($num)>0)?1:0;
113 return http_script("var blocs_replier_tout = $num;");
114 }
115
116 // fonction pour le calcul des balises de type #BLOC_XXX
117 // $args ne sert que pour #BLOC_TITRE et contient les arguments de la balise sous forme de tableau
118 function blocs_balises($type, $args=array()) {
119 // statut binaire : bit1=ajax bit2=titre bit3=resume bit4=debut
120 // 2 = ajax (20 si distant) ; 1 = titre pas d'ajax (10 si distant); idem negatif = bloc visible
121 static $bloc_stade;
122 $k=isset($bloc_stade)?count($bloc_stade):0;
123 $stade=$k?abs($bloc_stade[--$k]):0;
124 $distant = $replie = 1; $id = $numero = '';
125 switch($type) {
126 case 'titre_debut':
127 // id pour le bloc distant
128 $id = ' id="cs_bloc_id_' . array_shift($args) . '"';
129 $distant = 10;
130 case 'titre':
131 foreach($args as $a) {
132 if(is_numeric($a=trim($a))) $numero = ' cs_bloc'.$a;
133 elseif($a=='visible') $replie = -1;
134 elseif($a=='invisible') $replie = 1;
135 elseif(strlen($a)) $fragment = $a;
136 }
137 if (isset($fragment)){
138 $ajax=' blocs_ajax ';
139 $bloc_stade[]=2*$distant*$replie;
140 } else {
141 $fragment="javascript:;";
142 $ajax='';
143 $bloc_stade[]=1*$distant*$replie;
144 }
145 $replie = $replie>0?' blocs_replie':'';
146 return "<div class=\"cs_blocs$numero\"><"._BLOC_TITRE_H." class=\"blocs_titre$replie$ajax\"$id><a href=\"$fragment\">";
147 case 'resume':
148 $class=$bloc_stade[$k]>0?'':' blocs_invisible blocs_slide';
149 if($stade<1 || $stade>2) // on DOIT arriver de titre
150 die("Erreur : #BLOC_RESUME sans #BLOC_TITRE ($stade)");
151 $bloc_stade[$k]=$bloc_stade[$k]>0?3:-3; // 3 = resume
152 return "</a></"._BLOC_TITRE_H."><div class=\"blocs_resume$class\">";
153 case 'debut':
154 if(count($args)) {
155 // debut d'un bloc depliable a distance
156 foreach($args as $a) {
157 if($a=='visible') $replie = -1;
158 elseif($a=='invisible') $replie = 1;
159 elseif(strlen($a)) $id = " cs_bloc_id_$a";
160 }
161 $bloc_stade[]=11;
162 $class = $replie>0?' blocs_invisible blocs_slide':'';
163 return "<div class=\"blocs_destination$class$id\">";
164 }
165 $class=$bloc_stade[$k]<0?'':' blocs_invisible blocs_slide';
166 $bloc_stade[$k]=$bloc_stade[$k]>0?4:-4; // 4=debut
167 if($stade == 3) // on arrive du resume, fermer la div resume seulement
168 return "</div><div class=\"blocs_destination$class\">";
169 else {
170 if($stade<1 || $stade>2) // on DOIT arriver de titre
171 die("Erreur : #BLOC_DEBUT sans #BLOC_TITRE ($stade)");
172 return '</a></'._BLOC_TITRE_H."><div class=\"blocs_destination$class\">";
173 }
174 case 'titre_fin':
175 $k=isset($bloc_stade)?abs(array_pop($bloc_stade)):0;
176 if($k==10 || $k==20) // on DOIT arriver de #BLOC_TITRE_DEBUT
177 return '</a></'._BLOC_TITRE_H.'></div>';
178 die("Erreur : #BLOC_TITRE_FIN sans #BLOC_TITRE_DEBUT ($k)");
179 case 'fin':
180 $k=isset($bloc_stade)?abs(array_pop($bloc_stade)):0;
181 switch($k) {
182 case 4:return "</div></div>";
183 case 11:return "</div>";
184 default:die("Erreur : #BLOC_FIN sans #BLOC_DEBUT ($k)");
185 }
186
187 }
188 }
189
190 ?>