// $Id$ /** * Provides AJAX-like page updating via AHAH (Asynchronous HTML and HTTP). * * AHAH is a method of making a request via Javascript while viewing an HTML * page. The request returns a small chunk of HTML, which is then directly * injected into the page. * * Drupal uses this file to enhance form elements with #ahah[path] and * #ahah[wrapper] properties. If set, this file will automatically be included * to provide AHAH capabilities. */ /** * Attaches the ahah behavior to each ahah form element. */ Drupal.behaviors.ahah = function(context) { for (var base in Drupal.settings.ahah) { if (!$('#'+ base + '.ahah-processed').size()) { var element_settings = Drupal.settings.ahah[base]; $(element_settings.selector).each(function() { element_settings.element = this; var ahah = new Drupal.ahah(base, element_settings); }); $('#'+ base).addClass('ahah-processed'); } } }; /** * AHAH object. */ Drupal.ahah = function(base, element_settings) { // Set the properties for this object. this.element = element_settings.element; this.selector = element_settings.selector; this.event = element_settings.event; this.url = element_settings.url; this.wrapper = '#'+ element_settings.wrapper; this.effect = element_settings.effect; this.method = element_settings.method; this.progress = element_settings.progress; this.button = element_settings.button || { }; if (this.effect == 'none') { this.showEffect = 'show'; this.hideEffect = 'hide'; this.showSpeed = ''; } else if (this.effect == 'fade') { this.showEffect = 'fadeIn'; this.hideEffect = 'fadeOut'; this.showSpeed = 'slow'; } else { this.showEffect = this.effect + 'Toggle'; this.hideEffect = this.effect + 'Toggle'; this.showSpeed = 'slow'; } // Record the form action and target, needed for iFrame file uploads. var form = $(this.element).parents('form'); this.form_action = form.attr('action'); this.form_target = form.attr('target'); this.form_encattr = form.attr('encattr'); // Set the options for the ajaxSubmit function. // The 'this' variable will not persist inside of the options object. var ahah = this; var options = { url: ahah.url, data: ahah.button, beforeSubmit: function(form_values, element_settings, options) { return ahah.beforeSubmit(form_values, element_settings, options); }, success: function(response, status) { // Sanity check for browser support (object expected). // When using iFrame uploads, responses must be returned as a string. if (typeof(response) == 'string') { response = Drupal.parseJson(response); } return ahah.success(response, status); }, complete: function(response, status) { if (status == 'error') { return ahah.error(response.responseText); } }, dataType: 'json', type: 'POST' }; // Bind the ajaxSubmit function to the element event. $(element_settings.element).bind(element_settings.event, function() { $(element_settings.element).parents('form').ajaxSubmit(options); return false; }); }; /** * Handler for the form redirection submission. */ Drupal.ahah.prototype.beforeSubmit = function (form_values, element, options) { // Disable the element that received the change. $(this.element).addClass('progress-disabled').attr('disabled', true); // Insert progressbar or throbber. if (this.progress.type == 'bar') { var progressBar = new Drupal.progressBar('ahah-progress-' + this.element.id, eval(this.progress.update_callback), this.progress.method, eval(this.progress.error_callback)); if (this.progress.message) { progressBar.setProgress(-1, this.progress.message); } if (this.progress.url) { progressBar.startMonitoring(this.progress.url, this.progress.interval || 1500); } this.progress.element = $(progressBar.element).addClass('ahah-progress ahah-progress-bar'); this.progress.object = progressBar; $(this.element).after(this.progress.element); } else if (this.progress.type == 'throbber') { this.progress.element = $('