var url_chargee = new Array(); var xhr_actifs = {}; // // Fonctions pour mini_nav // function slide_horizontal (couche, slide, align, depart, etape ) { var obj = jQuery("#"+couche); if (!obj.length) return; obj = obj.get(0); if (!etape) { if (align == 'left') depart = obj.scrollLeft; else depart = obj.firstChild.offsetWidth - obj.scrollLeft; etape = 0; } etape = Math.round(etape) + 1; pos = Math.round(depart) + Math.round(((slide - depart) / 10) * etape); if (align == 'left') obj.scrollLeft = pos; else obj.scrollLeft = obj.firstChild.offsetWidth - pos; if (etape < 10) setTimeout("slide_horizontal('"+couche+"', '"+slide+"', '"+align+"', '"+depart+"', '"+etape+"')", 60); //else obj.scrollLeft = slide; } function changerhighlight (couche) { jQuery(couche) .addClass('on') .siblings() .not(couche) .removeClass('on'); jQuery('.petite-racine.on').removeClass('on'); } function aff_selection (arg, idom, url, event) { var noeud = jQuery("#"+idom); if (noeud.length) { noeud.hide(); charger_node_url(url+arg, noeud.get(0), '','',event); } return false; } // selecteur de rubrique et affichage de son titre dans le bandeau function aff_selection_titre(titre, id, idom, nid) { var t = jQuery('#titreparent'); var p = t.closest('form'); t.attr('value',titre); p.find('#'+nid).attr('value',id).trigger('change'); // declencher le onchange p.find("#"+idom).hide('fast'); if (p.is('.submit_plongeur')) p.get(p.length-1).submit(); else p.find("#"+idom).prev('div').find('a').eq(0).focus(); } /** * Utilise dans inc/plonger * @param id * @param racine * @param url * @param col * @param sens * @param informer * @param event */ function aff_selection_provisoire(id, racine, url, col, sens,informer,event) { if(url.href == 'javascript:void(0)'){ slide_horizontal(racine + '_principal', ((col-1)*150), sens); aff_selection (id, racine + "_selection", informer); } else{ charger_id_url(url.href, racine + '_col_' + (col+1), function() { slide_horizontal(racine + '_principal', ((col-1)*150), sens); aff_selection (id, racine + "_selection", informer); }, event); } // empecher le chargement non Ajax return false; } /** * Lanche une requete Ajax a chaque frappe au clavier dans une balise de saisie. * Si l'entree redevient vide, rappeler l'URL initiale si dispo. * Sinon, controler au retour si le resultat est unique, * auquel cas forcer la selection. * utlise dans inc/selectionner * @param valeur * @param rac * @param url * @param img * @param nid * @param init */ function onkey_rechercher(valeur, rac, url, img, nid, init) { var Field = jQuery("#"+rac).get(0); if (!valeur.length) { init = jQuery("#"+init).get(0); if (init && init.href) { charger_node_url(init.href, Field);} } else { charger_node_url(url+valeur, Field, function () { var n = Field.childNodes.length - 1; // Safari = 0 & Firefox = 1 ! // et gare aux negatifs en cas d'abort if ((n == 1)) { noeud = Field.childNodes[n].firstChild; if (noeud.title) // cas de la rubrique, pas des auteurs aff_selection_titre(noeud.firstChild.nodeValue, noeud.title, rac, nid); } }, img); } return false; } // Recupere tous les formulaires de la page // (ou du fragment qu'on vient de recharger en ajax) // et leur applique les comportements js souhaites // ici : // * utiliser ctrl-s, F8 etc comme touches de sauvegarde var verifForm_clicked=false; function verifForm(racine) { verifForm_clicked = false; // rearmer quand on passe ici (il y a eu de l'ajax par exemple) if (!jQuery) return; // appels ajax sur iframe // Clavier pour sauver (cf. crayons) // cf http://www.quirksmode.org/js/keys.html if (!jQuery.browser.msie) // keypress renvoie le charcode correspondant au caractere frappe (ici s) jQuery('form:not(.bouton_action_post)', racine||document).not('.verifformok') .keypress(function(e){ if ( ((e.ctrlKey && ( /* ctrl-s ou ctrl-maj-S, firefox */ (((e.charCode||e.keyCode) == 115) || ((e.charCode||e.keyCode) == 83)) /* ctrl-s, safari */ || (e.charCode==19 && e.keyCode==19) ) ) /* ctrl-s, Opera Mac */ || (e.keyCode==19 && jQuery.browser.opera)) && !verifForm_clicked ) { verifForm_clicked = true; jQuery(this).find('input[type=submit]') .click(); return false; } }).addClass('verifformok'); else // keydown renvoie le keycode correspondant a la touche pressee (ici F8) jQuery('form:not(.bouton_action_post)', racine||document).not('.verifformok') .keydown(function(e){ //jQuery('#ps').after("
ctrl:"+e.ctrlKey+"
charcode:"+e.charCode+"
keycode:"+e.keyCode+"
"); if (!e.charCode && e.keyCode == 119 /* F8, windows */ && !verifForm_clicked){ verifForm_clicked = true; jQuery(this).find('input[type=submit]') .click(); return false; } }).addClass('verifformok'); } // La fonction qui fait vraiment le travail decrit ci-dessus. // Son premier argument est deja le noeud du DOM // et son resultat booleen est inverse ce qui lui permet de retourner // le gestionnaire Ajax comme valeur non fausse function AjaxSqueezeNode(trig, target, f, event) { var i, callback; // retour std si pas precise: affecter ce noeud avec ce retour if (!f) { callback = function() { verifForm(this);} } else { callback = function(res,status) { f.apply(this,[res,status]); verifForm(this); } } valid = false; if (typeof(window['_OUTILS_DEVELOPPEURS']) != 'undefined'){ if (!(navigator.userAgent.toLowerCase().indexOf("firefox/1.0"))) valid = (typeof event == 'object') && (event.altKey || event.metaKey); } if (typeof(trig) == 'string') { // laisser le choix de la touche enfoncee au moment du clic // car beaucoup de systemes en prenne une a leur usage if (valid) { window.open(trig+'&transformer_xml=valider_xml'); } else { jQuery(target).animeajax(); } res = jQuery.ajax({ "url":trig, "complete": function(r,s) { AjaxRet(r,s,target, callback); jQuery(target).endLoading(); } }); return res; } if(valid) { //open a blank window var doc = window.open("","valider").document; //create a document to enable receiving the result of the ajax post doc.open(); doc.close(); //set the element receiving the ajax post target = doc.body; } else { jQuery(target).animeajax(); } jQuery(trig).ajaxSubmit({ "target": target, "success": function(res,status) { if(status=='error') return this.html('Erreur HTTP'); callback.apply(this,[res,status]); }, "beforeSubmit":function (vars) { if (valid) vars.push({"name":"transformer_xml","value":"valider_xml"}); return true; } }); return true; } function AjaxRet(res,status, target, callback) { if (res.aborted) return; if (status=='error') return jQuery(target).html('HTTP Error'); // Inject the HTML into all the matched elements jQuery(target) .html(res.responseText) // Execute callback .each(callback, [res.responseText, status]); } // Comme AjaxSqueeze, // mais avec un cache sur le noeud et un cache sur la reponse // et une memorisation des greffes en attente afin de les abandonner // (utile surtout a la frappe interactive au clavier) // De plus, la fonction optionnelle n'a pas besoin de greffer la reponse. function charger_id_url(myUrl, myField, jjscript, event) { var Field = jQuery("#"+myField); if (!Field.length) return true; if (!myUrl) { Field.empty(); retour_id_url(Field.get(0), jjscript); return true; // url vide, c'est un self complet } else return charger_node_url(myUrl, Field.get(0), jjscript, jQuery('#'+'img_' + myField).get(0), event); } // La suite function charger_node_url(myUrl, Field, jjscript, img, event) { // disponible en cache ? if (url_chargee[myUrl]) { var el = jQuery(Field).html(url_chargee[myUrl])[0]; retour_id_url(el, jjscript); jQuery.spip.triggerAjaxLoad(el); return false; } else { if (img) img.style.visibility = "visible"; if (xhr_actifs[Field]) { xhr_actifs[Field].aborted = true;xhr_actifs[Field].abort(); } xhr_actifs[Field] = AjaxSqueezeNode(myUrl, Field, function (r) { xhr_actifs[Field] = undefined; if (img) img.style.visibility = "hidden"; url_chargee[myUrl] = r; retour_id_url(Field, jjscript); slide_horizontal($(Field).children().attr("id")+'_principal', $(Field).width() , $(Field).css("text-align")); }, event); return false; } } function retour_id_url(Field, jjscript) { jQuery(Field).css({'visibility':'visible','display':'block'}); if (jjscript) jjscript(); } function charger_node_url_si_vide(url, noeud, gifanime, jjscript,event) { if (noeud.style.display !='none') { noeud.style.display='none';} else { if (noeud.innerHTML != "") { noeud.style.visibility = "visible"; noeud.style.display = "block"; } else { charger_node_url(url, noeud,'',gifanime,event); } } return false; } // Lancer verifForm jQuery(function(){ verifForm(); onAjaxLoad(verifForm); });