annotate modules/overlay/overlay-child.js @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 /**
danielebarchiesi@0 2 * @file
danielebarchiesi@0 3 * Attaches the behaviors for the Overlay child pages.
danielebarchiesi@0 4 */
danielebarchiesi@0 5
danielebarchiesi@0 6 (function ($) {
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Attach the child dialog behavior to new content.
danielebarchiesi@0 10 */
danielebarchiesi@0 11 Drupal.behaviors.overlayChild = {
danielebarchiesi@0 12 attach: function (context, settings) {
danielebarchiesi@0 13 // Make sure this behavior is not processed more than once.
danielebarchiesi@0 14 if (this.processed) {
danielebarchiesi@0 15 return;
danielebarchiesi@0 16 }
danielebarchiesi@0 17 this.processed = true;
danielebarchiesi@0 18
danielebarchiesi@0 19 // If we cannot reach the parent window, break out of the overlay.
danielebarchiesi@0 20 if (!parent.Drupal || !parent.Drupal.overlay) {
danielebarchiesi@0 21 window.location = window.location.href.replace(/([?&]?)render=overlay&?/g, '$1').replace(/\?$/, '');
danielebarchiesi@0 22 }
danielebarchiesi@0 23
danielebarchiesi@0 24 var settings = settings.overlayChild || {};
danielebarchiesi@0 25
danielebarchiesi@0 26 // If the entire parent window should be refreshed when the overlay is
danielebarchiesi@0 27 // closed, pass that information to the parent window.
danielebarchiesi@0 28 if (settings.refreshPage) {
danielebarchiesi@0 29 parent.Drupal.overlay.refreshPage = true;
danielebarchiesi@0 30 }
danielebarchiesi@0 31
danielebarchiesi@0 32 // If a form has been submitted successfully, then the server side script
danielebarchiesi@0 33 // may have decided to tell the parent window to close the popup dialog.
danielebarchiesi@0 34 if (settings.closeOverlay) {
danielebarchiesi@0 35 parent.Drupal.overlay.bindChild(window, true);
danielebarchiesi@0 36 // Use setTimeout to close the child window from a separate thread,
danielebarchiesi@0 37 // because the current one is busy processing Drupal behaviors.
danielebarchiesi@0 38 setTimeout(function () {
danielebarchiesi@0 39 if (typeof settings.redirect == 'string') {
danielebarchiesi@0 40 parent.Drupal.overlay.redirect(settings.redirect);
danielebarchiesi@0 41 }
danielebarchiesi@0 42 else {
danielebarchiesi@0 43 parent.Drupal.overlay.close();
danielebarchiesi@0 44 }
danielebarchiesi@0 45 }, 1);
danielebarchiesi@0 46 return;
danielebarchiesi@0 47 }
danielebarchiesi@0 48
danielebarchiesi@0 49 // If one of the regions displaying outside the overlay needs to be
danielebarchiesi@0 50 // reloaded immediately, let the parent window know.
danielebarchiesi@0 51 if (settings.refreshRegions) {
danielebarchiesi@0 52 parent.Drupal.overlay.refreshRegions(settings.refreshRegions);
danielebarchiesi@0 53 }
danielebarchiesi@0 54
danielebarchiesi@0 55 // Ok, now we can tell the parent window we're ready.
danielebarchiesi@0 56 parent.Drupal.overlay.bindChild(window);
danielebarchiesi@0 57
danielebarchiesi@0 58 // IE8 crashes on certain pages if this isn't called; reason unknown.
danielebarchiesi@0 59 window.scrollTo(window.scrollX, window.scrollY);
danielebarchiesi@0 60
danielebarchiesi@0 61 // Attach child related behaviors to the iframe document.
danielebarchiesi@0 62 Drupal.overlayChild.attachBehaviors(context, settings);
danielebarchiesi@0 63
danielebarchiesi@0 64 // There are two links within the message that informs people about the
danielebarchiesi@0 65 // overlay and how to disable it. Make sure both links are visible when
danielebarchiesi@0 66 // either one has focus and add a class to the wrapper for styling purposes.
danielebarchiesi@0 67 $('#overlay-disable-message', context)
danielebarchiesi@0 68 .focusin(function () {
danielebarchiesi@0 69 $(this).addClass('overlay-disable-message-focused');
danielebarchiesi@0 70 $('a.element-focusable', this).removeClass('element-invisible');
danielebarchiesi@0 71 })
danielebarchiesi@0 72 .focusout(function () {
danielebarchiesi@0 73 $(this).removeClass('overlay-disable-message-focused');
danielebarchiesi@0 74 $('a.element-focusable', this).addClass('element-invisible');
danielebarchiesi@0 75 });
danielebarchiesi@0 76 }
danielebarchiesi@0 77 };
danielebarchiesi@0 78
danielebarchiesi@0 79 /**
danielebarchiesi@0 80 * Overlay object for child windows.
danielebarchiesi@0 81 */
danielebarchiesi@0 82 Drupal.overlayChild = Drupal.overlayChild || {
danielebarchiesi@0 83 behaviors: {}
danielebarchiesi@0 84 };
danielebarchiesi@0 85
danielebarchiesi@0 86 Drupal.overlayChild.prototype = {};
danielebarchiesi@0 87
danielebarchiesi@0 88 /**
danielebarchiesi@0 89 * Attach child related behaviors to the iframe document.
danielebarchiesi@0 90 */
danielebarchiesi@0 91 Drupal.overlayChild.attachBehaviors = function (context, settings) {
danielebarchiesi@0 92 $.each(this.behaviors, function () {
danielebarchiesi@0 93 this(context, settings);
danielebarchiesi@0 94 });
danielebarchiesi@0 95 };
danielebarchiesi@0 96
danielebarchiesi@0 97 /**
danielebarchiesi@0 98 * Capture and handle clicks.
danielebarchiesi@0 99 *
danielebarchiesi@0 100 * Instead of binding a click event handler to every link we bind one to the
danielebarchiesi@0 101 * document and handle events that bubble up. This also allows other scripts
danielebarchiesi@0 102 * to bind their own handlers to links and also to prevent overlay's handling.
danielebarchiesi@0 103 */
danielebarchiesi@0 104 Drupal.overlayChild.behaviors.addClickHandler = function (context, settings) {
danielebarchiesi@0 105 $(document).bind('click.drupal-overlay mouseup.drupal-overlay', $.proxy(parent.Drupal.overlay, 'eventhandlerOverrideLink'));
danielebarchiesi@0 106 };
danielebarchiesi@0 107
danielebarchiesi@0 108 /**
danielebarchiesi@0 109 * Modify forms depending on their relation to the overlay.
danielebarchiesi@0 110 *
danielebarchiesi@0 111 * By default, forms are assumed to keep the flow in the overlay. Thus their
danielebarchiesi@0 112 * action attribute get a ?render=overlay suffix.
danielebarchiesi@0 113 */
danielebarchiesi@0 114 Drupal.overlayChild.behaviors.parseForms = function (context, settings) {
danielebarchiesi@0 115 $('form', context).once('overlay', function () {
danielebarchiesi@0 116 // Obtain the action attribute of the form.
danielebarchiesi@0 117 var action = $(this).attr('action');
danielebarchiesi@0 118 // Keep internal forms in the overlay.
danielebarchiesi@0 119 if (action == undefined || (action.indexOf('http') != 0 && action.indexOf('https') != 0)) {
danielebarchiesi@0 120 action += (action.indexOf('?') > -1 ? '&' : '?') + 'render=overlay';
danielebarchiesi@0 121 $(this).attr('action', action);
danielebarchiesi@0 122 }
danielebarchiesi@0 123 // Submit external forms into a new window.
danielebarchiesi@0 124 else {
danielebarchiesi@0 125 $(this).attr('target', '_new');
danielebarchiesi@0 126 }
danielebarchiesi@0 127 });
danielebarchiesi@0 128 };
danielebarchiesi@0 129
danielebarchiesi@0 130 /**
danielebarchiesi@0 131 * Replace the overlay title with a message while loading another page.
danielebarchiesi@0 132 */
danielebarchiesi@0 133 Drupal.overlayChild.behaviors.loading = function (context, settings) {
danielebarchiesi@0 134 var $title;
danielebarchiesi@0 135 var text = Drupal.t('Loading');
danielebarchiesi@0 136 var dots = '';
danielebarchiesi@0 137
danielebarchiesi@0 138 $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () {
danielebarchiesi@0 139 $title = $('#overlay-title').text(text);
danielebarchiesi@0 140 var id = setInterval(function () {
danielebarchiesi@0 141 dots = (dots.length > 10) ? '' : dots + '.';
danielebarchiesi@0 142 $title.text(text + dots);
danielebarchiesi@0 143 }, 500);
danielebarchiesi@0 144 });
danielebarchiesi@0 145 };
danielebarchiesi@0 146
danielebarchiesi@0 147 /**
danielebarchiesi@0 148 * Switch active tab immediately.
danielebarchiesi@0 149 */
danielebarchiesi@0 150 Drupal.overlayChild.behaviors.tabs = function (context, settings) {
danielebarchiesi@0 151 var $tabsLinks = $('#overlay-tabs > li > a');
danielebarchiesi@0 152
danielebarchiesi@0 153 $('#overlay-tabs > li > a').bind('click.drupal-overlay', function () {
danielebarchiesi@0 154 var active_tab = Drupal.t('(active tab)');
danielebarchiesi@0 155 $tabsLinks.parent().siblings().removeClass('active').find('element-invisible:contains(' + active_tab + ')').appendTo(this);
danielebarchiesi@0 156 $(this).parent().addClass('active');
danielebarchiesi@0 157 });
danielebarchiesi@0 158 };
danielebarchiesi@0 159
danielebarchiesi@0 160 /**
danielebarchiesi@0 161 * If the shortcut add/delete button exists, move it to the overlay titlebar.
danielebarchiesi@0 162 */
danielebarchiesi@0 163 Drupal.overlayChild.behaviors.shortcutAddLink = function (context, settings) {
danielebarchiesi@0 164 // Remove any existing shortcut button markup from the titlebar.
danielebarchiesi@0 165 $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove();
danielebarchiesi@0 166 // If the shortcut add/delete button exists, move it to the titlebar.
danielebarchiesi@0 167 var $addToShortcuts = $('.add-or-remove-shortcuts');
danielebarchiesi@0 168 if ($addToShortcuts.length) {
danielebarchiesi@0 169 $addToShortcuts.insertAfter('#overlay-title');
danielebarchiesi@0 170 }
danielebarchiesi@0 171
danielebarchiesi@0 172 $(document).bind('drupalOverlayBeforeLoad.drupal-overlay.drupal-overlay-child-loading', function () {
danielebarchiesi@0 173 $('#overlay-titlebar').find('.add-or-remove-shortcuts').remove();
danielebarchiesi@0 174 });
danielebarchiesi@0 175 };
danielebarchiesi@0 176
danielebarchiesi@0 177 /**
danielebarchiesi@0 178 * Use displacement from parent window.
danielebarchiesi@0 179 */
danielebarchiesi@0 180 Drupal.overlayChild.behaviors.alterTableHeaderOffset = function (context, settings) {
danielebarchiesi@0 181 if (Drupal.settings.tableHeaderOffset) {
danielebarchiesi@0 182 Drupal.overlayChild.prevTableHeaderOffset = Drupal.settings.tableHeaderOffset;
danielebarchiesi@0 183 }
danielebarchiesi@0 184 Drupal.settings.tableHeaderOffset = 'Drupal.overlayChild.tableHeaderOffset';
danielebarchiesi@0 185 };
danielebarchiesi@0 186
danielebarchiesi@0 187 /**
danielebarchiesi@0 188 * Callback for Drupal.settings.tableHeaderOffset.
danielebarchiesi@0 189 */
danielebarchiesi@0 190 Drupal.overlayChild.tableHeaderOffset = function () {
danielebarchiesi@0 191 var topOffset = Drupal.overlayChild.prevTableHeaderOffset ? eval(Drupal.overlayChild.prevTableHeaderOffset + '()') : 0;
danielebarchiesi@0 192
danielebarchiesi@0 193 return topOffset + parseInt($(document.body).css('marginTop'));
danielebarchiesi@0 194 };
danielebarchiesi@0 195
danielebarchiesi@0 196 })(jQuery);