Projet

Général

Profil

Paste
Télécharger (3,74 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / ctools / js / ajax-responder.js @ 6e3ce7c2

1
/**
2
 * @file
3
 *
4
 * CTools flexible AJAX responder object.
5
 */
6

    
7
(function ($) {
8
  Drupal.CTools = Drupal.CTools || {};
9
  Drupal.CTools.AJAX = Drupal.CTools.AJAX || {};
10
  /**
11
   * Grab the response from the server and store it.
12
   *
13
   * @todo restore the warm cache functionality
14
   */
15
  Drupal.CTools.AJAX.warmCache = function () {
16
    // Store this expression for a minor speed improvement.
17
    $this = $(this);
18
    var old_url = $this.attr('href');
19
    // If we are currently fetching, or if we have fetched this already which is
20
    // ideal for things like pagers, where the previous page might already have
21
    // been seen in the cache.
22
    if ($this.hasClass('ctools-fetching') || Drupal.CTools.AJAX.commandCache[old_url]) {
23
      return false;
24
    }
25

    
26
    // Grab all the links that match this url and add the fetching class.
27
    // This allows the caching system to grab each url once and only once
28
    // instead of grabbing the url once per <a>.
29
    var $objects = $('a[href="' + old_url + '"]');
30
    $objects.addClass('ctools-fetching');
31
    try {
32
      url = old_url.replace(/\/nojs(\/|$)/g, '/ajax$1');
33
      $.ajax({
34
        type: "POST",
35
        url: url,
36
        data: { 'js': 1, 'ctools_ajax': 1},
37
        global: true,
38
        success: function (data) {
39
          Drupal.CTools.AJAX.commandCache[old_url] = data;
40
          $objects.addClass('ctools-cache-warmed').trigger('ctools-cache-warm', [data]);
41
        },
42
        complete: function() {
43
          $objects.removeClass('ctools-fetching');
44
        },
45
        dataType: 'json'
46
      });
47
    }
48
    catch (err) {
49
      $objects.removeClass('ctools-fetching');
50
      return false;
51
    }
52

    
53
    return false;
54
  };
55

    
56
  /**
57
   * Cachable click handler to fetch the commands out of the cache or from url.
58
   */
59
  Drupal.CTools.AJAX.clickAJAXCacheLink = function () {
60
    $this = $(this);
61
    if ($this.hasClass('ctools-fetching')) {
62
      $this.bind('ctools-cache-warm', function (event, data) {
63
        Drupal.CTools.AJAX.respond(data);
64
      });
65
      return false;
66
    }
67
    else {
68
      if ($this.hasClass('ctools-cache-warmed') && Drupal.CTools.AJAX.commandCache[$this.attr('href')]) {
69
        Drupal.CTools.AJAX.respond(Drupal.CTools.AJAX.commandCache[$this.attr('href')]);
70
        return false;
71
      }
72
      else {
73
        return Drupal.CTools.AJAX.clickAJAXLink.apply(this);
74
      }
75
    }
76
  };
77

    
78
  /**
79
   * Find a URL for an AJAX button.
80
   *
81
   * The URL for this gadget will be composed of the values of items by
82
   * taking the ID of this item and adding -url and looking for that
83
   * class. They need to be in the form in order since we will
84
   * concat them all together using '/'.
85
   */
86
  Drupal.CTools.AJAX.findURL = function(item) {
87
    var url = '';
88
    var url_class = '.' + $(item).attr('id') + '-url';
89
    $(url_class).each(
90
      function() {
91
        var $this = $(this);
92
        if (url && $this.val()) {
93
          url += '/';
94
        }
95
        url += $this.val();
96
      });
97
    return url;
98
  };
99

    
100
  // Hide these in a ready to ensure that Drupal.ajax is set up first.
101
  Drupal.behaviors.ctools_add_ajax_responder_commands = {
102
    attach: function () {
103
      Drupal.ajax.prototype.commands.attr = function (ajax, data, status) {
104
        $(data.selector).attr(data.name, data.value);
105
      };
106

    
107
      Drupal.ajax.prototype.commands.redirect = function (ajax, data, status) {
108
        if (data.delay > 0) {
109
          setTimeout(function () {
110
            location.href = data.url;
111
          }, data.delay);
112
        }
113
        else {
114
          location.href = data.url;
115
        }
116
      };
117

    
118
      Drupal.ajax.prototype.commands.reload = function (ajax, data, status) {
119
        location.reload();
120
      };
121

    
122
      Drupal.ajax.prototype.commands.submit = function (ajax, data, status) {
123
        $(data.selector).submit();
124
      }
125
    }
126
  };
127
})(jQuery);