~openerp-dev/openerp-web/trunk-jquery1.9-ppa

« back to all changes in this revision

Viewing changes to addons/web/static/lib/jquery.blockUI/jquery.blockUI.js

  • Committer: Prashant Panchal(OpenERP)
  • Date: 2014-04-16 09:24:51 UTC
  • Revision ID: ppa@tinyerp.com-20140416092451-outv36dahgip1860
[IMP] add jquery-migrate-1.1.1.j & jquery-1.9.1.js & change in web

Show diffs side-by-side

added added

removed removed

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