// $Id$ /** * @file ajaxView.js * * Handles AJAX fetching of views, including filter submission and response. */ Drupal.Views.Ajax = Drupal.Views.Ajax || {}; /** * An ajax responder that accepts a packet of JSON data and acts appropriately. * * The following fields control behavior. * - 'display': Display the associated data in the view area. */ Drupal.Views.Ajax.ajaxViewResponse = function(target, response) { if (response.debug) { alert(response.debug); } // Check the 'display' for data. if (response.status && response.display) { var view = $(target).replaceWith(response.display).get(0); Drupal.attachBehaviors(view); } }; /** * Ajax behavior for views. */ Drupal.behaviors.ViewsAjaxView = function() { var ajax_path = Drupal.settings.views.ajax_path; // If there are multiple views this might've ended up showing up multiple times. if (ajax_path.constructor.toString().indexOf("Array") != -1) { ajax_path = ajax_path[0]; } if (Drupal.settings && Drupal.settings.views && Drupal.settings.views.ajaxViews) { $.each(Drupal.settings.views.ajaxViews, function(i, settings) { var target; $('.view-id-'+ settings.view_name +'.view-display-id-'+ settings.view_display_id +':not(.views-processed)') .addClass('views-processed') .each(function () { target = $(this).get(0); }) // Process exposed filter forms. .find('form#views-exposed-form') .each(function () { var form = this; // ajaxSubmit doesn't accept a data argument, so we have to // pass additional fields this way. $.each(settings, function(key, setting) { $(form).append(''); }); }) .submit(function () { $('input[@type=submit]', this).after(' '); $(this).ajaxSubmit({ url: ajax_path, type: 'GET', success: function(response) { // Call all callbacks. if (response.__callbacks) { $.each(response.__callbacks, function(i, callback) { eval(callback)(target, response); }); } }, error: function() { alert(Drupal.t("An error occurred.")); }, dataType: 'json' }); return false; }) .end() // Process pager links. .find('ul.pager > li > a') .each(function () { var viewData = Drupal.Views.parseQueryString($(this).attr('href')); $.each(settings, function (key, setting) { viewData[key] = setting; }); $(this) .click(function () { $(this).addClass('views-throbbing'); $.ajax({ url: ajax_path, type: 'GET', data: viewData, success: function(response) { $(this).removeClass('views-throbbing'); // Call all callbacks. if (response.__callbacks) { $.each(response.__callbacks, function(i, callback) { eval(callback)(target, response); }); } }, error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred.")); }, dataType: 'json' }); return false; }); }) .end() // Process tablesort links. .find('th.views-field a') .each(function () { var viewData = Drupal.Views.parseQueryString($(this).attr('href')); $.each(settings, function (key, setting) { viewData[key] = setting; }); $(this) .click(function () { $(this).addClass('views-throbbing'); $.ajax({ url: ajax_path, type: 'GET', data: viewData, success: function(response) { $(this).removeClass('views-throbbing'); // Call all callbacks. if (response.__callbacks) { $.each(response.__callbacks, function(i, callback) { eval(callback)(target, response); }); } }, error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred.")); }, dataType: 'json' }); return false; }); }); }); } };