Skip to content
Snippets Groups Projects
Commit 967e7ea4 authored by Juanjo Menent's avatar Juanjo Menent
Browse files

Merge pull request #3099 from GPCsolutions/dolibarr-3098

Updated jQuery BlockUI plugin to a version compatible with shipped jQuery
parents ba984254 b219381e
No related branches found
No related tags found
No related merge requests found
...@@ -28,10 +28,10 @@ Restler 3.0 LGPL-3+ Yes ...@@ -28,10 +28,10 @@ Restler 3.0 LGPL-3+ Yes
TCPDF 6.2.6 LGPL-3+ Yes PDF generation TCPDF 6.2.6 LGPL-3+ Yes PDF generation
JS libraries: JS libraries:
jQuery 1.8.2 MIT License Yes JS library jQuery 1.11.3 MIT License Yes JS library
jQuery UI 1.9.1 GPL and MIT License Yes JS library plugin UI jQuery UI 1.11.4 GPL and MIT License Yes JS library plugin UI
jQuery select2 3.5.2 GPL and Apache License Yes JS library plugin for sexier multiselect jQuery select2 3.5.2 GPL and Apache License Yes JS library plugin for sexier multiselect
jQuery blockUI 2.43 GPL and MIT License Yes JS library plugin blockUI (to use ajax popups) jQuery blockUI 2.70.0 GPL and MIT License Yes JS library plugin blockUI (to use ajax popups)
jQuery Colorpicker 1.1 MIT License Yes JS library for color picker for a defined list of colors jQuery Colorpicker 1.1 MIT License Yes JS library for color picker for a defined list of colors
jQuery DataTables 1.9.4 BSD Yes JS library for tables output jQuery DataTables 1.9.4 BSD Yes JS library for tables output
jQuery FileUpload 5.0.3 GPL and MIT License Yes JS library to upload files jQuery FileUpload 5.0.3 GPL and MIT License Yes JS library to upload files
......
/*! /*!
* jQuery blockUI plugin * jQuery blockUI plugin
* Version 2.43 (29-JUL-2012) * Version 2.70.0-2014.11.23
* @requires jQuery v1.2.3 or later * Requires jQuery v1.7 or later
* *
* Examples at: http://malsup.com/jquery/block/ * Examples at: http://malsup.com/jquery/block/
* Copyright (c) 2007-2010 M. Alsup * Copyright (c) 2007-2013 M. Alsup
* Dual licensed under the MIT and GPL licenses: * Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php * http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html * http://www.gnu.org/licenses/gpl.html
...@@ -13,22 +13,20 @@ ...@@ -13,22 +13,20 @@
*/ */
;(function() { ;(function() {
/*jshint eqeqeq:false curly:false latedef:false */
"use strict";
function setup($) { function setup($) {
if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery);
return;
}
$.fn._fadeIn = $.fn.fadeIn; $.fn._fadeIn = $.fn.fadeIn;
var noOp = function() {}; var noOp = $.noop || function() {};
// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle // this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
// retarded userAgent strings on Vista) // confusing userAgent strings on Vista)
var msie = /MSIE/.test(navigator.userAgent);
var ie6 = /MSIE 6.0/.test(navigator.userAgent) && ! /MSIE 8.0/.test(navigator.userAgent);
var mode = document.documentMode || 0; var mode = document.documentMode || 0;
var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8); var setExpr = $.isFunction( document.createElement('div').style.setExpression );
var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;
// global $ methods for blocking/unblocking the entire page // global $ methods for blocking/unblocking the entire page
$.blockUI = function(opts) { install(window, opts); }; $.blockUI = function(opts) { install(window, opts); };
...@@ -39,17 +37,47 @@ ...@@ -39,17 +37,47 @@
var $m = $('<div class="growlUI"></div>'); var $m = $('<div class="growlUI"></div>');
if (title) $m.append('<h1>'+title+'</h1>'); if (title) $m.append('<h1>'+title+'</h1>');
if (message) $m.append('<h2>'+message+'</h2>'); if (message) $m.append('<h2>'+message+'</h2>');
if (timeout == undefined) timeout = 3000; if (timeout === undefined) timeout = 3000;
$.blockUI({
message: $m, fadeIn: 700, fadeOut: 1000, centerY: false, // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications
timeout: timeout, showOverlay: false, var callBlock = function(opts) {
onUnblock: onClose, opts = opts || {};
css: $.blockUI.defaults.growlCSS
$.blockUI({
message: $m,
fadeIn : typeof opts.fadeIn !== 'undefined' ? opts.fadeIn : 700,
fadeOut: typeof opts.fadeOut !== 'undefined' ? opts.fadeOut : 1000,
timeout: typeof opts.timeout !== 'undefined' ? opts.timeout : timeout,
centerY: false,
showOverlay: false,
onUnblock: onClose,
css: $.blockUI.defaults.growlCSS
});
};
callBlock();
var nonmousedOpacity = $m.css('opacity');
$m.mouseover(function() {
callBlock({
fadeIn: 0,
timeout: 30000
});
var displayBlock = $('.blockMsg');
displayBlock.stop(); // cancel fadeout if it has started
displayBlock.fadeTo(300, 1); // make it easier to read the message by removing transparency
}).mouseout(function() {
$('.blockMsg').fadeOut(1000);
}); });
// End konapun additions
}; };
// plugin method for blocking element content // plugin method for blocking element content
$.fn.block = function(opts) { $.fn.block = function(opts) {
if ( this[0] === window ) {
$.blockUI( opts );
return this;
}
var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); var fullOpts = $.extend({}, $.blockUI.defaults, opts || {});
this.each(function() { this.each(function() {
var $el = $(this); var $el = $(this);
...@@ -59,30 +87,35 @@ ...@@ -59,30 +87,35 @@
}); });
return this.each(function() { return this.each(function() {
if ($.css(this,'position') == 'static') if ($.css(this,'position') == 'static') {
this.style.position = 'relative'; this.style.position = 'relative';
if ($.browser.msie) $(this).data('blockUI.static', true);
this.style.zoom = 1; // force 'hasLayout' }
this.style.zoom = 1; // force 'hasLayout' in ie
install(this, opts); install(this, opts);
}); });
}; };
// plugin method for unblocking element content // plugin method for unblocking element content
$.fn.unblock = function(opts) { $.fn.unblock = function(opts) {
if ( this[0] === window ) {
$.unblockUI( opts );
return this;
}
return this.each(function() { return this.each(function() {
remove(this, opts); remove(this, opts);
}); });
}; };
$.blockUI.version = 2.42; // 2nd generation blocking at no extra cost! $.blockUI.version = 2.70; // 2nd generation blocking at no extra cost!
// override these in your code to change the default behavior and style // override these in your code to change the default behavior and style
$.blockUI.defaults = { $.blockUI.defaults = {
// message displayed when blocking (use null for no message) // message displayed when blocking (use null for no message)
message: '<h1>Please wait...</h1>', message: '<h1>Please wait...</h1>',
title: null, // title string; only used when theme == true title: null, // title string; only used when theme == true
draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded)
theme: false, // set to true to use with jQuery UI themes theme: false, // set to true to use with jQuery UI themes
...@@ -111,30 +144,35 @@ ...@@ -111,30 +144,35 @@
// styles for the overlay // styles for the overlay
overlayCSS: { overlayCSS: {
backgroundColor: '#000', backgroundColor: '#000',
opacity: 0.6, opacity: 0.6,
cursor: 'wait' cursor: 'wait'
}, },
// style to replace wait cursor before unblocking to correct issue
// of lingering wait cursor
cursorReset: 'default',
// styles applied when using $.growlUI // styles applied when using $.growlUI
growlCSS: { growlCSS: {
width: '350px', width: '350px',
top: '10px', top: '10px',
left: '', left: '',
right: '10px', right: '10px',
border: 'none', border: 'none',
padding: '5px', padding: '5px',
opacity: 0.6, opacity: 0.6,
cursor: 'default', cursor: 'default',
color: '#fff', color: '#fff',
backgroundColor: '#000', backgroundColor: '#000',
'-webkit-border-radius': '10px', '-webkit-border-radius':'10px',
'-moz-border-radius': '10px', '-moz-border-radius': '10px',
'border-radius': '10px' 'border-radius': '10px'
}, },
// IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
// (hat tip to Jorge H. N. de Vasconcelos) // (hat tip to Jorge H. N. de Vasconcelos)
/*jshint scripturl:true */
iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
// force usage of iframe in non-IE browsers (handy for blocking applets) // force usage of iframe in non-IE browsers (handy for blocking applets)
...@@ -174,8 +212,12 @@ ...@@ -174,8 +212,12 @@
// page blocking // page blocking
focusInput: true, focusInput: true,
// elements that can receive focus
focusableElements: ':input:enabled:visible',
// suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
applyPlatformOpacityRules: true, // no longer needed in 2012
// applyPlatformOpacityRules: true,
// callback method invoked when fadeIn has completed and blocking message is visible // callback method invoked when fadeIn has completed and blocking message is visible
onBlock: null, onBlock: null,
...@@ -183,9 +225,13 @@ ...@@ -183,9 +225,13 @@
// callback method invoked when unblocking has completed; the callback is // callback method invoked when unblocking has completed; the callback is
// passed the element that has been unblocked (which is the window object for page // passed the element that has been unblocked (which is the window object for page
// blocks) and the options that were passed to the unblock call: // blocks) and the options that were passed to the unblock call:
// onUnblock(element, options) // onUnblock(element, options)
onUnblock: null, onUnblock: null,
// callback method invoked when the overlay area is clicked.
// setting this will turn the cursor to a pointer, otherwise cursor defined in overlayCss will be used.
onOverlayClick: null,
// don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
quirksmodeOffsetHack: 4, quirksmodeOffsetHack: 4,
...@@ -212,6 +258,9 @@ ...@@ -212,6 +258,9 @@
opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
if (opts.onOverlayClick)
opts.overlayCSS.cursor = 'pointer';
themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
msg = msg === undefined ? opts.message : msg; msg = msg === undefined ? opts.message : msg;
...@@ -241,30 +290,31 @@ ...@@ -241,30 +290,31 @@
// layer1 is the iframe layer which is used to supress bleed through of underlying content // layer1 is the iframe layer which is used to supress bleed through of underlying content
// layer2 is the overlay layer which has opacity and a wait cursor (by default) // layer2 is the overlay layer which has opacity and a wait cursor (by default)
// layer3 is the message content that is displayed while blocking // layer3 is the message content that is displayed while blocking
var lyr1, lyr2, lyr3, s;
if (msie || opts.forceIframe)
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>');
else
lyr1 = $('<div class="blockUI" style="display:none"></div>');
var lyr1 = ($.browser.msie || opts.forceIframe) if (opts.theme)
? $('<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>') lyr2 = $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>');
: $('<div class="blockUI" style="display:none"></div>'); else
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>');
var lyr2 = opts.theme
? $('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+ (z++) +';display:none"></div>')
: $('<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>');
var lyr3, s;
if (opts.theme && full) { if (opts.theme && full) {
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">'; s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:fixed">';
if ( opts.title ) { if ( opts.title ) {
s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>'; s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
} }
s += '<div class="ui-widget-content ui-dialog-content"></div>'; s += '<div class="ui-widget-content ui-dialog-content"></div>';
s += '</div>'; s += '</div>';
} }
else if (opts.theme) { else if (opts.theme) {
s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">'; s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(z+10)+';display:none;position:absolute">';
if ( opts.title ) { if ( opts.title ) {
s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' s += '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>';
} }
s += '<div class="ui-widget-content ui-dialog-content"></div>'; s += '<div class="ui-widget-content ui-dialog-content"></div>';
s += '</div>'; s += '</div>';
} }
else if (full) { else if (full) {
...@@ -286,12 +336,12 @@ ...@@ -286,12 +336,12 @@
} }
// style the overlay // style the overlay
if (!opts.theme && (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))) if (!opts.theme /*&& (!opts.applyPlatformOpacityRules)*/)
lyr2.css(opts.overlayCSS); lyr2.css(opts.overlayCSS);
lyr2.css('position', full ? 'fixed' : 'absolute'); lyr2.css('position', full ? 'fixed' : 'absolute');
// make iframe layer transparent in IE // make iframe layer transparent in IE
if ($.browser.msie || opts.forceIframe) if (msie || opts.forceIframe)
lyr1.css('opacity',0.0); lyr1.css('opacity',0.0);
//$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
...@@ -308,28 +358,32 @@ ...@@ -308,28 +358,32 @@
} }
// ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0); var expr = setExpr && (!$.support.boxModel || $('object,embed', full ? null : el).length > 0);
if (ie6 || expr) { if (ie6 || expr) {
// give body 100% height // give body 100% height
if (full && opts.allowBodyStretch && $.boxModel) if (full && opts.allowBodyStretch && $.support.boxModel)
$('html,body').css('height','100%'); $('html,body').css('height','100%');
// fix ie6 issue when blocked element has a border width // fix ie6 issue when blocked element has a border width
if ((ie6 || !$.boxModel) && !full) { if ((ie6 || !$.support.boxModel) && !full) {
var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
var fixT = t ? '(0 - '+t+')' : 0; var fixT = t ? '(0 - '+t+')' : 0;
var fixL = l ? '(0 - '+l+')' : 0; var fixL = l ? '(0 - '+l+')' : 0;
} }
// simulate fixed position // simulate fixed position
$.each([lyr1,lyr2,lyr3], function(i,o) { $.each(layers, function(i,o) {
var s = o[0].style; var s = o[0].style;
s.position = 'absolute'; s.position = 'absolute';
if (i < 2) { if (i < 2) {
full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"') if (full)
: s.setExpression('height','this.parentNode.offsetHeight + "px"'); s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"');
full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') else
: s.setExpression('width','this.parentNode.offsetWidth + "px"'); s.setExpression('height','this.parentNode.offsetHeight + "px"');
if (full)
s.setExpression('width','jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"');
else
s.setExpression('width','this.parentNode.offsetWidth + "px"');
if (fixL) s.setExpression('left', fixL); if (fixL) s.setExpression('left', fixL);
if (fixT) s.setExpression('top', fixT); if (fixT) s.setExpression('top', fixT);
} }
...@@ -338,7 +392,7 @@ ...@@ -338,7 +392,7 @@
s.marginTop = 0; s.marginTop = 0;
} }
else if (!opts.centerY && full) { else if (!opts.centerY && full) {
var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0; var top = (opts.css && opts.css.top) ? parseInt(opts.css.top, 10) : 0;
var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
s.setExpression('top',expression); s.setExpression('top',expression);
} }
...@@ -355,7 +409,7 @@ ...@@ -355,7 +409,7 @@
$(msg).show(); $(msg).show();
} }
if (($.browser.msie || opts.forceIframe) && opts.showOverlay) if ((msie || opts.forceIframe) && opts.showOverlay)
lyr1.show(); // opacity is zero lyr1.show(); // opacity is zero
if (opts.fadeIn) { if (opts.fadeIn) {
var cb = opts.onBlock ? opts.onBlock : noOp; var cb = opts.onBlock ? opts.onBlock : noOp;
...@@ -372,7 +426,7 @@ ...@@ -372,7 +426,7 @@
if (msg) if (msg)
lyr3.show(); lyr3.show();
if (opts.onBlock) if (opts.onBlock)
opts.onBlock(); opts.onBlock.bind(lyr3)();
} }
// bind key and mouse events // bind key and mouse events
...@@ -380,7 +434,7 @@ ...@@ -380,7 +434,7 @@
if (full) { if (full) {
pageBlock = lyr3[0]; pageBlock = lyr3[0];
pageBlockEls = $(':input:enabled:visible',pageBlock); pageBlockEls = $(opts.focusableElements,pageBlock);
if (opts.focusInput) if (opts.focusInput)
setTimeout(focus, 20); setTimeout(focus, 20);
} }
...@@ -390,14 +444,18 @@ ...@@ -390,14 +444,18 @@
if (opts.timeout) { if (opts.timeout) {
// auto-unblock // auto-unblock
var to = setTimeout(function() { var to = setTimeout(function() {
full ? $.unblockUI(opts) : $(el).unblock(opts); if (full)
$.unblockUI(opts);
else
$(el).unblock(opts);
}, opts.timeout); }, opts.timeout);
$(el).data('blockUI.timeout', to); $(el).data('blockUI.timeout', to);
} }
}; }
// remove the block // remove the block
function remove(el, opts) { function remove(el, opts) {
var count;
var full = (el == window); var full = (el == window);
var $el = $(el); var $el = $(el);
var data = $el.data('blockUI.history'); var data = $el.data('blockUI.history');
...@@ -418,21 +476,36 @@ ...@@ -418,21 +476,36 @@
if (full) // crazy selector to handle odd field errors in ie6/7 if (full) // crazy selector to handle odd field errors in ie6/7
els = $('body').children().filter('.blockUI').add('body > .blockUI'); els = $('body').children().filter('.blockUI').add('body > .blockUI');
else else
els = $('.blockUI', el); els = $el.find('>.blockUI');
// fix cursor issue
if ( opts.cursorReset ) {
if ( els.length > 1 )
els[1].style.cursor = opts.cursorReset;
if ( els.length > 2 )
els[2].style.cursor = opts.cursorReset;
}
if (full) if (full)
pageBlock = pageBlockEls = null; pageBlock = pageBlockEls = null;
if (opts.fadeOut) { if (opts.fadeOut) {
els.fadeOut(opts.fadeOut); count = els.length;
setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut); els.stop().fadeOut(opts.fadeOut, function() {
if ( --count === 0)
reset(els,data,opts,el);
});
} }
else else
reset(els, data, opts, el); reset(els, data, opts, el);
}; }
// move blocking element back into the DOM where it started // move blocking element back into the DOM where it started
function reset(els,data,opts,el) { function reset(els,data,opts,el) {
var $el = $(el);
if ( $el.data('blockUI.isBlocked') )
return;
els.each(function(i,o) { els.each(function(i,o) {
// remove via DOM calls so we don't lose event handlers // remove via DOM calls so we don't lose event handlers
if (this.parentNode) if (this.parentNode)
...@@ -442,14 +515,24 @@ ...@@ -442,14 +515,24 @@
if (data && data.el) { if (data && data.el) {
data.el.style.display = data.display; data.el.style.display = data.display;
data.el.style.position = data.position; data.el.style.position = data.position;
data.el.style.cursor = 'default'; // #59
if (data.parent) if (data.parent)
data.parent.appendChild(data.el); data.parent.appendChild(data.el);
$(el).removeData('blockUI.history'); $el.removeData('blockUI.history');
}
if ($el.data('blockUI.static')) {
$el.css('position', 'static'); // #22
} }
if (typeof opts.onUnblock == 'function') if (typeof opts.onUnblock == 'function')
opts.onUnblock(el,opts); opts.onUnblock(el,opts);
};
// fix issue in Safari 6 where block artifacts remain until reflow
var body = $(document.body), w = body.width(), cssW = body[0].style.width;
body.width(w-1).width(w);
body[0].style.width = cssW;
}
// bind/unbind the handler // bind/unbind the handler
function bind(b, el, opts) { function bind(b, el, opts) {
...@@ -462,40 +545,47 @@ ...@@ -462,40 +545,47 @@
$el.data('blockUI.isBlocked', b); $el.data('blockUI.isBlocked', b);
// don't bind events when overlay is not in use or if bindEvents is false // don't bind events when overlay is not in use or if bindEvents is false
if (!opts.bindEvents || (b && !opts.showOverlay)) if (!full || !opts.bindEvents || (b && !opts.showOverlay))
return; return;
// bind anchors and inputs for mouse and key events // bind anchors and inputs for mouse and key events
var events = 'mousedown mouseup keydown keypress'; var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove';
b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler); if (b)
$(document).bind(events, opts, handler);
else
$(document).unbind(events, handler);
// former impl... // former impl...
// var $e = $('a,:input'); // var $e = $('a,:input');
// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
}; }
// event handler to suppress keyboard/mouse events when blocking // event handler to suppress keyboard/mouse events when blocking
function handler(e) { function handler(e) {
// allow tab navigation (conditionally) // allow tab navigation (conditionally)
if (e.keyCode && e.keyCode == 9) { if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) {
if (pageBlock && e.data.constrainTabKey) { if (pageBlock && e.data.constrainTabKey) {
var els = pageBlockEls; var els = pageBlockEls;
var fwd = !e.shiftKey && e.target === els[els.length-1]; var fwd = !e.shiftKey && e.target === els[els.length-1];
var back = e.shiftKey && e.target === els[0]; var back = e.shiftKey && e.target === els[0];
if (fwd || back) { if (fwd || back) {
setTimeout(function(){focus(back)},10); setTimeout(function(){focus(back);},10);
return false; return false;
} }
} }
} }
var opts = e.data; var opts = e.data;
var target = $(e.target);
if (target.hasClass('blockOverlay') && opts.onOverlayClick)
opts.onOverlayClick(e);
// allow events within the message content // allow events within the message content
if ($(e.target).parents('div.' + opts.blockMsgClass).length > 0) if (target.parents('div.' + opts.blockMsgClass).length > 0)
return true; return true;
// allow events for content that is not being blocked // allow events for content that is not being blocked
return $(e.target).parents().children().filter('div.blockUI').length == 0; return target.parents().children().filter('div.blockUI').length === 0;
}; }
function focus(back) { function focus(back) {
if (!pageBlockEls) if (!pageBlockEls)
...@@ -503,7 +593,7 @@ ...@@ -503,7 +593,7 @@
var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
if (e) if (e)
e.focus(); e.focus();
}; }
function center(el, x, y) { function center(el, x, y) {
var p = el.parentNode, s = el.style; var p = el.parentNode, s = el.style;
...@@ -511,15 +601,16 @@ ...@@ -511,15 +601,16 @@
var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
if (x) s.left = l > 0 ? (l+'px') : '0'; if (x) s.left = l > 0 ? (l+'px') : '0';
if (y) s.top = t > 0 ? (t+'px') : '0'; if (y) s.top = t > 0 ? (t+'px') : '0';
}; }
function sz(el, p) { function sz(el, p) {
return parseInt($.css(el,p))||0; return parseInt($.css(el,p),10)||0;
}; }
}; }
/*global define:true */
if (typeof define === 'function' && define.amd && define.amd.jQuery) { if (typeof define === 'function' && define.amd && define.amd.jQuery) {
define(['jquery'], setup); define(['jquery'], setup);
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment