// $Id$
/**
* @file ajax_admin.js
*
* Handles AJAX submission and response in Views UI.
*/
Drupal.Views.Ajax = Drupal.Views.Ajax || {};
/**
* Handles the simple process of setting the ajax form area with new data.
*/
Drupal.Views.Ajax.setForm = function(title, output) {
$(Drupal.settings.views.ajax.title).html(title);
$(Drupal.settings.views.ajax.id).html(output);
}
/**
* 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 form area; bind the new
* form to 'url' if appropriate. The 'title' field may also be used.
* - 'add': This is a keyed array of HTML output to add via append. The key is
* the id to append via $(key).append(value)
* - 'replace': This is a keyed array of HTML output to add via replace. The key is
* the id to append via $(key).html(value)
*
*/
Drupal.Views.Ajax.ajaxResponse = function(data) {
$('a.views-throbbing').removeClass('views-throbbing');
$('span.views-throbbing').remove();
if (data.debug) {
alert(data.debug);
}
// See if we have any settings to extend. Do this first so that behaviors
// can access the new settings easily.
if (Drupal.settings.viewsAjax) {
Drupal.settings.viewsAjax = {};
}
if (data.js) {
$.extend(Drupal.settings, data.js);
}
// Check the 'display' for data.
if (data.display) {
Drupal.Views.Ajax.setForm(data.title, data.display);
// if a URL was supplied, bind the form to it.
if (data.url) {
var ajax_area = Drupal.settings.views.ajax.id;
var ajax_title = Drupal.settings.views.ajax.title;
// Bind a click to the button to set the value for the button.
$('input[type=submit]', ajax_area).unbind('click');
$('input[type=submit]', ajax_area).click(function() {
$('form', ajax_area).append('');
$(this).after(' ');
});
// Bind forms to ajax submit.
$('form', ajax_area).unbind('submit'); // be safe here.
$('form', ajax_area).submit(function(arg) {
$(this).ajaxSubmit({
url: data.url,
data: '',
type: 'POST',
success: Drupal.Views.Ajax.ajaxResponse,
error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
});
}
Drupal.attachBehaviors(ajax_area);
}
else {
// If no display, reset the form.
Drupal.Views.Ajax.setForm('', Drupal.settings.views.ajax.defaultForm);
//Enable the save button.
$('#edit-save').removeAttr('disabled');
// Trigger an update for the live preview when we reach this state:
$('#views-ui-preview-form').trigger('submit');
}
// Go through the 'add' array and add any new content we're instructed to add.
if (data.add) {
for (id in data.add) {
var newContent = $(id).append(data.add[id]);
Drupal.attachBehaviors(newContent);
}
}
// Go through the 'replace' array and replace any content we're instructed to.
if (data.replace) {
for (id in data.replace) {
$(id).html(data.replace[id]);
Drupal.attachBehaviors(id);
}
}
// Go through and add any requested tabs
if (data.tab) {
for (id in data.tab) {
$('#views-tabset').addTab(id, data.tab[id]['title'], 0);
$(id).html(data.tab[id]['body']);
$(id).addClass('views-tab');
Drupal.attachBehaviors(id);
// This is kind of annoying, but we have to actually to find where the new
// tab is.
var instance = $.ui.tabs.instances[$('#views-tabset').get(0).UI_TABS_UUID];
$('#views-tabset').clickTab(instance.$tabs.length);
}
}
if (data.hilite) {
$('.hilited').removeClass('hilited');
$(data.hilite).addClass('hilited');
}
if (data.changed) {
$('div.views-basic-info').addClass('changed');
}
}
/**
* An ajax responder that accepts a packet of JSON data and acts appropriately.
* This one specifically responds to the Views live preview area, so it's
* hardcoded and specialized.
*/
Drupal.Views.Ajax.previewResponse = function(data) {
$('a.views-throbbing').removeClass('views-throbbing');
$('span.views-throbbing').remove();
if (data.debug) {
alert(data.debug);
}
// See if we have any settings to extend. Do this first so that behaviors
// can access the new settings easily.
// Clear any previous viewsAjax settings.
if (Drupal.settings.viewsAjax) {
Drupal.settings.viewsAjax = {};
}
if (data.js) {
$.extend(Drupal.settings, data.js);
}
// Check the 'display' for data.
if (data.display) {
var ajax_area = 'div#views-live-preview';
$(ajax_area).html(data.display);
var url = $(ajax_area, 'form').attr('action');
// if a URL was supplied, bind the form to it.
if (url) {
// Bind a click to the button to set the value for the button.
$('input[type=submit]', ajax_area).unbind('click');
$('input[type=submit]', ajax_area).click(function() {
$('form', ajax_area).append('');
$(this).after(' ');
});
// Bind forms to ajax submit.
$('form', ajax_area).unbind('submit'); // be safe here.
$('form', ajax_area).submit(function() {
$(this).ajaxSubmit({
url: url,
data: '',
type: 'POST',
success: Drupal.Views.Ajax.previewResponse,
error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
});
}
Drupal.attachBehaviors(ajax_area);
}
}
Drupal.Views.updatePreviewForm = function() {
var url = $(this).attr('action');
url = url.replace('nojs', 'ajax');
$('input[@type=submit]', this).after(' ');
$(this).ajaxSubmit({
url: url,
data: '',
type: 'POST',
success: Drupal.Views.Ajax.previewResponse,
error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
}
Drupal.Views.updatePreviewFilterForm = function() {
var url = $(this).attr('action');
url = url.replace('nojs', 'ajax');
$('input[@type=submit]', this).after(' ');
$(this).ajaxSubmit({
url: url,
data: '',
type: 'GET',
success: Drupal.Views.Ajax.previewResponse,
error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
}
Drupal.Views.updatePreviewLink = function() {
var url = $(this).attr('href');
url = url.replace('nojs', 'ajax');
if (url.substring(0, 18) != '/admin/build/views') {
return true;
}
$(this).addClass('views-throbbing');
$.ajax({
url: url,
data: '',
type: 'GET',
success: Drupal.Views.Ajax.previewResponse,
error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
}
Drupal.behaviors.ViewsAjaxLinks = function() {
// Make specified links ajaxy.
$('a.views-ajax-link:not(.views-processed)').addClass('views-processed').click(function() {
// Translate the href on the link to the ajax href. That way this degrades
// into a nice, normal link.
var url = $(this).attr('href');
url = url.replace('nojs', 'ajax');
// Turn on the hilite to indicate this is in use.
$(this).addClass('hilite');
//Disable the save button.
$('#edit-save').attr('disabled', 'true');
$(this).addClass('views-throbbing');
$.ajax({
type: "GET",
url: url,
data: '',
success: Drupal.Views.Ajax.ajaxResponse,
error: function() { $(this).removeClass('views-throbbing'); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
});
$('form.views-ajax-form:not(.views-processed)').addClass('views-processed').submit(function(arg) {
// Translate the href on the link to the ajax href. That way this degrades
// into a nice, normal link.
var url = $(this).attr('action');
url = url.replace('nojs', 'ajax');
// $('input[@type=submit]', this).after(' ');
$(this).ajaxSubmit({
url: url,
data: '',
type: 'POST',
success: Drupal.Views.Ajax.ajaxResponse,
error: function() { $('span.views-throbbing').remove(); alert(Drupal.t("An error occurred.")); },
dataType: 'json'
});
return false;
});
// Bind the live preview to where it's supposed to go.
$('form#views-ui-preview-form:not(.views-processed)')
.addClass('views-processed')
.submit(Drupal.Views.updatePreviewForm);
$('div#views-live-preview form:not(.views-processed)')
.addClass('views-processed')
.submit(Drupal.Views.updatePreviewFilterForm);
$('div#views-live-preview a:not(.views-processed)')
.addClass('views-processed')
.click(Drupal.Views.updatePreviewLink);
}