X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fprive%2Fjavascript%2Flayer.js;fp=www%2Fprive%2Fjavascript%2Flayer.js;h=58317d76af29bea335a1b8b8bf73d03174077af9;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/prive/javascript/layer.js b/www/prive/javascript/layer.js new file mode 100644 index 0000000..58317d7 --- /dev/null +++ b/www/prive/javascript/layer.js @@ -0,0 +1,510 @@ +var memo_obj = new Array(); +var url_chargee = new Array(); +var xhr_actifs = {}; + +function findObj_test_forcer(n, forcer) { + var p,i,x; + + // Voir si on n'a pas deja memorise cet element + if (memo_obj[n] && !forcer) { + return memo_obj[n]; + } + + var d = document; + if((p = n.indexOf("?"))>0 && parent.frames.length) { + d = parent.frames[n.substring(p+1)].document; + n = n.substring(0,p); + } + if(!(x = d[n]) && d.all) { + x = d.all[n]; + } + for (i = 0; !x && ictrl:"+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; + } + }); + +} + +// Si Ajax est disponible, cette fonction l'utilise pour envoyer la requete. +// Si le premier argument n'est pas une url, ce doit etre un formulaire. +// Le deuxieme argument doit etre l'ID d'un noeud qu'on animera pendant Ajax. +// Le troisieme, optionnel, est la fonction traitant la reponse. +// La fonction par defaut affecte le noeud ci-dessus avec la reponse Ajax. +// En cas de formulaire, AjaxSqueeze retourne False pour empecher son envoi +// Le cas True ne devrait pas se produire car le cookie spip_accepte_ajax +// a du anticiper la situation. +// Toutefois il y toujours un coup de retard dans la pose d'un cookie: +// eviter de se loger avec redirection vers un telle page + +function AjaxSqueeze(trig, id, callback, event) +{ + var target = jQuery('#'+id); + + // position du demandeur dans le DOM (le donner direct serait mieux) + if (!target.size()) {return true;} + + return !AjaxSqueezeNode(trig, target, callback, event); +} + +// 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); + } + }); + 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; +} + +// Les Submit avec attribut name ne sont pas transmis par JQuery +// Cette fonction clone le bouton de soumission en hidden +// Voir l'utilisation dans ajax_action_post dans inc/actions + +function AjaxNamedSubmit(input) { + jQuery('') + .attr('name', input.name) + .attr('value', input.value) + .insertAfter(input); + 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 = findObj_forcer(myField); + if (!Field) return true; + + if (!myUrl) { + jQuery(Field).empty(); + retour_id_url(Field, jjscript); + return true; // url vide, c'est un self complet + } else return charger_node_url(myUrl, Field, jjscript, findObj_forcer('img_' + myField), 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); + 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; +} + +function charger_id_url_si_vide (myUrl, myField, jjscript, event) { + var Field = findObj_forcer(myField); // selects the given element + if (!Field) return; + + if (Field.innerHTML == "") { + charger_id_url(myUrl, myField, jjscript, event) + } + else { + Field.style.visibility = "visible"; + Field.style.display = "block"; + } +} +