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);
|