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