/* * Main scripts. */ (function (win, doc, undef) { "use strict"; win.sbm = win.sbm || {}; //-------------------------------------------------------------- // Utilities. sbm.isDef = function (obj) { return obj === null || typeof obj == "undefined" ? false : true; } sbm.isFn = function (fn) { return fn != null && typeof fn == typeof Function; } sbm.isNumeric = function (n) { return !isNaN(parseFloat(n)) && isFinite(n); } sbm.getTime = function () { return (new Date()).getTime(); } sbm.zeroPad = function (num, count) { var val = num + ''; while (val.length < count) val = "0" + val; return val; } sbm.toInt = function (value, defaultValue) { return sbm.isNumeric(value) ? parseInt(value, 10) : defaultValue || 0; } if ("function" != typeof "".format) String.prototype.format = (function () { var rx1 = /\{(\d|\d\d)\}/g, rx2 = /\d+/; return function () { var args = arguments; return this.replace(rx1, function ($0) { var idx = 1 * $0.match(rx2)[0]; return args[idx] !== undefined ? args[idx] : (args[idx] === "" ? "" : $0); }); } }()); sbm.getFileType = function (file) { if (!file) return ""; if (file.type) return file.type; if (file.filename) return filename.split('.').pop(); return ""; } sbm.formatFileSize = function (size, decimals = 0) { if (size / 10 ** 9 > 1) return (size / 10.0 ** 9).toFixed(decimals) + ' Gb'; if (size / 10 ** 6 > 1) return (size / 10.0 ** 6).toFixed(decimals) + ' Mb'; if (size / 10 ** 3 > 1) return (size / 10.0 ** 3).toFixed(decimals) + ' Kb'; return size + ' bytes'; } sbm.escapeRegExp = function (val) { return (val || '').replace(/[[{}()*+?^$|\]\.\\]/g, "\\$&"); } sbm.haltEvent = function (evt) { evt.preventDefault(); evt.stopPropagation(); } sbm.debug = sbm.debugMode ? win.console.log.bind(win.console) : function () { }; //-------------------------------------------------------------- sbm.compareCI = function (a, b) { var comparison = a.toLowerCase().localeCompare(b.toLowerCase()); if (comparison === 0) return a.localeCompare(b); return comparison; } sbm.arraySortCI = function () { if (!this) return this; this.sort(function (a, b) { return sbm.compareCI(a, b); }); return this; }; //-------------------------------------------------------------- sbm.setOddDataRowClass = function (rowSel, cName) { $(rowSel).addClass(function (index, currentClasses) { return index % 2 == 1 ? (cName || "other") : ""; }); } sbm.selectOrAdd = function ($sel, code, desc) { $sel = $($sel); if ($sel.val(code).val() == code) return; $sel.append($('').prop('value', code).text(desc)); $sel.val(code); } sbm.populateSelect = function ($sel, values, code, desc) { $sel = $($sel).empty(); code = code || 'code'; desc = desc || 'desc'; for (const value of values || []) $sel.append($('').prop('value', value[code]).text(value[desc])); } sbm.refreshSelectCaption = function ($sel, values, code, desc) { $sel = $($sel); code = code || 'code'; desc = desc || 'desc'; for (const value of values || []) $sel.find($('option[value="' + value[code] + '"]').text(value[desc])); } sbm.populateSelectCodeDesc = function ($sel, values) { sbm.populateSelect($($sel), values); } sbm.checkTextAreaMaxLength = function (ctrl, len) { if (ctrl == null || ctrl.value == null) return; if (ctrl.value.length > len) ctrl.value = ctrl.value.substring(0, len); } sbm.setAvailableCharsInfo = function ($if, max, $info) { let info = ''; if (max > 0) { let avail = Math.max(0, max - $if.val().length); info = (avail == 1 ? sbm.lbl.charAvailable : sbm.lbl.charsAvailable.replace(/\{0\}/g, avail)); } ($info || $('.sbm-info', $if.closest('.sbm-form-control'))).text(info); } sbm.setItemsSelectedInfo = function ($sel, $info) { var sel = $(':selected', $sel).length; ($info || $('.sbm-info', $sel.closest('.sbm-form-control'))).text(sel == 0 ? sbm.lbl.noneSelected : sbm.lbl.numberSelected.replace(/\{0\}/g, sel)); } sbm.initCalendars = function (sel, opt) { return $(sel).prop('autocomplete', 'off').datepicker(opt || {}); } sbm.allowClearCalendar = function (sel) { $(sel).datepicker().on('keyup', function (e) { if (e.key == 'Backspace' || e.key == 'Delete') $(this).datepicker('setDate', null).datepicker('hide').trigger('change'); }); } sbm.refreshPaging = function (response, context, refreshFn) { if (sbm.isFn(sbm.resultsPaging.fn.refreshPaging)) sbm.resultsPaging.fn.refreshPaging(response.paging, context, refreshFn); } //-------------------------------------------------------------- sbm.configureItemTable = function (cfg, $sel) { //sbm.debug('configureItemTable', cfg, $sel); let col = cfg.column || {}; let $cell = $('th,td', $sel).removeClass('hidden'); (col.hide || []).forEach(function (v, i, a) { $cell.filter('.' + col.prefix + v).addClass('hidden'); }); } sbm.populateItemValues = function (cfg, $item, val) { //sbm.debug('populateItemValues', cfg, $item, val); for (var name in val || {}) { $item.find('.' + cfg.column.prefix + name).text(val[name]); }; } sbm.clearItemForm = function ($frm) { sbm.clearControlErrors($frm); $frm.find('.sbm-input,.sbm-textarea,.sbm-select').val('').filter('.sbm-auto-val').prop('readonly', false).prop('disabled', false); $frm.find('.sbm-checkbox').removeAttr('checked').filter('.sbm-auto-val').prop('readonly', false).prop('disabled', false); } sbm.configureItemControls = function (cfg, $frm) { //sbm.debug('configureItemControls', cfg); let fld = cfg.field || {}; let $ctrl = $('.sbm-form-control', $frm).show(); for (var name in fld.label || {}) { /* ... */ }; (fld.hide || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).hide().find('.sbm-input,.sbm-textarea,.sbm-select,.sbm-checkbox').filter('.sbm-auto-val').prop('disabled', true); }); (fld.readonly || []).forEach(function (v, i, a) { $ctrl.filter('.' + fld.prefix + v).find('.sbm-input,.sbm.textarea,.sbm-select,.sbm-checkbox').filter('.sbm-auto-val').prop('readonly', true).filter('.sbm-select,.sbm-checkbox').prop('disabled', true); }); } sbm.populateFormValues = function (cfg, $frm, val) { //sbm.debug('populateFormValues', cfg, $frm, val); let $ctrl = $frm.find('.sbm-input,.sbm-textarea,.sbm-select,.sbm-checkbox').filter('.sbm-auto-val'); for (var name in val || {}) { $ctrl.filter('.' + cfg.field.prefix + name).val(val[name]).filter('.sbm-checkbox').prop('checked', !!val[name]); }; } sbm.formatInteger = function ($ctrl) { if (sbm.isNumeric($ctrl.val())) $ctrl.val(parseFloat($ctrl.val()).toFixed(0)); } sbm.formatNumber = function ($ctrl, decs) { if (sbm.isNumeric($ctrl.val())) $ctrl.val(parseFloat($ctrl.val()).toFixed(Math.max(0, Math.min(4, decs)))); } sbm.formatCurrency = function ($ctrl) { if (sbm.isNumeric($ctrl.val())) $ctrl.val(parseFloat($ctrl.val()).toFixed(sbm.data.decimalsCurrency)); } //-------------------------------------------------------------- // Page navigation. sbm.navigateTo = function (action) { sbm.doPleaseWait(); $('#frmNavigate').prop('action', sbm.url.base + action).trigger('submit'); } sbm.goToPage = function (action) { sbm.doPleaseWait(); location = sbm.url.base + action; } // Security. sbm.redirectHome = function () { sbm.goToPage(''); } sbm.redirectHomeExp = function () { sbm.doPleaseWait(); document.location = sbm.url.sesionExpired; } sbm.onSignOut = function () { sbm.doConfirm(sbm.dlg.title.signOut, sbm.msg.signOutConfirm, sbm.doSignOut); } sbm.doSignOut = function () { sbm.doAjaxRequest({ url: sbm.url.base + 'Security/Ajax/SignOut', formId: 'frmNavigate' }, 50); } //-------------------------------------------------------------- // Dialogs. sbm.openDialog = function ($dlg, width, height) { let $win = $(win); $dlg.dialog( { minWidth: null, maxWidth: null, width: Math.min(width || 400, $win.width() * .90), minHeight: null, maxHeight: null, height: Math.min(height || 320, $win.innerHeight() * .96) }).dialog('open'); return $dlg; } sbm.dlgOpts = function () { return { autoOpen: false, modal: true, show: 'clip', hide: 'clip', minWidth: 320, maxWidth: 480, width: 'auto', resizable: false, draggable: false, closeOnEscape: false, dialogClass: "no-close", buttons: {} }; } sbm.dlgOptsClose = function () { var opts = sbm.dlgOpts(); opts.buttons[sbm.lbl.close] = function () { $(this).dialog('close'); }; return opts; } sbm.doAlert = function (title, msg, onOk) { if (!msg) { msg = title; title = null; } if (!sbm.isDef(sbm.$dlg.alert)) { var opt = sbm.dlgOpts(); sbm.$dlg.alert = $('').dialog(opt); } $('#dlgAlertMsg', sbm.$dlg.alert).html(msg.replace(/\n/g, '')); let btns = {}; btns[sbm.lbl.ok] = function () { $(this).dialog('close'); if (onOk) onOk(); }; sbm.$dlg.alert.dialog('option', { title: title || sbm.dlg.title.alert, buttons: btns }); sbm.openDialog(sbm.$dlg.alert); } sbm.doConfirm = function (title, msg, onOk, onCancel) { if (!msg) { msg = title; title = null; } if (!sbm.isDef(sbm.$dlg.confirm)) { var opt = sbm.dlgOpts(); opt.dialogClass += " sbm-dark-blue"; sbm.$dlg.confirm = $('').dialog(opt); } let btns = {}; btns[sbm.lbl.yes] = function () { $(this).dialog('close'); if (onOk) onOk(); }; btns[sbm.lbl.no] = function () { $(this).dialog('close'); if (onCancel) onCancel(); }; sbm.$dlg.confirm.dialog('option', { title: title || sbm.dlg.title.confirm, buttons: btns }); $('#dlgConfirmMsg').html(msg.replace(/\n/g, '')); sbm.openDialog(sbm.$dlg.confirm); } sbm.confirmItemRemove = function (fn) { sbm.doConfirm('', sbm.msg.itemRemoveConfirm, fn); } sbm.doProgress = function (title, msg, delay) { if (!msg) { msg = title; title = null; } clearTimeout(sbm.toShowProgress); if (!sbm.isDef(sbm.$dlg.progress)) { var opt = sbm.dlgOpts(); opt.show = { effect: 'fade', duration: 200 }; opt.hide = { effect: 'fade', duration: 200 }; sbm.$dlg.progress = $('').dialog(opt); } $('#dlgProgressMsg').html(msg.replace(/\n/g, '')); sbm.$dlg.progress.dialog('option', { title: title || sbm.dlg.title.progress }); if (delay > 0) sbm.toShowProgress = setTimeout(function () { sbm.$dlg.progress.dialog('open'); }, delay); else sbm.$dlg.progress.dialog('open'); } sbm.hideProgress = function () { clearTimeout(sbm.toShowProgress); sbm.$dlg.progress.dialog('close'); } //-------------------------------------------------------------- // Notifications. sbm.showNotification = function (title, msg, selParent) { win.clearTimeout(sbm.toNotification); var $win = $(win); var $par = selParent ? $(selParent) : $('#sbm-page-body main'); var $not = $('#sbm-notification').hide().remove(); if (!$not.length) $not = $('✖'); ($par.length ? $par : $('body')).append($not); var $hdr = $('.heading', $not).css({ 'background-color': 'rgba(247,217,0,0.7)' }); $not.find('.title').html(title).end().find('.message').html(msg); //sbm.debug(sbm.topMargin($bdy)); $not.show(500, function () { $hdr.delay(2000).animate({ backgroundColor: '#f0f0f0' }, 1000); }); sbm.toNotification = setTimeout(sbm.hideNotification, 6000); } sbm.hideNotification = function () { win.clearTimeout(sbm.toNotification); $('#sbm-notification').hide(500); } sbm.doPleaseWait = function () { sbm.$pleaseWait = sbm.$pleaseWait || $('#sbm-please-wait'); sbm.$pleaseWait.stop(true, false).animate({ "null": 1 }, 200).fadeTo(200, 1); } sbm.hidePleaseWait = function () { if (sbm.$pleaseWait) sbm.$pleaseWait.stop(true, false).fadeOut(200); } //-------------------------------------------------------------- // Ajax. sbm.doAjaxRequest = function (ajax, delay) { win.clearTimeout(ajax.timeout); if (!ajax.noWaitIcon) sbm.doPleaseWait(); ajax.timeout = setTimeout(function () { sbm.execAjaxRequest(ajax); }, Math.max(50, parseInt(delay || 0, 10))); } sbm.execAjaxRequest = function (ajax) { win.clearTimeout(ajax.timeout); if (ajax.request) ajax.request.abort(); var cfgAjax = { url: ajax.url, type: 'POST', cache: false, //enctype: 'multipart/form-data', data: ajax.formData || $(ajax.formSel || "#" + ajax.formId).serialize(), dataType: 'json', success: function (response, status, jqXHR) { if (!ajax.noWaitIcon) sbm.hidePleaseWait(); ajax.status = status; ajax.$msgs?.hide().empty(); const notifyMsg = response.notifyMesage; if (notifyMsg) sbm.showNotification(notifyMsg.title, notifyMsg.message, ajax.selNotifyParent); let popupMsg = response.popupMessage; const inlineMsg = response.inlineMessage; if (inlineMsg) { console.log(ajax.$msgs, inlineMsg); if (ajax.$msgs?.length) ajax.$msgs.append($(`'${inlineMsg.text.replace('\n', '')}`)).fadeIn(500); else if (!popupMsg) popupMsg = { title: inlineMsg.error ? 'Error' : inlineMsg.warning ? 'Warning' : 'Info', text: inlineMsg.text }; } if (popupMsg) { var fnCloseAlert = function () { if (response.sessionExpired) return sbm.redirectHomeExp(); if (response.goHome) return sbm.redirectHome(); if (ajax.callbackFn) ajax.callbackFn(response); } sbm.doAlert(popupMsg.title, popupMsg.text, function () { fnCloseAlert(); }); } else if (response.sessionExpired) return sbm.redirectHomeExp(); else if (response.goHome) return sbm.redirectHome(); else if (response.error && ajax.errFn) ajax.errFn(response); else if (ajax.callbackFn) ajax.callbackFn(response); }, error: function (jqXHR, status, errorThrown) { if (!ajax.noWaitIcon) sbm.hidePleaseWait(); ajax.status = status; ajax.$msgs?.hide().empty(); if (status == "abort") return; sbm.doAlert(sbm.dlg.title.alert, sbm.msg.somethingGoneWrong, sbm.redirectHome); }, complete: function (jqXHR, textStatus) { if (!ajax.noWaitIcon) sbm.hidePleaseWait(); ajax.formData = null; ajax.complete = true; } } if (ajax.formData) { //for (var pair of ajax.formData.entries()) sbm.debug(pair[0] + ': ' + pair[1]); cfgAjax.processData = false; cfgAjax.contentType = false; } ajax.request = $.ajax(cfgAjax); } //-------------------------------------------------------------- // Session. sbm.configureKeepLoggedIn = function () { //sbm.debug('KeepLoggedIn Configuring'); setTimeout(sbm.doKeepLoggedIn, Math.max(30000, sbm.keepLoggedInDelay || 300000)); } sbm.doKeepLoggedIn = function () { //sbm.debug('KeepLoggedIn Calling'); var onKeepLoggedIn = function (response) { //sbm.debug('KeepLoggedIn Responded', response); sbm.configureKeepLoggedIn(); } sbm.doAjaxRequest({ url: sbm.url.base + 'Security/Ajax/KeepLoggedIn', formId: 'frmNavigate', noWaitIcon: true, callbackFn: onKeepLoggedIn }, 1000) } sbm.configureSessionRefresh = function () { //sbm.debug('SessionRefresh Configuring'); $(document).on('mousedown mousemove touchstart scroll keydown', sbm.triggeRefreshSession); } sbm.triggeRefreshSession = function () { let ssr = sbm.session.refresh = sbm.session.refresh || {}; win.clearTimeout(ssr.timeout); ssr.timeout = setTimeout(function () { sbm.refreshSession(); }, 150000); } sbm.refreshSession = function () { //sbm.debug('sbm.refreshSession'); sbm.doKeepLoggedIn(); } //-------------------------------------------------------------- // Data entry. sbm.clearControlErrors = function (context) { var $ctrls = $('.sbm-form-control', $(context || doc.body)).removeClass('sbm-error'); $('.sbm-message', $ctrls).empty(); } sbm.clearControlError = function (sel) { var $ctrl = $(sel).closest('.sbm-form-control').removeClass('sbm-error'); $('.sbm-message', $ctrl).empty(); } sbm.setControlError = function (sel, error) { var $ctrl = $(sel).closest('.sbm-form-control').toggleClass('sbm-error', !!error.length); $('.sbm-message', $ctrl).text(error); } sbm.refreshControlValues = function (controlValues, context) { var $frmCtrls = $('.sbm-form-control', $(context || doc.body)).removeClass('sbm-error'); sbm.clearControlErrors(context); var values = (controlValues || []); var valuesLen = values.length; for (var valIdx = 0; valIdx < valuesLen; valIdx++) { let ctrlValue = values[valIdx]; $frmCtrls.each(function (idx, frmCtrl) { var $frmCtrl = $(frmCtrl); if (!$frmCtrl.hasClass(ctrlValue.controlName)) return; var $ctrl = $('input,textarea,select', $frmCtrl); if ($ctrl.length && $ctrl.prop('name') == ctrlValue.controlName && ctrlValue.value) $ctrl.val(ctrlValue.value); if (ctrlValue.error) $frmCtrl.addClass('sbm-error').find('.sbm-message').text(ctrlValue.error); }); } } //-------------------------------------------------------------- // Elements. sbm.objBtm = function (sel) { var $obj = $(sel); return Math.floor($obj.offset().top + $obj.outerHeight(true)); } sbm.innerBtm = function (sel) { var $obj = $(sel); return Math.floor($obj.offset().top + $obj.outerHeight() - sbm.bottomSurround($obj)); } sbm.innerTop = function (sel) { var $obj = $(sel); return Math.floor($obj.offset().top + sbm.topSurround($obj)); } sbm.topMargin = function (sel) { var $obj = $(sel); return parseInt($obj.css('margin-top'), 10); } sbm.topSurround = function (sel) { var $obj = $(sel); return parseInt($obj.css('margin-top'), 10) + parseInt($obj.css('border-top-width'), 10) + parseInt($obj.css('padding-top'), 10); } sbm.bottomSurround = function (sel) { var $obj = $(sel); return parseInt($obj.css('margin-bottom'), 10) + parseInt($obj.css('border-bottom-width'), 10) + parseInt($obj.css('padding-bottom'), 10); } sbm.marginHeight = function (sel) { var $obj = $(sel); return parseInt($obj.css('margin-top'), 10) + parseInt($obj.css('margin-bottom'), 10); } sbm.borderHeight = function (sel) { var $obj = $(sel); return parseInt($obj.css('border-top-width'), 10) + parseInt($obj.css('border-bottom-width'), 10); } //-------------------------------------------------------------- // Viewport - Desktop or Mobile. sbm.isMob = function () { return $('body.mob').length > 0; }; sbm.onChangeViewport = function (viewport) { var $body = $('body'); $body.removeClass('mob dsk'); if (viewport.is('xs')) $body.addClass('mob'); else if (viewport.current() != 'unrecognized') $body.addClass('dsk'); } sbm.isAutoHeight = function () { return ($(win).width() < 360 || $(win).height() < 560 || sbm.isMob()); } sbm.onWinResizePage = function () { }; sbm.onWinResize = function () { $('body').toggleClass('sbm-layout-flex', !sbm.isAutoHeight()).toggleClass('sbm-layout-flow', sbm.isAutoHeight()); sbm.onWinResizePage(); } setTimeout(sbm.onWinResize, 50); //-------------------------------------------------------------- $(function () { $(win).on('resize', function () { sbm.onWinResize(); }); $('.sbm-button-cta,.sbm-button-action,.sbm-action-link,.sbm-social-icon.sbm-action').prop('tabindex', 0); $.fn.visible = function () { return this.css('visibility', 'visible'); }; $.fn.invisible = function () { return this.css('visibility', 'hidden'); }; $.fn.toggleVisibility = function () { return this.css('visibility', function (i, visibility) { return (visibility == 'visible') ? 'hidden' : 'visible'; }); }; $.fn.removeStatusClasses = function () { return this.removeClass(function (idx, name) { return (name.match(/(^|\s)sbm-status-\S+/g) || []).join(' '); }); }; if (sbm.keepLoggedIn) sbm.configureKeepLoggedIn(); else if (!sbm.awaitingLogin) sbm.configureSessionRefresh(); $.datepicker.setDefaults({ showOn: 'both', buttonImageOnly: true, buttonImage: '../img/action/calendar24.png', buttonText: sbm.lbl.calendar, dateFormat: sbm.form.calendarDateFormat, changeMonth: true, changeYear: false, yearRange: '-30:+01', firstDay: 1, //defaultDate: 0, beforeShow: function (i) { if ($(i).attr('readonly')) { return false; } }, }); }); }(window, window.document)); /* The End */