From 452733263d1dfeb34e124b7367885f512590a4e1 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 25 Jun 2015 06:37:26 +0200 Subject: [PATCH 1/5] Move ACCOUNTING_VAT_ACCOUNT to ACCOUNTING_VAT_SOLD_ACCOUNT --- htdocs/accountancy/journal/purchasesjournal.php | 2 +- htdocs/accountancy/journal/sellsjournal.php | 2 +- htdocs/admin/compta.php | 2 +- htdocs/compta/journal/sellsjournal.php | 2 +- htdocs/install/mysql/migration/3.7.0-3.8.0.sql | 2 +- htdocs/langs/en_US/compta.lang | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 0a000e01833..862ff92eb4b 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -112,7 +112,7 @@ if ($result) { $num = $db->num_rows($result); // les variables $cptfour = (! empty($conf->global->ACCOUNTING_ACCOUNT_SUPPLIER)) ? $conf->global->ACCOUNTING_ACCOUNT_SUPPLIER : $langs->trans("CodeNotDef"); - $cpttva = (! empty($conf->global->ACCOUNTING_VAT_ACCOUNT)) ? $conf->global->ACCOUNTING_VAT_ACCOUNT : $langs->trans("CodeNotDef"); + $cpttva = (! empty($conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT)) ? $conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT : $langs->trans("CodeNotDef"); $tabfac = array (); $tabht = array (); diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index db9af17388a..83191f88bf4 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -136,7 +136,7 @@ if ($result) { else $compta_prod = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT)) ? $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT : $langs->trans("CodeNotDef"); } - $cpttva = (! empty($conf->global->ACCOUNTING_VAT_ACCOUNT)) ? $conf->global->ACCOUNTING_VAT_ACCOUNT : $langs->trans("CodeNotDef"); + $cpttva = (! empty($conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT)) ? $conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT : $langs->trans("CodeNotDef"); $compta_tva = (! empty($obj->account_tva) ? $obj->account_tva : $cpttva); // Situation invoices handling diff --git a/htdocs/admin/compta.php b/htdocs/admin/compta.php index 48cad667a51..6020cb7947e 100644 --- a/htdocs/admin/compta.php +++ b/htdocs/admin/compta.php @@ -44,7 +44,7 @@ $list = array( 'ACCOUNTING_PRODUCT_SOLD_ACCOUNT', 'ACCOUNTING_SERVICE_BUY_ACCOUNT', 'ACCOUNTING_SERVICE_SOLD_ACCOUNT', - 'ACCOUNTING_VAT_ACCOUNT', + 'ACCOUNTING_VAT_SOLD_ACCOUNT', 'ACCOUNTING_VAT_BUY_ACCOUNT', 'ACCOUNTING_ACCOUNT_CUSTOMER', 'ACCOUNTING_ACCOUNT_SUPPLIER' diff --git a/htdocs/compta/journal/sellsjournal.php b/htdocs/compta/journal/sellsjournal.php index 9fd0d411d8e..e2842f6dd1e 100644 --- a/htdocs/compta/journal/sellsjournal.php +++ b/htdocs/compta/journal/sellsjournal.php @@ -151,7 +151,7 @@ if ($result) if($obj->product_type == 0) $compta_prod = (! empty($conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT)?$conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT:$langs->trans("CodeNotDef")); else $compta_prod = (! empty($conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT)?$conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT:$langs->trans("CodeNotDef")); } - $cpttva = (! empty($conf->global->ACCOUNTING_VAT_ACCOUNT)?$conf->global->ACCOUNTING_VAT_ACCOUNT:$langs->trans("CodeNotDef")); + $cpttva = (! empty($conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT)?$conf->global->ACCOUNTING_VAT_SOLD_ACCOUNT:$langs->trans("CodeNotDef")); $compta_tva = (! empty($obj->account_tva)?$obj->account_tva:$cpttva); $account_localtax1=getLocalTaxesFromRate($obj->tva_tx, 1, $obj->thirdparty, $mysoc); diff --git a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql index aa43d763e84..f10fc56af45 100755 --- a/htdocs/install/mysql/migration/3.7.0-3.8.0.sql +++ b/htdocs/install/mysql/migration/3.7.0-3.8.0.sql @@ -703,4 +703,4 @@ ALTER TABLE llx_holiday_logs ADD COLUMN fk_type integer NOT NULL DEFAULT 1; UPDATE llx_holiday_users SET fk_type = 1 WHERE fk_type IS NULL; UPDATE llx_holiday_logs SET fk_type = 1 WHERE fk_type IS NULL; - +UPDATE llx_const SET name = __ENCRYPT('ACCOUNTING_VAT_SOLD_ACCOUNT')__ WHERE __DECRYPT('name')__ = 'ACCOUNTING_VAT_ACCOUNT'; diff --git a/htdocs/langs/en_US/compta.lang b/htdocs/langs/en_US/compta.lang index fc32492b120..09858bc092f 100644 --- a/htdocs/langs/en_US/compta.lang +++ b/htdocs/langs/en_US/compta.lang @@ -198,7 +198,7 @@ CalculationRuleDescSupplier=according to supplier, choose appropriate method to TurnoverPerProductInCommitmentAccountingNotRelevant=Turnover report per product, when using a cash accountancy mode is not relevant. This report is only available when using engagement accountancy mode (see setup of accountancy module). CalculationMode=Calculation mode AccountancyJournal=Accountancy code journal -ACCOUNTING_VAT_ACCOUNT=Default accountancy code for collecting VAT +ACCOUNTING_VAT_SOLD_ACCOUNT=Default accountancy code for collecting VAT ACCOUNTING_VAT_BUY_ACCOUNT=Default accountancy code for paying VAT ACCOUNTING_ACCOUNT_CUSTOMER=Accountancy code by default for customer thirdparties ACCOUNTING_ACCOUNT_SUPPLIER=Accountancy code by default for supplier thirdparties From e20da5511dc0b0d2bde3431a739f88b5c836ab6e Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 25 Jun 2015 06:54:19 +0200 Subject: [PATCH 2/5] Accounting - Add field to edit in admin --- htdocs/accountancy/admin/index.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php index c1ad179342a..dba04aafa05 100644 --- a/htdocs/accountancy/admin/index.php +++ b/htdocs/accountancy/admin/index.php @@ -1,11 +1,11 @@ * Copyright (C) 2013-2014 Florian Henry - * Copyright (C) 2013-2014 Alexandre Spangaro + * Copyright (C) 2013-2015 Alexandre Spangaro * Copyright (C) 2014 Ari Elbaz (elarifr) * Copyright (C) 2014 Marcos García * Copyright (C) 2014 Juanjo Menent - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2015 Jean-François Ferry * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -56,6 +56,8 @@ $list = array ( 'ACCOUNTING_PRODUCT_SOLD_ACCOUNT', 'ACCOUNTING_SERVICE_BUY_ACCOUNT', 'ACCOUNTING_SERVICE_SOLD_ACCOUNT', + 'ACCOUNTING_VAT_BUY_ACCOUNT', + 'ACCOUNTING_VAT_SOLD_ACCOUNT', 'ACCOUNTING_ACCOUNT_SUSPENSE', 'ACCOUNTING_ACCOUNT_TRANSFER_CASH' ); From d6e48670e7800c88fbeda4ba8bedd830e517e4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 25 Jun 2015 11:10:28 +0200 Subject: [PATCH 3/5] Allow replacing the address block Since ba2c0a2651ead307ab9c779a16e6b4dbdb424bea changed the default hook mode from addreplace to output, this is needed to still be allowed to replace the displayed address from a hook --- htdocs/core/class/hookmanager.class.php | 37 +++++++++++++------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/htdocs/core/class/hookmanager.class.php b/htdocs/core/class/hookmanager.class.php index ee7742660c1..b26f8c3c3d3 100644 --- a/htdocs/core/class/hookmanager.class.php +++ b/htdocs/core/class/hookmanager.class.php @@ -130,24 +130,25 @@ class HookManager // Define type of hook ('output' or 'addreplace'. 'returnvalue' is deprecated). $hooktype='output'; - if (in_array( - $method, - array( - 'addMoreActionsButtons', - 'addStatisticLine', - 'deleteFile', - 'doActions', - 'formCreateThirdpartyOptions', - 'formObjectOptions', - 'formattachOptions', - 'formBuilddocLineOptions', - 'moveUploadedFile', - 'pdf_writelinedesc', - 'paymentsupplierinvoices', - 'printSearchForm', - 'formatEvent' - ) - )) $hooktype='addreplace'; + if (in_array( + $method, + array( + 'addMoreActionsButtons', + 'addStatisticLine', + 'deleteFile', + 'doActions', + 'formCreateThirdpartyOptions', + 'formObjectOptions', + 'formattachOptions', + 'formBuilddocLineOptions', + 'moveUploadedFile', + 'pdf_writelinedesc', + 'paymentsupplierinvoices', + 'printAddress', + 'printSearchForm', + 'formatEvent' + ) + )) $hooktype='addreplace'; // Deprecated hook types ('returnvalue') if (preg_match('/^pdf_/',$method) && $method != 'pdf_writelinedesc') $hooktype='returnvalue'; // pdf_xxx except pdf_writelinedesc are 'returnvalue' hooks. When there is 2 hooks of this type, only last one win. TODO Move them into 'output' or 'addreplace' hooks. if ($method == 'insertExtraFields') From 63a3d2f7607026e5706e16a032bc872548a63dc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 25 Jun 2015 15:43:26 +0200 Subject: [PATCH 4/5] Updated jQuery versions in COPYRIGHT Actual library update has been done at a3a5b0d --- COPYRIGHT | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index a961a442507..1f621a58622 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -28,8 +28,8 @@ Restler 3.0 LGPL-3+ Yes TCPDF 6.2.6 LGPL-3+ Yes PDF generation JS libraries: -jQuery 1.8.2 MIT License Yes JS library -jQuery UI 1.9.1 GPL and MIT License Yes JS library plugin UI +jQuery 1.11.3 MIT License Yes JS library +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 blockUI 2.43 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 From b219381e04bdfec09f58f267b0ff9fc717375c1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 25 Jun 2015 15:46:08 +0200 Subject: [PATCH 5/5] Fix #3098 Updated jQuery BlockUI plugin to 2.70.0 --- COPYRIGHT | 2 +- .../jquery/plugins/blockUI/jquery.blockUI.js | 271 ++++++++++++------ 2 files changed, 182 insertions(+), 91 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index 1f621a58622..519910ea1b1 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -31,7 +31,7 @@ JS libraries: jQuery 1.11.3 MIT License Yes JS library 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 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 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 diff --git a/htdocs/includes/jquery/plugins/blockUI/jquery.blockUI.js b/htdocs/includes/jquery/plugins/blockUI/jquery.blockUI.js index 6acca8c7b81..90ce5d64df3 100644 --- a/htdocs/includes/jquery/plugins/blockUI/jquery.blockUI.js +++ b/htdocs/includes/jquery/plugins/blockUI/jquery.blockUI.js @@ -1,10 +1,10 @@ /*! * jQuery blockUI plugin - * Version 2.43 (29-JUL-2012) - * @requires jQuery v1.2.3 or later + * Version 2.70.0-2014.11.23 + * Requires jQuery v1.7 or later * * 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: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html @@ -13,22 +13,20 @@ */ ;(function() { +/*jshint eqeqeq:false curly:false latedef:false */ +"use strict"; 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; - 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 - // 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 setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8); - var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode; + var setExpr = $.isFunction( document.createElement('div').style.setExpression ); // global $ methods for blocking/unblocking the entire page $.blockUI = function(opts) { install(window, opts); }; @@ -39,17 +37,47 @@ var $m = $('
'); if (title) $m.append('

'+title+'

'); if (message) $m.append('

'+message+'

'); - if (timeout == undefined) timeout = 3000; - $.blockUI({ - message: $m, fadeIn: 700, fadeOut: 1000, centerY: false, - timeout: timeout, showOverlay: false, - onUnblock: onClose, - css: $.blockUI.defaults.growlCSS + if (timeout === undefined) timeout = 3000; + + // Added by konapun: Set timeout to 30 seconds if this growl is moused over, like normal toast notifications + var callBlock = function(opts) { + opts = opts || {}; + + $.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 $.fn.block = function(opts) { + if ( this[0] === window ) { + $.blockUI( opts ); + return this; + } var fullOpts = $.extend({}, $.blockUI.defaults, opts || {}); this.each(function() { var $el = $(this); @@ -59,30 +87,35 @@ }); return this.each(function() { - if ($.css(this,'position') == 'static') + if ($.css(this,'position') == 'static') { this.style.position = 'relative'; - if ($.browser.msie) - this.style.zoom = 1; // force 'hasLayout' + $(this).data('blockUI.static', true); + } + this.style.zoom = 1; // force 'hasLayout' in ie install(this, opts); }); }; // plugin method for unblocking element content $.fn.unblock = function(opts) { + if ( this[0] === window ) { + $.unblockUI( opts ); + return this; + } return this.each(function() { 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 $.blockUI.defaults = { // message displayed when blocking (use null for no message) message: '

Please wait...

', - title: null, // title string; only used when theme == true - draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) + title: null, // title string; only used when theme == true + 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 @@ -111,30 +144,35 @@ // styles for the overlay overlayCSS: { - backgroundColor: '#000', - opacity: 0.6, - cursor: 'wait' + backgroundColor: '#000', + opacity: 0.6, + cursor: 'wait' }, + // style to replace wait cursor before unblocking to correct issue + // of lingering wait cursor + cursorReset: 'default', + // styles applied when using $.growlUI growlCSS: { - width: '350px', + width: '350px', top: '10px', - left: '', - right: '10px', - border: 'none', + left: '', + right: '10px', + border: 'none', padding: '5px', opacity: 0.6, - cursor: 'default', + cursor: 'default', color: '#fff', backgroundColor: '#000', - '-webkit-border-radius': '10px', - '-moz-border-radius': '10px', - 'border-radius': '10px' + '-webkit-border-radius':'10px', + '-moz-border-radius': '10px', + 'border-radius': '10px' }, // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w // (hat tip to Jorge H. N. de Vasconcelos) + /*jshint scripturl:true */ iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', // force usage of iframe in non-IE browsers (handy for blocking applets) @@ -174,8 +212,12 @@ // page blocking 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) - applyPlatformOpacityRules: true, + // no longer needed in 2012 + // applyPlatformOpacityRules: true, // callback method invoked when fadeIn has completed and blocking message is visible onBlock: null, @@ -183,9 +225,13 @@ // callback method invoked when unblocking has completed; the callback is // 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: - // onUnblock(element, options) + // onUnblock(element, options) 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 quirksmodeOffsetHack: 4, @@ -212,6 +258,9 @@ opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); + if (opts.onOverlayClick) + opts.overlayCSS.cursor = 'pointer'; + themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); msg = msg === undefined ? opts.message : msg; @@ -241,30 +290,31 @@ // 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) // layer3 is the message content that is displayed while blocking + var lyr1, lyr2, lyr3, s; + if (msie || opts.forceIframe) + lyr1 = $(''); + else + lyr1 = $(''); - var lyr1 = ($.browser.msie || opts.forceIframe) - ? $('') - : $(''); + if (opts.theme) + lyr2 = $(''); + else + lyr2 = $(''); - var lyr2 = opts.theme - ? $('') - : $(''); - - var lyr3, s; if (opts.theme && full) { s = ''; } else if (opts.theme) { s = ''; } else if (full) { @@ -286,12 +336,12 @@ } // 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('position', full ? 'fixed' : 'absolute'); // make iframe layer transparent in IE - if ($.browser.msie || opts.forceIframe) + if (msie || opts.forceIframe) lyr1.css('opacity',0.0); //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); @@ -308,28 +358,32 @@ } // 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) { // give body 100% height - if (full && opts.allowBodyStretch && $.boxModel) + if (full && opts.allowBodyStretch && $.support.boxModel) $('html,body').css('height','100%'); // 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 fixT = t ? '(0 - '+t+')' : 0; var fixL = l ? '(0 - '+l+')' : 0; } // simulate fixed position - $.each([lyr1,lyr2,lyr3], function(i,o) { + $.each(layers, function(i,o) { var s = o[0].style; s.position = 'absolute'; if (i < 2) { - full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"') - : s.setExpression('height','this.parentNode.offsetHeight + "px"'); - full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') - : s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (full) + s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"'); + else + 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 (fixT) s.setExpression('top', fixT); } @@ -338,7 +392,7 @@ s.marginTop = 0; } 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"'; s.setExpression('top',expression); } @@ -355,7 +409,7 @@ $(msg).show(); } - if (($.browser.msie || opts.forceIframe) && opts.showOverlay) + if ((msie || opts.forceIframe) && opts.showOverlay) lyr1.show(); // opacity is zero if (opts.fadeIn) { var cb = opts.onBlock ? opts.onBlock : noOp; @@ -372,7 +426,7 @@ if (msg) lyr3.show(); if (opts.onBlock) - opts.onBlock(); + opts.onBlock.bind(lyr3)(); } // bind key and mouse events @@ -380,7 +434,7 @@ if (full) { pageBlock = lyr3[0]; - pageBlockEls = $(':input:enabled:visible',pageBlock); + pageBlockEls = $(opts.focusableElements,pageBlock); if (opts.focusInput) setTimeout(focus, 20); } @@ -390,14 +444,18 @@ if (opts.timeout) { // auto-unblock var to = setTimeout(function() { - full ? $.unblockUI(opts) : $(el).unblock(opts); + if (full) + $.unblockUI(opts); + else + $(el).unblock(opts); }, opts.timeout); $(el).data('blockUI.timeout', to); } - }; + } // remove the block function remove(el, opts) { + var count; var full = (el == window); var $el = $(el); var data = $el.data('blockUI.history'); @@ -418,21 +476,36 @@ if (full) // crazy selector to handle odd field errors in ie6/7 els = $('body').children().filter('.blockUI').add('body > .blockUI'); 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) pageBlock = pageBlockEls = null; if (opts.fadeOut) { - els.fadeOut(opts.fadeOut); - setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut); + count = els.length; + els.stop().fadeOut(opts.fadeOut, function() { + if ( --count === 0) + reset(els,data,opts,el); + }); } else reset(els, data, opts, el); - }; + } // move blocking element back into the DOM where it started function reset(els,data,opts,el) { + var $el = $(el); + if ( $el.data('blockUI.isBlocked') ) + return; + els.each(function(i,o) { // remove via DOM calls so we don't lose event handlers if (this.parentNode) @@ -442,14 +515,24 @@ if (data && data.el) { data.el.style.display = data.display; data.el.style.position = data.position; + data.el.style.cursor = 'default'; // #59 if (data.parent) 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') 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 function bind(b, el, opts) { @@ -462,40 +545,47 @@ $el.data('blockUI.isBlocked', b); // 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; // bind anchors and inputs for mouse and key events - var events = 'mousedown mouseup keydown keypress'; - b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler); + var events = 'mousedown mouseup keydown keypress keyup touchstart touchend touchmove'; + if (b) + $(document).bind(events, opts, handler); + else + $(document).unbind(events, handler); // former impl... - // var $e = $('a,:input'); - // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); - }; + // var $e = $('a,:input'); + // b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); + } // event handler to suppress keyboard/mouse events when blocking function handler(e) { // allow tab navigation (conditionally) - if (e.keyCode && e.keyCode == 9) { + if (e.type === 'keydown' && e.keyCode && e.keyCode == 9) { if (pageBlock && e.data.constrainTabKey) { var els = pageBlockEls; var fwd = !e.shiftKey && e.target === els[els.length-1]; var back = e.shiftKey && e.target === els[0]; if (fwd || back) { - setTimeout(function(){focus(back)},10); + setTimeout(function(){focus(back);},10); return false; } } } var opts = e.data; + var target = $(e.target); + if (target.hasClass('blockOverlay') && opts.onOverlayClick) + opts.onOverlayClick(e); + // 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; // 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) { if (!pageBlockEls) @@ -503,7 +593,7 @@ var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; if (e) e.focus(); - }; + } function center(el, x, y) { var p = el.parentNode, s = el.style; @@ -511,15 +601,16 @@ var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); if (x) s.left = l > 0 ? (l+'px') : '0'; if (y) s.top = t > 0 ? (t+'px') : '0'; - }; + } 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) { define(['jquery'], setup); } else {