{"version":3,"file":"login.bundle.js","mappings":"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","sources":["webpack://appLaunch/webpack/runtime/chunk loaded","webpack://appLaunch/./utils/utils.js","webpack://appLaunch/./helpers/storage.js","webpack://appLaunch/./components/login/login.js","webpack://appLaunch/./app/indexLogin.js","webpack://appLaunch/webpack/bootstrap","webpack://appLaunch/webpack/runtime/define property getters","webpack://appLaunch/webpack/runtime/global","webpack://appLaunch/webpack/runtime/hasOwnProperty shorthand","webpack://appLaunch/webpack/runtime/node module decorator","webpack://appLaunch/webpack/runtime/runtimeId","webpack://appLaunch/webpack/runtime/jsonp chunk loading","webpack://appLaunch/webpack/startup"],"sourcesContent":["var deferred = [];\n__webpack_require__.O = function(result, chunkIds, fn, priority) {\n\tif(chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar chunkIds = deferred[i][0];\n\t\tvar fn = deferred[i][1];\n\t\tvar priority = deferred[i][2];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function(key) { return __webpack_require__.O[key](chunkIds[j]); })) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif(priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif(fulfilled) {\n\t\t\tdeferred.splice(i--, 1)\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};","import _find from 'lodash/find.js';\r\nimport _extend from 'lodash/extend.js';\r\nimport { v4 as uuidv4 } from 'uuid';\r\n\r\nimport events from '../helpers/Events.js';\r\nconst elAppBody = document.getElementById('application-main');\r\nconst kp = ko.postbox;\r\n\r\nexport function formatToStandardTimeFromMilitaryTime(arg) {\r\n var hour = +arg;\r\n var period = null;\r\n\r\n if (checkVariableType(hour) !== 'number') {\r\n return {\r\n hour: null,\r\n period: null,\r\n };\r\n }\r\n\r\n if (hour === 0) {\r\n hour = 12;\r\n period = 'AM';\r\n } else if (hour === 12) {\r\n period = 'PM';\r\n } else if (hour > 12) {\r\n hour = hour - 12;\r\n period = 'PM';\r\n } else if (hour < 12) {\r\n period = 'AM';\r\n }\r\n\r\n return {\r\n hour: hour,\r\n period: period,\r\n };\r\n}\r\n\r\nfunction easeInOutQuad(t, b, c, d) {\r\n t /= d / 2;\r\n if (t < 1) return (c / 2) * t * t + b;\r\n t--;\r\n return (-c / 2) * (t * (t - 2) - 1) + b;\r\n}\r\n\r\nfunction addThousandsSeperators(integerPart, separator) {\r\n separator = separator || ',';\r\n\r\n if (integerPart === null || integerPart === void 0) return null;\r\n\r\n var integerPartFormatted = [];\r\n var isNegative = +integerPart < 0;\r\n var val = isNegative ? String(integerPart).replace('-', '') : String(integerPart);\r\n var temporary = val.split('').reverse();\r\n\r\n for (var i = 0, len = temporary.length; i < len; i++) {\r\n if (i === 0) {\r\n integerPartFormatted.unshift(temporary[i]);\r\n continue;\r\n }\r\n\r\n if (i % 3 === 0) integerPartFormatted.unshift(separator);\r\n\r\n integerPartFormatted.unshift(temporary[i]);\r\n }\r\n\r\n if (isNegative) integerPartFormatted.unshift('-');\r\n\r\n return integerPartFormatted.join('');\r\n}\r\n\r\nfunction treatAsUTC(date) {\r\n var result = new Date(date);\r\n result.setMinutes(result.getMinutes() - result.getTimezoneOffset());\r\n return result;\r\n}\r\n\r\nexport function formatLeadingZero(val) {\r\n if (typeof val === 'string') {\r\n val = Number(val);\r\n }\r\n\r\n if (isNaN(val) || typeof val !== 'number') {\r\n throw new Error('Number or String(Number) required');\r\n }\r\n\r\n return val < 10 && val >= 0 ? `0${val}` : `${val}`;\r\n}\r\n\r\nexport function ultimateModal(config) {\r\n var el = document.createElement('div');\r\n var overlay = document.getElementById('application-overlay');\r\n var dfd;\r\n var subscriber;\r\n // validation options\r\n var hasValidationOptions = !!config.validationConfig;\r\n var validationOptions = config.validationConfig || {\r\n isEnabled: true,\r\n };\r\n var defaults = {\r\n overlay: true,\r\n closeOnEnter: false,\r\n };\r\n var options = _extend(defaults, config);\r\n\r\n if (document.getElementById(options.id)) {\r\n // already exists.\r\n throw new Error('The ultimate modal needs to be torn down before creating a new one.');\r\n }\r\n\r\n dfd = new $.Deferred();\r\n subscriber = hasValidationOptions && validationOptions.value.subscribe(validationOptions.isValid, validationOptions);\r\n\r\n function onEnter(e) {\r\n var key = window.event ? e.keyCode : e.which;\r\n if (key === 13 || key === 27) {\r\n dfd.resolve();\r\n }\r\n }\r\n\r\n function destroy() {\r\n if (!el) return;\r\n\r\n ko.cleanNode(el);\r\n el.style.opacity = 0;\r\n overlay.style.display = 'none';\r\n dfd = null;\r\n subscriber && subscriber.dispose();\r\n events.remove(document.body, 'keyup', onEnter);\r\n document.body.removeChild(el);\r\n // setTimeout was causing buttons to not be clickable until the el was removed.\r\n // setTimeout(document.body.removeChild.bind(document.body, el), 10);\r\n }\r\n\r\n dfd.always(destroy);\r\n\r\n el.id = options.id;\r\n el.className = 'modal';\r\n el.setAttribute('data-bind', \"'template':\" + \"'\" + (options.template || '') + \"'\");\r\n el.style.top = [options.top || 100, 'px'].join('');\r\n el.style.width = [options.width, 'px'].join('');\r\n el.style.marginLeft = [-(options.width / 2), 'px'].join('');\r\n\r\n document.body.appendChild(el);\r\n\r\n ko.applyBindings(\r\n {\r\n title: options.title || '',\r\n content: options.content || '',\r\n textConfirm: options.textConfirm || 'Ok',\r\n commandIsChoice: options.commandType === 'as-choice',\r\n textDeny: options.textDeny || '',\r\n choiceChosen: options.choiceChosen,\r\n\r\n confirmEnabled: validationOptions.isEnabled,\r\n valueToValidate: validationOptions.value,\r\n\r\n choicesType: options.choicesType,\r\n choicesBinding: options.choicesBinding || {},\r\n choicesControlName: options.choicesControlName,\r\n choices: ko.observableArray(options.choices || []),\r\n onConfirm: dfd.resolve,\r\n onDeny: dfd.reject,\r\n width: options.width || 300,\r\n height: options.height || '100%',\r\n shouldScroll: options.shouldScroll || false,\r\n template: options.template || '',\r\n secondaryTemplate: options.secondaryTemplate || '',\r\n templateData: options.templateData || {},\r\n },\r\n el\r\n );\r\n\r\n if (options.overlay === true) {\r\n overlay.style.display = 'block';\r\n }\r\n\r\n if (options.closeOnEnter === true) {\r\n events.add(document.body, 'keyup', onEnter);\r\n }\r\n\r\n el.style.opacity = 1;\r\n\r\n return dfd;\r\n}\r\n\r\nexport const objectUtils = {\r\n isEmpty: function (obj) {\r\n // null and undefined are 'empty'\r\n if (obj == null) return true;\r\n\r\n // Assume if it has a length property with a non-zero value\r\n // that that property is correct.\r\n if (obj.length > 0) return false;\r\n if (obj.length === 0) return true;\r\n\r\n // Otherwise, does it have any properties of its own?\r\n // Note that this doesn't handle\r\n // toString and valueOf enumeration bugs in IE < 9\r\n for (var key in obj) {\r\n if (Object.prototype.hasOwnProperty.call(obj, key)) return false;\r\n }\r\n\r\n return true;\r\n },\r\n clone: function (obj, isDeep) {\r\n if (typeof isDeep === 'boolean' && isDeep === true) {\r\n // JSON.parse(JSON.stringify(obj));\r\n // !! JSON.stringify(new Date()) returns a string representation of the date in ISO format, which JSON.parse() doesn't convert back to a Date object\r\n\r\n return $.extend(true, {}, obj);\r\n } else {\r\n // Object.assign({}, obj)\r\n\r\n return $.extend({}, obj);\r\n }\r\n },\r\n};\r\n\r\n/**\r\n * Will take unlimited source objects, merge and return a NEW object.\r\n * !!- If same prop exists in multiple objects, last one wins.\r\n * introduced 05/23/2022\r\n * @param object unlimited source objects\r\n * @return object [will be a new object]\r\n */\r\nexport const objMerge = function () {\r\n return Object.assign({}, ...arguments);\r\n};\r\n\r\nexport function reloadBrowser() {\r\n window.onbeforeunload = function () {};\r\n document.location.reload();\r\n}\r\n\r\nexport function areModelsDifferent(model1, model2, props) {\r\n props = props || [];\r\n const jsonner = ko.toJSON;\r\n\r\n if (jsonner(ko.unwrap(model1), props) !== jsonner(ko.unwrap(model2), props)) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport function validatePrimitives(model, arrProps, dontFlagInUi) {\r\n const errors = [];\r\n\r\n for (let i = 0, len = arrProps.length; i < len; i++) {\r\n const requiredField = arrProps[i];\r\n const unwrappedValue = ko.unwrap(model[requiredField]);\r\n\r\n const value = typeof unwrappedValue === 'string' ? unwrappedValue.trim() : unwrappedValue;\r\n\r\n if (!value) {\r\n if (!dontFlagInUi) {\r\n model[requiredField].hasError(true);\r\n }\r\n errors.push(requiredField);\r\n } else {\r\n model[requiredField].hasError(false);\r\n model[requiredField].errorMsg('');\r\n }\r\n }\r\n\r\n return errors.length === 0;\r\n}\r\n\r\nexport function SubscriptionManager() {\r\n let subscriptions = {};\r\n\r\n return {\r\n store: function (topic, subscription) {\r\n if (subscriptions[topic]) {\r\n console.warn(`${topic} already exists, and will not be registered`);\r\n\r\n return false;\r\n }\r\n\r\n subscriptions[topic] = subscription;\r\n\r\n return true;\r\n },\r\n removeAll: function () {\r\n for (var p in subscriptions) {\r\n this.remove(p);\r\n }\r\n subscriptions = {};\r\n },\r\n remove: function (topic) {\r\n if (subscriptions[topic]) {\r\n subscriptions[topic].dispose();\r\n delete subscriptions[topic];\r\n }\r\n },\r\n getSubscriptionsList: function () {\r\n return Object.keys(subscriptions);\r\n },\r\n };\r\n}\r\n\r\nexport function unwrapServerResponse(fn, response) {\r\n if (typeof response === 'undefined') {\r\n fn(null, null);\r\n return;\r\n }\r\n response = (typeof response === 'string' && JSON.parse(response)) || response;\r\n const msg = response?.Message;\r\n\r\n if (response.IsException === false) {\r\n fn(response.Data, msg);\r\n } else {\r\n const actions = msg.Actions || [];\r\n let i = actions.length;\r\n\r\n while (i--) {\r\n kp.publish(actions[i].Name, actions[i].Data);\r\n }\r\n\r\n kp.publish('add-application-message', {\r\n type: 'error',\r\n content: msg.Text || 'We are not able to complete your request.',\r\n isPersistant: true,\r\n });\r\n }\r\n}\r\n\r\nexport function sanitizeTags(jsonString) {\r\n if (typeof jsonString !== 'string') {\r\n throw new Error('Must be a string to sanitizeTags');\r\n }\r\n\r\n const lt = {\r\n find: //g,\r\n replacement: '>',\r\n };\r\n /*\r\n < --> <\r\n > --> >\r\n & --> &\r\n \" --> "\r\n ' --> ' ' not recommended because its not in the HTML spec (See: section 24.4.1) ' is in the XML and XHTML specs.\r\n / --> /\r\n https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE236_-_Sanitize_HTML_Markup_with_a_Library_Designed_for_the_Job\r\n */\r\n\r\n return jsonString.replace(lt.find, lt.replacement).replace(gt.find, gt.replacement);\r\n}\r\n\r\nexport function addLeadingZero(n) {\r\n var int = +n;\r\n\r\n if (!isNumber(int)) {\r\n return '00';\r\n }\r\n\r\n return int < 10 ? '0' + int.toString() : addThousandsSeperators(int).toString();\r\n}\r\n\r\nexport function bankersRound(num, decimalPlaces) {\r\n // http://stackoverflow.com/questions/3108986/gaussian-bankers-rounding-in-javascript\r\n // https://stackoverflow.com/questions/7360432/c-sharp-rounding-midpointrounding-toeven-vs-midpointrounding-awayfromzero\r\n // This is a JavaScript implementation of Dotnet's `MidpointRounding.ToEven`.\r\n var d = decimalPlaces || 0;\r\n var m = Math.pow(10, d);\r\n var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors\r\n var i = Math.floor(n),\r\n f = n - i;\r\n var e = 1e-8; // Allow for rounding errors in f\r\n var r = f > 0.5 - e && f < 0.5 + e ? (i % 2 == 0 ? i : i + 1) : Math.round(n);\r\n return d ? r / m : r;\r\n}\r\n\r\n/**\r\n * Check that the value passed is a number\r\n * @param number This function will not try to cast the value before checking\r\n * @return boolean true if is number\r\n */\r\nexport function isNumberWithoutTypeCasting(val) {\r\n return typeof val === 'number' && isNaN(val) === false;\r\n}\r\n\r\nexport function isNumber(n) {\r\n // _js\r\n return !isNaN(parseFloat(n)) && isFinite(n);\r\n}\r\n/**\r\n * Perform addition without introducing javascript's repeating\r\n * decimals. Note: integerPart + fractionalPart cannot be more\r\n * than 21 chars else javascript converts it to scientific notation.\r\n * @param number Will not try to cast the value before checking\r\n * @param number Will not try to cast the value before checking\r\n * @return number\r\n */\r\nexport function safeSum(num1, num2) {\r\n //http://adripofjavascript.com/blog/drips/avoiding-problems-with-decimal-math-in-javascript.html\r\n if (typeof num1 !== 'number' || typeof num2 !== 'number') {\r\n throw new Error('arguments must be numbers.');\r\n }\r\n\r\n function checkFractionalLengthTruncateToTenPlaces(n1, n2) {\r\n // NOTE: all digits integerPart + fractionalPart cannot be more than 21 else javascript\r\n // converts it to scientific notation. Once that happens you can no longer do operations. results in NaN.\r\n // precision at 10 leaves 10 digits + 1 for safety for integerPart (9,000,000,000). Safe to say we wont see an int that large\r\n // calculators dont allow more than 17 non-zero digits to be entered, javascript\r\n // will not allow more than 17 non-zero numbers to be passed as arguments.\r\n const precisionThreshold = 10;\r\n const ret = {\r\n num1: n1,\r\n num2: n2,\r\n };\r\n\r\n const numParts1 = String(n1).split('.');\r\n const numParts2 = String(n2).split('.');\r\n let fractionalPart1 = numParts1[1] || '';\r\n let fractionalPart2 = numParts2[1] || '';\r\n\r\n if (fractionalPart1.length > precisionThreshold) {\r\n ret.num1 = Number(`${numParts1[0]}.${fractionalPart1.substring(0, precisionThreshold)}`);\r\n }\r\n\r\n if (fractionalPart2.length > precisionThreshold) {\r\n ret.num2 = Number(`${numParts2[0]}.${fractionalPart2.substring(0, precisionThreshold)}`);\r\n }\r\n\r\n return ret;\r\n }\r\n\r\n // important to overwrite before any other processing\r\n const precheck = checkFractionalLengthTruncateToTenPlaces(num1, num2);\r\n num1 = precheck.num1;\r\n num2 = precheck.num2;\r\n\r\n const numParts1 = String(num1).split('.');\r\n const numParts2 = String(num2).split('.');\r\n const integerPart1 = numParts1[0];\r\n const integerPart2 = numParts2[0];\r\n\r\n let fractionalPart1 = numParts1[1] || '';\r\n let fractionalPart2 = numParts2[1] || '';\r\n let precisionLength1 = fractionalPart1.length;\r\n let precisionLength2 = fractionalPart2.length;\r\n\r\n const isPrecisionTheSame = precisionLength1 === precisionLength2;\r\n const lengthLongestPrecision = Math.max(...[precisionLength1, precisionLength2]);\r\n\r\n const intNoDecimal1 = Number(String(num1).replace('.', ''));\r\n const intNoDecimal2 = Number(String(num2).replace('.', ''));\r\n\r\n let operand1 = null;\r\n let operand2 = null;\r\n\r\n if (!isPrecisionTheSame) {\r\n let numberToAddZeroesTo = '';\r\n\r\n if (lengthLongestPrecision === precisionLength1) {\r\n operand1 = intNoDecimal1;\r\n operand2 = integerPart2;\r\n numberToAddZeroesTo = fractionalPart2;\r\n } else if (lengthLongestPrecision === precisionLength2) {\r\n operand1 = intNoDecimal2;\r\n operand2 = integerPart1;\r\n numberToAddZeroesTo = fractionalPart1;\r\n }\r\n\r\n for (let i = 0, len = Math.abs(precisionLength1 - precisionLength2); i < len; i++) {\r\n numberToAddZeroesTo = numberToAddZeroesTo + '0';\r\n }\r\n\r\n operand2 = Number([operand2, numberToAddZeroesTo].join(''));\r\n } else {\r\n operand1 = intNoDecimal1;\r\n operand2 = intNoDecimal2;\r\n }\r\n\r\n const result = operand1 + operand2;\r\n const isResultNegative = result < 0;\r\n let resultString = String(result);\r\n\r\n if (isResultNegative) {\r\n // REMOVE THE NEGATIVE SIGN TO GET AN ACCURATE STRING LENGTH COUNT\r\n resultString = resultString.replace('-', '');\r\n }\r\n\r\n const arrNumberString = String(resultString).split('');\r\n const insertIndex = resultString.length - lengthLongestPrecision;\r\n\r\n if (insertIndex < 0) {\r\n // ADD LEADING ZEROS TO MATCH PRECISION\r\n for (let i = 0, len = Math.abs(insertIndex); i < len; i++) {\r\n arrNumberString.unshift('0');\r\n }\r\n\r\n // INSERT INDEX CANNOT BE NEGATIVE\r\n arrNumberString.splice(0, 0, '.');\r\n } else {\r\n arrNumberString.splice(insertIndex, 0, '.');\r\n }\r\n\r\n if (isResultNegative) {\r\n // INCLUDE THE NEGATIVE SIGN IF NEEDED\r\n arrNumberString.unshift('-');\r\n }\r\n\r\n return Number(arrNumberString.join(''));\r\n}\r\n\r\nexport function safeSubtract(num1, num2) {\r\n if (typeof num1 !== 'number' || typeof num2 !== 'number') {\r\n throw new Error('arguments must be numbers.');\r\n }\r\n\r\n return safeSum(num1, num2 * -1);\r\n}\r\n\r\nexport function safeProduct(num1, num2) {\r\n //http://adripofjavascript.com/blog/drips/avoiding-problems-with-decimal-math-in-javascript.html\r\n\r\n var numParts1 = String(num1).split('.');\r\n var numParts2 = String(num2).split('.');\r\n var fractionalPart1 = numParts1[1] || '';\r\n var fractionalPart2 = numParts2[1] || '';\r\n\r\n var precisionLength1 = fractionalPart1.length;\r\n var precisionLength2 = fractionalPart2.length;\r\n\r\n var intNoDecimal1 = Number(String(num1).replace('.', '')); // this removes leading zeroes in 0.2 -> '02'\r\n var intNoDecimal2 = Number(String(num2).replace('.', '')); // same\r\n\r\n var operand1 = intNoDecimal1;\r\n var operand2 = intNoDecimal2;\r\n\r\n var result = operand1 * operand2;\r\n var isResultNegative = result < 0;\r\n var resultString = String(result);\r\n var insertIndex = resultString.length - (precisionLength1 + precisionLength2);\r\n\r\n if (precisionLength1 + precisionLength2 > 6) {\r\n throw new Error('This exceeds allowed precision.');\r\n }\r\n\r\n if (isResultNegative) {\r\n // REMOVE THE NEGATIVE SIGN TO GET AN ACCURATE STRING LENGTH COUNT\r\n resultString = resultString.replace('-', '');\r\n }\r\n\r\n var arrNumberString = String(resultString).split('');\r\n\r\n if (insertIndex < 0) {\r\n // ADD LEADING ZEROS TO MATCH PRECISION\r\n // INSERT INDEX CANNOT BE NEGATIVE, OR ELSE COUNTS BACKWARDS FROM LENGTH\r\n for (let i = 0, len = Math.abs(insertIndex); i < len; i++) {\r\n arrNumberString.unshift('0');\r\n }\r\n\r\n arrNumberString.splice(0, 0, '.');\r\n } else {\r\n arrNumberString.splice(insertIndex, 0, '.');\r\n }\r\n\r\n if (isResultNegative) {\r\n // INCLUDE THE NEGATIVE SIGN IF NEEDED\r\n arrNumberString.unshift('-');\r\n }\r\n\r\n return Number(arrNumberString.join(''));\r\n}\r\n\r\nexport function formatThousandsSeperators(integerPart, config) {\r\n // accepts formats only integer part, non-negative numbers.\r\n // returns string\r\n // negative numbers will have to be formatted by the calling fn.\r\n // decimals will have to be formatted by the calling fn.\r\n\r\n config = config || {};\r\n var separator = config.separator || ',';\r\n var output = [];\r\n var aIntReversed;\r\n\r\n if (integerPart === null || integerPart === void 0) {\r\n return null;\r\n }\r\n\r\n aIntReversed = String(integerPart).split('').reverse();\r\n\r\n for (var i = 0, len = aIntReversed.length; i < len; i++) {\r\n if (i === 0) {\r\n output.unshift(aIntReversed[i]);\r\n continue;\r\n }\r\n\r\n if (i % 3 === 0) {\r\n output.unshift(separator);\r\n }\r\n\r\n output.unshift(aIntReversed[i]);\r\n }\r\n\r\n return output.join('');\r\n}\r\n\r\nexport function formatFractionalPartToPrecision(sFractionalPart, config) {\r\n // expects string, returns string\r\n // can be empty string\r\n\r\n config = config || {};\r\n\r\n if (typeof sFractionalPart !== 'string') {\r\n throw new Error('Only strings accepted');\r\n }\r\n\r\n const len = sFractionalPart.split('').length;\r\n let precision = ko.unwrap(config.precision) || 0;\r\n let output = '';\r\n\r\n // special case (for mileage rate fallback.)\r\n if (precision === 3 && len < 3) {\r\n // if precision is 3, and there is 2 or less\r\n // we dont want to present .000 in the case of a rate.\r\n // this would go away if we use the formatFractionalPartToPrecisionProposal (server coop required)\r\n precision = 2;\r\n }\r\n\r\n if (precision === 0) {\r\n output = '';\r\n } else if (precision > len) {\r\n // THIS WILL FILL IN REQUIRED ZEROES TO DISPLAY\r\n const zerosToAdd = [];\r\n let i = precision - len;\r\n\r\n while (i--) {\r\n zerosToAdd.push(0);\r\n }\r\n\r\n output = `${sFractionalPart}${zerosToAdd.join('')}`;\r\n } else if (len > precision) {\r\n // THIS WILL GET HIT IF formatIntegerInput DOES NOT DO ANY TRUNCATION\r\n output = sFractionalPart.substring(0, precision);\r\n } else {\r\n output = sFractionalPart;\r\n }\r\n\r\n return output;\r\n}\r\n\r\n// function formatFractionalPartToPrecisionProposal(sFractionalPart, config) {\r\n// // expects string, returns string\r\n// // can be empty string\r\n// // 05/24/2022 in order for this proposal to work server must ensure that they\r\n// // are always enforcing and sending to ui the appropriate precision\r\n// // else the min and max cannot be enforced reliably, i have tested this.\r\n\r\n// config = config || {};\r\n\r\n// if (typeof sFractionalPart !== 'string') {\r\n// throw new Error('Only strings accepted');\r\n// }\r\n\r\n// const len = sFractionalPart.split('').length;\r\n// const precisionMin = ko.unwrap(config.precisionMin) || 0;\r\n// const precisionMax = ko.unwrap(config.precisionMax) || precisionMin;\r\n// let output = '';\r\n\r\n// if (len < precisionMin) {\r\n// // THIS WILL FILL IN REQUIRED ZEROES TO DISPLAY\r\n// const zerosToAdd = [];\r\n// let i = precisionMin - len;\r\n\r\n// while (i--) {\r\n// zerosToAdd.push(0);\r\n// }\r\n\r\n// output = `${sFractionalPart}${zerosToAdd.join('')}`;\r\n// } else if (len > precisionMax) {\r\n// // THIS WILL GET HIT IF formatIntegerInput DOES NOT DO ANY TRUNCATION\r\n// output = sFractionalPart.substring(0, precisionMax);\r\n// } else {\r\n// // TAKE PROVIDED PRECISION\r\n// output = sFractionalPart;\r\n// }\r\n\r\n// return output;\r\n// }\r\n\r\nexport function stripCurrencySymbols(value) {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n return value.replace(/[$,]+/g, '');\r\n}\r\n\r\nexport function formatToCurrency(n, opts) {\r\n // _js\r\n var signs = {\r\n minus: ['-', ''],\r\n parens: ['(', ')'],\r\n };\r\n\r\n var defaults = {\r\n currSymbol: '$',\r\n currSep: ',',\r\n thousandsSep: '.',\r\n negSymbol: 'parens',\r\n showFractionalPart: true,\r\n showCurrencySymbol: true,\r\n showNegationSymbol: true,\r\n allowNegativeValue: true,\r\n isMileageRate: false,\r\n };\r\n\r\n var options = opts || {};\r\n\r\n for (var prop in defaults) {\r\n var what = options[prop] !== void 0;\r\n options[prop] = what ? options[prop] : defaults[prop];\r\n }\r\n\r\n // isNumber CAN HANDLE STRINGS LET PARSE AS STRING CUZ COULD BE JUST A '.' WHICH IS STRING\r\n var value = isNumber(n) ? +n : 0,\r\n isNegative = value < 0,\r\n //value = (isNegative && options.allowNegativeValue) ? capturedValue : 0,\r\n sign = isNegative ? signs[options.negSymbol] : [],\r\n roundedDecimal = options.isMileageRate ? Math.abs(value).toFixed(3) : Math.abs(value).toFixed(2), // make positive if negative, truncate to 2 decimal places\r\n decimalParts = roundedDecimal.split('.'),\r\n integerPart = decimalParts[0],\r\n fractionalPart = options.showFractionalPart ? decimalParts[1] : '';\r\n\r\n var formattedIntegerPart = addThousandsSeperators(integerPart, options.currSep);\r\n\r\n if (options.showCurrencySymbol === false) {\r\n options.currSymbol = '';\r\n }\r\n\r\n return [options.currSymbol, sign[0], formattedIntegerPart, options.showFractionalPart ? options.thousandsSep : '', fractionalPart, sign[1]].join(\r\n ''\r\n );\r\n}\r\n\r\nexport function countNumOfPrimitivesInArray(arr) {\r\n const hash = {};\r\n\r\n for (let i = 0; i < arr.length; i++) {\r\n const val = arr[i];\r\n hash[val] = hash[val] ? hash[val] + 1 : 1;\r\n }\r\n\r\n return hash;\r\n}\r\n\r\nexport function isObject(val) {\r\n if (val === null) {\r\n return false;\r\n }\r\n return typeof val === 'function' || typeof val === 'object';\r\n // return checkVariableType(val) === 'object';\r\n}\r\n\r\nexport function jDefer() {\r\n // JCS: 08/21/2020\r\n // pull out scope\r\n var fnComplete, fnReject;\r\n // must have a 'then' if complete\r\n // must have a 'catch' if failed\r\n var promise = new Promise((complete, failed) => {\r\n fnComplete = complete;\r\n fnReject = failed;\r\n });\r\n\r\n promise.complete = fnComplete;\r\n promise.failed = fnReject;\r\n\r\n return promise;\r\n}\r\n\r\nexport function isLeapYear(year) {\r\n // _js\r\n return new Date(year, 1, 29).getMonth() === 1;\r\n}\r\n\r\nexport function deffereds(arr) {\r\n if (!Array.isArray(arr)) {\r\n throw new Error('expects an array of promises');\r\n }\r\n\r\n return Promise.all(arr);\r\n}\r\n\r\nexport function fractionReduce(num1, num2) {\r\n if (typeof num1 !== 'number' || typeof num2 !== 'number') {\r\n throw new Error('arguments must be numbers.');\r\n }\r\n\r\n let numerator = num1;\r\n let denominator = num2;\r\n\r\n [9, 8, 7, 6, 5, 4, 3, 2].forEach((n) => {\r\n if (numerator % n === 0 && denominator % n === 0) {\r\n numerator = num1 / n;\r\n denominator = num2 / n;\r\n }\r\n });\r\n\r\n return {\r\n numerator,\r\n denominator,\r\n };\r\n}\r\n\r\nexport function stripWhiteSpace(s) {\r\n return s.replace(/\\s/g);\r\n}\r\n\r\nexport function getCarrierNameById(id) {\r\n var all = {\r\n 11: 'Medical Mutual Ins. Co. of Maine',\r\n 1166: 'The Mutual RRG',\r\n 2264: 'NORCAL Group',\r\n 2265: 'NORCAL Mutual Insurance Company',\r\n 2266: 'MEDICUS Insurance Company',\r\n 2267: 'PMSLIC Insurance Company',\r\n 2286: 'Constellation',\r\n 2287: 'MMIC Insurance, Inc.',\r\n 2288: 'UMIA Insurance, Inc.',\r\n 2569: 'FD Insurance Company',\r\n 2570: 'NCMIC Group',\r\n 2710: 'COPIC Insurance Company',\r\n 2751: 'BETA Healthcare Group',\r\n 2780: 'Texas Medical Liability Trust',\r\n 2873: 'Louisiana Medical Mutual Insurance Company',\r\n 2881: 'West Virginia Mutual Insurance Company',\r\n 2882: 'Physicians Reciprocal Insurers',\r\n 2945: 'Physicians Insurance A Mutual Company',\r\n 2946: 'Medical Insurance Exchange of California',\r\n 3047: 'West Bend Mutual Insurance Company',\r\n 3086: 'The Doctors Company Group',\r\n 3098: 'State Volunteer Mutual Insurance Company',\r\n 3105: 'The Doctors Company',\r\n 3106: 'TDC Specialty UW',\r\n 3107: 'TDC Legal',\r\n 3119: 'NSI, A Division of West Bend Mutual Insurance',\r\n 3120: 'West Bend Commercial and Personal Lines',\r\n 3121: 'Argent, Workers Compensation Insurance',\r\n 3672: 'BJC HealthCare',\r\n 3680: 'McLaren Health Plan',\r\n 3710: 'Fortress Insurance Company',\r\n 3711: 'OMS National Insurance Company',\r\n 4431: 'Western National Insurance Group',\r\n 4457: 'Curi',\r\n 4694: 'Coverys',\r\n 4720: 'ProAssurance',\r\n 5492: 'Skyward',\r\n 5658: 'Triangle Insurance',\r\n 5835: 'MCIC Vermont, Inc.',\r\n 5836: 'Johns Hopkins Medicine',\r\n 5837: 'University of Rochester',\r\n 5838: 'YNHHS - YSM',\r\n 5839: 'New York- Presbyterian Hospital/Columbia/Cornell',\r\n 6144: 'Positive Physicians Insurance Company',\r\n };\r\n\r\n return id ? all[id] : all;\r\n}\r\n\r\nexport function copyToClipboard(str) {\r\n str = typeof str === 'string' ? str : '';\r\n\r\n const el = document.createElement('textarea');\r\n el.value = str;\r\n document.body.appendChild(el);\r\n el.select();\r\n var wasCopied = document.execCommand('copy');\r\n document.body.removeChild(el);\r\n\r\n kp.publish('add-application-message', {\r\n type: wasCopied ? 'valid' : 'invalid',\r\n content: wasCopied ? 'Successfully copied to clipboard' : 'This browser does not support copying to clipboard.',\r\n });\r\n}\r\n\r\nexport function getGuid() {\r\n return uuidv4();\r\n}\r\n\r\nexport function TabbedContentAPI(options) {\r\n var tabs = [];\r\n var i = options.tabs.length;\r\n var Tab = function (data) {\r\n this.title = data.title || '';\r\n this.containerClassname = data.containerClassname || '';\r\n this.tabTemplate = data.tabTemplate || '';\r\n this.template = data.template || '';\r\n this.isActive = ko.observable(data.isDefault);\r\n this.isWaiting = ko.observable(false);\r\n this.errorCount = ko.observable(0);\r\n this.warningCount = ko.observable(0);\r\n this.callback = data.callback;\r\n this.context = data.context;\r\n };\r\n\r\n while (i--) {\r\n tabs.push(new Tab(options.tabs[i]));\r\n }\r\n\r\n return {\r\n tabs: tabs,\r\n activate: function (tab) {\r\n var i = this.tabs.length;\r\n var promise;\r\n\r\n if (checkVariableType(tab) === 'string') {\r\n tab = _find(this.tabs, {\r\n title: tab,\r\n });\r\n }\r\n\r\n while (i--) {\r\n this.tabs[i].isActive(false);\r\n }\r\n\r\n tab.isActive(true); // show so spinner shows\r\n\r\n this.activeTab(tab.title);\r\n\r\n if (typeof tab.callback === 'function') {\r\n tab.isWaiting(true);\r\n promise = tab.callback.call(options.context);\r\n if (promise && promise.always) {\r\n promise.always(tab.isWaiting.bind(tab, false));\r\n } else {\r\n tab.isWaiting(false);\r\n }\r\n }\r\n },\r\n context: options.context,\r\n activeTab: ko.observable(),\r\n chosenTab: ko.observable(),\r\n };\r\n}\r\n\r\nexport function redirectToNewWindow(url) {\r\n if (typeof url !== 'string') {\r\n return;\r\n }\r\n\r\n window.onbeforeunload = function () {};\r\n window.open(url, '_self');\r\n}\r\n\r\nexport function navigateToInvoice(id) {\r\n const queryString = typeof id === 'number' ? `?i=${id}` : '';\r\n\r\n window.onbeforeunload = function () {};\r\n window.location = `/Invoice/InvoiceReview${queryString}`;\r\n}\r\n\r\nexport function containsIllegalfileNameChars(str) {\r\n if (typeof str !== 'string') {\r\n return true;\r\n }\r\n // NOTE: NOT ABLE TO TEST FOR SINGLE BACKSLASH, ONLY 2+.\r\n // JAVASCRIPT WILL CONVERT STR = 'ASDF\\ASDF' -> 'ASDFASDF'\r\n // BEFORE IT CAN BE TESTED.\r\n\r\n return /[\\\\:*?\"<>|/]/.test(str);\r\n}\r\n\r\nexport function isBelowFold(value) {\r\n let offset = 0;\r\n if (typeof value === 'number') {\r\n offset = window.innerHeight - value;\r\n } else {\r\n offset = window.innerHeight - value.getBoundingClientRect().bottom;\r\n }\r\n\r\n return {\r\n offset: offset,\r\n bool: offset < 0,\r\n };\r\n}\r\n\r\nexport function arrayConvertAuditReasons(arr) {\r\n //var input = [{\r\n // AUDIT_REASON_AREA_AUDIT_REASON_ID: 1,\r\n // AUDIT_REASON_AREA_ID: null,\r\n // AUDIT_REASON_ID: null,\r\n // AuditReason: {\r\n // AUDIT_REASON_DESCRIPTION: null,\r\n // AUDIT_REASON_ID: 2,\r\n // AUDIT_REASON_NAME: 'Excessive Rate',\r\n // CREATED_ON: null,\r\n // IS_DISABLED: null\r\n // },\r\n // AuditReasonArea: {\r\n // AUDIT_REASON_AREA_ID: 1,\r\n // AUDIT_REASON_AREA_NAME: 'CarrierLineItemExcessiveCopyRatePackage'\r\n // }\r\n //}];\r\n\r\n var output = [];\r\n\r\n for (let i = 0, len = arr.length; i < len; i++) {\r\n let obj = arr[i]; // current expense\r\n output.push({\r\n ID: obj.AUDIT_REASON_AREA_AUDIT_REASON_ID,\r\n NAME: obj.AuditReason.AUDIT_REASON_NAME,\r\n });\r\n }\r\n\r\n return output;\r\n}\r\n\r\nexport function arrayConvertExpenseTypes(arr) {\r\n //var input = {\r\n // EXPENSE_TYPE: {\r\n // CREATED_ON: null,\r\n // EXPENSE_TYPE_DESCRIPTION: 'Copying',\r\n // EXPENSE_TYPE_ID: 27,\r\n // EXPENSE_TYPE_NAME: 'Copying',\r\n // IS_DISABLED: null\r\n // },\r\n // EXPENSE_TYPE_UNIT_TYPE_ID: 1,\r\n // EXPENSE_UNIT_TYPE: {\r\n // EXPENSE_UNIT_TYPE_ID: 12,\r\n // EXPENSE_UNIT_TYPE_NAME: 'Per Page',\r\n // EXPENSE_UNIT_TYPE_DESCRIPTION: 'Per Page',\r\n // IS_DISABLED: null\r\n // }\r\n //};\r\n\r\n //var output = {\r\n // 27: {\r\n // id: 27,\r\n // description: 'Copying',\r\n // unitTypes: [{id:1, description: 'Per Page'}, ]\r\n // },\r\n //}\r\n var output = [];\r\n var o = {};\r\n\r\n for (var i = 0; i < arr.length; i++) {\r\n let current = arr[i]; // current expense\r\n let id = current.ExpenseType.EXPENSE_TYPE_ID;\r\n\r\n if (o[id]) {\r\n o[id].unitTypes.push({\r\n ID: current.EXPENSE_TYPE_UNIT_TYPE_ID,\r\n NAME: current.ExpenseUnitType.EXPENSE_UNIT_TYPE_DESCRIPTION,\r\n });\r\n } else {\r\n o[id] = {\r\n ID: id,\r\n NAME: current.ExpenseType.EXPENSE_TYPE_NAME,\r\n unitTypes: [\r\n {\r\n ID: current.EXPENSE_TYPE_UNIT_TYPE_ID,\r\n NAME: current.ExpenseUnitType.EXPENSE_UNIT_TYPE_DESCRIPTION,\r\n },\r\n ],\r\n };\r\n }\r\n }\r\n\r\n for (var prop in o) {\r\n output.push(o[prop]);\r\n }\r\n\r\n return output;\r\n}\r\n\r\nexport function clearOnbeforeUnload() {\r\n window.onbeforeunload = function () {};\r\n}\r\n\r\nexport function parseJson(s) {\r\n return typeof s === 'string' ? JSON.parse(s) : s;\r\n}\r\n\r\nexport function highlightRange(dp_from, dp_to, date) {\r\n var date1 = dp_from.datepicker('getDate');\r\n var date2 = dp_to.datepicker('getDate');\r\n\r\n if (!date1 && !date2) {\r\n return [true, '', ''];\r\n }\r\n var date1AppFormat = date1 && dateUtils.convertDateObjectToString(date1);\r\n var date2AppFormat = date2 && dateUtils.convertDateObjectToString(date2);\r\n var dateToCheckAppFormat = dateUtils.convertDateObjectToString(date);\r\n\r\n //console.log(date1AppFormat, dateToCheckAppFormat)\r\n\r\n if (dateToCheckAppFormat === date1AppFormat) {\r\n return [true, 'rangeStart', ''];\r\n } else if (dateToCheckAppFormat === date2AppFormat) {\r\n return [true, 'rangeEnd', ''];\r\n } else if (!date1 || !date2) {\r\n return [true, '', ''];\r\n } else if (date >= date1 && date <= date2) {\r\n return [true, 'highlight', ''];\r\n } else {\r\n return [true, '', ''];\r\n }\r\n}\r\n\r\nexport function arraysRemoveFalsyValues(arr) {\r\n if (checkVariableType(arr) !== 'array') {\r\n return arr;\r\n }\r\n return arr.filter(Boolean);\r\n}\r\n\r\nexport function getOptionsHours() {\r\n const arr = [];\r\n for (let i = 0; i < 13; i++) {\r\n arr.push(i);\r\n }\r\n return arr;\r\n}\r\n\r\nexport function getOptionsMinutes() {\r\n const arr = [];\r\n for (let i = 0; i < 60; i++) {\r\n arr.push({\r\n value: i,\r\n description: i < 10 ? `0${i}` : i,\r\n });\r\n }\r\n\r\n return arr;\r\n}\r\n\r\nexport function validateDataByType(model, items) {\r\n // TO REPLACE SIMPLE FORM ABOVE, AFTER MORE TESTING\r\n var errors = [];\r\n var i = items.length;\r\n var o;\r\n var property;\r\n var comparator;\r\n var result;\r\n var unwrappedValue;\r\n var mustBeValidated;\r\n var dataType;\r\n var msgOverride;\r\n var dataTypes = {\r\n number: checkNumber,\r\n boolean: checkBoolean,\r\n string: checkString,\r\n rate: checkRate,\r\n date: checkDate,\r\n 'select-option': checkSelectOption,\r\n firstName: firstName,\r\n lastName: lastName,\r\n nickname: nickname,\r\n middleInitial: middleInitial,\r\n middleName: middleName,\r\n };\r\n\r\n // put these functions at root of\r\n function checkNumber(v) {\r\n var isValid = checkVariableType(v) === 'number';\r\n return {\r\n msg: isValid ? '' : 'Please enter valid number',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function checkBoolean(v) {\r\n var isValid = checkVariableType(v) === 'boolean';\r\n return {\r\n msg: isValid ? '' : 'Please indicate true or false',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function checkString(v) {\r\n var isValid = checkVariableType(v) === 'string' && v.trim() !== '';\r\n return {\r\n msg: isValid ? '' : 'Please enter a value',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function checkRate(v) {\r\n var isValid = checkVariableType(v) === 'number' && v > 0;\r\n return {\r\n msg: isValid ? '' : 'Please enter an amount greater than 0.00',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function checkSelectOption(v) {\r\n var isValid = checkVariableType(v) !== 'undefined';\r\n return {\r\n msg: isValid ? '' : 'Please select an option',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function checkDate(v) {\r\n var isValid = checkVariableType(dateUtils.convertStringToDateObject(v)) === 'date';\r\n return {\r\n msg: isValid ? '' : 'The date is not valid',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function firstName(v) {\r\n var isValid = validate.firstName(v);\r\n\r\n return {\r\n msg: isValid ? '' : 'First name is required, must be 2-30 letters, and cannot contain a timekeeper role name',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function lastName(v) {\r\n var isValid = validate.lastName(v);\r\n\r\n return {\r\n msg: isValid ? '' : 'Last name is required, must be 2-30 letters, and cannot contain a timekeeper role name',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function nickname(v) {\r\n var isValid = validate.nickname(v);\r\n\r\n return {\r\n msg: isValid ? '' : 'Nickname must be 2-30 letters and cannot contain a timekeeper role name',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function middleInitial(v) {\r\n var isValid = validate.middleInitial(v);\r\n\r\n return {\r\n msg: isValid ? '' : 'Middle initial must be 1 letter',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n function middleName(v) {\r\n var isValid = validate.middleName(v);\r\n\r\n return {\r\n msg: isValid ? '' : 'Middle name must be 2-30 letters and cannot contain a timekeeper role name',\r\n isValid: isValid,\r\n };\r\n }\r\n\r\n while (i--) {\r\n o = items[i];\r\n property = o.name;\r\n dataType = o.type;\r\n msgOverride = o.msgOverride;\r\n comparator = o.comparator;\r\n unwrappedValue = ko.unwrap(model[property]);\r\n mustBeValidated = typeof comparator === 'undefined' || (typeof comparator === 'function' && comparator(model) === true);\r\n\r\n if (!dataTypes[dataType]) throw new Error(`\"${dataType}\" is not a valid validation type.`);\r\n\r\n result = dataTypes[dataType](unwrappedValue);\r\n\r\n if (mustBeValidated && result.isValid === false) {\r\n // eslint-disable-next-line no-undefined\r\n if (model[property].hasError != undefined) {\r\n model[property].hasError(true);\r\n }\r\n model[property].errorMsg(msgOverride ? msgOverride : result.msg);\r\n errors.push(msgOverride ? msgOverride : result.msg);\r\n } else {\r\n model[property].hasError(false);\r\n model[property].errorMsg('');\r\n }\r\n }\r\n\r\n return errors;\r\n}\r\n\r\n// An Array extension. Returns an a string containing the HTML of an unordered list for each of the array elements that are of type string.\r\nArray.prototype.toHtmlUnorderedList = function () {\r\n let msg = '';\r\n for (const e of this) {\r\n if (typeof e === 'string') {\r\n msg += `