source: main/trunk/greenstone3/web/interfaces/default/js/jquery.blockUI.js@ 32127

Last change on this file since 32127 was 28942, checked in by ak19, 10 years ago

When testing on the Win 7 machine with Firefox, the jquery.blockUI.js file caused popups on every page load, because its test for whether the blockUI version was too old was faulty. I downloaded a newer jquery.blockUI.js from malsup.github.io/jquery.blockUI.js. This steps up the version from 2.50 to 2.66. The old version now has a _2.50 suffix in case we ever need to return to it. Dr Bainbridge suggested leaving the file on svn for now along with this descriptive commit comment, as an indicator for what changed and why.

  • Property svn:executable set to *
File size: 19.4 KB
Line 
1/*!
2 * jQuery blockUI plugin
3 * Version 2.66.0-2013.10.09
4 * Requires jQuery v1.7 or later
5 *
6 * Examples at: http://malsup.com/jquery/block/
7 * Copyright (c) 2007-2013 M. Alsup
8 * Dual licensed under the MIT and GPL licenses:
9 * http://www.opensource.org/licenses/mit-license.php
10 * http://www.gnu.org/licenses/gpl.html
11 *
12 * Thanks to Amir-Hossein Sobhi for some excellent contributions!
13 */
14
15;(function() {
16/*jshint eqeqeq:false curly:false latedef:false */
17"use strict";
18
19 function setup($) {
20 $.fn._fadeIn = $.fn.fadeIn;
21
22 var noOp = $.noop || function() {};
23
24 // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
25 // confusing userAgent strings on Vista)
26 var msie = /MSIE/.test(navigator.userAgent);
27 var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);
28 var mode = document.documentMode || 0;
29 var setExpr = $.isFunction( document.createElement('div').style.setExpression );
30
31 // global $ methods for blocking/unblocking the entire page
32 $.blockUI = function(opts) { install(window, opts); };
33 $.unblockUI = function(opts) { remove(window, opts); };
34
35 // convenience method for quick growl-like notifications (http://www.google.com/search?q=growl)
36 $.growlUI = function(title, message, timeout, onClose) {
37 var $m = $('<div class="growlUI"></div>');
38 if (title) $m.append('<h1>'+title+'</h1>');
39 if (message) $m.append('<h2>'+message+'</h2>');
40 if (timeout === undefined) timeout = 3000;
41
42 // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications
43 var callBlock = function(opts) {
44 opts = opts || {};
45
46 $.blockUI({
47 message: $m,
48 fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,
49 fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,
50 timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,
51 centerY: false,
52 showOverlay: false,
53 onUnblock: onClose,
54 css: $.blockUI.defaults.growlCSS
55 });
56 };
57
58 callBlock();
59 var nonmousedOpacity = $m.css('opacity');
60 $m.mouseover(function() {
61 callBlock({
62 fadeIn: 0,
63 timeout: 30000
64 });
65
66 var displayBlock = $('.blockMsg');
67 displayBlock.stop(); // cancel fadeout if it has started
68 displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency
69 }).mouseout(function() {
70 $('.blockMsg').fadeOut(1000);
71 });
72 // End konapun additions
73 };
74
75 // plugin method for blocking element content
76 $.fn.block = function(opts) {
77 if ( this[0] === window ) {
78 $.blockUI( opts );
79 return this;
80 }
81 var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});
82 this.each(function() {
83 var $el = $(this);
84 if (fullOpts.ignoreIfBlocked && $el.data('blockUI.isBlocked'))
85 return;
86 $el.unblock({ fadeOut: 0 });
87 });
88
89 return this.each(function() {
90 if ($.css(this,'position') == 'static') {
91 this.style.position = 'relative';
92 $(this).data('blockUI.static', true);
93 }
94 this.style.zoom = 1; // force 'hasLayout' in ie
95 install(this, opts);
96 });
97 };
98
99 // plugin method for unblocking element content
100 $.fn.unblock = function(opts) {
101 if ( this[0] === window ) {
102 $.unblockUI( opts );
103 return this;
104 }
105 return this.each(function() {
106 remove(this, opts);
107 });
108 };
109
110 $.blockUI.version = 2.66; // 2nd generation blocking at no extra cost!
111
112 // override these in your code to change the default behavior and style
113 $.blockUI.defaults = {
114 // message displayed when blocking (use null for no message)
115 message: '<h1>Please wait...</h1>',
116
117 title: null, // title string; only used when theme == true
118 draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
119
120 theme: false, // set to true to use with jQuery UI themes
121
122 // styles for the message when blocking; if you wish to disable
123 // these and use an external stylesheet then do this in your code:
124 // $.blockUI.defaults.css = {};
125 css: {
126 padding: 0,
127 margin: 0,
128 width: '30%',
129 top: '40%',
130 left: '35%',
131 textAlign: 'center',
132 color: '#000',
133 border: '3px solid #aaa',
134 backgroundColor:'#fff',
135 cursor: 'wait'
136 },
137
138 // minimal style set used when themes are used
139 themedCSS: {
140 width: '30%',
141 top: '40%',
142 left: '35%'
143 },
144
145 // styles for the overlay
146 overlayCSS: {
147 backgroundColor: '#000',
148 opacity: 0.6,
149 cursor: 'wait'
150 },
151
152 // style to replace wait cursor before unblocking to correct issue
153 // of lingering wait cursor
154 cursorReset: 'default',
155
156 // styles applied when using $.growlUI
157 growlCSS: {
158 width: '350px',
159 top: '10px',
160 left: '',
161 right: '10px',
162 border: 'none',
163 padding: '5px',
164 opacity: 0.6,
165 cursor: 'default',
166 color: '#fff',
167 backgroundColor: '#000',
168 '-webkit-border-radius':'10px',
169 '-moz-border-radius': '10px',
170 'border-radius': '10px'
171 },
172
173 // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
174 // (hat tip to Jorge H. N. de Vasconcelos)
175 /*jshint scripturl:true */
176 iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
177
178 // force usage of iframe in non-IE browsers (handy for blocking applets)
179 forceIframe: false,
180
181 // z-index for the blocking overlay
182 baseZ: 1000,
183
184 // set these to true to have the message automatically centered
185 centerX: true, // <-- only effects element blocking (page block controlled via css above)
186 centerY: true,
187
188 // allow body element to be stetched in ie6; this makes blocking look better
189 // on "short" pages. disable if you wish to prevent changes to the body height
190 allowBodyStretch: true,
191
192 // enable if you want key and mouse events to be disabled for content that is blocked
193 bindEvents: true,
194
195 // be default blockUI will supress tab navigation from leaving blocking content
196 // (if bindEvents is true)
197 constrainTabKey: true,
198
199 // fadeIn time in millis; set to 0 to disable fadeIn on block
200 fadeIn: 200,
201
202 // fadeOut time in millis; set to 0 to disable fadeOut on unblock
203 fadeOut: 400,
204
205 // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
206 timeout: 0,
207
208 // disable if you don't want to show the overlay
209 showOverlay: true,
210
211 // if true, focus will be placed in the first available input field when
212 // page blocking
213 focusInput: true,
214
215 // elements that can receive focus
216 focusableElements: ':input:enabled:visible',
217
218 // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
219 // no longer needed in 2012
220 // applyPlatformOpacityRules: true,
221
222 // callback method invoked when fadeIn has completed and blocking message is visible
223 onBlock: null,
224
225 // callback method invoked when unblocking has completed; the callback is
226 // passed the element that has been unblocked (which is the window object for page
227 // blocks) and the options that were passed to the unblock call:
228 // onUnblock(element, options)
229 onUnblock: null,
230
231 // callback method invoked when the overlay area is clicked.
232 // setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.
233 onOverlayClick: null,
234
235 // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
236 quirksmodeOffsetHack: 4,
237
238 // class name of the message block
239 blockMsgClass: 'blockMsg',
240
241 // if it is already blocked, then ignore it (don't unblock and reblock)
242 ignoreIfBlocked: false
243 };
244
245 // private data and functions follow...
246
247 var pageBlock = null;
248 var pageBlockEls = [];
249
250 function install(el, opts) {
251 var css, themedCSS;
252 var full = (el == window);
253 var msg = (opts && opts.message !== undefined ? opts.message : undefined);
254 opts = $.extend({}, $.blockUI.defaults, opts || {});
255
256 if (opts.ignoreIfBlocked && $(el).data('blockUI.isBlocked'))
257 return;
258
259 opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
260 css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
261 if (opts.onOverlayClick)
262 opts.overlayCSS.cursor = 'pointer';
263
264 themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
265 msg = msg === undefined ? opts.message : msg;
266
267 // remove the current block (if there is one)
268 if (full && pageBlock)
269 remove(window, {fadeOut:0});
270
271 // if an existing element is being used as the blocking content then we capture
272 // its current place in the DOM (and current display style) so we can restore
273 // it when we unblock
274 if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
275 var node = msg.jquery ? msg[0] : msg;
276 var data = {};
277 $(el).data('blockUI.history', data);
278 data.el = node;
279 data.parent = node.parentNode;
280 data.display = node.style.display;
281 data.position = node.style.position;
282 if (data.parent)
283 data.parent.removeChild(node);
284 }
285
286 $(el).data('blockUI.onUnblock', opts.onUnblock);
287 var z = opts.baseZ;
288
289 // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
290 // layer1 is the iframe layer which is used to supress bleed through of underlying content
291 // layer2 is the overlay layer which has opacity and a wait cursor (by default)
292 // layer3 is the message content that is displayed while blocking
293 var lyr1, lyr2, lyr3, s;
294 if (msie || opts.forceIframe)
295 lyr1 = $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>');
296 else
297 lyr1 = $('<div class="blockUI" style="display:none"></div>');
298
299 if (opts.theme)
300 lyr2 = $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>');
301 else
302 lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
303
304 if (opts.theme && full) {
305 s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">';
306 if ( opts.title ) {
307 s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
308 }
309 s += '<div class="ui-widget-content ui-dialog-content"></div>';
310 s += '</div>';
311 }
312 else if (opts.theme) {
313 s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">';
314 if ( opts.title ) {
315 s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
316 }
317 s += '<div class="ui-widget-content ui-dialog-content"></div>';
318 s += '</div>';
319 }
320 else if (full) {
321 s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+(z+10)+';display:none;position:fixed"></div>';
322 }
323 else {
324 s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+(z+10)+';display:none;position:absolute"></div>';
325 }
326 lyr3 = $(s);
327
328 // if we have a message, style it
329 if (msg) {
330 if (opts.theme) {
331 lyr3.css(themedCSS);
332 lyr3.addClass('ui-widget-content');
333 }
334 else
335 lyr3.css(css);
336 }
337
338 // style the overlay
339 if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)
340 lyr2.css(opts.overlayCSS);
341 lyr2.css('position', full ? 'fixed' : 'absolute');
342
343 // make iframe layer transparent in IE
344 if (msie || opts.forceIframe)
345 lyr1.css('opacity',0.0);
346
347 //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
348 var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
349 $.each(layers, function() {
350 this.appendTo($par);
351 });
352
353 if (opts.theme && opts.draggable && $.fn.draggable) {
354 lyr3.draggable({
355 handle: '.ui-dialog-titlebar',
356 cancel: 'li'
357 });
358 }
359
360 // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
361 var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);
362 if (ie6 || expr) {
363 // give body 100% height
364 if (full && opts.allowBodyStretch && $.support.boxModel)
365 $('html,body').css('height','100%');
366
367 // fix ie6 issue when blocked element has a border width
368 if ((ie6 || !$.support.boxModel) && !full) {
369 var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
370 var fixT = t ? '(0 - '+t+')' : 0;
371 var fixL = l ? '(0 - '+l+')' : 0;
372 }
373
374 // simulate fixed position
375 $.each(layers, function(i,o) {
376 var s = o[0].style;
377 s.position = 'absolute';
378 if (i < 2) {
379 if (full)
380 s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"');
381 else
382 s.setExpression('height','this.parentNode.offsetHeight + "px"');
383 if (full)
384 s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"');
385 else
386 s.setExpression('width','this.parentNode.offsetWidth + "px"');
387 if (fixL) s.setExpression('left', fixL);
388 if (fixT) s.setExpression('top', fixT);
389 }
390 else if (opts.centerY) {
391 if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
392 s.marginTop = 0;
393 }
394 else if (!opts.centerY && full) {
395 var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;
396 var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
397 s.setExpression('top',expression);
398 }
399 });
400 }
401
402 // show the message
403 if (msg) {
404 if (opts.theme)
405 lyr3.find('.ui-widget-content').append(msg);
406 else
407 lyr3.append(msg);
408 if (msg.jquery || msg.nodeType)
409 $(msg).show();
410 }
411
412 if ((msie || opts.forceIframe) && opts.showOverlay)
413 lyr1.show(); // opacity is zero
414 if (opts.fadeIn) {
415 var cb = opts.onBlock ? opts.onBlock : noOp;
416 var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
417 var cb2 = msg ? cb : noOp;
418 if (opts.showOverlay)
419 lyr2._fadeIn(opts.fadeIn, cb1);
420 if (msg)
421 lyr3._fadeIn(opts.fadeIn, cb2);
422 }
423 else {
424 if (opts.showOverlay)
425 lyr2.show();
426 if (msg)
427 lyr3.show();
428 if (opts.onBlock)
429 opts.onBlock();
430 }
431
432 // bind key and mouse events
433 bind(1, el, opts);
434
435 if (full) {
436 pageBlock = lyr3[0];
437 pageBlockEls = $(opts.focusableElements,pageBlock);
438 if (opts.focusInput)
439 setTimeout(focus, 20);
440 }
441 else
442 center(lyr3[0], opts.centerX, opts.centerY);
443
444 if (opts.timeout) {
445 // auto-unblock
446 var to = setTimeout(function() {
447 if (full)
448 $.unblockUI(opts);
449 else
450 $(el).unblock(opts);
451 }, opts.timeout);
452 $(el).data('blockUI.timeout', to);
453 }
454 }
455
456 // remove the block
457 function remove(el, opts) {
458 var count;
459 var full = (el == window);
460 var $el = $(el);
461 var data = $el.data('blockUI.history');
462 var to = $el.data('blockUI.timeout');
463 if (to) {
464 clearTimeout(to);
465 $el.removeData('blockUI.timeout');
466 }
467 opts = $.extend({}, $.blockUI.defaults, opts || {});
468 bind(0, el, opts); // unbind events
469
470 if (opts.onUnblock === null) {
471 opts.onUnblock = $el.data('blockUI.onUnblock');
472 $el.removeData('blockUI.onUnblock');
473 }
474
475 var els;
476 if (full) // crazy selector to handle odd field errors in ie6/7
477 els = $('body').children().filter('.blockUI').add('body > .blockUI');
478 else
479 els = $el.find('>.blockUI');
480
481 // fix cursor issue
482 if ( opts.cursorReset ) {
483 if ( els.length > 1 )
484 els[1].style.cursor = opts.cursorReset;
485 if ( els.length > 2 )
486 els[2].style.cursor = opts.cursorReset;
487 }
488
489 if (full)
490 pageBlock = pageBlockEls = null;
491
492 if (opts.fadeOut) {
493 count = els.length;
494 els.stop().fadeOut(opts.fadeOut, function() {
495 if ( --count === 0)
496 reset(els,data,opts,el);
497 });
498 }
499 else
500 reset(els, data, opts, el);
501 }
502
503 // move blocking element back into the DOM where it started
504 function reset(els,data,opts,el) {
505 var $el = $(el);
506 if ( $el.data('blockUI.isBlocked') )
507 return;
508
509 els.each(function(i,o) {
510 // remove via DOM calls so we don't lose event handlers
511 if (this.parentNode)
512 this.parentNode.removeChild(this);
513 });
514
515 if (data && data.el) {
516 data.el.style.display = data.display;
517 data.el.style.position = data.position;
518 if (data.parent)
519 data.parent.appendChild(data.el);
520 $el.removeData('blockUI.history');
521 }
522
523 if ($el.data('blockUI.static')) {
524 $el.css('position', 'static'); // #22
525 }
526
527 if (typeof opts.onUnblock == 'function')
528 opts.onUnblock(el,opts);
529
530 // fix issue in Safari 6 where block artifacts remain until reflow
531 var body = $(document.body), w = body.width(), cssW = body[0].style.width;
532 body.width(w-1).width(w);
533 body[0].style.width = cssW;
534 }
535
536 // bind/unbind the handler
537 function bind(b, el, opts) {
538 var full = el == window, $el = $(el);
539
540 // don't bother unbinding if there is nothing to unbind
541 if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
542 return;
543
544 $el.data('blockUI.isBlocked', b);
545
546 // don't bind events when overlay is not in use or if bindEvents is false
547 if (!full || !opts.bindEvents || (b && !opts.showOverlay))
548 return;
549
550 // bind anchors and inputs for mouse and key events
551 var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';
552 if (b)
553 $(document).bind(events, opts, handler);
554 else
555 $(document).unbind(events, handler);
556
557 // former impl...
558 // var $e = $('a,:input');
559 // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
560 }
561
562 // event handler to suppress keyboard/mouse events when blocking
563 function handler(e) {
564 // allow tab navigation (conditionally)
565 if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {
566 if (pageBlock && e.data.constrainTabKey) {
567 var els = pageBlockEls;
568 var fwd = !e.shiftKey && e.target === els[els.length-1];
569 var back = e.shiftKey && e.target === els[0];
570 if (fwd || back) {
571 setTimeout(function(){focus(back);},10);
572 return false;
573 }
574 }
575 }
576 var opts = e.data;
577 var target = $(e.target);
578 if (target.hasClass('blockOverlay') && opts.onOverlayClick)
579 opts.onOverlayClick(e);
580
581 // allow events within the message content
582 if (target.parents('div.' + opts.blockMsgClass).length > 0)
583 return true;
584
585 // allow events for content that is not being blocked
586 return target.parents().children().filter('div.blockUI').length === 0;
587 }
588
589 function focus(back) {
590 if (!pageBlockEls)
591 return;
592 var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
593 if (e)
594 e.focus();
595 }
596
597 function center(el, x, y) {
598 var p = el.parentNode, s = el.style;
599 var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
600 var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
601 if (x) s.left = l > 0 ? (l+'px') : '0';
602 if (y) s.top = t > 0 ? (t+'px') : '0';
603 }
604
605 function sz(el, p) {
606 return parseInt($.css(el,p),10)||0;
607 }
608
609 }
610
611
612 /*global define:true */
613 if (typeof define === 'function' && define.amd && define.amd.jQuery) {
614 define(['jquery'], setup);
615 } else {
616 setup(jQuery);
617 }
618
619})();
Note: See TracBrowser for help on using the repository browser.