1 var memo_obj
= new Array();
2 var url_chargee
= new Array();
5 function findObj_test_forcer(n
, forcer
) {
8 // Voir si on n'a pas deja memorise cet element
9 if (memo_obj
[n
] && !forcer
) {
14 if((p
= n
.indexOf("?"))>0 && parent
.frames
.length
) {
15 d
= parent
.frames
[n
.substring(p
+1)].document
;
18 if(!(x
= d
[n
]) && d
.all
) {
21 for (i
= 0; !x
&& i
<d
.forms
.length
; i
++) {
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
);
27 // Memoriser l'element
28 if (!forcer
) memo_obj
[n
] = x
;
33 return findObj_test_forcer(n
, false);
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);
41 // Fonctions pour mini_nav
44 function slide_horizontal (couche
, slide
, align
, depart
, etape
) {
46 var obj
= findObj_forcer(couche
);
50 if (align
== 'left') depart
= obj
.scrollLeft
;
51 else depart
= obj
.firstChild
.offsetWidth
- obj
.scrollLeft
;
54 etape
= Math
.round(etape
) + 1;
55 pos
= Math
.round(depart
) + Math
.round(((slide
- depart
) / 10) * etape
);
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;
63 function changerhighlight (couche
) {
69 jQuery('.petite-racine.on').removeClass('on');
72 function aff_selection (arg
, idom
, url
, event
) {
73 noeud
= findObj_forcer(idom
);
75 noeud
.style
.display
= "none";
76 charger_node_url(url
+arg
, noeud
, '','',event
);
81 // selecteur de rubrique et affichage de son titre dans le bandeau
83 function aff_selection_titre(titre
, id
, idom
, nid
)
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();
95 * Utilise dans inc/plonger
104 function aff_selection_provisoire(id
, racine
, url
, col
, sens
,informer
,event
)
106 charger_id_url(url
.href
,
107 racine
+ '_col_' + (col
+1),
109 slide_horizontal(racine
+ '_principal', ((col
-1)*150), sens
);
110 aff_selection (id
, racine
+ "_selection", informer
);
113 // empecher le chargement non Ajax
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
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
);}
136 charger_node_url(url
+valeur
,
139 var n
= Field
.childNodes
.length
- 1;
140 // Safari = 0 & Firefox = 1 !
141 // et gare aux negatifs en cas d'abort
143 noeud
= Field
.childNodes
[n
].firstChild
;
145 // cas de la rubrique, pas des auteurs
146 aff_selection_titre(noeud
.firstChild
.nodeValue
, noeud
.title
, rac
, nid
);
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
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
){
172 /* ctrl-s ou ctrl-maj-S, firefox */
173 (((e
.charCode
||e
.keyCode
) == 115) || ((e
.charCode
||e
.keyCode
) == 83))
175 || (e
.charCode
==19 && e
.keyCode
==19)
177 ) /* ctrl-s, Opera Mac */
178 || (e
.keyCode
==19 && jQuery
.browser
.opera
))
179 && !verifForm_clicked
181 verifForm_clicked
= true;
182 jQuery(this).find('input[type=submit]')
186 }).addClass('verifformok');
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]')
198 }).addClass('verifformok');
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
206 function AjaxSqueezeNode(trig
, target
, f
, event
)
210 // retour std si pas precise: affecter ce noeud avec ce retour
212 callback = function() { verifForm(this);}
215 callback = function(res
,status
) {
216 f
.apply(this,[res
,status
]);
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
);
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
231 window
.open(trig
+'&transformer_xml=valider_xml');
233 jQuery(target
).animeajax();
237 "complete": function(r
,s
) {
238 AjaxRet(r
,s
,target
, callback
);
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
251 //set the element receiving the ajax post
255 jQuery(target
).animeajax();
258 jQuery(trig
).ajaxSubmit({
260 "success": function(res
,status
) {
261 if(status
=='error') return this.html('Erreur HTTP');
262 callback
.apply(this,[res
,status
]);
264 "beforeSubmit":function (vars
) {
266 vars
.push({"name":"transformer_xml","value":"valider_xml"});
274 function AjaxRet(res
,status
, target
, callback
) {
275 if (res
.aborted
) return;
276 if (status
=='error') return jQuery(target
).html('HTTP Error');
278 // Inject the HTML into all the matched elements
280 .html(res
.responseText
)
282 .each(callback
, [res
.responseText
, status
]);
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.
292 function charger_id_url(myUrl
, myField
, jjscript
, event
)
294 var Field
= findObj_forcer(myField
);
295 if (!Field
) return true;
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
);
306 function charger_node_url(myUrl
, Field
, jjscript
, img
, event
)
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
);
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
,
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"));
332 function retour_id_url(Field
, jjscript
)
334 jQuery(Field
).css({'visibility':'visible','display':'block'});
335 if (jjscript
) jjscript();
338 function charger_node_url_si_vide(url
, noeud
, gifanime
, jjscript
,event
) {
340 if (noeud
.style
.display
!='none') {
341 noeud
.style
.display
='none';}
343 if (noeud
.innerHTML
!= "") {
344 noeud
.style
.visibility
= "visible";
345 noeud
.style
.display
= "block";
347 charger_node_url(url
, noeud
,'',gifanime
,event
);
354 jQuery(document
).ready(function(){
356 onAjaxLoad(verifForm
);