{"version":3,"sources":["_dealius/extensions/decimal.js","_dealius/dls.js","_dealius/dls.log.js","_dealius/dls.auth.js","_dealius/dls.enums.js","_dealius/dls.lookups.js","_dealius/extensions/string.js","_dealius/extensions/array.js","_dealius/extensions/other.js","_dealius/extensions/moment.js","_dealius/extensions/numeral.js","_dealius/core/global-functions.js","_dealius/forms/common-validation.js","_dealius/extensions/ajax.js","_dealius/core/jquery.plugins.js","_dealius/core/modal.js","_dealius/core/ratio.js","_dealius/core/money.js","_dealius/core/address.js","_dealius/core/phone-number.js","_dealius/core/commissions.js","_dealius/core/user-storage.js","_dealius/core/global-ui-handlers.js","_dealius/forms/jquery.serialize-object.patched.js","_dealius/forms/ajax-form.js","_dealius/dls.thumbnails.js","_dealius/core/hidden-form.js","_dealius/core/search-criteria.js"],"sourcesContent":["(function() {\r\n if (typeof Decimal === 'undefined') {\r\n throw 'decimal.js is required';\r\n }\r\n\r\n Object.defineProperties(Decimal.prototype, {\r\n 'percentOf': {\r\n 'value': function (amount) {\r\n return Decimal.div(amount, 100).times(this).toNumber();\r\n }\r\n },\r\n 'percent': {\r\n 'value': function (amountFrom) {\r\n\r\n if (this.toNumber() === amountFrom) {\r\n return 100;\r\n }\r\n\r\n if (amountFrom !== 0) {\r\n return this.div(amountFrom).times(100).toNumber();\r\n }\r\n\r\n return 0;\r\n }\r\n }\r\n });\r\n\r\n Decimal.getRatio = function (value1, value2) {\r\n return Decimal.div(value1, value2).toNumber();\r\n };\r\n})();","dls = $.extend(window.dls || {}, (function () {\r\n\r\n var _init = false,\r\n _trimTime = (dateTime) => {\r\n\r\n if (typeof dateTime === 'string') {\r\n return dateTime.split('T')[0];\r\n }\r\n\r\n // add logic to process Date type\r\n\r\n return dateTime;\r\n },\r\n _toNumber = (value) => {\r\n\r\n if (typeof value === 'string') {\r\n var number = parseFloat(value);\r\n return isNaN(number) ? null : number;\r\n }\r\n\r\n return value;\r\n },\r\n _toGeoCoordinate = (value) => {\r\n\r\n var result = new Decimal(value).toDecimalPlaces(6).toNumber();\r\n return result;\r\n },\r\n _prepareImages = () => {\r\n\r\n $('img[data-src]').each(function () {\r\n var $img = $(this);\r\n var res = $img.data('src');\r\n\r\n if (window.devicePixelRatio > 1) {\r\n res = $img.data('src-x2');\r\n }\r\n\r\n $img.attr('src', res);\r\n });\r\n },\r\n _overrideDefaultJqueryVal = () => {\r\n\r\n var originalVal = $.fn.val;\r\n $.fn.val = function () {\r\n var prev;\r\n if (arguments.length > 0) {\r\n prev = originalVal.apply(this, []);\r\n }\r\n\r\n var result = originalVal.apply(this, arguments);\r\n\r\n if (arguments.length > 0 && prev != originalVal.apply(this, [])) {\r\n $(this).change();\r\n }\r\n\r\n return result;\r\n };\r\n\r\n $.fn.valOriginal = originalVal;\r\n },\r\n _getIconName = (fileExtension, fileMimeType) => {\r\n\r\n if (fileMimeType.startsWith('image/')) { return 'img'; }\r\n if (fileMimeType === 'text/plain') { return 'txt'; }\r\n if (fileExtension === 'doc' || fileExtension === 'docx') { return 'doc'; }\r\n if (fileExtension === 'xls' || fileExtension === 'xlsx') { return 'xls'; }\r\n if (fileExtension === 'ppt' || fileExtension === 'pptx') { return 'ppt'; }\r\n if (fileExtension === 'pdf') { return 'pdf'; }\r\n\r\n return 'file';\r\n },\r\n _getResolvedPromise = (...args) => {\r\n\r\n var dfd = $.Deferred();\r\n\r\n return dfd.resolve(...args).promise();\r\n },\r\n _getRejectedPromise = (...args) => {\r\n\r\n var dfd = $.Deferred();\r\n\r\n return dfd.reject(...args).promise();\r\n },\r\n _makeUrlAbsolute = (url, protocol) => {\r\n\r\n if (!url) {\r\n return '';\r\n }\r\n\r\n var result = url;\r\n if (result.indexOf('://') > 0) {\r\n return result;\r\n }\r\n\r\n return '{0}://{1}'.format(protocol || 'http', url);\r\n },\r\n _setClientTimezoneOffset = () => {\r\n\r\n var cookieName = 'dealius.clientTimezoneOffset',\r\n storedOffset = +$.cookie(cookieName),\r\n currentOffset = (new Date()).getTimezoneOffset();\r\n\r\n if (storedOffset != currentOffset) {\r\n $.cookie(cookieName, currentOffset, { path: '/', expires: 7 });\r\n }\r\n },\r\n _makeContentVisible = () => {\r\n\r\n $('#main').fadeIn('fast');\r\n },\r\n _setupNoty = () => {\r\n\r\n $.noty.defaults.theme = 'relax';\r\n },\r\n _publishCrossTabEvent = (key, value) => {\r\n\r\n localStorage.setItem(key, value);\r\n localStorage.removeItem(key, value);\r\n },\r\n _bindToCrossTabEvent = (key, callback) => {\r\n\r\n window.addEventListener('storage', (e) => {\r\n\r\n if (e.key == key) {\r\n callback(e.newValue);\r\n }\r\n });\r\n },\r\n _initFormsValidation = () => {\r\n\r\n if ($.isFunction($.fn.validate)) {\r\n\r\n $('form').each(function () {\r\n\r\n $(this).validate();\r\n });\r\n }\r\n },\r\n _deepEqual = (object1, object2) => {\r\n\r\n const keys1 = Object.keys(object1);\r\n const keys2 = Object.keys(object2);\r\n\r\n if (keys1.length !== keys2.length) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < keys1.length; i++) {\r\n\r\n const key = keys1[i],\r\n val1 = object1[key],\r\n val2 = object2[key],\r\n areObjects = _isObject(val1) && _isObject(val2);\r\n\r\n if (\r\n areObjects && !_deepEqual(val1, val2) ||\r\n !areObjects && val1 !== val2\r\n ) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n },\r\n _isObject = (object) => {\r\n return object != null && typeof object === 'object';\r\n },\r\n _formatDateOnly = (date, format) => {\r\n\r\n if (!date) {\r\n\r\n return '';\r\n }\r\n\r\n return moment.utc(date).format(format || 'MM/DD/YYYY');\r\n };\r\n\r\n return {\r\n init: function () {\r\n\r\n if (_init) {\r\n return;\r\n }\r\n\r\n _init = true;\r\n\r\n _overrideDefaultJqueryVal();\r\n _prepareImages();\r\n _setClientTimezoneOffset();\r\n _makeContentVisible();\r\n _setupNoty();\r\n _initFormsValidation();\r\n },\r\n\r\n extend: function (object) {\r\n\r\n if (object == null) {\r\n object = {};\r\n }\r\n\r\n Object.keys(object).forEach((key) => {\r\n\r\n Object.defineProperty(this, key, {\r\n value: object[key],\r\n enumerable: true\r\n });\r\n });\r\n },\r\n\r\n isFn: $.isFunction,\r\n\r\n isNum: $.isNumeric,\r\n isNumber: $.isNumeric,\r\n toNumber: _toNumber,\r\n\r\n toGeoCoordinate: _toGeoCoordinate,\r\n\r\n trim: $.trim,\r\n trimTime: _trimTime,\r\n\r\n formatDateOnly: _formatDateOnly,\r\n\r\n deepEqual: _deepEqual,\r\n\r\n resolvedPromise: _getResolvedPromise,\r\n rejectedPromise: _getRejectedPromise,\r\n\r\n crossTabEvent: {\r\n\r\n publish: (key, value) => _publishCrossTabEvent(key, value),\r\n bind: (key, callback) => _bindToCrossTabEvent(key, callback)\r\n },\r\n\r\n redirect: function (url) {\r\n\r\n window.location = url;\r\n },\r\n\r\n openWindow: function (url) {\r\n\r\n window.open(url, '_blank');\r\n },\r\n\r\n url: function (url, data) {\r\n\r\n if (!data) {\r\n return url;\r\n }\r\n\r\n let params = [],\r\n _toString = (key, value) => {\r\n\r\n return encodeURIComponent(key) + '=' + encodeURIComponent(value);\r\n },\r\n _toKeyValuePair = (key, value) => {\r\n\r\n if (value instanceof Array) {\r\n\r\n let result = [];\r\n\r\n for (const i in value) {\r\n\r\n let pname = key + '[' + i + ']',\r\n pvalue = value[i];\r\n\r\n if ($.isPlainObject(pvalue)) {\r\n\r\n for (var p in pvalue) {\r\n\r\n result.push(_toKeyValuePair(pname + '[' + p + ']', pvalue[p]));\r\n }\r\n } else {\r\n\r\n result.push(_toKeyValuePair(pname, pvalue));\r\n }\r\n }\r\n\r\n if (result.length > 0) {\r\n return result.join('&');\r\n }\r\n }\r\n\r\n if ($.isFunction(value)) { value = value(); }\r\n\r\n if (value instanceof Date) { value = value.toLocaleDateString(dls.locale); }\r\n\r\n if (value == null) { value = ''; }\r\n\r\n return _toString(key, value);\r\n };\r\n\r\n $.each(data, function (key, value) {\r\n\r\n key && params.push(_toKeyValuePair(key, value));\r\n });\r\n\r\n if (url.indexOf('?') == -1) {\r\n url += '?';\r\n } else {\r\n url += '&';\r\n }\r\n\r\n url += params.join('&');\r\n return url;\r\n },\r\n\r\n downloadFile: function (url, onload) {\r\n\r\n var dWindow = window.open(url);\r\n //window.location = url;\r\n if (onload) { onload(); }\r\n },\r\n \r\n getIconUrl: function (fileType, mimeType) {\r\n\r\n var iconName = _getIconName(fileType, mimeType),\r\n iconUrl = `${dls.iconsUrl}${iconName}.png`;\r\n\r\n return iconUrl;\r\n },\r\n\r\n getFileSvgIconUrl: function (fileType, mimeType) {\r\n\r\n var iconName = _getIconName(fileType, mimeType),\r\n iconUrl = `${dls.iconsUrl}${iconName}.svg`;\r\n\r\n return iconUrl;\r\n },\r\n\r\n getIconUrls: function (fileType, mimeType, asString) {\r\n\r\n var iconName = dls.iconsUrl + _getIconName(fileType, mimeType),\r\n attrSrc = iconName + '.png',\r\n attrSrcSet = '{0}@2x.png 2x, {0}.png 1x'.format(iconName);\r\n\r\n if (asString) {\r\n return 'src=\"{0}\" srcset=\"{1}\"'.format(attrSrc, attrSrcSet);\r\n } else {\r\n return { src: attrSrc, srcset: attrSrcSet };\r\n }\r\n },\r\n\r\n showError: function (errors, timeToShow) {\r\n\r\n if (errors == null) {\r\n return;\r\n }\r\n\r\n errors = [].concat(errors); // make array if string provided\r\n var output;\r\n\r\n if (errors.length == 1) {\r\n output = errors[0].escapeHtml();\r\n } else {\r\n output = [\r\n ''\r\n ].join('');\r\n }\r\n\r\n if (typeof (timeToShow) === 'undefined') {\r\n timeToShow = 15000;\r\n }\r\n\r\n this.showNoty(output, {\r\n timeout: timeToShow,\r\n layout: 'top',\r\n type: 'error',\r\n killer: true,\r\n animation: {\r\n open: 'animated fadeInDown',\r\n close: 'animated fadeOutUp'\r\n }\r\n });\r\n\r\n if (console && console.error) {\r\n for (var i = 0; i < errors.length; i++) {\r\n console.error(errors[i]);\r\n }\r\n }\r\n },\r\n\r\n showNoty: function (text, options) {\r\n\r\n var opts = $.extend({\r\n text: text,\r\n timeout: 2000,\r\n layout: 'center',\r\n type: 'success',\r\n animation: {\r\n open: 'animated flipInX',\r\n close: 'animated flipOutX'\r\n }\r\n }, options);\r\n\r\n noty(opts);\r\n },\r\n \r\n hideAllNoty: function () {\r\n\r\n $.noty.closeAll();\r\n },\r\n\r\n social: {\r\n twitter: function (url) {\r\n return _makeUrlAbsolute(url, 'https');\r\n },\r\n linkedin: function (url) {\r\n return _makeUrlAbsolute(url, 'https');\r\n },\r\n facebook: function (url) {\r\n return _makeUrlAbsolute(url, 'https');\r\n }\r\n },\r\n\r\n loadJs: function (jsToLoad) {\r\n\r\n var toLoad = [],\r\n defaultLoadOptions = {\r\n id: '',\r\n src: '',\r\n async: true,\r\n onload: null,\r\n then: false\r\n },\r\n nomalizeLoadOptions = function (opts) {\r\n var result = $.extend({}, defaultLoadOptions, opts);\r\n if (result.then) {\r\n result.then = nomalizeLoadOptions(result.then);\r\n var _onload = result.onload;\r\n result.onload = function () {\r\n addScript(result.then);\r\n _onload && _onload();\r\n };\r\n }\r\n\r\n return result;\r\n },\r\n addScript = function (jsLoadOpts) {\r\n callAsync(function () {\r\n var el = document.createElement(\"script\");\r\n el.type = \"text/javascript\";\r\n el.id = jsLoadOpts.id;\r\n el.src = jsLoadOpts.src;\r\n el.async = jsLoadOpts.async;\r\n el.onload = jsLoadOpts.onload;\r\n (document.body || document.getElementsByTagName('body')[0]).appendChild(el);\r\n });\r\n };\r\n\r\n if ($.isArray(jsToLoad)) {\r\n toLoad = jsToLoad.map(function (jsLoadOpts) {\r\n return nomalizeLoadOptions(jsLoadOpts);\r\n });\r\n } else {\r\n toLoad.push(nomalizeLoadOptions(jsToLoad));\r\n }\r\n\r\n for (var i = 0; i < toLoad.length; i++) {\r\n addScript(toLoad[i]);\r\n }\r\n },\r\n\r\n appendStyles: function (cssString) {\r\n var head = document.head || document.getElementsByTagName('head')[0],\r\n style = document.createElement('style');\r\n\r\n style.type = 'text/css';\r\n if (style.styleSheet) {\r\n style.styleSheet.cssText = cssString;\r\n } else {\r\n style.appendChild(document.createTextNode(cssString));\r\n }\r\n\r\n head.appendChild(style);\r\n },\r\n\r\n makeUrlAbsolute: _makeUrlAbsolute\r\n };\r\n})());\r\n\r\n\r\n\r\n// errors global handler\r\n$(window).on(\"error\", function (jqe) {\r\n\r\n var e = jqe.originalEvent,\r\n message = e.message.escapeHtml(),\r\n row = e.lineno,\r\n col = e.colno,\r\n dlsMessage = `${message} [line: ${row}, column: ${col}]`;\r\n\r\n if (dls.debug) {\r\n noty({\r\n text: dlsMessage,\r\n timeout: 15 * 1000,\r\n layout: 'topLeft',\r\n type: 'error',\r\n animation: {\r\n open: 'animated fadeInDown',\r\n close: 'animated fadeOut'\r\n }\r\n });\r\n }\r\n\r\n //if (console && console.error) {\r\n // console.error(dlsMessage);\r\n //}\r\n\r\n //return dls.debug;\r\n});\r\n\r\n\r\n\r\n/*** deals common functions ***/\r\n(function () {\r\n window['deals'] = {\r\n 'color': {\r\n 'gray': '#AAAAAA',\r\n 'darkGray': '#444444',\r\n 'purple': '#c07cff',\r\n 'green': '#60b103',\r\n 'yellow': '#f5c623',\r\n 'orange': '#f58123',\r\n 'darkOrange': '#f26518',\r\n 'red': '#ff0022',\r\n 'blue': '#005dab'\r\n },\r\n 'getClosingDateColor': function (value) {\r\n if (!value) {\r\n return deals.color.darkOrange;\r\n }\r\n\r\n var date = moment(value),\r\n now = moment().startOf('day'),\r\n daysDiff = date.diff(now, 'days', true);\r\n\r\n if (daysDiff <= 30) {\r\n return deals.color.green;\r\n } else if (daysDiff <= 60) {\r\n return deals.color.yellow;\r\n } else {\r\n return deals.color.darkOrange;\r\n }\r\n },\r\n 'getStatusColor': function (probability) {\r\n if (probability == 0) { return this.color['gray']; }\r\n if (probability >= 1 && probability <= 10) { return this.color['purple']; }\r\n if (probability >= 11 && probability <= 50) { return this.color['yellow']; }\r\n if (probability >= 51 && probability <= 70) { return this.color['yellow']; }\r\n if (probability >= 71 && probability <= 99) { return this.color['green']; }\r\n if (probability == 100) { return this.color['gray']; }\r\n },\r\n 'getLabelStatus': function (statusName, probability) {\r\n var $label = $('').text(statusName),\r\n color = this.getStatusColor(probability);\r\n\r\n $label.css('background-color', color);\r\n\r\n return $label;\r\n },\r\n 'getLabelDealType': function (repTypeName, dealTypeName) {\r\n var $label = $(''),\r\n text = (repTypeName || '').toUpperCase();\r\n\r\n if (dealTypeName) {\r\n text = dealTypeName.toUpperCase() + ' - ' + text;\r\n }\r\n\r\n $label.text(text);\r\n\r\n return $label;\r\n },\r\n 'getLabelDealTypeHtml': function (labelText) {\r\n var text = (labelText || '').escapeHtml();\r\n return '{0}'.format(text);\r\n },\r\n 'getLastModifiedLabel': function (lastModifiedDate, lastModifier) {\r\n\r\n var output = [];\r\n\r\n if (lastModifier || lastModifiedDate) {\r\n\r\n output.push('Updated ');\r\n output.push(lastModifier ? ` by ${lastModifier}` : '');\r\n\r\n if (lastModifiedDate) {\r\n\r\n output.push(` ${moment(lastModifiedDate).toFriendlyDateTimeString()}`);\r\n }\r\n }\r\n\r\n return `${output.join('')}`;\r\n },\r\n 'getLabelDealImportedHtml': function (imported) {\r\n return imported ? 'IMPORT' : '';\r\n },\r\n 'applyColumnUserSettings': function (columnSettingsBase, columnName, gridSettings) {\r\n var columnSettings;\r\n $.each(gridSettings.columns, function () {\r\n if (this.name == columnName) {\r\n columnSettings = this;\r\n return false;\r\n }\r\n\r\n return true;\r\n });\r\n\r\n return $.extend(true, columnSettingsBase, {\r\n title: columnSettings.title,\r\n attributes: {\r\n 'data-column': columnSettings.name\r\n },\r\n hidden: columnSettingsBase.hidden || columnSettings.hidden || !columnSettings.visible\r\n });\r\n }\r\n };\r\n})();\r\n\r\n\r\n/*** lookups common functions ***/\r\n(function () {\r\n window['lookups'] = {\r\n 'getCountyForName': function (name, stateId, onReady) {\r\n if (!name) {\r\n onReady(null);\r\n return;\r\n }\r\n\r\n $.get(\r\n dls.route('Lookup', 'ListCounties'),\r\n {\r\n Query: name,\r\n StateId: stateId,\r\n Limit: 1\r\n },\r\n function (data) {\r\n if (Array.isArray(data) && data.length > 0) {\r\n onReady(data[0]);\r\n } else {\r\n onReady(null);\r\n }\r\n },\r\n 'json');\r\n }\r\n };\r\n})();","((dls, cnsl) => {\r\n\r\n let _logger = cnsl,\r\n _log = (...args) => {\r\n\r\n if (_logger && _logger.log) {\r\n _logger.log(...args);\r\n }\r\n },\r\n _debug = (...args) => {\r\n\r\n if (dls.debug) {\r\n _log('[Debug]:', ...args);\r\n }\r\n },\r\n _warn = (...args) => {\r\n\r\n if (_logger && _logger.warn) {\r\n _logger.warn(...args);\r\n }\r\n },\r\n _error = (...args) => {\r\n\r\n if (_logger && _logger.error) {\r\n _logger.error(...args);\r\n }\r\n },\r\n _obsolete = (oldUsage, newUsage, ...args) => {\r\n\r\n const msg = `[Deprecated]: \"${oldUsage}\" is obsolete, consider using \"${newUsage}\" instead.`;\r\n _warn(msg, ...args);\r\n };\r\n\r\n\r\n\r\n function DlsLogger(...args) {\r\n\r\n _log(...args);\r\n }\r\n\r\n Object.defineProperties(DlsLogger, {\r\n\r\n extend: { value: dls.extend.bind(DlsLogger) },\r\n\r\n log: { value: _log },\r\n\r\n debug: { value: _debug },\r\n\r\n warn: { value: _warn },\r\n\r\n error: { value: _error },\r\n\r\n obsolete: { value: _obsolete }\r\n\r\n });\r\n\r\n\r\n\r\n dls.extend({\r\n log: DlsLogger\r\n });\r\n\r\n})(window.dls, window.console);","((dls) => {\r\n\r\n const _events = {\r\n SIGNED_IN: 'signedIn.dls.auth'\r\n },\r\n _cookieKeys = {\r\n SignedInCookie: 'SignedInCookie'\r\n },\r\n _getCookie = (name) => $.cookie(name),\r\n _removeCookie = (name) => $.removeCookie(name, { path: '/' }),\r\n _publishCrossTabEvent = dls.crossTabEvent.publish,\r\n _bindToCrossTabEvent = dls.crossTabEvent.bind;\r\n\r\n\r\n function DlsAuth() { }\r\n\r\n\r\n Object.defineProperties(DlsAuth, {\r\n\r\n 'events': _events,\r\n\r\n 'extend': {\r\n value: dls.extend.bind(DlsAuth)\r\n },\r\n\r\n 'triggerSignedIn': {\r\n value: function () {\r\n\r\n if (_getCookie(_cookieKeys.SignedInCookie) === 'true') {\r\n\r\n _publishCrossTabEvent(_events.SIGNED_IN, true);\r\n _removeCookie(_cookieKeys.SignedInCookie);\r\n }\r\n }\r\n },\r\n\r\n 'triggerSignedOut': {\r\n value: function () {\r\n\r\n if (_getCookie(_cookieKeys.SignedInCookie) === 'false') {\r\n\r\n _publishCrossTabEvent(_events.SIGNED_IN, false);\r\n _removeCookie(_cookieKeys.SignedInCookie);\r\n }\r\n }\r\n },\r\n\r\n 'onSignIn': {\r\n value: function (callback) {\r\n\r\n _bindToCrossTabEvent(_events.SIGNED_IN, (value) => {\r\n\r\n if (value === 'true') {\r\n callback();\r\n }\r\n });\r\n }\r\n },\r\n\r\n 'onSignOut': {\r\n value: function (callback) {\r\n\r\n _bindToCrossTabEvent(_events.SIGNED_IN, (value) => {\r\n\r\n if (value === 'false') {\r\n callback();\r\n }\r\n });\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n dls.extend({\r\n 'auth': DlsAuth\r\n });\r\n\r\n})(window.dls);\r\n\r\n\r\n\r\n((dls) => {\r\n\r\n const MAX_TIMEOUT_MS = 2147483647,\r\n INIT_DELAY_MS = 5 * 1000;\r\n\r\n var _confirmationTimer,\r\n _logoutTimer,\r\n _keys = {\r\n EXTENDED: 'extendedUserSession'\r\n },\r\n _parseDate = (value) =>\r\n value != null ? new Date(value) : null,\r\n \r\n _getConfirmationDurationMs = () =>\r\n (dls.defaults && dls.defaults.extendUserSessionConfirmationDurationMs) || 0,\r\n \r\n _getExpirationMs = (expirationDate) =>\r\n expirationDate - new Date(),\r\n \r\n _supportsSessionExtension = () =>\r\n dls.defaults != null && dls.route != null,\r\n \r\n _logout = () => \r\n $.postJSON(dls.route('Account', 'Logout'))\r\n .always(() => dls.redirect(location.href.substring(location.origin.length))),\r\n\r\n _getSessionExpiration = () =>\r\n $.getJSON(dls.route('Account', 'GetSessionExpiration')),\r\n\r\n _onExpirationDateChange = function (expirationDateUtc) {\r\n\r\n _hideConfirmation();\r\n\r\n if (expirationDateUtc) {\r\n\r\n dls.log.debug(`Session expires at: ${expirationDateUtc}`);\r\n _scheduleConfirmation(expirationDateUtc);\r\n _scheduleLogout(expirationDateUtc);\r\n\r\n } else {\r\n\r\n dls.log.warn('Unknown session expiration date.');\r\n }\r\n\r\n return expirationDateUtc;\r\n },\r\n _init = () => {\r\n\r\n _cancelScheduledConfirmation();\r\n _cancelScheduledLogout();\r\n\r\n if (_supportsSessionExtension() === false) {\r\n return;\r\n }\r\n\r\n return _getSessionExpiration()\r\n .then(_parseDate)\r\n .then(_onExpirationDateChange);\r\n },\r\n _deferredInit = (delay) =>\r\n setTimeout(_init, delay),\r\n\r\n _extendSession = () =>\r\n $.postJSON(dls.route('Account', 'ExtendSession'))\r\n .then(_init)\r\n .then((expirationDateUtc) => dls.crossTabEvent.publish(_keys.EXTENDED, expirationDateUtc.toISOString())),\r\n\r\n _scheduleLogout = (expirationDateUtc) => {\r\n\r\n _cancelScheduledLogout();\r\n\r\n let expirationMs = _getExpirationMs(expirationDateUtc);\r\n\r\n if (expirationMs > 0 && expirationMs < MAX_TIMEOUT_MS) {\r\n _logoutTimer = setTimeout(_logout, expirationMs);\r\n }\r\n },\r\n _cancelScheduledLogout = () =>\r\n clearTimeout(_logoutTimer),\r\n\r\n _showConfirmation = (expirationDateUtc) =>\r\n dls.modal.confirmUserSessionExtension(expirationDateUtc)\r\n .then(_extendSession, _logout),\r\n\r\n _hideConfirmation = () =>\r\n dls.modal.confirmUserSessionExtension.hide(),\r\n\r\n _scheduleConfirmation = (expirationDateUtc) => {\r\n\r\n _cancelScheduledConfirmation();\r\n\r\n let expirationMs = _getExpirationMs(expirationDateUtc),\r\n delay = expirationMs - _getConfirmationDurationMs();\r\n\r\n if (expirationMs > 0 && expirationMs < MAX_TIMEOUT_MS) {\r\n _confirmationTimer = setTimeout(() => _showConfirmation(expirationDateUtc), delay);\r\n }\r\n },\r\n _cancelScheduledConfirmation = () =>\r\n clearTimeout(_confirmationTimer);\r\n\r\n\r\n\r\n $(() => _deferredInit(INIT_DELAY_MS));\r\n\r\n dls.crossTabEvent.bind(_keys.EXTENDED, (value) => {\r\n\r\n let date = _parseDate(value);\r\n\r\n if (date != null) {\r\n _onExpirationDateChange(date);\r\n }\r\n });\r\n\r\n})(window.dls);","((dls) => {\r\n\r\n function DlsEnums() {}\r\n\r\n\r\n Object.defineProperties(DlsEnums, {\r\n\r\n 'extend': {\r\n value: dls.extend.bind(DlsEnums)\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n dls.extend({\r\n enums: DlsEnums\r\n });\r\n\r\n})(window.dls);","((dls) => {\r\n\r\n function DlsLookups() {}\r\n\r\n\r\n Object.defineProperties(DlsLookups, {\r\n\r\n 'extend': {\r\n value: dls.extend.bind(DlsLookups)\r\n },\r\n\r\n 'getName': {\r\n value: (lookupName, id) => {\r\n\r\n var lookup = DlsLookups[lookupName];\r\n\r\n if (lookup == null) {\r\n return undefined;\r\n }\r\n\r\n var found = lookup.find(x => x['ID'] == id);\r\n return found ? found.Name : undefined;\r\n }\r\n }\r\n\r\n });\r\n\r\n\r\n\r\n dls.extend({\r\n lookups: DlsLookups\r\n });\r\n\r\n})(window.dls);","(() => {\r\n \r\n Object.defineProperties(String.prototype, {\r\n 'format': {\r\n value: function (array) {\r\n var args = arguments.length > 1 ? arguments : (array instanceof Array ? array : [array]);\r\n return this.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof args[number] !== 'undefined' ?\r\n args[number] :\r\n match;\r\n });\r\n }\r\n },\r\n 'template': {\r\n value: function (data) {\r\n var result = this;\r\n data = data || {};\r\n\r\n Object.keys(data).forEach(function (key) {\r\n result = result.replace(new RegExp('{{' + key + '}}', 'g'), data[key]);\r\n });\r\n\r\n return result;\r\n }\r\n },\r\n 'capitalize': {\r\n value: function (array) {\r\n var args = arguments.length > 1 ? arguments : (array instanceof Array ? array : [array]);\r\n return this.replace(/{(\\d+)}/g, function (match, number) {\r\n return typeof args[number] != 'undefined' ?\r\n args[number] :\r\n match;\r\n });\r\n }\r\n },\r\n 'escapeHtml': {\r\n value: function () {\r\n return $('
').text(this || '').html();\r\n }\r\n },\r\n 'escapeRegEx': {\r\n value: function () {\r\n return (this || '').replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n }\r\n },\r\n 'escapeQuotes': {\r\n value: function () {\r\n return this.replace(/\"/g, '"');\r\n }\r\n },\r\n 'escapeSlash': {\r\n value: function () {\r\n return this.replace(/\\\\/g, '\\\\\\\\');\r\n }\r\n },\r\n 'replaceAll': {\r\n value: function (search, replacement) {\r\n var target = this;\r\n return target.replace(new RegExp(search, 'g'), replacement);\r\n }\r\n },\r\n 'hashCode': {\r\n value: function () {\r\n var hash = 0, i, chr;\r\n if (this.length === 0) return hash;\r\n for (i = 0; i < this.length; i++) {\r\n chr = this.charCodeAt(i);\r\n hash = ((hash << 5) - hash) + chr;\r\n hash |= 0; // Convert to 32bit integer\r\n }\r\n return hash;\r\n }\r\n }\r\n });\r\n \r\n})();","(() => {\r\n\r\n Object.defineProperties(Array.prototype, {\r\n unique: {\r\n value: function () {\r\n var u = {},\r\n a = [];\r\n for (var i = 0, l = this.length; i < l; ++i) {\r\n if (u.hasOwnProperty(this[i])) {\r\n continue;\r\n }\r\n a.push(this[i]);\r\n u[this[i]] = 1;\r\n }\r\n return a;\r\n }\r\n },\r\n count: {\r\n value: function (fn) {\r\n\r\n if (fn === undefined) {\r\n return this.length;\r\n }\r\n\r\n return this.filter(fn).length;\r\n }\r\n },\r\n max: {\r\n value: function (propertyNameOrFn) {\r\n\r\n if (arguments.length == 0) {\r\n return Math.max.apply(null, this);\r\n }\r\n\r\n var array = this.select.apply(this, arguments);\r\n return Math.max.apply(null, array);\r\n }\r\n },\r\n min: {\r\n value: function (propertyNameOrFn) {\r\n\r\n if (arguments.length == 0) {\r\n return Math.min.apply(null, this);\r\n }\r\n\r\n var array = this.select.apply(this, arguments);\r\n return Math.min.apply(null, array);\r\n }\r\n },\r\n avg: {\r\n value: function (propertyNameOrFn) {\r\n\r\n const array = this.select.apply(this, arguments),\r\n sum = array.sum(),\r\n avg = array.length > 0 ? Decimal.div(sum, array.length).toNumber() : 0;\r\n\r\n return avg;\r\n }\r\n },\r\n sum: {\r\n value: function (propertyNameOrFn) {\r\n\r\n const array = this.select.apply(this, arguments);\r\n let result = 0;\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n\r\n result += +array[i] * 10;\r\n }\r\n\r\n return result / 10;\r\n }\r\n },\r\n sumMoney: {\r\n value: function (propertyNameOrFn) {\r\n\r\n const array = this.select.apply(this, arguments);\r\n let result = 0;\r\n\r\n for (let i = 0; i < array.length; i++) {\r\n\r\n result += Math.round(+array[i] * 100);\r\n }\r\n\r\n return result / 100;\r\n }\r\n },\r\n sumDecimals: {\r\n value: function (propertyNameOrFn) {\r\n var array = this.select.apply(this, arguments);\r\n var result = new Decimal(0);\r\n for (var i = 0, l = array.length; i < l; i++) {\r\n var value = +array[i];\r\n result = result.plus(value);\r\n }\r\n\r\n return result.toNumber();\r\n }\r\n },\r\n select: {\r\n value: function (propertyNameOrFn) {\r\n var result = [];\r\n for (var i = 0, l = this.length; i < l; i++) {\r\n var item = this[i];\r\n var value = arguments.length\r\n ? dls.isFn(propertyNameOrFn) ? propertyNameOrFn(item, i) : item[propertyNameOrFn]\r\n : item;\r\n result.push(value);\r\n }\r\n\r\n return result;\r\n }\r\n },\r\n selectMany: {\r\n value: function (propertyNameOrFn) {\r\n var result = [];\r\n this.select.apply(this, arguments).each(function (x) {\r\n result = result.concat(x);\r\n });\r\n\r\n return result;\r\n }\r\n },\r\n notEmpty: {\r\n value: function () {\r\n return this.filter(x =>\r\n x !== undefined &&\r\n x !== null &&\r\n x !== '');\r\n }\r\n },\r\n where: {\r\n value: function (fn) {\r\n return this.filter(fn);\r\n }\r\n },\r\n one: {\r\n value: function (fn) {\r\n var array = this;\r\n if (fn != null) {\r\n array = array.where(fn);\r\n }\r\n\r\n return array.length ? array[0] : null;\r\n }\r\n },\r\n first: {\r\n value: function () {\r\n if (this.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return this[0];\r\n }\r\n },\r\n last: {\r\n value: function () {\r\n if (this.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return this[this.length - 1];\r\n }\r\n },\r\n contains: {\r\n value: function (value) {\r\n return this.indexOf(value) > -1;\r\n },\r\n writable: true\r\n },\r\n except: {\r\n value: function (value) {\r\n const exclude = [].concat(value),\r\n result = this.where(x => !exclude.includes(x));\r\n\r\n return result;\r\n }\r\n },\r\n anyOf: {\r\n value: function () {\r\n var values = Array.prototype.slice.call(arguments),\r\n self = this;\r\n\r\n return values.count(function (value) {\r\n return self.indexOf(value) > -1;\r\n }) > 0;\r\n }\r\n },\r\n any: {\r\n value: function (fn) {\r\n return this.count(fn) > 0;\r\n }\r\n },\r\n all: {\r\n value: function (fn) {\r\n return this.count(fn) == this.length;\r\n }\r\n },\r\n each: {\r\n value: function (fn) {\r\n return this.forEach(fn);\r\n }\r\n },\r\n until: {\r\n value: function (fn) {\r\n var item = this.one(fn),\r\n index = item ? this.indexOf(item) : this.length;\r\n return this.slice(0, index);\r\n }\r\n },\r\n skip: {\r\n value: function (count) {\r\n return this.slice(count);\r\n }\r\n },\r\n take: {\r\n value: function (count) {\r\n return this.slice(0, count);\r\n }\r\n },\r\n removeWhere: {\r\n value: function (fn) {\r\n var i = this.length;\r\n while (i--) {\r\n if (fn(this[i], i)) {\r\n this.splice(i, 1);\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n },\r\n groupBy: {\r\n value: function (propertyName) {\r\n var result = this.reduce(function (rv, x) {\r\n (rv[x[propertyName]] = rv[x[propertyName]] || []).push(x);\r\n return rv;\r\n }, {});\r\n\r\n // add custom properties\r\n Object.defineProperties(result, {\r\n 'length': {\r\n value: function () {\r\n return Object.keys(this).length;\r\n }\r\n },\r\n 'toArray': {\r\n value: function (withGroupKeys) {\r\n var self = this;\r\n withGroupKeys = arguments.length && withGroupKeys;\r\n\r\n return Object.keys(this).select(function (key) {\r\n if (!withGroupKeys) {\r\n return self[key];\r\n }\r\n\r\n return {\r\n groupKey: key,\r\n data: self[key]\r\n };\r\n });\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n },\r\n sortBy: {\r\n value: function () {\r\n function dynamicSort(property) {\r\n var exec = function (val) {\r\n return $.isFunction(val) ? val() : val;\r\n },\r\n isDesc = false;\r\n if (property[0] == '-') {\r\n isDesc = true;\r\n property = property.substr(1);\r\n }\r\n\r\n return function (obj1, obj2) {\r\n var p1 = exec(obj1[property]),\r\n p2 = exec(obj2[property]),\r\n result = p1 > p2 ?\r\n 1 :\r\n (p1 < p2 ? -1 : 0);\r\n return isDesc ? (result == -1 ? 1 : -1) : result;\r\n }\r\n }\r\n\r\n function dynamicSortMultiple() {\r\n /*\r\n * save the arguments object as it will be overwritten\r\n * note that arguments object is an array-like object\r\n * consisting of the names of the properties to sort by\r\n */\r\n var props = arguments;\r\n return function (obj1, obj2) {\r\n var i = 0,\r\n result = 0,\r\n numberOfProperties = props.length;\r\n /* try getting a different result from 0 (equal)\r\n * as long as we have extra properties to compare\r\n */\r\n while (result === 0 && i < numberOfProperties) {\r\n result = dynamicSort(props[i])(obj1, obj2);\r\n i++;\r\n }\r\n return result;\r\n }\r\n }\r\n\r\n return this.sort(dynamicSortMultiple.apply(this, arguments));\r\n }\r\n },\r\n difference: {\r\n value: function(values) {\r\n var difference = this.filter(x => !values.includes(x))\r\n .concat(values.filter(x => !this.includes(x)));\r\n return difference;\r\n }\r\n },\r\n hasDifference: {\r\n value: function (values) {\r\n var difference = this.difference(values);\r\n return difference.length > 0;\r\n }\r\n }\r\n });\r\n \r\n})();","(function () {\r\n\r\n // Date extensions\r\n Object.defineProperties(Date.prototype, {\r\n 'getDaysInMonth': {\r\n value: function () {\r\n var d = new Date(this.getFullYear(), this.getMonth() + 1, 0);\r\n return d.getDate();\r\n }\r\n }\r\n });\r\n\r\n\r\n // Math extensions\r\n\r\n Math.getPercent = function (value, total, precision) {\r\n var num = Math.pow(10, precision);\r\n return +(((value * num) / (total * num)) / num).toFixed(precision);\r\n };\r\n \r\n // Number extensions\r\n\r\n Number.prototype.countDecimals = function () {\r\n\r\n if (Math.floor(this.valueOf()) === this.valueOf()) {\r\n return 0;\r\n }\r\n\r\n let str = this.toString();\r\n \r\n if (str.indexOf(\".\") !== -1 && str.indexOf(\"-\") !== -1) {\r\n \r\n return str.split(\"-\")[1] ?? 0;\r\n \r\n } else if (str.indexOf(\".\") !== -1) {\r\n \r\n return str.split(\".\")[1].length ?? 0;\r\n }\r\n \r\n return str.split(\"-\")[1] ?? 0;\r\n };\r\n})();\r\n","((moment) => {\r\n\r\n moment.fn.toISODateString = function () {\r\n\r\n return this.format(moment.HTML5_FMT.DATE);\r\n };\r\n\r\n moment.fn.toFriendlyDateTimeString = function () {\r\n\r\n const\r\n isUtc = this.isUtc(),\r\n today = isUtc ? moment().utc().startOf('day') : moment().startOf('day'),\r\n diffDays = today.diff(moment(this).startOf('day'), 'days', true),\r\n isToday = diffDays == 0,\r\n isYesterday = diffDays == 1,\r\n localSelf = isUtc ? this.local() : this;\r\n\r\n let\r\n date = localSelf.format('[on] MM/DD/YYYY'),\r\n time = localSelf.format('h:mm A');\r\n\r\n if (isToday) {\r\n date = 'Today';\r\n } else if (isYesterday) {\r\n date = 'Yesterday';\r\n }\r\n\r\n return `${date} ${time}`;\r\n };\r\n\r\n})(window['moment']);","(function () {\r\n if (typeof numeral === 'undefined') {\r\n throw 'numeral.js is required';\r\n }\r\n\r\n /* FUNCTION formatNumber\r\n @number: value to format\r\n @options: formatting options\r\n format: the target number format (for more info: http://numeraljs.com/)\r\n defaultValue: default value if 'number' was not provided\r\n */\r\n window['formatNumber'] = function formatNumber(number, options) {\r\n\r\n if (number === null || typeof number === 'undefined' || number === '' || isNaN(number)) {\r\n return options.fallbackValue || options.defaultValue || '';\r\n }\r\n\r\n return numeral(number).format(options.format);\r\n };\r\n\r\n window['unformatNumber'] = function unformatNumber(value, options) {\r\n\r\n if (value === null || typeof value === 'undefined' || value === '') {\r\n return null;\r\n }\r\n\r\n return numeral(options ? formatNumber(value, options) : value).value();\r\n //return numeral().unformat(value);\r\n };\r\n\r\n window['formatMoney'] = function formatMoney(value, format, fallbackValue, currency) {\r\n\r\n if (value === null || typeof value === 'undefined' || value === '' || isNaN(value)) {\r\n return fallbackValue || '';\r\n }\r\n\r\n format = format || dls.defaults.maskTextMoney;\r\n currency = currency || dls.defaults.currency;\r\n\r\n var currencyFormat = `(${currency}${format})`;\r\n\r\n return numeral(value).format(currencyFormat);\r\n };\r\n\r\n window['formatPercent'] = function formatPercent(value, format, fallbackValue) {\r\n\r\n if (value === null || typeof value === 'undefined' || value === '' || isNaN(value)) {\r\n return fallbackValue || '';\r\n }\r\n\r\n format = format || dls.defaults.maskTextPercent;\r\n\r\n var appendPercentSymbol = format.indexOf('%') === -1,\r\n result = numeral(value).format(format);\r\n\r\n if (appendPercentSymbol) {\r\n result += '%';\r\n }\r\n\r\n return result;\r\n };\r\n\r\n window['formatRatio'] = function formatRatio(value, format, fallbackValue) {\r\n\r\n if (value === null || typeof value === 'undefined' || value === '' || isNaN(value)) {\r\n return fallbackValue || '';\r\n }\r\n\r\n format = format || dls.defaults.maskTextRatio;\r\n\r\n var result = numeral(value).format(format);\r\n return result;\r\n };\r\n\r\n window['roundNumber'] = function roundNumber(number, precision) {\r\n\r\n const\r\n multiple = Math.pow(10, precision);\r\n\r\n return Number(Math.round(+number * multiple) / multiple);\r\n };\r\n\r\n window['roundPercent'] = function roundPercent(number, precision) {\r\n\r\n const\r\n digits = arguments.length > 1 ? precision : dls.defaults.precisionPercent,\r\n multiple = Math.pow(10, digits);\r\n\r\n return Number(Math.round(+number * multiple) / multiple);\r\n };\r\n\r\n (($) => {\r\n\r\n $.fn.numbersOnly = function () {\r\n\r\n return this\r\n .on({\r\n 'keydown': function (event) {\r\n\r\n var value = event.target.value;\r\n\r\n // Allow: delete, backspace, tab, escape, and enter\r\n if ([46, 8, 9, 27, 13].indexOf(event.keyCode) >= 0) {\r\n return;\r\n }\r\n\r\n // Allow: F1-F12\r\n if (event.keyCode >= 112 && event.keyCode <= 123) {\r\n return;\r\n }\r\n\r\n // Allow: Ctrl/Cmd + [A,X,C,V,Z]\r\n if ([65, 88, 67, 86, 90].indexOf(event.keyCode) >= 0 &&\r\n (event.ctrlKey === true || event.metaKey === true)) {\r\n return;\r\n }\r\n\r\n // Allow: .\r\n if (event.keyCode == 190 || event.keyCode == 110) {\r\n if (value.indexOf('.') > -1) {\r\n event.preventDefault();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Allow: -\r\n //if (event.keyCode === 189 || event.keyCode === 109) {\r\n // return;\r\n //}\r\n\r\n // Allow: home, end, left, right\r\n if (event.keyCode >= 35 && event.keyCode <= 40) {\r\n return;\r\n }\r\n\r\n // Ensure that it is a number and stop the keypress\r\n if ((event.shiftKey || (event.keyCode < 48 || event.keyCode > 57)) &&\r\n (event.keyCode < 96 || event.keyCode > 105)) {\r\n event.preventDefault();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $.fn.markAsFormattedNumber = function (opts) {\r\n\r\n return this\r\n .numbersOnly()\r\n .each(function (i, elem) {\r\n $(elem).data('__formattedNumber', true);\r\n });\r\n };\r\n\r\n $.fn.formattedNumber = function (options) {\r\n\r\n return this.each(function () {\r\n\r\n var $input = $(this);\r\n $input.data('number', options) // implement data attribute using\r\n .markAsFormattedNumber()\r\n .on('input', function (event) {\r\n\r\n var value = event.target.value,\r\n defaultSkipFormatting = (v) => v.indexOf('.') == v.length - 1,\r\n skipFormatting = options && options.skipFormatting || defaultSkipFormatting;\r\n\r\n if (skipFormatting(value)) {\r\n return;\r\n }\r\n\r\n setTimeout(function () {\r\n $input.val($input.val());\r\n }, 10);\r\n });\r\n });\r\n };\r\n\r\n $(function () {\r\n $(document).find('[data-number]').each(function () {\r\n var $self = $(this),\r\n options = {\r\n format: $self.attr('data-number-format'),\r\n defaultValue: $self.attr('data-number-defaultValue')\r\n };\r\n\r\n $self.formattedNumber(options);\r\n });\r\n });\r\n\r\n })(jQuery);\r\n\r\n // override jQuery val for inputs with type=\"text\" that used for formatted numbers\r\n (function () {\r\n var origHookGet, origHookSet;\r\n if ($.isPlainObject($.valHooks.text)) {\r\n origHookGet = $.valHooks.text.get;\r\n origHookSet = $.valHooks.text.set;\r\n } else {\r\n $.valHooks.text = {};\r\n }\r\n\r\n // override GET\r\n $.valHooks.text.get = function (element) {\r\n var $elem = $(element),\r\n formatted = $elem.data('__formattedNumber') === true;\r\n\r\n if (formatted) {\r\n var number = unformatNumber(element.value);\r\n return typeof number === 'number' ? ('' + number) : '';\r\n }\r\n\r\n if ($.isFunction(origHookGet)) {\r\n return origHookGet(element);\r\n }\r\n\r\n return undefined;\r\n };\r\n\r\n // override SET\r\n $.valHooks.text.set = function (element, val) {\r\n var $elem = $(element),\r\n formatted = $elem.data('__formattedNumber') === true,\r\n value = val;\r\n\r\n if (formatted) {\r\n var opts = $elem.data('number') || {};\r\n value = formatNumber(val, opts);\r\n }\r\n\r\n return $.isFunction(origHookSet) ? origHookSet(element, value) : element.value = value;\r\n };\r\n })();\r\n})();","/*** logging ***/\r\n(function () {\r\n function log(msg, args) {\r\n var message;\r\n if (typeof msg === 'object') {\r\n message = msg;\r\n } else {\r\n var formatArgs = $.isArray(args) ? args : Array.prototype.slice.call(arguments, 1);\r\n message = '{0}'.format(msg).format(formatArgs);\r\n }\r\n\r\n if (window.console && window.console.log) {\r\n window.console.log(message);\r\n }\r\n else if (window.opera && window.opera.postError) {\r\n window.opera.postError(message);\r\n }\r\n }\r\n\r\n window['log'] = function () {\r\n\r\n if (dls) {\r\n dls.log.obsolete('window.log', 'dls.log');\r\n }\r\n\r\n log.apply(this, arguments);\r\n };\r\n})();\r\n\r\n/*** query string ***/\r\n(function () {\r\n window.location.queryString = function () {\r\n // This function is anonymous, is executed immediately and \r\n // the return value is assigned to QueryString!\r\n var query_string = {};\r\n var query = window.location.search.substring(1);\r\n var vars = query.split(\"&\");\r\n for (var i = 0; i < vars.length; i++) {\r\n var pair = vars[i].split(\"=\");\r\n var value = typeof pair[1] === 'undefined' ? undefined : decodeURIComponent(pair[1]);\r\n // If first entry with this name\r\n if (typeof query_string[pair[0]] === \"undefined\") {\r\n query_string[pair[0]] = value;\r\n // If second entry with this name\r\n } else if (typeof query_string[pair[0]] === \"string\") {\r\n var arr = [query_string[pair[0]], value];\r\n query_string[pair[0]] = arr;\r\n // If third or later entry with this name\r\n } else {\r\n query_string[pair[0]].push(value);\r\n }\r\n }\r\n return query_string;\r\n }();\r\n})();\r\n\r\n\r\nfunction scrollDown(pos, animationTime, onAnimationComplete) {\r\n pos = arguments.length > 0 ? pos : $(document).height();\r\n animationTime = arguments.length > 1 ? animationTime : 0;\r\n $('html, body').stop().animate({\r\n scrollTop: pos\r\n }, animationTime, onAnimationComplete);\r\n}\r\n\r\nfunction scrollToElement(elem, animationTime, oncomplete) {\r\n var $elem = $(elem),\r\n $visibleElement = $elem.is(':visible') ? $elem : $elem.parents(':visible:first'),\r\n elemOffset = $visibleElement.offset(),\r\n fixedHeaderHeight = $('header').height(),\r\n isVisible = elemOffset.top > $(window).scrollTop() && elemOffset.top < ($(window).scrollTop() + $(window).height());\r\n\r\n if (!isVisible) {\r\n // animated scroll\r\n var top = elemOffset.top - ($(window).height() / 2) - fixedHeaderHeight;\r\n scrollDown(top, animationTime, oncomplete);\r\n } else {\r\n oncomplete && setTimeout(oncomplete, 0);\r\n }\r\n}\r\n\r\n\r\nfunction callAsync(fn, delay) {\r\n return setTimeout(fn, delay || 0);\r\n}\r\n\r\n\r\nfunction imgError(imgElement, fallbackImageUrl) {\r\n imgElement.onerror = '';\r\n imgElement.src = fallbackImageUrl;\r\n return true;\r\n}\r\n\r\n\r\nfunction areObjectEquals(obj1, obj2) {\r\n function extractSignificantProps(obj, rootPath) {\r\n var result = [];\r\n if (obj) {\r\n for (var key in obj) {\r\n var currentPath = (rootPath ? rootPath + \":\" : '') + key;\r\n var value = obj[key];\r\n switch (typeof (value)) {\r\n case 'object':\r\n result = result.concat(extractSignificantProps(value, currentPath));\r\n break;\r\n case 'function':\r\n result.push(currentPath + \"()\");\r\n break;\r\n default:\r\n if (value) {\r\n result.push(\"{0}:'{1}'\".format(currentPath, value.toString()));\r\n }\r\n }\r\n }\r\n }\r\n return result.sort();\r\n }\r\n var s1 = JSON.stringify(extractSignificantProps(obj1));\r\n var s2 = JSON.stringify(extractSignificantProps(obj2));\r\n return s1 == s2;\r\n}\r\n\r\n\r\nfunction ID() {\r\n return (Date.now().toString(36) + Math.random().toString(36).substr(2, 5));\r\n}","(function () {\r\n\r\n function _getElementForPopover(element) {\r\n\r\n var $element = $(element);\r\n\r\n if ($element.data('selectpicker')) {\r\n return $element.data('selectpicker').$button;\r\n }\r\n\r\n return $element;\r\n }\r\n\r\n function _setupPopover(element, error) {\r\n\r\n var $element = $(element),\r\n $visibleElement = _getElementForPopover(element);\r\n\r\n if ($visibleElement.length == 0) {\r\n return;\r\n }\r\n\r\n $visibleElement.data('lastError', error);\r\n\r\n var popover = $visibleElement.data('bs.popover');\r\n if (popover == null) {\r\n\r\n $visibleElement.popover({\r\n placement: $element.data('errorPlacement') || 'right',\r\n // title: null,\r\n content: function () {\r\n return $(this).data('lastError');\r\n },\r\n html: true,\r\n trigger: 'focus',\r\n container: 'body'\r\n });\r\n\r\n if ($visibleElement.is(':focus')) {\r\n $visibleElement.popover('show');\r\n }\r\n } else {\r\n // popover.setContent(); does not work because removes classes from popover container\r\n // should update content manually\r\n popover.tip()\r\n .find('.popover-content')\r\n .children().detach().end()[popover.options.html ? 'html' : 'text'](error);\r\n }\r\n }\r\n\r\n function _destroyPopover(element) {\r\n\r\n var $visibleElement = _getElementForPopover(element);\r\n $visibleElement.popover('destroy').removeData('lastError');\r\n }\r\n\r\n function _highlightElem(element, errorClass, validClass) {\r\n\r\n $(element).closest('.form-group')\r\n .addClass(errorClass)\r\n .removeClass(validClass);\r\n }\r\n\r\n function _unhighlightElem(element, errorClass, validClass) {\r\n\r\n $(element).closest('.form-group')\r\n .removeClass(errorClass)\r\n .addClass(validClass);\r\n }\r\n\r\n function _hideErrors($elements, settings) {\r\n\r\n $elements.each(function () {\r\n\r\n _destroyPopover(this);\r\n _unhighlightElem(this, settings.errorClass, settings.validClass);\r\n });\r\n }\r\n\r\n $.validator.setDefaults({\r\n ignore: 'input[type=\"hidden\"]:not([data-validate=\"true\"])',\r\n errorClass: 'has-error',\r\n ignoreTitle: true,\r\n focusInvalid: false,\r\n onfocusin: function (element) {\r\n this.lastActive = element;\r\n\r\n // Hide error label and remove error class on focus if enabled\r\n if (this.settings.focusCleanup) {\r\n if (this.settings.unhighlight) {\r\n this.settings.unhighlight.call(this, element, this.settings.errorClass, this.settings.validClass);\r\n }\r\n this.hideThese(this.errorsFor(element));\r\n } else {\r\n\r\n if (!this.checkable(element) && (element.name in this.submitted || !this.optional(element))) {\r\n this.element(element);\r\n }\r\n }\r\n },\r\n showErrors: function (errorMap, errorList) {\r\n\r\n _hideErrors(this.validElements(), this.settings);\r\n\r\n var i, elements, error;\r\n for (i = 0; this.errorList[i]; i++) {\r\n error = this.errorList[i];\r\n if (this.settings.highlight) {\r\n this.settings.highlight.call(this, error.element, this.settings.errorClass, this.settings.validClass);\r\n }\r\n\r\n _setupPopover(error.element, error.message);\r\n }\r\n },\r\n highlight: _highlightElem,\r\n unhighlight: _unhighlightElem,\r\n invalidHandler: function (e, validator) {\r\n $(document).trigger(e, [validator]);\r\n }\r\n });\r\n\r\n // update valid state for [datepicker] on change event\r\n $(document).on('change', 'form input[type=\"text\"]', function () {\r\n\r\n if ($(this).data('datepicker')) {\r\n $(this).valid();\r\n }\r\n });\r\n\r\n // update valid state for [selectpicker] on change event\r\n $(document).on('change', 'form select', function () {\r\n\r\n if ($(this).data('selectpicker')) {\r\n $(this).valid();\r\n }\r\n });\r\n\r\n function _resetFormValidator($form) {\r\n\r\n var validator = $form.data('validator');\r\n\r\n if (validator) {\r\n _hideErrors(validator.invalidElements(), validator.settings);\r\n validator.resetForm();\r\n }\r\n }\r\n\r\n $(document).on('reset', 'form', function () {\r\n\r\n _resetFormValidator($(this));\r\n });\r\n\r\n $(document).on('reset-form-validator', 'form', function () {\r\n\r\n _resetFormValidator($(this));\r\n });\r\n\r\n $(document).on('binding-applied', 'form[data-highlight-required-fields=\"true\"]', function () {\r\n\r\n var $form = $(this),\r\n validator = $form.data('validator');\r\n\r\n if (validator) {\r\n setTimeout(function () {\r\n var requiredElements = validator.elements().filter('.required');\r\n requiredElements.each(function (index, item) {\r\n $(item).valid();\r\n });\r\n }, 0);\r\n }\r\n\r\n });\r\n\r\n})();\r\n\r\n\r\n\r\n// show form validation errors\r\n(function ($, dls) {\r\n\r\n var $container,\r\n _getFormValidator =\r\n ($form) => {\r\n\r\n var validator = $form.data('validator');\r\n return validator;\r\n },\r\n _hideErrors =\r\n () => {\r\n\r\n $container.fadeOut();\r\n },\r\n _showErrorsBanner =\r\n (errors) => {\r\n\r\n if (!$container) {\r\n $container = $('
').appendTo('body');\r\n }\r\n\r\n var errorsListHtml = errors.map(error => `
  • ${error}
  • `).join(''),\r\n content = [\r\n '
    ',\r\n '
    Please address the following errors:
    ',\r\n '
      ',\r\n errorsListHtml,\r\n '
    ',\r\n '
    '\r\n ].join('');\r\n\r\n $container.empty().show().noty({\r\n text: content,\r\n timeout: 15 * 1000,\r\n layout: 'top',\r\n type: 'error',\r\n killer: true,\r\n animation: {\r\n open: 'animated fadeInDown',\r\n close: 'animated fadeOutUp'\r\n }\r\n });\r\n },\r\n _getFieldTitle =\r\n ($field) => {\r\n\r\n // handle default bootstrap markup\r\n return $field.closest('.form-group').find('.form-label').text();\r\n },\r\n _getFieldSectionName =\r\n ($field) => {\r\n\r\n var $fieldsetParent = $field.parentsUntil('fieldset').last();\r\n var $nearestToSectionNameSibling = $fieldsetParent.prevUntil('.form-legend').last();\r\n if ($nearestToSectionNameSibling.length === 0) {\r\n $nearestToSectionNameSibling = $fieldsetParent;\r\n }\r\n\r\n var $sectionName = $nearestToSectionNameSibling.prev();\r\n return $sectionName.text();\r\n },\r\n _getVisibleElement =\r\n ($field) => {\r\n\r\n if ($field.is('select') && $field.data('selectpicker')) {\r\n return $field.data('selectpicker').$button;\r\n }\r\n\r\n if ($field.is('[type=\"hidden\"]')) {\r\n var $formGroup = $field.closest('.form-group');\r\n return $formGroup.length ? $formGroup : $field.parent();\r\n }\r\n\r\n return $field;\r\n },\r\n _getFormValidationErrors =\r\n ($form) => {\r\n\r\n var errors = [],\r\n validator = _getFormValidator($form);\r\n\r\n if (!validator) {\r\n return errors;\r\n }\r\n\r\n $.each(validator.errorList, function (i, item) {\r\n\r\n var $element = $(item.element),\r\n fieldName = _getFieldTitle($element),\r\n sectionName = _getFieldSectionName($element),\r\n errorMessage = '';\r\n\r\n if (fieldName) {\r\n errorMessage += fieldName;\r\n }\r\n\r\n if (sectionName) {\r\n errorMessage += ` (${sectionName.capitalize()})`;\r\n }\r\n\r\n errorMessage = $.trim(errorMessage);\r\n if (errorMessage) {\r\n errorMessage += ' - ';\r\n }\r\n\r\n errorMessage += item.message;\r\n\r\n errors.push(errorMessage);\r\n });\r\n\r\n return errors;\r\n },\r\n _setFocusOnField =\r\n ($field) => {\r\n\r\n if ($field.is(':input:visible')) {\r\n $field.focus();\r\n }\r\n },\r\n _gotoField =\r\n ($element) => {\r\n\r\n var $visibleElement = _getVisibleElement($element);\r\n if ($visibleElement.length == 0) {\r\n return;\r\n }\r\n\r\n scrollToElement($visibleElement, 1000, function () {\r\n _setFocusOnField($visibleElement);\r\n });\r\n },\r\n _showFirstErrorField =\r\n ($form) => {\r\n\r\n var validator = _getFormValidator($form);\r\n if (!validator) {\r\n return;\r\n }\r\n\r\n var $firstErrorElem = $(validator.errorList.length ? validator.errorList[0].element : []);\r\n _gotoField($firstErrorElem);\r\n },\r\n _showFormErrors =\r\n ($form, globalErrors) => {\r\n\r\n var formErrors = _getFormValidationErrors($form),\r\n errors = (globalErrors || []).concat(formErrors);\r\n\r\n if (errors.length == 0) {\r\n return;\r\n }\r\n\r\n _showErrorsBanner(errors);\r\n _showFirstErrorField($form);\r\n },\r\n _getFieldsErrorsFromFailures =\r\n (failures) => {\r\n\r\n if (!failures) {\r\n return null;\r\n }\r\n\r\n var fieldsErrors = {};\r\n\r\n // convert errors array to string\r\n for (var field in failures) {\r\n\r\n if (field == '') { // skip global errors\r\n continue;\r\n }\r\n\r\n // take field 1st error, because jQueryValidation supports one error at a time\r\n var errors = failures[field],\r\n error = errors && errors.length > 0 && errors[0];\r\n\r\n // TODO: think if it is better to show all errors or the 1st\r\n if (error) {\r\n fieldsErrors[field] = error;\r\n }\r\n }\r\n\r\n return fieldsErrors;\r\n },\r\n _getGlobalErrorsFromFailures =\r\n (failures) => {\r\n\r\n if (!failures) {\r\n return [];\r\n }\r\n\r\n return failures[''];\r\n },\r\n _setFormFailures =\r\n ($form, failures) => {\r\n\r\n if (!failures) {\r\n return;\r\n }\r\n\r\n var globalErrors = _getGlobalErrorsFromFailures(failures),\r\n fieldsErrors = _getFieldsErrorsFromFailures(failures),\r\n validator = _getFormValidator($form);\r\n\r\n if (validator && fieldsErrors) {\r\n\r\n validator.showErrors(fieldsErrors); // update validator.errorList\r\n }\r\n\r\n _showFormErrors($form, globalErrors);\r\n };\r\n\r\n $(document).on('invalid-form', 'form[data-validate-show-errors=\"true\"]', function (e, validator) {\r\n\r\n $(validator.currentForm)\r\n .off('onpost submit:success', _hideErrors)\r\n .on('onpost submit:success', _hideErrors);\r\n\r\n _showFormErrors($(this));\r\n });\r\n\r\n\r\n\r\n dls.extend({\r\n validation: {\r\n showErrorsBanner: _showErrorsBanner,\r\n showFirstErrorField: _showFirstErrorField,\r\n showFormErrors: _showFormErrors,\r\n setFormFailures: _setFormFailures\r\n }\r\n });\r\n\r\n})(jQuery, window.dls);\r\n\r\nfunction isEmailValid(str) {\r\n return /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(str);\r\n}\r\n\r\nfunction isUsaZipValid(str) {\r\n return /^\\d{5}(-\\d{4})?$/.test(str);\r\n}\r\n\r\nfunction isCanadaZipValid(str) {\r\n return /^[ABCEGHJKLMNPRSTVXY]{1}\\d{1}[A-Z]{1} *\\d{1}[A-Z]{1}\\d{1}$/.test(str);\r\n}\r\n\r\n// requiredIfVisible\r\n$.validator.addMethod('requiredIfVisible', function (value, element) {\r\n\r\n return !$(element).is(':visible') || $.validator.methods.required.call(this, value, element);\r\n}, 'This field is required.');\r\n\r\n// equalToValue\r\n$.validator.addMethod('equalToValue', function (value, element, params) {\r\n\r\n var equalToValue = params;\r\n\r\n return this.optional(element) || value == equalToValue;\r\n}, function (params, element) {\r\n return 'Please enter value equals to {0}.'.format(params);\r\n});\r\n\r\n// positive\r\n$.validator.addMethod('positive', function (value, element) {\r\n\r\n return this.optional(element) || unformatNumber(value) >= 0;\r\n}, 'Please specify a positive value.');\r\n\r\n// conditional max\r\n$.validator.addMethod('minIf', function (value, element, params) {\r\n\r\n var expectedLimit = params[0],\r\n condition = Boolean(params[1]);\r\n\r\n return !condition || +value >= +expectedLimit;\r\n}, function (params, element) {\r\n return `Please enter a value greater than or equal to ${params[0]}.`;\r\n});\r\n\r\n// conditional max\r\n$.validator.addMethod('maxIf', function (value, element, params) {\r\n\r\n var expectedLimit = params[0],\r\n condition = Boolean(params[1]);\r\n\r\n return !condition || +value <= +expectedLimit;\r\n}, function (params, element) {\r\n return `Please enter a value less than or equal to ${params[0]}.`;\r\n});\r\n\r\n// money\r\n$.validator.addMethod('money', function (value, element) {\r\n\r\n let max = Money.max().getAmount(),\r\n min = -max,\r\n money = unformatNumber(value);\r\n\r\n return this.optional(element) || min <= money && money <= max;\r\n}, 'Please specify a valid money amount.');\r\n\r\n// ratio\r\n$.validator.addMethod('ratio', function (value, element) {\r\n\r\n var ratio = unformatNumber(value);\r\n\r\n return this.optional(element) || (ratio >= 0 && ratio <= 1);\r\n}, 'Please specify a valid commission.');\r\n\r\n// commission\r\n$.validator.addMethod('commission', function (value, element) {\r\n\r\n var ratio = unformatNumber(value);\r\n\r\n return this.optional(element) || (ratio >= 0 && ratio <= 100);\r\n}, 'Please specify a valid commission.');\r\n\r\n// rate\r\n$.validator.addMethod('rate', function (value, element) {\r\n\r\n var rate = unformatNumber(value);\r\n\r\n return this.optional(element) || (rate >= 0 && rate <= 100);\r\n}, 'Please specify a valid rate.');\r\n\r\n// unit\r\n$.validator.addMethod('unit', function (value, element) {\r\n return this.optional(element) || /^[\\da-zA-Z \\-/\\\\\\&]+$/.test(value);\r\n}, 'Please specify a valid unit.');\r\n\r\n// term\r\n$.validator.addMethod('term', function (value, element) {\r\n return this.optional(element) || /^[0-9]+(\\.[0-9]{1,2})?$/.test(value);\r\n}, 'Please specify a valid term.');\r\n\r\n// city\r\n$.validator.addMethod('city', function (value, element) {\r\n return true;\r\n //return this.optional(element) || /^[a-z \\-_]+$/i.test(value);\r\n}, 'Please specify a valid city name.');\r\n\r\n// streetAddress\r\n$.validator.addMethod('streetAddress', function (value, element) {\r\n return true;\r\n //return this.optional(element) || /^[\\w ,\\.]+$/i.test(value);\r\n}, 'Please specify a valid address.');\r\n\r\n// zip\r\n$.validator.addMethod('zip', function (value, element) {\r\n return this.optional(element) || isUsaZipValid(value);\r\n}, 'Please specify a valid zip.\\nValid examples: 12345, 12345-1234');\r\n\r\n// zip-usa\r\n$.validator.addMethod('zip-usa', function (value, element, params) {\r\n var $state = $(params),\r\n isUsa = ($state.find('option:selected').closest('optgroup').attr('data-group-id') || '').toLowerCase() === 'usa';\r\n\r\n return this.optional(element) || !isUsa || isUsaZipValid(value);\r\n}, 'Please specify a valid zip.\\nValid examples: 12345, 12345-1234');\r\n\r\n// zip-ca\r\n$.validator.addMethod('zip-ca', function (value, element, params) {\r\n var $state = $(params),\r\n isCanada = ($state.find('option:selected').closest('optgroup').attr('data-group-id') || '').toLowerCase() === 'can';\r\n\r\n return this.optional(element) || !isCanada || isCanadaZipValid(value);\r\n}, 'Please specify a valid postal code.\\nValid examples: T2X1V4, T2X 1V4');\r\n\r\n// personName\r\n$.validator.addMethod('personName', function (value, element) {\r\n return true;\r\n //return this.optional(element) || /^[a-z ]+$/i.test(value);\r\n}, 'Please specify a valid name.');\r\n\r\n// companyName\r\n$.validator.addMethod('companyName', function (value, element) {\r\n return true;\r\n //return this.optional(element) || /^[\\w\\s\\-\\/]+$/i.test(value);\r\n}, 'Please specify a valid company name.');\r\n\r\n// phone\r\n$.validator.addMethod('phone', function (value, element) {\r\n return true;\r\n //return this.optional(element) || /^(\\d{3})-(\\d{3})-(\\d{4})$/i.test(value);\r\n}, 'Please specify a valid phone number.');\r\n\r\n// phone\r\n$.validator.addMethod('phone-us', function (value, element) {\r\n return this.optional(element) || /^(\\d{3})-(\\d{3})-(\\d{4})$/i.test(value);\r\n}, 'Please specify a valid phone number.\\nValid example: 123-123-1234');\r\n\r\n// phone extension\r\n$.validator.addMethod('phone-ext', function (value, element) {\r\n return this.optional(element) || /^(\\d{1,4})$/i.test(value);\r\n}, 'Please specify a valid phone number extension.\\nValid example: 1234');\r\n\r\n// percentage\r\n$.validator.addMethod('percentage', function (value, element) {\r\n return this.optional(element) || (value >= 0 && value <= 100);\r\n}, 'Please specify a value between 0 and 100.');\r\n\r\n// broker-external\r\n//$.validator.addMethod('broker-external', function (value, element) {\r\n// var $broker = $(element).closest('.broker-item'),\r\n// data = $broker.data('broker'),\r\n// brokerId = +ko.unwrap(data.ContactID),\r\n// email = ko.unwrap(data.Email) || '';\r\n\r\n// // validate if broker is valid\r\n// return brokerId > 0 || email;\r\n//}, 'Please specify a valid outside broker.');\r\n\r\n// broker-internal\r\n//$.validator.addMethod('broker-internal', function (value, element) {\r\n// var $broker = $(element).closest('.broker-item'),\r\n// data = $broker.data('broker'),\r\n// brokerId = +ko.unwrap(data.ContactID);\r\n\r\n// // validate if broker is selected\r\n// return brokerId > 0;\r\n//}, 'Please specify a valid internal broker.');\r\n\r\n// commission-total\r\n$.validator.addMethod('commission-total', function (value, element, params) {\r\n\r\n var itemsCount = +params,\r\n totalRatio = +value,\r\n possibleError = RatioCollection.getPossibleError(itemsCount, 10),\r\n diff = Decimal.sub(100, totalRatio).abs().toNumber();\r\n\r\n return itemsCount == 0 || diff <= possibleError;\r\n}, 'Total commission should be 100%.');\r\n\r\n// commission-total-amount\r\n$.validator.addMethod('commission-total-amount', function (value, element, params) {\r\n\r\n var itemsCount = +params[0],\r\n totalMoneyActual = +params[1],\r\n totalMoneyExpected = +value;\r\n\r\n return !itemsCount || roundMoney(totalMoneyExpected) === roundMoney(totalMoneyActual);\r\n}, function (params, element) {\r\n return `Total commission amount should be ${formatMoney(params[1])}.`;\r\n});\r\n\r\n// squareFootage\r\n$.validator.addMethod('squareFootage', function (value, element) {\r\n return this.optional(element) || /^\\d+$/.test(value.replace(',', ''));\r\n}, 'Please specify a valid square footage.');\r\n\r\n// acres\r\n$.validator.addMethod('acres', function (value, element) {\r\n return this.optional(element) || /^(\\d+)?(\\.\\d{1,2})?$/.test(value.replace(',', ''));\r\n}, 'Please specify a valid acres. Allowed only 2 digits after the point.');\r\n\r\n// units\r\n$.validator.addMethod('units', function (value, element) {\r\n return this.optional(element) || /^\\d+$/.test(value);\r\n}, 'Please specify a valid number of units.');\r\n\r\n// website\r\n$.validator.addMethod('website', function (value, element) {\r\n return this.optional(element) || /^(?:https?:\\/\\/)?(?:www\\.)?[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&\\/=]*)$/i.test(value);\r\n}, 'Please specify a valid website.\\nValid examples:\\ndomain.com\\nwww.domain.com\\nhttp://domain.com');\r\n\r\n// linkedin\r\n$.validator.addMethod('linkedin', function (value, element) {\r\n return this.optional(element) || /^(https:\\/\\/)(www\\.)?linkedin\\.com\\/.+$/i.test(value);\r\n}, 'Please specify a valid linkedin link.\\nValid examples:\\nhttps://linkedin.com/profile');\r\n\r\n// twitter\r\n$.validator.addMethod('twitter', function (value, element) {\r\n return this.optional(element) || /^(https:\\/\\/)?(www\\.)?(twitter|x)\\.com\\/(#!\\/)?.+$/i.test(value);\r\n}, 'Please specify a valid twitter link.\\nValid examples:\\nhttps://x.com/profile');\r\n\r\n// facebook\r\n$.validator.addMethod('facebook', function (value, element) {\r\n return this.optional(element) || /^(https:\\/\\/)?(www\\.)?facebook\\.com\\/[\\w\\-]{5,}$/i.test(value);\r\n}, 'Please specify a valid facebook link.\\nValid examples:\\nfacebook.com/profile\\nhttps://facebook.com/profile');\r\n\r\n$.validator.addMethod('social-media-profile', function (value, element) {\r\n return this.optional(element) || /^(http\\:\\/\\/|https\\:\\/\\/)?([a-z0-9][a-z0-9\\-]*\\.)+[a-z0-9][a-z0-9\\-]*\\/.+$/i.test(value);\r\n}, 'Please specify a valid social media profile.\\nValid examples:\\ndomain.com/profile\\nwww.domain.com/profile\\nhttps://domain.com/profile');\r\n\r\n$.validator.addMethod('positive-number', function (value, element) {\r\n return this.optional(element) || (value >= 0);\r\n}, 'Please specify a valid positive number.');\r\n\r\n//probability\r\n$.validator.addMethod('probability', function (value, element) {\r\n return this.optional(element) || (value >= 0 && value <= 100);\r\n}, 'Please specify a valid probability.');\r\n\r\n$.validator.addMethod(\r\n \"dlspassword\",\r\n function (value, element) {\r\n return this.optional(element) || /((?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9])).{8,8}/.test(value);\r\n },\r\n \"Password must contain a lower and upper letter, a number and a symbol.\"\r\n);\r\n\r\n$.validator.addMethod('longitude', function (value, element) {\r\n return this.optional(element) || (value >= -180 && value <= 180);\r\n}, 'Please specify a valid longitude.');\r\n\r\n$.validator.addMethod('latitude', function (value, element) {\r\n return this.optional(element) || (value >= -90 && value <= 90);\r\n}, 'Please specify a valid latitude.');\r\n\r\n$.validator.addMethod('minDate', function (value, element, param) {\r\n\r\n var $elem = $(element),\r\n //datepicker = $elem.data('datepicker'),\r\n //valueDate = datepicker && datepicker.getDate(),\r\n valueDate = $elem.datepicker('getDate'),\r\n minDate = param && moment(param).toDate();\r\n\r\n if (!valueDate) {\r\n return this.optional(element);\r\n }\r\n\r\n if (!minDate) {\r\n return false;\r\n }\r\n\r\n return moment(valueDate).startOf('day')\r\n .isSameOrAfter(\r\n moment(minDate).startOf('day'));\r\n}, function (param, element) {\r\n\r\n var minDate = moment(param).format('MMM D, YYYY');\r\n return `Date must be on or after the ${minDate}.`;\r\n});\r\n\r\n$.validator.addMethod('positive-int', function (value, element) {\r\n return this.optional(element) || /^\\d+$/.test(value.replace(',', ''));\r\n}, 'Please specify a valid positive number.');\r\n\r\n$.validator.addMethod('not-empty', function (value, element) {\r\n return this.optional(element) || !!value.trim();\r\n}, 'This field is required.');\r\n","$.postJSON = function (url, data, ajaxOptions) {\r\n\r\n let _options = {\r\n url: url,\r\n type: 'post',\r\n dataType: 'json',\r\n contentType: 'application/json',\r\n data: typeof data !== 'string' ? JSON.stringify(data) : data\r\n };\r\n\r\n if ($.isFunction(ajaxOptions)) {\r\n\r\n _options.success = ajaxOptions;\r\n\r\n } else if (ajaxOptions != null) {\r\n\r\n _options = $.extend({}, _options, ajaxOptions);\r\n }\r\n\r\n return $.ajax(_options);\r\n};\r\n\r\n/*** ajax global handlers ***/\r\n(function ($, dls) {\r\n\r\n const _ = 1,\r\n _convertFailuresToErrors = (failures) => {\r\n\r\n var errors = [];\r\n\r\n for (var p in failures) {\r\n\r\n // iterate errors for empty field name separately\r\n if (p == '') {\r\n for (var i = 0; i < failures[p].length; i++) {\r\n errors.push(failures[p][i]);\r\n }\r\n\r\n continue;\r\n }\r\n\r\n // error format: `{field} - error 1; error 2`\r\n var error = p || '';\r\n if (error) {\r\n error += ' - ';\r\n }\r\n\r\n error += `${failures[p].join('; ')}`;\r\n errors.push(error);\r\n }\r\n\r\n return errors;\r\n },\r\n _handleBadRequest = (jxhr, textStatus, textError) => {\r\n\r\n var response = jxhr && jxhr.responseJSON,\r\n errorMessage = response && response['Error'],\r\n failures = response && response['Failures'];\r\n\r\n // show validation errors\r\n if (failures) {\r\n var errors = _convertFailuresToErrors(failures);\r\n dls.validation.showErrorsBanner(errors);\r\n } else if (errorMessage) { // otherwise show error message\r\n dls.showError(errorMessage);\r\n }\r\n },\r\n _handleUnauthorized = (jxhr, textStatus, textError) => {\r\n\r\n document.location.reload();\r\n },\r\n _handleForbidden = (jxhr, textStatus, textError) => {\r\n\r\n var response = jxhr && jxhr.responseJSON,\r\n errorMessage = response && response['Error'];\r\n\r\n if (errorMessage) {\r\n\r\n dls.notify(errorMessage)\r\n .always(() => _handleRedirect(response, textStatus, jxhr));\r\n\r\n } else {\r\n\r\n _handleRedirect(response, textStatus, jxhr)\r\n }\r\n },\r\n _handleNotFound = (jxhr, textStatus, textError) => {\r\n\r\n var response = jxhr && jxhr.responseJSON,\r\n errorMessage = response && response['Error'];\r\n\r\n if (errorMessage) {\r\n dls.showError(errorMessage);\r\n }\r\n },\r\n _handleError = (jxhr, textStatus, textError) => {\r\n\r\n var response = jxhr && jxhr.responseJSON,\r\n errorMessage = response && response['Error'];\r\n\r\n if (errorMessage) {\r\n dls.showError(errorMessage);\r\n }\r\n },\r\n _handleRedirect = (response, textStatus, jxhr) => {\r\n\r\n const redirectUrl = response\r\n && typeof response === 'object'\r\n && response['RedirectUrl'];\r\n\r\n if (redirectUrl) {\r\n dls.redirect(redirectUrl);\r\n }\r\n };\r\n\r\n // setup default error handlers\r\n $.ajaxSetup({\r\n statusCode: {\r\n 400: _handleBadRequest,\r\n 401: _handleUnauthorized,\r\n 403: _handleForbidden,\r\n 404: _handleNotFound,\r\n 500: _handleError,\r\n }\r\n });\r\n\r\n $.ajaxPrefilter('json', (requestOptions, globalOptions, jxhr) => {\r\n\r\n jxhr.done(_handleRedirect);\r\n });\r\n\r\n})(jQuery, window.dls);\r\n\r\n\r\n// append front-end version header to each ajax request\r\n(function ($, dls) {\r\n\r\n var _notificationShown = false,\r\n _showNotification = () => {\r\n\r\n if (_notificationShown) {\r\n return;\r\n }\r\n\r\n _notificationShown = true;\r\n\r\n return dls.confirm('Application has been updated, please refresh the page.', {\r\n title: 'NOTIFICATION',\r\n buttonYesText: 'REFRESH',\r\n buttonNoText: 'CANCEL'\r\n })\r\n .done(() => setTimeout(() => location.reload(), 500)) // 500ms to close modal, so no freezed UI\r\n .always(() => _notificationShown = false);\r\n };\r\n\r\n $.ajaxPrefilter(function (ajaxOptions, ajaxOptionsOriginal, jxhr) {\r\n\r\n if (typeof dls.version !== 'undefined') {\r\n jxhr.setRequestHeader('x-dealius-version', dls.version);\r\n jxhr.statusCode({\r\n 406: function (jqXHR, textStatus, errorThrown) {\r\n _showNotification();\r\n }\r\n });\r\n }\r\n });\r\n\r\n})(jQuery, window.dls);\r\n\r\n\r\n(function ($) {\r\n\r\n function AjaxPool() {\r\n\r\n var _runningRequests = {},\r\n _cancellableRequests = [],\r\n _addRequest = (url, jqXHR) => _runningRequests[url] = jqXHR,\r\n _removeRequest = (url) => delete _runningRequests[url],\r\n _getRequest = (url) => _runningRequests[url],\r\n _cancelRequest = (url) => {\r\n\r\n var xhr = _getRequest(url);\r\n if (xhr && xhr.state() == 'pending') {\r\n\r\n xhr.abort();\r\n dls.log.debug(\"AjaxPool: request aborted: \" + url);\r\n }\r\n\r\n _addRequest(url, null);\r\n },\r\n _getRequestUrl = (ajaxOptions) => ajaxOptions.url,\r\n _isSingletonRequest = (ajaxOptions) => ajaxOptions.singleton === true,\r\n _cancelSingletonRequest = (ajaxOptions) => {\r\n\r\n if (_isSingletonRequest(ajaxOptions)) {\r\n\r\n _cancelRequest(_getRequestUrl(ajaxOptions));\r\n }\r\n };\r\n\r\n\r\n\r\n this.cancelRequest = _cancelRequest;\r\n\r\n\r\n\r\n $(document).ajaxSend(function (event, jqXHR, ajaxOptions) {\r\n\r\n //_cancelSingletonRequest(ajaxOptions);\r\n\r\n var url = ajaxOptions.url;\r\n if (url in _runningRequests) {\r\n\r\n dls.log.debug(\"AjaxPool: request started: \" + url);\r\n _addRequest(url, jqXHR);\r\n }\r\n });\r\n\r\n $(document).ajaxComplete(function (event, jqXHR, ajaxOptions) {\r\n\r\n var url = ajaxOptions.url;\r\n if (url in _runningRequests) {\r\n\r\n dls.log.debug(\"AjaxPool: request completed: \" + url);\r\n _removeRequest(url);\r\n }\r\n });\r\n }\r\n\r\n window['ajaxPool'] = new AjaxPool();\r\n\r\n})(jQuery);","(($) => {\r\n\r\n $(document).on('keyup', 'input, select', function (e) {\r\n\r\n if (e.which == 13 && !(e.ctrlKey && e.shiftKey)) {\r\n\r\n $(e.target).trigger('onenter');\r\n }\r\n });\r\n\r\n})(jQuery);\r\n\r\n\r\n/*** asTemplate ***/\r\n(function ($) {\r\n\r\n $.fn.asTemplate = function (data) {\r\n return $($(this).html().template(data));\r\n };\r\n\r\n})(jQuery);\r\n\r\n\r\n(function () {\r\n\r\n $.fn.formDisable = function (disable) {\r\n if (arguments.length == 0) {\r\n disable = true;\r\n }\r\n\r\n return this.each(function (i, item) {\r\n var $form = $(item);\r\n\r\n $form.find('fieldset').prop('disabled', disable);\r\n });\r\n };\r\n\r\n})();\r\n\r\n\r\n// loading mask\r\n(($) => {\r\n\r\n let _template = `
    `,\r\n _selector = '.b-loading',\r\n _btnLoadingClass = 'btn-loading',\r\n _findLoader = ($elem) => {\r\n\r\n return $elem.find(`> ${_selector}`);\r\n },\r\n _addLoadingMask = ($elem) => {\r\n\r\n const loaderExists = _findLoader($elem).length > 0;\r\n if (loaderExists) {\r\n return;\r\n }\r\n\r\n const $loader = $(_template);\r\n $elem.append($loader);\r\n },\r\n _removeLoadingMask = ($elem) => {\r\n\r\n _findLoader($elem).remove();\r\n },\r\n _toggleLoadingMask = ($elem, toggle) => {\r\n\r\n if (toggle) {\r\n _addLoadingMask($elem);\r\n } else {\r\n _removeLoadingMask($elem);\r\n }\r\n },\r\n _toggleButtonLoader = ($btn, toggle) => {\r\n\r\n if (toggle) {\r\n $btn.addClass(_btnLoadingClass);\r\n } else {\r\n $btn.removeClass(_btnLoadingClass);\r\n }\r\n };\r\n\r\n\r\n $.fn.toggleLoadingMask = function toggleLoadingMask(toggle) {\r\n\r\n return this.each(function() {\r\n\r\n _toggleLoadingMask($(this), toggle);\r\n });\r\n };\r\n $.fn.toggleBtnProgress = function toggleBtnProgress(toggle) {\r\n\r\n return this.each(function() {\r\n\r\n _toggleButtonLoader($(this), toggle);\r\n });\r\n };\r\n $.fn.toggleSelectPickerProgress = function toggleBtnProgress(toggle) {\r\n\r\n return this.each(function() {\r\n\r\n const $this = $(this),\r\n isSelectPicker = !!$this.data('selectpicker');\r\n \r\n if (isSelectPicker) {\r\n _toggleButtonLoader($this.parent('.bootstrap-select').find('button'), toggle);\r\n }\r\n });\r\n };\r\n\r\n})(jQuery);\r\n\r\n\r\n/*** fill container's inputs with provided data ***/\r\n(function () {\r\n\r\n function _getKey(key, prefix) {\r\n var result = key;\r\n if (prefix) {\r\n result = `${prefix}[${key}]`;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n $.fn.fillWithData = function (data) {\r\n\r\n function fill($container, d, prefix) {\r\n\r\n $.each(d, function (key, value) {\r\n var $elem = $container.find('[name=\"' + _getKey(key, prefix) + '\"]');\r\n\r\n if ($elem.data('datepicker') && value) {\r\n $elem.datepicker('update', moment(dls.trimTime(value)).toDate());\r\n return;\r\n }\r\n\r\n if ($elem.data('selectpicker')) {\r\n $elem.selectpicker('val', value);\r\n return;\r\n }\r\n\r\n if ($elem.attr('type') == 'checkbox') {\r\n\r\n (value ? $elem.attr('checked', 'checked') : $elem.removeAttr('checked'))\r\n .prop('checked', value)\r\n .trigger('change')\r\n ;\r\n\r\n return;\r\n }\r\n\r\n if ($.isArray(value) && !$elem.size()) {\r\n $elem = $container.find('[name=\"' + _getKey(key, prefix) + '[]\"]');\r\n }\r\n\r\n if ($.isPlainObject(value)) {\r\n fill($container, value, key);\r\n }\r\n\r\n $elem.val(value);\r\n });\r\n }\r\n\r\n return this.each(function () {\r\n var $container = $(this);\r\n\r\n fill($container, data);\r\n });\r\n };\r\n\r\n})();\r\n\r\n(function () {\r\n\r\n var defaults = {\r\n method: 'text'\r\n };\r\n\r\n $.fn.displayData = function (data, options) {\r\n\r\n options = $.extend({}, defaults, options);\r\n\r\n return this.each(function () {\r\n var $container = $(this);\r\n $.each(data, function (key, value) {\r\n $container.find('[data-name=\"' + key + '\"]')[options.method](value);\r\n });\r\n });\r\n };\r\n\r\n})();\r\n\r\n/*** checkbox group (like radio buttons) ***/\r\n(function () {\r\n\r\n $(document).on('click', ':checkbox[data-group]', function () {\r\n var $self = $(this),\r\n groupName = $self.attr('data-group'),\r\n checked = $self.is(':checked'),\r\n $group = $(':checkbox[data-group=\"' + groupName + '\"]');\r\n\r\n if (!checked && !$group.filter(':checked').size()) { // allow be checked at least one checkbox only\r\n $self.prop('checked', true);\r\n }\r\n else if (checked) { // uncheck all other checkboxes in same group\r\n //$group.not($self).prop('checked', false);\r\n $group.not($self).filter(':checked').trigger('click');\r\n }\r\n });\r\n\r\n})();\r\n\r\n/*** noUiSlider plugin wrapper ***/\r\n(function () {\r\n\r\n $.fn.noUiSlider = function (options) {\r\n var defaultOptions = {\r\n connect: true,\r\n step: 1,\r\n range: {\r\n 'min': 0,\r\n 'max': 100\r\n },\r\n pips: {\r\n mode: 'range',\r\n density: 10\r\n }\r\n };\r\n\r\n return this.each(function () {\r\n var slider = this,\r\n sliderOptions = $.extend({}, defaultOptions, options || {});\r\n\r\n noUiSlider.create(slider, sliderOptions);\r\n if ($.isFunction(options.onchange)) {\r\n slider.noUiSlider.on('change', options.onchange);\r\n }\r\n\r\n slider.noUiSlider.on('update', function (valuesText, handle, values) {\r\n var handleValue = Array.isArray(values) ? values[handle] : values;\r\n var handleValueHtml = '' + handleValue + '';\r\n\r\n if (!handle) {\r\n $(slider).find('.noUi-handle-lower').html(handleValueHtml);\r\n } else {\r\n $(slider).find('.noUi-handle-upper').html(handleValueHtml);\r\n }\r\n });\r\n });\r\n };\r\n\r\n})();\r\n\r\n/*** fontautosize ***/\r\n(function ($) {\r\n\r\n $.fn.fontautosize = function () {\r\n\r\n return this.each(function () {\r\n\r\n var $elem = $(this),\r\n options = {\r\n minFontPixels: 8,\r\n widthOnly: true\r\n };\r\n\r\n function originalFontSize($e) {\r\n if (!$e.data('originalFontSize')) {\r\n $e.data('originalFontSize', parseInt($e.css('fontSize'), 10));\r\n }\r\n\r\n return $e.data('originalFontSize');\r\n }\r\n\r\n options.maxFontPixels = originalFontSize($elem);\r\n $elem.textfill(options);\r\n });\r\n };\r\n\r\n $.fn.textAutosize = function (text) {\r\n\r\n return this.each(function () {\r\n\r\n var $self = $(this),\r\n $text = $self.find('>span');\r\n\r\n if ($text.length === 0) {\r\n $text = $('');\r\n $self.html($text);\r\n }\r\n\r\n $text.text(text);\r\n $self.fontautosize();\r\n });\r\n };\r\n\r\n function applyFontAutoSize() {\r\n $('[data-fontautosize=\"true\"]').fontautosize();\r\n }\r\n\r\n // bind to global events\r\n $(window).on('resize', applyFontAutoSize);\r\n $(applyFontAutoSize);\r\n\r\n})(jQuery);\r\n\r\n/*** asHTML ***/\r\n(function ($) {\r\n\r\n $.fn.asHtml = function () {\r\n return $('
    ').html(this).html();\r\n };\r\n\r\n $.fn.toHtml = function () {\r\n return $('
    ').html(this).html();\r\n };\r\n\r\n})(jQuery);\r\n\r\n\r\n/*** bootstrap datepicker getSafeDate ***/\r\n(function($) {\r\n\r\n $.fn.getUtcDateISO8601 = function() {\r\n var $self = $(this);\r\n if (!$self.data('datepicker')) {\r\n return null;\r\n }\r\n\r\n var date = $self.datepicker('getUTCDate');\r\n return date && moment.utc(date).startOf('day').format(); // \"2014-09-08T08:02:17-05:00\"\r\n };\r\n\r\n $.fn.getISODate = function() {\r\n var $self = $(this);\r\n if (!$self.data('datepicker')) {\r\n return null;\r\n }\r\n\r\n var date = $self.datepicker('getDate');\r\n return date && moment(date).format('YYYY-MM-DD'); // \"2019-07-25\"\r\n };\r\n\r\n})(jQuery);\r\n","(function (dls, $) {\r\n\r\n var _stack = [],\r\n _events = {\r\n INIT: 'init.dls.modal',\r\n SHOW: 'show.dls.modal',\r\n SHOWING: 'showing.dls.modal',\r\n SHOWN: 'shown.dls.modal',\r\n HIDE: 'hide.dls.modal',\r\n HIDING: 'hiding.dls.modal',\r\n HIDDEN: 'hidden.dls.modal',\r\n RESOLVE: 'resolve.dls.modal',\r\n REJECT: 'reject.dls.modal'\r\n },\r\n _behaviorOnResolve = {\r\n NONE: 'none',\r\n CLOSE: 'close',\r\n },\r\n _confirmationTemplate = [\r\n '
    ',\r\n '
    ',\r\n '',\r\n '
    ',\r\n '
    ',\r\n '

    ',\r\n '',\r\n '
    '\r\n ].join(''),\r\n _notificationTemplate = [\r\n '
    ',\r\n '
    ',\r\n '',\r\n '
    ',\r\n '
    ',\r\n '

    ',\r\n '',\r\n '
    '\r\n ].join(''),\r\n \r\n _handleEscape = (e) => e.keyCode === 27,\r\n \r\n _stackPush = ($modals) => $modals.each((i, elem) => _stack.push($(elem))),\r\n\r\n _stackPop = () => _stack.pop(),\r\n\r\n _getVisibleModals = () => $('.popup:visible'),\r\n\r\n _hideAllNoty = () => dls.hideAllNoty(),\r\n\r\n _getModalsContainer = () => $('#popup-layout'),\r\n\r\n _showOverlay = () => $('body').addClass('popup-showed'),\r\n\r\n _hideOverlay = () => $('body').removeClass('popup-showed'),\r\n\r\n _isModalVisible = ($modal) => $modal.is(':visible'),\r\n\r\n _showPriorModal = () => {\r\n\r\n var $priorModal = _stackPop();\r\n\r\n if ($priorModal != null) {\r\n\r\n $priorModal.fadeIn('fast');\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n _showModal = ($modal, speed) => {\r\n\r\n if (speed == null) {\r\n speed = 'fast';\r\n }\r\n\r\n _showOverlay();\r\n\r\n _stackPush(_getVisibleModals().hide());\r\n\r\n $modal.trigger(_events.SHOW);\r\n _hideAllNoty();\r\n\r\n $modal.fadeIn(speed, function () {\r\n\r\n $modal.trigger(_events.SHOWN);\r\n _hideAllNoty();\r\n });\r\n\r\n $modal.trigger(_events.SHOWING);\r\n },\r\n _hideModal = ($modal, speed) => {\r\n\r\n if (_isModalVisible($modal) == false) {\r\n return;\r\n }\r\n\r\n if (speed == null) {\r\n speed = 0;//'fast';\r\n }\r\n\r\n $modal.trigger(_events.HIDE);\r\n _hideAllNoty();\r\n\r\n $modal.fadeOut(speed, function () {\r\n\r\n $modal.trigger(_events.HIDDEN);\r\n\r\n if (_showPriorModal() == false) {\r\n _hideOverlay();\r\n }\r\n });\r\n\r\n $modal.trigger(_events.HIDING);\r\n },\r\n _loadModal = (url) => {\r\n\r\n if (!url) {\r\n throw 'Remote url not provided';\r\n }\r\n\r\n let ajax = $.getJSON(url);\r\n return ajax;\r\n },\r\n _getDlsModal = (modalSelector, options) => {\r\n\r\n var $modal = $(modalSelector);\r\n if ($modal.length === 0) {\r\n throw `Modal '${$modal.selector}' not found`;\r\n }\r\n\r\n var modal = $modal.data('dls.modal');\r\n if (modal == null) {\r\n modal = new DlsModal($modal, options);\r\n } else {\r\n modal.setOptions(options);\r\n }\r\n\r\n _build(modal);\r\n\r\n return modal;\r\n },\r\n _detectSubmitAction = ($form) => {\r\n\r\n let submit = $form.find(':submit').filter((_, x) => x.dataset.clicked === \"true\")[0],\r\n result = {};\r\n \r\n if (submit != null) {\r\n result[submit.name] = submit.value;\r\n delete submit.dataset.clicked;\r\n }\r\n \r\n return result;\r\n },\r\n _createModalAction = (() => {\r\n\r\n const _normalizeOptions = (options) => {\r\n\r\n // assume action content\r\n if (typeof options === 'string') {\r\n options = {\r\n content: options\r\n };\r\n }\r\n \r\n return options ?? {};\r\n },\r\n _createButton = (options) => {\r\n\r\n let opts = _normalizeOptions(options),\r\n content = opts.content,\r\n $action = $('