--- /dev/null
+// A plugin that wraps all ajax calls introducing a fixed callback function on ajax complete
+if(!jQuery.load_handlers) {
+ jQuery.load_handlers = new Array();
+ //
+ // Add a function to the list of those to be executed on ajax load complete
+ //
+ function onAjaxLoad(f) {
+ jQuery.load_handlers.push(f);
+ };
+
+ //
+ // Call the functions that have been added to onAjaxLoad
+ //
+ function triggerAjaxLoad(root) {
+ for ( var i = 0; i < jQuery.load_handlers.length; i++ )
+ jQuery.load_handlers[i].apply( root );
+ };
+
+ // jQuery uses _load, we use _ACBload
+ jQuery.fn._ACBload = jQuery.fn.load;
+
+ jQuery.fn.load = function( url, params, callback ) {
+
+ callback = callback || function(){};
+
+ // If the second parameter was provided
+ if ( params ) {
+ // If it's a function
+ if ( params.constructor == Function ) {
+ // We assume that it's the callback
+ callback = params;
+ params = null;
+ }
+ }
+ var callback2 = function(res,status) {triggerAjaxLoad(this);callback.call(this,res,status);};
+
+ return this._ACBload( url, params, callback2 );
+ };
+
+ jQuery._ACBajax = jQuery.ajax;
+
+ jQuery.ajax = function(type) {
+ var s = jQuery.extend(true, {}, jQuery.ajaxSettings, type);
+ var callbackContext = s.context || s;
+ //If called by _load exit now because the callback has already been set
+ if (jQuery.ajax.caller==jQuery.fn._load) return jQuery._ACBajax( type);
+ var orig_complete = s.complete || function() {};
+ type.complete = function(res,status) {
+ // Do not fire OnAjaxLoad if the dataType is not html
+ var dataType = type.dataType;
+ var ct = (res && (typeof res.getResponseHeader == 'function'))
+ ? res.getResponseHeader("content-type"): '';
+ var xml = !dataType && ct && ct.indexOf("xml") >= 0;
+ orig_complete.call( callbackContext, res, status);
+ if(!dataType && !xml || dataType == "html") triggerAjaxLoad(document);
+ };
+ return jQuery._ACBajax(type);
+ };
+
+}
+
+// animation du bloc cible pour faire patienter
+jQuery.fn.animeajax = function(end) {
+ this.children().css('opacity', 0.5);
+ if (typeof ajax_image_searching != 'undefined'){
+ var i = (this).find('.image_loading');
+ if (i.length) i.eq(0).html(ajax_image_searching);
+ else this.prepend('<span class="image_loading">'+ajax_image_searching+'</span>');
+ }
+ return this; // don't break the chain
+}
+
+// s'il n'est pas totalement visible, scroller pour positionner
+// le bloc cible en haut de l'ecran
+// si force = true, scroller dans tous les cas
+jQuery.fn.positionner = function(force) {
+ var offset = jQuery(this).offset();
+ var hauteur = parseInt(jQuery(this).css('height'));
+ var scrolltop = self['pageYOffset'] ||
+ jQuery.boxModel && document.documentElement[ 'scrollTop' ] ||
+ document.body[ 'scrollTop' ];
+ var h = jQuery(window).height();
+ var scroll=0;
+
+ if (force || offset['top'] - 5 <= scrolltop)
+ scroll = offset['top'] - 5;
+ else if (offset['top'] + hauteur - h + 5 > scrolltop)
+ scroll = Math.min(offset['top'] - 5, offset['top'] + hauteur - h + 15);
+ if (scroll)
+ jQuery('html,body')
+ .animate({scrollTop: scroll}, 300);
+
+ // positionner le curseur dans la premiere zone de saisie
+ jQuery(jQuery('*', this).filter('input[type=text],textarea')[0]).focus();
+ return this; // don't break the chain
+}
+
+// deux fonctions pour rendre l'ajax compatible Jaws
+var virtualbuffer_id='spip_virtualbufferupdate';
+function initReaderBuffer(){
+ if (jQuery('#'+virtualbuffer_id).length) return;
+ jQuery('body').append('<p style="float:left;width:0;height:0;position:absolute;left:-5000;top:-5000;"><input type="hidden" name="'+virtualbuffer_id+'" id="'+virtualbuffer_id+'" value="0" /></p>');
+}
+function updateReaderBuffer(){
+ var i = jQuery('#'+virtualbuffer_id);
+ if (!i.length) return;
+ // incrementons l'input hidden, ce qui a pour effet de forcer le rafraichissement du
+ // buffer du lecteur d'ecran (au moins dans Jaws)
+ i.attr('value',parseInt(i.attr('value'))+1);
+}
+
+// rechargement ajax d'un formulaire dynamique implemente par formulaires/xxx.html
+jQuery.fn.formulaire_dyn_ajax = function(target) {
+ if (this.length)
+ initReaderBuffer();
+ return this.each(function() {
+ var cible = target || this;
+ jQuery('form:not(.noajax,.bouton_action_post)', this).each(function(){
+ var leform = this;
+ var leclk,leclk_x,leclk_y;
+ jQuery(this).prepend("<input type='hidden' name='var_ajax' value='form' />")
+ .ajaxForm({
+ beforeSubmit: function(){
+ // memoriser le bouton clique, en cas de repost non ajax
+ leclk = leform.clk;
+ if (leclk) {
+ var n = leclk.name;
+ if (n && !leclk.disabled && leclk.type == "image") {
+ leclk_x = leform.clk_x;
+ leclk_y = leform.clk_y;
+ }
+ }
+ jQuery(cible).addClass('loading').animeajax();
+ },
+ success: function(c){
+ if (c=='noajax'){
+ // le serveur ne veut pas traiter ce formulaire en ajax
+ // on resubmit sans ajax
+ jQuery("input[name=var_ajax]",leform).remove();
+ // si on a memorise le nom et la valeur du bouton clique
+ // les reinjecter dans le dom sous forme de input hidden
+ // pour que le serveur les recoive
+ if (leclk){
+ var n = leclk.name;
+ if (n && !leclk.disabled) {
+ jQuery(leform).prepend("<input type='hidden' name='"+n+"' value='"+leclk.value+"' />");
+ if (leclk.type == "image") {
+ jQuery(leform).prepend("<input type='hidden' name='"+n+".x' value='"+leform.clk_x+"' />");
+ jQuery(leform).prepend("<input type='hidden' name='"+n+".y' value='"+leform.clk_y+"' />");
+ }
+ }
+ }
+ jQuery(leform).ajaxFormUnbind().submit();
+ }
+ else {
+ var recu = jQuery('<div><\/div>').html(c);
+ var d = jQuery('div.ajax',recu);
+ if (d.length)
+ c = d.html();
+ jQuery(cible)
+ .removeClass('loading')
+ .html(c);
+ var a = jQuery('a:first',recu).eq(0);
+ if (a.length
+ && a.is('a[name=ajax_ancre]')
+ && jQuery(a.attr('href'),cible).length){
+ a = a.attr('href');
+ if (jQuery(a,cible).length)
+ setTimeout(function(){
+ jQuery(a,cible).positionner(true);
+ //a = a.split('#');
+ //window.location.hash = a[1];
+ },10);
+ }
+ else{
+ jQuery(cible).positionner(false);
+ if (a.length && a.is('a[name=ajax_redirect]')){
+ a = a.attr('href');
+ jQuery(cible).addClass('loading').animeajax();
+ setTimeout(function(){
+ document.location.replace(a);
+ },10);
+ }
+ }
+ // on le refait a la main ici car onAjaxLoad intervient sur une iframe dans IE6 et non pas sur le document
+ triggerAjaxLoad(cible);
+ // mettre a jour le buffer du navigateur pour aider jaws et autres readers
+ updateReaderBuffer();
+ }
+ },
+ iframe: jQuery.browser.msie
+ })
+ .addClass('noajax') // previent qu'on n'ajaxera pas deux fois le meme formulaire en cas de ajaxload
+ ;
+ });
+ });
+}
+
+// permettre d'utiliser onclick='return confirm('etes vous sur?');' sur un lien ajax
+var ajax_confirm=true;
+var ajax_confirm_date=0;
+var spip_confirm = window.confirm;
+function _confirm(message){
+ ajax_confirm = spip_confirm(message);
+ if (!ajax_confirm) {
+ var d = new Date();
+ ajax_confirm_date = d.getTime();
+ }
+ return ajax_confirm;
+}
+window.confirm = _confirm;
+
+// rechargement ajax d'une noisette implementee par {ajax}
+// avec mise en cache des url
+var preloaded_urls = {};
+var ajaxbloc_selecteur;
+jQuery.fn.ajaxbloc = function() {
+ if (this.length)
+ initReaderBuffer();
+
+ return this.each(function() {
+ jQuery('div.ajaxbloc',this).ajaxbloc(); // traiter les enfants d'abord
+ var blocfrag = jQuery(this);
+
+ var on_pagination = function(c) {
+ jQuery(blocfrag)
+ .html(c)
+ .removeClass('loading');
+ var a = jQuery('a:first',jQuery(blocfrag)).eq(0);
+ if (a.length
+ && a.is('a[name=ajax_ancre]')
+ && jQuery(a.attr('href'),blocfrag).length){
+ a = a.attr('href')
+ setTimeout(function(){
+ jQuery(a,blocfrag).positionner(true);
+ //a = a.split('#');
+ //window.location.hash = a[1];
+ },10);
+ }
+ else {
+ jQuery(blocfrag).positionner(false);
+ }
+ updateReaderBuffer();
+ }
+
+ var ajax_env = (""+blocfrag.attr('class')).match(/env-([^ ]+)/);
+ if (!ajax_env || ajax_env==undefined) return;
+ ajax_env = ajax_env[1];
+ if (ajaxbloc_selecteur==undefined)
+ ajaxbloc_selecteur = '.pagination a,a.ajax';
+
+ jQuery(ajaxbloc_selecteur,this).not('.noajax').each(function(){
+ var url = this.href.split('#');
+ url[0] += (url[0].indexOf("?")>0 ? '&':'?')+'var_ajax=1&var_ajax_env='+encodeURIComponent(ajax_env);
+ if (url[1])
+ url[0] += "&var_ajax_ancre="+url[1];
+ if (jQuery(this).is('.preload') && !preloaded_urls[url[0]]) {
+ jQuery.ajax({"url":url[0],"success":function(r){preloaded_urls[url[0]]=r;}});
+ }
+ jQuery(this).click(function(){
+ if (!ajax_confirm) {
+ // on rearme pour le prochain clic
+ ajax_confirm=true;
+ var d = new Date();
+ // seule une annulation par confirm() dans les 2 secondes precedentes est prise en compte
+ if ((d.getTime()-ajax_confirm_date)<=2)
+ return false;
+ }
+ jQuery(blocfrag)
+ .animeajax()
+ .addClass('loading');
+ if (preloaded_urls[url[0]]) {
+ on_pagination(preloaded_urls[url[0]]);
+ triggerAjaxLoad(document);
+ } else {
+ jQuery.ajax({
+ url: url[0],
+ success: function(c){
+ on_pagination(c);
+ preloaded_urls[url[0]] = c;
+ }
+ });
+ }
+ return false;
+ });
+ }).addClass('noajax'); // previent qu'on ajax pas deux fois le meme lien
+ jQuery('form.bouton_action_post.ajax:not(.noajax)', this).each(function(){
+ var leform = this;
+ var url = jQuery(this).attr('action').split('#');
+ jQuery(this)
+ .prepend("<input type='hidden' name='var_ajax' value='1' /><input type='hidden' name='var_ajax_env' value='"+(ajax_env)+"' />"+(url[1]?"<input type='hidden' name='var_ajax_ancre' value='"+url[1]+"' />":""))
+ .ajaxForm({
+ beforeSubmit: function(){
+ jQuery(blocfrag).addClass('loading').animeajax();
+ },
+ success: function(c){
+ on_pagination(c);
+ preloaded_urls = {}; // on vide le cache des urls car on a fait une action en bdd
+ // on le refait a la main ici car onAjaxLoad intervient sur une iframe dans IE6 et non pas sur le document
+ jQuery(blocfrag)
+ .ajaxbloc();
+ },
+ iframe: jQuery.browser.msie
+ })
+ .addClass('noajax') // previent qu'on n'ajaxera pas deux fois le meme formulaire en cas de ajaxload
+ ;
+ });
+ });
+};
+
+// Ajaxer les formulaires qui le demandent, au demarrage
+
+jQuery(function() {
+ jQuery('form:not(.bouton_action_post)').parents('div.ajax')
+ .formulaire_dyn_ajax();
+ jQuery('div.ajaxbloc').ajaxbloc();
+});
+
+// ... et a chaque fois que le DOM change
+onAjaxLoad(function() {
+ if (jQuery){
+ jQuery('form:not(.bouton_action_post)', this).parents('div.ajax')
+ .formulaire_dyn_ajax();
+ jQuery('div.ajaxbloc', this)
+ .ajaxbloc();
+ }
+});