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