{"version":3,"sources":["main/core/translator.js","main/core/translator.ts","main/core/log.js","main/core/log.ts","main/core/localstorage.js","main/core/localstorage.ts","public/public.js","public/public.ts"],"names":["T","args","appn","translator","getString","getLanguageISO","resx","_a","_b","_c","template","shift","cleanKey","getResourceKeyFor","undefined","isDebug","isTestSuiteRequest","missing","JSON","parse","localStorage","getItem","culture","includes","push","setItem","stringify","length","formatString","val","params","replace","match","index","text","normed","normaliseString","cleaned","substring","RESXKEYLENGTH","getPersistentHashCode","str","hash1","iadd","hash2","i","charCodeAt","Math","abs","imul","i32","value","a","b","log","log_1","_loggingEnabled","init","enabledFromLs","LogLevel","message","logLevel","Info","console","Warning","warn","Error","error","Debug","debug","info","includeCallStack","stack","warning","PerfTimer","start","time0","performance","now","stop","time1","timeDelta","title","toFixed","constructor","emptyString","_clearLsKey","key","item","lsValue","window","e","isSet","removeItem","clearAll","clear","autoClearLs","hasLsBeenAutoCleared","clearAllAndSetFreshLs","emptyGuid","String","prototype","endsWithIgnoreCase","stringToFind","dontTrim","toLowerCase","endsWith","trim"],"mappings":"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","file":"content/platform/public.min.js","sourcesContent":["\"use strict\";\nconst T = function (...args) { return appn.translator.getString(...args); };\nvar appn;\n(function (appn) {\n var translator;\n (function (translator) {\n function getLanguageISO() {\n return appn.translator.resx['culturecode'];\n }\n translator.getLanguageISO = getLanguageISO;\n ;\n function getString(...args) {\n var _a, _b, _c;\n let template = (_a = args.shift()) !== null && _a !== void 0 ? _a : '';\n if (appn.translator.resx) {\n let cleanKey = getResourceKeyFor(template);\n if (appn.translator.resx[cleanKey] !== undefined)\n template = appn.translator.resx[cleanKey];\n else if (appn.isDebug || appn.isTestSuiteRequest) {\n let missing = (_c = JSON.parse((_b = appn.localStorage.getItem('appn.missingkeys')) !== null && _b !== void 0 ? _b : '{}')) !== null && _c !== void 0 ? _c : {};\n let culture = appn.translator.resx['culturecode'];\n if (missing[culture] === undefined)\n missing[culture] = [];\n if (!missing[culture].includes(template)) {\n missing[culture].push(template);\n appn.localStorage.setItem('appn.missingkeys', JSON.stringify(missing));\n }\n }\n }\n if (args.length === 0)\n return template;\n return formatString(template, args);\n }\n translator.getString = getString;\n ;\n function formatString(val, params) {\n return val.replace(/{(\\d+)}/g, (match, index) => {\n return typeof params[index] !== 'undefined' ? params[index] : match;\n });\n }\n function getResourceKeyFor(text) {\n var normed = normaliseString(text);\n var cleaned = normed.substring(0, translator.RESXKEYLENGTH).replace(/\\s+/g, '_').replace(/\\W/g, '');\n return `${cleaned}_${getPersistentHashCode(normed)}`;\n }\n translator.getResourceKeyFor = getResourceKeyFor;\n function normaliseString(val) {\n return val.replace('/\\r/g', '').replace(/[ \\t]{2,}/g, ' ');\n }\n translator.normaliseString = normaliseString;\n function getPersistentHashCode(str) {\n let hash1 = iadd(5381 << 16, 5381);\n let hash2 = hash1;\n for (let i = 0; i < str.length; i += 2) {\n hash1 = iadd(hash1 << 5, hash1) ^ str.charCodeAt(i);\n if (i === str.length - 1) {\n break;\n }\n hash2 = iadd(hash2 << 5, hash2) ^ str.charCodeAt(i + 1);\n }\n return Math.abs(iadd(hash1, Math.imul(hash2, 1566083941)));\n }\n translator.getPersistentHashCode = getPersistentHashCode;\n function i32(value) {\n return value | 0;\n }\n translator.i32 = i32;\n function iadd(a, b) {\n return ((a | 0) + (b | 0)) | 0;\n }\n translator.iadd = iadd;\n })(translator = appn.translator || (appn.translator = {}));\n})(appn || (appn = {}));\n","/**\n * Wrapper and manager for resources strings, matches in with how we do server-side translations.\n */\n\nconst T = function(...args: any[]) { return appn.translator.getString(...args); };\n\nnamespace appn.translator {\n export let resx: any; // populated by server\n export let RESXKEYLENGTH: number; // populated by server\n\n export function getLanguageISO(): string {\n return appn.translator.resx['culturecode'];\n };\n\n export function getString(...args: any[]): string {\n let template = args.shift() ?? '';\n\n if (appn.translator.resx) {\n let cleanKey = getResourceKeyFor(template);\n if (appn.translator.resx[cleanKey] !== undefined)\n template = appn.translator.resx[cleanKey];\n // track missing keys if test/debug\n else if (appn.isDebug || appn.isTestSuiteRequest) {\n let missing = JSON.parse(localStorage.getItem('appn.missingkeys') ?? '{}') ?? {};\n let culture = appn.translator.resx['culturecode'];\n if (missing[culture] === undefined)\n missing[culture] = [];\n if (!missing[culture].includes(template)) {\n missing[culture].push(template);\n localStorage.setItem('appn.missingkeys', JSON.stringify(missing));\n }\n }\n }\n\n if (args.length === 0)\n return template;\n\n return formatString(template, args);\n };\n\n function formatString(val: string, params: string[]): string {\n return val.replace(/{(\\d+)}/g, (match, index) => {\n return typeof params[index] !== 'undefined' ? params[index] : match;\n });\n }\n\n // NB: This *must* match with server-side implementation.\n export function getResourceKeyFor(text: string): string {\n var normed = normaliseString(text);\n\n var cleaned = normed.substring(0, RESXKEYLENGTH).replace(/\\s+/g, '_').replace(/\\W/g, '');\n\n return `${cleaned}_${getPersistentHashCode(normed)}`;\n }\n\n // NB: This *must* match with server-side implementation.\n export function normaliseString(val: string): string {\n return val.replace('/\\r/g', '').replace(/[ \\t]{2,}/g, ' ');\n }\n\n // uses 32 bit integer operations to handle int32 overflow same as C#\n export function getPersistentHashCode(str: string): number {\n let hash1 = iadd(5381 << 16, 5381);\n let hash2 = hash1;\n for (let i = 0; i < str.length; i += 2) {\n hash1 = iadd(hash1 << 5, hash1) ^ str.charCodeAt(i);\n if (i === str.length - 1) {\n break;\n }\n hash2 = iadd(hash2 << 5, hash2) ^ str.charCodeAt(i + 1);\n }\n return Math.abs(iadd(hash1, Math.imul(hash2, 1566083941)));\n }\n\n export function i32(value: number): number {\n return value | 0;\n }\n\n export function iadd(a: number, b: number): number {\n return ((a | 0) + (b | 0)) | 0;\n }\n}\n","\"use strict\";\nvar appn;\n(function (appn) {\n var log;\n (function (log_1) {\n let _loggingEnabled = false;\n function init() {\n if (appn.isDebug) {\n _loggingEnabled = true;\n return;\n }\n const enabledFromLs = appn.localStorage.getItem('loggingEnabled');\n _loggingEnabled = enabledFromLs ? true : false;\n }\n log_1.init = init;\n let LogLevel;\n (function (LogLevel) {\n LogLevel[LogLevel[\"Info\"] = 0] = \"Info\";\n LogLevel[LogLevel[\"Warning\"] = 1] = \"Warning\";\n LogLevel[LogLevel[\"Error\"] = 2] = \"Error\";\n LogLevel[LogLevel[\"Debug\"] = 3] = \"Debug\";\n })(LogLevel || (LogLevel = {}));\n function log(message, logLevel) {\n if (!_loggingEnabled)\n return;\n switch (logLevel) {\n case LogLevel.Info: {\n console.log(message);\n break;\n }\n case LogLevel.Warning: {\n console.warn(message);\n break;\n }\n case LogLevel.Error: {\n console.error(message);\n break;\n }\n case LogLevel.Debug: {\n console.debug(message);\n break;\n }\n }\n }\n function info(message, includeCallStack) {\n log(message, LogLevel.Info);\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n log_1.info = info;\n function warning(message, includeCallStack) {\n log(message, LogLevel.Warning);\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n log_1.warning = warning;\n function error(message, includeCallStack) {\n log(message, LogLevel.Error);\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n log_1.error = error;\n function debug(message, includeCallStack) {\n log(message, LogLevel.Debug);\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n log_1.debug = debug;\n class PerfTimer {\n constructor(title) {\n this.time0 = 0;\n this.time1 = 0;\n this.title = appn.emptyString;\n this.title = title;\n }\n start() {\n this.time0 = performance.now();\n }\n stop() {\n this.time1 = performance.now();\n const timeDelta = (this.time1 - this.time0);\n const message = `${this.title}: ${timeDelta.toFixed(5)} ms`;\n appn.log.info(message);\n return message;\n }\n }\n log_1.PerfTimer = PerfTimer;\n })(log = appn.log || (appn.log = {}));\n})(appn || (appn = {}));\n","namespace appn.log {\n\n let _loggingEnabled = false;\n\n export function init() {\n\n if (appn.isDebug) {\n _loggingEnabled = true;\n return;\n }\n\n const enabledFromLs = appn.localStorage.getItem('loggingEnabled');\n _loggingEnabled = enabledFromLs ? true : false;\n }\n\n enum LogLevel {\n Info,\n Warning,\n Error,\n Debug\n }\n\n function log(message: any, logLevel?: LogLevel) {\n if (!_loggingEnabled)\n return;\n\n // Do stuff before\n\n switch (logLevel) {\n case LogLevel.Info: {\n console.log(message);\n break;\n }\n case LogLevel.Warning: {\n console.warn(message);\n break;\n }\n case LogLevel.Error: {\n console.error(message);\n break;\n }\n case LogLevel.Debug: {\n console.debug(message);\n break;\n }\n }\n\n // Do stuff after\n }\n\n export function info(message: any, includeCallStack?: boolean) {\n log(message, LogLevel.Info);\n\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n\n export function warning(message: any, includeCallStack?: boolean) {\n log(message, LogLevel.Warning);\n\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n\n export function error(message: any, includeCallStack?: boolean) {\n log(message, LogLevel.Error);\n\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n\n export function debug(message: any, includeCallStack?: boolean) {\n log(message, LogLevel.Debug);\n\n if (includeCallStack)\n appn.log.debug(new Error().stack);\n }\n\n export class PerfTimer {\n time0: number = 0;\n time1: number = 0;\n title: string = appn.emptyString;\n\n constructor(title: string) {\n this.title = title;\n }\n\n start(): void {\n this.time0 = performance.now();\n }\n\n stop(): string {\n this.time1 = performance.now();\n const timeDelta = (this.time1 - this.time0);\n const message = `${this.title}: ${timeDelta.toFixed(5)} ms`;\n appn.log.info(message);\n return message;\n }\n }\n\n}\n","\"use strict\";\nvar appn;\n(function (appn) {\n var localStorage;\n (function (localStorage) {\n const _clearLsKey = 'freshLs-Web30Mar2022';\n function getItem(key) {\n let item = null;\n try {\n const lsValue = window.localStorage.getItem(key);\n item = lsValue ? JSON.parse(lsValue) : null;\n }\n catch (e) {\n if (e && e.message)\n console.log(e.message);\n }\n return item;\n }\n localStorage.getItem = getItem;\n function setItem(key, value) {\n let isSet = true;\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n }\n catch (e) {\n isSet = false;\n if (e && e.message)\n appn.log.error(e.message, true);\n }\n return isSet;\n }\n localStorage.setItem = setItem;\n function removeItem(key) {\n try {\n window.localStorage.removeItem(key);\n }\n catch (e) {\n if (e && e.message)\n console.log(e.message);\n }\n }\n localStorage.removeItem = removeItem;\n function clearAll() {\n try {\n window.localStorage.clear();\n }\n catch (e) {\n if (e && e.message)\n console.log(e.message);\n }\n }\n localStorage.clearAll = clearAll;\n function autoClearLs() {\n const hasLsBeenAutoCleared = appn.localStorage.getItem(_clearLsKey);\n if (hasLsBeenAutoCleared)\n return;\n clearAllAndSetFreshLs();\n }\n localStorage.autoClearLs = autoClearLs;\n function clearAllAndSetFreshLs() {\n appn.localStorage.clearAll();\n appn.localStorage.setItem(_clearLsKey, true);\n }\n localStorage.clearAllAndSetFreshLs = clearAllAndSetFreshLs;\n })(localStorage = appn.localStorage || (appn.localStorage = {}));\n})(appn || (appn = {}));\n","/**\n * A wrapper for local storage with error handling\n * Wraps local storage gets, sets and removes and saves and parses objects instead of strings\n * Allows use of serialized objects\n */\nnamespace appn.localStorage {\n /**\n * Change the date here to ensure a fresh local storage on next load\n */\n const _clearLsKey: string = 'freshLs-Web30Mar2022';\n\n /**\n * Gets an object from localstorage\n * @param key\n */\n export function getItem(key: string): any {\n let item = null;\n\n try {\n const lsValue: any = window.localStorage.getItem(key);\n item = lsValue ? JSON.parse(lsValue) : null;\n } catch (e: any) {\n if (e && e.message)\n console.log(e.message);\n }\n\n return item;\n }\n\n /**\n * Creates or Updates an object in localstorage\n * @param key\n * @param value\n */\n export function setItem(key: string, value: any) {\n let isSet = true;\n\n try {\n window.localStorage.setItem(key, JSON.stringify(value));\n } catch (e: any) {\n isSet = false;\n if (e && e.message)\n appn.log.error(e.message, true);\n }\n\n return isSet;\n }\n\n /**\n * Removes an object from localstorage\n * @param key\n */\n export function removeItem(key: string) {\n try {\n window.localStorage.removeItem(key);\n } catch (e: any) {\n if (e && e.message)\n console.log(e.message);\n }\n }\n\n /**\n * Clears EVERYTHING out of local storage\n */\n export function clearAll() {\n try {\n window.localStorage.clear();\n } catch (e: any) {\n if (e && e.message)\n console.log(e.message);\n }\n }\n\n /**\n * Refreshes Local Storage if freshLs doesn't exist\n */\n export function autoClearLs() {\n const hasLsBeenAutoCleared = appn.localStorage.getItem(_clearLsKey);\n if (hasLsBeenAutoCleared)\n return;\n\n // Clear all local storage\n clearAllAndSetFreshLs();\n }\n\n /**\n * Clear All and set flag.\n */\n export function clearAllAndSetFreshLs() {\n appn.localStorage.clearAll();\n appn.localStorage.setItem(_clearLsKey, true);\n }\n}\n","\"use strict\";\nvar appn;\n(function (appn) {\n appn.isDebug = appn.isDebug;\n appn.isTestSuiteRequest = appn.isTestSuiteRequest;\n appn.emptyGuid = appn.emptyGuid;\n appn.emptyString = '';\n String.prototype.endsWithIgnoreCase = function (stringToFind, dontTrim) {\n if (dontTrim)\n return this.toLowerCase().endsWith(stringToFind.toLowerCase());\n return this.trim().toLowerCase().endsWith(stringToFind.trim().toLowerCase());\n };\n})(appn || (appn = {}));\n","/* \n * Bare essentials needed to run appn namespaces outside authed areas\n */\nnamespace appn {\n /**\n * A flag indicating if we are in Server debug mode\n */\n export const isDebug: boolean = appn.isDebug;\n\n /**\n * A flag indicating if we are in Server debug mode\n */\n export const isTestSuiteRequest: boolean = appn.isTestSuiteRequest;\n\n /**\n * Just an empty Guid... use it or loose it\n */\n export const emptyGuid: string = appn.emptyGuid;\n\n /**\n * Just an empty String... use it or loose it\n */\n export const emptyString: string = '';\n\n String.prototype.endsWithIgnoreCase = function(stringToFind: string, dontTrim: boolean): boolean {\n if (dontTrim)\n return this.toLowerCase().endsWith(stringToFind.toLowerCase());\n\n return this.trim().toLowerCase().endsWith(stringToFind.trim().toLowerCase());\n };\n}\n\ninterface String {\n endsWithIgnoreCase(stringToFind: string, dontTrim?: boolean): boolean;\n}\n"]}