[ Index ] |
|
Code source de SPIP 1.9.2c |
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 function hide_obj(obj) { 41 var element; 42 if (element = findObj(obj)){ 43 jQuery(element).css("visibility","hidden"); 44 } 45 } 46 47 function swap_couche(couche, rtl, dir, no_swap) { 48 var layer; 49 var triangle = document.getElementById('triangle' + couche); 50 if (!(layer = findObj('Layer' + couche))) return; 51 if (layer.style.display == "none"){ 52 if (!no_swap && triangle) triangle.src = dir + 'deplierbas.gif'; 53 layer.style.display = 'block'; 54 } else { 55 if (!no_swap && triangle) triangle.src = dir + 'deplierhaut' + rtl + '.gif'; 56 layer.style.display = 'none'; 57 } 58 } 59 function ouvrir_couche(couche, rtl,dir) { 60 var layer; 61 var triangle = document.getElementById('triangle' + couche); 62 if (!(layer = findObj('Layer' + couche))) return; 63 if (triangle) triangle.src = dir + 'deplierbas.gif'; 64 layer.style.display = 'block'; 65 } 66 function fermer_couche(couche, rtl, dir) { 67 var layer; 68 var triangle = document.getElementById('triangle' + couche); 69 if (!(layer = findObj('Layer' + couche))) return; 70 if (triangle) triangle.src = dir + 'deplierhaut' + rtl + '.gif'; 71 layer.style.display = 'none'; 72 } 73 function manipuler_couches(action,rtl,first,last, dir) { 74 if (action=='ouvrir') { 75 for (j=first; j<=last; j+=1) { 76 ouvrir_couche(j,rtl, dir); 77 } 78 } else { 79 for (j=first; j<=last; j+=1) { 80 fermer_couche(j,rtl, dir); 81 } 82 } 83 } 84 85 // 86 // Fonctions pour mini_nav 87 // 88 89 function slide_horizontal (couche, slide, align, depart, etape ) { 90 var obj = findObj_forcer(couche); 91 if (!obj) return; 92 if (!etape) { 93 if (align == 'left') depart = obj.scrollLeft; 94 else depart = obj.firstChild.offsetWidth - obj.scrollLeft; 95 etape = 0; 96 } 97 etape = Math.round(etape) + 1; 98 pos = Math.round(depart) + Math.round(((slide - depart) / 10) * etape); 99 100 if (align == 'left') obj.scrollLeft = pos; 101 else obj.scrollLeft = obj.firstChild.offsetWidth - pos; 102 if (etape < 10) setTimeout("slide_horizontal('"+couche+"', '"+slide+"', '"+align+"', '"+depart+"', '"+etape+"')", 60); 103 //else obj.scrollLeft = slide; 104 } 105 106 function changerhighlight (couche) { 107 var kids = couche.parentNode.childNodes; 108 for (var i = 0; i < kids.length; i++) { 109 kids[i].className = "pashighlight"; 110 } 111 couche.className = "highlight"; 112 } 113 114 function aff_selection (arg, idom, url, event) 115 { 116 117 noeud = findObj_forcer(idom); 118 if (noeud) { 119 noeud.style.display = "none"; 120 charger_node_url(url+arg, noeud, '','',event); 121 } 122 return false; 123 } 124 125 // selecteur de rubrique et affichage de son titre dans le bandeau 126 127 function aff_selection_titre(titre, id, idom, nid) 128 { 129 t = findObj_forcer('titreparent'); 130 t.value= titre; 131 t=findObj_forcer(nid); 132 t.value=id; 133 jQuery(t).trigger('change'); // declencher le onchange 134 t=findObj_forcer(idom); 135 t.style.display='none'; 136 } 137 138 function aff_selection_provisoire(id, racine, url, col, sens,informer,event) 139 { 140 charger_id_url(url.href, 141 racine + '_col_' + (col+1), 142 function() { 143 slide_horizontal(racine + 'principal', ((col-1)*150), sens); 144 aff_selection (id, racine + "_selection", informer); 145 }, 146 event); 147 // empecher le chargement non Ajax 148 return false; 149 } 150 151 // Lanche une requete Ajax a chaque frappe au clavier dans une balise de saisie. 152 // Si l'entree redevient vide, rappeler l'URL initiale si dispo. 153 // Sinon, controler au retour si le resultat est unique, 154 // auquel cas forcer la selection. 155 156 function onkey_rechercher(valeur, rac, url, img, nid, init) { 157 var Field = findObj_forcer(rac); 158 if (!valeur.length) { 159 init = findObj_forcer(init); 160 if (init && init.href) { charger_node_url(init.href, Field);} 161 } else { 162 charger_node_url(url+valeur, 163 Field, 164 function () { 165 var n = Field.childNodes.length - 1; 166 // Safari = 0 & Firefox = 1 ! 167 // et gare aux negatifs en cas d'abort 168 if ((n == 1)) { 169 noeud = Field.childNodes[n].firstChild; 170 if (noeud.title) 171 // cas de la rubrique, pas des auteurs 172 aff_selection_titre(noeud.firstChild.nodeValue, noeud.title, rac, nid); 173 } 174 }, 175 img); 176 } 177 return false; 178 } 179 180 function lancer_recherche(champ, cible) {} // obsolete 181 182 // 183 // Cette fonction charge du contenu - dynamiquement - dans un 184 // Ajax 185 186 function verifForm(racine) { 187 if(!jQuery.browser.mozilla) return; 188 racine = racine || document; 189 jQuery("input.forml,input.formo,textarea.forml,textarea.formo",racine) 190 .each(function(){ 191 var jField = jQuery(this); 192 var w = jField.css('width'); 193 if(!w || w == '100%') { 194 jField.css('width','95%'); 195 } else { 196 w = parseInt(w)- 197 (parseInt(jField.css("borderLeftWidth"))+parseInt(jField.css("borderRightWidth"))+ 198 parseInt(jField.css("paddingLeft"))+parseInt(jField.css("paddingRight"))); 199 jField.width(w+'px'); 200 } 201 }); 202 } 203 204 // Si Ajax est disponible, cette fonction l'utilise pour envoyer la requete. 205 // Si le premier argument n'est pas une url, ce doit etre un formulaire. 206 // Le deuxieme argument doit etre l'ID d'un noeud qu'on animera pendant Ajax. 207 // Le troisieme, optionnel, est la fonction traitant la réponse. 208 // La fonction par defaut affecte le noeud ci-dessus avec la reponse Ajax. 209 // En cas de formulaire, AjaxSqueeze retourne False pour empecher son envoi 210 // Le cas True ne devrait pas se produire car le cookie spip_accepte_ajax 211 // a du anticiper la situation. 212 // Toutefois il y toujours un coup de retard dans la pose d'un cookie: 213 // eviter de se loger avec redirection vers un telle page 214 215 function AjaxSqueeze(trig, id, callback, event) 216 { 217 var target = jQuery('#'+id); 218 219 // position du demandeur dans le DOM (le donner direct serait mieux) 220 if (!target.size()) {return true;} 221 222 // animation immediate pour faire patienter 223 if (typeof ajax_image_searching != 'undefined') { 224 target.prepend(ajax_image_searching); 225 } 226 return !AjaxSqueezeNode(trig, target, callback, event); 227 } 228 229 // La fonction qui fait vraiment le travail decrit ci-dessus. 230 // Son premier argument est deja le noeud du DOM 231 // et son resultat booleen est inverse ce qui lui permet de retourner 232 // le gestionnaire Ajax comme valeur non fausse 233 234 function AjaxSqueezeNode(trig, target, f, event) 235 { 236 var i, callback; 237 238 // retour std si pas precise: affecter ce noeud avec ce retour 239 if (!f) { 240 callback = function() { verifForm(this);} 241 } 242 else { 243 callback = function(res,status) { f.apply(this,[res,status]); verifForm(this);} 244 } 245 valid = (typeof event != 'object') ? false : ((event.altKey || event.metaKey) == true); 246 247 valid = false; 248 if (typeof(window['_OUTILS_DEVELOPPEURS']) != 'undefined') 249 valid = (typeof event != 'object') ? false : ((event.altKey || event.metaKey) == true); 250 251 if (typeof(trig) == 'string') { 252 i = trig.split('?'); 253 trig = i[0] +'?var_ajaxcharset=utf-8&' + i[1]; 254 // laisser le choix de la touche enfoncee au moment du clic 255 // car beaucoup de systemes en prenne une a leur usage 256 if (valid) { 257 window.open(trig+'&transformer_xml=valider_xml'); 258 } 259 res = jQuery.ajax({"url":trig, 260 "complete":function(r,s){AjaxRet(r,s,target, callback)}}); 261 return res; 262 263 } 264 265 if(valid) { 266 //open a blank window 267 var doc = window.open("","valider").document; 268 //create a document to enable receiving the result of the ajax post 269 doc.open(); 270 doc.close(); 271 //store the searching image to be able to remove it after the post completes 272 var searching_img = $(">:first",target); 273 //set the element receiving the ajax post 274 target = doc.body; 275 } 276 277 jQuery(trig).ajaxSubmit({"target":target, 278 "after":function(res,status){ 279 if(valid) searching_img.remove(); 280 if(status=='error') return this.html('Erreur HTTP'); 281 callback(res,status); 282 }, 283 "before":function (vars){ 284 vars.push({"name":"var_ajaxcharset","value":"utf-8"}); 285 if (valid) 286 vars.push({"name":"transformer_xml","value":"valider_xml"}); 287 return true; 288 }}); 289 return true; 290 } 291 292 function AjaxRet(res,status, target, callback) 293 { 294 if (res.aborted) return; 295 if (status=='error') return jQuery(target).html('HTTP Error'); 296 297 if (this.evalScripts) 298 // Inject the HTML into all the matched elements 299 jQuery(target).html(res.responseText) 300 // Execute all the scripts inside of the newly-injected HTML 301 .evalScripts() 302 // Execute callback 303 .each( callback, [res.responseText, status] ); 304 //callback(res,status); 305 else // jQuery v1.1.4 306 jQuery(target).html(res.responseText).each( callback, [res.responseText, status] ); 307 } 308 309 310 // Comme AjaxSqueeze, 311 // mais avec un cache sur le noeud et un cache sur la reponse 312 // et une memorisation des greffes en attente afin de les abandonner 313 // (utile surtout a la frappe interactive au clavier) 314 // De plus, la fonction optionnelle n'a pas besoin de greffer la reponse. 315 316 function charger_id_url(myUrl, myField, jjscript, event) 317 { 318 var Field = findObj_forcer(myField); 319 if (!Field) return true; 320 321 if (!myUrl) { 322 jQuery(Field).empty(); 323 retour_id_url(Field, jjscript); 324 return true; // url vide, c'est un self complet 325 } else return charger_node_url(myUrl, Field, jjscript, findObj_forcer('img_' + myField), event); 326 } 327 328 // La suite 329 330 function charger_node_url(myUrl, Field, jjscript, img, event) 331 { 332 // disponible en cache ? 333 if (url_chargee[myUrl]) { 334 var el = jQuery(Field).html(url_chargee[myUrl])[0]; 335 retour_id_url(el, jjscript); 336 triggerAjaxLoad(el); 337 return false; 338 } else { 339 if (img) img.style.visibility = "visible"; 340 if (xhr_actifs[Field]) { xhr_actifs[Field].aborted = true;xhr_actifs[Field].abort(); } 341 xhr_actifs[Field] = AjaxSqueezeNode(myUrl, 342 Field, 343 function (r) { 344 xhr_actifs[Field] = undefined; 345 if (img) img.style.visibility = "hidden"; 346 url_chargee[myUrl] = r; 347 retour_id_url(Field, jjscript); 348 }, 349 event); 350 return false; 351 } 352 } 353 354 function retour_id_url(Field, jjscript) 355 { 356 jQuery(Field).css({'visibility':'visible','display':'block'}); 357 if (jjscript) jjscript(); 358 } 359 360 function charger_node_url_si_vide(url, noeud, gifanime, jjscript,event) { 361 362 if (noeud.style.display !='none') { 363 noeud.style.display='none';} 364 else {if (noeud.innerHTML != "") { 365 noeud.style.visibility = "visible"; 366 noeud.style.display = "block"; 367 } else { 368 charger_node_url(url, noeud,'',gifanime,event); 369 } 370 } 371 return false; 372 } 373 374 function charger_id_url_si_vide (myUrl, myField, jjscript, event) { 375 var Field = findObj_forcer(myField); // selects the given element 376 if (!Field) return; 377 378 if (Field.innerHTML == "") { 379 charger_id_url(myUrl, myField, jjscript, event) 380 } 381 else { 382 Field.style.visibility = "visible"; 383 Field.style.display = "block"; 384 } 385 } 386
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Wed Nov 21 10:20:27 2007 | par Balluche grâce à PHPXref 0.7 |
![]() |