Mercurial > hg > rr-repo
diff sites/all/modules/ctools/js/ajax-responder.js @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/ctools/js/ajax-responder.js Wed Aug 21 18:51:11 2013 +0100 @@ -0,0 +1,126 @@ +/** + * @file + * + * CTools flexible AJAX responder object. + */ + +(function ($) { + Drupal.CTools = Drupal.CTools || {}; + Drupal.CTools.AJAX = Drupal.CTools.AJAX || {}; + /** + * Grab the response from the server and store it. + * + * @todo restore the warm cache functionality + */ + Drupal.CTools.AJAX.warmCache = function () { + // Store this expression for a minor speed improvement. + $this = $(this); + var old_url = $this.attr('href'); + // If we are currently fetching, or if we have fetched this already which is + // ideal for things like pagers, where the previous page might already have + // been seen in the cache. + if ($this.hasClass('ctools-fetching') || Drupal.CTools.AJAX.commandCache[old_url]) { + return false; + } + + // Grab all the links that match this url and add the fetching class. + // This allows the caching system to grab each url once and only once + // instead of grabbing the url once per <a>. + var $objects = $('a[href="' + old_url + '"]') + $objects.addClass('ctools-fetching'); + try { + url = old_url.replace(/\/nojs(\/|$)/g, '/ajax$1'); + $.ajax({ + type: "POST", + url: url, + data: { 'js': 1, 'ctools_ajax': 1}, + global: true, + success: function (data) { + Drupal.CTools.AJAX.commandCache[old_url] = data; + $objects.addClass('ctools-cache-warmed').trigger('ctools-cache-warm', [data]); + }, + complete: function() { + $objects.removeClass('ctools-fetching'); + }, + dataType: 'json' + }); + } + catch (err) { + $objects.removeClass('ctools-fetching'); + return false; + } + + return false; + }; + + /** + * Cachable click handler to fetch the commands out of the cache or from url. + */ + Drupal.CTools.AJAX.clickAJAXCacheLink = function () { + $this = $(this); + if ($this.hasClass('ctools-fetching')) { + $this.bind('ctools-cache-warm', function (event, data) { + Drupal.CTools.AJAX.respond(data); + }); + return false; + } + else { + if ($this.hasClass('ctools-cache-warmed') && Drupal.CTools.AJAX.commandCache[$this.attr('href')]) { + Drupal.CTools.AJAX.respond(Drupal.CTools.AJAX.commandCache[$this.attr('href')]); + return false; + } + else { + return Drupal.CTools.AJAX.clickAJAXLink.apply(this); + } + } + }; + + /** + * Find a URL for an AJAX button. + * + * The URL for this gadget will be composed of the values of items by + * taking the ID of this item and adding -url and looking for that + * class. They need to be in the form in order since we will + * concat them all together using '/'. + */ + Drupal.CTools.AJAX.findURL = function(item) { + var url = ''; + var url_class = '.' + $(item).attr('id') + '-url'; + $(url_class).each( + function() { + var $this = $(this); + if (url && $this.val()) { + url += '/'; + } + url += $this.val(); + }); + return url; + }; + + // Hide these in a ready to ensure that Drupal.ajax is set up first. + $(function() { + Drupal.ajax.prototype.commands.attr = function(ajax, data, status) { + $(data.selector).attr(data.name, data.value); + }; + + + Drupal.ajax.prototype.commands.redirect = function(ajax, data, status) { + if (data.delay > 0) { + setTimeout(function () { + location.href = data.url; + }, data.delay); + } + else { + location.href = data.url; + } + }; + + Drupal.ajax.prototype.commands.reload = function(ajax, data, status) { + location.reload(); + }; + + Drupal.ajax.prototype.commands.submit = function(ajax, data, status) { + $(data.selector).submit(); + } + }); +})(jQuery);