[SPIP] ~maj SPIP v3.0.17 --> v3.0.19
[lhc/web/clavette_www.git] / www / prive / javascript / layer.js
1 var memo_obj = new Array();
2 var url_chargee = new Array();
3 var xhr_actifs = {};
4
5 function findObj_test_forcer(n, forcer) {
6 var p,i,x;
7
8 // Voir si on n'a pas deja memorise cet element
9 if (memo_obj[n] && !forcer) {
10 return memo_obj[n];
11 }
12
13 var d = document;
14 if((p = n.indexOf("?"))>0 && parent.frames.length) {
15 d = parent.frames[n.substring(p+1)].document;
16 n = n.substring(0,p);
17 }
18 if(!(x = d[n]) && d.all) {
19 x = d.all[n];
20 }
21 for (i = 0; !x && i<d.forms.length; i++) {
22 x = d.forms[i][n];
23 }
24 for(i=0; !x && d.layers && i<d.layers.length; i++) x = findObj(n,d.layers[i].document);
25 if(!x && document.getElementById) x = document.getElementById(n);
26
27 // Memoriser l'element
28 if (!forcer) memo_obj[n] = x;
29 return x;
30 }
31
32 function findObj(n) {
33 return findObj_test_forcer(n, false);
34 }
35 // findObj sans memorisation de l'objet - avec Ajax, les elements se deplacent dans DOM
36 function findObj_forcer(n) {
37 return findObj_test_forcer(n, true);
38 }
39
40 //
41 // Fonctions pour mini_nav
42 //
43
44 function slide_horizontal (couche, slide, align, depart, etape ) {
45
46 var obj = findObj_forcer(couche);
47
48 if (!obj) return;
49 if (!etape) {
50 if (align == 'left') depart = obj.scrollLeft;
51 else depart = obj.firstChild.offsetWidth - obj.scrollLeft;
52 etape = 0;
53 }
54 etape = Math.round(etape) + 1;
55 pos = Math.round(depart) + Math.round(((slide - depart) / 10) * etape);
56
57 if (align == 'left') obj.scrollLeft = pos;
58 else obj.scrollLeft = obj.firstChild.offsetWidth - pos;
59 if (etape < 10) setTimeout("slide_horizontal('"+couche+"', '"+slide+"', '"+align+"', '"+depart+"', '"+etape+"')", 60);
60 //else obj.scrollLeft = slide;
61 }
62
63 function changerhighlight (couche) {
64 jQuery(couche)
65 .addClass('on')
66 .siblings()
67 .not(couche)
68 .removeClass('on');
69 jQuery('.petite-racine.on').removeClass('on');
70 }
71
72 function aff_selection (arg, idom, url, event) {
73 noeud = findObj_forcer(idom);
74 if (noeud) {
75 noeud.style.display = "none";
76 charger_node_url(url+arg, noeud, '','',event);
77 }
78 return false;
79 }
80
81 // selecteur de rubrique et affichage de son titre dans le bandeau
82
83 function aff_selection_titre(titre, id, idom, nid)
84 {
85 var t = jQuery('#titreparent');
86 var p = t.closest('form');
87 t.attr('value',titre);
88 p.find('#'+nid).attr('value',id).trigger('change'); // declencher le onchange
89 p.find("#"+idom).hide('fast');
90 if (p.is('.submit_plongeur')) p.get(p.length-1).submit();
91 }
92
93
94 /**
95 * Utilise dans inc/plonger
96 * @param id
97 * @param racine
98 * @param url
99 * @param col
100 * @param sens
101 * @param informer
102 * @param event
103 */
104 function aff_selection_provisoire(id, racine, url, col, sens,informer,event)
105 {
106 charger_id_url(url.href,
107 racine + '_col_' + (col+1),
108 function() {
109 slide_horizontal(racine + '_principal', ((col-1)*150), sens);
110 aff_selection (id, racine + "_selection", informer);
111 },
112 event);
113 // empecher le chargement non Ajax
114 return false;
115 }
116
117 /**
118 * Lanche une requete Ajax a chaque frappe au clavier dans une balise de saisie.
119 * Si l'entree redevient vide, rappeler l'URL initiale si dispo.
120 * Sinon, controler au retour si le resultat est unique,
121 * auquel cas forcer la selection.
122 * utlise dans inc/selectionner
123 * @param valeur
124 * @param rac
125 * @param url
126 * @param img
127 * @param nid
128 * @param init
129 */
130 function onkey_rechercher(valeur, rac, url, img, nid, init) {
131 var Field = findObj_forcer(rac);
132 if (!valeur.length) {
133 init = findObj_forcer(init);
134 if (init && init.href) { charger_node_url(init.href, Field);}
135 } else {
136 charger_node_url(url+valeur,
137 Field,
138 function () {
139 var n = Field.childNodes.length - 1;
140 // Safari = 0 & Firefox = 1 !
141 // et gare aux negatifs en cas d'abort
142 if ((n == 1)) {
143 noeud = Field.childNodes[n].firstChild;
144 if (noeud.title)
145 // cas de la rubrique, pas des auteurs
146 aff_selection_titre(noeud.firstChild.nodeValue, noeud.title, rac, nid);
147 }
148 },
149 img);
150 }
151 return false;
152 }
153
154
155 // Recupere tous les formulaires de la page
156 // (ou du fragment qu'on vient de recharger en ajax)
157 // et leur applique les comportements js souhaites
158 // ici :
159 // * utiliser ctrl-s, F8 etc comme touches de sauvegarde
160 var verifForm_clicked=false;
161 function verifForm(racine) {
162 verifForm_clicked = false; // rearmer quand on passe ici (il y a eu de l'ajax par exemple)
163 if (!jQuery) return; // appels ajax sur iframe
164 // Clavier pour sauver (cf. crayons)
165 // cf http://www.quirksmode.org/js/keys.html
166 if (!jQuery.browser.msie)
167 // keypress renvoie le charcode correspondant au caractere frappe (ici s)
168 jQuery('form:not(.bouton_action_post)', racine||document).not('.verifformok')
169 .keypress(function(e){
170 if (
171 ((e.ctrlKey && (
172 /* ctrl-s ou ctrl-maj-S, firefox */
173 (((e.charCode||e.keyCode) == 115) || ((e.charCode||e.keyCode) == 83))
174 /* ctrl-s, safari */
175 || (e.charCode==19 && e.keyCode==19)
176 )
177 ) /* ctrl-s, Opera Mac */
178 || (e.keyCode==19 && jQuery.browser.opera))
179 && !verifForm_clicked
180 ) {
181 verifForm_clicked = true;
182 jQuery(this).find('input[type=submit]')
183 .click();
184 return false;
185 }
186 }).addClass('verifformok');
187 else
188 // keydown renvoie le keycode correspondant a la touche pressee (ici F8)
189 jQuery('form:not(.bouton_action_post)', racine||document).not('.verifformok')
190 .keydown(function(e){
191 //jQuery('#ps').after("<div>ctrl:"+e.ctrlKey+"<br />charcode:"+e.charCode+"<br />keycode:"+e.keyCode+"<hr /></div>");
192 if (!e.charCode && e.keyCode == 119 /* F8, windows */ && !verifForm_clicked){
193 verifForm_clicked = true;
194 jQuery(this).find('input[type=submit]')
195 .click();
196 return false;
197 }
198 }).addClass('verifformok');
199 }
200
201 // La fonction qui fait vraiment le travail decrit ci-dessus.
202 // Son premier argument est deja le noeud du DOM
203 // et son resultat booleen est inverse ce qui lui permet de retourner
204 // le gestionnaire Ajax comme valeur non fausse
205
206 function AjaxSqueezeNode(trig, target, f, event)
207 {
208 var i, callback;
209
210 // retour std si pas precise: affecter ce noeud avec ce retour
211 if (!f) {
212 callback = function() { verifForm(this);}
213 }
214 else {
215 callback = function(res,status) {
216 f.apply(this,[res,status]);
217 verifForm(this);
218 }
219 }
220
221 valid = false;
222 if (typeof(window['_OUTILS_DEVELOPPEURS']) != 'undefined'){
223 if (!(navigator.userAgent.toLowerCase().indexOf("firefox/1.0")))
224 valid = (typeof event == 'object') && (event.altKey || event.metaKey);
225 }
226
227 if (typeof(trig) == 'string') {
228 // laisser le choix de la touche enfoncee au moment du clic
229 // car beaucoup de systemes en prenne une a leur usage
230 if (valid) {
231 window.open(trig+'&transformer_xml=valider_xml');
232 } else {
233 jQuery(target).animeajax();
234 }
235 res = jQuery.ajax({
236 "url":trig,
237 "complete": function(r,s) {
238 AjaxRet(r,s,target, callback);
239 }
240 });
241 return res;
242
243 }
244
245 if(valid) {
246 //open a blank window
247 var doc = window.open("","valider").document;
248 //create a document to enable receiving the result of the ajax post
249 doc.open();
250 doc.close();
251 //set the element receiving the ajax post
252 target = doc.body;
253 }
254 else {
255 jQuery(target).animeajax();
256 }
257
258 jQuery(trig).ajaxSubmit({
259 "target": target,
260 "success": function(res,status) {
261 if(status=='error') return this.html('Erreur HTTP');
262 callback.apply(this,[res,status]);
263 },
264 "beforeSubmit":function (vars) {
265 if (valid)
266 vars.push({"name":"transformer_xml","value":"valider_xml"});
267 return true;
268 }
269 });
270 return true;
271 }
272
273
274 function AjaxRet(res,status, target, callback) {
275 if (res.aborted) return;
276 if (status=='error') return jQuery(target).html('HTTP Error');
277
278 // Inject the HTML into all the matched elements
279 jQuery(target)
280 .html(res.responseText)
281 // Execute callback
282 .each(callback, [res.responseText, status]);
283 }
284
285
286 // Comme AjaxSqueeze,
287 // mais avec un cache sur le noeud et un cache sur la reponse
288 // et une memorisation des greffes en attente afin de les abandonner
289 // (utile surtout a la frappe interactive au clavier)
290 // De plus, la fonction optionnelle n'a pas besoin de greffer la reponse.
291
292 function charger_id_url(myUrl, myField, jjscript, event)
293 {
294 var Field = findObj_forcer(myField);
295 if (!Field) return true;
296
297 if (!myUrl) {
298 jQuery(Field).empty();
299 retour_id_url(Field, jjscript);
300 return true; // url vide, c'est un self complet
301 } else return charger_node_url(myUrl, Field, jjscript, findObj_forcer('img_' + myField), event);
302 }
303
304 // La suite
305
306 function charger_node_url(myUrl, Field, jjscript, img, event)
307 {
308 // disponible en cache ?
309 if (url_chargee[myUrl]) {
310 var el = jQuery(Field).html(url_chargee[myUrl])[0];
311 retour_id_url(el, jjscript);
312 jQuery.spip.triggerAjaxLoad(el);
313 return false;
314 }
315 else {
316 if (img) img.style.visibility = "visible";
317 if (xhr_actifs[Field]) { xhr_actifs[Field].aborted = true;xhr_actifs[Field].abort(); }
318 xhr_actifs[Field] = AjaxSqueezeNode(myUrl,
319 Field,
320 function (r) {
321 xhr_actifs[Field] = undefined;
322 if (img) img.style.visibility = "hidden";
323 url_chargee[myUrl] = r;
324 retour_id_url(Field, jjscript);
325 slide_horizontal($(Field).children().attr("id")+'_principal', $(Field).width() , $(Field).css("text-align"));
326 },
327 event);
328 return false;
329 }
330 }
331
332 function retour_id_url(Field, jjscript)
333 {
334 jQuery(Field).css({'visibility':'visible','display':'block'});
335 if (jjscript) jjscript();
336 }
337
338 function charger_node_url_si_vide(url, noeud, gifanime, jjscript,event) {
339
340 if (noeud.style.display !='none') {
341 noeud.style.display='none';}
342 else {
343 if (noeud.innerHTML != "") {
344 noeud.style.visibility = "visible";
345 noeud.style.display = "block";
346 } else {
347 charger_node_url(url, noeud,'',gifanime,event);
348 }
349 }
350 return false;
351 }
352
353 // Lancer verifForm
354 jQuery(document).ready(function(){
355 verifForm();
356 onAjaxLoad(verifForm);
357 });