325 lines
8.8 KiB
JavaScript
325 lines
8.8 KiB
JavaScript
|
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("<div>ctrl:"+e.ctrlKey+"<br />charcode:"+e.charCode+"<br />keycode:"+e.keyCode+"<hr /></div>");
|
||
|
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);
|
||
|
});
|