danielebarchiesi@0: /** danielebarchiesi@0: * @file danielebarchiesi@0: * Attaches the behaviors for the Overlay child pages. danielebarchiesi@0: */ danielebarchiesi@0: danielebarchiesi@0: (function ($) { danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Attach the child dialog behavior to new content. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.behaviors.overlayChild = { danielebarchiesi@0: attach: function (context, settings) { danielebarchiesi@0: // Make sure this behavior is not processed more than once. danielebarchiesi@0: if (this.processed) { danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: this.processed = true; danielebarchiesi@0: danielebarchiesi@0: // If we cannot reach the parent window, break out of the overlay. danielebarchiesi@0: if (!parent.Drupal || !parent.Drupal.overlay) { danielebarchiesi@0: window.location = window.location.href.replace(/([?&]?)render=overlay&?/g, '$1').replace(/\?$/, ''); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: var settings = settings.overlayChild || {}; danielebarchiesi@0: danielebarchiesi@0: // If the entire parent window should be refreshed when the overlay is danielebarchiesi@0: // closed, pass that information to the parent window. danielebarchiesi@0: if (settings.refreshPage) { danielebarchiesi@0: parent.Drupal.overlay.refreshPage = true; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If a form has been submitted successfully, then the server side script danielebarchiesi@0: // may have decided to tell the parent window to close the popup dialog. danielebarchiesi@0: if (settings.closeOverlay) { danielebarchiesi@0: parent.Drupal.overlay.bindChild(window, true); danielebarchiesi@0: // Use setTimeout to close the child window from a separate thread, danielebarchiesi@0: // because the current one is busy processing Drupal behaviors. danielebarchiesi@0: setTimeout(function () { danielebarchiesi@0: if (typeof settings.redirect == 'string') { danielebarchiesi@0: parent.Drupal.overlay.redirect(settings.redirect); danielebarchiesi@0: } danielebarchiesi@0: else { danielebarchiesi@0: parent.Drupal.overlay.close(); danielebarchiesi@0: } danielebarchiesi@0: }, 1); danielebarchiesi@0: return; danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // If one of the regions displaying outside the overlay needs to be danielebarchiesi@0: // reloaded immediately, let the parent window know. danielebarchiesi@0: if (settings.refreshRegions) { danielebarchiesi@0: parent.Drupal.overlay.refreshRegions(settings.refreshRegions); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: // Ok, now we can tell the parent window we're ready. danielebarchiesi@0: parent.Drupal.overlay.bindChild(window); danielebarchiesi@0: danielebarchiesi@0: // IE8 crashes on certain pages if this isn't called; reason unknown. danielebarchiesi@0: window.scrollTo(window.scrollX, window.scrollY); danielebarchiesi@0: danielebarchiesi@0: // Attach child related behaviors to the iframe document. danielebarchiesi@0: Drupal.overlayChild.attachBehaviors(context, settings); danielebarchiesi@0: danielebarchiesi@0: // There are two links within the message that informs people about the danielebarchiesi@0: // overlay and how to disable it. Make sure both links are visible when danielebarchiesi@0: // either one has focus and add a class to the wrapper for styling purposes. danielebarchiesi@0: $('#overlay-disable-message', context) danielebarchiesi@0: .focusin(function () { danielebarchiesi@0: $(this).addClass('overlay-disable-message-focused'); danielebarchiesi@0: $('a.element-focusable', this).removeClass('element-invisible'); danielebarchiesi@0: }) danielebarchiesi@0: .focusout(function () { danielebarchiesi@0: $(this).removeClass('overlay-disable-message-focused'); danielebarchiesi@0: $('a.element-focusable', this).addClass('element-invisible'); danielebarchiesi@0: }); danielebarchiesi@0: } danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Overlay object for child windows. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild = Drupal.overlayChild || { danielebarchiesi@0: behaviors: {} danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: Drupal.overlayChild.prototype = {}; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Attach child related behaviors to the iframe document. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.attachBehaviors = function (context, settings) { danielebarchiesi@0: $.each(this.behaviors, function () { danielebarchiesi@0: this(context, settings); danielebarchiesi@0: }); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Capture and handle clicks. danielebarchiesi@0: * danielebarchiesi@0: * Instead of binding a click event handler to every link we bind one to the danielebarchiesi@0: * document and handle events that bubble up. This also allows other scripts danielebarchiesi@0: * to bind their own handlers to links and also to prevent overlay's handling. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.behaviors.addClickHandler = function (context, settings) { danielebarchiesi@0: $(document).bind('click.drupal-overlay mouseup.drupal-overlay', $.proxy(parent.Drupal.overlay, 'eventhandlerOverrideLink')); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Modify forms depending on their relation to the overlay. danielebarchiesi@0: * danielebarchiesi@0: * By default, forms are assumed to keep the flow in the overlay. Thus their danielebarchiesi@0: * action attribute get a ?render=overlay suffix. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.behaviors.parseForms = function (context, settings) { danielebarchiesi@0: $('form', context).once('overlay', function () { danielebarchiesi@0: // Obtain the action attribute of the form. danielebarchiesi@0: var action = $(this).attr('action'); danielebarchiesi@0: // Keep internal forms in the overlay. danielebarchiesi@0: if (action == undefined || (action.indexOf('http') != 0 && action.indexOf('https') != 0)) { danielebarchiesi@0: action += (action.indexOf('?') > -1 ? '&' : '?') + 'render=overlay'; danielebarchiesi@0: $(this).attr('action', action); danielebarchiesi@0: } danielebarchiesi@0: // Submit external forms into a new window. danielebarchiesi@0: else { danielebarchiesi@0: $(this).attr('target', '_new'); danielebarchiesi@0: } danielebarchiesi@0: }); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Replace the overlay title with a message while loading another page. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.behaviors.loading = function (context, settings) { danielebarchiesi@0: var $title; danielebarchiesi@0: var text = Drupal.t('Loading'); danielebarchiesi@0: var dots = ''; danielebarchiesi@0: danielebarchiesi@0: $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () { danielebarchiesi@0: $title = $('#overlay-title').text(text); danielebarchiesi@0: var id = setInterval(function () { danielebarchiesi@0: dots = (dots.length > 10) ? '' : dots + '.'; danielebarchiesi@0: $title.text(text + dots); danielebarchiesi@0: }, 500); danielebarchiesi@0: }); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Switch active tab immediately. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.behaviors.tabs = function (context, settings) { danielebarchiesi@0: var $tabsLinks = $('#overlay-tabs > li > a'); danielebarchiesi@0: danielebarchiesi@0: $('#overlay-tabs > li > a').bind('click.drupal-overlay', function () { danielebarchiesi@0: var active_tab = Drupal.t('(active tab)'); danielebarchiesi@0: $tabsLinks.parent().siblings().removeClass('active').find('element-invisible:contains(' + active_tab + ')').appendTo(this); danielebarchiesi@0: $(this).parent().addClass('active'); danielebarchiesi@0: }); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * If the shortcut add/delete button exists, move it to the overlay titlebar. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.behaviors.shortcutAddLink = function (context, settings) { danielebarchiesi@0: // Remove any existing shortcut button markup from the titlebar. danielebarchiesi@0: $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove(); danielebarchiesi@0: // If the shortcut add/delete button exists, move it to the titlebar. danielebarchiesi@0: var $addToShortcuts = $('.add-or-remove-shortcuts'); danielebarchiesi@0: if ($addToShortcuts.length) { danielebarchiesi@0: $addToShortcuts.insertAfter('#overlay-title'); danielebarchiesi@0: } danielebarchiesi@0: danielebarchiesi@0: $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () { danielebarchiesi@0: $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove(); danielebarchiesi@0: }); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Use displacement from parent window. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.behaviors.alterTableHeaderOffset = function (context, settings) { danielebarchiesi@0: if (Drupal.settings.tableHeaderOffset) { danielebarchiesi@0: Drupal.overlayChild.prevTableHeaderOffset = Drupal.settings.tableHeaderOffset; danielebarchiesi@0: } danielebarchiesi@0: Drupal.settings.tableHeaderOffset = 'Drupal.overlayChild.tableHeaderOffset'; danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: /** danielebarchiesi@0: * Callback for Drupal.settings.tableHeaderOffset. danielebarchiesi@0: */ danielebarchiesi@0: Drupal.overlayChild.tableHeaderOffset = function () { danielebarchiesi@0: var topOffset = Drupal.overlayChild.prevTableHeaderOffset ? eval(Drupal.overlayChild.prevTableHeaderOffset + '()') : 0; danielebarchiesi@0: danielebarchiesi@0: return topOffset + parseInt($(document.body).css('marginTop')); danielebarchiesi@0: }; danielebarchiesi@0: danielebarchiesi@0: })(jQuery);