{"version":3,"file":"assets/js/pcf_bundle_content.js","mappings":"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","sources":["webpack:///../node_modules/element-remove/index.js","webpack:///../node_modules/eligrey-classlist-js-polyfill/classList.js","webpack:///../node_modules/smart-timeout/index.js","webpack:///../node_modules/smart-timeout/lib/timeout.js","webpack:///./typescript/PCF/flyout-content-controller.ts","webpack:///./typescript/PCF/flyout-content.ts","webpack:///./typescript/PCF/flyout-controller.ts","webpack:///./typescript/PCF/notification-service.ts","webpack:///./typescript/PCF/stickyFlyOutNotificationService.ts","webpack:///./typescript/TP/CompareButton.ts","webpack:///./typescript/TP/MobileToolbarButton.ts","webpack:///./typescript/TP/TileScaleButton.ts","webpack:///./typescript/TP/TileScaleButtonEx.ts","webpack:///./typescript/TP/TouchPointFactory.ts","webpack:///./typescript/TP/TouchPointIdentifier.ts","webpack:///./typescript/errorhandler.ts","webpack:///./typescript/helpers/MpcScopeDetection.ts","webpack:///./typescript/helpers/MpcSettings.ts","webpack:///./typescript/helpers/NavigationService.ts","webpack:///./typescript/helpers/call-limiter.ts","webpack:///./typescript/helpers/comparePageButtonUrlUpdater.ts","webpack:///./typescript/helpers/deviceDetectionHelper.ts","webpack:///./typescript/helpers/event-bus.ts","webpack:///./typescript/helpers/htmlElementsHelper.ts","webpack:///./typescript/helpers/polyfills.ts","webpack:///./typescript/helpers/scrollLock.ts","webpack:///./typescript/helpers/vanillajax.ts","webpack:///./typescript/local-storage-service.ts","webpack:///../node_modules/axios/dist/browser/axios.cjs","webpack:///webpack/bootstrap","webpack:///webpack/runtime/global","webpack:///webpack/runtime/make namespace object","webpack:///./pcf-bundle-content.ts"],"sourcesContent":["(function (arr) {\n arr.forEach(function (item) {\n if (item.hasOwnProperty('remove')) {\n return;\n }\n Object.defineProperty(item, 'remove', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: function remove() {\n this.parentNode && this.parentNode.removeChild(this);\n }\n });\n });\n})([Element.prototype, CharacterData.prototype, DocumentType.prototype].filter(Boolean));\n","/*\n * classList.js: Cross-browser full element.classList implementation.\n * 1.2.20180112\n *\n * By Eli Grey, http://eligrey.com\n * License: Dedicated to the public domain.\n * See https://github.com/eligrey/classList.js/blob/master/LICENSE.md\n */\n\n/*global self, document, DOMException */\n\n/*! @source http://purl.eligrey.com/github/classList.js/blob/master/classList.js */\n\nif (\"document\" in self) {\n\n// Full polyfill for browsers with no classList support\n// Including IE < Edge missing SVGElement.classList\nif (\n\t !(\"classList\" in document.createElement(\"_\")) \n\t|| document.createElementNS\n\t&& !(\"classList\" in document.createElementNS(\"http://www.w3.org/2000/svg\",\"g\"))\n) {\n\n(function (view) {\n\n\"use strict\";\n\nif (!('Element' in view)) return;\n\nvar\n\t classListProp = \"classList\"\n\t, protoProp = \"prototype\"\n\t, elemCtrProto = view.Element[protoProp]\n\t, objCtr = Object\n\t, strTrim = String[protoProp].trim || function () {\n\t\treturn this.replace(/^\\s+|\\s+$/g, \"\");\n\t}\n\t, arrIndexOf = Array[protoProp].indexOf || function (item) {\n\t\tvar\n\t\t\t i = 0\n\t\t\t, len = this.length\n\t\t;\n\t\tfor (; i < len; i++) {\n\t\t\tif (i in this && this[i] === item) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\t// Vendors: please allow content code to instantiate DOMExceptions\n\t, DOMEx = function (type, message) {\n\t\tthis.name = type;\n\t\tthis.code = DOMException[type];\n\t\tthis.message = message;\n\t}\n\t, checkTokenAndGetIndex = function (classList, token) {\n\t\tif (token === \"\") {\n\t\t\tthrow new DOMEx(\n\t\t\t\t \"SYNTAX_ERR\"\n\t\t\t\t, \"The token must not be empty.\"\n\t\t\t);\n\t\t}\n\t\tif (/\\s/.test(token)) {\n\t\t\tthrow new DOMEx(\n\t\t\t\t \"INVALID_CHARACTER_ERR\"\n\t\t\t\t, \"The token must not contain space characters.\"\n\t\t\t);\n\t\t}\n\t\treturn arrIndexOf.call(classList, token);\n\t}\n\t, ClassList = function (elem) {\n\t\tvar\n\t\t\t trimmedClasses = strTrim.call(elem.getAttribute(\"class\") || \"\")\n\t\t\t, classes = trimmedClasses ? trimmedClasses.split(/\\s+/) : []\n\t\t\t, i = 0\n\t\t\t, len = classes.length\n\t\t;\n\t\tfor (; i < len; i++) {\n\t\t\tthis.push(classes[i]);\n\t\t}\n\t\tthis._updateClassName = function () {\n\t\t\telem.setAttribute(\"class\", this.toString());\n\t\t};\n\t}\n\t, classListProto = ClassList[protoProp] = []\n\t, classListGetter = function () {\n\t\treturn new ClassList(this);\n\t}\n;\n// Most DOMException implementations don't allow calling DOMException's toString()\n// on non-DOMExceptions. Error's toString() is sufficient here.\nDOMEx[protoProp] = Error[protoProp];\nclassListProto.item = function (i) {\n\treturn this[i] || null;\n};\nclassListProto.contains = function (token) {\n\treturn ~checkTokenAndGetIndex(this, token + \"\");\n};\nclassListProto.add = function () {\n\tvar\n\t\t tokens = arguments\n\t\t, i = 0\n\t\t, l = tokens.length\n\t\t, token\n\t\t, updated = false\n\t;\n\tdo {\n\t\ttoken = tokens[i] + \"\";\n\t\tif (!~checkTokenAndGetIndex(this, token)) {\n\t\t\tthis.push(token);\n\t\t\tupdated = true;\n\t\t}\n\t}\n\twhile (++i < l);\n\n\tif (updated) {\n\t\tthis._updateClassName();\n\t}\n};\nclassListProto.remove = function () {\n\tvar\n\t\t tokens = arguments\n\t\t, i = 0\n\t\t, l = tokens.length\n\t\t, token\n\t\t, updated = false\n\t\t, index\n\t;\n\tdo {\n\t\ttoken = tokens[i] + \"\";\n\t\tindex = checkTokenAndGetIndex(this, token);\n\t\twhile (~index) {\n\t\t\tthis.splice(index, 1);\n\t\t\tupdated = true;\n\t\t\tindex = checkTokenAndGetIndex(this, token);\n\t\t}\n\t}\n\twhile (++i < l);\n\n\tif (updated) {\n\t\tthis._updateClassName();\n\t}\n};\nclassListProto.toggle = function (token, force) {\n\tvar\n\t\t result = this.contains(token)\n\t\t, method = result ?\n\t\t\tforce !== true && \"remove\"\n\t\t:\n\t\t\tforce !== false && \"add\"\n\t;\n\n\tif (method) {\n\t\tthis[method](token);\n\t}\n\n\tif (force === true || force === false) {\n\t\treturn force;\n\t} else {\n\t\treturn !result;\n\t}\n};\nclassListProto.replace = function (token, replacement_token) {\n\tvar index = checkTokenAndGetIndex(token + \"\");\n\tif (~index) {\n\t\tthis.splice(index, 1, replacement_token);\n\t\tthis._updateClassName();\n\t}\n}\nclassListProto.toString = function () {\n\treturn this.join(\" \");\n};\n\nif (objCtr.defineProperty) {\n\tvar classListPropDesc = {\n\t\t get: classListGetter\n\t\t, enumerable: true\n\t\t, configurable: true\n\t};\n\ttry {\n\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t} catch (ex) { // IE 8 doesn't support enumerable:true\n\t\t// adding undefined to fight this issue https://github.com/eligrey/classList.js/issues/36\n\t\t// modernie IE8-MSW7 machine has IE8 8.0.6001.18702 and is affected\n\t\tif (ex.number === undefined || ex.number === -0x7FF5EC54) {\n\t\t\tclassListPropDesc.enumerable = false;\n\t\t\tobjCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);\n\t\t}\n\t}\n} else if (objCtr[protoProp].__defineGetter__) {\n\telemCtrProto.__defineGetter__(classListProp, classListGetter);\n}\n\n}(self));\n\n}\n\n// There is full or partial native classList support, so just check if we need\n// to normalize the add/remove and toggle APIs.\n\n(function () {\n\t\"use strict\";\n\n\tvar testElement = document.createElement(\"_\");\n\n\ttestElement.classList.add(\"c1\", \"c2\");\n\n\t// Polyfill for IE 10/11 and Firefox <26, where classList.add and\n\t// classList.remove exist but support only one argument at a time.\n\tif (!testElement.classList.contains(\"c2\")) {\n\t\tvar createMethod = function(method) {\n\t\t\tvar original = DOMTokenList.prototype[method];\n\n\t\t\tDOMTokenList.prototype[method] = function(token) {\n\t\t\t\tvar i, len = arguments.length;\n\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\ttoken = arguments[i];\n\t\t\t\t\toriginal.call(this, token);\n\t\t\t\t}\n\t\t\t};\n\t\t};\n\t\tcreateMethod('add');\n\t\tcreateMethod('remove');\n\t}\n\n\ttestElement.classList.toggle(\"c3\", false);\n\n\t// Polyfill for IE 10 and Firefox <24, where classList.toggle does not\n\t// support the second argument.\n\tif (testElement.classList.contains(\"c3\")) {\n\t\tvar _toggle = DOMTokenList.prototype.toggle;\n\n\t\tDOMTokenList.prototype.toggle = function(token, force) {\n\t\t\tif (1 in arguments && !this.contains(token) === !force) {\n\t\t\t\treturn force;\n\t\t\t} else {\n\t\t\t\treturn _toggle.call(this, token);\n\t\t\t}\n\t\t};\n\n\t}\n\n\t// replace() polyfill\n\tif (!(\"replace\" in document.createElement(\"_\").classList)) {\n\t\tDOMTokenList.prototype.replace = function (token, replacement_token) {\n\t\t\tvar\n\t\t\t\t tokens = this.toString().split(\" \")\n\t\t\t\t, index = tokens.indexOf(token + \"\")\n\t\t\t;\n\t\t\tif (~index) {\n\t\t\t\ttokens = tokens.slice(index);\n\t\t\t\tthis.remove.apply(this, tokens);\n\t\t\t\tthis.add(replacement_token);\n\t\t\t\tthis.add.apply(this, tokens.slice(1));\n\t\t\t}\n\t\t}\n\t}\n\n\ttestElement = null;\n}());\n\n}","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar timeout_1 = require(\"./lib/timeout\");\nmodule.exports = timeout_1.Timeout;\n//# sourceMappingURL=index.js.map\n","\"use strict\";\nvar __spreadArrays = (this && this.__spreadArrays) || function () {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MetadataRecord = /** @class */ (function () {\n function MetadataRecord(callback, key, ms, params) {\n this.callback = callback;\n this.key = key;\n this.ms = ms;\n this.params = params;\n this.paused = false;\n this.startTime = new Date().getTime();\n this.timeSpentWaiting = 0;\n }\n return MetadataRecord;\n}());\nvar Timeout = /** @class */ (function () {\n function Timeout() {\n }\n /**\n * clear timeout and optionally erase all knowledge of its existence\n * @param key\n * @param erase\n */\n Timeout.clear = function (key, erase) {\n if (erase === void 0) { erase = true; }\n clearTimeout(Timeout.keyId[key]);\n delete Timeout.keyId[key];\n delete Timeout.keyCall[key];\n if (erase) {\n delete Timeout.metadata[key];\n delete Timeout.originalMs[key];\n }\n };\n Timeout.set = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var key;\n var ms;\n var params;\n var callback;\n if (args.length === 0) {\n throw Error('Timeout.set() requires at least one argument');\n }\n if (typeof args[1] === 'function') {\n key = args[0], callback = args[1], ms = args[2], params = args.slice(3);\n }\n else {\n callback = args[0], ms = args[1], params = args.slice(2);\n key = callback.toString();\n }\n if (!callback) {\n throw Error('Timeout.set() requires a callback parameter');\n }\n Timeout.clear(key);\n var invoke = function () {\n Timeout.metadata[key].executedTime = new Date().getTime();\n callback.apply(void 0, params);\n };\n Timeout.keyId[key] = setTimeout(invoke, ms || 0);\n Timeout.keyCall[key] = function () { return callback.apply(void 0, params); };\n Timeout.originalMs[key] = Timeout.originalMs[key] || ms;\n Timeout.metadata[key] = new MetadataRecord(callback, key, ms, params);\n return function () { return Timeout.executed(key); };\n };\n Timeout.create = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (args.length === 0) {\n throw Error('Timeout.create() requires at least one argument');\n }\n var key;\n if (typeof args[1] === 'function') {\n key = args[0];\n }\n else {\n var callback = args[0];\n key = callback.toString();\n }\n return Timeout.exists(key) ? false : Timeout.set.apply(Timeout, args);\n };\n /**\n * elapsed time since the timeout was created\n * @param key\n */\n Timeout.elapsed = function (key) {\n var metaDataRecord = Timeout.metadata[key];\n if (!metaDataRecord)\n return 0;\n return Math.max(0, new Date().getTime() - metaDataRecord.startTime);\n };\n /**\n * timeout has been created\n * @param key\n */\n Timeout.exists = function (key) {\n return key in Timeout.keyId || (Timeout.metadata)[key] !== undefined;\n };\n /**\n * fire the callback on demand, without affecting the timeout or meta data (execution time)\n * @param key\n * @returns {(false|any)} false if timeout does not exist or the return value of the callback\n */\n Timeout.call = function (key) {\n return Timeout.exists(key) && (Timeout.keyCall)[key]();\n };\n /**\n * test if a timeout has run\n * @param key\n */\n Timeout.executed = function (key) {\n return Timeout.exists(key) && !!Timeout.metadata[key].executedTime;\n };\n /**\n * when timeout was last executed\n * @param key\n */\n Timeout.lastExecuted = function (key) {\n return !Timeout.executed(key)\n ? null\n : new Date(Timeout.metadata[key].executedTime);\n };\n /**\n * metadata about a timeout\n * @param key\n */\n Timeout.meta = function (key) {\n return Timeout.metadata[key];\n };\n /**\n * timeout does exist, but has not yet run\n * @param key\n */\n Timeout.pending = function (key) {\n return Timeout.exists(key) && !Timeout.executed(key);\n };\n /**\n * timeout does exist, but will not execute because it is paused\n * @param key\n */\n Timeout.paused = function (key) {\n return Timeout.exists(key)\n && !Timeout.executed(key)\n && Timeout.metadata[key].paused;\n };\n /**\n * remaining time until timeout will occur\n * @param key\n */\n Timeout.remaining = function (key) {\n if (!Timeout.metadata[key])\n return 0;\n var metaDataRecord = Timeout.metadata[key];\n return Timeout.paused(key)\n ? metaDataRecord.ms - metaDataRecord.timeSpentWaiting\n : Math.max(0, metaDataRecord.startTime + metaDataRecord.ms - new Date().getTime());\n };\n /**\n * set timeout anew, optionally with new time and params\n * @param key\n * @param ms new millisecs before execution\n * @param params new parameters to callback\n */\n Timeout.reset = function (key, ms) {\n var params = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n params[_i - 2] = arguments[_i];\n }\n var metaDataRecord = Timeout.metadata[key];\n if (!metaDataRecord)\n return false;\n Timeout.clear(key, false);\n if (metaDataRecord.paused) {\n metaDataRecord.paused = false;\n }\n return Timeout.set.apply(Timeout, __spreadArrays([key,\n metaDataRecord.callback, ms !== null && ms !== void 0 ? ms : Timeout.originalMs[key]], (params || metaDataRecord.params)));\n };\n /**\n * restart timeout with original time\n * @param key\n * @param force restart even even if not yet executed\n */\n Timeout.restart = function (key, force) {\n if (force === void 0) { force = false; }\n if (!Timeout.metadata[key] || (!force && Timeout.executed(key)))\n return false;\n var metaDataRecord = Timeout.metadata[key];\n Timeout.clear(key, false);\n if (metaDataRecord.paused) {\n metaDataRecord.paused = false;\n }\n return Timeout.set.apply(Timeout, __spreadArrays([key, metaDataRecord.callback, Timeout.originalMs[key]], metaDataRecord.params));\n };\n /**\n * pause our execution countdown until we're ready for it to resume\n * @param key\n */\n Timeout.pause = function (key) {\n if (!Timeout.metadata[key] || Timeout.paused(key) || Timeout.executed(key))\n return false;\n Timeout.clear(key, false);\n var metaDataRecord = Timeout.metadata[key];\n metaDataRecord.paused = true;\n metaDataRecord.timeSpentWaiting = new Date().getTime() - metaDataRecord.startTime;\n return metaDataRecord.timeSpentWaiting;\n };\n /**\n * resume paused Timeout with the remaining time\n * @param key\n */\n Timeout.resume = function (key) {\n if (!Timeout.metadata[key] || Timeout.executed(key))\n return false;\n var metaDataRecord = Timeout.metadata[key];\n if (!metaDataRecord.paused)\n return false;\n var originalMs = Timeout.originalMs[key];\n var remainingTime = metaDataRecord.ms - metaDataRecord.timeSpentWaiting;\n var result = Timeout.set.apply(Timeout, __spreadArrays([key, metaDataRecord.callback, remainingTime], metaDataRecord.params));\n Timeout.originalMs[key] = originalMs;\n return result;\n };\n Timeout.instantiate = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var key;\n var ms;\n var params;\n var callback;\n if (args.length === 0) {\n throw Error('Timeout.set() requires at least one argument');\n }\n var linkToExisting = args.length === 1 && typeof args[0] !== 'function';\n // hooking up to an existing timeout\n if (linkToExisting) {\n key = args[0];\n var metadata = Timeout.meta(key);\n if (!metadata) {\n throw Error('Timeout.instantiate() attempted to link to nonexistent object by key');\n }\n ms = metadata.ms;\n params = metadata.params;\n callback = metadata.callback;\n }\n else if (typeof args[1] === 'function') {\n key = args[0], callback = args[1], ms = args[2], params = args.slice(3);\n }\n else {\n callback = args[0], ms = args[1], params = args.slice(2);\n key = (\"\" + Math.random() + callback).replace(/\\s/g, '');\n }\n if (!callback) {\n throw Error('Timeout.instantiate() requires a function parameter');\n }\n if (!linkToExisting) {\n Timeout.set.apply(Timeout, __spreadArrays([key, callback, ms], params));\n }\n return {\n call: function () { return Timeout.call(key); },\n clear: function (erase) {\n if (erase === void 0) { erase = true; }\n return Timeout.clear(key, erase);\n },\n elapsed: function () { return Timeout.elapsed(key); },\n executed: function () { return Timeout.executed(key); },\n exists: function () { return Timeout.exists(key); },\n lastExecuted: function () { return Timeout.lastExecuted(key); },\n meta: function () { return Timeout.meta(key); },\n pause: function () { return Timeout.pause(key); },\n paused: function () { return Timeout.paused(key); },\n pending: function () { return Timeout.pending(key); },\n remaining: function () { return Timeout.remaining(key); },\n reset: function (ms) {\n var params = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n params[_i - 1] = arguments[_i];\n }\n return Timeout.reset.apply(Timeout, __spreadArrays([key, ms], params));\n },\n restart: function () { return Timeout.restart(key); },\n resume: function () { return Timeout.resume(key); },\n set: function (newCallback, newMs) {\n if (newMs === void 0) { newMs = 0; }\n var newParams = [];\n for (var _i = 2; _i < arguments.length; _i++) {\n newParams[_i - 2] = arguments[_i];\n }\n return Timeout.set.apply(Timeout, __spreadArrays([key, newCallback, newMs], newParams));\n },\n };\n };\n Timeout.keyId = {};\n Timeout.keyCall = {};\n Timeout.originalMs = {};\n Timeout.metadata = {};\n return Timeout;\n}());\nexports.Timeout = Timeout;\n//# sourceMappingURL=timeout.js.map","import { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContent } from \"./flyout-content\";\r\nimport { MPCNotificationService } from \"./notification-service\";\r\nimport { MPCNavigationService } from \"../helpers/NavigationService\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nimport { ProductComparisonModel, Product } from \"../../../../DomainObjects/Dtos/Product.generated\";\r\nimport { MPCComparePageButtonUrlUpdater } from \"../helpers/comparePageButtonUrlUpdater\";\r\nimport { MPCLocalStorageService } from \"../local-storage-service\";\r\nimport { MPCScopeDetection } from \"../helpers/MpcScopeDetection\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\n\r\nconst ArrowUpIcon = require(\"../../images/arrow-up.svg\") as string;\r\nconst ArrowRightIcon = require(\"../../images/arrow-right-2021.svg\") as string;\r\n\r\nexport module MPCFlyoutContentController {\r\n import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\r\n import NotificationService = MPCNotificationService.NotificationService;\r\n import FlyoutContent = MPCFlyoutContent.FlyoutContent;\r\n import NavigationService = MPCNavigationService.NavigationService;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\r\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n import ScopeDetection = MPCScopeDetection.ScopeDetection;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export class FlyoutContentController implements IFlyoutContentController {\r\n private flyoutContentObject: FlyoutContent;\r\n private static _instance: FlyoutContentController;\r\n private flyoutContentContainer: HTMLElement;\r\n private readonly flyoutContentScope: HTMLElement;\r\n private notificationService: NotificationService;\r\n private navigationService: NavigationService;\r\n private flyoutHeader: HTMLElement;\r\n private deviceDetectionHelper: DeviceDetectionHelper;\r\n private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\r\n private productComparisonModelManager: ProductComparisonModelManager;\r\n private flyoutIconContainer: HTMLElement;\r\n private disabledFromFocus: boolean;\r\n \r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n \r\n constructor() {\r\n this.flyoutContentScope = document.querySelector('.pcf-flyout-content-scope');\r\n\r\n if (!this.flyoutContentScope) {\r\n return;\r\n }\r\n\r\n this.init();\r\n this.handleFicClick = this.handleFicClick.bind(this);\r\n }\r\n \r\n private init(): void {\r\n this.disabledFromFocus = true;\r\n this.flyoutIconContainer = document.querySelector('.pcf-scope');\r\n\r\n MpcSettings.instance.init(this.flyoutIconContainer);\r\n\r\n this.loadFlyoutIcons();\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n this.notificationService = NotificationService.instance;\r\n this.notificationService.flyoutContentController = this;\r\n\r\n if(!this.deviceDetectionHelper.isMobileShop()) {\r\n this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\r\n this.comparePageButtonUrlUpdater.init(this.flyoutContentScope);\r\n }\r\n\r\n // check local storage\r\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\r\n this.checkCurrentLocalStorage();\r\n \r\n this.flyoutContentContainer = this.flyoutContentScope.querySelector('.flyout');\r\n this.flyoutHeader = this.flyoutContentContainer.querySelector('.flyout-header');\r\n\r\n this.flyoutContentObject = new FlyoutContent();\r\n\r\n this.navigationService = NavigationService.instance;\r\n this.navigationService.init(this.flyoutHeader, 'data-pcf-navigation-key', this.flyoutContentObject);\r\n\r\n const closeFlyoutBtn = this.flyoutHeader.querySelector('.close-flyout-btn');\r\n\r\n this.flyoutContentObject.init(this.flyoutContentContainer, this.navigationService, this, closeFlyoutBtn);\r\n \r\n // close/show flyout events\r\n this.registerEventHandlers();\r\n }\r\n\r\n private loadFlyoutIcons(): void {\r\n const closeArrow: HTMLElement = this.flyoutContentScope.querySelector('.close-arrow');\r\n const compareButtonIcon: HTMLElement = this.flyoutContentScope.querySelector('.compare-button-icon');\r\n\r\n closeArrow.innerHTML = ArrowUpIcon;\r\n compareButtonIcon.innerHTML = ArrowRightIcon;\r\n }\r\n\r\n private registerEventHandlers(): void {\r\n // For tab navigation:\r\n this.flyoutIconContainer.addEventListener('click', () => { this.handleFicClick() });\r\n\r\n const titleContainer: HTMLElement = this.flyoutHeader.querySelector('.title-container');\r\n const titleCloseFlyoutBtn: HTMLElement = titleContainer.querySelector('.close-flyout-btn');\r\n titleCloseFlyoutBtn.addEventListener('click', () => { this.handleCloseClickFromFlyoutFragment() }); \r\n\r\n window.shell.subscribeTo('ESMKT.HeadR.FlyoutClosed', () => { this.cleanUpEmptyContent(); }, 'ESMKT.HeadR.FlyoutClosed');\r\n }\r\n\r\n private handleFicClick(): void {\r\n this.disabledFromFocus = !this.disabledFromFocus;\r\n this.flyoutContentScope.toggleAttribute('disabled', this.disabledFromFocus);\r\n this.flyoutContentScope.toggleAttribute('group', !this.disabledFromFocus);\r\n }\r\n\r\n public hideFlyoutContent(): void {\r\n this.flyoutContentContainer.classList.remove('pcf-show-flyout');\r\n }\r\n\r\n public handleFlyoutIconClick(): void {\r\n if (!this.flyoutContentContainer.classList.toggle('pcf-show-flyout')) {\r\n this.cleanUpEmptyContent();\r\n }\r\n }\r\n\r\n private handleCloseClickFromFlyoutFragment(): void {\r\n window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\r\n this.cleanUpEmptyContent();\r\n }\r\n\r\n public refresh(model: ProductComparisonModel): void {\r\n this.flyoutContentObject.refresh(model);\r\n if (model && model.activeNavigationTab) {\r\n const newTabActivated: boolean = this.flyoutContentObject.setActiveNavigationTab(model.activeNavigationTab);\r\n \r\n // in case when user click go to category page from empty tab with removed all products. \r\n // We will still have same active tab, because another one was not clicked yet.\r\n if(!newTabActivated) {\r\n this.flyoutContentObject.updateContainerListVisibility(this.navigationService.markAnyNavigationTabActive());\r\n }\r\n }\r\n }\r\n\r\n public addProduct(salesArticleVariantKey: string, seoSlug: string, origin: string): void {\r\n this.flyoutContentObject.addProduct(salesArticleVariantKey, seoSlug, origin).then((product: Product) => {\r\n this.flyoutContentObject.setActiveNavigationTab(product.categoryName);\r\n });\r\n\r\n // show Pcf Scope:\r\n if (!this.deviceDetectionHelper.isMobileShop()) {\r\n window.shell.publishTo('ManualProductComparison.ShowPcfScope', undefined);\r\n }\r\n }\r\n\r\n public addProductByCompareLink(maNo: number, colorCode: number): void {\r\n this.flyoutContentObject.addProductByMasterArticleNo(maNo, colorCode, \"content-page\").then((product: Product) => {\r\n this.flyoutContentObject.setActiveNavigationTab(product.categoryName);\r\n });\r\n\r\n // show Pcf Scope:\r\n if (!this.deviceDetectionHelper.isMobileShop()) {\r\n window.shell.publishTo('ManualProductComparison.ShowPcfScope', undefined);\r\n }\r\n }\r\n\r\n public removeProductTP(salesArticleVariantKey: string): void {\r\n this.flyoutContentObject.removeProductTP(salesArticleVariantKey);\r\n \r\n this.cleanUpEmptyContent();\r\n }\r\n\r\n public updateProductsCounter(counterNumber: number): void {\r\n const productsCounter: HTMLElement = this.flyoutIconContainer.querySelector('.products-counter');\r\n \r\n let counter: number = Number(productsCounter.innerText);\r\n counter += counterNumber;\r\n \r\n productsCounter.innerText = counter.toString();\r\n }\r\n\r\n private cleanUpEmptyContent(): void {\r\n this.disabledFromFocus = true;\r\n this.flyoutContentScope.toggleAttribute('disabled', this.disabledFromFocus);\r\n\r\n this.flyoutContentObject.removeEmptyContainerList();\r\n this.navigationService.removeEmptyNavigationTabs();\r\n\r\n if (this.isFlyoutContentEmpty()) {\r\n if (!this.deviceDetectionHelper.isMobileShop()) {\r\n window.shell.publishTo('ManualProductComparison.HidePcfScope', undefined);\r\n }\r\n }\r\n }\r\n\r\n private isFlyoutContentEmpty(): boolean {\r\n return this.flyoutContentObject.isFlyoutContentEmpty();\r\n }\r\n\r\n private announceNavigationTabCleanUpOutsidePcp(productComparisonModel: ProductComparisonModel): void {\r\n const emptyNavigationTabs = productComparisonModel.emptyNavigationTabs;\r\n\r\n if (emptyNavigationTabs.length && ScopeDetection.hasScopes(false, true))\r\n this.productComparisonModelManager.setClearStoredEmptyNavigationTabs(true);\r\n }\r\n\r\n private checkCurrentLocalStorage(): void {\r\n this.productComparisonModelManager.getModel()\r\n .then((productComparisonModel: ProductComparisonModel) => {\r\n if (productComparisonModel && productComparisonModel.products && productComparisonModel.products.length > 0) {\r\n // init and update flyout:\r\n this.refresh(productComparisonModel);\r\n }\r\n else {\r\n // clear existing flyout content\r\n this.refresh(null);\r\n }\r\n this.announceNavigationTabCleanUpOutsidePcp(productComparisonModel);\r\n });\r\n }\r\n\r\n public checkIsProductAlreadyAdded(salesArticleVariantKey: string): boolean {\r\n return this.productComparisonModelManager.checkIsProductAlreadyAdded(salesArticleVariantKey);\r\n }\r\n\r\n }\r\n}\r\n\r\nif (window.shell)\r\n MPCFlyoutContentController.FlyoutContentController.instance;","import { MPCLocalStorageService } from \"../local-storage-service\";\r\nimport {MPCAddElementContext} from \"../typings/addElementContext\";\r\nimport {MPCGetProductInfoByCompareLinkContext} from '../typings/GetProductInfoByCompareLinkContext';\r\nimport {NlVanillajax, INlVanillajaxParams} from \"../helpers/vanillajax\";\r\nimport {MPCINavigationService} from \"../typings/iNavigationService\";\r\nimport {MPCIAbstractContent} from \"../typings/iAbstractContent\";\r\nimport { MPCIFlyoutContentController} from \"../typings/iFlyoutContentController\";\r\nimport {MPCEventBus} from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { ProductComparisonModel, Product } from \"../../../../DomainObjects/Dtos/Product.generated\";\r\nconst RecycleBinIcon = require(\"../../images/icon_remove.svg\") as string;\r\nconst PlusIcon = require(\"../../images/plus-2021.svg\") as string;\r\nimport { MPCErrorHandlerModule } from \"../errorhandler\";\r\nimport { ErrorMessage } from \"../../../Models/ErrorMessage.generated\";\r\n\r\nexport module MPCFlyoutContent {\r\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n import AddElementContext = MPCAddElementContext.AddElementContext;\r\n import GetProductInfoByCompareLinkContext = MPCGetProductInfoByCompareLinkContext.GetProductInfoByCompareLinkContext;\r\n import INavigationService = MPCINavigationService.INavigationService;\r\n import IAbstractContent = MPCIAbstractContent.IAbstractContent;\r\n import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\r\n import EventBus = MPCEventBus.EventBus;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n import ErrorHandlerManager = MPCErrorHandlerModule.ErrorHandlerManager;\r\n\r\n export class FlyoutContent implements IAbstractContent {\r\n private productComparisonModelManager: ProductComparisonModelManager;\r\n private eventBus: EventBus;\r\n private listContainersArray: Array;\r\n private flyoutContent: HTMLElement;\r\n private navigationService: INavigationService;\r\n private oldListContainer: HTMLElement;\r\n private iFlyoutContentController: IFlyoutContentController;\r\n private emptyProductSlotTitle: string;\r\n private clearFlyoutCategoryBtnTitle: string;\r\n private activeCategoryTabName: string;\r\n private closeFlyoutBtn: Element;\r\n\r\n init(flyout: Element, navigationService: INavigationService, iFlyoutContentController: IFlyoutContentController, closeFlyoutBtn: Element): void {\r\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\r\n this.eventBus = MPCEventBus.EventBus.instance;\r\n this.flyoutContent = flyout.querySelector('.flyout-content');\r\n this.emptyProductSlotTitle = this.flyoutContent.getAttribute(\"data-EmptyProductSlotTitle\");\r\n this.clearFlyoutCategoryBtnTitle = this.flyoutContent.getAttribute(\"data-ClearFlyoutCategoryBtnTitle\");\r\n this.listContainersArray = new Array();\r\n this.navigationService = navigationService;\r\n this.iFlyoutContentController = iFlyoutContentController;\r\n this.closeFlyoutBtn = closeFlyoutBtn;\r\n }\r\n\r\n private clearCategoryProducts(listContainer: HTMLElement): void {\r\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\r\n const listItems: NodeListOf = itemsContainer.querySelectorAll('.list-item:not(.empty-list-item)');\r\n const listItemsArray: Array = Array.prototype.slice.call(listItems);\r\n \r\n for (const listItem of listItemsArray) {\r\n this.removeProduct(listContainer, listItem, true);\r\n }\r\n\r\n const categoryName: string = this.getListContainerCategoryName(listContainer);\r\n this.productComparisonModelManager.removeAllProductsOfCategory(categoryName);\r\n }\r\n\r\n public refresh(model: ProductComparisonModel): void {\r\n if(model && model.products && model.products.length) {\r\n for (const newProduct of model.products) {\r\n this.addProductToFlyoutContent(newProduct);\r\n }\r\n if (!model.activeNavigationTab) {\r\n this.navigationService.markActiveNavigationTab(model.products[0].categoryName);\r\n }\r\n }\r\n else {\r\n if(this.listContainersArray) {\r\n for (const listContainer of this.listContainersArray) {\r\n this.clearCategoryProducts(listContainer);\r\n }\r\n }\r\n }\r\n }\r\n \r\n public addProduct(savKey: string, seoSlug: string, origin: string): Promise {\r\n const context: AddElementContext = new class implements AddElementContext {\r\n salesArticleVariantKey: string;\r\n originSeoSlug: string;\r\n origin: string;\r\n };\r\n context.salesArticleVariantKey = savKey;\r\n context.originSeoSlug = seoSlug;\r\n context.origin = origin;\r\n\r\n // Call controller method, via ajax, and get image and text info from MPC\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfo\";\r\n params.data = JSON.stringify(context);\r\n\r\n let nlVanillajax = new NlVanillajax(params);\r\n let postWithPromise = nlVanillajax.postWithPromise();\r\n postWithPromise.then((productDataFromService: Product) => {\r\n this.handleProductInfoToAdd(productDataFromService);\r\n return productDataFromService;\r\n })\r\n .catch((err) => {\r\n //TODO user notification\r\n //console.error('could not retrieve product info', err.statusText);\r\n });\r\n return postWithPromise;\r\n }\r\n \r\n public addProductByMasterArticleNo(maNo: number, colorCode: number, origin: string): Promise {\r\n const context = {} as GetProductInfoByCompareLinkContext;\r\n context.masterArticleNo = maNo;\r\n context.colorCode = colorCode;\r\n context.origin = origin;\r\n\r\n // Call controller method, via ajax, and get image and text info from MPC\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfoByCompareLink\";\r\n params.data = JSON.stringify(context);\r\n\r\n return new NlVanillajax(params).postWithPromise()\r\n .then((productDataFromService: Product) => {\r\n this.handleProductInfoToAdd(productDataFromService);\r\n return productDataFromService;\r\n })\r\n .catch((err) => {\r\n ErrorHandlerManager.instance.LogError({\r\n message: \"error getting product info because: \" +\r\n err +\r\n \", masterArticleNo: \" +\r\n maNo\r\n }); \r\n });\r\n }\r\n\r\n private handleProductInfoToAdd(productDataFromService: Product) {\r\n // Handle the response and add article or show notification for customer\r\n let productAdded: MPCLocalStorageService.AddResult;\r\n\r\n if (productDataFromService) {\r\n productAdded = this.productComparisonModelManager.addProduct(productDataFromService);\r\n if (productAdded === MPCLocalStorageService.AddResult.Added) {\r\n this.addProductToFlyoutContent(productDataFromService);\r\n\r\n // notify touch points that products are added\r\n this.eventBus.publish(\"flyout.product-added\", productDataFromService.articleId.salesArticleVariantKey);\r\n } else if (productAdded === MPCLocalStorageService.AddResult.Replaced) {\r\n this.changeProductVariantInFlyoutContent(productDataFromService);\r\n this.eventBus.publish(\"flyout.product-replaced\", productDataFromService.articleId.salesArticleVariantKey);\r\n }\r\n if (productAdded !== MPCLocalStorageService.AddResult.RejectedCapacity) {\r\n this.setActiveNavigationTab(productDataFromService.categoryName);\r\n }\r\n }\r\n }\r\n\r\n private removeProduct(listContainer: HTMLElement, listItem: HTMLElement, onlyDom: boolean = false): void {\r\n // current element will be removed from DOM, so we need to move to next one:\r\n if (window.shell.tabNav !== undefined)\r\n window.shell.tabNav.focusNext();\r\n\r\n const categoryName: string = this.getListContainerCategoryName(listContainer);\r\n const savKey: string = listItem.getAttribute('data-pcf-sav-key');\r\n const categoryUrl: string = listContainer.getAttribute('data-pcf-categoryUrl');\r\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\r\n\r\n let productRemoved: boolean = true;\r\n if (!onlyDom) {\r\n // call remove method on service:\r\n productRemoved = this.productComparisonModelManager.removeProduct(categoryName, savKey) != null;\r\n }\r\n\r\n if (productRemoved) {\r\n // store order number before item will be removed from list:\r\n const tabOrder = listItem.getAttribute('order');\r\n\r\n // remove product from flyout:\r\n itemsContainer.removeChild(listItem);\r\n itemsContainer.appendChild(this.createEmptyListItem(categoryUrl, tabOrder));\r\n\r\n // update flyout header\r\n this.navigationService.createOrUpdateNavigationTab(categoryName, -1, null, null);\r\n this.iFlyoutContentController.updateProductsCounter(-1);\r\n\r\n // notify touch points and flyout footer\r\n this.eventBus.publish(\"flyout.product-removed\", savKey);\r\n }\r\n }\r\n\r\n private changeProductVariantInFlyoutContent(newProduct: Product): void {\r\n let categoryName: string;\r\n for (const listContainer of this.listContainersArray) {\r\n categoryName = this.getListContainerCategoryName(listContainer);\r\n\r\n if (categoryName == newProduct.categoryName) {\r\n for (const item of this.getContainerListItems(listContainer)) {\r\n if (item.getAttribute(\"data-pcf-masterArticleNo\") === newProduct.articleId.masterArticleNo.toString()) {\r\n item.setAttribute('data-pcf-sav-key', newProduct.articleId.salesArticleVariantKey);\r\n item.setAttribute('href', newProduct.detailsPageUrl);\r\n item.querySelector('.image-slot').setAttribute('src', newProduct.mainImage);\r\n item.querySelector('.image-slot').setAttribute('alt', newProduct.altTag);\r\n }\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private addProductToFlyoutContent(newProduct: Product): void {\r\n let currentListContainer: HTMLElement;\r\n let listContainerNotExists: boolean = true;\r\n let categoryName: string;\r\n\r\n // look for \"list-container\" with same categoryName or create new one\r\n for (const listContainer of this.listContainersArray) {\r\n categoryName = this.getListContainerCategoryName(listContainer);\r\n \r\n if(categoryName === newProduct.categoryName)\r\n {\r\n this.createListItem(listContainer, newProduct);\r\n currentListContainer = listContainer;\r\n listContainerNotExists = false;\r\n break;\r\n }\r\n else {\r\n listContainerNotExists = true;\r\n }\r\n }\r\n\r\n if (listContainerNotExists) {\r\n let newListContainer: HTMLElement = this.createListContainer(newProduct);\r\n this.createListItem(newListContainer, newProduct);\r\n this.listContainersArray.push(newListContainer);\r\n this.flyoutContent.appendChild(newListContainer);\r\n currentListContainer = newListContainer;\r\n }\r\n \r\n // hide old list container:\r\n if (this.oldListContainer) {\r\n this.oldListContainer.style.display = 'none';\r\n }\r\n\r\n currentListContainer.style.display = 'flex';\r\n this.oldListContainer = currentListContainer;\r\n\r\n // update navigation tab:\r\n this.navigationService.createOrUpdateNavigationTab(newProduct.categoryName, 1, newProduct.navigationOrder, newProduct.articleId.salesArticleVariantKey);\r\n this.iFlyoutContentController.updateProductsCounter(1);\r\n }\r\n \r\n private createListContainer(newProduct: Product): HTMLElement {\r\n const newListContainer: HTMLElement = document.createElement('div');\r\n const newClearListBtn: HTMLElement = document.createElement('div');\r\n const newItemsContainer: HTMLElement = document.createElement('div');\r\n const btnId = 'cl_' + newProduct.categoryName;\r\n\r\n newItemsContainer.className = 'items-container';\r\n \r\n newClearListBtn.className = 'clear-list-btn';\r\n newClearListBtn.setAttribute('focusable', '');\r\n newClearListBtn.setAttribute('order', '0');\r\n\r\n newClearListBtn.innerHTML = this.clearFlyoutCategoryBtnTitle;\r\n newClearListBtn.id = btnId;\r\n newListContainer.className = 'list-container';\r\n newListContainer.setAttribute('data-pcf-categoryName', newProduct.categoryName);\r\n newListContainer.setAttribute('data-pcf-categoryUrl', newProduct.categoryUrl);\r\n newListContainer.setAttribute('group', '');\r\n\r\n newListContainer.appendChild(newClearListBtn);\r\n\r\n // create empty list items:\r\n for (let i: number = 0; i < MpcSettings.instance.maxProducts; i++) {\r\n newItemsContainer.appendChild(\r\n this.createEmptyListItem(newProduct.categoryUrl, i.toString()));\r\n }\r\n\r\n newClearListBtn.addEventListener('click', () => { this.clearCategoryProducts(newListContainer) });\r\n newListContainer.appendChild(newItemsContainer);\r\n\r\n if (window.shell.tabNav !== undefined)\r\n window.shell.tabNav.onActivated('#' + btnId, \r\n () => { window.shell.tabNav.focus(this.closeFlyoutBtn); });\r\n \r\n return newListContainer;\r\n }\r\n \r\n private createEmptyListItem(categoryUrl: string, index: string): HTMLElement {\r\n const newListItem: HTMLElement = document.createElement('a');\r\n const newProductImageHolder = document.createElement('div');\r\n const newRemoveProductButton = document.createElement('div');\r\n const newProductDescription = document.createElement('div');\r\n const plusIcon: HTMLElement = document.createElement('div');\r\n\r\n plusIcon.setAttribute('class', 'mpc-plus');\r\n plusIcon.innerHTML = PlusIcon;\r\n\r\n newProductDescription.innerHTML = this.emptyProductSlotTitle;\r\n newProductDescription.className = 'description-slot';\r\n newRemoveProductButton.className = 'remove-item-container';\r\n newProductImageHolder.className = 'image-holder';\r\n newListItem.setAttribute(\"href\", categoryUrl);\r\n newListItem.className = 'list-item empty-list-item';\r\n newListItem.setAttribute('focusable', '');\r\n\r\n newProductImageHolder.appendChild(plusIcon);\r\n newListItem.appendChild(newProductImageHolder);\r\n newListItem.appendChild(newRemoveProductButton);\r\n newListItem.appendChild(newProductDescription);\r\n \r\n return newListItem;\r\n }\r\n \r\n private createListItem(listContainer: HTMLElement, newProduct: Product): void {\r\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\r\n const newListItem: HTMLElement = document.createElement('a');\r\n const newProductImageHolder = document.createElement('div');\r\n const newProductImageSlot = document.createElement('img');\r\n const newRemoveProductButton: HTMLElement = document.createElement('div');\r\n const newProductDescription = document.createElement('div');\r\n const itemOriginDetailsPageUrl: string = newProduct.detailsPageUrl.indexOf('?') !== -1 ?\r\n newProduct.detailsPageUrl + '&itemorigin=productcomparison_flyout' :\r\n newProduct.detailsPageUrl + '?itemorigin=productcomparison_flyout';\r\n\r\n newProductDescription.innerHTML = newProduct.title;\r\n newProductDescription.className = 'description-slot';\r\n\r\n newRemoveProductButton.setAttribute('class', 'mpc-recycle');\r\n newRemoveProductButton.setAttribute('focusable', '');\r\n newRemoveProductButton.setAttribute('order', '0');\r\n newRemoveProductButton.addEventListener('click', (event: MouseEvent) => {\r\n this.removeProduct(listContainer, newListItem, false);\r\n event.stopPropagation();\r\n event.preventDefault();\r\n });\r\n newRemoveProductButton.innerHTML = RecycleBinIcon;\r\n \r\n newProductImageSlot.className = 'image-slot';\r\n newProductImageSlot.setAttribute('src', newProduct.mainImage);\r\n newProductImageSlot.setAttribute('alt', newProduct.altTag);\r\n \r\n newProductImageHolder.className = 'image-holder';\r\n newProductImageHolder.setAttribute('focusable', '');\r\n newProductImageHolder.setAttribute('order', '1');\r\n \r\n newListItem.setAttribute(\"href\", itemOriginDetailsPageUrl);\r\n\r\n newListItem.setAttribute(\"data-pcf-masterArticleNo\", newProduct.articleId.masterArticleNo.toString());\r\n newListItem.className = 'list-item';\r\n newListItem.setAttribute('data-pcf-sav-key', newProduct.articleId.salesArticleVariantKey);\r\n newListItem.setAttribute('group', '');\r\n\r\n newProductImageHolder.appendChild(newProductImageSlot);\r\n newListItem.appendChild(newProductImageHolder);\r\n newListItem.appendChild(newRemoveProductButton);\r\n newListItem.appendChild(newProductDescription);\r\n \r\n // remove empty list item:\r\n const emptyListItem: HTMLElement = itemsContainer.querySelector('.empty-list-item');\r\n\r\n if (!emptyListItem)\r\n return;\r\n\r\n let nextEmpty = emptyListItem.nextElementSibling;\r\n itemsContainer.removeChild(emptyListItem);\r\n\r\n // add new list item\r\n if (nextEmpty) {\r\n itemsContainer.insertBefore(newListItem, nextEmpty);\r\n } else {\r\n itemsContainer.appendChild(newListItem);\r\n }\r\n }\r\n \r\n private getListContainerCategoryName(listContainer: HTMLElement): string {\r\n return listContainer.getAttribute('data-pcf-categoryName');\r\n }\r\n \r\n public removeEmptyContainerList(): void {\r\n // remove all empty list containers\r\n if (!this.listContainersArray || this.listContainersArray.length <= 0)\r\n return;\r\n\r\n let removableContainers: Array = new Array();\r\n let selectFirstTab: boolean = false;\r\n\r\n for (const listContainer of this.listContainersArray) {\r\n const itemsContainer: HTMLElement = listContainer.querySelector('.items-container');\r\n const listItems: NodeListOf = itemsContainer.querySelectorAll('.empty-list-item');\r\n\r\n if (listItems.length == MpcSettings.instance.maxProducts) {\r\n removableContainers.push(listContainer);\r\n }\r\n }\r\n\r\n for (const tmpContainer of removableContainers) {\r\n this.flyoutContent.removeChild(tmpContainer);\r\n this.listContainersArray.splice(this.listContainersArray.indexOf(tmpContainer), 1);\r\n\r\n // check does the active navigation tab will be removed like empty one:\r\n const emptyTabCatName: string = this.getListContainerCategoryName(tmpContainer);\r\n\r\n if (emptyTabCatName == this.activeCategoryTabName)\r\n selectFirstTab = true;\r\n }\r\n \r\n if (this.listContainersArray.length > 0) {\r\n if (selectFirstTab) {\r\n const selectedCategoryName: string = this.getListContainerCategoryName(this.listContainersArray[0]);\r\n this.setActiveNavigationTab(selectedCategoryName);\r\n }\r\n else {\r\n this.setActiveNavigationTab(this.activeCategoryTabName);\r\n }\r\n }\r\n }\r\n\r\n public updateContainerListVisibility(activeCategoryTabName: string): void {\r\n for (const listContainer of this.listContainersArray) {\r\n const tmpContainerCategoryName: string = this.getListContainerCategoryName(listContainer);\r\n \r\n if (tmpContainerCategoryName === activeCategoryTabName) {\r\n listContainer.style.display = 'flex';\r\n this.oldListContainer = listContainer;\r\n } else {\r\n listContainer.style.display = 'none';\r\n }\r\n }\r\n\r\n // write it to the localStorage:\r\n this.activeCategoryTabName = activeCategoryTabName;\r\n this.productComparisonModelManager.setActiveNavigationTab(activeCategoryTabName);\r\n }\r\n\r\n public isFlyoutContentEmpty(): boolean {\r\n return this.listContainersArray == null \r\n || this.listContainersArray == undefined \r\n || this.listContainersArray.length == 0;\r\n }\r\n\r\n private getContainerListItems(listContainer: HTMLElement): Array {\r\n const listItems: NodeListOf = listContainer.querySelector('.items-container')\r\n .querySelectorAll('.list-item');\r\n return Array.prototype.slice.call(listItems);\r\n }\r\n\r\n public removeProductTP(salesArticleVariantKey: string): void {\r\n for (const listContainer of this.listContainersArray) {\r\n const listItemsArray: Array = this.getContainerListItems(listContainer);\r\n\r\n for (const listItem of listItemsArray) {\r\n const savKey: string = listItem.getAttribute('data-pcf-sav-key');\r\n\r\n if (savKey === salesArticleVariantKey) {\r\n this.removeProduct(listContainer, listItem, false);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n setActiveNavigationTab(activeNavigationTab: string): boolean {\r\n const newTabActivated: boolean = this.navigationService.markActiveNavigationTab(activeNavigationTab);\r\n \r\n if(newTabActivated)\r\n this.updateContainerListVisibility(activeNavigationTab);\r\n\r\n return newTabActivated;\r\n }\r\n }\r\n}","import { MPCLocalStorageService } from \"../local-storage-service\";\r\nimport { MPCIFlyoutController } from \"../typings/iFlyoutController\";\r\nimport { MPCStickyFlyOutNotificationService } from \"./stickyFlyOutNotificationService\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nimport { MPCComparePageButtonUrlUpdater } from \"../helpers/comparePageButtonUrlUpdater\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ArrowRightIcon = require(\"../../images/arrow-right.svg\") as string;\r\n\r\nexport module MPCFlyoutController {\r\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n import IFlyoutController = MPCIFlyoutController.IFlyoutController;\r\n import StickyFlyOutNotificationService = MPCStickyFlyOutNotificationService.StickyFlyOutNotificationService;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\r\n\r\n export class FlyoutController implements IFlyoutController {\r\n private static _instance: FlyoutController;\r\n private readonly scope: HTMLElement;\r\n private productComparisonModelManager: ProductComparisonModelManager;\r\n private pcfScopeRendered: boolean;\r\n private stickyFlyOutNotificationService: StickyFlyOutNotificationService;\r\n private deviceDetectionHelper: DeviceDetectionHelper;\r\n private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n \r\n public constructor() {\r\n this.scope = document.querySelector('.pcf-scope');\r\n\r\n if(!this.scope){\r\n return;\r\n }\r\n\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.pcfScopeRendered = false;\r\n MpcSettings.instance.init(this.scope);\r\n\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n\r\n if(this.deviceDetectionHelper.isMobileShop()) {\r\n this.prepareMobile();\r\n }\r\n\r\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\r\n\r\n this.stickyFlyOutNotificationService = new StickyFlyOutNotificationService();\r\n this.stickyFlyOutNotificationService.init(this.scope);\r\n this.getCurrentProductsAmount();\r\n this.loadFlyoutIcons();\r\n\r\n this.registerEventHandlers();\r\n }\r\n\r\n private prepareMobile(): void {\r\n document.body.appendChild(this.scope);\r\n\r\n this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\r\n this.comparePageButtonUrlUpdater.init(this.scope);\r\n }\r\n\r\n private registerEventHandlers(): void {\r\n window.shell.subscribeTo(\"ManualProductComparison.ShowPcfScope\", () => {\r\n this.showPcfScope();\r\n }, \"ManualProductComparison.ShowPcfScope\");\r\n\r\n window.shell.subscribeTo(\"ManualProductComparison.HidePcfScope\", () => {\r\n this.hidePcfScope();\r\n }, \"ManualProductComparison.HidePcfScope\");\r\n\r\n const flyoutIconContainer: HTMLElement = this.scope.querySelector('.flyout-icon-container');\r\n flyoutIconContainer.addEventListener('click', () => { this.handleFlyoutIconClick(); });\r\n }\r\n\r\n private handleFlyoutIconClick(): void {\r\n window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\r\n }\r\n\r\n private loadFlyoutIcons(): void {\r\n // ie11 fix, works on other browsers too, but ie11 is special :( \r\n const flyoutIconContainer: HTMLElement = this.scope.querySelector('.flyout-icon-container');\r\n\r\n const scaleIcon: HTMLElement = document.createElement(\"div\");\r\n\r\n if(flyoutIconContainer.classList.contains('mkt-headr-icon-wrapper')) {\r\n // mkt-headr-icon all styles comes from header:\r\n scaleIcon.className = \"mkt-headr-icon mpc-scale\";\r\n }\r\n else {\r\n scaleIcon.className = \"flyout-icon mpc-scale\";\r\n }\r\n\r\n scaleIcon.innerHTML = ScaleIcon2021;\r\n flyoutIconContainer.appendChild(scaleIcon);\r\n\r\n const productsCounter: HTMLElement = document.createElement(\"div\");\r\n productsCounter.className = \"products-counter\";\r\n flyoutIconContainer.appendChild(productsCounter);\r\n // ---------------------------------------------------------------\r\n\r\n const compareButtonIcons: NodeListOf = this.scope.querySelectorAll('.compare-button-icon');\r\n const compareButtonIconsArray: Array = Array.prototype.slice.call(compareButtonIcons);\r\n\r\n for (const compareButtonIcon of compareButtonIconsArray) {\r\n compareButtonIcon.innerHTML = ArrowRightIcon;\r\n }\r\n }\r\n\r\n private getCurrentProductsAmount(): void {\r\n this.productComparisonModelManager.getModel().then(model => {\r\n if (model.products.length > 0) {\r\n\r\n // show Pcf Scope:\r\n if (!this.deviceDetectionHelper.isMobileShop()) {\r\n this.showPcfScope(true);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private showPcfScope(renderWithoutAnimation: boolean = false): void {\r\n // check for existing pcf scope:\r\n if (!this.pcfScopeRendered) {\r\n this.scope.style.display = 'block';\r\n this.scope.classList.add('pcf-scope-position');\r\n\r\n if (renderWithoutAnimation)\r\n this.scope.classList.add('pcf-no-animation');\r\n \r\n this.scope.classList.add('show-pcf-scope');\r\n this.pcfScopeRendered = true;\r\n }\r\n }\r\n\r\n hidePcfScope(): void {\r\n this.scope.classList.remove('pcf-no-animation');\r\n this.scope.classList.remove('show-pcf-scope');\r\n setTimeout(()=>{ this.scope.classList.remove('pcf-scope-position'); }, 400);\r\n setTimeout(()=>{ this.scope.style.display = 'none'; }, 400);\r\n this.pcfScopeRendered = false;\r\n }\r\n }\r\n}\r\n\r\nif(window.shell)\r\n MPCFlyoutController.FlyoutController.instance;","import { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nimport { MPCScrollLock } from \"../helpers/scrollLock\";\r\nconst SmartTimeout = require(\"smart-timeout\");\r\nconst ArrowRightIcon = require(\"../../images/arrow-right.svg\") as string;\r\n\r\nexport module MPCNotificationService {\r\n import IFlyoutContentController = MPCIFlyoutContentController.IFlyoutContentController;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n import ScrollLock = MPCScrollLock.ScrollLock;\r\n\r\n export class NotificationService {\r\n private readonly scope: HTMLElement;\r\n public flyoutContentController: IFlyoutContentController;\r\n private static _instance: NotificationService;\r\n private existingNotificationTimeout: any;\r\n private deviceDetectionHelper : DeviceDetectionHelper;\r\n private flyoutContainer: HTMLElement;\r\n private scrollLock: ScrollLock;\r\n\r\n private maxProductsCountNotification: HTMLElement;\r\n private newProductNotification: HTMLElement;\r\n private emptyListNotification: HTMLElement;\r\n private flyoutIconContainer: HTMLElement;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n this.scope = document.querySelector('.pcf-scope');\r\n\r\n if(this.scope)\r\n {\r\n this.init();\r\n }\r\n }\r\n \r\n private init(): void {\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n this.scrollLock = ScrollLock.instance;\r\n this.flyoutContainer = this.scope.querySelector('.flyout-container');\r\n const notifications = this.flyoutContainer.querySelectorAll(\".notification\");\r\n\r\n for (let notification of notifications) {\r\n const closeBtns = notification.querySelectorAll('.close-flyout-btn'); //multiple because there is the x for Web and the footer button for Mobile\r\n const openFlyoutBtns = notification.querySelectorAll('.open-flyout-button');//multiple because \"new-product' has two (Web has a compact layout without footer)\r\n const navigationBtn = notification.querySelector('.navigate-to-products-button');\r\n\r\n for (let comparisonListButton of openFlyoutBtns) {\r\n const iconSlot: HTMLElement = comparisonListButton.querySelector('.open-flyout-button-icon');\r\n iconSlot.innerHTML = ArrowRightIcon;\r\n comparisonListButton.addEventListener('click', ()=> { this.goToFlyoutComparisonList(notification); });\r\n }\r\n\r\n for (let closeBtn of closeBtns) {\r\n closeBtn.addEventListener('click', () => { this.closeNotification(notification); });\r\n }\r\n\r\n if (navigationBtn != null) {\r\n const iconSlot: HTMLElement = navigationBtn.querySelector('.navigate-products-button-icon');\r\n iconSlot.innerHTML = ArrowRightIcon;\r\n }\r\n }\r\n \r\n this.maxProductsCountNotification = this.scope.querySelector('.max-products-count-notification');\r\n this.newProductNotification = this.scope.querySelector('.new-product-notification');\r\n this.emptyListNotification = this.scope.querySelector('.empty-list-notification');\r\n this.flyoutIconContainer = this.scope.querySelector('.flyout-icon-container');\r\n\r\n // close any active notification flyout if any other flyout is opening from headR:\r\n // we need it because notification flyouts are not fragments and headR is not responsible for them\r\n window.shell.subscribeTo('ESMKT.HeadR.FlyoutOpening', () => { this.closeAnyActiveNotification(); }, 'ESMKT.HeadR.FlyoutOpening');\r\n }\r\n\r\n notifyNewProductAdded(title: string, mainImage: string, altTag: string): void {\r\n this.showNotification(this.newProductNotification, () => {\r\n this.replaceNotificationContent(title, mainImage, altTag);\r\n });\r\n }\r\n \r\n notifyMaximumProductsCountReached(): void {\r\n this.showNotification(this.maxProductsCountNotification, null);\r\n }\r\n\r\n notifyEmptyList(): void {\r\n this.initializeNavigationButtonOnEmptyNotificationOnce(); //Workaround because this class exists twice (PCF & PCP)\r\n this.showNotification(this.emptyListNotification, null);\r\n }\r\n\r\n closeAnyActiveNotification(): void {\r\n if (this.maxProductsCountNotification.classList.contains('show-notification'))\r\n this.closeNotification(this.maxProductsCountNotification);\r\n\r\n if (this.newProductNotification.classList.contains('show-notification'))\r\n this.closeNotification(this.newProductNotification);\r\n \r\n if (this.emptyListNotification.classList.contains('show-notification'))\r\n this.closeNotification(this.emptyListNotification);\r\n }\r\n\r\n private initializeNavigationButtonOnEmptyNotificationOnce(): void {\r\n const navigationBtn = this.emptyListNotification.querySelector('.navigate-to-products-button');\r\n\r\n const eventFunction: EventListener = () => {\r\n this.showMobileHeaderMenu();\r\n this.closeNotification(this.emptyListNotification);\r\n navigationBtn.removeEventListener('click', eventFunction);\r\n }\r\n\r\n if (navigationBtn != null && window.headrapi)\r\n navigationBtn.addEventListener('click', eventFunction);\r\n }\r\n\r\n private showMobileHeaderMenu(): void {\r\n if (window.headrapi)\r\n window.headrapi.toggleMenu();\r\n }\r\n\r\n private replaceNotificationContent(title: string, mainImage: string, altTag: string): void {\r\n const productInfoContainer: HTMLElement\r\n = this.newProductNotification.querySelector('.product-info-container');\r\n\r\n productInfoContainer.querySelector('.description-container')\r\n .querySelector('.title').innerHTML = title;\r\n productInfoContainer.querySelector('.image-slot').setAttribute('src', mainImage);\r\n productInfoContainer.querySelector('.image-slot').setAttribute('alt', altTag);\r\n }\r\n\r\n private goToFlyoutComparisonList(notification: HTMLElement): void {\r\n this.closeNotification(notification);\r\n\r\n window.shell.publishTo('ESMKT.HeadR.ToggleFlyout', 'ManualProductComparison');\r\n }\r\n\r\n private closeExistingNotification(): void {\r\n const existingNotification: HTMLElement = this.flyoutContainer.querySelector('.show-notification');\r\n\r\n if (existingNotification) {\r\n SmartTimeout.clear(this.closeExistingNotification);\r\n existingNotification.classList.remove('show-notification');\r\n this.renderFlyoutContainerOverlay(false);\r\n }\r\n }\r\n\r\n private closeNotification(notification: HTMLElement): void {\r\n SmartTimeout.clear(this.closeExistingNotification);\r\n notification.classList.remove('show-notification');\r\n this.flyoutIconContainer.classList.remove('notification_background');\r\n this.renderFlyoutContainerOverlay(false);\r\n }\r\n\r\n private showNotification(notification: HTMLElement, updateNotificationContent?: () => void): void {\r\n this.triggerAppShellPublish();\r\n\r\n // on category page, you can click many compare buttons fast, so check for older notification\r\n let deferNotification = false;\r\n if (this.existingNotificationTimeout ||\r\n notification.classList.contains('show-notification')) {\r\n this.closeExistingNotification();\r\n deferNotification = true;\r\n } \r\n\r\n let showInner = () => {\r\n if (this.flyoutContentController)\r\n this.flyoutContentController.hideFlyoutContent();\r\n\r\n if (updateNotificationContent)\r\n updateNotificationContent();\r\n\r\n this.renderFlyoutContainerOverlay(true);\r\n\r\n notification.classList.add('show-notification');\r\n this.flyoutIconContainer.classList.add('notification_background');\r\n\r\n if (!this.deviceDetectionHelper.isMobileShop()) {\r\n // close new product notification after 4500 ms\r\n this.existingNotificationTimeout =\r\n SmartTimeout.set(() => { this.closeNotification(notification) }, 4500);\r\n }\r\n };\r\n\r\n if(deferNotification)\r\n SmartTimeout.set(showInner, 500);\r\n else \r\n showInner();\r\n }\r\n\r\n private triggerAppShellPublish(): void {\r\n // close modal dialogs in legacy WF\r\n if (window.shell) {\r\n window.shell.publishTo('mpc.close-modal', '');\r\n window.shell.publishTo('ESPP.OrderModal.Close', '');\r\n }\r\n }\r\n\r\n private renderFlyoutContainerOverlay(renderOverlay: boolean): void {\r\n if(this.deviceDetectionHelper.isMobileShop()) {\r\n if(renderOverlay) {\r\n this.scope.classList.add('render-overlay');\r\n this.scope.ontouchmove = (event: TouchEvent) => { event.preventDefault(); }; // iOS ScrollLock\r\n this.scrollLock.lock();\r\n }\r\n else {\r\n if(this.scope.classList.contains('render-overlay')) {\r\n this.scope.classList.remove('render-overlay');\r\n this.scope.ontouchmove = () => { };\r\n this.scrollLock.unlock();\r\n }\r\n }\r\n }\r\n }\r\n\r\n }\r\n}","import { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\n\r\nexport module MPCStickyFlyOutNotificationService {\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n \r\n export class StickyFlyOutNotificationService {\r\n private scope: HTMLElement;\r\n private deviceDetectionHelper : DeviceDetectionHelper;\r\n private maxProductsCountNotification: HTMLElement;\r\n private flyoutNewProductNotification: HTMLElement;\r\n private flyout: HTMLElement;\r\n private tabletHeaderHeightCalculated: number;\r\n\r\n public constructor() {\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n }\r\n\r\n public init(scope: HTMLElement): void {\r\n this.scope = scope;\r\n this.tabletHeaderHeightCalculated = 38;\r\n const flyoutContainer: HTMLElement = this.scope.querySelector('.flyout-container');\r\n\r\n if (flyoutContainer && this.deviceDetectionHelper.isTabletHandHeldDevice()) {\r\n this.maxProductsCountNotification = flyoutContainer.querySelector('.max-products-count-notification');\r\n this.flyoutNewProductNotification = flyoutContainer.querySelector('.new-product-notification');\r\n this.maxProductsCountNotification.classList.add('sticky-flyout-notification');\r\n this.flyoutNewProductNotification.classList.add('sticky-flyout-notification');\r\n\r\n // todo: remove with ESPP-2482\r\n /* if(!mktHeaderOnline) {\r\n this.flyout = flyoutContainer.querySelector('.flyout');\r\n this.flyout.classList.add('sticky-flyout');\r\n\r\n window.addEventListener('scroll', () => { this.handleFlyOutNotificationOnScroll() });\r\n window.addEventListener('scroll', () => { this.handleFlyOutOnScroll() });\r\n\r\n this.handleFlyOutOnScroll();\r\n } */\r\n\r\n this.handleFlyOutNotificationOnScroll();\r\n \r\n }\r\n }\r\n\r\n private handleFlyOutNotificationOnScroll(): void {\r\n if(this.tabletHeaderHeightCalculated >= window.pageYOffset) {\r\n this.maxProductsCountNotification.classList.remove(\"fixed\");\r\n this.flyoutNewProductNotification.classList.remove(\"fixed\");\r\n }\r\n else {\r\n this.maxProductsCountNotification.classList.add(\"fixed\");\r\n this.flyoutNewProductNotification.classList.add(\"fixed\");\r\n }\r\n }\r\n\r\n private handleFlyOutOnScroll(): void {\r\n if(this.tabletHeaderHeightCalculated >= window.pageYOffset) {\r\n this.flyout.classList.remove(\"fixed\");\r\n }\r\n else {\r\n this.flyout.classList.add(\"fixed\");\r\n }\r\n }\r\n }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType, HtmlResult } from \"../helpers/vanillajax\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { IResponseData } from \"../typings/VariantSelection\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nconst ScaleIcon = require(\"../../images/scale-2021.svg\") as string;\r\n\r\nexport module MPCCompareButton {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import TouchPointContext = MPCITouchPoint.TouchPointContext;\r\n\r\n export class CompareButton implements ITouchPoint {\r\n private markerElement: HTMLElement;\r\n private parentContainer: HTMLElement;\r\n private touchPointElement: HTMLElement;\r\n private slug: string;\r\n private origin: string;\r\n private salesArticleVariantKey: string;\r\n private displayedInCategoryNavKey: string;\r\n private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController; \r\n\r\n constructor(marker: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string,\r\n parentContainer: HTMLElement) {\r\n this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n this.parentContainer = parentContainer;\r\n this.markerElement = marker;\r\n this.salesArticleVariantKey = salesArticleVariantKey;\r\n this.slug = slug;\r\n this.origin = origin;\r\n this.displayedInCategoryNavKey = displayedInCategoryNavKey;\r\n \r\n // only for new details page:\r\n if(this.parentContainer)\r\n this.initializeNew();\r\n else\r\n this.getTouchPoint();\r\n\r\n // Subscribe to new details page and update necessary changed variant info:\r\n if (typeof window !== 'undefined' && window.shell) {\r\n window.shell.subscribeTo(\r\n 'ESPP.DetailPage.PageUpdate',\r\n (response: IResponseData) => {\r\n this.updateSaveKeyFromOutsideTheScope(\r\n response.orderModule.articleInfo.salesArticleVariantKey);\r\n },\r\n 'ESCID.ESPP.ManualProductComparison');\r\n }\r\n\r\n if (typeof window !== 'undefined' && window.shell) {\r\n window.shell.subscribeTo(\r\n 'ESPP.OrderModal.Update',\r\n ({ response }: { response: IResponseData } ) => {\r\n this.updateSaveKeyFromOutsideTheScope(\r\n response.orderModule.articleInfo.salesArticleVariantKey);\r\n },\r\n 'ESCID.ESPP.ManualProductComparison');\r\n }\r\n }\r\n\r\n private updateSaveKeyFromOutsideTheScope(savKey: string): void {\r\n this.salesArticleVariantKey = savKey;\r\n }\r\n\r\n update(oldSavKey: string, newSavKey: string): void {\r\n return;\r\n }\r\n\r\n private getTouchPoint(): void {\r\n const context: TouchPointContext = new class implements TouchPointContext {\r\n SeoSlug: string;\r\n };\r\n context.SeoSlug = this.slug;\r\n\r\n let params: INlVanillajaxParams = {};\r\n const subPath = this.markerElement.classList.contains(\"scope-om-new\")\r\n ? \"TouchPoint/ForOrderModalNew/\"\r\n : \"TouchPoint/ForDetailsPage/\";\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl + subPath;\r\n params.url += \"?context.SeoSlug=\" + this.slug;\r\n params.url += \"&context.SavKey=\" + this.salesArticleVariantKey;\r\n params.url += \"&context.ItemOrigin=\" + this.origin;\r\n if(this.displayedInCategoryNavKey)\r\n params.url += \"&context.DisplayedInCategoryNavKey=\" + this.displayedInCategoryNavKey;\r\n params.contentType = ContentType.Plain;\r\n new NlVanillajax(params).getWithPromise()\r\n .then((response: HtmlResult) => {\r\n let container: HTMLElement = document.createElement('div');\r\n container.innerHTML = response.Html;\r\n this.touchPointElement = container.querySelector(\".touchpoint\"); //there might be text nodes in there, so not childNodes[0]\r\n if (!this.touchPointElement) {\r\n throw new Error(\"no touchpoint returned from service\");\r\n } \r\n this.removePreviousButton();\r\n this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n this.initialize();\r\n })\r\n .catch(() => {\r\n //empty response indicates this article has disabled comparing for some reason\r\n if (this.markerElement) {\r\n this.markerElement.remove();\r\n } else if (this.touchPointElement) {\r\n this.touchPointElement.remove();\r\n }\r\n });\r\n }\r\n\r\n private removePreviousButton(): void {\r\n const previousButton: HTMLElement =\r\n this.markerElement.parentElement.querySelector('.compare-button-wrapper');\r\n\r\n if (previousButton)\r\n previousButton.remove();\r\n }\r\n\r\n\r\n private initialize(): void {\r\n this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n this.touchPointElement.addEventListener('click', (event: Event) => {\r\n event.preventDefault();\r\n });\r\n this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n }, 1000, true).bind(this));\r\n }\r\n\r\n // only for new details page:\r\n private initializeNew(): void {\r\n this.parentContainer.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n this.parentContainer.addEventListener('click', (event: Event) => {\r\n event.preventDefault();\r\n });\r\n this.parentContainer.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n }, 1000, true).bind(this));\r\n }\r\n }\r\n}","import { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCLocalStorageService } from \"../local-storage-service\";\r\nconst ScaleIcon = require(\"../../images/scale-2021.svg\") as string;\r\n\r\nexport module MPCMobileToolbarButton {\r\n import EventBus = MPCEventBus.EventBus;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n\r\n export class MobileToolbarButton {\r\n private static _instance: MobileToolbarButton;\r\n private eventBus: EventBus;\r\n private toolbarButtons: NodeListOf;\r\n private compareButtons: HTMLElement[];\r\n private tbw_mlt: string;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private constructor() {\r\n this.eventBus = EventBus.instance;\r\n document.addEventListener(\"DOMContentLoaded\", () => {\r\n this.initialize();\r\n });\r\n }\r\n\r\n private initialize() {\r\n this.toolbarButtons = document.querySelectorAll(\".mpc-scope .toolbar-button-wrapper\");\r\n if (!this.toolbarButtons || !this.toolbarButtons.length) {\r\n return;\r\n }\r\n\r\n this.compareButtons = new Array();\r\n\r\n // for TouchPoint Accessibility:\r\n if(this.toolbarButtons[0].children && this.toolbarButtons[0].children.length > 0) {\r\n this.tbw_mlt = this.toolbarButtons[0].children[0].innerHTML;\r\n }\r\n\r\n this.toolbarButtons.forEach((toolbarButton: HTMLElement) => {\r\n // compareButton exists only in legacy shop, all other places contains toolbar-button-wrapper\r\n if (toolbarButton.closest('.compare-button'))\r\n this.compareButtons.push(toolbarButton.closest('.compare-button'));\r\n else\r\n this.compareButtons.push(toolbarButton);\r\n\r\n toolbarButton.querySelector('.comparison-icon').innerHTML = ScaleIcon;\r\n toolbarButton.addEventListener(\"click\", () => {\r\n // New category page:\r\n window.shell.publishTo('ArticleTileService.Mobile.ToggleTouchPointOnTile', undefined);\r\n\r\n // Legacy category page, remove later!!!: \r\n this.eventBus.publish(\"mobile-toolbar-button.clicked\");\r\n let categoryNavKey: string;\r\n if (MpcSettings.instance.MobileCategoryNavKey) {\r\n categoryNavKey = MpcSettings.instance.MobileCategoryNavKey;\r\n }\r\n\r\n this.compareButtons.forEach((compareButton: HTMLElement) => {\r\n if (compareButton.classList.contains('active')) {\r\n compareButton.classList.remove('active');\r\n if (categoryNavKey) {\r\n ProductComparisonModelManager.instance.deactivateOnMobileCategory(categoryNavKey);\r\n }\r\n } else {\r\n compareButton.classList.add('active');\r\n if (categoryNavKey) {\r\n ProductComparisonModelManager.instance.activateOnMobileCategory(categoryNavKey);\r\n }\r\n }\r\n });\r\n });\r\n\r\n const categoryNavKey = MpcSettings.instance.MobileCategoryNavKey;\r\n if (categoryNavKey && ProductComparisonModelManager.instance.isActivatedOnMobileCategory(categoryNavKey)) {\r\n this.eventBus.publish(\"mobile-toolbar-button.clicked\");\r\n this.compareButtons[this.compareButtons.length-1].classList.add('active');\r\n }\r\n });\r\n }\r\n\r\n public getTBW_Mlt(): string {\r\n return this.tbw_mlt;\r\n }\r\n }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType, HtmlResult } from \"../helpers/vanillajax\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\n\r\nexport module MPCTileScaleButton {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import EventBus = MPCEventBus.EventBus;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n\r\n export class TileScaleButton implements ITouchPoint {\r\n private markerElement: HTMLElement;\r\n private touchPointElement: HTMLElement;\r\n private slug: string;\r\n private origin: string;\r\n private salesArticleVariantKey: string;\r\n private displayedInCategoryNavKey: string;\r\n private isMobileShop: boolean;\r\n private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;\r\n private eventBus: EventBus;\r\n private deviceDetectionHelper : DeviceDetectionHelper;\r\n\r\n constructor(element: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string, prerendered: boolean = false) {\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n this.isMobileShop = this.deviceDetectionHelper.isMobileShop();\r\n this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n this.eventBus = MPCEventBus.EventBus.instance;\r\n this.salesArticleVariantKey = salesArticleVariantKey;\r\n this.displayedInCategoryNavKey = displayedInCategoryNavKey;\r\n this.slug = slug;\r\n this.origin = origin;\r\n\r\n if (prerendered) {\r\n this.touchPointElement = element;\r\n\r\n if (!this.touchPointElement) {\r\n return;\r\n }\r\n\r\n this.initialize();\r\n } else {\r\n this.markerElement = element;\r\n this.getTouchPoint();\r\n }\r\n }\r\n\r\n update(oldSavKey: string, newSavKey: string): void {\r\n if (!this.touchPointElement) {\r\n return;\r\n }\r\n\r\n if (!oldSavKey) {\r\n // backwards compatibility - can be removed after ATS is deployed on PROD\r\n const selectedVariantElement: HTMLElement = this.touchPointElement.closest('.article-tile')\r\n .querySelector('.colors .selected img');\r\n const thisButtonIsForSavKey: string = selectedVariantElement ? selectedVariantElement.getAttribute('data-colorid') : null;\r\n\r\n if (thisButtonIsForSavKey != newSavKey) {\r\n // this event is received by all touchpoints on the site, \r\n // on categorypage, unrelated touchpoints need to ignore this\r\n return;\r\n }\r\n this.salesArticleVariantKey = newSavKey;\r\n this.toggle();\r\n } else {\r\n // new way\r\n if (this.salesArticleVariantKey != oldSavKey) {\r\n return;\r\n }\r\n\r\n this.salesArticleVariantKey = newSavKey;\r\n this.toggle();\r\n }\r\n }\r\n\r\n private getTouchPoint(): void {\r\n let params: INlVanillajaxParams = {};\r\n const scopeClass = this.markerElement.classList.contains(\"scope-ats\")\r\n ? \"ats\"\r\n : \"\";\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl + \"TouchPoint/ForArticleTile/\";\r\n params.url += \"?context.SeoSlug=\" + this.slug;\r\n params.url += \"&context.SavKey=\" + this.salesArticleVariantKey;\r\n params.url += \"&context.ItemOrigin=\" + this.origin;\r\n params.url += \"&context.ScopeClass=\" + scopeClass;\r\n if(this.displayedInCategoryNavKey)\r\n params.url += \"&context.DisplayedInCategoryNavKey=\" + this.displayedInCategoryNavKey;\r\n params.contentType = ContentType.Plain;\r\n new NlVanillajax(params).getWithPromise()\r\n .then((response: HtmlResult) => {\r\n let container: HTMLElement = document.createElement('div');\r\n container.innerHTML = response.Html;\r\n this.touchPointElement = container.querySelector(\".touchpoint\"); //there might be text nodes in there, so not childNodes[0]\r\n if (!this.touchPointElement) {\r\n throw new Error(\"no touchpoint returned from service\");\r\n }\r\n this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n this.initialize();\r\n })\r\n .catch(() => {\r\n //empty response indicates this article has disabled comparing for some reason\r\n if (this.markerElement) {\r\n this.markerElement.remove();\r\n } else if (this.touchPointElement) {\r\n this.touchPointElement.remove();\r\n }\r\n });\r\n }\r\n\r\n\r\n private initialize(): void {\r\n this.toggle();\r\n this.touchPointElement.querySelector('.comparison-empty-icon').innerHTML = ScaleEmptyIcon + ScaleIcon2021;\r\n this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon2021;\r\n\r\n this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.updateFlyout();\r\n }, 1000, true).bind(this));\r\n this.eventBus.subscribe(\"flyout.product-removed\", (salesArticleVariantKey: string) => {\r\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n this.touchPointElement.classList.remove('active');\r\n }\r\n });\r\n this.eventBus.subscribe([\"flyout.product-added\", \"flyout.product-replaced\"], (salesArticleVariantKey: string) => {\r\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n this.touchPointElement.classList.add('active');\r\n }\r\n });\r\n\r\n if (this.isMobileShop) {\r\n this.eventBus.subscribe(\"mobile-toolbar-button.clicked\", this.updateVisibility.bind(this));\r\n }\r\n }\r\n\r\n private updateVisibility(): void {\r\n if (this.touchPointElement.classList.contains(\"ats\")) {\r\n if (this.touchPointElement.parentElement.classList.contains('fas_hidden')) {\r\n this.touchPointElement.parentElement.classList.remove('fas_hidden');\r\n } else {\r\n this.touchPointElement.parentElement.classList.add('fas_hidden');\r\n }\r\n } else {\r\n if (this.touchPointElement.classList.contains(\"visible\")) {\r\n this.touchPointElement.classList.remove(\"visible\");\r\n } else {\r\n this.touchPointElement.classList.add(\"visible\");\r\n }\r\n }\r\n }\r\n\r\n private updateFlyout(): void {\r\n if (!this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n } else {\r\n this.iFlyoutContentController.removeProductTP(this.salesArticleVariantKey);\r\n }\r\n }\r\n\r\n private toggle(): void {\r\n if (this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n this.touchPointElement.classList.add('active');\r\n } else {\r\n this.touchPointElement.classList.remove('active');\r\n }\r\n }\r\n }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCCallLimiter } from \"../helpers/call-limiter\";\r\nimport { MPCIFlyoutContentController } from \"../typings/iFlyoutContentController\";\r\nimport { MPCFlyoutContentController } from \"../PCF/flyout-content-controller\";\r\nimport { MPCEventBus } from \"../helpers/event-bus\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\n\r\nexport module MPCTileScaleButtonEx {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import EventBus = MPCEventBus.EventBus;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n\r\n export class TileScaleButtonEx implements ITouchPoint {\r\n private markerElement: HTMLElement;\r\n private touchPointElement: HTMLElement;\r\n private slug: string;\r\n private origin: string;\r\n private salesArticleVariantKey: string;\r\n private isMobileShop: boolean;\r\n private iFlyoutContentController: MPCIFlyoutContentController.IFlyoutContentController;\r\n private eventBus: EventBus;\r\n private deviceDetectionHelper : DeviceDetectionHelper;\r\n\r\n constructor(element: HTMLElement, salesArticleVariantKey: string, slug: string, origin: string, displayedInCategoryNavKey: string, private tbw_mlt: string) {\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n this.isMobileShop = this.deviceDetectionHelper.isMobileShop();\r\n this.iFlyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n this.eventBus = MPCEventBus.EventBus.instance;\r\n this.salesArticleVariantKey = salesArticleVariantKey; \r\n this.slug = slug;\r\n this.origin = origin;\r\n\r\n this.markerElement = element;\r\n this.getTouchPoint();\r\n }\r\n\r\n update(oldSavKey: string, newSavKey: string): void {\r\n if (!this.touchPointElement) {\r\n return;\r\n }\r\n\r\n if (!oldSavKey) {\r\n // backwards compatibility - can be removed after ATS is deployed on PROD\r\n const selectedVariantElement: HTMLElement = this.touchPointElement.closest('.article-tile')\r\n .querySelector('.colors .selected img');\r\n const thisButtonIsForSavKey: string = selectedVariantElement ? selectedVariantElement.getAttribute('data-colorid') : null;\r\n\r\n if (thisButtonIsForSavKey != newSavKey) {\r\n // this event is received by all touchpoints on the site, \r\n // on categorypage, unrelated touchpoints need to ignore this\r\n return;\r\n }\r\n this.salesArticleVariantKey = newSavKey;\r\n this.toggle();\r\n } else {\r\n // new way\r\n if (this.salesArticleVariantKey != oldSavKey) {\r\n return;\r\n }\r\n\r\n this.salesArticleVariantKey = newSavKey;\r\n this.toggle();\r\n }\r\n }\r\n\r\n private getTouchPoint(): void {\r\n const scopeClass = this.markerElement.classList.contains('scope-ats')\r\n ? ' ats'\r\n : '';\r\n\r\n const forArticleTile: HTMLElement = document.createElement('div');\r\n forArticleTile.className = 'mpc-scope scale-tile-container touchpoint' + scopeClass;\r\n forArticleTile.setAttribute(\"title\", this.tbw_mlt);\r\n forArticleTile.setAttribute(\"data-savkey\", this.salesArticleVariantKey);\r\n forArticleTile.setAttribute(\"data-item-origin\", this.origin);\r\n forArticleTile.setAttribute('focusable', '');\r\n forArticleTile.setAttribute('order', '0');\r\n\r\n const emptyIcon: HTMLElement = document.createElement('div');\r\n emptyIcon.className = 'comparison-empty-icon';\r\n\r\n const icon: HTMLElement = document.createElement('div');\r\n icon.className = 'comparison-icon';\r\n \r\n forArticleTile.appendChild(emptyIcon);\r\n forArticleTile.appendChild(icon);\r\n\r\n this.touchPointElement = forArticleTile;\r\n \r\n if (!this.touchPointElement) {\r\n throw new Error(\"no touchpoint returned from service\");\r\n }\r\n\r\n this.markerElement.parentNode.replaceChild(this.touchPointElement, this.markerElement);\r\n \r\n this.initialize();\r\n }\r\n\r\n private initialize(): void {\r\n this.toggle();\r\n this.touchPointElement.querySelector('.comparison-empty-icon').innerHTML = ScaleEmptyIcon + ScaleIcon2021;\r\n this.touchPointElement.querySelector('.comparison-icon').innerHTML = ScaleIcon2021;\r\n\r\n this.touchPointElement.addEventListener('click', MPCCallLimiter.CallLimiter.debounce(() => {\r\n this.updateFlyout();\r\n }, 1000, true).bind(this));\r\n\r\n this.touchPointElement.addEventListener('keydown', (event: KeyboardEvent) => {\r\n if (event.key === ' ') { // space btn\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n this.updateFlyout();\r\n }\r\n });\r\n\r\n this.eventBus.subscribe(\"flyout.product-removed\", (salesArticleVariantKey: string) => {\r\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n this.touchPointElement.classList.remove('active');\r\n }\r\n });\r\n this.eventBus.subscribe([\"flyout.product-added\", \"flyout.product-replaced\"], (salesArticleVariantKey: string) => {\r\n if (salesArticleVariantKey === this.salesArticleVariantKey) {\r\n this.touchPointElement.classList.add('active');\r\n }\r\n });\r\n\r\n if (this.isMobileShop) {\r\n this.eventBus.subscribe(\"mobile-toolbar-button.clicked\", this.updateVisibility.bind(this));\r\n }\r\n }\r\n\r\n private updateVisibility(): void {\r\n if (this.touchPointElement.classList.contains(\"ats\")) {\r\n if (this.touchPointElement.parentElement.classList.contains('fas_hidden')) {\r\n this.touchPointElement.parentElement.classList.remove('fas_hidden');\r\n } else {\r\n this.touchPointElement.parentElement.classList.add('fas_hidden');\r\n }\r\n } else {\r\n if (this.touchPointElement.classList.contains(\"visible\")) {\r\n this.touchPointElement.classList.remove(\"visible\");\r\n } else {\r\n this.touchPointElement.classList.add(\"visible\");\r\n }\r\n }\r\n }\r\n\r\n private updateFlyout(): void {\r\n if (!this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n this.iFlyoutContentController.addProduct(this.salesArticleVariantKey, this.slug, this.origin);\r\n } else {\r\n this.iFlyoutContentController.removeProductTP(this.salesArticleVariantKey);\r\n }\r\n }\r\n\r\n private toggle(): void {\r\n if (this.iFlyoutContentController.checkIsProductAlreadyAdded(this.salesArticleVariantKey)) {\r\n this.touchPointElement.classList.add('active');\r\n } else {\r\n this.touchPointElement.classList.remove('active');\r\n }\r\n }\r\n }\r\n}","import { MPCITouchPoint } from \"../typings/TouchPoint\";\r\nimport { MPCITouchPointIdentifier } from \"../typings/TouchPointIdentifier\";\r\nimport { MPCTouchPointIdentifier } from \"./TouchPointIdentifier\";\r\nimport { MPCCompareButton } from \"./CompareButton\";\r\nimport { MPCTileScaleButton } from \"./TileScaleButton\";\r\nimport { MPCTileScaleButtonEx } from \"./TileScaleButtonEx\";\r\nimport { MPCMobileToolbarButton } from \"./MobileToolbarButton\";\r\nimport { MPCFlyoutContentController } from '../PCF/flyout-content-controller';\r\nimport { MpcSettingsModule } from \"../helpers/MpcSettings\";\r\nconst ScaleIcon2021 = require(\"../../images/scale-2021.svg\") as string;\r\nconst ScaleEmptyIcon = require(\"../../images/scale-empty.svg\") as string;\r\nimport axios, { AxiosError, AxiosResponse } from 'axios';\r\n\r\nexport module MPCTouchPointFactory {\r\n import ITouchPoint = MPCITouchPoint.ITouchPoint;\r\n import TouchPointPayload = MPCITouchPoint.TouchPointPayload;\r\n import ITouchPointIdentifier = MPCITouchPointIdentifier.ITouchPointIdentifier;\r\n import ServiceCallName = MPCITouchPointIdentifier.ServiceCallName;\r\n import TouchPointIdentifier = MPCTouchPointIdentifier.TouchPointIdentifier;\r\n import CompareButton = MPCCompareButton.CompareButton;\r\n import TileScaleButton = MPCTileScaleButton.TileScaleButton;\r\n import TileScaleButtonEx = MPCTileScaleButtonEx.TileScaleButtonEx;\r\n import MobileToolbarButton = MPCMobileToolbarButton.MobileToolbarButton;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export class TouchPointFactory {\r\n private static _instance: TouchPointFactory;\r\n private touchPointIdentifier: ITouchPointIdentifier;\r\n private touchPoints: ITouchPoint[];\r\n private isMobileView = window.innerWidth <= 1199; \r\n private isNewDetailsPage: HTMLElement = document.querySelector('.pdp-details_page_container'); // only for new details page:\r\n private compareButtonSavKeySelector: string = this.isMobileView ?\r\n 'input[name=SalesarticleVariantKey]' : 'input[name=SalesArticleVariantKey]';\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private constructor() {\r\n this.touchPointIdentifier = TouchPointIdentifier.instance;\r\n this.touchPoints = [];\r\n\r\n if (window.shell) {\r\n this.initializeEvents();\r\n\r\n // we have to init it because of variety of resolution on tablet devices\r\n MobileToolbarButton.instance;\r\n }\r\n }\r\n\r\n private initializeEvents() { \r\n if(this.isNewDetailsPage) {\r\n this.CreateTouchPointsForNewPDP();\r\n }\r\n else {\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPoints\", (scope: HTMLElement) => {\r\n this.createByMarkersPayload(scope);\r\n }, \"ManualProductComparison.CreateTouchPoints\");\r\n }\r\n\r\n // for legacy category page:\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateScaleIconTouchPoints\", (tile: HTMLElement) => {\r\n const salesArticleVariantKey: string =\r\n tile.getAttribute('data-selected-colorid');\r\n this.createByMarkers(salesArticleVariantKey, \"mpc-scale-tile\", tile);\r\n }, \"ManualProductComparison.CreateScaleIconTouchPoints\");\r\n\r\n // for new ATS and search page:\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPointsBatch\", (placeHoldersData: {savKey: string;\r\n seoSlug: string; displayedInCategoryNavKey: string;}[]) => {\r\n this.createByMarkersEx(placeHoldersData, \"mpc-scale-tile\");\r\n }, \"ManualProductComparison.CreateTouchPointsBatch\");\r\n\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateCompareButtonTouchPoints\", (form: HTMLElement) => {\r\n let savKeyElement = form.querySelector(this.compareButtonSavKeySelector);\r\n if (!savKeyElement) {\r\n //TODO on mobile after clicking basket icon, order modal opens, but it contains no compare button... \r\n return;\r\n }\r\n const salesArticleVariantKey: string = savKeyElement.getAttribute('value');\r\n this.createByMarkers(salesArticleVariantKey, \"mpc-compare-button\", form);\r\n }, \"ManualProductComparison.CreateCompareButtonTouchPoints\");\r\n\r\n window.shell.subscribeTo(\"ManualProductComparison.UpdateTouchPoints\", (payload: { oldSavKey: string, newSavKey: string }) => {\r\n if (typeof payload == 'string') {\r\n // backwards compatibility - can be removed after ATS is deployed on PROD\r\n payload = { oldSavKey: null, newSavKey: payload };\r\n }\r\n for (const touchPoint of this.touchPoints) {\r\n touchPoint.update(payload.oldSavKey, payload.newSavKey);\r\n }\r\n }, \"ManualProductComparison.UpdateTouchPoints\");\r\n \r\n document.addEventListener(\"DOMContentLoaded\",\r\n () => {\r\n this.initializePrerenderedMobileTouchPoints();\r\n });\r\n \r\n document.addEventListener(\"DOMContentLoaded\",\r\n () => {\r\n this.initializeCompareLinkTouchPoints();\r\n });\r\n }\r\n\r\n // only for new details page:\r\n private CreateTouchPointsForNewPDP() {\r\n // Necessary for AAS fragment:\r\n window.shell.subscribeTo(\"ManualProductComparison.CreateTouchPoints\", (scope: HTMLElement) => {\r\n this.createByMarkersPayload(scope);\r\n }, \"ManualProductComparison.CreateTouchPoints\");\r\n\r\n const newBtnLst: NodeListOf = this.isNewDetailsPage.querySelectorAll('.mpc-compare-btn');\r\n if (!newBtnLst || newBtnLst.length === 0) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < newBtnLst.length; i++) {\r\n const newBtn = newBtnLst[i];\r\n const salesArticleVariantKey: string = newBtn.getAttribute('data-savkey');\r\n const slug: string = newBtn.getAttribute('data-slug');\r\n const origin: string = newBtn.getAttribute('data-item-origin');\r\n\r\n new CompareButton(null, salesArticleVariantKey, slug, origin, '', newBtn);\r\n }\r\n }\r\n\r\n private initializePrerenderedMobileTouchPoints(): void {\r\n const touchPoints: NodeListOf = this.touchPointIdentifier.getTileScaleTouchPoints();\r\n const touchPointPlaceholders: NodeListOf = this.touchPointIdentifier.getMobileTouchPointPlaceholders();\r\n const savKeyToPlaceholder: {[id:string] : HTMLElement} = {};\r\n for (const touchPointPlaceholder of Array.prototype.slice.call(touchPointPlaceholders)) {\r\n savKeyToPlaceholder[touchPointPlaceholder.getAttribute(\"data-savkey\")] = touchPointPlaceholder;\r\n }\r\n let parentElement: HTMLElement;\r\n if (touchPoints.length > 0) { \r\n parentElement = touchPoints[0].parentElement;\r\n }\r\n for (const touchPoint of Array.prototype.slice.call(touchPoints)) {\r\n\r\n touchPoint.querySelector('.comparison-empty-icon').innerHtml = ScaleEmptyIcon;\r\n touchPoint.querySelector('.comparison-icon').innerHtml = ScaleIcon2021;\r\n\r\n const slug: string = touchPoint.dataset.slug;\r\n const salesArticleVariantKey: string = touchPoint.dataset.savkey;\r\n const itemOrigin: string = touchPoint.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = touchPoint.getAttribute(\"data-displayed-in-category-navkey\");\r\n if (slug && salesArticleVariantKey) {\r\n this.touchPoints.push(new TileScaleButton(touchPoint, salesArticleVariantKey, slug, itemOrigin, displayedInCategoryNavKey, true));\r\n }\r\n\r\n //move in DOM (they are batch-rendered below the article list and need to be sorted into their article tile)\r\n const placeholder = savKeyToPlaceholder[touchPoint.getAttribute(\"data-savkey\")];\r\n if (placeholder) {\r\n placeholder.parentNode.replaceChild(touchPoint, placeholder);\r\n }\r\n }\r\n if (parentElement) {\r\n const currentCategoryNavKey = parentElement.getAttribute(\"data-category-navkey\");\r\n MpcSettings.instance.MobileCategoryNavKey = currentCategoryNavKey;\r\n parentElement.remove();\r\n }\r\n }\r\n\r\n private initializeCompareLinkTouchPoints(): void {\r\n const flyoutContentController = MPCFlyoutContentController.FlyoutContentController.instance;\r\n const compareLinks = this.touchPointIdentifier.getCompareLinks();\r\n for (let i = 0; i < compareLinks.length; i++) {\r\n const compareLink = compareLinks[i];\r\n const htmlIndex = compareLink.href.indexOf(\".html\");\r\n const url = compareLink.href.substring(0, htmlIndex);\r\n const splitted = url.split(\"-\").reverse();\r\n const maNo = parseInt(splitted[2]);\r\n const colorCode = parseInt(splitted[0]);\r\n compareLink.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n flyoutContentController.addProductByCompareLink(maNo, colorCode);\r\n });\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private isAxiosError(error: any): error is AxiosError {\r\n return typeof error.toJSON !== 'undefined';\r\n }\r\n\r\n private createByMarkersEx(articlesContext: {savKey: string; seoSlug: string;\r\n displayedInCategoryNavKey: string;}[], type?: ServiceCallName): void {\r\n \r\n // Call MPC endpoint:\r\n axios.post(MpcSettingsModule.MpcSettings.instance.apiUrl + \"TouchPoint/IsBatchComparable/\", \r\n articlesContext, {\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n })\r\n .then((response: AxiosResponse) => {\r\n if (response.status >= 200 && response.status < 300 && response.data && response.data.length > 0) {\r\n const validSavKeys = response.data;\r\n\r\n // Create TP from valid sav keys array:\r\n const markers: HTMLElement[] = this.touchPointIdentifier.getMarkersFromDomEx(type, validSavKeys);\r\n\r\n for (const markerElement of markers) {\r\n if (markerElement) {\r\n this.touchPoints.push(this.createTouchPointEx(markerElement));\r\n }\r\n }\r\n }\r\n })\r\n .catch((error: Error | AxiosError) => {\r\n const errorMsg = this.isAxiosError(error)\r\n ? error.message\r\n : `${error.name}: ${error.message}`;\r\n const errorStack = this.isAxiosError(error)\r\n ? JSON.stringify(error.toJSON())\r\n : error.stack;\r\n\r\n // eslint-disable-next-line no-console\r\n console.warn(\r\n `fetch() failed with \"${errorMsg}\". Full error:\\n${errorStack}`\r\n );\r\n });\r\n }\r\n\r\n private createByMarkers(salesArticleVariantKey: string, type?: ServiceCallName, scope?: HTMLElement): void {\r\n const markers: NodeListOf = this.touchPointIdentifier.getMarkersFromDom(scope, type);\r\n for (const markerElement of Array.prototype.slice.call(markers)) {\r\n this.touchPoints.push(this.createTouchPoint(markerElement, salesArticleVariantKey));\r\n }\r\n }\r\n\r\n // Todo: This will replace the createByMarkers method. Legacy frontends needs to be adjusted first before this refactor step\r\n private createByMarkersPayload(scope?: HTMLElement): void {\r\n const markers: NodeListOf = this.touchPointIdentifier.getMarkersFromDom(scope, \"ESCID.ESPP.ManualProductComparison\");\r\n for (const markerElement of Array.prototype.slice.call(markers)) {\r\n const markerPayloadObject: TouchPointPayload = JSON.parse(markerElement.dataset.payload);\r\n\r\n if (markerPayloadObject) {}\r\n this.touchPoints.push(this.createTouchPointByPayloadObject(markerElement, markerPayloadObject));\r\n }\r\n }\r\n\r\n private createTouchPointEx(marker: HTMLElement): ITouchPoint {\r\n // const type: ServiceCallName = marker.dataset.serviceCall as ServiceCallName;\r\n const slug: string = marker.dataset.slug;\r\n const origin: string = marker.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n const salesArticleVariantKey: string = marker.getAttribute(\"data-selected-colorid\");\r\n\r\n const touchPoint = new TileScaleButtonEx(marker, salesArticleVariantKey, slug, \r\n origin, displayedInCategoryNavKey, MobileToolbarButton.instance.getTBW_Mlt());\r\n return touchPoint;\r\n }\r\n\r\n private createTouchPoint(marker: HTMLElement, salesArticleVariantKey: string): ITouchPoint {\r\n const type: ServiceCallName = marker.dataset.serviceCall as ServiceCallName;\r\n const slug: string = marker.dataset.slug;\r\n const origin: string = marker.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n\r\n let touchPoint: ITouchPoint = null;\r\n\r\n if (type === \"mpc-compare-button\") {\r\n touchPoint = new CompareButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey, null);\r\n } else if (type === \"mpc-scale-tile\") {\r\n touchPoint = new TileScaleButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey);\r\n }\r\n\r\n return touchPoint;\r\n }\r\n\r\n // Todo: This will replace the createTouchPoint method. Legacy frontend needs to be adjusted first before this refactor step\r\n private createTouchPointByPayloadObject(marker: HTMLElement, dataObject: TouchPointPayload): ITouchPoint {\r\n const type: ServiceCallName = dataObject.type;\r\n const salesArticleVariantKey: string = dataObject.savKey;\r\n const slug: string = dataObject.slug;\r\n const origin: string = marker.getAttribute(\"data-item-origin\");\r\n const displayedInCategoryNavKey: string = marker.getAttribute(\"data-displayed-in-category-navkey\");\r\n\r\n let touchPoint: ITouchPoint = null;\r\n\r\n if (type === \"mpc-compare-button\") {\r\n touchPoint = new CompareButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey, null);\r\n } else if (type === \"mpc-scale-tile\") {\r\n touchPoint = new TileScaleButton(marker, salesArticleVariantKey, slug, origin, displayedInCategoryNavKey);\r\n }\r\n\r\n return touchPoint;\r\n }\r\n }\r\n}\r\n\r\nif(window.shell)\r\n MPCTouchPointFactory.TouchPointFactory.instance;","import { MPCITouchPointIdentifier} from \"../typings/TouchPointIdentifier\";\r\n\r\nexport module MPCTouchPointIdentifier {\r\n import ITouchPointIdentifier = MPCITouchPointIdentifier.ITouchPointIdentifier;\r\n import ServiceCallName = MPCITouchPointIdentifier.ServiceCallName;\r\n\r\n export class TouchPointIdentifier implements ITouchPointIdentifier {\r\n private static _instance: TouchPointIdentifier;\r\n private scope: HTMLElement;\r\n private compareButtonMarker: string = 'mpc-compare-button';\r\n private tileScaleMarker: string = 'mpc-scale-tile';\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n this.scope = document.body;\r\n }\r\n\r\n // For ATS and search page\r\n getMarkersFromDomEx(type: ServiceCallName, savKeys: string[]): HTMLElement[] {\r\n let scope = document.querySelector('.fas_article_tile_grid_root');\r\n\r\n if(!scope)\r\n scope = this.scope;\r\n\r\n let result: HTMLElement[] = [];\r\n\r\n savKeys.forEach((key) => {\r\n result.push(scope.querySelector('[data-service-call=\"' + type + '\"][data-selected-colorid=\"' + key + '\"]'));\r\n });\r\n\r\n return result;\r\n }\r\n\r\n getMarkersFromDom(scope?: HTMLElement, type?: ServiceCallName): NodeListOf {\r\n if (!scope) {\r\n scope = this.scope;\r\n }\r\n\r\n if (type) {\r\n return scope.querySelectorAll('[data-service-call=\"' + type + '\"]');\r\n } else {\r\n return scope.querySelectorAll('[data-service-call=' + this.compareButtonMarker + '], [data-service-call=' + this.tileScaleMarker + ']');\r\n }\r\n }\r\n \r\n getTileScaleTouchPoints(scope?: HTMLElement): NodeListOf {\r\n if (!scope) {\r\n scope = this.scope;\r\n }\r\n\r\n return scope.querySelectorAll('.mpc-scope.scale-tile-container');\r\n }\r\n\r\n getCompareLinks(scope?: HTMLElement): Array {\r\n if (!scope) {\r\n scope = this.scope;\r\n }\r\n\r\n const allLinks = scope.querySelectorAll('area[href], .imagemap-inner-container>a');\r\n const compareLinks: Array = [];\r\n for (let i = 0; i < allLinks.length; ++i) {\r\n const link = allLinks[i];\r\n const href = link.href;\r\n if (href.indexOf('.html') >= 0 && (href.indexOf('&compare=true') >= 0 || href.indexOf('?compare=true') >= 0)) {\r\n compareLinks.push(link);\r\n }\r\n }\r\n return compareLinks;\r\n }\r\n\r\n getMobileTouchPointPlaceholders(): NodeListOf {\r\n const scope = this.scope;\r\n\r\n return scope.querySelectorAll('.mobile-touchpoint-placeholder');\r\n }\r\n } \r\n}","import { MpcSettingsModule } from \"./helpers/MpcSettings\";\r\nimport { NlVanillajax, INlVanillajaxParams, ContentType } from \"./helpers/vanillajax\";\r\nimport { ErrorMessage } from \"../../Models/ErrorMessage.generated\"\r\n\r\ndeclare const window: Window;\r\n\r\nexport module MPCErrorHandlerModule {\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export class ErrorHandlerManager {\r\n private static _instance: ErrorHandlerManager;\r\n private static _errorCount: number = 0;\r\n private _settings: MpcSettings;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n this.Init();\r\n }\r\n\r\n public Init(): void {\r\n this._settings = MpcSettings.instance;\r\n window.onerror = (msg, url, line, col, error) => {\r\n ErrorHandlerManager._errorCount++;\r\n if (ErrorHandlerManager._errorCount > 10) {\r\n return true;\r\n }\r\n\r\n const string = msg.toString().toLowerCase();\r\n const substring = \"script error\";\r\n if (string.indexOf(substring) === 0) {\r\n console.warn(\"cannot handle JS error. probably CORS issue.\");\r\n return false;\r\n }\r\n\r\n if (typeof (msg) !== \"string\") {\r\n let errorEvent: ErrorEvent = (msg);\r\n if (errorEvent.error) {\r\n msg = errorEvent.error.message + \"\\n\"+ errorEvent.error.stack;\r\n line = errorEvent.lineno;\r\n col = errorEvent.colno;\r\n url = errorEvent.filename;\r\n } else {\r\n msg = JSON.stringify(msg);\r\n }\r\n }\r\n //log error to service\r\n let errStr: string = undefined;\r\n if(error)\r\n errStr = JSON.stringify(error);\r\n const errorMsg = {\r\n message: msg,\r\n url: url,\r\n line: line,\r\n col: col,\r\n error: errStr\r\n };\r\n this.LogError(errorMsg);\r\n\r\n // for development, we want to see errors in console \r\n const suppressDefaultErrorHandlerAkaConsolePrint = !this._settings.isDevelopment;\r\n \r\n return suppressDefaultErrorHandlerAkaConsolePrint;\r\n };\r\n }\r\n\r\n public LogError(error: ErrorMessage): Promise {\r\n // handle only mpc errors:\r\n\r\n // source off error has to be known, if there is bundle/ file url, skip this logging:\r\n if (!error.url)\r\n return;\r\n\r\n // asset url has to contain mpc scope name\r\n if(error.url.indexOf('manualproductcomparison') === -1)\r\n return;\r\n \r\n // MPC is made on pure html and ts, we are not responsible for any react or other frameworks:\r\n if(error.message.indexOf('ReactDOM') > 0)\r\n return;\r\n \r\n // read local storage and stringify it. This will help to solve problems and get better feeling what data was used on exception:\r\n const mpcLocalStorageJson = window.localStorage.getItem(MpcSettings.instance.mpcLocalStorageKey);\r\n if (mpcLocalStorageJson) {\r\n error.mpcLocalStorage = mpcLocalStorageJson;\r\n }\r\n else {\r\n error.mpcLocalStorage = 'local storage was not found';\r\n }\r\n\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\r\n 'Debug/LogJavascriptError';\r\n params.data = JSON.stringify(error);\r\n\r\n return new NlVanillajax(params).postWithPromise()\r\n .then(() => {\r\n })\r\n .catch((reason) => {\r\n console.log(\"error could not be logged to service. reason: \"+reason.status+\" \"+reason.statusText);\r\n });\r\n\r\n }\r\n }\r\n}\r\n\r\nMPCErrorHandlerModule.ErrorHandlerManager.instance.Init();","export module MPCScopeDetection {\r\n export class ScopeDetection {\r\n public static hasScopes(comparisonPage: boolean, comparisonFlyout: boolean): boolean {\r\n const PcfScope: NodeListOf = document.querySelectorAll(\".pcf-scope\");\r\n const PcpScope: NodeListOf = document.querySelectorAll(\".mpc-scope .grid\");\r\n\r\n return comparisonFlyout === PcfScope.length > 0 && comparisonPage === PcpScope.length > 0;\r\n }\r\n }\r\n}","export module MpcSettingsModule {\n export class MpcSettings {\n private static _instance: MpcSettings;\n private static initDone: boolean = false;\n private _mpcLocalStorageKey: string = 'productComparison';\n\n static get instance() {\n return this._instance || (this._instance = new this());\n }\n\n public init(scope: HTMLElement): void {\n this._culture = scope.getAttribute(\"data-culture\");\n this._portalMandantToken = scope.getAttribute(\"data-portalmandanttoken\");\n this._maxProducts = parseInt(scope.getAttribute(\"data-maxProducts\"));\n this._isLoggedIn = scope.getAttribute(\"data-isLoggedIn\") === \"true\";\n this._isDevelopment = scope.getAttribute(\"data-isDevelopment\") === \"true\";\n this._apiUrl = scope.getAttribute(\"data-apiUrl\");\n \n MpcSettings.initDone = true;\n }\n\n private _culture:string;\n get culture():string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._culture;\n }\n\n private _portalMandantToken: string;\n get portalMandantToken(): string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._portalMandantToken;\n }\r\n\n private _apiUrl: string;\n get apiUrl(): string {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._apiUrl;\n }\n \n private _maxProducts:number;\n get maxProducts():number {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._maxProducts;\n }\n\n private _isLoggedIn: boolean;\n get isLoggedIn(): boolean {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._isLoggedIn;\n }\n \n private _isDevelopment: boolean;\n get isDevelopment(): boolean {\n if (!MpcSettings.initDone) throw new Error(\"MpcSettings: init not called yet\");\n return this._isDevelopment;\n }\n\n public MobileCategoryNavKey: string;\n\n get mpcLocalStorageKey(): string {\n return this._mpcLocalStorageKey;\n } \n }\n}","import {MPCElementsHelper} from \"../helpers/htmlElementsHelper\";\r\nimport {MPCINavigationService} from \"../typings/iNavigationService\";\r\nimport { MPCIAbstractContent } from \"../typings/iAbstractContent\";\r\nimport { MPCNotificationService } from \"../PCF/notification-service\";\r\nimport { NavigationTab } from \"../../../../DomainObjects/Dtos/Product.generated\";\r\nimport { MPCDeviceDetectionHelper } from \"../helpers/deviceDetectionHelper\";\r\nimport { MPCLocalStorageService } from \"../local-storage-service\";\r\n\r\nexport module MPCNavigationService {\r\n import INavigationService = MPCINavigationService.INavigationService;\r\n import HtmlElementsHelper = MPCElementsHelper.HtmlElementsHelper;\r\n import IAbstractContent = MPCIAbstractContent.IAbstractContent;\r\n import NotificationService = MPCNotificationService.NotificationService;\r\n import DeviceDetectionHelper = MPCDeviceDetectionHelper.DeviceDetectionHelper;\r\n import ProductComparisonModelManager = MPCLocalStorageService.ProductComparisonModelManager;\r\n\r\n //extend the service interface by some properties that are only used in TS\r\n interface NavigationTabTs extends NavigationTab {\r\n domNode: HTMLElement;\r\n savKeys: string[];\r\n }\r\n\r\n export class NavigationService implements INavigationService {\r\n private static _instance: NavigationService;\r\n private navigationTabs: HTMLElement;\r\n private selectCategoryButton: HTMLElement;\r\n private navigationTabsArray: Array;\r\n private activeNavigationTab: NavigationTabTs;\r\n private parentElement: HTMLElement;\r\n private navigationTabKeyName: string;\r\n private abstractContent: IAbstractContent;\r\n private notificationService: NotificationService;\r\n private deviceDetectionHelper: DeviceDetectionHelper;\r\n private productComparisonModelManager: ProductComparisonModelManager;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n init(parentElement: HTMLElement, navigationTabKeyName: string, abstractContent: IAbstractContent): void {\r\n\r\n if (parentElement) {\r\n this.deviceDetectionHelper = DeviceDetectionHelper.instance;\r\n this.notificationService = NotificationService.instance;\r\n this.parentElement = parentElement;\r\n this.selectCategoryButton = this.parentElement.querySelector('.select-category-button');\r\n this.navigationTabs = this.parentElement.querySelector('.navigation-tabs');\r\n this.navigationTabsArray = new Array();\r\n this.navigationTabKeyName = navigationTabKeyName;\r\n this.abstractContent = abstractContent;\r\n this.registerButtonEvent();\r\n }\r\n }\r\n\r\n private registerButtonEvent(): void {\r\n if (this.selectCategoryButton)\r\n this.selectCategoryButton.addEventListener('click', () => {\r\n this.notificationService.notifyEmptyList();\r\n });\r\n }\r\n\r\n private switchNavigationTab(newActiveNavigationTab: NavigationTabTs): void {\r\n if (this.activeNavigationTab) {\r\n this.activeNavigationTab.domNode.classList.remove('active-tab');\r\n\r\n const newActiveNavigationTabName: string = newActiveNavigationTab.name;\r\n const oldNavigationTabName: string = this.activeNavigationTab.name;\r\n\r\n if (this.deviceDetectionHelper.isMobileShop()) {\r\n // clear locked column info:\r\n this.productComparisonModelManager = ProductComparisonModelManager.instance;\r\n this.productComparisonModelManager.clearLockedColumnIndex();\r\n this.productComparisonModelManager.clearCarouselScrollIndex();\r\n }\r\n\r\n if (this.abstractContent) {\r\n this.abstractContent.updateContainerListVisibility(newActiveNavigationTabName, oldNavigationTabName);\r\n }\r\n }\r\n\r\n this.activeNavigationTab = newActiveNavigationTab;\r\n newActiveNavigationTab.domNode.classList.add('active-tab');\r\n }\r\n\r\n private scrollToNavigationTab(newActiveNavigationTab: NavigationTabTs): void {\r\n const buttonLeftEdgePosition = newActiveNavigationTab.domNode.getBoundingClientRect().left;\r\n const buttonRightEdgePosition = buttonLeftEdgePosition + newActiveNavigationTab.domNode.offsetWidth;\r\n const rightMargin = 10;\r\n\r\n if (buttonRightEdgePosition > window.innerWidth) {\r\n this.navigationTabs.scrollLeft = buttonRightEdgePosition + rightMargin - window.innerWidth;\r\n }\r\n }\r\n\r\n public createOrUpdateNavigationTab(categoryName: string, counterNumber: number, navigationOrder: number,\r\n salesArticleVariantKey: string, createEmptyNavTab: boolean = false): void {\r\n let isNew: boolean = true;\r\n \r\n // look for existing tab:\r\n for(const navigationTab of this.navigationTabsArray) {\r\n const currentNavigationTabName = navigationTab.domNode.getAttribute(this.navigationTabKeyName);\r\n if(currentNavigationTabName === categoryName) {\r\n if (navigationTab.savKeys.indexOf(salesArticleVariantKey) >= 0) {\r\n return; //sav already added (happens when ajax reloads)\r\n }\r\n if (counterNumber > 0) {\r\n navigationTab.savKeys.push(salesArticleVariantKey);\r\n if(!this.abstractContent)//that URL is only used from PCP\r\n this.appendSavKeyToNavTabUrl(navigationTab, salesArticleVariantKey);\r\n } else if (counterNumber < 0) {\r\n navigationTab.savKeys = navigationTab.savKeys.slice(navigationTab.savKeys.indexOf(salesArticleVariantKey), 1);\r\n //no removal from url nessesary because that URL is only used from PCP, where articles are only added \r\n //(when loading the page, remove triggers a page reload)\r\n }\r\n this.updateCounter(navigationTab, counterNumber);\r\n\r\n isNew = false;\r\n break;\r\n }\r\n }\r\n\r\n if (isNew) {\r\n const newNavigationTab: NavigationTabTs = this.createNavigationTab(categoryName, salesArticleVariantKey,\r\n navigationOrder, createEmptyNavTab);\r\n this.updateCounter(newNavigationTab, counterNumber);\r\n let indexToInsert = 0;\r\n for (let navigationTab of this.navigationTabsArray) {\r\n if (navigationOrder < navigationTab.navigationOrder) {\r\n break;\r\n }\r\n indexToInsert++;\r\n }\r\n\r\n this.navigationTabsArray.splice(indexToInsert, 0, newNavigationTab);\r\n \r\n // tab navigation:\r\n newNavigationTab.domNode.setAttribute('focusable', '');\r\n\r\n HtmlElementsHelper.appendChildAtIndex(newNavigationTab.domNode, indexToInsert, this.navigationTabs);\r\n newNavigationTab.domNode.addEventListener('click', () => {\r\n this.switchNavigationTab(newNavigationTab);\r\n });\r\n\r\n if (window.shell.tabNav !== undefined)\r\n window.shell.tabNav.onActivated('.navigation-tab .has-focus', \r\n () => { this.switchNavigationTab(newNavigationTab); });\r\n }\r\n }\r\n\r\n public updateSelectCategoryButtonVisibility(): void {\r\n if (!this.selectCategoryButton)\r\n return;\r\n\r\n if (!this.isAnyProductCounted())\r\n this.selectCategoryButton.classList.remove(\"hidden\");\r\n }\r\n\r\n private isAnyProductCounted(): boolean {\r\n let productFound = false;\r\n this.navigationTabsArray.forEach((tab: NavigationTabTs) => {\r\n if (this.getCounterNumber(tab)) {\r\n productFound = true;\r\n return;\r\n }\r\n });\r\n\r\n return productFound;\r\n }\r\n\r\n private updateCounter(navigationTab: NavigationTabTs, counterNumber: number): void {\r\n const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\r\n let counter: number = Number(productsCounter.innerText);\r\n \r\n counter += counterNumber;\r\n productsCounter.innerText = counter.toString();\r\n }\r\n\r\n private getCounterNumber(navigationTab: NavigationTabTs): number {\r\n const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\r\n return Number(productsCounter.innerText);\r\n }\r\n \r\n private appendSavKeyToNavTabUrl(navigationTab: NavigationTabTs, salesArticleVariantKey: string): void {\r\n let comparisonPageUri: string = navigationTab.domNode.getAttribute('href');\r\n comparisonPageUri = comparisonPageUri + '&savKeys=' + salesArticleVariantKey;\r\n navigationTab.domNode.setAttribute('href', comparisonPageUri);\r\n }\r\n\r\n private createNavigationTab(categoryName: string, salesArticleVariantKey: string, order: number,\r\n createEmptyNavTab: boolean): NavigationTabTs {\r\n let newNavigationTab: NavigationTabTs = {} as NavigationTabTs;\r\n newNavigationTab.navigationOrder = order;\r\n newNavigationTab.name = categoryName;\r\n newNavigationTab.savKeys = [salesArticleVariantKey];\r\n let newNavigationTabHtml: HTMLElement;\r\n\r\n if (salesArticleVariantKey || createEmptyNavTab) {\r\n // create navigation ab from comparison page:\r\n newNavigationTabHtml = document.createElement('a');\r\n\r\n // comparisonPageUri is used in PCP page, flyout does not need it:\r\n let comparisonPageUri: string;\r\n if (!this.abstractContent) {\r\n comparisonPageUri = '?category=' + encodeURIComponent(categoryName);\r\n if (salesArticleVariantKey) {\r\n comparisonPageUri += '&savKeys=' + salesArticleVariantKey;\r\n }\r\n } else {\r\n comparisonPageUri = 'javascript:';\r\n }\r\n\r\n newNavigationTabHtml.setAttribute('href', comparisonPageUri);\r\n }\r\n else {\r\n // create navigation tab for flyout:\r\n newNavigationTabHtml = document.createElement('div');\r\n }\r\n \r\n const newCategoryName: HTMLElement = document.createElement('div');\r\n const newArticlesCounter: HTMLElement = document.createElement('div');\r\n\r\n newNavigationTabHtml.className = 'navigation-tab';\r\n newNavigationTabHtml.setAttribute(this.navigationTabKeyName, categoryName);\r\n newCategoryName.className = 'category-name';\r\n newCategoryName.innerText = categoryName;\r\n newArticlesCounter.className = 'products-counter';\r\n \r\n newNavigationTabHtml.appendChild(newCategoryName);\r\n newNavigationTabHtml.appendChild(newArticlesCounter);\r\n\r\n newNavigationTabHtml.addEventListener('keydown', (event: any) => {\r\n // prevent page jump down on Space btn., click\r\n if (event.code === 'Space')\r\n event.preventDefault();\r\n\r\n if(!window.shell.tabNav)\r\n return;\r\n \r\n if (event.code === 'ArrowRight' && event.target.nextElementSibling) {\r\n window.shell.tabNav.focus(event.target.nextElementSibling);\r\n }\r\n \r\n if (event.code === 'ArrowLeft' && event.target.previousElementSibling) {\r\n window.shell.tabNav.focus(event.target.previousElementSibling);\r\n }\r\n });\r\n\r\n newNavigationTab.domNode = newNavigationTabHtml;\r\n return newNavigationTab;\r\n }\r\n\r\n public removeEmptyNavigationTabs(): void {\r\n if(this.navigationTabsArray) {\r\n let removableNavigationTabs: Array = new Array();\r\n\r\n for (const navigationTab of this.navigationTabsArray) {\r\n const productsCounter: HTMLElement = navigationTab.domNode.querySelector('.products-counter');\r\n const counter: number = Number(productsCounter.innerText);\r\n\r\n if (counter == 0) {\r\n removableNavigationTabs.push(navigationTab);\r\n \r\n // remove highlight from last navigation tab:\r\n // temporary disabled by customer: ESPP-1523\r\n /* if (this.navigationTabsArray.length == 1) {\r\n this.navigationTabsArray[0].classList.remove('active-tab');\r\n } */\r\n }\r\n }\r\n\r\n for (const tmpTab of removableNavigationTabs) {\r\n this.navigationTabs.removeChild(tmpTab.domNode);\r\n this.navigationTabsArray.splice(this.navigationTabsArray.indexOf(tmpTab), 1);\r\n }\r\n }\r\n }\r\n\r\n public markActiveNavigationTab(categoryName: string): boolean {\r\n let newTabActivated: boolean;\r\n for (const navigationTab of this.navigationTabsArray) {\r\n let navigationTabName: string = navigationTab.domNode.getAttribute(this.navigationTabKeyName);\r\n\r\n if (navigationTabName === categoryName) {\r\n this.switchNavigationTab(navigationTab);\r\n this.scrollToNavigationTab(navigationTab);\r\n newTabActivated = true;\r\n break;\r\n }\r\n }\r\n\r\n return newTabActivated;\r\n }\r\n\r\n public markAnyNavigationTabActive(): string {\r\n // after category was cleared, active tab is not selected.\r\n // Need to define last one o first one navigation tab from navigation service container.\r\n let newActiveTabCatName: string;\r\n\r\n if (this.navigationTabsArray && this.navigationTabsArray.length > 0) {\r\n const newActiveTab: NavigationTabTs =\r\n this.navigationTabsArray[this.navigationTabsArray.length - 1];\r\n\r\n newActiveTabCatName = newActiveTab.name;\r\n this.switchNavigationTab(newActiveTab);\r\n this.scrollToNavigationTab(newActiveTab);\r\n }\r\n\r\n return newActiveTabCatName;\r\n }\r\n\r\n public getFirstNavigationTab(): HTMLElement {\r\n if (this.navigationTabsArray && this.navigationTabsArray.length > 0) {\r\n const firstTab: NavigationTabTs = this.navigationTabsArray[0];\r\n\r\n return firstTab.domNode;\r\n }\r\n\r\n return;\r\n }\r\n }\r\n}","export module MPCCallLimiter {\r\n export abstract class CallLimiter {\r\n static debounce(callback: Function, delay: number, immediate: boolean = false): Function {\r\n let timer: number;\r\n return function () {\r\n const context = this;\r\n const args: IArguments = arguments;\r\n\r\n const delayedCall: Function = function () {\r\n timer = null;\r\n if (!immediate) {\r\n callback.apply(context, args);\r\n }\r\n };\r\n\r\n const instantCall: boolean = immediate && !timer;\r\n clearTimeout(timer);\r\n timer = setTimeout(delayedCall, delay);\r\n\r\n if (instantCall) {\r\n callback.apply(context, args);\r\n }\r\n };\r\n }\r\n\r\n static throttle(callback: Function, interval: number, leadCall: boolean = true, trailCall: boolean = true): Function {\r\n let blockExecution = leadCall;\r\n let resetTimer: Timer;\r\n\r\n return function () {\r\n const context = this;\r\n const args: IArguments = arguments;\r\n\r\n if (leadCall && !resetTimer) {\r\n callback.apply(context, args);\r\n blockExecution = false;\r\n\r\n if (!trailCall) {\r\n resetTimer = setTimeout(function () {\r\n resetTimer = null;\r\n }, interval);\r\n }\r\n }\r\n\r\n if (!blockExecution && trailCall) {\r\n blockExecution = true;\r\n\r\n setTimeout(function () {\r\n callback.apply(context, args);\r\n blockExecution = false;\r\n }, interval);\r\n\r\n clearTimeout(resetTimer);\r\n resetTimer = setTimeout(function () {\r\n resetTimer = null;\r\n }, interval + 250);\r\n }\r\n };\r\n }\r\n }\r\n\r\n type Timer = ReturnType;\r\n}\r\n","import { ProductComparisonModel } from \"../../../../DomainObjects/Dtos/Product.generated\";\r\n\r\nexport module MPCComparePageButtonUrlUpdater {\r\n export class ComparePageButtonUrlUpdater {\r\n private static _instance: ComparePageButtonUrlUpdater;\r\n private scope: HTMLElement;\r\n private comparisonPageBaseUri: string;\r\n\r\n public init(scope: HTMLElement): void {\r\n this.scope = scope;\r\n this.comparisonPageBaseUri = scope.getAttribute('data-comparisonpage-baseurl');\r\n }\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private _comparePageUrl:string = \"\";\r\n get ComparePageUrl():string {\r\n return this._comparePageUrl;\r\n }\r\n\r\n public onUpdatedModel(model : ProductComparisonModel): void {\r\n let result: string = \"\";\r\n\r\n if(model && model.activeNavigationTab) {\r\n const activeNavigationTab = model.activeNavigationTab;\r\n\r\n let comparisonPageUri: string = '?category=' + encodeURIComponent(activeNavigationTab);\r\n\r\n for (const storageProduct of model.products) {\r\n if (storageProduct.categoryName === activeNavigationTab) {\r\n comparisonPageUri = comparisonPageUri + '&savKeys=' + storageProduct.articleId.salesArticleVariantKey;\r\n }\r\n }\r\n\r\n result = comparisonPageUri;\r\n }\r\n\r\n if(!this.scope || this.scope === null) {\r\n // get root mpc place holder:\r\n this.scope = document.querySelector('.pcf-scope');\r\n this.comparisonPageBaseUri = this.scope.getAttribute('data-comparisonpage-baseurl');\r\n }\r\n\r\n this._comparePageUrl = this.comparisonPageBaseUri+result;\r\n\r\n if (this.scope) {\r\n const links = this.scope.querySelectorAll(\".comparison-page-link\");\r\n\r\n for (let link of links) {\r\n link.setAttribute('href', this._comparePageUrl);\r\n }\r\n }\r\n }\r\n }\r\n}","export module MPCDeviceDetectionHelper {\r\n export class DeviceDetectionHelper {\r\n private static _instance: DeviceDetectionHelper;\r\n private isTabletHandHeldDeviceEnvironment: boolean;\r\n private isMobileShopEnvironment: boolean;\r\n private isMicrosoftBrowserEnvironment: boolean;\r\n private sniffJson: HTMLElement;\r\n\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n private init(): void {\r\n this.isTabletHandHeldDeviceEnvironment = \r\n document.documentElement.className.indexOf('tablet') >= 0 || document.documentElement.className.indexOf('handheld') >= 0;\r\n\r\n this.isMobileShopEnvironment = \r\n document.documentElement.className.indexOf('mobileshop') >= 0;\r\n\r\n this.isMicrosoftBrowserEnvironment =\r\n document.documentElement.classList.contains(\"isMsie\") || document.documentElement.classList.contains(\"isEdge\");\r\n\r\n this.sniffJson = document.getElementById(\"sniff\");\r\n if (!this.sniffJson)\r\n return;\r\n\r\n const sniffJsonResult = JSON.parse(this.sniffJson.innerHTML);\r\n let resultingClasses: string = '';\r\n if (sniffJsonResult.isTablet) {\r\n document.body.dataset.cap = \"IsHandheld=true,IsLowendDevice=false\";\r\n resultingClasses += ' tablet';\r\n }\r\n if (sniffJsonResult.isPhone) \r\n resultingClasses = ' phone';\r\n if (sniffJsonResult.isHandheld) \r\n resultingClasses += ' handheld';\r\n if (sniffJsonResult.isAndroid) \r\n resultingClasses += ' android';\r\n if (sniffJsonResult.isIOS) \r\n resultingClasses += ' ios';\r\n if (!resultingClasses)\r\n return;\r\n\r\n const htmlClasses: string = document.documentElement.className;\r\n document.documentElement.className = htmlClasses.replace('desktop', resultingClasses);\r\n\r\n if (sniffJsonResult.isMsie)\r\n document.documentElement.classList.add('isMsie');\r\n if (sniffJsonResult.isEdge)\r\n document.documentElement.classList.add('isEdge');\r\n }\r\n\r\n public isTabletHandHeldDevice(): boolean {\r\n return this.isTabletHandHeldDeviceEnvironment;\r\n }\r\n\r\n public isMobileShop(): boolean {\r\n return this.isMobileShopEnvironment;\r\n }\r\n\r\n public isMicrosoftBrowser(): boolean {\r\n return this.isMicrosoftBrowserEnvironment;\r\n }\r\n\r\n // removed because of ESPP-4706\r\n // public adaptLegacySniff(): void {\r\n // const deviceDetector = new DeviceDetector();\r\n // const device: DeviceDetector.DeviceDetectorResult = \r\n // deviceDetector.parse(window.navigator.userAgent);\r\n\r\n // let resultingClasses: string = '';\r\n // let sniffResult: string = '{';\r\n\r\n // if (device.device.type === 'desktop')\r\n // sniffResult += '\"isDesktop\": true';\r\n // else \r\n // sniffResult += '\"isDesktop\": false';\r\n\r\n // if (device.device.type === 'tablet') {\r\n // document.body.dataset.cap = \"IsHandheld=true,IsLowendDevice=false\";\r\n // resultingClasses = 'tablet';\r\n // sniffResult += ', \"isTablet\": true';\r\n // }\r\n // else \r\n // sniffResult += ', \"isTablet\": false';\r\n\r\n // if (device.device.model === 'iPad')\r\n // sniffResult += ', \"isIPad\": true';\r\n // else \r\n // sniffResult += ', \"isIPad\": false';\r\n \r\n // sniffResult += '}';\r\n\r\n // if (resultingClasses) {\r\n // const htmlClasses: string = document.documentElement.className;\r\n // document.documentElement.className = htmlClasses.replace('desktop', resultingClasses);\r\n // }\r\n\r\n // this.sniffJson.innerHTML = sniffResult;\r\n // }\r\n }\r\n}","import { MPCIEventBus } from \"../typings/iEventBus\";\r\n\r\nexport module MPCEventBus {\r\n import IEventBus = MPCIEventBus.IEventBus;\r\n import EventName = MPCIEventBus.EventName;\r\n import CallbackLists = MPCIEventBus.CallbackLists;\r\n import ICallback = MPCIEventBus.ICallback;\r\n import ISubscription = MPCIEventBus.ISubscription;\r\n import ISubscriptionId = MPCIEventBus.ISubscriptionId;\r\n\r\n export class EventBus implements IEventBus {\r\n private static _instance: EventBus;\r\n private callbackLists: CallbackLists;\r\n\r\n private constructor() {\r\n this.callbackLists = [];\r\n }\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n subscribe(eventName: EventName | EventName[], callback: ICallback): ISubscriptionId[] {\r\n if (this.isArray(eventName)) {\r\n const subscriptionsIds: ISubscriptionId[] = [];\r\n\r\n for (const message of eventName) {\r\n subscriptionsIds.push(this.createSubscription(message, callback));\r\n }\r\n\r\n return subscriptionsIds;\r\n } else {\r\n return [this.createSubscription(eventName, callback)];\r\n }\r\n }\r\n\r\n subscribeMultiple(subscriptions: ISubscription[]): ISubscriptionId[] {\r\n const subscriptionIds: ISubscriptionId[] = [];\r\n\r\n if (!subscriptions) {\r\n return subscriptionIds;\r\n }\r\n\r\n for (const subscription of subscriptions) {\r\n const subscriptionId: ISubscriptionId = this.addSubscription(subscription);\r\n\r\n subscriptionIds.push(subscriptionId);\r\n }\r\n return subscriptionIds;\r\n }\r\n\r\n unsubscribe(subscriptionId: ISubscriptionId | ISubscriptionId[]): void {\r\n if (this.isArray(subscriptionId)) {\r\n this.unSubscribeMultiple(subscriptionId);\r\n } else {\r\n this.removeSubscription(subscriptionId);\r\n }\r\n }\r\n\r\n publish(eventName: EventName, payload?: any): void {\r\n if (!this.callbackLists[eventName]) {\r\n return;\r\n }\r\n\r\n // to prevent to also iterate over subscriptions, which are created while iterating\r\n const callbacksClone: ICallback[] = this.callbackLists[eventName].slice(0);\r\n for (const callback of callbacksClone) {\r\n if (callback) {\r\n callback(payload);\r\n }\r\n }\r\n }\r\n\r\n private createSubscription(eventName: EventName, callback: ICallback): ISubscriptionId {\r\n return this.addSubscription({\r\n eventName: eventName,\r\n callback: callback\r\n });\r\n }\r\n\r\n private addSubscription(subscription: ISubscription): ISubscriptionId {\r\n if (!this.callbackLists[subscription.eventName]) {\r\n this.callbackLists[subscription.eventName] = [];\r\n }\r\n\r\n const subscriptionId: ISubscriptionId = {\r\n eventName: subscription.eventName,\r\n id: (this.callbackLists[subscription.eventName].push(subscription.callback)) - 1\r\n };\r\n\r\n return subscriptionId;\r\n }\r\n\r\n private unSubscribeMultiple(subscriptionIds: ISubscriptionId[]): void {\r\n for (const subscriptionId of subscriptionIds) {\r\n this.removeSubscription(subscriptionId);\r\n }\r\n }\r\n\r\n private removeSubscription(subscriptionId: ISubscriptionId): void {\r\n const subscription: ICallback = this.callbackLists[subscriptionId.eventName][subscriptionId.id];\r\n if (subscription) {\r\n this.callbackLists[subscriptionId.eventName][subscriptionId.id] = undefined;\r\n }\r\n }\r\n\r\n private isArray(element: any): element is any[] {\r\n return Array.isArray(element);\r\n }\r\n }\r\n}","export module MPCElementsHelper {\r\n export class HtmlElementsHelper {\r\n public static appendChildAtIndex(child: HTMLElement, index: number, parent: HTMLElement): void {\r\n if(index >= parent.children.length) {\r\n parent.appendChild(child);\r\n }\r\n else {\r\n parent.insertBefore(child, parent.children[index]);\r\n }\r\n }\r\n }\r\n}","//IE polyfills\r\nimport 'eligrey-classlist-js-polyfill';\r\nimport 'element-remove';\r\nif (typeof NodeList.prototype.forEach !== \"function\" && typeof Array.prototype.forEach === \"function\")\r\n NodeList.prototype.forEach = ((Array.prototype.forEach) as any);","export module MPCScrollLock {\r\n export class ScrollLock\r\n {\r\n private static _instance: ScrollLock;\r\n private bodyScrollPosition: number = 0;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n public lock(): void {\r\n const webContainer = document.querySelector('.container');\r\n const mobileContainer = document.querySelector('.page-container');\r\n this.bodyScrollPosition = window.pageYOffset;\r\n \r\n if (webContainer || mobileContainer)\r\n document.body.setAttribute(\r\n 'style',\r\n 'overflow: hidden !important; position: fixed !important; top: -' +\r\n this.bodyScrollPosition +\r\n 'px;'\r\n );\r\n }\r\n \r\n public unlock(): void {\r\n const webContainer = document.querySelector('.container');\r\n const mobileContainer = document.querySelector('.page-container');\r\n \r\n if (webContainer || mobileContainer) {\r\n document.body.removeAttribute('style');\r\n window.scrollTo(0, this.bodyScrollPosition);\r\n }\r\n }\r\n }\r\n}","export interface INlVanillajaxParams {\r\n query?: string;\r\n data?: any;\r\n url: string;\r\n contentType: ContentType;\r\n}\r\n\r\nexport enum ContentType {\r\n JSON,\r\n Plain\r\n}\r\n\r\nexport interface HtmlResult {\r\n Html: string;\r\n}\r\n\r\nexport class NlVanillajax {\r\n headers: any[];\r\n private params: INlVanillajaxParams;\r\n private req: XMLHttpRequest;\r\n\r\n constructor(params: INlVanillajaxParams) {\r\n this.headers = [\r\n { \"name\": \"Accept\", \"value\": \"text/html,application/json\" },\r\n { \"name\": \"Content-Type\", \"value\": \"application/json\" }\r\n ];\r\n this.params = params;\r\n this.params.query = params.query || \"\";\r\n this.params.data = params.data || null;\r\n this.params.contentType = params.contentType || ContentType.JSON;\r\n this.req = this.xhr(window);\r\n }\r\n\r\n post(callback: Function): NlVanillajax {\r\n this.open(this.req, \"POST\", this.params.url + (this.params.query.length ? \"?\" + this.params.query : \"\"));\r\n this.setHeaders(this.req, this.headers);\r\n this.onReadyStateChange(this.req, callback);\r\n this.send(this.req, this.params.data);\r\n\r\n return this;\r\n }\r\n\r\n postWithPromise(): Promise {\r\n let self = this;\r\n return new Promise(function (resolve, reject) {\r\n self.open(self.req, \"POST\", self.params.url + (self.params.query.length ? \"?\" + self.params.query : \"\"));\r\n self.setHeaders(self.req, self.headers);\r\n self.req.onload = function () {\r\n if (this.status >= 200 && this.status < 300) {\r\n let result = self.getResult(self.req);\r\n if (result)\r\n resolve(result);\r\n else\r\n reject({\r\n status: this.status,\r\n statusText: \"response not interpretable\"\r\n });\r\n } else {\r\n reject({\r\n status: this.status,\r\n statusText: self.req.statusText\r\n });\r\n }\r\n };\r\n self.req.onerror = function () {\r\n reject({\r\n status: this.status,\r\n statusText: self.req.statusText\r\n });\r\n };\r\n self.send(self.req, self.params.data);\r\n });\r\n }\r\n\r\n getWithPromise(): Promise {\r\n let self = this;\r\n return new Promise(function (resolve, reject) {\r\n self.open(self.req, \"GET\", self.params.url);\r\n self.setHeaders(self.req, self.headers);\r\n //self.req.withCredentials = true;\r\n self.req.onload = function () {\r\n if (this.status >= 200 && this.status < 300) {\r\n let result = self.getHtmlResult(self.req);\r\n if(result)\r\n resolve(result);\r\n else\r\n reject({\r\n status: this.status,\r\n statusText: \"response not interpretable\"\r\n });\r\n } else {\r\n reject({\r\n status: this.status,\r\n statusText: self.req.statusText\r\n });\r\n }\r\n };\r\n self.req.onerror = function () {\r\n reject({\r\n status: this.status,\r\n statusText: self.req.statusText\r\n });\r\n };\r\n self.sendGet(self.req);\r\n });\r\n }\r\n\r\n private xhr(win: any): XMLHttpRequest {\r\n return new win.XMLHttpRequest();\r\n }\r\n\r\n private open(req: XMLHttpRequest, method: string, url: string): any {\r\n req.open(method, url);\r\n\r\n return req;\r\n }\r\n\r\n private setHeaders(req: XMLHttpRequest, headers: any[]): XMLHttpRequest {\r\n headers.forEach(header => req.setRequestHeader(header.name, header.value));\r\n\r\n return req;\r\n }\r\n\r\n private onReadyStateChange(req: XMLHttpRequest, callback: Function): XMLHttpRequest {\r\n req.onreadystatechange = () => {\r\n\r\n if (req.readyState === XMLHttpRequest.DONE) {\r\n let result = this.getResult(req);\r\n\r\n callback(result, req.status);\r\n }\r\n }\r\n\r\n return req;\r\n }\r\n\r\n private getHtmlResult(req: XMLHttpRequest): HtmlResult {\r\n let json: HtmlResult;\r\n\r\n if (req.responseText) {\r\n json = { \"Html\": req.responseText };\r\n } else {\r\n json = null;\r\n }\r\n\r\n return json;\r\n }\r\n\r\n private getResult(req: XMLHttpRequest): T {\r\n let json: T;\r\n try {\r\n json = JSON.parse(req.responseText);\r\n } catch (e) {\r\n json = null;\r\n }\r\n\r\n return json;\r\n }\r\n\r\n private send(req: XMLHttpRequest, data: any): XMLHttpRequest {\r\n req.send(data);\r\n\r\n return req;\r\n }\r\n\r\n private sendGet(req: XMLHttpRequest): XMLHttpRequest {\r\n req.send();\r\n\r\n return req;\r\n }\r\n}","import { MPCNotificationService } from \"./PCF/notification-service\";\r\nimport { ProductComparisonModel, Product, NavigationTab } from \"../../../DomainObjects/Dtos/Product.generated\";\r\nimport { ErrorMessage } from \"../../Models/ErrorMessage.generated\";\r\nimport { NlVanillajax, INlVanillajaxParams } from \"./helpers/vanillajax\";\r\nimport { MPCComparePageButtonUrlUpdater } from \"./helpers/comparePageButtonUrlUpdater\";\r\nimport { MPCAddElementContext } from \"./typings/addElementContext\";\r\nimport { MPCErrorHandlerModule } from \"./errorhandler\";\r\nimport { MpcSettingsModule } from \"./helpers/MpcSettings\";\r\n\r\nexport module MPCLocalStorageService {\r\n import AddElementContext = MPCAddElementContext.AddElementContext;\r\n import NotificationService = MPCNotificationService.NotificationService;\r\n import ErrorHandlerManager = MPCErrorHandlerModule.ErrorHandlerManager;\r\n import ComparePageButtonUrlUpdater = MPCComparePageButtonUrlUpdater.ComparePageButtonUrlUpdater;\r\n import MpcSettings = MpcSettingsModule.MpcSettings;\r\n\r\n export enum AddResult {\r\n Added,\r\n Replaced,\r\n RejectedCapacity,\r\n RejectedDuplicate\r\n }\r\n\r\n export class ProductComparisonModelManager {\r\n private static _instance: ProductComparisonModelManager;\r\n private notificationService: NotificationService;\r\n private localStorageAbstraction: LocalStorageAbstraction;\r\n private localStorageCache: ProductComparisonModel;\r\n private runningServiceCall: Promise;\r\n private comparePageButtonUrlUpdater: ComparePageButtonUrlUpdater;\r\n private readonly DuplicateNotFound: number = -1;\r\n private readonly DuplicateExact: number = -2;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n this.init();\r\n }\r\n\r\n private init(): void {\r\n this.notificationService = NotificationService.instance;\r\n this.localStorageAbstraction = LocalStorageAbstraction.instance;\r\n this.localStorageCache = this.localStorageAbstraction.readLocalStorage();\r\n this.comparePageButtonUrlUpdater = ComparePageButtonUrlUpdater.instance;\r\n // here we load the model (from localStorage and with server-sync if deemed necessary) \r\n // for later usage by all the components\r\n this.getModel();\r\n }\r\n\r\n public getModel(): Promise {\r\n if (this.runningServiceCall) {\r\n // this service call is a singleton, avoid useless parallel calls \r\n return this.runningServiceCall;\r\n }\r\n this.runningServiceCall = new Promise((resolve, reject) => {\r\n try {\r\n this.localStorageCache = this.localStorageAbstraction.readLocalStorage();\r\n if (this.localStorageCache && this.localStorageCache.products.length > 0 \r\n && !this.localStorageCache.activeNavigationTab) {\r\n this.localStorageCache.activeNavigationTab = this.localStorageCache.products[0].categoryName;\r\n }\r\n if (this.localStorageCache && typeof this.localStorageCache.mobileEnabledCategories != \"object\") {\r\n this.localStorageCache.mobileEnabledCategories = [];\r\n }\r\n this.validateLocalStorage();\r\n } catch (err) {\r\n ErrorHandlerManager.instance.LogError({\r\n message: \"resetting mpc localStorage because: \" +\r\n err +\r\n \", localStorage: \" +\r\n JSON.stringify(this.localStorageCache)\r\n }); \r\n this.localStorageCache = undefined;\r\n }\r\n\r\n const isNewlyLoggedOut = !MpcSettings.instance.isLoggedIn && this.localStorageCache && !!this.localStorageCache.isLoggedIn;\r\n if (!this.localStorageCache || ProductComparisonModelManager.isTimedOut(this.localStorageCache) \r\n || isNewlyLoggedOut) {\r\n this.createNewLocalStorage();\r\n resolve(this.localStorageCache);\r\n return;\r\n }\r\n if (MpcSettings.instance.isLoggedIn && !this.localStorageCache.isLoggedIn) {\r\n this.localStorageCache.isLoggedInNewly = true;\r\n }\r\n this.localStorageCache.isLoggedIn = MpcSettings.instance.isLoggedIn;\r\n const needsValidation = this.needsValidation();\r\n if (!needsValidation) {\r\n if (this.localStorageCache.pageLanguage !== MpcSettings.instance.culture) { // if for logical readability :)\r\n this.localStorageCache.pageLanguage = MpcSettings.instance.culture;\r\n }\r\n \r\n this.onUpdatedModel(true);\r\n \r\n resolve(this.localStorageCache);\r\n return;\r\n }\r\n\r\n this.sync()\r\n .then((model)=>resolve(model))\r\n .catch((error)=>reject(error));\r\n });\r\n this.runningServiceCall.then((model) => {\r\n this.runningServiceCall = null;\r\n })\r\n return this.runningServiceCall;\r\n }\r\n\r\n private sync(): Promise {\r\n const printPageContent = this.localStorageCache.printPageContent;\r\n this.localStorageCache.printPageContent = null;\r\n\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\r\n 'Products/Sync';\r\n params.data = JSON.stringify(this.localStorageCache);\r\n\r\n const countBefore = this.localStorageCache.products.length;\r\n\r\n return new NlVanillajax(params).postWithPromise()\r\n .then((model) => {\r\n if (!model || !model.products) {\r\n this.localStorageCache.printPageContent = printPageContent;\r\n return Promise.reject(\"service returned no useful result\");\r\n //throw new Error(\"service returned no useful result\");\r\n }\r\n // false will not be send over the wire, but we don't want undefined values\r\n model.clearStoredEmptyNavigationTabs = !!model.clearStoredEmptyNavigationTabs;\r\n model.hasClientSideChange = false;\r\n this.localStorageCache = model;\r\n this.localStorageCache.printPageContent = printPageContent;\r\n this.onUpdatedModel(true); //skipSaving=true, because 'validate' saves internally\r\n const countAfter = model.products.length;\r\n if (countBefore === 0 && countAfter > 0) {\r\n this.setMobileHeaderMarkerOn();\r\n } else if (countBefore > 0 && countAfter === 0) {\r\n this.setMobileHeaderMarkerOff();\r\n }\r\n return this.localStorageCache;\r\n })\r\n .catch((err) => {\r\n this.localStorageCache.printPageContent = printPageContent;\r\n return Promise.reject(err);\r\n });\r\n }\r\n\r\n private validateLocalStorage(): void {\r\n //there were some problems with old/invalid localStorage contents, so we detect and reset them\r\n if (this.localStorageCache) {\r\n if (!Array.isArray(this.localStorageCache.products))\r\n throw \"localStorage is corrupted - products is no array\";\r\n if (!this.localStorageCache.lastUpdateTime)\r\n throw \"localStorage is corrupted - lastUpdateTime is not set\";\r\n if (typeof this.localStorageCache.lastUpdateTime !== \"number\")\r\n throw \"localStorage is corrupted - lastUpdateTime is no number\";\r\n if (this.localStorageCache.products.length > 0) {\r\n if (!this.localStorageCache.activeNavigationTab)\r\n throw \"localStorage is corrupted - activeNavigationTab is not set\";\r\n if (typeof this.localStorageCache.activeNavigationTab !== \"string\")\r\n throw \"localStorage is corrupted - activeNavigationTab is no string\";\r\n }\r\n if (!this.localStorageCache.pageLanguage)\r\n throw \"localStorage is corrupted - pageLanguage is not set\";\r\n if (typeof this.localStorageCache.pageLanguage !== \"string\")\r\n throw \"localStorage is corrupted - pageLanguage is no string\";\r\n if (typeof this.localStorageCache.clearStoredEmptyNavigationTabs !== \"boolean\")\r\n throw \"localStorage is corrupted - clearStoredEmptyNavigationTabs is no boolean\";\r\n if (!Array.isArray(this.localStorageCache.emptyNavigationTabs))\r\n throw \"localStorage is corrupted - emptyNavigationTabs is no array\";\r\n if (this.localStorageCache.products.length > 0) {\r\n if (!this.localStorageCache.products[0].articleId.masterArticleNo) {\r\n throw \"localStorage is corrupted - products[0].articleId.masterArticleNo is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].articleId.salesArticleVariantKey) {\r\n throw \"localStorage is corrupted - products[0].articleId.salesArticleVariantKey is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].articleId.seoDescription) {\r\n throw \"localStorage is corrupted - products[0].articleId.seoDescription is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].articleId.seoSlug) {\r\n throw \"localStorage is corrupted - products[0].articleId.seoSlug is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].categoryName) {\r\n throw \"localStorage is corrupted - products[0].categoryName is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].categoryUrl) {\r\n throw \"localStorage is corrupted - products[0].categoryUrl is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].detailsPageUrl) {\r\n throw \"localStorage is corrupted - products[0].detailsPageUrl is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].mainImage) {\r\n throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].originNavigationKeyPath) {\r\n throw \"localStorage is corrupted - products[0].originNavigationKeyPath is not set\";\r\n }\r\n if (typeof this.localStorageCache.products[0].navigationOrder !== \"number\") {\r\n throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n }\r\n if (!this.localStorageCache.products[0].title) {\r\n throw \"localStorage is corrupted - products[0].mainImage is not set\";\r\n }\r\n }\r\n }\r\n }\r\n \r\n public setActiveNavigationTab(activeNavigationTab: string): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n if (this.localStorageCache.activeNavigationTab !== activeNavigationTab) {\r\n this.localStorageCache.activeNavigationTab = activeNavigationTab;\r\n this.onUpdatedModel(true); //don't save, who cares\r\n }\r\n }\r\n \r\n public activateOnMobileCategory(categoryNavKey: string): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n this.localStorageCache.mobileEnabledCategories.push(categoryNavKey);\r\n this.onUpdatedModel(true);//dont save, who cares\r\n }\r\n\r\n public isActivatedOnMobileCategory(categoryNavKey: string): boolean {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n return this.localStorageCache.mobileEnabledCategories &&\r\n this.localStorageCache.mobileEnabledCategories.indexOf(categoryNavKey) >= 0;\r\n }\r\n\r\n public deactivateOnMobileCategory(categoryNavKey: string): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n const idx = this.localStorageCache.mobileEnabledCategories.indexOf(categoryNavKey);\r\n this.localStorageCache.mobileEnabledCategories.splice(idx, idx >= 0 ? 1 : 0);\r\n this.onUpdatedModel(true);//dont save, who cares\r\n }\r\n\r\n public addProduct(product: Product): AddResult {\r\n if (this.localStorageCache) {\r\n this.setActiveNavigationTab(product.categoryName);\r\n\r\n const duplicateCheckResult = this.checkDuplicateProductPerCategory(\r\n product.articleId.salesArticleVariantKey,\r\n product.categoryName,\r\n product.articleId.masterArticleNo\r\n );\r\n if (duplicateCheckResult === this.DuplicateNotFound && this.isAlreadyAtLimit(product.categoryName)) {\r\n this.notificationService.notifyMaximumProductsCountReached();\r\n return AddResult.RejectedCapacity;\r\n }\r\n \r\n if (duplicateCheckResult === this.DuplicateNotFound) {\r\n this.appendProductToList(product, false);\r\n return AddResult.Added;\r\n }\r\n else {\r\n if (duplicateCheckResult !== this.DuplicateExact) {\r\n this.localStorageCache.products[duplicateCheckResult] = product;\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n }\r\n\r\n // just show new product notification, because product is already added:\r\n this.notificationService.notifyNewProductAdded(product.title, product.mainImage, product.altTag);\r\n\r\n if (duplicateCheckResult !== this.DuplicateExact) {\r\n return AddResult.Replaced;\r\n } else {\r\n return AddResult.RejectedDuplicate;\r\n }\r\n }\r\n }\r\n else {\r\n this.createNewLocalStorage();\r\n\r\n this.appendProductToList(product, false);\r\n\r\n return AddResult.Added;\r\n }\r\n }\r\n\r\n private onUpdatedModel(skipSaving: boolean): Promise {\r\n return new Promise((resolve, reject) => {\r\n const afterSave = (model: ProductComparisonModel) => {\r\n this.comparePageButtonUrlUpdater.onUpdatedModel(model);\r\n this.localStorageAbstraction.writeLocalStorage(model);\r\n }\r\n\r\n if (!skipSaving && this.localStorageCache.isLoggedIn) {\r\n this.sync()\r\n .then((syncedModel) => {\r\n afterSave(syncedModel);\r\n resolve(syncedModel);\r\n })\r\n .catch((error) => {\r\n reject(error);\r\n });\r\n } else {\r\n afterSave(this.localStorageCache);\r\n }\r\n });\r\n }\r\n\r\n public removeAllProductsOfCategory(categoryName: string): Promise {\r\n return new Promise((resolve, reject) => {\r\n let articleRemoved: boolean = false;\r\n const productsAfter: Product[] = [];\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const tmpProduct: Product = this.localStorageCache.products[i];\r\n if (tmpProduct.categoryName !== categoryName) {\r\n productsAfter.push(tmpProduct);\r\n } else {\r\n articleRemoved = true;\r\n }\r\n }\r\n if (productsAfter.length == 0) {\r\n //unmarks when removing the last\r\n this.setMobileHeaderMarkerOff();\r\n }\r\n\r\n this.localStorageCache.products = productsAfter;\r\n if (this.localStorageCache.products.length > 0) {\r\n this.setActiveNavigationTab(this.localStorageCache.products[0].categoryName);\r\n } else {\r\n this.setActiveNavigationTab(null);\r\n }\r\n\r\n if (articleRemoved) {\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n }\r\n });\r\n }\r\n \r\n private setMobileHeaderMarkerOn(): void {\r\n if (window.shell)\r\n window.shell.publishTo('ESMKT.MegaMenu.MarkItem', \"mpc\");\r\n }\r\n\r\n private setMobileHeaderMarkerOff(): void {\r\n if (window.shell)\r\n window.shell.publishTo('ESMKT.MegaMenu.UnmarkItem', \"mpc\");\r\n }\r\n\r\n public removeProduct(categoryName: string, salesArticleVariantKey: string): Product {\r\n let articleRemoved: Product = null;\r\n\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const tmpProduct: Product = this.localStorageCache.products[i];\r\n\r\n if (tmpProduct.articleId.salesArticleVariantKey === salesArticleVariantKey\r\n && tmpProduct.categoryName === categoryName) {\r\n this.localStorageCache.products.splice(i, 1);\r\n //unmarks when removing the last\r\n if (this.localStorageCache.products.length === 0) {\r\n this.setMobileHeaderMarkerOff();\r\n }\r\n articleRemoved = tmpProduct;\r\n\r\n break;\r\n }\r\n }\r\n if (!this.localStorageCache.products.some(p => p.categoryName === categoryName)) {\r\n if (this.localStorageCache.products.length > 0) {\r\n this.setActiveNavigationTab(this.localStorageCache.products[0].categoryName);\r\n } else {\r\n this.setActiveNavigationTab(null);\r\n }\r\n }\r\n\r\n if (articleRemoved) {\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n }\r\n\r\n return articleRemoved;\r\n }\r\n \r\n public addProductBySavKey(salesArticleVariantKey: string, seoSlug: string, origin: string, originNavKeyPathOverride: string = undefined): Promise {\r\n const context: AddElementContext = new class implements AddElementContext {\r\n salesArticleVariantKey: string;\r\n originSeoSlug: string;\r\n origin: string;\r\n };\r\n\r\n context.salesArticleVariantKey = salesArticleVariantKey;\r\n context.originSeoSlug = seoSlug;\r\n context.origin = origin;\r\n\r\n // Call controller method, via ajax, and get image and text info from MPC\r\n let params: INlVanillajaxParams = {};\r\n params.url = MpcSettingsModule.MpcSettings.instance.apiUrl +\"Products/GetProductInfo\";\r\n params.data = JSON.stringify(context);\r\n\r\n let nlVanillajax = new NlVanillajax(params);\r\n let postWithPromise = nlVanillajax.postWithPromise();\r\n\r\n postWithPromise.then((productDataFromService: Product) => {\r\n if (productDataFromService) {\r\n if (originNavKeyPathOverride) {\r\n productDataFromService.originNavigationKeyPath = originNavKeyPathOverride;\r\n }\r\n this.appendProductToList(productDataFromService, true);\r\n }\r\n })\r\n .catch((err) => {\r\n ErrorHandlerManager.instance.LogError({\r\n message: \"error getting product info because: \" +\r\n err +\r\n \", salesArticleVariantKey: \" +\r\n salesArticleVariantKey\r\n }); \r\n });\r\n\r\n return postWithPromise;\r\n }\r\n\r\n private checkDuplicateProductPerCategory(salesArticleVariantKey: string, categoryName: string, masterArticleNo: number): number {\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const product: Product = this.localStorageCache.products[i];\r\n\r\n // avoid duplicate products\r\n if (product.articleId.masterArticleNo === masterArticleNo\r\n && product.categoryName === categoryName) {\r\n if (product.articleId.salesArticleVariantKey === salesArticleVariantKey) {\r\n return this.DuplicateExact;\r\n } else {\r\n return i; //same MaNo but different SavKey -> this product will be replaced by the new variant\r\n }\r\n }\r\n }\r\n\r\n return this.DuplicateNotFound;\r\n }\r\n\r\n private isAlreadyAtLimit(categoryName: string): boolean {\r\n let productsAmount: number = 0;\r\n let result: boolean = false;\r\n\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const product: Product = this.localStorageCache.products[i];\r\n\r\n // avoid more then 4 products per category\r\n if (product.categoryName === categoryName) {\r\n productsAmount++;\r\n\r\n if (productsAmount === MpcSettings.instance.maxProducts) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n \r\n private createNewLocalStorage(): void {\r\n const localStorageModel = {} as ProductComparisonModel;\r\n localStorageModel.products = new Array();\r\n localStorageModel.emptyNavigationTabs = new Array();\r\n localStorageModel.clearStoredEmptyNavigationTabs = false;\r\n localStorageModel.activeNavigationTab = null;\r\n localStorageModel.pageLanguage = MpcSettings.instance.culture;\r\n localStorageModel.hasClientSideChange = false;\r\n localStorageModel.lastUpdateTime = new Date().getTime(); // we define an empty model to be synced\r\n localStorageModel.isLoggedIn = MpcSettings.instance.isLoggedIn;\r\n localStorageModel.mobileEnabledCategories = [];\r\n localStorageModel.mobileLockedColumnIndex = null;\r\n localStorageModel.mobileCarouselScrollIndex = null;\r\n localStorageModel.usedNavTabForCarouselOrLockedColumn = null;\r\n localStorageModel.printPageContent = null;\r\n this.localStorageCache = localStorageModel;\r\n this.onUpdatedModel(false);\r\n }\r\n\r\n private needsValidation(): boolean {\r\n if (this.localStorageCache.isLoggedIn || MpcSettings.instance.isLoggedIn) return true;\r\n const noProducts = this.localStorageCache.products.length === 0;\r\n if (noProducts) return false;\r\n const languageWasSwitched = this.localStorageCache.pageLanguage !== MpcSettings.instance.culture;\r\n if (languageWasSwitched) return true;\r\n const expiration5MinutesAfterLastUpdate = new Date(this.localStorageCache.lastUpdateTime+(1000*60*5));\r\n const olderThan5Minutes = new Date().getTime() > expiration5MinutesAfterLastUpdate.getTime();\r\n return olderThan5Minutes;\r\n }\r\n\r\n private static isTimedOut(model: ProductComparisonModel): boolean {\r\n const expirationDate = new Date(model.lastUpdateTime + (1000 * 60 * 60 * 24 * 30));\r\n return new Date().getTime() > expirationDate.getTime();\r\n }\r\n\r\n private appendProductToList(product: Product, avoidNotification: boolean): void {\r\n this.localStorageCache.products.push(product);\r\n this.localStorageCache.hasClientSideChange = true;\r\n this.onUpdatedModel(false);\r\n\r\n if(!avoidNotification)\r\n this.notificationService.notifyNewProductAdded(product.title, product.mainImage, product.altTag);\r\n\r\n // it should only mark when adding the first article\r\n if (this.localStorageCache.products.length === 1) {\r\n this.setMobileHeaderMarkerOn();\r\n }\r\n }\r\n \r\n public checkIsProductAlreadyAdded(salesArticleVariantKey: string): boolean {\r\n let productExists: boolean = false;\r\n\r\n if (window.localStorage) {\r\n\r\n if (this.localStorageCache) {\r\n for (let i = 0; i < this.localStorageCache.products.length; i++) {\r\n const tmpProduct: Product = this.localStorageCache.products[i];\r\n\r\n if (tmpProduct.articleId.salesArticleVariantKey == salesArticleVariantKey) {\r\n productExists = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return productExists;\r\n }\r\n\r\n public storeEmptyNavigationTab(categoryName: string, navigationOrder: number): void {\r\n if(!this.localStorageCache.emptyNavigationTabs) {\r\n this.localStorageCache.emptyNavigationTabs = new Array();\r\n }\r\n\r\n let emptyNavigationTab: NavigationTab = {} as NavigationTab;\r\n emptyNavigationTab.name = categoryName;\r\n emptyNavigationTab.navigationOrder = navigationOrder;\r\n\r\n this.localStorageCache.emptyNavigationTabs.push(emptyNavigationTab);\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public removeStoredEmptyNavigationTabs(): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n this.localStorageCache.emptyNavigationTabs = new Array();\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public setClearStoredEmptyNavigationTabs(clearStoredEmptyNavigationTabs: boolean): void {\r\n if(!this.localStorageCache)\r\n this.getModel();\r\n\r\n this.localStorageCache.clearStoredEmptyNavigationTabs = clearStoredEmptyNavigationTabs;\r\n this.onUpdatedModel(true); //don't save, who cares\r\n }\r\n\r\n public getCarouselScrollIndex(): number {\r\n if (!this.localStorageCache) {\r\n this.getModel();\r\n }\r\n\r\n const currentCatName: string = this.getCurrentCategoryName();\r\n if (!this.localStorageCache.usedNavTabForCarouselOrLockedColumn || currentCatName != this.localStorageCache.usedNavTabForCarouselOrLockedColumn) {\r\n this.clearLockedColumnIndex();\r\n this.clearCarouselScrollIndex();\r\n }\r\n\r\n return this.localStorageCache.mobileCarouselScrollIndex;\r\n }\r\n\r\n public clearCarouselScrollIndex(): void {\r\n this.localStorageCache.mobileCarouselScrollIndex = null;\r\n this.localStorageCache.usedNavTabForCarouselOrLockedColumn = null;\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public storeCarouselScrollIndex(value: number): void {\r\n this.localStorageCache.mobileCarouselScrollIndex = value;\r\n this.localStorageCache.usedNavTabForCarouselOrLockedColumn = this.getCurrentCategoryName();\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public getLockedColumnIndex(): number {\r\n if (!this.localStorageCache) {\r\n this.getModel();\r\n }\r\n\r\n return this.localStorageCache.mobileLockedColumnIndex;\r\n }\r\n\r\n public clearLockedColumnIndex(): void {\r\n this.localStorageCache.mobileLockedColumnIndex = null;\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public storeLockedColumnIndex(value: number): void {\r\n this.localStorageCache.mobileLockedColumnIndex = value;\r\n this.localStorageCache.usedNavTabForCarouselOrLockedColumn = this.getCurrentCategoryName();\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n private getCurrentCategoryName(): string {\r\n const urlParams: URLSearchParams = new URLSearchParams(location.search);\r\n return urlParams.get('category');\r\n }\r\n\r\n public storePrintPageContent(content: HTMLElement): void {\r\n this.localStorageCache.printPageContent = content.outerHTML;\r\n this.localStorageAbstraction.writeLocalStorage(this.localStorageCache);\r\n }\r\n\r\n public getPrintPageContentCached(): string {\r\n //there was a race condition with a Sync call, but we dont need to wait for server sync really\r\n const modelDirectlyFromLocalStorage = this.localStorageAbstraction.readLocalStorage();\r\n if (!modelDirectlyFromLocalStorage) return null;\r\n return modelDirectlyFromLocalStorage.printPageContent;\r\n }\r\n }\r\n\r\n export class LocalStorageAbstraction {\r\n private static _instance: LocalStorageAbstraction;\r\n public unsupported: boolean = true;\r\n\r\n static get instance() {\r\n return this._instance || (this._instance = new this());\r\n }\r\n\r\n constructor() {\r\n if (!window.localStorage) {\r\n //ErrorHandlerManager.instance.LogError({ message: \"localStorage not supported\" });\r\n //TODO user notification\r\n } else {\r\n this.unsupported = false;\r\n }\r\n }\r\n\r\n public writeLocalStorage(localStorage: ProductComparisonModel): void {\r\n if (this.unsupported) return;\r\n const tmpLocalStorageObject: string = JSON.stringify(localStorage);\r\n window.localStorage.setItem(MpcSettings.instance.mpcLocalStorageKey, tmpLocalStorageObject);\r\n }\r\n\r\n public readLocalStorage(): ProductComparisonModel {\r\n if (this.unsupported) return null;\r\n const mpcLocalStorageJson = window.localStorage.getItem(MpcSettings.instance.mpcLocalStorageKey);\r\n if (mpcLocalStorageJson) {\r\n return JSON.parse(mpcLocalStorageJson);\r\n }\r\n return null;\r\n }\r\n }\r\n}","// Axios v1.7.7 Copyright (c) 2024 Matt Zabriskie and contributors\n'use strict';\n\nfunction bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n};\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n};\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n};\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\nconst [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n };\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n};\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n};\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n};\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n};\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n};\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n};\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n};\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n};\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n let ret;\n if ((ret = reducer(descriptor, name, obj)) !== false) {\n reducedDescriptors[name] = ret || descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n};\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n};\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n };\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n};\n\nconst noop = () => {};\n\nconst toFiniteNumber = (value, defaultValue) => {\n return value != null && Number.isFinite(value = +value) ? value : defaultValue;\n};\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz';\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n};\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0];\n }\n\n return str;\n};\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n };\n\n return visit(obj, 0);\n};\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\n// original code\n// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34\n\nconst _setImmediate = ((setImmediateSupported, postMessageSupported) => {\n if (setImmediateSupported) {\n return setImmediate;\n }\n\n return postMessageSupported ? ((token, callbacks) => {\n _global.addEventListener(\"message\", ({source, data}) => {\n if (source === _global && data === token) {\n callbacks.length && callbacks.shift()();\n }\n }, false);\n\n return (cb) => {\n callbacks.push(cb);\n _global.postMessage(token, \"*\");\n }\n })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);\n})(\n typeof setImmediate === 'function',\n isFunction(_global.postMessage)\n);\n\nconst asap = typeof queueMicrotask !== 'undefined' ?\n queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);\n\n// *********************\n\nvar utils$1 = {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isReadableStream,\n isRequest,\n isResponse,\n isHeaders,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable,\n setImmediate: _setImmediate,\n asap\n};\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n if (response) {\n this.response = response;\n this.status = response.status ? response.status : null;\n }\n}\n\nutils$1.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils$1.toJSONObject(this.config),\n code: this.code,\n status: this.status\n };\n }\n});\n\nconst prototype$1 = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype$1, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype$1);\n\n utils$1.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\n// eslint-disable-next-line strict\nvar httpAdapter = null;\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils$1.isPlainObject(thing) || utils$1.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils$1.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils$1.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils$1.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils$1.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);\n\n if (!utils$1.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils$1.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils$1.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils$1.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils$1.isArray(value) && isFlatArray(value)) ||\n ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils$1.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils$1.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils$1.forEach(value, function each(el, key) {\n const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils$1.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode$1(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode$1);\n } : encode$1;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nfunction buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils$1.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils$1.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nvar InterceptorManager$1 = InterceptorManager;\n\nvar transitionalDefaults = {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n\nvar URLSearchParams$1 = typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n\nvar FormData$1 = typeof FormData !== 'undefined' ? FormData : null;\n\nvar Blob$1 = typeof Blob !== 'undefined' ? Blob : null;\n\nvar platform$1 = {\n isBrowser: true,\n classes: {\n URLSearchParams: URLSearchParams$1,\n FormData: FormData$1,\n Blob: Blob$1\n },\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n\nconst hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';\n\nconst _navigator = typeof navigator === 'object' && navigator || undefined;\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst hasStandardBrowserEnv = hasBrowserEnv &&\n (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\nconst hasStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\nconst origin = hasBrowserEnv && window.location.href || 'http://localhost';\n\nvar utils = /*#__PURE__*/Object.freeze({\n __proto__: null,\n hasBrowserEnv: hasBrowserEnv,\n hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,\n hasStandardBrowserEnv: hasStandardBrowserEnv,\n navigator: _navigator,\n origin: origin\n});\n\nvar platform = {\n ...utils,\n ...platform$1\n};\n\nfunction toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils$1.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils$1.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n\n if (name === '__proto__') return true;\n\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils$1.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils$1.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils$1.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils$1.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {\n const obj = {};\n\n utils$1.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils$1.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils$1.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http', 'fetch'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils$1.isObject(data);\n\n if (isObjectPayload && utils$1.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils$1.isFormData(data);\n\n if (isFormData) {\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils$1.isArrayBuffer(data) ||\n utils$1.isBuffer(data) ||\n utils$1.isStream(data) ||\n utils$1.isFile(data) ||\n utils$1.isBlob(data) ||\n utils$1.isReadableStream(data)\n ) {\n return data;\n }\n if (utils$1.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils$1.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {\n return data;\n }\n\n if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*',\n 'Content-Type': undefined\n }\n }\n};\n\nutils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {\n defaults.headers[method] = {};\n});\n\nvar defaults$1 = defaults;\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils$1.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nvar parseHeaders = rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils$1.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils$1.isString(value)) return;\n\n if (utils$1.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils$1.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils$1.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils$1.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils$1.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite);\n } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else if (utils$1.isHeaders(header)) {\n for (const [key, value] of header.entries()) {\n setHeader(value, key, rewrite);\n }\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils$1.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils$1.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils$1.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils$1.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils$1.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils$1.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils$1.forEach(this, (value, header) => {\n const key = utils$1.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils$1.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\n// reserved names hotfix\nutils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {\n let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`\n return {\n get: () => value,\n set(headerValue) {\n this[mapped] = headerValue;\n }\n }\n});\n\nutils$1.freezeMethods(AxiosHeaders);\n\nvar AxiosHeaders$1 = AxiosHeaders;\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nfunction transformData(fns, response) {\n const config = this || defaults$1;\n const context = response || config;\n const headers = AxiosHeaders$1.from(context.headers);\n let data = context.data;\n\n utils$1.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n\nfunction isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils$1.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nfunction settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n\nfunction parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\n/**\n * Throttle decorator\n * @param {Function} fn\n * @param {Number} freq\n * @return {Function}\n */\nfunction throttle(fn, freq) {\n let timestamp = 0;\n let threshold = 1000 / freq;\n let lastArgs;\n let timer;\n\n const invoke = (args, now = Date.now()) => {\n timestamp = now;\n lastArgs = null;\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n fn.apply(null, args);\n };\n\n const throttled = (...args) => {\n const now = Date.now();\n const passed = now - timestamp;\n if ( passed >= threshold) {\n invoke(args, now);\n } else {\n lastArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n timer = null;\n invoke(lastArgs);\n }, threshold - passed);\n }\n }\n };\n\n const flush = () => lastArgs && invoke(lastArgs);\n\n return [throttled, flush];\n}\n\nconst progressEventReducer = (listener, isDownloadStream, freq = 3) => {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return throttle(e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e,\n lengthComputable: total != null,\n [isDownloadStream ? 'download' : 'upload']: true\n };\n\n listener(data);\n }, freq);\n};\n\nconst progressEventDecorator = (total, throttled) => {\n const lengthComputable = total != null;\n\n return [(loaded) => throttled[0]({\n lengthComputable,\n total,\n loaded\n }), throttled[1]];\n};\n\nconst asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args));\n\nvar isURLSameOrigin = platform.hasStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover its components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n\nvar cookies = platform.hasStandardBrowserEnv ?\n\n // Standard browser envs support document.cookie\n {\n write(name, value, expires, path, domain, secure) {\n const cookie = [name + '=' + encodeURIComponent(value)];\n\n utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());\n\n utils$1.isString(path) && cookie.push('path=' + path);\n\n utils$1.isString(domain) && cookie.push('domain=' + domain);\n\n secure === true && cookie.push('secure');\n\n document.cookie = cookie.join('; ');\n },\n\n read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n }\n\n :\n\n // Non-standard browser env (web workers, react-native) lack needed support.\n {\n write() {},\n read() {\n return null;\n },\n remove() {}\n };\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nfunction isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nfunction combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/?\\/$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nfunction buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nfunction mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {\n return utils$1.merge.call({caseless}, target, source);\n } else if (utils$1.isPlainObject(source)) {\n return utils$1.merge({}, source);\n } else if (utils$1.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils$1.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils$1.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n withXSRFToken: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n\nvar resolveConfig = (config) => {\n const newConfig = mergeConfig({}, config);\n\n let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;\n\n newConfig.headers = headers = AxiosHeaders$1.from(headers);\n\n newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer);\n\n // HTTP basic authentication\n if (auth) {\n headers.set('Authorization', 'Basic ' +\n btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))\n );\n }\n\n let contentType;\n\n if (utils$1.isFormData(data)) {\n if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {\n headers.setContentType(undefined); // Let the browser set it\n } else if ((contentType = headers.getContentType()) !== false) {\n // fix semicolon duplication issue for ReactNative FormData implementation\n const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];\n headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));\n }\n }\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n\n if (platform.hasStandardBrowserEnv) {\n withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));\n\n if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {\n // Add xsrf header\n const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);\n\n if (xsrfValue) {\n headers.set(xsrfHeaderName, xsrfValue);\n }\n }\n }\n\n return newConfig;\n};\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nvar xhrAdapter = isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n const _config = resolveConfig(config);\n let requestData = _config.data;\n const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();\n let {responseType, onUploadProgress, onDownloadProgress} = _config;\n let onCanceled;\n let uploadThrottled, downloadThrottled;\n let flushUpload, flushDownload;\n\n function done() {\n flushUpload && flushUpload(); // flush events\n flushDownload && flushDownload(); // flush events\n\n _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);\n\n _config.signal && _config.signal.removeEventListener('abort', onCanceled);\n }\n\n let request = new XMLHttpRequest();\n\n request.open(_config.method.toUpperCase(), _config.url, true);\n\n // Set the request timeout in MS\n request.timeout = _config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders$1.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = _config.transitional || transitionalDefaults;\n if (_config.timeoutErrorMessage) {\n timeoutErrorMessage = _config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils$1.isUndefined(_config.withCredentials)) {\n request.withCredentials = !!_config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = _config.responseType;\n }\n\n // Handle progress if needed\n if (onDownloadProgress) {\n ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));\n request.addEventListener('progress', downloadThrottled);\n }\n\n // Not all browsers support upload events\n if (onUploadProgress && request.upload) {\n ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));\n\n request.upload.addEventListener('progress', uploadThrottled);\n\n request.upload.addEventListener('loadend', flushUpload);\n }\n\n if (_config.cancelToken || _config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n _config.cancelToken && _config.cancelToken.subscribe(onCanceled);\n if (_config.signal) {\n _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(_config.url);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n};\n\nconst composeSignals = (signals, timeout) => {\n const {length} = (signals = signals ? signals.filter(Boolean) : []);\n\n if (timeout || length) {\n let controller = new AbortController();\n\n let aborted;\n\n const onabort = function (reason) {\n if (!aborted) {\n aborted = true;\n unsubscribe();\n const err = reason instanceof Error ? reason : this.reason;\n controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));\n }\n };\n\n let timer = timeout && setTimeout(() => {\n timer = null;\n onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));\n }, timeout);\n\n const unsubscribe = () => {\n if (signals) {\n timer && clearTimeout(timer);\n timer = null;\n signals.forEach(signal => {\n signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);\n });\n signals = null;\n }\n };\n\n signals.forEach((signal) => signal.addEventListener('abort', onabort));\n\n const {signal} = controller;\n\n signal.unsubscribe = () => utils$1.asap(unsubscribe);\n\n return signal;\n }\n};\n\nvar composeSignals$1 = composeSignals;\n\nconst streamChunk = function* (chunk, chunkSize) {\n let len = chunk.byteLength;\n\n if (!chunkSize || len < chunkSize) {\n yield chunk;\n return;\n }\n\n let pos = 0;\n let end;\n\n while (pos < len) {\n end = pos + chunkSize;\n yield chunk.slice(pos, end);\n pos = end;\n }\n};\n\nconst readBytes = async function* (iterable, chunkSize) {\n for await (const chunk of readStream(iterable)) {\n yield* streamChunk(chunk, chunkSize);\n }\n};\n\nconst readStream = async function* (stream) {\n if (stream[Symbol.asyncIterator]) {\n yield* stream;\n return;\n }\n\n const reader = stream.getReader();\n try {\n for (;;) {\n const {done, value} = await reader.read();\n if (done) {\n break;\n }\n yield value;\n }\n } finally {\n await reader.cancel();\n }\n};\n\nconst trackStream = (stream, chunkSize, onProgress, onFinish) => {\n const iterator = readBytes(stream, chunkSize);\n\n let bytes = 0;\n let done;\n let _onFinish = (e) => {\n if (!done) {\n done = true;\n onFinish && onFinish(e);\n }\n };\n\n return new ReadableStream({\n async pull(controller) {\n try {\n const {done, value} = await iterator.next();\n\n if (done) {\n _onFinish();\n controller.close();\n return;\n }\n\n let len = value.byteLength;\n if (onProgress) {\n let loadedBytes = bytes += len;\n onProgress(loadedBytes);\n }\n controller.enqueue(new Uint8Array(value));\n } catch (err) {\n _onFinish(err);\n throw err;\n }\n },\n cancel(reason) {\n _onFinish(reason);\n return iterator.return();\n }\n }, {\n highWaterMark: 2\n })\n};\n\nconst isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';\nconst isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';\n\n// used only inside the fetch adapter\nconst encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?\n ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :\n async (str) => new Uint8Array(await new Response(str).arrayBuffer())\n);\n\nconst test = (fn, ...args) => {\n try {\n return !!fn(...args);\n } catch (e) {\n return false\n }\n};\n\nconst supportsRequestStream = isReadableStreamSupported && test(() => {\n let duplexAccessed = false;\n\n const hasContentType = new Request(platform.origin, {\n body: new ReadableStream(),\n method: 'POST',\n get duplex() {\n duplexAccessed = true;\n return 'half';\n },\n }).headers.has('Content-Type');\n\n return duplexAccessed && !hasContentType;\n});\n\nconst DEFAULT_CHUNK_SIZE = 64 * 1024;\n\nconst supportsResponseStream = isReadableStreamSupported &&\n test(() => utils$1.isReadableStream(new Response('').body));\n\n\nconst resolvers = {\n stream: supportsResponseStream && ((res) => res.body)\n};\n\nisFetchSupported && (((res) => {\n ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {\n !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res) => res[type]() :\n (_, config) => {\n throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);\n });\n });\n})(new Response));\n\nconst getBodyLength = async (body) => {\n if (body == null) {\n return 0;\n }\n\n if(utils$1.isBlob(body)) {\n return body.size;\n }\n\n if(utils$1.isSpecCompliantForm(body)) {\n const _request = new Request(platform.origin, {\n method: 'POST',\n body,\n });\n return (await _request.arrayBuffer()).byteLength;\n }\n\n if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {\n return body.byteLength;\n }\n\n if(utils$1.isURLSearchParams(body)) {\n body = body + '';\n }\n\n if(utils$1.isString(body)) {\n return (await encodeText(body)).byteLength;\n }\n};\n\nconst resolveBodyLength = async (headers, body) => {\n const length = utils$1.toFiniteNumber(headers.getContentLength());\n\n return length == null ? getBodyLength(body) : length;\n};\n\nvar fetchAdapter = isFetchSupported && (async (config) => {\n let {\n url,\n method,\n data,\n signal,\n cancelToken,\n timeout,\n onDownloadProgress,\n onUploadProgress,\n responseType,\n headers,\n withCredentials = 'same-origin',\n fetchOptions\n } = resolveConfig(config);\n\n responseType = responseType ? (responseType + '').toLowerCase() : 'text';\n\n let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);\n\n let request;\n\n const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {\n composedSignal.unsubscribe();\n });\n\n let requestContentLength;\n\n try {\n if (\n onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&\n (requestContentLength = await resolveBodyLength(headers, data)) !== 0\n ) {\n let _request = new Request(url, {\n method: 'POST',\n body: data,\n duplex: \"half\"\n });\n\n let contentTypeHeader;\n\n if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {\n headers.setContentType(contentTypeHeader);\n }\n\n if (_request.body) {\n const [onProgress, flush] = progressEventDecorator(\n requestContentLength,\n progressEventReducer(asyncDecorator(onUploadProgress))\n );\n\n data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);\n }\n }\n\n if (!utils$1.isString(withCredentials)) {\n withCredentials = withCredentials ? 'include' : 'omit';\n }\n\n // Cloudflare Workers throws when credentials are defined\n // see https://github.com/cloudflare/workerd/issues/902\n const isCredentialsSupported = \"credentials\" in Request.prototype;\n request = new Request(url, {\n ...fetchOptions,\n signal: composedSignal,\n method: method.toUpperCase(),\n headers: headers.normalize().toJSON(),\n body: data,\n duplex: \"half\",\n credentials: isCredentialsSupported ? withCredentials : undefined\n });\n\n let response = await fetch(request);\n\n const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');\n\n if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {\n const options = {};\n\n ['status', 'statusText', 'headers'].forEach(prop => {\n options[prop] = response[prop];\n });\n\n const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length'));\n\n const [onProgress, flush] = onDownloadProgress && progressEventDecorator(\n responseContentLength,\n progressEventReducer(asyncDecorator(onDownloadProgress), true)\n ) || [];\n\n response = new Response(\n trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {\n flush && flush();\n unsubscribe && unsubscribe();\n }),\n options\n );\n }\n\n responseType = responseType || 'text';\n\n let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);\n\n !isStreamResponse && unsubscribe && unsubscribe();\n\n return await new Promise((resolve, reject) => {\n settle(resolve, reject, {\n data: responseData,\n headers: AxiosHeaders$1.from(response.headers),\n status: response.status,\n statusText: response.statusText,\n config,\n request\n });\n })\n } catch (err) {\n unsubscribe && unsubscribe();\n\n if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {\n throw Object.assign(\n new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),\n {\n cause: err.cause || err\n }\n )\n }\n\n throw AxiosError.from(err, err && err.code, config, request);\n }\n});\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter,\n fetch: fetchAdapter\n};\n\nutils$1.forEach(knownAdapters, (fn, value) => {\n if (fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nconst renderReason = (reason) => `- ${reason}`;\n\nconst isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false;\n\nvar adapters = {\n getAdapter: (adapters) => {\n adapters = utils$1.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n const rejectedReasons = {};\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n let id;\n\n adapter = nameOrAdapter;\n\n if (!isResolvedHandle(nameOrAdapter)) {\n adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];\n\n if (adapter === undefined) {\n throw new AxiosError(`Unknown adapter '${id}'`);\n }\n }\n\n if (adapter) {\n break;\n }\n\n rejectedReasons[id || '#' + i] = adapter;\n }\n\n if (!adapter) {\n\n const reasons = Object.entries(rejectedReasons)\n .map(([id, state]) => `adapter ${id} ` +\n (state === false ? 'is not supported by the environment' : 'is not available in the build')\n );\n\n let s = length ?\n (reasons.length > 1 ? 'since :\\n' + reasons.map(renderReason).join('\\n') : ' ' + renderReason(reasons[0])) :\n 'as no adapter specified';\n\n throw new AxiosError(\n `There is no suitable adapter to dispatch the request ` + s,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n return adapter;\n },\n adapters: knownAdapters\n};\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nfunction dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders$1.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders$1.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders$1.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n\nconst VERSION = \"1.7.7\";\n\nconst validators$1 = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators$1[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators$1.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nvar validator = {\n assertOptions,\n validators: validators$1\n};\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager$1(),\n response: new InterceptorManager$1()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n async request(configOrUrl, config) {\n try {\n return await this._request(configOrUrl, config);\n } catch (err) {\n if (err instanceof Error) {\n let dummy;\n\n Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error());\n\n // slice off the Error: ... line\n const stack = dummy.stack ? dummy.stack.replace(/^.+\\n/, '') : '';\n try {\n if (!err.stack) {\n err.stack = stack;\n // match without the 2 top stack lines\n } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\\n.+\\n/, ''))) {\n err.stack += '\\n' + stack;\n }\n } catch (e) {\n // ignore the case where \"stack\" is an un-writable property\n }\n }\n\n throw err;\n }\n }\n\n _request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils$1.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n };\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n // Flatten headers\n let contextHeaders = headers && utils$1.merge(\n headers.common,\n headers[config.method]\n );\n\n headers && utils$1.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders$1.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nvar Axios$1 = Axios;\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n toAbortSignal() {\n const controller = new AbortController();\n\n const abort = (err) => {\n controller.abort(err);\n };\n\n this.subscribe(abort);\n\n controller.signal.unsubscribe = () => this.unsubscribe(abort);\n\n return controller.signal;\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nvar CancelToken$1 = CancelToken;\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nfunction spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nfunction isAxiosError(payload) {\n return utils$1.isObject(payload) && (payload.isAxiosError === true);\n}\n\nconst HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nvar HttpStatusCode$1 = HttpStatusCode;\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios$1(defaultConfig);\n const instance = bind(Axios$1.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils$1.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults$1);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios$1;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken$1;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders$1;\n\naxios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.getAdapter = adapters.getAdapter;\n\naxios.HttpStatusCode = HttpStatusCode$1;\n\naxios.default = axios;\n\nmodule.exports = axios;\n//# sourceMappingURL=axios.cjs.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","//product comparison flyout -\r\n// this bundle will be included on category and detail pages \r\n// to support the flyout and the 'add' buttons with the scale symbol\r\n\r\nimport './typescript/errorhandler';\r\nimport './typescript/helpers/polyfills';\r\n// PCF scss\r\nimport './styles/mpc-shared-basics.scss';\r\nimport './styles/flyout-icon.scss';\r\nimport './styles/flyout-icon.mobile.scss';\r\nimport './styles/flyout-content.scss';\r\nimport './styles/flyout-header.scss';\r\nimport './styles/flyout-footer.scss';\r\nimport './styles/containers-separation-line.scss';\r\nimport './styles/flyout-title.scss';\r\nimport './styles/flyout-title.mobile.scss';\r\nimport './styles/flyout-title.fragment.scss';\r\nimport './styles/flyout-notifications.scss';\r\nimport './styles/flyout-notifications.mobile.scss';\r\nimport './styles/flyout-new-product-notification.scss';\r\nimport './styles/flyout-new-product-notification.mobile.scss';\r\nimport './styles/flyout-empty-list-notification.scss';\r\nimport './styles/flyout-empty-list-notification.mobile.scss';\r\nimport './styles/flyout-max-products-count-notification.scss';\r\nimport './styles/flyout-max-products-count-notification.mobile.scss';\r\nimport './styles/flyout-compare-list-btn.scss';\r\nimport './styles/flyout-compare-list-btn.mobile.scss';\r\n\r\n//TP scss\r\nimport './styles/touch-point-toolbar.scss';\r\nimport './styles/touch-point-article-tile.scss';\r\nimport './styles/touch-point-article-tile.mobile.scss';\r\nimport './styles/touch-point-details-page.scss';\r\nimport './styles/touch-point-details-page.mobile.scss';\r\n\r\n// TP ts\r\nimport './typescript/TP/TouchPointFactory';\r\n\r\n// PCF ts\r\nimport './typescript/PCF/flyout-controller';\r\n"],"names":["Element","prototype","CharacterData","DocumentType","filter","Boolean","forEach","item","hasOwnProperty","Object","defineProperty","configurable","enumerable","writable","value","this","parentNode","removeChild","self","document","createElement","createElementNS","view","classListProp","protoProp","elemCtrProto","objCtr","strTrim","String","trim","replace","arrIndexOf","Array","indexOf","i","len","length","DOMEx","type","message","name","code","DOMException","checkTokenAndGetIndex","classList","token","test","call","ClassList","elem","trimmedClasses","getAttribute","classes","split","push","_updateClassName","setAttribute","toString","classListProto","classListGetter","Error","contains","add","tokens","arguments","l","updated","remove","index","splice","toggle","force","result","method","replacement_token","join","classListPropDesc","get","ex","undefined","number","__defineGetter__","testElement","createMethod","original","DOMTokenList","_toggle","slice","apply","exports","timeout_1","module","Timeout","__spreadArrays","s","il","r","k","a","j","jl","MetadataRecord","callback","key","ms","params","paused","startTime","Date","getTime","timeSpentWaiting","clear","erase","clearTimeout","keyId","keyCall","metadata","originalMs","set","args","_i","setTimeout","executedTime","executed","create","exists","elapsed","metaDataRecord","Math","max","lastExecuted","meta","pending","remaining","reset","restart","pause","resume","remainingTime","instantiate","linkToExisting","random","newCallback","newMs","newParams","MPCFlyoutContentController","ArrowUpIcon","ArrowRightIcon","NotificationService","MPCNotificationService","FlyoutContent","MPCFlyoutContent","NavigationService","MPCNavigationService","DeviceDetectionHelper","MPCDeviceDetectionHelper","ComparePageButtonUrlUpdater","MPCComparePageButtonUrlUpdater","ProductComparisonModelManager","MPCLocalStorageService","ScopeDetection","MPCScopeDetection","MpcSettings","MpcSettingsModule","flyoutContentScope","querySelector","init","handleFicClick","bind","_instance","disabledFromFocus","flyoutIconContainer","instance","loadFlyoutIcons","deviceDetectionHelper","notificationService","flyoutContentController","isMobileShop","comparePageButtonUrlUpdater","productComparisonModelManager","checkCurrentLocalStorage","flyoutContentContainer","flyoutHeader","flyoutContentObject","navigationService","closeFlyoutBtn","registerEventHandlers","closeArrow","compareButtonIcon","innerHTML","addEventListener","handleCloseClickFromFlyoutFragment","window","shell","subscribeTo","cleanUpEmptyContent","toggleAttribute","hideFlyoutContent","handleFlyoutIconClick","publishTo","refresh","model","activeNavigationTab","setActiveNavigationTab","updateContainerListVisibility","markAnyNavigationTabActive","addProduct","salesArticleVariantKey","seoSlug","origin","then","product","categoryName","addProductByCompareLink","maNo","colorCode","addProductByMasterArticleNo","removeProductTP","updateProductsCounter","counterNumber","productsCounter","counter","Number","innerText","removeEmptyContainerList","removeEmptyNavigationTabs","isFlyoutContentEmpty","announceNavigationTabCleanUpOutsidePcp","productComparisonModel","emptyNavigationTabs","hasScopes","setClearStoredEmptyNavigationTabs","getModel","products","checkIsProductAlreadyAdded","FlyoutContentController","ErrorHandlerManager","RecycleBinIcon","PlusIcon","MPCErrorHandlerModule","flyout","iFlyoutContentController","eventBus","MPCEventBus","EventBus","flyoutContent","emptyProductSlotTitle","clearFlyoutCategoryBtnTitle","listContainersArray","clearCategoryProducts","listContainer","listItems","querySelectorAll","listItem","removeProduct","getListContainerCategoryName","removeAllProductsOfCategory","newProduct","addProductToFlyoutContent","markActiveNavigationTab","savKey","context","originSeoSlug","url","apiUrl","data","JSON","stringify","postWithPromise","NlVanillajax","productDataFromService","handleProductInfoToAdd","catch","err","masterArticleNo","LogError","productAdded","AddResult","Added","publish","articleId","Replaced","changeProductVariantInFlyoutContent","RejectedCapacity","onlyDom","tabNav","focusNext","categoryUrl","itemsContainer","productRemoved","tabOrder","appendChild","createEmptyListItem","createOrUpdateNavigationTab","getContainerListItems","detailsPageUrl","mainImage","altTag","currentListContainer","listContainerNotExists","createListItem","newListContainer","createListContainer","oldListContainer","style","display","navigationOrder","newClearListBtn","newItemsContainer","btnId","className","id","maxProducts","onActivated","focus","newListItem","newProductImageHolder","newRemoveProductButton","newProductDescription","plusIcon","newProductImageSlot","itemOriginDetailsPageUrl","title","event","stopPropagation","preventDefault","emptyListItem","nextEmpty","nextElementSibling","insertBefore","removableContainers","selectFirstTab","tmpContainer","activeCategoryTabName","selectedCategoryName","newTabActivated","MPCFlyoutController","ScaleIcon2021","StickyFlyOutNotificationService","MPCStickyFlyOutNotificationService","scope","pcfScopeRendered","prepareMobile","stickyFlyOutNotificationService","getCurrentProductsAmount","body","showPcfScope","hidePcfScope","scaleIcon","compareButtonIcons","renderWithoutAnimation","FlyoutController","ScrollLock","SmartTimeout","MPCScrollLock","scrollLock","flyoutContainer","notification","closeBtns","openFlyoutBtns","navigationBtn","comparisonListButton","goToFlyoutComparisonList","closeNotification","maxProductsCountNotification","newProductNotification","emptyListNotification","closeAnyActiveNotification","notifyNewProductAdded","showNotification","replaceNotificationContent","notifyMaximumProductsCountReached","notifyEmptyList","initializeNavigationButtonOnEmptyNotificationOnce","eventFunction","showMobileHeaderMenu","removeEventListener","headrapi","toggleMenu","productInfoContainer","closeExistingNotification","existingNotification","renderFlyoutContainerOverlay","updateNotificationContent","triggerAppShellPublish","deferNotification","existingNotificationTimeout","showInner","renderOverlay","ontouchmove","lock","unlock","tabletHeaderHeightCalculated","isTabletHandHeldDevice","flyoutNewProductNotification","handleFlyOutNotificationOnScroll","pageYOffset","handleFlyOutOnScroll","MPCCompareButton","ScaleIcon","marker","slug","displayedInCategoryNavKey","parentContainer","markerElement","initializeNew","getTouchPoint","response","updateSaveKeyFromOutsideTheScope","orderModule","articleInfo","update","oldSavKey","newSavKey","SeoSlug","subPath","contentType","ContentType","Plain","getWithPromise","container","Html","touchPointElement","removePreviousButton","replaceChild","initialize","previousButton","parentElement","MPCCallLimiter","CallLimiter","debounce","CompareButton","MPCMobileToolbarButton","toolbarButtons","compareButtons","children","tbw_mlt","toolbarButton","closest","categoryNavKey","MobileCategoryNavKey","compareButton","deactivateOnMobileCategory","activateOnMobileCategory","isActivatedOnMobileCategory","getTBW_Mlt","MobileToolbarButton","MPCTileScaleButton","ScaleEmptyIcon","element","prerendered","selectedVariantElement","scopeClass","updateFlyout","subscribe","updateVisibility","TileScaleButton","MPCTileScaleButtonEx","forArticleTile","emptyIcon","icon","TileScaleButtonEx","MPCTouchPointFactory","TouchPointIdentifier","MPCTouchPointIdentifier","isMobileView","innerWidth","isNewDetailsPage","compareButtonSavKeySelector","touchPointIdentifier","touchPoints","initializeEvents","CreateTouchPointsForNewPDP","createByMarkersPayload","tile","createByMarkers","placeHoldersData","createByMarkersEx","form","savKeyElement","payload","initializePrerenderedMobileTouchPoints","initializeCompareLinkTouchPoints","newBtnLst","newBtn","getTileScaleTouchPoints","touchPointPlaceholders","getMobileTouchPointPlaceholders","savKeyToPlaceholder","touchPointPlaceholder","touchPoint","innerHtml","dataset","savkey","itemOrigin","placeholder","currentCategoryNavKey","compareLinks","getCompareLinks","compareLink","htmlIndex","href","splitted","substring","reverse","parseInt","isAxiosError","error","toJSON","articlesContext","post","headers","status","validSavKeys","getMarkersFromDomEx","createTouchPointEx","errorMsg","errorStack","stack","console","warn","markers","getMarkersFromDom","createTouchPoint","markerPayloadObject","parse","createTouchPointByPayloadObject","serviceCall","dataObject","TouchPointFactory","compareButtonMarker","tileScaleMarker","savKeys","allLinks","link","Init","_settings","onerror","msg","line","col","_errorCount","toLowerCase","errorEvent","lineno","colno","filename","errStr","isDevelopment","mpcLocalStorageJson","localStorage","getItem","mpcLocalStorageKey","mpcLocalStorage","reason","log","statusText","comparisonPage","comparisonFlyout","PcfScope","PcpScope","_mpcLocalStorageKey","_culture","_portalMandantToken","_maxProducts","_isLoggedIn","_isDevelopment","_apiUrl","initDone","HtmlElementsHelper","MPCElementsHelper","navigationTabKeyName","abstractContent","selectCategoryButton","navigationTabs","navigationTabsArray","registerButtonEvent","switchNavigationTab","newActiveNavigationTab","domNode","newActiveNavigationTabName","oldNavigationTabName","clearLockedColumnIndex","clearCarouselScrollIndex","scrollToNavigationTab","buttonRightEdgePosition","getBoundingClientRect","left","offsetWidth","scrollLeft","createEmptyNavTab","isNew","navigationTab","appendSavKeyToNavTabUrl","updateCounter","createNavigationTab","indexToInsert","appendChildAtIndex","updateSelectCategoryButtonVisibility","isAnyProductCounted","productFound","tab","getCounterNumber","comparisonPageUri","order","newNavigationTabHtml","newNavigationTab","encodeURIComponent","newCategoryName","newArticlesCounter","target","previousElementSibling","removableNavigationTabs","tmpTab","newActiveTabCatName","newActiveTab","getFirstNavigationTab","delay","immediate","timer","instantCall","throttle","interval","leadCall","trailCall","resetTimer","blockExecution","_comparePageUrl","comparisonPageBaseUri","onUpdatedModel","storageProduct","isTabletHandHeldDeviceEnvironment","documentElement","isMobileShopEnvironment","isMicrosoftBrowserEnvironment","sniffJson","getElementById","sniffJsonResult","resultingClasses","isTablet","cap","isPhone","isHandheld","isAndroid","isIOS","htmlClasses","isMsie","isEdge","isMicrosoftBrowser","callbackLists","eventName","isArray","subscriptionsIds","createSubscription","subscribeMultiple","subscriptions","subscriptionIds","subscription","subscriptionId","addSubscription","unsubscribe","unSubscribeMultiple","removeSubscription","child","parent","NodeList","bodyScrollPosition","webContainer","mobileContainer","removeAttribute","scrollTo","query","req","xhr","open","setHeaders","onReadyStateChange","send","Promise","resolve","reject","onload","getResult","getHtmlResult","sendGet","win","XMLHttpRequest","header","setRequestHeader","onreadystatechange","readyState","DONE","responseText","json","e","DuplicateNotFound","DuplicateExact","localStorageAbstraction","LocalStorageAbstraction","localStorageCache","readLocalStorage","runningServiceCall","mobileEnabledCategories","validateLocalStorage","isNewlyLoggedOut","isLoggedIn","isTimedOut","createNewLocalStorage","isLoggedInNewly","needsValidation","sync","pageLanguage","culture","printPageContent","countBefore","clearStoredEmptyNavigationTabs","hasClientSideChange","countAfter","setMobileHeaderMarkerOn","setMobileHeaderMarkerOff","lastUpdateTime","seoDescription","originNavigationKeyPath","idx","duplicateCheckResult","checkDuplicateProductPerCategory","isAlreadyAtLimit","appendProductToList","RejectedDuplicate","skipSaving","afterSave","writeLocalStorage","syncedModel","articleRemoved","productsAfter","tmpProduct","some","p","addProductBySavKey","originNavKeyPathOverride","productsAmount","localStorageModel","mobileLockedColumnIndex","mobileCarouselScrollIndex","usedNavTabForCarouselOrLockedColumn","expiration5MinutesAfterLastUpdate","expirationDate","avoidNotification","productExists","storeEmptyNavigationTab","emptyNavigationTab","removeStoredEmptyNavigationTabs","getCarouselScrollIndex","currentCatName","getCurrentCategoryName","storeCarouselScrollIndex","getLockedColumnIndex","storeLockedColumnIndex","URLSearchParams","location","search","storePrintPageContent","content","outerHTML","getPrintPageContentCached","modelDirectlyFromLocalStorage","unsupported","tmpLocalStorageObject","setItem","fn","thisArg","getPrototypeOf","kindOf","cache","thing","str","kindOfTest","typeOfTest","isUndefined","isArrayBuffer","isString","isFunction","isNumber","isObject","isPlainObject","val","Symbol","toStringTag","iterator","isDate","isFile","isBlob","isFileList","isURLSearchParams","isReadableStream","isRequest","isResponse","isHeaders","map","obj","allOwnKeys","keys","getOwnPropertyNames","findKey","_key","_global","globalThis","g","isContextDefined","isTypedArray","TypedArray","Uint8Array","isHTMLForm","prop","isRegExp","reduceDescriptors","reducer","descriptors","getOwnPropertyDescriptors","reducedDescriptors","descriptor","ret","defineProperties","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","toUpperCase","isAsyncFn","_setImmediate","setImmediateSupported","setImmediate","postMessageSupported","postMessage","callbacks","source","shift","cb","asap","queueMicrotask","process","nextTick","utils$1","isBuffer","constructor","isFormData","kind","FormData","append","isArrayBufferView","ArrayBuffer","isView","buffer","isBoolean","isStream","pipe","merge","caseless","assignValue","targetKey","extend","b","stripBOM","charCodeAt","inherits","superConstructor","props","assign","toFlatObject","sourceObj","destObj","propFilter","merged","endsWith","searchString","position","lastIndex","toArray","arr","forEachEntry","next","done","pair","matchAll","regExp","matches","exec","hasOwnProp","freezeMethods","toObjectSet","arrayOrString","delimiter","define","toCamelCase","m","p1","p2","noop","toFiniteNumber","defaultValue","isFinite","global","generateString","size","alphabet","isSpecCompliantForm","toJSONObject","visit","reducedValue","isThenable","AxiosError","config","request","captureStackTrace","description","fileName","lineNumber","columnNumber","prototype$1","isVisitable","removeBrackets","renderKey","path","dots","concat","from","customProps","axiosError","cause","predicates","toFormData","formData","options","TypeError","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","Blob","convertValue","toISOString","Buffer","isFlatArray","el","exposedHelpers","build","pop","encode$1","charMap","match","AxiosURLSearchParams","_pairs","encode","buildURL","_encode","serializeFn","serialize","serializedParams","hashmarkIndex","encoder","InterceptorManager$1","handlers","use","fulfilled","rejected","synchronous","runWhen","eject","h","transitionalDefaults","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","platform$1","isBrowser","protocols","hasBrowserEnv","_navigator","navigator","hasStandardBrowserEnv","hasStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","platform","freeze","__proto__","formDataToJSON","buildPath","isNumericKey","isLast","arrayToObject","entries","parsePropPath","defaults","transitional","adapter","transformRequest","getContentType","hasJSONContentType","isObjectPayload","setContentType","helpers","isNode","toURLEncodedForm","formSerializer","_FormData","env","rawValue","parser","stringifySafely","transformResponse","JSONRequested","responseType","strictJSONParsing","ERR_BAD_RESPONSE","timeout","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","defaults$1","ignoreDuplicateOf","$internals","normalizeHeader","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","valueOrRewrite","rewrite","setHeader","_value","_header","_rewrite","lHeader","rawHeaders","parsed","parseHeaders","tokensRE","parseTokens","has","matcher","deleted","deleteHeader","normalize","format","normalized","w","char","formatHeader","targets","asStrings","first","computed","accessor","accessors","defineAccessor","accessorName","methodName","arg1","arg2","arg3","buildAccessors","mapped","headerValue","AxiosHeaders$1","transformData","fns","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","settle","ERR_BAD_REQUEST","floor","progressEventReducer","listener","isDownloadStream","freq","bytesNotified","_speedometer","samplesCount","min","bytes","timestamps","firstSampleTS","head","tail","chunkLength","now","startedAt","bytesCount","passed","round","speedometer","lastArgs","timestamp","threshold","invoke","loaded","total","lengthComputable","progressBytes","rate","progress","estimated","progressEventDecorator","throttled","asyncDecorator","isURLSameOrigin","msie","userAgent","urlParsingNode","originURL","resolveURL","protocol","host","hash","hostname","port","pathname","charAt","requestURL","cookies","write","expires","domain","secure","cookie","toGMTString","read","RegExp","decodeURIComponent","buildFullPath","baseURL","requestedURL","relativeURL","combineURLs","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","paramsSerializer","timeoutMessage","withCredentials","withXSRFToken","onUploadProgress","onDownloadProgress","decompress","beforeRedirect","transport","httpAgent","httpsAgent","cancelToken","socketPath","responseEncoding","configValue","resolveConfig","newConfig","auth","btoa","username","password","unescape","xsrfValue","xhrAdapter","_config","requestData","requestHeaders","onCanceled","uploadThrottled","downloadThrottled","flushUpload","flushDownload","signal","onloadend","responseHeaders","getAllResponseHeaders","responseURL","onabort","ECONNABORTED","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","upload","cancel","abort","aborted","parseProtocol","composeSignals$1","signals","controller","AbortController","streamChunk","chunk","chunkSize","byteLength","end","pos","trackStream","stream","onProgress","onFinish","async","iterable","asyncIterator","reader","getReader","readStream","readBytes","_onFinish","ReadableStream","pull","close","loadedBytes","enqueue","return","highWaterMark","isFetchSupported","fetch","Request","Response","isReadableStreamSupported","encodeText","TextEncoder","arrayBuffer","supportsRequestStream","duplexAccessed","hasContentType","duplex","supportsResponseStream","resolvers","res","_","ERR_NOT_SUPPORT","knownAdapters","http","fetchOptions","composedSignal","toAbortSignal","requestContentLength","getContentLength","_request","getBodyLength","resolveBodyLength","contentTypeHeader","flush","isCredentialsSupported","credentials","isStreamResponse","responseContentLength","responseData","renderReason","isResolvedHandle","adapters","nameOrAdapter","rejectedReasons","reasons","state","throwIfCancellationRequested","throwIfRequested","dispatchRequest","validators$1","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","ERR_DEPRECATED","assertOptions","schema","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","validators","Axios","instanceConfig","interceptors","configOrUrl","dummy","boolean","function","contextHeaders","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","responseInterceptorChain","promise","chain","onFulfilled","onRejected","getUri","generateHTTPMethod","isForm","Axios$1","CancelToken","executor","resolvePromise","_listeners","onfulfilled","_resolve","c","CancelToken$1","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Ok","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","HttpStatusCode$1","axios","createInstance","defaultConfig","VERSION","Cancel","all","promises","spread","formToJSON","getAdapter","default","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","Function"],"sourceRoot":""}