{"version":3,"file":"mgminfo.min.js","sources":["../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/cookie.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/events.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/html.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/button.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/collapsable.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/string.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/fetch.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/disposable.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/popup-new.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/content-dialog.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/account-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/login-check.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/external/autocomplete.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form-input.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/page-log.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/querystring.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/login-register.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/logger-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/validation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/newsletter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/device.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/navigation-desktop.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/language-selector.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/tooltip.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/search-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/notification-center.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/mobile-menu.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/my-account.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/countdown.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/navigation-mobile.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/main-navigation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/icons.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/country-selection.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/personalNumbers.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/scroll-to-top.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/leave-intent.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/tab.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/popup-launcher.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/component-service..ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/datalayer.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/component-loader.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/vat.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/date.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/abandoned-visit-title-swapper.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/page-general.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/pages/mgminfo.ts"],"sourcesContent":["export function getCookie(cName: string): string {\r\n\tconst allCookies = document.cookie;\r\n\tif (allCookies.length > 0) {\r\n\t\tlet cStart = allCookies.indexOf(cName + \"=\");\r\n\t\tif (cStart !== -1) {\r\n\t\t\tcStart = cStart + cName.length + 1;\r\n\t\t\tlet cEnd = allCookies.indexOf(\";\", cStart);\r\n\t\t\tif (cEnd === -1) cEnd = allCookies.length;\r\n\t\t\treturn unescape(allCookies.substring(cStart, cEnd));\r\n\t\t}\r\n\t}\r\n\treturn \"\";\r\n}\r\nexport function writeCookie(cName: string, cValue: string, extraDays: number) {\r\n\tconst d = new Date();\r\n\td.setTime(d.getTime() + (extraDays * 24 * 60 * 60 * 1000));\r\n\tconst expires = \"expires=\" + d.toUTCString();\r\n\tdocument.cookie = encodeURIComponent(cName) + \"=\" + encodeURIComponent(cValue) + \";\" + expires + \"; path=/\";\r\n}\r\n\r\nexport function writeCookieThatExpiresAtTheEndOfTheDay(cName: string, cValue) {\r\n\tconst d = new Date();\r\n\tconst midnight = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59);\r\n\tconst expires = \"expires=\" + midnight.toUTCString();\r\n\tdocument.cookie = encodeURIComponent(cName) + \"=\" + encodeURIComponent(cValue) + \";\" + expires + \"; path=/\";\r\n}\r\n","import {getCookie} from \"../utils/cookie\";\r\n\r\nconst trackEvent = (category: string, action: string, customParameters?: object) => {\r\n\tconst dataLayer = (window).dataLayer || [];\r\n\tdataLayer.push({\r\n\t\tevent: category,\r\n\t\taction: action,\r\n\t\t...customParameters\r\n\t});\r\n};\r\n\r\ninterface IOrderStatusParams {\r\n\torderNumber?: string;\r\n\torderStatus?: string;\r\n\tpaymentStatus?: string;\r\n\tpvc?: string;\r\n\trepro?: boolean;\r\n}\r\n\r\nexport function trackOrderStatusEvent(action: string, partialEventParams: IOrderStatusParams, nrOrdersInAccount = -1, nrItemsInOrder = -1) {\r\n\ttrackEvent('orderStatus', action, { accountId: getCookie('accid'), nrOrdersInAccount, nrItemsInOrder, ...partialEventParams });\r\n}\r\n\r\nexport function trackContactPageEvent(action: string) {\r\n\ttrackEvent('contactPage', action);\r\n}\r\n\r\nexport function trackSortingOnPop(action: string) {\r\n\ttrackEvent('sortingOnPOP', action);\r\n}\r\n\r\nexport function trackComponentEvent(action: string) {\r\n\ttrackEvent('component', action);\r\n}\r\n\r\nexport function trackAddressValidationEvent(action: string) {\r\n\ttrackEvent('addressValidation', action);\r\n}\r\n\r\nexport function trackFiltersEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('filters', action, eventParams);\r\n}\r\n\r\nexport function trackSliderEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('slider', action, eventParams);\r\n}\r\n\r\nexport function trackMgmEvent(action: string) {\r\n\ttrackEvent('MGMProgram', action);\r\n}\r\n\r\nexport function trackAccountPrefEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('accountPreferences', action, eventParams);\r\n}\r\n\r\nexport function ProductEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('productSelection', action, eventParams);\r\n}\r\n\r\nexport interface IRecommendationEventParams {\r\n\tpageType?: string;\r\n\tpageCode?: string;\r\n\tpvc?: string;\r\n}\r\nexport function trackRecommendationCartEvent(action: string, recommendationLabel?: IRecommendationEventParams) {\r\n\ttrackEvent('recommendations', action, recommendationLabel);\r\n}\r\n\r\nexport interface IShopInShopEventParams {\r\n\tpvc?: string;\r\n}\r\nexport function trackShopInShopEvent(action: string, eventParams?: IShopInShopEventParams) {\r\n\ttrackEvent('shopInShop', action, eventParams);\r\n}\r\n","import {IDisposable} from \"../utils/disposable\";\r\n\r\nexport function expressQuerySelector(el: Element | Document, selectors: T, isRequired: true): HTMLElementTagNameMap[T];\r\nexport function expressQuerySelector(el: Element | Document, selectors: T, isRequired?: boolean): HTMLElementTagNameMap[T] | null;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired: true): T;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired?: boolean): T | null;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired = false): T | null {\r\n\tconst resultEl = el.querySelector(selectors);\r\n\tif (isRequired && !resultEl) throw new Error(\"querySelector didn't return any results for: \" + selectors);\r\n\treturn resultEl;\r\n}\r\n\r\n/* Use the default js scrollIntoView => this code was created for IE if I remember correctly\r\nexport interface IScrollIntoViewOptions {\r\n\treadonly vertical?: 'center' | 'top' | 'bottom'; // TODO: implement bottom, top\r\n\treadonly behavior?: 'auto' | 'smooth';\r\n}\r\n\r\nexport function scrollIntoView(el: HTMLElement, options: IScrollIntoViewOptions = {}) {\r\n\tconst d = document;\r\n\tconst w = window;\r\n\tconst scrollAlignment = {\"top\": 0, \"center\": 0.5, \"bottom\": 1};\r\n\tconst {vertical = 'center', behavior = 'smooth'} = options;\r\n\tconst alignment = {y: scrollAlignment[vertical]};\r\n\r\n\tconst hasScrollableSpace = (el: Element) => el.clientHeight < el.scrollHeight;\r\n\r\n\tconst canOverflow = (el: Element) => {\r\n\t\tconst overflowValue = w.getComputedStyle(el, null)['overflow' + 'Y'];\r\n\t\treturn overflowValue === 'auto' || overflowValue === 'scroll';\r\n\t};\r\n\r\n\tconst isScrollable = (el: Element) => hasScrollableSpace(el) && canOverflow(el);\r\n\r\n\tconst findScrollableParent = (el: Element) => {\r\n\t\twhile (el !== d.body && isScrollable(el) === false) {\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t};\r\n\r\n\tconst scrollableParent = findScrollableParent(el);\r\n\tconst clientRect = el.getBoundingClientRect();\r\n\tconst parentRect = scrollableParent.getBoundingClientRect();\r\n\tconst y = clientRect.top - parentRect.top - scrollableParent.scrollTop + ((parentRect.height - el.offsetHeight) * alignment.y);\r\n\r\n\tif (scrollableParent !== d.body) {\r\n\t\t'scrollBehavior' in document.documentElement.style\r\n\t\t\t? scrollableParent.scroll({\r\n\t\t\t\ttop: y,\r\n\t\t\t\tbehavior,\r\n\t\t\t})\r\n\t\t\t: scrollableParent.scrollTop = y; // IE: scroll on element not supported\r\n\r\n\t} else {\r\n\t\tconst windowSize = getWindowSize();\r\n\t\tconst y = Math.round(window.pageYOffset + clientRect.top - (windowSize.height - el.offsetHeight) * alignment.y);\r\n\t\t'scrollBehavior' in document.documentElement.style\r\n\t\t\t? window.scroll({\r\n\t\t\t\ttop: y,\r\n\t\t\t\tbehavior,\r\n\t\t\t})\r\n\t\t\t: window.scroll(0, y); // IE: scroll options not supported\r\n\t}\r\n}*/\r\n\r\nexport function getWindowSize() {\r\n\tconst w = window;\r\n\tconst d = document;\r\n\tconst e = d.documentElement;\r\n\tconst g = d.body;\r\n\tconst x = w.innerWidth || e.clientWidth || g.clientWidth;\r\n\tconst y = w.innerHeight || e.clientHeight || g.clientHeight;\r\n\r\n\treturn {width: x, height: y};\r\n}\r\n\r\nexport function hasClass(element: HTMLElement, cssClass: string): boolean {\r\n\tconst regex = new RegExp('(?:^|\\\\s)' + cssClass + '(?!\\\\S)');\r\n\tconst match = element.className.match(regex);\r\n\treturn !!match && !!match.length;\r\n}\r\n\r\nexport function expressEventListener(element: any, type: string, listener: (ev: any) => T, useCapture?: boolean): IDisposable {\r\n\tconst disposable = {\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.handler) { // Prevent unregistering twice\r\n\t\t\t\telement.removeEventListener(disposable.type, disposable.handler, useCapture);\r\n\t\t\t\tdelete disposable.handler;\r\n\t\t\t}\r\n\t\t},\r\n\t\thandler: (ev: any): T => {\r\n\t\t\treturn listener(ev);\r\n\t\t},\r\n\t\ttype\r\n\t};\r\n\r\n\telement.addEventListener(disposable.type, disposable.handler, useCapture);\r\n\r\n\treturn disposable;\r\n}\r\n\r\nexport function expressQuerySelectorAll(el: Element | Document | DocumentFragment, selectors: string): T[] {\r\n\treturn el ? [].slice.call(el.querySelectorAll(selectors)) : [];\r\n}\r\n\r\nexport function expressAddClass(element: HTMLElement, cssClass) {\r\n\texpressToggleClass(element, cssClass, true);\r\n}\r\n\r\nexport function expressRemoveClass(element: HTMLElement, cssClass) {\r\n\texpressToggleClass(element, cssClass, false);\r\n}\r\n\r\nexport function expressToggleClass(element: HTMLElement, cssClass: string, on: boolean) {\r\n\tconst regex = new RegExp('(?:^|\\\\s)' + cssClass + '(?!\\\\S)');\r\n\r\n\tconst hasClass = element.className.match(regex);\r\n\tif (hasClass && !on) {\r\n\t\telement.className = element.className.replace(new RegExp(regex.source, \"g\"), '');\r\n\t} else if (!hasClass && on) {\r\n\t\telement.className += \" \" + cssClass;\r\n\t}\r\n}\r\n\r\nexport function show(el: HTMLElement) {\r\n\tif (el.offsetParent === null) { // is el visible in dom?\r\n\t\tif (el.style.display === 'none') { // check style attribute\r\n\t\t\tel.style.display = '';\r\n\t\t} else {\r\n\t\t\tif (getComputedStyle(el).display === 'none') { // el not visible -> check css display -> force display block\r\n\t\t\t\tel.style.display = 'block';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function hide(el: HTMLElement) {\r\n\tel.style.display = 'none';\r\n}\r\n\r\nexport function getHeightWithMargins(el: HTMLElement): number {\r\n\treturn el.getBoundingClientRect().height\r\n\t\t+ parseInt(window.getComputedStyle(el).marginTop || \"0\", 10)\r\n\t\t+ parseInt(window.getComputedStyle(el).marginBottom || \"0\", 10);\r\n}\r\n\r\nexport function getParentWithClassName(el: Element | null, className: string): T | null {\r\n\tif (el)\r\n\t\tel = el.parentElement;\r\n\r\n\twhile (el) {\r\n\t\tif (el.classList.contains(className))\r\n\t\t\treturn el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getSelfOrParentWithClassName(el: Element | null, className: string): T | null {\r\n\tif (!el) return null;\r\n\tif (el.classList && el.classList.contains(className))\r\n\t\treturn el;\r\n\treturn getParentWithClassName(el, className);\r\n}\r\n\r\nexport function getNextSiblingWithClassName(el: Element | null, className: string): T | null {\r\n\tif (el)\r\n\t\tel = el.nextElementSibling;\r\n\r\n\twhile (el) {\r\n\t\tif (el.classList.contains(className))\r\n\t\t\treturn el;\r\n\t\tel = el.nextElementSibling;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getParentWithId(el: Element | null, id: string): T | null {\r\n\tif (el)\r\n\t\tel = el.parentElement;\r\n\r\n\twhile (el) {\r\n\t\tif (el.id === id)\r\n\t\t\treturn el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getParents (elem, selector?) {\r\n\tif (!Element.prototype.matches) {\r\n\t\tElement.prototype.matches =\r\n\t\t\tElement.prototype.webkitMatchesSelector ||\r\n\t\t\tfunction(s) {\r\n\t\t\t\tconst matches = (this.document || this.ownerDocument).querySelectorAll(s);\r\n\t\t\t\tlet i = matches.length;\r\n\t\t\t\twhile (--i >= 0 && matches.item(i) !== this) {\r\n\t\t\t\t\t//\r\n\t\t\t\t}\r\n\t\t\t\treturn i > -1;\r\n\t\t\t};\r\n\t}\r\n\t// We check on the parents of an element => select the first parent\r\n\telem = elem.parentNode;\r\n\tconst parents = [];\r\n\tfor ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n\t\tif (selector) {\r\n\t\t\tif (elem.matches(selector)) {\r\n\t\t\t\tparents.push(elem);\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tparents.push(elem);\r\n\t}\r\n\treturn parents;\r\n\r\n}\r\n\r\nexport function htmlToElement(html): ChildNode {\r\n\tconst template = document.createElement('template');\r\n\thtml = html.trim(); // Never return a text node of whitespace as the result\r\n\ttemplate.innerHTML = html;\r\n\treturn template.content.firstChild;\r\n}\r\n\r\nexport function isMobileOnPageWithHeader() {\r\n\treturn isElementVisible(\r\n\t\texpressQuerySelector(\r\n\t\t\tdocument,\r\n\t\t\t'.o-main-navigation__hamburger-button',\r\n\t\t\tfalse\r\n\t\t)\r\n\t);\r\n}\r\n\r\nexport function isElementVisible(el: HTMLElement) {\r\n\treturn !(el.offsetWidth\r\n\t\t+ el.offsetHeight\r\n\t\t+ el.getBoundingClientRect().height\r\n\t\t+ el.getBoundingClientRect().width === 0);\r\n}\r\n\r\nexport function isElementVisibleInViewPort(el: HTMLElement): boolean {\r\n\tif (!el) return false; // return default\r\n\tconst rect = el.getBoundingClientRect();\r\n\r\n\treturn rect.top >= 0\r\n\t\t&& rect.left >= 0\r\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\r\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth);\r\n}\r\n\r\nexport function isElementPartiallyVisibleInViewport(el, percentVisible) {\r\n\tif (!el) return false;\r\n\tconst rect = el.getBoundingClientRect();\r\n\tconst windowHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n\treturn !(\r\n\t\tMath.floor(100 - (((rect.top >= 0 ? 0 : rect.top) / +-rect.height) * 100)) < percentVisible ||\r\n\t\tMath.floor(100 - ((rect.bottom - windowHeight) / rect.height) * 100) < percentVisible\r\n\t);\r\n}\r\n\r\nexport function remove(el: Element) {\r\n\tif (el.parentElement) el.parentElement.removeChild(el);\r\n}\r\n\r\nlet inViewArray: { element: HTMLElement; callBack: IInViewCallback; }[];\r\n\r\ninterface IInViewCallback {\r\n\t(element: HTMLElement): void;\r\n}\r\n\r\n// Can be replaced with a intersection observer with threshold = 1\r\nexport function inViewTrigger(element: HTMLElement, callBack: IInViewCallback) {\r\n\tconst inViewScrollHandler = () => {\r\n\t\t// What does in view mean? We assume people are scrolling down, so if BOTTOM of the element is in view -> the element has been in view!\r\n\t\tfor (let i = inViewArray.length - 1; i >= 0; i--) {\r\n\t\t\tconst { element, callBack } = inViewArray[i];\r\n\r\n\t\t\tconst windowHeight = window.innerHeight;\r\n\t\t\tconst scrollY = window.scrollY || window.pageYOffset;\r\n\t\t\tconst scrollPosition = scrollY + windowHeight;\r\n\r\n\t\t\tconst elementHeight = element.clientHeight;\r\n\t\t\tconst elementPosition = element.getBoundingClientRect().top + scrollY + elementHeight;\r\n\r\n\t\t\tif (scrollPosition > elementPosition) {\r\n\t\t\t\tcallBack(element);\r\n\t\t\t\tinViewArray.splice(i, 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (inViewArray.length === 0) {\r\n\t\t\t// I no longer need myself! Cleanup....\r\n\t\t\tdocument.removeEventListener('scroll', inViewScrollHandler);\r\n\t\t}\r\n\t};\r\n\r\n\t// We should only have 1 scroll event listener that checks all elements that want to use this feature.\r\n\tif (!inViewArray || inViewArray.length === 0) {\r\n\t\tinViewArray = [];\r\n\t\tdocument.addEventListener('scroll', inViewScrollHandler);\r\n\t}\r\n\r\n\tinViewArray.push({ element, callBack });\r\n\r\n\t// Do 1 check without scrolling -> items might already be completely in view\r\n\tinViewScrollHandler();\r\n}\r\n\r\nexport function disableUserEvents(): IDisposable {\r\n\tconst eventsToBlock = [\"click\", \"keydown\", \"keyup\", \"mouseenter\", \"mouseleave\", \"focus\"];\r\n\r\n\tconst disposable = {\r\n\t\tblockingEvents: eventsToBlock.map((event) => expressEventListener(window, event, (e) => blockEvent(e), true)),\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.blockingEvents) {\r\n\t\t\t\tdisposable.blockingEvents.forEach((blockedEvent) => blockedEvent.dispose());\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\treturn disposable;\r\n}\r\n\r\nconst blockEvent = (event: Event): void => {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n};\r\n\r\nexport const pageVisibilityChange = (onVisible?: () => void | undefined, onHidden?: () => void | undefined) => {\r\n\tif (!onVisible && !onHidden)\r\n\t\treturn;\r\n\r\n\tlet hidden: string, visibilityState: string, visibilityChange: string;\r\n\r\n\tif (typeof document.hidden !== \"undefined\") {\r\n\t\thidden = \"hidden\"; visibilityChange = \"visibilitychange\"; visibilityState = \"visibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.mozHidden !== \"undefined\") {\r\n\t\thidden = \"mozHidden\"; visibilityChange = \"mozvisibilitychange\"; visibilityState = \"mozVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.msHidden !== \"undefined\") {\r\n\t\thidden = \"msHidden\"; visibilityChange = \"msvisibilitychange\"; visibilityState = \"msVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.webkitHidden !== \"undefined\") {\r\n\t\thidden = \"webkitHidden\"; visibilityChange = \"webkitvisibilitychange\"; visibilityState = \"webkitVisibilityState\";\r\n\t}\r\n\r\n\tif (typeof document.addEventListener === \"undefined\" || typeof hidden === \"undefined\") {\r\n\t\t// not supported\r\n\t} else {\r\n\t\texpressEventListener(document, visibilityChange, () => {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tswitch (document[visibilityState]) {\r\n\t\t\t\t\tcase \"visible\":\r\n\t\t\t\t\t\tonVisible && onVisible();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"hidden\":\r\n\t\t\t\t\t\tonHidden && onHidden();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}, 0);\r\n\t\t}, false);\r\n\t}\r\n};\r\n","import {expressEventListener, expressRemoveClass, expressAddClass} from '../common/html';\r\nimport {IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface ICreateClickableOptions {\r\n\treadonly enable?: () => void;\r\n\treadonly disable?: () => void;\r\n}\r\n\r\nexport interface IButton {\r\n\treadonly dispose: () => void;\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n}\r\n\r\nexport function createClickableElement(el: HTMLElement, onClick?: () => Promise, options: ICreateClickableOptions = {}) {\r\n\tlet clickEvent: IDisposable;\r\n\tconst {enable, disable} = options;\r\n\r\n\tconst onClicked = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tif (onClick) {\r\n\t\t\tdispose();\r\n\t\t\tdisable && disable();\r\n\t\t\tonClick()\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tenable && enable();\r\n\t\t\t\t\taddClickEvent();\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst addClickEvent = () => {\r\n\t\tclickEvent = expressEventListener(el, 'click', onClicked);\r\n\t};\r\n\r\n\tconst dispose = () => clickEvent.dispose();\r\n\r\n\taddClickEvent();\r\n\r\n\treturn {\r\n\t\taddClickEvent,\r\n\t\tdispose\r\n\t};\r\n}\r\n\r\nexport function createButton(buttonEl: HTMLButtonElement, onClick?: () => Promise): IButton {\r\n\tconst enable = () => { // add component specific classes\r\n\t\texpressRemoveClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.removeAttribute(\"disabled\");\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\texpressAddClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.setAttribute(\"disabled\", \"disabled\");\r\n\t};\r\n\r\n\tconst button = createClickableElement(\r\n\t\tbuttonEl,\r\n\t\tonClick,\r\n\t\t{\r\n\t\t\tenable,\r\n\t\t\tdisable\r\n\t\t}\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tenable,\r\n\t\tdisable\r\n\t};\r\n}\r\n","import {expressQuerySelector, expressQuerySelectorAll, hasClass, isElementVisibleInViewPort} from '../common/html';\r\nimport { createClickableElement } from './button';\r\n\r\nexport interface ICreateCollapsableOptions {\r\n\treadonly singleOpen?: boolean;\r\n\treadonly swapTitleDataAttribute?: string;\r\n}\r\n\r\nexport interface ICreateCollapsableDependencies {\r\n\tonInit?: (container: HTMLElement) => Promise;\r\n\tonBeforeOpen?: (container: HTMLElement) => Promise;\r\n\treadonly onBeforeClose?: (container: HTMLElement) => Promise;\r\n\treadonly titleElSelector?: string;\r\n\treadonly scrollIntoViewAfterOpen: boolean;\r\n\treadonly contentSelector?: string;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nexport interface ICollapsibleContentRequest {\r\n\treadonly type: string;\r\n\treadonly theme: string;\r\n}\r\n\r\nexport interface ICollapsable {\r\n\tdispose(): void;\r\n\tshow(): void;\r\n\tclose(): void;\r\n\thide(): void;\r\n\topen(scrollIntoView?: boolean): void;\r\n\telement: HTMLElement;\r\n}\r\n\r\nexport function createCollapsable(container: HTMLElement, deps?: ICreateCollapsableDependencies, opts?: ICreateCollapsableOptions): ICollapsable {\r\n\tconst { singleOpen, swapTitleDataAttribute } = opts || {};\r\n\tconst { onInit, onBeforeOpen, onBeforeClose, titleElSelector, scrollIntoViewAfterOpen, contentSelector, openClass } = deps || {};\r\n\tconst OPEN_CLASS = openClass ? openClass : \"is-collapse-open\";\r\n\tconst titleEl = expressQuerySelector(container, titleElSelector ? titleElSelector : '.technical-collapsable-title', true);\r\n\tconst contentEl = expressQuerySelector(container, contentSelector ? contentSelector : '.technical-collapse-content', false);\r\n\tlet origTitle: string;\r\n\tlet collapseTitle: string;\r\n\tif (swapTitleDataAttribute) {\r\n\t\torigTitle = titleEl.innerText;\r\n\t\tcollapseTitle = swapTitleDataAttribute ? container.getAttribute(swapTitleDataAttribute) : null;\r\n\t}\r\n\tconst closeWithBefore = async () => {\r\n\t\tif (!onBeforeClose) {\r\n\t\t\tclose();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeClose(container);\r\n\t\treturn close();\r\n\t};\r\n\r\n\tconst openWithBefore = async (scrollIntoView = false) => {\r\n\t\tif (!onBeforeOpen) {\r\n\t\t\topen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeOpen(container);\r\n\t\treturn open(scrollIntoView);\r\n\t};\r\n\r\n\tconst close = () => {\r\n\t\tif (swapTitleDataAttribute && origTitle && titleEl.innerText !== origTitle) {\r\n\t\t\ttitleEl.innerText = origTitle;\r\n\t\t}\r\n\t\tcontainer.classList.remove(OPEN_CLASS);\r\n\t};\r\n\tconst open = (shouldScrollIntoView?: boolean) => {\r\n\t\tif (singleOpen) {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(container.parentElement, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => el.classList.remove(OPEN_CLASS));\r\n\t\t}\r\n\t\tif (swapTitleDataAttribute && titleEl.innerText !== collapseTitle) {\r\n\t\t\ttitleEl.innerText = collapseTitle;\r\n\t\t}\r\n\t\tcontainer.classList.add(OPEN_CLASS);\r\n\t\tif ((scrollIntoViewAfterOpen && !isElementVisibleInViewPort(contentEl)) || shouldScrollIntoView)\r\n\t\t\ttitleEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n\t};\r\n\r\n\tconst isOpen = () => hasClass(container, OPEN_CLASS);\r\n\r\n\tconst onClick = () => !isOpen() ? openWithBefore() : closeWithBefore();\r\n\r\n\tconst button = createClickableElement(titleEl, onClick);\r\n\r\n\tonInit && onInit(container);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tshow: () => container.classList.remove('u-hide'),\r\n\t\thide: () => container.classList.add('u-hide'),\r\n\t\tclose,\r\n\t\topen: (scrollIntoView?: boolean) => openWithBefore(scrollIntoView),\r\n\t\telement: container\r\n\t} as ICollapsable;\r\n}\r\n","export function escapeForJavascript(str: string | undefined): string {\r\n\tif (!str) return \"\";\r\n\tstr = str.replace(/'/g, \"\");\r\n\tstr = str.replace(/\"/g, \"\");\r\n\tstr = str.replace(/\\\\/g, \"\");\r\n\tstr = str.replace(/[\\n\\r]/g, \"\\\\\\\\n\");\r\n\treturn str;\r\n}\r\n\r\nexport function capitalizeFirstLetterOfWords(input: string): string {\r\n\tconst words = input.split(\" \").filter(element => element);\r\n\r\n\tfor (let i = 0; i < words.length; i++) {\r\n\t\twords[i] = words[i][0].toUpperCase() + words[i].substring(1).toLowerCase();\r\n\t}\r\n\r\n\treturn words.join(\" \");\r\n}\r\n\r\nexport function onlyLetters(input: string): boolean {\r\n\treturn Boolean(input.match(/^[A-Za-z]*$/));\r\n}\r\n\r\nexport function onlyNumber(input: string): boolean {\r\n\treturn Boolean(input.match(/^[0-9]*$/));\r\n}\r\n\r\nexport function toUrlHash(input: string): string {\r\n\treturn escapeForJavascript(input).replace(' ', '-').toLowerCase();\r\n}\r\n\r\nexport function stringToBase64(inputString: string): string {\r\n\tconst bytes = new TextEncoder().encode(inputString);\r\n\tconst binString = Array.from(bytes, (byte) =>\r\n\t\tString.fromCodePoint(byte),\r\n\t).join(\"\");\r\n\treturn window.btoa(binString);\r\n}\r\n\r\nexport function base64ToString(inputBase64: string): string {\r\n\tconst binString = window.atob(inputBase64);\r\n\tconst bytes = Uint8Array.from(binString, (m) => m.codePointAt(0));\r\n\treturn new TextDecoder().decode(bytes);\r\n}\r\n","import { escapeForJavascript } from \"./string\";\r\nexport interface IErrorLog {\r\n\tmessage: string;\r\n\turl?: string;\r\n\tline?: number;\r\n\tprocess: string;\r\n}\r\n\r\nconst redirectTo500 = () => {\r\n\tif (window.location.pathname.indexOf('500.aspx') === -1) window.location.replace(\"/error\");\r\n};\r\n\r\nconst redirectToLogin = () => {\r\n\tif (window.location.pathname.indexOf('login') === -1) window.location.replace(\"/login\");\r\n};\r\n\r\nconst logError = async (errorLog: IErrorLog) => {\r\n\tawait postRequest(\"/api/v1/ApplicationService.svc/json/LogJavascriptError\", errorLog, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n};\r\n\r\nconst http = async (path: string, config: RequestInit, keepCase?: boolean): Promise => {\r\n\tconst finalPath = keepCase ? path : path.toLowerCase();\r\n\tconst request = new Request(finalPath, config);\r\n\treturn fetch(request)\r\n\t\t.then(res => {\r\n\t\t\tif (!res.ok) {\r\n\t\t\t\tHandleError(res.status, path, res.statusText).then(_ => {\r\n\t\t\t\t\treturn Promise.reject(res.statusText);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\treturn res.json().catch(() => ({}));\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n\t\t\tHandleError(error.status, path, error.statusText).then(_ => {\r\n\t\t\t\treturn Promise.reject(error.statusText);\r\n\t\t\t});\r\n\t\t});\r\n};\r\n\r\nconst httpText = async (path: string, config: RequestInit): Promise => {\r\n\tconst response = await getHttpResponse(path.toLowerCase(), config);\r\n\treturn response.ok ? response.text() : window.context.apiFailMsg || '';\r\n};\r\n\r\nconst HandleError = async (status: number, path: string, statusText: string) => {\r\n\tswitch (status) {\r\n\t\tcase 500:\r\n\t\t\tif (path.startsWith(window.context.ecomApiUrl)) {\r\n\t\t\t\treturn logError({\r\n\t\t\t\t\tline: 0,\r\n\t\t\t\t\tmessage: escapeForJavascript(statusText),\r\n\t\t\t\t\tprocess: 'Browser',\r\n\t\t\t\t\turl: path\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tredirectTo500();\r\n\t\t\tbreak;\r\n\t\tcase 450:\r\n\t\tcase 401:\r\n\t\t\tredirectToLogin();\r\n\t\t\tbreak;\r\n\t\tcase 403:\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\t// We can't call the logger service here => circular ref\r\n\t\t\tawait logError({\r\n\t\t\t\tline: 0,\r\n\t\t\t\tmessage: escapeForJavascript(statusText),\r\n\t\t\t\tprocess: 'Browser',\r\n\t\t\t\turl: path\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\nexport async function getHttpResponse(path: string, config?: RequestInit): Promise {\r\n\tconst request = new Request(path.toLowerCase(), config);\r\n\tconst response = await fetch(request);\r\n\tif (!response.ok) {\r\n\t\tawait HandleError(response.status, path, response.statusText);\r\n\t\treturn Promise.reject(response.statusText);\r\n\t}\r\n\treturn response;\r\n}\r\n\r\nexport async function getRequest(path: string, config?: RequestInit, keepCase?: boolean): Promise {\r\n\tconst init = { method: 'get', ...config };\r\n\treturn await http(path, init, keepCase);\r\n}\r\n\r\nexport async function postRequest(path: string, body: T, config?: RequestInit, traditionalBody?: boolean): Promise {\r\n\tconst init = { method: 'post', body: traditionalBody && body instanceof URLSearchParams ? body as unknown as BodyInit : JSON.stringify(body), ...config };\r\n\treturn await http(path, init);\r\n}\r\n\r\nexport async function deleteRequest(path: string, body: T, config?: RequestInit): Promise {\r\n\tconst init = { method: 'delete', body: JSON.stringify(body), ...config };\r\n\treturn await http(path, init);\r\n}\r\n\r\nexport async function postRequestWithoutBody(path: string, config?: RequestInit): Promise {\r\n\tconst init = { method: 'post', ...config };\r\n\treturn await http(path, init);\r\n}\r\n\r\nexport async function getHtmlRequest(path: string, config?: RequestInit): Promise {\r\n\tconst init = { method: 'get', ...config };\r\n\treturn await httpText(path, init);\r\n}\r\n\r\nexport async function postHtmlRequest(path: string, body: T, config?: RequestInit): Promise {\r\n\tconst init = { method: 'post', body: JSON.stringify(body), ...config };\r\n\treturn await httpText(path, init);\r\n}\r\n\r\n/* unused for now\r\nexport async function putRequest(path: string, body: T, config?: RequestInit): Promise {\r\n\tconst init = { method: 'put', body: JSON.stringify(body), ...config };\r\n\treturn await http(path, init);\r\n}*/\r\n\r\nexport function isValidPartialViewResponse(res: string) {\r\n\treturn res.indexOf('') <= 0;\r\n}\r\n","export interface IDisposable {\r\n\tdispose: () => void;\r\n\tadd?: (addDisposable: IDisposable) => void;\r\n\taddMany?: (addDisposables: IDisposable[]) => void;\r\n}\r\n\r\n/** Returns a composite disposable (disposing all child disposables) */\r\nexport function compositeDisposable(disposables: IDisposable[] | undefined): IDisposable {\r\n\t// TODO: This creates a closure, optimize?\r\n\tconst dispose = (): void => {\r\n\t\tif (composite) {\r\n\t\t\t// To avoid endless loops when calling dispose on the composite again, we first clear it.\r\n\t\t\tcomposite = null;\r\n\t\t\tif (disposables) disposables.forEach(d => d.dispose());\r\n\t\t}\r\n\t};\r\n\tconst addMany = (addDisposables: IDisposable[]): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(...addDisposables);\r\n\t};\r\n\tconst add = (addDisposable: IDisposable): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(addDisposable);\r\n\t};\r\n\tlet composite: IDisposable | null = { dispose, add, addMany };\r\n\treturn composite;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\tgetParents, hide,\r\n\thtmlToElement,\r\n\texpressQuerySelectorAll, expressRemoveClass, show\r\n} from \"../common/html\";\r\nimport {postHtmlRequest} from \"../utils/fetch\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface IPopup {\r\n\tpopup: HTMLElement | undefined;\r\n\topenAsync: () => Promise;\r\n\treplaceContent: (content: Node | string) => void;\r\n\tclose: () => void;\r\n}\r\n\r\nexport interface IPopupOptions {\r\n\treadonly closeOnClickOutsidePopup?: boolean;\r\n\treadonly onClose?: (popupEl?: HTMLElement) => void;\r\n\treadonly onBeforeOpen?: (popupEl?: HTMLElement) => void;\r\n\treadonly onBeforeClose?: (popupEl?: HTMLElement) => void;\r\n\treadonly onOpen?: (popupEl?: HTMLElement) => void;\r\n\treadonly dialogId: string;\r\n\treadonly cssClass?: string;\r\n\treadonly view: string;\r\n\treadonly forceRefresh?: boolean;\r\n\treadonly fromCache?: boolean;\r\n\treadonly data?: any;\r\n\treadonly closeOnEnter?: boolean;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nlet fetchingPopupContent = false;\r\n\r\nexport async function createPopup(options: IPopupOptions): Promise {\r\n\tlet isOpen = false;\r\n\tlet popupEl: HTMLElement;\r\n\tconst eventDisposables: IDisposable = compositeDisposable(undefined);\r\n\tconst html = expressQuerySelector(document, \"html\", true);\r\n\tconst body = expressQuerySelector(document, \"body\", true);\r\n\tlet currentY = window.scrollY;\r\n\tconst renderedDialogEl = expressQuerySelector(document, \".renderedDialogs\", true);\r\n\r\n\tconst {\r\n\t\tcloseOnClickOutsidePopup = true,\r\n\t\tonClose,\r\n\t\tonBeforeOpen,\r\n\t\tonBeforeClose,\r\n\t\tonOpen,\r\n\t\tdialogId,\r\n\t\tcssClass,\r\n\t\tview,\r\n\t\tforceRefresh,\r\n\t\tfromCache,\r\n\t\tdata,\r\n\t\tcloseOnEnter,\r\n\t\topenClass\r\n\t} = options;\r\n\r\n\tconst create = (): Promise => {\r\n\t\tlet popup: HTMLElement;\r\n\t\tif (dialogId) {\r\n\t\t\tpopup = expressQuerySelector(document, \"#\" + dialogId, false);\r\n\t\t\tif (popup) {\r\n\t\t\t\tif (forceRefresh) {\r\n\t\t\t\t\t// To keep the same position in the dom tree, so other popups with the same z-inder will remain above or under this popup\r\n\t\t\t\t\tconst tempEl = document.createElement(\"div\");\r\n\t\t\t\t\ttempEl.setAttribute(\"id\", \"temp-\"+dialogId);\r\n\t\t\t\t\tpopup.replaceWith(tempEl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn Promise.resolve(popup);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (fetchingPopupContent) return Promise.resolve(undefined);\r\n\t\tfetchingPopupContent = true;\r\n\r\n\t\t// Get the html from the server\r\n\t\tconst path = `/apicore/dialog/${view}`;\r\n\t\treturn postHtmlRequest(path.toLowerCase(), data, {headers: new Headers({'Content-type': 'application/json; charset=utf-8'})}).then(\r\n\t\t\tres => {\r\n\t\t\t\tif (!res) return Promise.resolve(undefined);\r\n\t\t\t\tconst temp = expressQuerySelector(document, \"#temp-\" + dialogId, false);\r\n\t\t\t\tif (forceRefresh && temp) {\r\n\t\t\t\t\t// To keep the same position in the dom tree, so other popups with the same z-inder will remain above or under this popup\r\n\t\t\t\t\tpopup = htmlToElement(res) as HTMLElement;\r\n\t\t\t\t\ttemp.replaceWith(popup);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpopup = renderedDialogEl.appendChild(htmlToElement(res)) as HTMLElement;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dialogId)\r\n\t\t\t\t\tpopup.setAttribute(\"id\", dialogId);\r\n\r\n\t\t\t\tif (cssClass)\r\n\t\t\t\t\texpressAddClass(popup, cssClass);\r\n\r\n\t\t\t\treturn Promise.resolve(popup);\r\n\t\t\t}).finally(() => { fetchingPopupContent = false; });\r\n\t};\r\n\tconst replaceContent = (content: Node | string) => {\r\n\t\teventDisposables.dispose();\r\n\t\tconst popupContentEl = expressQuerySelector(popupEl, '.m-popup__content', true);\r\n\t\tpopupContentEl.replaceWith(content);\r\n\t\taddOnClose();\r\n\t};\r\n\tconst close = () => {\r\n\t\tif (onBeforeClose) onBeforeClose(popupEl);\r\n\t\tif (openClass)\r\n\t\t\texpressRemoveClass(popupEl, openClass);\r\n\t\telse\r\n\t\t\thide(popupEl);\r\n\t\tisOpen = false;\r\n\t\t// Only do this if there are no other popups open\r\n\t\tconst popupEls = expressQuerySelectorAll(renderedDialogEl, \".m-popup\");\r\n\t\tconst otherOpenedPopups = popupEls.filter(p => p.id !== popupEl.id && (p.style.display === 'flex' || p.classList.contains('is-popup-open')));\r\n\t\tif (otherOpenedPopups.length === 0){\r\n\t\t\texpressRemoveClass(html, \"has-open-dialog u-no-scroll\");\r\n\t\t\texpressRemoveClass(body, \"u-no-scroll\");\r\n\t\t\tdocument.documentElement.style.marginTop = \"0px\";\r\n\t\t\twindow.scroll(0, currentY);\r\n\t\t}\r\n\t\teventDisposables.dispose();\r\n\t\tif (onClose) window.setTimeout(() => {\r\n\t\t\tif (!isOpen) onClose(popupEl);\r\n\t\t}, 200);\r\n\t};\r\n\r\n\tconst onMouseDownEvent = (ev) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (ev.target.id\r\n\t\t\t&& getParents(ev.target, \"#\" + popupEl.id).length < 1\r\n\t\t\t&& getParents(ev.target, \".m-popup\").length < 1 // support multiple popups\r\n\t\t\t&& isOpen) close();\r\n\t};\r\n\r\n\tconst onKeyDownEvent = (ev) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (ev.which === 13 || ev.keyCode === 13) if (isOpen) close();\r\n\t};\r\n\r\n\tconst onCloseEvent = () => {\r\n\t\tif (isOpen) close();\r\n\t};\r\n\r\n\tconst addOnClose = () => {\r\n\t\tconst closeButtons = expressQuerySelectorAll(popupEl, \".technical-popup-close\");\r\n\t\tcloseButtons.forEach(closeButton => {\r\n\t\t\teventDisposables.add(expressEventListener(closeButton, 'click', onCloseEvent));\r\n\t\t});\r\n\t\tif (closeOnClickOutsidePopup) {\r\n\t\t\tgetParents(popupEl).forEach(el => {\r\n\t\t\t\teventDisposables.add(expressEventListener(el, \"mousedown\", onMouseDownEvent));\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (closeOnEnter) eventDisposables.add(expressEventListener(document, \"keydown\", onKeyDownEvent));\r\n\t};\r\n\r\n\tconst openPopupAsync = (): Promise => {\r\n\t\tif (isOpen || !popupEl) return Promise.resolve();\r\n\t\tcurrentY = window.scrollY;\r\n\t\tif (onBeforeOpen) onBeforeOpen(popupEl);\r\n\t\tif (openClass)\r\n\t\t\texpressAddClass(popupEl, openClass);\r\n\t\telse\r\n\t\t\tshow(popupEl);\r\n\t\tisOpen = true;\r\n\t\taddOnClose();\r\n\t\tdocument.documentElement.style.marginTop = \"-\" + Math.round(currentY) + \"px\";\r\n\r\n\t\texpressAddClass(html, \"has-open-dialog u-no-scroll\");\r\n\t\texpressAddClass(body, \"u-no-scroll\");\r\n\r\n\t\tif (!openClass) popupEl.style.display = \"flex\";\r\n\t\tif (isOpen && onOpen) onOpen(popupEl);\r\n\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tif (!popupEl) popupEl = await create();\r\n\r\n\treturn Promise.resolve({\r\n\t\tpopup: popupEl,\r\n\t\topenAsync: openPopupAsync,\r\n\t\tclose: close,\r\n\t\treplaceContent\r\n\t} as IPopup);\r\n}\r\n","import {createPopup, IPopup} from \"./popup-new\";\r\nexport interface IShowContentDialogDependencies {\r\n\treadonly dialogId: string;\r\n\treadonly label?: string;\r\n\treadonly title?: string;\r\n\treadonly cssClass?: string;\r\n\treadonly addTitleCssClass?: boolean;\r\n\treadonly extraPopupCss?: string;\r\n\treadonly openFunction?: (popupEl: HTMLElement) => void;\t\r\n\treadonly okButtonKey?: string;\r\n\treadonly onClose? : (popupEl?: HTMLElement) => void;\r\n}\r\n\r\nexport function ShowContentDialog(deps: IShowContentDialogDependencies): Promise {\r\n\tconst { label, title, dialogId, cssClass, openFunction, okButtonKey, onClose, addTitleCssClass, extraPopupCss } = deps;\r\n\tif (!dialogId) return;\r\n\r\n\treturn createPopup({\r\n\t\tdialogId: dialogId,\r\n\t\tview: 'GenericPopup',\r\n\t\tdata: {\r\n\t\t\tBodyLabel: label?.startsWith('Label.') ? label : `Label.${label}`,\r\n\t\t\tTitleLabel: title?.startsWith('Label.') ? title : `Label.${title}`,\r\n\t\t\tExtraPopupCss: extraPopupCss,\r\n\t\t\tTitleCssClass: addTitleCssClass ? 'a-typography__no-decoration technical-popup-title' : '',\r\n\t\t\tOkButtonLabel: okButtonKey\r\n\t\t},\r\n\t\tcssClass: cssClass,\r\n\t\tcloseOnClickOutsidePopup: true,\r\n\t\tforceRefresh: true,\r\n\t\tonClose\r\n\t}).then(popup => {\r\n\t\tif (!popup.popup) return;\r\n\t\tpopup.openAsync();\r\n\t\tif (openFunction)\r\n\t\t\topenFunction(popup.popup);\r\n\t\treturn popup;\r\n\t});\r\n}\r\n","import { deleteRequest, getHtmlRequest, postRequest } from \"../utils/fetch\";\r\nimport { stringToBase64 } from \"../utils/string\";\r\n\r\nexport interface IToggleSubscription {\r\n\tapplicationId: string;\r\n\tpersonId: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\temail: string;\r\n\tsource: string;\r\n\tnewsletter: boolean;\r\n\tpersonalMessage?: boolean;\r\n\tmailFrequency?: number;\r\n\tpostalMail?: boolean;\r\n\temarsysData?: string;\r\n}\r\n\r\nexport interface ISubscription {\r\n\tapplicationId: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\temail: string;\r\n\tsource: string;\r\n}\r\n\r\nexport interface IUnSubscription {\r\n\tapplicationId: string;\r\n\tpointOfSaleId: string;\r\n\tpersonId: string;\r\n\temarsysData?: string;\r\n}\r\n\r\nexport function subscribeAsync(email: string, appId: string, posId: string, lang: string, source?: string) {\r\n\tconst subscription: ISubscription = {\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tlanguage: lang,\r\n\t\temail,\r\n\t\tsource\r\n\t};\r\n\r\n\treturn postRequest(window.context.ecomApiUrl + \"/subscriptions/subscribe\", subscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport function toggleSubscribeAsync(personId: string, email: string, appId: string, posId: string, lang: string, source?: string, newsletter?: boolean, personalMessage?: boolean, mailFrequency?: number, postalMail?: boolean, emarsysData?: string) {\r\n\tconst toggleSubscription: IToggleSubscription = {\r\n\t\tpersonId,\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tlanguage: lang,\r\n\t\temail,\r\n\t\tsource,\r\n\t\tnewsletter,\r\n\t\tpersonalMessage,\r\n\t\tmailFrequency,\r\n\t\tpostalMail,\r\n\t\temarsysData\r\n\t};\r\n\r\n\treturn postRequest(window.context.ecomApiUrl + \"/subscriptions/togglesubscribe\", toggleSubscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport function unSubscribeAsync(personId: string, appId: string, posId: string, emarsysData?: string) {\r\n\tconst unSubscription: IUnSubscription = {\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tpersonId: personId,\r\n\t\temarsysData: emarsysData\r\n\t};\r\n\r\n\treturn deleteRequest(window.context.ecomApiUrl + \"/subscriptions/unsubscribe\", unSubscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport enum Gender {\r\n\tUndefined = 0,\r\n\tMale = 1,\r\n\tFemale = 2,\r\n\tNeutral = 3\r\n}\r\n\r\nexport interface IAccount {\r\n\tfirstName: string;\r\n\tlastName: string;\r\n\temail: string;\r\n\tgender: Gender;\r\n\tdateOfBirth: Date | null;\r\n\tmobileNumber: string;\r\n\tpersonalNumber?: string;\r\n}\r\n\r\nexport enum UpdateAccountResult {\r\n\tsuccess = 0,\r\n\tduplicateEmail = 1,\r\n\tduplicateEmailInOtherDomain = 2\r\n}\r\n\r\nexport function updateAccountAsync(pointOfSaleId: string, account: IAccount): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId,\r\n\t\taccount: account\r\n\t};\r\n\treturn postRequest<{ pointOfSaleId, account }, IUpdateAccountResponse>('/apicore/myaccountapi/updateaccount', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IMailInOtherDomainError {\r\n\treadonly urlWithLink: string,\r\n\treadonly accountEmail: string\r\n}\r\n\r\nexport interface ISetPasswordResponse {\r\n\treadonly status: ChangePasswordStatus,\r\n\treadonly label: string\r\n}\r\n\r\nexport interface IUpdateAccountResponse {\r\n\treadonly status: UpdateAccountResult,\r\n\treadonly label: string\r\n}\r\n\r\nexport function getDuplicateMailInOtherDomainError(accountEmail: string, pointOfSaleId: string): Promise {\r\n\tconst args = {\r\n\t\taccountEmail,\r\n\t\tpointOfSaleId\r\n\t};\r\n\r\n\treturn postRequest<{ accountEmail, pointOfSaleId }, IMailInOtherDomainError>('apicore/myaccount/getduplicatemailinotherdomainerror', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport enum ChangePasswordStatus {\r\n\tOK = 0,\r\n\tInvalidFormat,\r\n\tEqualToOld,\r\n\tInvalidOld,\r\n\tInvalidNew,\r\n\tWeakPassword,\r\n\tError\r\n}\r\nexport function setPasswordAsync(oldPassword: string, newPassword: string, pointOfSaleId: string): Promise {\r\n\tconst args = { oldPassword, newPassword, pointOfSaleId };\r\n\r\n\targs.oldPassword = stringToBase64(oldPassword);\r\n\targs.newPassword = stringToBase64(newPassword);\r\n\treturn postRequest('/apicore/myaccountapi/setpassword', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function getAddressTiles(currentpage: string): Promise {\r\n\treturn getHtmlRequest(`/apicore/myaccountapi/getaddresstiles?currentpage=${currentpage}`, { cache: \"no-cache\" });\r\n}\r\n\r\nexport enum OkResult {\r\n\tOK = 0\r\n}\r\n\r\nexport function setAccountPreferencesAsync(configKey: string, value: boolean): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tconfigKey,\r\n\t\tvalue: value.toString()\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/setaccountpreferences', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function saveProductPreferencesAsync(disableAutoRedEyeRemoval: boolean, enableToggleimageenhancement: boolean): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tdisableAutoRedEyeRemoval,\r\n\t\tenableToggleimageenhancement\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/saveproductpreferences', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function setImageEnhancementAsync(enable: boolean): Promise {\r\n\tconst args = {\r\n\t\tenable\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/toggleimageenhancement', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IGdprAccountResult {\r\n\tsuccess: boolean;\r\n\tinfo: string;\r\n}\r\n\r\nexport function actionByMethodOnAccountAsync(method: string, password: string): Promise {\r\n\tconst args = {\r\n\t\tpassword\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/' + method, args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IGdprDownload {\r\n\tgdprDownloadLink: string;\r\n}\r\n\r\nexport function canDownloadGdprDataAsync(): Promise {\r\n\tconst args = {};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/CanDownloadGdprData', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface ICheckAccountValidityResponse {\r\n\treadonly isValid: boolean;\r\n}\r\n\r\nexport function checkAccountValidityAsync(oldAccountId: string, newAccountId: string): Promise {\r\n\tconst args = {\r\n\t\toldAccountId,\r\n\t\tnewAccountId\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/CheckAccountValidity', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n","import {getCookie} from \"../utils/cookie\";\r\nimport {ShowContentDialog} from \"./content-dialog\";\r\nimport {expressQuerySelector} from \"../common/html\";\r\nimport {IPopup} from \"./popup-new\";\r\nimport {checkAccountValidityAsync} from \"../services/account-service\";\r\n\r\nexport interface ILoginWatcher {\r\n\treadonly start: (force?: boolean) => void;\r\n\treadonly cancel: () => void;\r\n\treadonly stop: () => void;\r\n}\r\n\r\nexport function CreateAndStartLoginWatcher() {\r\n\t// Init Login-check for pages that require authentication\r\n\tif (window.context.pageRequiresAuth.toLowerCase() === 'true') {\r\n\t\twindow.loginWatcher = createLoginWatcher();\r\n\t\twindow.loginWatcher.start();\r\n\t}\r\n}\r\n\r\nexport function createLoginWatcher() {\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tlet timer = -1;\r\n\tlet startingAccId;\r\n\tlet accountType;\r\n\tlet dialog: IPopup;\r\n\tlet openDialog = false;\r\n\r\n\tconst start = (force?: boolean) => {\r\n\t\tif (timer < 0 || force) {\r\n\t\t\tif (force) openDialog = false;\r\n\t\t\tstartingAccId = getCookie(\"accid\");\r\n\t\t\tif (startingAccId === '') return;\r\n\t\t\taccountType = getCookie(\"acctype\");\r\n\r\n\t\t\t// @ts-ignore\r\n\t\t\ttimer = setInterval(() => { run(); }, 1500);\r\n\t\t}\r\n\t};\r\n\r\n\tconst run = () => {\r\n\t\tconst currentAccountId = getCookie(\"accid\");\r\n\t\tif (currentAccountId === startingAccId || openDialog) return; // return nothing to report\r\n\r\n\t\t// User logged out in another tab\r\n\t\tif (!currentAccountId || currentAccountId === emptyGuid) {\r\n\t\t\talert('Label.LoginManager.LogoutInDifferentTab', 'Label.LoginManager.LogoutInDifferentTab.PopupTitle');\r\n\t\t\tclearTimeout(timer);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// User is logged in with a different account.\r\n\t\tif (accountType === 'full') {\r\n\t\t\t// We used to be a FULL, now a different account -> Impossible\r\n\t\t\talert('Label.LoginManager.DifferentAccount', 'Label.LoginManager.DifferentAccount.PopupTitle');\r\n\t\t\tclearTimeout(timer);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// TEMP got merged into FULL -> OK\r\n\t\t// Different FULL -> NOK\r\n\t\t// We need a webservice call for this ...\r\n\t\topenDialog = true; // set this in case that the api call takes longer then the interval and it does it again\r\n\t\tcheckAccountValidityAsync(startingAccId, currentAccountId).then(res => {\r\n\t\t\topenDialog = false;\r\n\t\t\tif (!res.isValid) {\r\n\t\t\t\talert('Label.LoginManager.DifferentAccount', 'Label.LoginManager.DifferentAccount.PopupTitle');\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tstartingAccId = currentAccountId;\r\n\t\t});\r\n\t};\r\n\r\n\tconst alert = (key: string, title: string) => {\r\n\t\tif (openDialog) return;\r\n\t\topenDialog = true;\r\n\t\tconst dialogEl = expressQuerySelector(document, '.has-open-dialog', false);\r\n\t\tif (dialogEl && dialog)\r\n\t\t\tdialog.close();\r\n\r\n\t\tconst onOpen = (popupEl: HTMLElement) => {\r\n\t\t\tconst okButton = expressQuerySelector(popupEl, '.technical-general-popup-ok-button', false);\r\n\t\t\tif (okButton) okButton.addEventListener('click', closeEventPopup);\r\n\t\t};\r\n\r\n\t\tShowContentDialog({ \r\n\t\t\tdialogId: \"information\",\r\n\t\t\tlabel: key,\r\n\t\t\ttitle: title,\r\n\t\t\textraPopupCss: 'p-default',\r\n\t\t\taddTitleCssClass: false,\r\n\t\t\tokButtonKey: 'Label.OkButtonText',\r\n\t\t\topenFunction: onOpen,\r\n\t\t\tonClose : () => location.reload()\r\n\t\t}).then(popup => {\r\n\t\t\tdialog = popup;\r\n\t\t});\r\n\t};\r\n\r\n\tconst closeEventPopup = () => {\r\n\t\tlocation.reload();\r\n\t\topenDialog = false;\r\n\t\tdialog.close();\r\n\t};\r\n\r\n\tconst cancel = () => {\r\n\t\topenDialog = true; // so that it does not open while we try to cancel\r\n\t\tclearTimeout(timer);\r\n\t};\r\n\r\n\tconst stop = () => {\r\n\t\tif (timer < 0)\r\n\t\t\tclearTimeout(timer);\r\n\t};\r\n\r\n\treturn {\r\n\t\tstart,\r\n\t\tcancel,\r\n\t\tstop\r\n\t} as ILoginWatcher;\r\n}\r\n","/*\r\n * https://github.com/kraaden/autocomplete\r\n * Copyright (c) 2016 Denys Krasnoshchok\r\n * MIT License\r\n *\r\n * this commit is used : https://github.com/kraaden/autocomplete/pull/40\r\n *\r\n */\r\n\r\nexport const enum EventTrigger {\r\n\tKeyboard = 0,\r\n\tFocus = 1\r\n}\r\n\r\nexport interface IAutocompleteItem {\r\n\tlabel?: string;\r\n\tgroup?: string;\r\n}\r\n\r\nexport interface IAutocompleteSettings {\r\n\tinput: HTMLInputElement;\r\n\trender?: (item: T, currentValue: string) => HTMLDivElement | undefined;\r\n\trenderGroup?: (name: string, currentValue: string) => HTMLDivElement | undefined;\r\n\tclassName?: string;\r\n\tminLength?: number;\r\n\temptyMsg?: string;\r\n\tonSelect: (item: T, input: HTMLInputElement) => void;\r\n\t/**\r\n\t * Show autocomplete on focus event. Focus event will ignore the `minLength` property and will always call `fetch`.\r\n\t */\r\n\tshowOnFocus?: boolean;\r\n\tfetch: (text: string, update: (items: T[] | false) => void, trigger: EventTrigger) => void;\r\n\tdebounceWaitMs?: number;\r\n\t/**\r\n\t * Callback for additional autocomplete customization\r\n\t * @param {HTMLInputElement} input - input box associated with autocomplete\r\n\t * @param {ClientRect | DOMRect} inputRect - size of the input box and its position relative to the viewport\r\n\t * @param {HTMLDivElement} container - container with suggestions\r\n\t * @param {number} maxHeight - max height that can be used by autocomplete\r\n\t */\r\n\tcustomize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n\t/**\r\n\t * Prevents automatic form submit when ENTER is pressed\r\n\t */\r\n\tpreventSubmit?: boolean;\r\n\t/**\r\n\t * Prevents automatic selection of first entry when ENTER is pressed\r\n\t */\r\n\tdisableAutoSelect?: boolean;\r\n}\r\n\r\nexport interface IAutocompleteResult {\r\n\tdestroy: () => void;\r\n}\r\n\r\nconst enum Keys {\r\n\tEnter = 13,\r\n\tEsc = 27,\r\n\tUp = 38,\r\n\tDown = 40,\r\n\tLeft = 37,\r\n\tRight = 39,\r\n\tShift = 16,\r\n\tCtrl = 17,\r\n\tAlt = 18,\r\n\tCapsLock = 20,\r\n\tWindowsKey = 91,\r\n\tTab = 9,\r\n\tF1 = 112,\r\n\tF12 = 123\r\n}\r\n\r\nexport function autocomplete(settings: IAutocompleteSettings): IAutocompleteResult {\r\n\r\n\t// just an alias to minimize JS file size\r\n\tconst doc = document;\r\n\r\n\tconst container: HTMLDivElement = doc.createElement(\"div\");\r\n\tconst containerStyle = container.style;\r\n\tconst userAgent = navigator.userAgent;\r\n\tconst mobileFirefox = userAgent.indexOf(\"Firefox\") !== -1 && userAgent.indexOf(\"Mobile\") !== -1;\r\n\tconst debounceWaitMs = settings.debounceWaitMs || 0;\r\n\tconst preventSubmit = settings.preventSubmit || false;\r\n\r\n\t// 'keyup' event will not be fired on Mobile Firefox, so we have to use 'input' event instead\r\n\tconst keyUpEventName = mobileFirefox ? \"input\" : \"keyup\";\r\n\r\n\tlet items: T[] = [];\r\n\tlet inputValue = \"\";\r\n\tlet minLen = 2;\r\n\tconst showOnFocus = settings.showOnFocus;\r\n\tlet selected: T | undefined;\r\n\tlet keypressCounter = 0;\r\n\tlet debounceTimer: number | undefined;\r\n\r\n\tif (settings.minLength !== undefined) {\r\n\t\tminLen = settings.minLength;\r\n\t}\r\n\r\n\tif (!settings.input) {\r\n\t\tthrow new Error(\"input undefined\");\r\n\t}\r\n\r\n\tconst input: HTMLInputElement = settings.input;\r\n\r\n\tcontainer.className = \"autocomplete \" + (settings.className || \"\");\r\n\r\n\t// IOS implementation for fixed positioning has many bugs, so we will use absolute positioning\r\n\tcontainerStyle.position = \"absolute\";\r\n\r\n\t/**\r\n\t * Detach the container from DOM\r\n\t */\r\n\tfunction detach(): void {\r\n\t\tconst parent = container.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.removeChild(container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clear debouncing timer if assigned\r\n\t */\r\n\tfunction clearDebounceTimer(): void {\r\n\t\tif (debounceTimer) {\r\n\t\t\twindow.clearTimeout(debounceTimer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Attach the container to DOM\r\n\t */\r\n\tfunction attach(): void {\r\n\t\tif (!container.parentNode) {\r\n\t\t\tdoc.body.appendChild(container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Check if container for autocomplete is displayed\r\n\t */\r\n\tfunction containerDisplayed(): boolean {\r\n\t\treturn !!container.parentNode;\r\n\t}\r\n\r\n\t/**\r\n\t * Clear autocomplete state and hide container\r\n\t */\r\n\tfunction clear(): void {\r\n\t\t// prevent the update call if there are pending AJAX requests\r\n\t\tkeypressCounter++;\r\n\r\n\t\titems = [];\r\n\t\tinputValue = \"\";\r\n\t\tselected = undefined;\r\n\t\tdetach();\r\n\t}\r\n\r\n\t/**\r\n\t * Update autocomplete position\r\n\t */\r\n\tfunction updatePosition(): void {\r\n\t\tif (!containerDisplayed()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcontainerStyle.height = \"auto\";\r\n\t\tcontainerStyle.width = input.offsetWidth + \"px\";\r\n\r\n\t\tlet maxHeight = 0;\r\n\t\tlet inputRect: ClientRect | DOMRect | undefined;\r\n\r\n\t\tfunction calc() {\r\n\t\t\tconst docEl = doc.documentElement as HTMLElement;\r\n\t\t\tconst clientTop = docEl.clientTop || doc.body.clientTop || 0;\r\n\t\t\tconst clientLeft = docEl.clientLeft || doc.body.clientLeft || 0;\r\n\t\t\tconst scrollTop = window.pageYOffset || docEl.scrollTop;\r\n\t\t\tconst scrollLeft = window.pageXOffset || docEl.scrollLeft;\r\n\r\n\t\t\tinputRect = input.getBoundingClientRect();\r\n\r\n\t\t\tconst top = inputRect.top + input.offsetHeight + scrollTop - clientTop;\r\n\t\t\tconst left = inputRect.left + scrollLeft - clientLeft;\r\n\r\n\t\t\tcontainerStyle.top = top + \"px\";\r\n\t\t\tcontainerStyle.left = left + \"px\";\r\n\r\n\t\t\tmaxHeight = window.innerHeight - (inputRect.top + input.offsetHeight);\r\n\r\n\t\t\tif (maxHeight < 0) {\r\n\t\t\t\tmaxHeight = 0;\r\n\t\t\t}\r\n\r\n\t\t\tcontainerStyle.top = top + \"px\";\r\n\t\t\tcontainerStyle.bottom = \"\";\r\n\t\t\tcontainerStyle.left = left + \"px\";\r\n\t\t\tcontainerStyle.maxHeight = maxHeight + \"px\";\r\n\t\t}\r\n\r\n\t\t// the calc method must be called twice, otherwise the calculation may be wrong on resize event (chrome browser)\r\n\t\tcalc();\r\n\t\tcalc();\r\n\r\n\t\tif (settings.customize && inputRect) {\r\n\t\t\tsettings.customize(input, inputRect, container, maxHeight);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Redraw the autocomplete div element with suggestions\r\n\t */\r\n\tfunction update(): void {\r\n\r\n\t\t// delete all children from autocomplete DOM container\r\n\t\twhile (container.firstChild) {\r\n\t\t\tcontainer.removeChild(container.firstChild);\r\n\t\t}\r\n\r\n\t\t// function for rendering autocomplete suggestions\r\n\t\tlet render = function (item: T, currentValue: string): HTMLDivElement | undefined {\r\n\t\t\tconst itemElement = doc.createElement(\"div\");\r\n\t\t\titemElement.textContent = item.label || \"\";\r\n\t\t\treturn itemElement;\r\n\t\t};\r\n\t\tif (settings.render) {\r\n\t\t\trender = settings.render;\r\n\t\t}\r\n\r\n\t\t// function to render autocomplete groups\r\n\t\tlet renderGroup = function (groupName: string, currentValue: string): HTMLDivElement | undefined {\r\n\t\t\tconst groupDiv = doc.createElement(\"div\");\r\n\t\t\tgroupDiv.textContent = groupName;\r\n\t\t\treturn groupDiv;\r\n\t\t};\r\n\t\tif (settings.renderGroup) {\r\n\t\t\trenderGroup = settings.renderGroup;\r\n\t\t}\r\n\r\n\t\tconst fragment = doc.createDocumentFragment();\r\n\t\tlet prevGroup = \"#9?$\";\r\n\r\n\t\titems.forEach(function (item: T): void {\r\n\t\t\tif (item.group && item.group !== prevGroup) {\r\n\t\t\t\tprevGroup = item.group;\r\n\t\t\t\tconst groupDiv = renderGroup(item.group, inputValue);\r\n\t\t\t\tif (groupDiv) {\r\n\t\t\t\t\tgroupDiv.className += \" group\";\r\n\t\t\t\t\tfragment.appendChild(groupDiv);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tconst div = render(item, inputValue);\r\n\t\t\tif (div) {\r\n\t\t\t\tdiv.addEventListener(\"click\", function (ev: MouseEvent): void {\r\n\t\t\t\t\tsettings.onSelect(item, input);\r\n\t\t\t\t\tclear();\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tev.stopPropagation();\r\n\t\t\t\t});\r\n\t\t\t\tif (item === selected) {\r\n\t\t\t\t\tdiv.className += \" selected\";\r\n\t\t\t\t}\r\n\t\t\t\tfragment.appendChild(div);\r\n\t\t\t}\r\n\t\t});\r\n\t\tcontainer.appendChild(fragment);\r\n\t\tif (items.length < 1) {\r\n\t\t\tif (settings.emptyMsg) {\r\n\t\t\t\tconst empty = doc.createElement(\"div\");\r\n\t\t\t\tempty.className = \"empty\";\r\n\t\t\t\tempty.textContent = settings.emptyMsg;\r\n\t\t\t\tcontainer.appendChild(empty);\r\n\t\t\t} else {\r\n\t\t\t\tclear();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tattach();\r\n\t\tupdatePosition();\r\n\r\n\t\tupdateScroll();\r\n\t}\r\n\r\n\tfunction updateIfDisplayed(): void {\r\n\t\tif (containerDisplayed()) {\r\n\t\t\tupdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction resizeEventHandler(): void {\r\n\t\tupdateIfDisplayed();\r\n\t}\r\n\r\n\tfunction scrollEventHandler(e: Event): void {\r\n\t\tif (e.target !== container) {\r\n\t\t\tupdateIfDisplayed();\r\n\t\t} else {\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction keyupEventHandler(ev: KeyboardEvent): void {\r\n\t\tconst keyCode = ev.which || ev.keyCode || 0;\r\n\r\n\t\tconst ignore = [Keys.Up, Keys.Enter, Keys.Esc, Keys.Right, Keys.Left, Keys.Shift, Keys.Ctrl, Keys.Alt, Keys.CapsLock, Keys.WindowsKey, Keys.Tab];\r\n\t\tfor (const key of ignore) {\r\n\t\t\tif (keyCode === key) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (keyCode >= Keys.F1 && keyCode <= Keys.F12) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// the down key is used to open autocomplete\r\n\t\tif (keyCode === Keys.Down && containerDisplayed()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstartFetch(EventTrigger.Keyboard);\r\n\t}\r\n\r\n\t/**\r\n\t * Automatically move scroll bar if selected item is not visible\r\n\t */\r\n\tfunction updateScroll(): void {\r\n\t\tconst elements = container.getElementsByClassName(\"selected\");\r\n\t\tif (elements.length > 0) {\r\n\t\t\tlet element = elements[0] as HTMLDivElement;\r\n\r\n\t\t\t// make group visible\r\n\t\t\tconst previous = element.previousElementSibling as HTMLDivElement;\r\n\t\t\tif (previous && previous.className.indexOf(\"group\") !== -1 && !previous.previousElementSibling) {\r\n\t\t\t\telement = previous;\r\n\t\t\t}\r\n\r\n\t\t\tif (element.offsetTop < container.scrollTop) {\r\n\t\t\t\tcontainer.scrollTop = element.offsetTop;\r\n\t\t\t} else {\r\n\t\t\t\tconst selectBottom = element.offsetTop + element.offsetHeight;\r\n\t\t\t\tconst containerBottom = container.scrollTop + container.offsetHeight;\r\n\t\t\t\tif (selectBottom > containerBottom) {\r\n\t\t\t\t\tcontainer.scrollTop += selectBottom - containerBottom;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Select the previous item in suggestions\r\n\t */\r\n\tfunction selectPrev(): void {\r\n\t\tif (items.length < 1) {\r\n\t\t\tselected = undefined;\r\n\t\t} else if (!selected) {\r\n\t\t\tselected = items[items.length - 1];\r\n\t\t} else if (selected === items[0]) {\r\n\t\t\tselected = settings.disableAutoSelect ? undefined : items[items.length - 1];\r\n\t\t} else {\r\n\t\t\tfor (let i = items.length - 1; i > 0; i--) {\r\n\t\t\t\tif (selected === items[i] || i === 1) {\r\n\t\t\t\t\tselected = items[i - 1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Select the next item in suggestions\r\n\t */\r\n\tfunction selectNext(): void {\r\n\t\tif (items.length < 1) {\r\n\t\t\tselected = undefined;\r\n\t\t} else if (!selected) {\r\n\t\t\tselected = items[0];\r\n\t\t} else if (selected === items[items.length - 1]) {\r\n\t\t\tselected = settings.disableAutoSelect ? undefined : items[0];\r\n\t\t} else {\r\n\t\t\tfor (let i = 0; i < (items.length - 1); i++) {\r\n\t\t\t\tif (selected === items[i]) {\r\n\t\t\t\t\tselected = items[i + 1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction keydownEventHandler(ev: KeyboardEvent): void {\r\n\t\tconst keyCode = ev.which || ev.keyCode || 0;\r\n\r\n\t\tif (keyCode === Keys.Up || keyCode === Keys.Down || keyCode === Keys.Esc) {\r\n\t\t\tconst containerIsDisplayed = containerDisplayed();\r\n\r\n\t\t\tif (keyCode === Keys.Esc) {\r\n\t\t\t\tclear();\r\n\t\t\t} else {\r\n\t\t\t\tif (!containerDisplayed || items.length < 1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tkeyCode === Keys.Up\r\n\t\t\t\t\t? selectPrev()\r\n\t\t\t\t\t: selectNext();\r\n\t\t\t\tupdate();\r\n\t\t\t}\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tif (containerIsDisplayed) {\r\n\t\t\t\tev.stopPropagation();\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (keyCode === Keys.Enter) {\r\n\t\t\tif (selected) {\r\n\t\t\t\tsettings.onSelect(selected, input);\r\n\t\t\t\tclear();\r\n\t\t\t}\r\n\r\n\t\t\tif (preventSubmit) {\r\n\t\t\t\tev.preventDefault();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction focusEventHandler(): void {\r\n\t\tif (showOnFocus) {\r\n\t\t\tstartFetch(EventTrigger.Focus);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction startFetch(trigger: EventTrigger) {\r\n\t\t// if multiple keys were pressed, before we get update from server,\r\n\t\t// this may cause redrawing our autocomplete multiple times after the last key press.\r\n\t\t// to avoid this, the number of times keyboard was pressed will be\r\n\t\t// saved and checked before redraw our autocomplete box.\r\n\t\tconst savedKeypressCounter = ++keypressCounter;\r\n\r\n\t\tconst val = input.value.replace(/[<>]+/g, '');\r\n\t\tif (val.length >= minLen || trigger === EventTrigger.Focus) {\r\n\t\t\tclearDebounceTimer();\r\n\t\t\tdebounceTimer = window.setTimeout(function (): void {\r\n\t\t\t\tsettings.fetch(val, function (elements: T[] | false): void {\r\n\t\t\t\t\tif (keypressCounter === savedKeypressCounter && elements) {\r\n\t\t\t\t\t\titems = elements;\r\n\t\t\t\t\t\tinputValue = val;\r\n\t\t\t\t\t\tselected = (items.length < 1 || settings.disableAutoSelect) ? undefined : items[0];\r\n\t\t\t\t\t\tupdate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}, EventTrigger.Keyboard);\r\n\t\t\t}, trigger === EventTrigger.Keyboard ? debounceWaitMs : 0);\r\n\t\t} else {\r\n\t\t\tclear();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction blurEventHandler(): void {\r\n\t\t// we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (doc.activeElement !== input) {\r\n\t\t\t\tclear();\r\n\t\t\t}\r\n\t\t}, 200);\r\n\t}\r\n\r\n\t/**\r\n\t * Fixes #26: on long clicks focus will be lost and onSelect method will not be called\r\n\t */\r\n\tcontainer.addEventListener(\"mousedown\", function (evt: Event) {\r\n\t\tevt.stopPropagation();\r\n\t\tevt.preventDefault();\r\n\t});\r\n\r\n\t/**\r\n\t * Fixes #30: autocomplete closes when scrollbar is clicked in IE\r\n\t * See: https://stackoverflow.com/a/9210267/13172349\r\n\t */\r\n\tcontainer.addEventListener(\"focus\", () => input.focus());\r\n\r\n\t/**\r\n\t * This function will remove DOM elements and clear event handlers\r\n\t */\r\n\tfunction destroy(): void {\r\n\t\tinput.removeEventListener(\"focus\", focusEventHandler);\r\n\t\tinput.removeEventListener(\"keydown\", keydownEventHandler);\r\n\t\tinput.removeEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n\t\tinput.removeEventListener(\"blur\", blurEventHandler);\r\n\t\twindow.removeEventListener(\"resize\", resizeEventHandler);\r\n\t\tdoc.removeEventListener(\"scroll\", scrollEventHandler, true);\r\n\t\tclearDebounceTimer();\r\n\t\tclear();\r\n\t}\r\n\r\n\t// setup event handlers\r\n\tinput.addEventListener(\"keydown\", keydownEventHandler);\r\n\tinput.addEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n\tinput.addEventListener(\"blur\", blurEventHandler);\r\n\tinput.addEventListener(\"focus\", focusEventHandler);\r\n\twindow.addEventListener(\"resize\", resizeEventHandler);\r\n\tdoc.addEventListener(\"scroll\", scrollEventHandler, true);\r\n\r\n\treturn {\r\n\t\tdestroy\r\n\t};\r\n}\r\n\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressRemoveClass,\r\n\texpressToggleClass, getParents,\r\n\tisElementVisible\r\n} from \"../common/html\";\r\nimport { IAutocompleteItem, autocomplete } from \"../external/autocomplete\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { postRequest } from \"../utils/fetch\";\r\nimport { stringToBase64 } from \"../utils/string\";\r\n\r\nexport interface IBaseFormInput {\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n\treadonly inputEl: HTMLInputElement | HTMLSelectElement;\r\n\treadonly clear: (clearValue?: boolean) => void;\r\n\treadonly setError: (error: string, clear?: boolean) => void;\r\n\treadonly hide: () => void;\r\n\treadonly show: () => void;\r\n}\r\n\r\nexport interface IFormInput extends IBaseFormInput {\r\n\treadonly inputEl: HTMLInputElement;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string | boolean;\r\n}\r\n\r\nexport interface ISelectBox extends IBaseFormInput {\r\n\treadonly inputEl: HTMLSelectElement;\r\n\treadonly dispose: () => void;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string;\r\n}\r\n\r\nexport interface IPasswordInput extends IFormInput {\r\n\treadonly validatePassword: () => Promise;\r\n}\r\n\r\nexport function createBaseFormInput(containerEl: HTMLElement, altSelector?: string): IBaseFormInput {\r\n\tconst inputEl = expressQuerySelector(containerEl, altSelector || \".a-form-input__input\", true);\r\n\tconst errorParagraphEl = expressQuerySelector(containerEl, '.a-form-input__error-text');\r\n\r\n\tconst toggleAttribute = (attr: string, force: boolean) => inputEl.toggleAttribute(attr, force);\r\n\r\n\tconst toggleEnable = (enable: boolean) => {\r\n\t\ttoggleAttribute('disabled', !enable);\r\n\t\texpressToggleClass(containerEl, 'a-form-input--disabled', !enable);\r\n\t};\r\n\r\n\tconst clear = (clearValue = false) => {\r\n\t\tclearValue && (inputEl.value = '');\r\n\t\tcontainerEl.classList.remove(\"a-form-input--validated\");\r\n\t\tcontainerEl.classList.remove(\"a-form-input--error\");\r\n\t};\r\n\r\n\tconst setError = (error: string, doClear = false) => {\r\n\t\tdoClear && clear();\r\n\t\tcontainerEl.classList.remove(\"a-form-input--validated\");\r\n\t\tcontainerEl.classList.add(\"a-form-input--error\");\r\n\r\n\t\terrorParagraphEl && (errorParagraphEl.innerHTML = error);\r\n\t};\r\n\r\n\tinputEl && inputEl.addEventListener('focusin', () => clear(false));\r\n\r\n\treturn {\r\n\t\tclear,\r\n\t\tsetError,\r\n\t\tenable: () => toggleEnable(true),\r\n\t\tdisable: () => toggleEnable(false),\r\n\t\tinputEl,\r\n\t\tshow: () => containerEl.classList.remove('u-hide'),\r\n\t\thide: () => containerEl.classList.add('u-hide')\r\n\t};\r\n}\r\n\r\nexport function createCheckBox(containerEl: HTMLElement, onChange?: (checked: boolean) => void, altSelector?: string) {\r\n\tconst input = createFormInput(containerEl, altSelector);\r\n\tlet event: IDisposable;\r\n\tonChange && (event = expressEventListener(input.inputEl, \"change\", () => onChange(!!input.getValue())));\r\n\r\n\treturn {\r\n\t\t...input,\r\n\t\tdispose: () => event && event.dispose\r\n\t};\r\n}\r\n\r\nexport function createSelectBox(containerEl: HTMLElement, onSelected?: (value?: string) => void) {\r\n\tconst baseComponent = createBaseFormInput(containerEl);\r\n\tconst selectEl = baseComponent.inputEl as HTMLSelectElement;\r\n\r\n\tconst setValue = (value: string) => (selectEl.value = value);\r\n\tconst onSelect = () => onSelected && onSelected(selectEl.value);\r\n\r\n\tconst disposableEvent = expressEventListener(selectEl, 'change', onSelect);\r\n\treturn {\r\n\t\t...baseComponent,\r\n\t\tdispose: disposableEvent.dispose,\r\n\t\tinputEl: selectEl,\r\n\t\tsetValue,\r\n\t\tgetValue: () => selectEl.value\r\n\t} as ISelectBox;\r\n}\r\n\r\nexport function createFormInput(containerEl: HTMLElement, altSelector?: string): IFormInput {\r\n\tconst baseComponent = createBaseFormInput(containerEl, altSelector);\r\n\tconst inputEl = baseComponent.inputEl as HTMLInputElement;\r\n\tconst isCheckBox = inputEl.type.toLowerCase() === 'checkbox';\r\n\r\n\tconst setValue = (value: string | boolean) =>\r\n\t\tisCheckBox\r\n\t\t\t? inputEl.checked = value.toString().toLowerCase() === \"true\"\r\n\t\t\t: (inputEl.value = value.toString());\r\n\r\n\tconst getValue = () =>\r\n\t\tisCheckBox\r\n\t\t\t? inputEl.checked\r\n\t\t\t: inputEl.value;\r\n\treturn {\r\n\t\tsetValue,\r\n\t\tgetValue,\r\n\t\t...baseComponent,\r\n\t\tinputEl\r\n\t};\r\n}\r\n\r\nexport function createPasswordFormInput(containerEl: HTMLElement): IPasswordInput {\r\n\tconst formInput = createFormInput(containerEl);\r\n\tconst iconEl = expressQuerySelector(containerEl, \".technical-password-unhide-icon\", false);\r\n\tlet disposableEvent: IDisposable | null;\r\n\r\n\tconst validatePassword = (): Promise => {\r\n\t\tconst value = formInput.inputEl.value;\r\n\r\n\t\tformInput.inputEl.dataset['lastvalidatedpassword'] = null;\r\n\t\tformInput.inputEl.dataset['lastvalidatedresult'] = null;\r\n\r\n\t\treturn !value || value.length < Number.parseInt(formInput.inputEl.dataset.minlength || '6', 10)\r\n\t\t\t? Promise.resolve(false)\r\n\t\t\t: postRequest<{ password: string }, boolean>('/ajaxxhr/Login/ValidatePassword',\r\n\t\t\t\t{\r\n\t\t\t\t\tpassword: stringToBase64(formInput.inputEl.value)\r\n\t\t\t\t},\r\n\t\t\t\t{ headers: { 'Content-type': 'application/json; charset=utf-8' } }).then(res => {\r\n\t\t\t\t\tformInput.inputEl.dataset['lastvalidatedpassword'] = value;\r\n\t\t\t\t\tformInput.inputEl.dataset['lastvalidatedresult'] = `${res}`;\r\n\t\t\t\t\treturn res;\r\n\t\t\t\t});\r\n\t};\r\n\r\n\tconst onPasswordShowHideIconClick = () => {\r\n\t\tswitch (formInput.inputEl.getAttribute(\"type\")) {\r\n\t\t\tcase \"password\":\r\n\t\t\t\tformInput.inputEl.setAttribute(\"type\", \"text\");\r\n\t\t\t\tif (iconEl) iconEl.classList.add(\"a-form-input__password-unhide-icon--hide\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"text\":\r\n\t\t\t\tformInput.inputEl.setAttribute(\"type\", \"password\");\r\n\t\t\t\tif (iconEl) iconEl.classList.remove(\"a-form-input__password-unhide-icon--hide\");\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\tformInput.disable();\r\n\t\tif (iconEl) {\r\n\t\t\ticonEl.style.cursor = 'not-allowed';\r\n\t\t\tdispose();\r\n\t\t}\r\n\t};\r\n\r\n\tconst enable = () => {\r\n\t\tformInput.enable();\r\n\t\tif (iconEl) {\r\n\t\t\ticonEl.style.cursor = 'pointer';\r\n\t\t\taddEvent();\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tif (disposableEvent) disposableEvent.dispose();\r\n\t};\r\n\tconst addEvent = () => (disposableEvent = iconEl ? expressEventListener(iconEl, 'click', onPasswordShowHideIconClick) : null);\r\n\r\n\tif (iconEl) addEvent();\r\n\r\n\treturn {\r\n\t\tvalidatePassword,\r\n\t\t...formInput,\r\n\t\tdisable,\r\n\t\tenable,\r\n\t};\r\n}\r\n\r\ninterface IAutoCompleteItem extends IAutocompleteItem {\r\n\treadonly value: string;\r\n\treadonly label: string;\r\n}\r\n\r\nexport interface ICreateTextInputWithAutoCompleteDependencies {\r\n\treadonly autoCompleteSearch: (searchTerm: string) => Promise<{ value: string, label: string }[]>;\r\n\treadonly onSelect?: (item: { value: string, label: string }) => void;\r\n\treadonly customize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n\treadonly onOpen?: () => void,\r\n\treadonly onClose?: () => void,\r\n\treadonly renderTextContent?: (item: { value: string, label: string }, currentSearchterm: string) => string;\r\n\treadonly debounceWaitMs?: number;\r\n\treadonly containerInsertPosition?: InsertPosition;\r\n\treadonly containerClass?: string;\r\n\treadonly disableAutoSelect?: boolean;\r\n\treadonly preventSubmit?: boolean;\r\n\treadonly minLength?: number;\r\n}\r\n\r\nexport function createTextInputWithAutoComplete(inputEl: HTMLInputElement, deps: ICreateTextInputWithAutoCompleteDependencies) {\r\n\tconst onCloseDisposable = compositeDisposable([]);\r\n\tinputEl.setAttribute('autocomplete', 'off');\r\n\t// defaults are for choice of delivery\r\n\tconst {\r\n\t\tautoCompleteSearch,\r\n\t\tonSelect,\r\n\t\tcustomize,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t\trenderTextContent,\r\n\t\tdebounceWaitMs = 250,\r\n\t\tcontainerInsertPosition = 'beforeend',\r\n\t\tcontainerClass = 'm-autocomplete a-form-input__autocomplete',\r\n\t\tdisableAutoSelect = true,\r\n\t\tpreventSubmit = false,\r\n\t\tminLength = 3\r\n\t} = deps;\r\n\r\n\tconst onMouseDownEvent = (ev: MouseEvent, container: HTMLDivElement) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (getParents(ev.target, \".technical-search-suggestions\").length < 1) onClose();\r\n\t\tcontainer.remove();\r\n\t\tonCloseDisposable.dispose();\r\n\t};\r\n\r\n\tconst autocompleteResult = autocomplete({\r\n\t\tminLength,\r\n\t\tinput: inputEl,\r\n\t\tdisableAutoSelect,\r\n\t\tpreventSubmit,\r\n\t\tonSelect: (item: IAutoCompleteItem, input) => {\r\n\t\t\tinput.value = item.label || item.value;\r\n\t\t\tonSelect && onSelect({ value: item.value, label: item.label });\r\n\t\t},\r\n\t\tfetch: (text: string, update: (items: IAutoCompleteItem[]) => void) => {\r\n\t\t\ttext = text.toLowerCase();\r\n\t\t\tautoCompleteSearch(text)\r\n\t\t\t\t.then(res => update(res as IAutoCompleteItem[]));\r\n\t\t},\r\n\t\trender: (item: IAutoCompleteItem, currentValue: string) => {\r\n\t\t\tconst itemEl = document.createElement(\"div\");\r\n\t\t\texpressAddClass(itemEl, 'm-autocomplete__item autocomplete-suggestion technical-search-suggestions');\r\n\t\t\titemEl.innerHTML = renderTextContent && renderTextContent(item, currentValue) || `${item.label} - ${item.value}`;\r\n\r\n\t\t\treturn itemEl;\r\n\t\t},\r\n\t\tcustomize: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number): void => {\r\n\t\t\tcustomize && customize(input, inputRect, container, maxHeight);\r\n\t\t\texpressRemoveClass(container, 'autocomplete');\r\n\t\t\texpressAddClass(container, containerClass);\r\n\t\t\tcontainer.removeAttribute('style');\r\n\t\t\tcontainer.style.display = \"block\";\r\n\t\t\tconst inputContainerEl = input.parentElement!;\r\n\t\t\tinputContainerEl.insertAdjacentElement(containerInsertPosition, container);\r\n\t\t\tonOpen && onOpen();\r\n\t\t\tif (onClose) {\r\n\t\t\t\tgetParents(container).forEach(el => {\r\n\t\t\t\t\tonCloseDisposable.add(expressEventListener(el, \"mousedown\", (ev) => { onMouseDownEvent(ev, container); }));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tdebounceWaitMs\r\n\t});\r\n\r\n\tconst disposable = onClose\r\n\t\t? compositeDisposable([expressEventListener(inputEl, 'input', _ => { if (inputEl.value && inputEl.value.length < minLength) onClose(); })])\r\n\t\t: null;\r\n\r\n\treturn {\r\n\t\tdispose: () => { disposable && disposable.dispose(); onCloseDisposable && onCloseDisposable.dispose; autocompleteResult.destroy(); },\r\n\t};\r\n}\r\n","import {expressQuerySelector} from \"../common/html\";\r\n\r\nexport enum PageLogStyle {\r\n\tError,\r\n\tWarningBlue,\r\n\tWarningOrange,\r\n\tSuccess\r\n}\r\n\r\nexport interface IPageLog {\r\n\treadonly updateMessageAndStyle: (logStyle: PageLogStyle, description: string, overrideScrollTo?: boolean) => void;\r\n\treadonly hideLog: () => void;\r\n\treadonly scrollTo: () => void;\r\n}\r\n\r\nexport function createPageLog(containerEl: HTMLElement) {\r\n\r\n\tconst iconEl = expressQuerySelector(containerEl, '.technical-top-message-icon', true);\r\n\tconst descriptionEl = expressQuerySelector(containerEl, '.technical-top-message-description', true);\r\n\r\n\tconst getClassesByPrefix = (el: HTMLElement, prefix: string) => {\r\n\t\tconst classes: string[] = [].slice.call(el.classList);\r\n\t\treturn classes.filter(c => c.indexOf(prefix) > -1);\r\n\t};\r\n\r\n\tconst LOG_PREFIX = \"m-page-log--\";\r\n\tconst ICON_PREFIX = \"icon-\";\r\n\r\n\tconst getLogIconAndType = (logStyle: PageLogStyle) => {\r\n\t\tswitch (logStyle) {\r\n\t\t\tcase PageLogStyle.Error:\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttype: \"m-page-log--error\",\r\n\t\t\t\t\ticon: \"icon-error-filled\"\r\n\t\t\t\t};\r\n\t\t\tcase PageLogStyle.Success:\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttype: \"m-page-log--validation\",\r\n\t\t\t\t\ticon: \"icon-succes\"\r\n\t\t\t\t};\r\n\t\t\tcase PageLogStyle.WarningBlue:\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttype: \"m-page-log--info-blue\",\r\n\t\t\t\t\ticon: \"icon-info\"\r\n\t\t\t\t};\r\n\t\t\tcase PageLogStyle.WarningOrange:\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttype: \"m-page-log--info-orange\",\r\n\t\t\t\t\ticon: \"icon-info\"\r\n\t\t\t\t};\r\n\t\t\tdefault:\r\n\t\t\t\treturn {\r\n\t\t\t\t\ttype: \"m-page-log--error\",\r\n\t\t\t\t\ticon: \"icon-error-filled\"\r\n\t\t\t\t};\r\n\t\t}\r\n\t};\r\n\r\n\tconst showLog = () => containerEl.classList.remove(\"u-hide\");\r\n\r\n\tconst hideLog = () => containerEl.classList.add(\"u-hide\");\r\n\r\n\tconst scrollTo = () => window.scrollTo({top: getOffsetTop(containerEl), behavior: 'smooth'});\r\n\r\n\tconst getOffsetTop = (offsetElemet: HTMLElement) => {\r\n\t\tlet offsetTop = 0;\r\n\t\tlet elem: HTMLElement | undefined = offsetElemet;\r\n\t\tdo {\r\n\t\t\tif (elem.offsetTop > 0) {\r\n\t\t\t\toffsetTop += elem.offsetTop;\r\n\t\t\t}\r\n\r\n\t\t\telem = elem.offsetParent as HTMLElement | undefined;\r\n\t\t} while (elem);\r\n\t\treturn offsetTop;\r\n\t};\r\n\r\n\tconst updateMessageAndStyle = (logStyle: PageLogStyle, description: string, overrideScrollTo = false) => {\r\n\t\tconst disableScroll = description === descriptionEl.innerHTML;\r\n\t\tcontainerEl.classList.remove(...getClassesByPrefix(containerEl, LOG_PREFIX));\r\n\t\ticonEl.classList.remove(...getClassesByPrefix(iconEl, ICON_PREFIX));\r\n\r\n\t\tconst {type, icon} = getLogIconAndType(logStyle);\r\n\r\n\t\tcontainerEl.classList.add(type);\r\n\t\ticonEl.classList.add(icon);\r\n\r\n\t\tdescriptionEl.innerHTML = description;\r\n\t\tshowLog();\r\n\t\tif (!disableScroll || overrideScrollTo)\r\n\t\t\tscrollTo();\r\n\t};\r\n\r\n\treturn {\r\n\t\tupdateMessageAndStyle,\r\n\t\thideLog,\r\n\t\tscrollTo\r\n\t} as IPageLog;\r\n}\r\n","import { expressEventListener, expressQuerySelector, getParentWithClassName } from \"../common/html\";\r\nimport { createButton } from \"./button\";\r\nimport { createFormInput, createPasswordFormInput, createSelectBox, IFormInput, IPasswordInput, ISelectBox } from \"./form-input\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\n\r\n\r\nexport interface IInitFormDependencies {\r\n\treadonly alternativeButton?: HTMLButtonElement;\r\n\treadonly buttonSelector?: string;\r\n\treadonly onSubmitForm: (data: { [inputName: string]: string }) => Promise;\r\n\treadonly submitOnEnter?: boolean;\r\n\treadonly validatorOptions?: ICreateFromValidatorOptions;\r\n}\r\n\r\n// provide custom behaviour\r\nexport interface ICreateFromValidatorOptions {\r\n\treadonly classTo?: string; // class of the parent element where the error/success class is added\r\n\treadonly errorClass?: string;\r\n\treadonly successClass?: string;\r\n\treadonly errorTextParent?: string; // class of the parent element where error text element is appended\r\n\treadonly errorTextTag?: string; // type of element to create for the error text\r\n\treadonly errorTextClass?: string; // class of the error text element\r\n\treadonly onValidate?: () => void;\r\n}\r\n\r\nexport interface IFormValidator {\r\n\treadonly validate: () => boolean;\r\n\treadonly reset: () => void;\r\n}\r\n\r\nexport interface IForm {\r\n\treadonly dispose: () => void;\r\n\treadonly disableForm: (disable: boolean) => void;\r\n\treadonly disableInput: (name: string) => void;\r\n\treadonly validate: () => Promise;\r\n\treadonly setErrors: (clear?: boolean, ...errors: { name: string, error: string }[]) => void;\r\n\treadonly clearInputs: (clearValue?: boolean, ...names: string[]) => void;\r\n\treadonly clearAll: () => void;\r\n\treadonly setValues: (...values: { name: string, value: string }[]) => void;\r\n\treadonly hideInput: (name: string) => void;\r\n\treadonly inputs: { [p: string]: ISelectBox | IFormInput }\r\n}\r\n\r\nexport function initForm(formEl: HTMLFormElement, deps: IInitFormDependencies) {\r\n\tconst {\r\n\t\talternativeButton,\r\n\t\tonSubmitForm,\r\n\t\tbuttonSelector,\r\n\t\tsubmitOnEnter,\r\n\t\tvalidatorOptions,\r\n\t} = deps;\r\n\tconst submitButtonEl = alternativeButton || expressQuerySelector(formEl, buttonSelector || '.m-form__button-continue', true);\r\n\tconst validator = createFormValidator(formEl, validatorOptions);\r\n\tlet onKeyUpEvent: IDisposable;\r\n\tconst formElements = [].slice.call(formEl.elements);\r\n\tconst inputs: { [name: string]: ISelectBox | IFormInput; } = {};\r\n\r\n\tformElements\r\n\t\t.filter(el => !el.matches(\"button\"))\r\n\t\t.forEach(el => {\r\n\t\t\t// The element can be : INPUT (regular or password), TEXTAREA, SELECT,\r\n\t\t\tlet input: ISelectBox | IFormInput | null = null;\r\n\t\t\tconst email = el.attributes.getNamedItem(\"email\");\r\n\t\t\tif ((email && email.value === \"email\") || el.type === \"email\")\r\n\t\t\t\tel.maxLength = 100;\r\n\r\n\t\t\tif (el.classList.contains('a-form-input__select'))\r\n\t\t\t\tinput = createSelectBox(getParentWithClassName(el, 'a-form-input')!);\r\n\t\t\telse if (el.classList.contains('a-form-input__input'))\r\n\t\t\t\tinput = el.type === \"password\" ? createPasswordFormInput(getParentWithClassName(el, 'a-form-input')!) : createFormInput(getParentWithClassName(el, 'a-form-input')!);\r\n\r\n\t\t\t// If not those 3, it's something else -> leave it alone\r\n\t\t\tif (input)\r\n\t\t\t\tinputs[input.inputEl.id.toLowerCase()] = input;\r\n\t\t});\r\n\r\n\tconst getInputs = () => Object.keys(inputs).map(key => inputs[key]);\r\n\r\n\tconst clearAll = (clearValues = false) => {\r\n\t\tgetInputs()\r\n\t\t\t.map(input => {\r\n\t\t\t\tinput.clear(clearValues);\r\n\t\t\t\tinput.setError('', true);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst resetValidation = () => {\r\n\t\tclearAll();\r\n\t\tvalidator.reset();\r\n\t};\r\n\r\n\tconst validate = async (): Promise => {\r\n\t\tresetValidation();\r\n\r\n\t\t// Pristine validation cannot handle async api calls\r\n\t\t// Call the validation before the pristine call\r\n\t\t// So pristine can look at dataattributes to valiate\r\n\t\tconst validations = Object.keys(inputs)\r\n\t\t\t.map(name => !inputs[name]['validatePassword'] ? Promise.resolve(true) : (inputs[name] as IPasswordInput).validatePassword());\r\n\t\tawait Promise.all(validations);\r\n\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\tconst formData = () => {\r\n\t\tconst data: { [name: string]: string } = {};\r\n\t\tObject.keys(inputs).forEach(name => data[name] = inputs[name].getValue().toString() || \"\");\r\n\t\treturn data;\r\n\t};\r\n\r\n\tconst onSubmit = () => {\r\n\t\treturn validate().then(res => res ? onSubmitForm(formData()) : Promise.resolve());\r\n\t};\r\n\r\n\tconst submitButton = createButton(submitButtonEl, onSubmit);\r\n\r\n\tif (submitOnEnter && submitButtonEl && submitButtonEl.type.toLowerCase() !== \"submit\") {\r\n\t\tonKeyUpEvent = expressEventListener(\r\n\t\t\tformEl,\r\n\t\t\t'keypress',\r\n\t\t\t(ev: KeyboardEvent) => {\r\n\t\t\t\tif (ev.key === \"Enter\" || ev.keyCode === 13) {\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tonSubmit();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tconst getInputByName: (name: string) => ISelectBox | IFormInput | undefined =\r\n\t\t(name: string) => inputs[name.toLowerCase()];\r\n\r\n\tconst dispose = () => {\r\n\t\tclearAll(true);\r\n\t\tsubmitButton.dispose();\r\n\t\tonKeyUpEvent && onKeyUpEvent.dispose();\r\n\t};\r\n\r\n\tconst toggleSubmitButton = (enable: boolean) => enable ? submitButton.enable() : submitButton.disable();\r\n\r\n\tconst setError = (name: string, error: string, clear = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setError(error, clear);\r\n\t};\r\n\r\n\tconst setErrors = (clear = false, ...errors: { name: string, error: string }[]) => {\r\n\t\terrors.forEach(e => setError(e.name, e.error, clear));\r\n\t\tif (errors.length) {\r\n\t\t\tconst input = getInputByName(errors[0].name);\r\n\t\t\tif (input) input.inputEl.parentElement!.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n\t\t}\r\n\t};\r\n\r\n\tconst clearInput = (name: string, clearValue = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.clear(clearValue);\r\n\t};\r\n\r\n\tconst clearInputs = (clearValue = false, ...names: string[]) => names.forEach(name => clearInput(name, clearValue));\r\n\r\n\tconst disableForm = (disable: boolean) => {\r\n\t\tgetInputs().map(i => disable ? i.disable() : i.enable());\r\n\t\tresetValidation();\r\n\t\ttoggleSubmitButton(!disable);\r\n\t};\r\n\r\n\tconst disableInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.disable();\r\n\t};\r\n\r\n\tconst setValue = (name: string, value: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setValue(value);\r\n\t};\r\n\r\n\tconst setValues = (...values: { name: string, value: string }[]) =>\r\n\t\tvalues.filter(v => getInputByName(v.name))\r\n\t\t\t.forEach(v => setValue(v.name, v.value));\r\n\r\n\tconst hideInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.hide();\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tdisableForm,\r\n\t\tdisableInput,\r\n\t\tvalidate,\r\n\t\tsetErrors,\r\n\t\tclearInputs,\r\n\t\tclearAll: () => clearAll(true),\r\n\t\tsetValues,\r\n\t\thideInput,\r\n\t\tinputs\r\n\t} as IForm;\r\n}\r\n\r\nexport function createFormValidator(form: HTMLFormElement, options: ICreateFromValidatorOptions = {}): IFormValidator {\r\n\r\n\tconst {\r\n\t\tclassTo = \"a-form-input\",\r\n\t\terrorClass = \"a-form-input--error\",\r\n\t\tsuccessClass = \"a-form-input--validated\",\r\n\t\terrorTextClass = \"a-form-input__error-text\",\r\n\t\terrorTextParent = \"a-form-input\",\r\n\t\terrorTextTag = \"p\",\r\n\t\tonValidate\r\n\t} = options;\r\n\r\n\tconst config: config = {\r\n\t\tclassTo: classTo,\r\n\t\terrorClass: errorClass,\r\n\t\tsuccessClass: successClass,\r\n\t\terrorTextClass: errorTextClass,\r\n\t\terrorTextParent: errorTextParent,\r\n\t\terrorTextTag: errorTextTag\r\n\t};\r\n\r\n\tconst validator = new Pristine(form, config, false);\r\n\tconst validate = () => {\r\n\t\tif (onValidate) onValidate();\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\treturn {\r\n\t\tvalidate,\r\n\t\treset: () => validator.reset()\r\n\t};\r\n}\r\n","export function getFullQuerystring(url?: string): string {\r\n\turl = url || window.location.href;\r\n\tconst pos = url.indexOf(\"?\");\r\n\tif (pos > -1) {\r\n\t\treturn url.substring(pos + 1);\r\n\t} else {\r\n\t\treturn url;\r\n\t}\r\n}\r\n\r\nexport function getParameters(url?: string): { [key: string]: string } {\r\n\tconst queryString = getFullQuerystring(url);\r\n\t// remove hash parameter and split querystring param\r\n\tconst pairs = queryString.split('#')[0].split(\"&\");\r\n\tconst params: { [key: string]: string } = {};\r\n\tfor (const pair of pairs) {\r\n\t\tconst [key, value] = pair.split(\"=\");\r\n\t\tparams[key.toLowerCase()] = value !== undefined ? value : \"true\"; // Providing just the key means key=true\r\n\t}\r\n\treturn params;\r\n}\r\n\r\nexport function getParameter(key: string, url?: string, required?: boolean): string;\r\nexport function getParameter(key: string, url?: string, required = false): string {\r\n\tconst queryStringParam = getParameters(url)[key ? key.toLowerCase() : key];\r\n\tif (required && !queryStringParam) throw new Error(`No queryStringParam for Required key: ${key}`);\r\n\treturn queryStringParam;\r\n}\r\n\r\nexport function updateParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\r\n\tlet newAdditionalURL = \"\";\r\n\tlet tempArray = url.split(\"#\");\r\n\tconst hash = tempArray[1] ? tempArray[1] : '';\r\n\tconst additionalURL = tempArray[0] ? tempArray[0].split(\"?\")[1] : '';\r\n\tconst baseURL = tempArray[0] ? tempArray[0].split(\"?\")[0] : '';\r\n\tlet temp = \"\";\r\n\tif (additionalURL) {\r\n\t\ttempArray = additionalURL.split(\"&\");\r\n\t\tfor (let i = 0; i < tempArray.length; i++) {\r\n\t\t\tif (tempArray[i].split('=')[0] !== key) {\r\n\t\t\t\tnewAdditionalURL += temp + tempArray[i];\r\n\t\t\t\ttemp = \"&\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet result = temp;\r\n\tif (value)\r\n\t\tresult += \"\" + key + \"=\" + value;\r\n\telse\r\n\t\tresult = result.substring(0, result.length - 1);\r\n\r\n\tif (!newAdditionalURL && !result)\r\n\t\treturn baseURL + (hash ? '#' + hash : '');\r\n\r\n\treturn baseURL + \"?\" + newAdditionalURL + result + (hash ? '#' + hash : '');\r\n}\r\n\r\nexport function addParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\tif (url.indexOf(key) > 0) return updateParameter(key, value, url);\r\n\tif (url.indexOf('?') > 0) {\r\n\t\turl += '&' + key + \"=\" + value;\r\n\t} else {\r\n\t\turl += '?' + key + \"=\" + value;\r\n\t}\r\n\treturn url;\r\n}\r\n\r\nexport function objectToQueryString(o: object): string {\r\n\treturn '?' + Object.keys(o).map(function (key) {\r\n\t\treturn key + '=' + o[key];\r\n\t}).join('&');\r\n}\r\n\r\nexport function queryRemoveKeys(queryKeys: string[]): string {\r\n\tlet url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\r\n\tqueryKeys.forEach(x => {\r\n\t\turl = updateParameter(x ? x.toLowerCase() : x, '', url);\r\n\t});\r\n\r\n\treturn url;\r\n}\r\n\r\nexport function queryRemove(): string {\r\n\tconst url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\tconst b = url.substring(a);\r\n\treturn url.replace(b, \"\");\r\n}\r\n","import { expressEventListener, expressQuerySelector, expressQuerySelectorAll, expressRemoveClass, show } from \"../common/html\";\r\nimport { postHtmlRequest, postRequest } from \"../utils/fetch\";\r\nimport { initForm } from \"./form\";\r\nimport {addParameter, getFullQuerystring, getParameter, updateParameter} from \"../utils/querystring\";\r\nimport { createPopup, IPopup } from \"./popup-new\";\r\nimport { createButton, IButton } from \"./button\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\nimport { createPageLog, PageLogStyle } from \"./page-log\";\r\nimport { stringToBase64 } from \"../utils/string\";\r\n\r\nenum ExternalLoginProvider {\r\n\tGoogle = 0,\r\n\tFacebook = 1\r\n}\r\n\r\ninterface SignInButton {\r\n\tProvider: ExternalLoginProvider;\r\n\tButtonEl: HTMLElement;\r\n\tButton: IButton;\r\n}\r\nconst signInButtons: SignInButton[] = [];\r\n\r\nconst getMediaParterForLabel = function (mediaStorePartnerType: string): string {\r\n\tif (mediaStorePartnerType === 'googlephotos') {\r\n\t\treturn 'Google';\r\n\t}\r\n\r\n\treturn mediaStorePartnerType;\r\n};\r\n\r\nexport interface ICreateLoginRegisterDependencies {\r\n\tonSuccess?: () => void;\r\n\tpageLogEl?: HTMLElement;\r\n\tcloseLoginPopup?: () => void;\r\n}\r\n\r\nexport function CreateLoginRegisterComponents(addSuccessQueryToRedirectUrl = false) {\r\n\tif (!window.context.authenticationPopupEnabled) return;\r\n\r\n\tconst loginComponents = expressQuerySelectorAll(document, '.technical-authentication-link');\r\n\tconst createAuthenticationPopup = (mode?: string) => {\r\n\t\tcreatePopup({\r\n\t\t\tdialogId: 'LoginRegisterComponent',\r\n\t\t\tview: 'Authentication',\r\n\t\t\tdata: { Email: getParameter('Email'), Mode: mode || 'login' },\r\n\t\t\tforceRefresh: true\r\n\t\t}).then(res => {\r\n\t\t\tif (!res.popup) return;\r\n\t\t\twindow.loginWatcher && window.loginWatcher.cancel();\r\n\t\t\tCreateLoginRegister(res.popup, {\r\n\t\t\t\tonSuccess: () => {\r\n\t\t\t\t\taddSuccessQueryToRedirectUrl\r\n\t\t\t\t\t? window.location.href = addParameter('success', 'true', window.location.href)\r\n\t\t\t\t\t: window.location.reload();\r\n\t\t\t\t},\r\n\t\t\t\tpageLogEl: expressQuerySelector(document, '.technical-top-message-log', false),\r\n\t\t\t\tcloseLoginPopup: res.close\r\n\t\t\t});\r\n\t\t\tres.openAsync();\r\n\t\t});\r\n\t};\r\n\r\n\tloginComponents.forEach(x => {\r\n\t\tconst button = expressQuerySelector(x, '.technical-authentication-link-button', false);\r\n\t\tbutton && button.addEventListener('click', (e: Event) => { e.preventDefault(); createAuthenticationPopup(button.getAttribute('data-mode')); });\r\n\r\n\t\tconst registerLink = expressQuerySelector(x, '.technical-authentication-register-link');\r\n\t\tregisterLink && registerLink.addEventListener('click', (e: Event) => { e.preventDefault(); createAuthenticationPopup(registerLink.getAttribute('data-mode')); });\r\n\t});\r\n}\r\n\r\nexport function CreateLoginRegister(containerEl?: HTMLElement, deps?: ICreateLoginRegisterDependencies) {\r\n\tconst loginRegisterEls = expressQuerySelectorAll(containerEl ?? document, '.technical-login-register-container');\r\n\tconst { onSuccess, pageLogEl, closeLoginPopup } = deps;\r\n\tconst loginComponents = loginRegisterEls.map(x => {\r\n\t\treturn ExpressLoginComponent(x, {\r\n\t\t\t\ttoggleElementClicked: (loginMode: boolean) => { loginComponents.forEach(x => x.toggleShow(x.loginMode === loginMode)); },\r\n\t\t\t\tonSuccess: onSuccess,\r\n\t\t\t\tpageLogEl,\r\n\t\t\t\tcloseLoginPopup\r\n\t\t\t});\r\n\t});\r\n}\r\nexport interface LoginComponentDeps {\r\n\ttoggleElementClicked: (loginMode) => void;\r\n\tonSuccess: () => void;\r\n\tpageLogEl?: HTMLElement;\r\n\tcloseLoginPopup?: () => void;\r\n}\r\n\r\ninterface IExpressLoginRequest {\r\n\tEmail: string;\r\n\tPassword: string;\r\n\tRememberMe: string;\r\n\tRedirectUrl: string;\r\n\tCurrentUrl: string;\r\n}\r\ninterface IExpressLoginResult {\r\n\tredirectUrl: string;\r\n\tisNotAuthenticated: boolean;\r\n\terrorMsg: string;\r\n\tblockingErrorMsg: string;\r\n\tblockingErrorLabel: string;\r\n\taccountId: string;\r\n\tcartId: string;\r\n\tisSoftDeleted: boolean;\r\n}\r\ninterface ILoginSubmitResult {\r\n\treadonly redirectUrl?: string;\r\n\treadonly isNotAuthenticated?: boolean;\r\n\treadonly errorMsg?: string;\r\n\treadonly blockingErrorMsg?: string;\r\n\treadonly accountId?: string;\r\n\treadonly cartId?: string;\r\n\treadonly isSoftDeleted?: boolean;\r\n}\r\ninterface IExpressRegisterRequest {\r\n\tEmail: string;\r\n\tPassword: string;\r\n\tConfirmedPassword: string;\r\n\tPersonalMessage: string;\r\n\tNewsLetter: string;\r\n\tConditions: string;\r\n\tRedirectUrl: string;\r\n}\r\ninterface IExpressRegisterResponse {\r\n\tsuccess: boolean;\r\n\taccountInOtherDomain: string;\r\n\tredirectUrl: string;\r\n\taccountId: string;\r\n\tcartId: string;\r\n\tswitchToLogin: boolean;\r\n\tmessage: string;\r\n\temail: string;\r\n\taccountBlocked: string;\r\n\tisSoftDeleted: true;\r\n}\r\ninterface ILoginUserAtSmartPhotoResult {\r\n\treadonly accountData?: IAccountData;\r\n\treadonly loginResult: ILoginResult;\r\n\treadonly accountType: string;\r\n\treadonly cartView?: string;\r\n\treadonly msgView?: string;\r\n\treadonly redirectUrl?: string;\r\n\treadonly success?: boolean;\r\n}\r\ninterface IAccountData {\r\n\treadonly DeliveryAddressData: IAddress;\r\n\treadonly BillingAddressData: IAddress;\r\n\treadonly Email: string;\r\n\treadonly FirstName: string;\r\n\treadonly HideNewsletter: boolean;\r\n\treadonly LastName: string;\r\n\treadonly Message?: string;\r\n\treadonly SendNewsletter?: boolean;\r\n\treadonly ShowProfileForm?: boolean;\r\n\treadonly ShowProfileFormExtraText?: boolean;\r\n}\r\nexport interface IAddress {\r\n\tHouseNumber?: string;\r\n\tId?: string;\r\n\tIsDefault?: boolean;\r\n\tCity?: string;\r\n\tRegionCountryISO?: string;\r\n\treadonly Country?: string;\r\n\tFirstName?: string;\r\n\tLastName?: string;\r\n\tCompanyName?: string;\r\n\tLine1?: string;\r\n\tLine2?: string;\r\n\tLine3?: string;\r\n\tLine4?: string;\r\n\tZipCode?: string;\r\n\tVatNumber?: string;\r\n\tStreet?: string;\r\n\tBoxNumber?: string;\r\n\tExtraAddressInformation?: string;\r\n}\r\nexport interface ICreateFacebookLoginButtonDependencies {\r\n\treadonly loginUserAtSmartPhoto: (uid: string, accessToken: string, expire: number, mediaStorePartnerType: string, newEmail: string, skipLogin: boolean, onOrderFlow: boolean, async: boolean) => Promise;\r\n}\r\ninterface ILoginResult {\r\n\tAccountId: string;\r\n\ttempAccountId: string;\r\n\treadonly PersonId: string;\r\n\treadonly cartId: string;\r\n\treadonly Email: string;\r\n\treadonly redirectUrl: string;\r\n\treadonly success: string;\r\n\treadonly PopUpCase: string;\r\n}\r\nexport function ExpressLoginComponent(containerEl: HTMLElement, deps: LoginComponentDeps) {\r\n\tconst { toggleElementClicked, onSuccess, closeLoginPopup } = deps;\r\n\tconst loginMode = containerEl.dataset.mode === 'register';\r\n\tconst form = expressQuerySelector(containerEl, '.technical-login-register-form', true);\r\n\tconst externalLoginSubmitButtons = expressQuerySelectorAll(containerEl, '.technical-external-login');\r\n\tconst toggleEl = expressQuerySelector(containerEl, '.o-authentication-form__footer .technical-label a', false); // link in label\r\n\tconst forgetPassword = expressQuerySelector(containerEl, '.technical-forgot-password', false);\r\n\r\n\tconst login = async (data): Promise => {\r\n\t\ttry {\r\n const res = await postRequest('/ajaxxhr/Login/NormalLogin',\r\n {\r\n Email: data['email'],\r\n Password: stringToBase64(data['password']),\r\n RememberMe: data['rememberme'],\r\n RedirectUrl: decodeURIComponent(getParameter('ReturnUrl')),\r\n CurrentUrl: window.location.pathname\r\n },\r\n { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n const _ = handleLoginResult(res, data);\r\n return;\r\n } catch (err) {\r\n const res_2 = await postHtmlRequest(\"/apicore/logapi/LogInformation\", { InformationText: `user logged in with express with errors: ${err}`, Error: true }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n return;\r\n }\r\n\t};\r\n\tconst createIsSoftDeletedPopup = (view: string, dialogId: string, data: any) => {\r\n\t\tconst undeleteAsync = async (formData: any) => {\r\n\t\t\tconst response = await postRequest('/ajaxxhr/Login/UndeleteLogin', formData, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n if (response && ((response as any).PopUpCase) || (response as any).loginResult) {\r\n handleExternalLoginResult(\r\n response,\r\n data.LoginUserAtSmartPhotoModelData.MediaStorePartnerType,\r\n data.LoginUserAtSmartPhotoModelData.Async,\r\n undefined,\r\n undefined,\r\n undefined,\r\n undefined,\r\n data.LoginUserAtSmartPhotoModelData.Uid,\r\n data.LoginUserAtSmartPhotoModelData.AccessToken);\r\n } else {\r\n handleLoginResult(response as ILoginSubmitResult as IExpressLoginResult, formData);\r\n }\r\n\t\t};\r\n\r\n\t\tcreatePopup({\r\n\t\t\tview: view,\r\n\t\t\tdialogId: dialogId,\r\n\t\t\tdata: {\r\n\t\t\t\tQuestion: 'Label.UserLogin.LoginPage.DeletedAccount.Description',\r\n\t\t\t\tTitle: 'Label.UserLogin.LoginPage.DeletedAccount.Title',\r\n\t\t\t\tOkMnemonic: 'Label.UserLogin.LoginPage.DeletedAccount.Continue',\r\n\t\t\t\tCancelMnemonic: 'Label.UserLogin.LoginPage.DeletedAccount.Cancel'\r\n\t\t\t}\r\n\t\t})\r\n\t\t\t.then(popup => {\r\n\t\t\t\tconst dialog = expressQuerySelector(document, '#' + dialogId, true);\r\n\t\t\t\tconst okButton = expressQuerySelector(dialog, '.technical-remove-confirmation-yes-button', true);\r\n\t\t\t\tconst cancelButton = expressQuerySelector(dialog, '.technical-remove-confirmation-no-button', true);\r\n\r\n\t\t\t\tokButton.addEventListener(\"click\", function () { popup.close(); undeleteAsync(data); });\r\n\t\t\t\tcancelButton.addEventListener(\"click\", function () { popup.close(); });\r\n\r\n\t\t\t\tpopup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\tconst createPopupWithBodyLabel = (view: string, dialogId: string, bodyLabel: string, extraPopupCss?: string, extraPopupSetup?: (popupEl: IPopup) => void) => {\r\n\t\tlet replacements: string[] = [];\r\n\t\tif (bodyLabel.indexOf('|') > 0) {\r\n\t\t\tconst bodyArr = bodyLabel.split('|');\r\n\t\t\tbodyLabel = bodyArr[0];\r\n\t\t\treplacements = bodyArr[1].split(',');\r\n\t\t}\r\n\r\n\t\tcreatePopup({\r\n\t\t\tview: view,\r\n\t\t\tdialogId: dialogId,\r\n\t\t\tdata: {\r\n\t\t\t\tBodyLabel: bodyLabel,\r\n\t\t\t\tBodyReplacements: replacements,\r\n\t\t\t\tOkButtonLabel: 'Label.CloseButtonText',\r\n\t\t\t\tExtraPopupCss: `p-default ${extraPopupCss}`\r\n\t\t\t}\r\n\t\t}).then(res => {\r\n\t\t\tconst dialog = expressQuerySelector(document, '#' + dialogId, true);\r\n\t\t\tconst okButton = expressQuerySelector(dialog, '.technical-general-popup-ok-button', true);\r\n\r\n\t\t\tokButton.addEventListener(\"click\", function () { res.close(); });\r\n\t\t\textraPopupSetup && extraPopupSetup(res);\r\n\r\n\t\t\tres.openAsync();\r\n\t\t});\r\n\t};\r\n\tconst externalLogin = (containerEl: HTMLButtonElement, provider: ExternalLoginProvider) => {\r\n\t\tswitch (provider) {\r\n\t\t\tcase ExternalLoginProvider.Google: return createGoogleLogin(containerEl, {\r\n\t\t\t\tappId: containerEl.getAttribute(\"app_id\") || '',\r\n\t\t\t\tloginCallback: (uid, accessToken, expire, scope) => loginUserAtSmartPhoto(uid, accessToken, expire, \"googlephotos\", \"\", false, !!containerEl.getAttribute(\"data-orderflow\"), false, scope)\r\n\t\t\t});\r\n\t\t\tcase ExternalLoginProvider.Facebook: return createFacebookLoginButton(containerEl, { loginUserAtSmartPhoto: loginUserAtSmartPhoto });\r\n\t\t}\r\n\t};\r\n\tconst loginUserAtSmartPhoto = async (uid: string, accessToken: string, expire: number, mediaStorePartnerType: string, newEmail: string, skipLogin: boolean, onOrderFlow: boolean, async: boolean, scope?: string) => {\r\n\t\tconst res = await postRequest<{ userId: string; accessToken: string; expire: number; mediastorePartnerType: string; newEmail: string; skipLogin: boolean; onOrderFlow: boolean; async: boolean; scope?: string; }, ILoginResult | ILoginUserAtSmartPhotoResult>('/ajaxxhr/Login/LoginUserAtSmartPhoto', {\r\n userId: uid,\r\n accessToken: accessToken,\r\n expire: expire,\r\n mediastorePartnerType: mediaStorePartnerType,\r\n newEmail: newEmail,\r\n skipLogin: skipLogin,\r\n onOrderFlow: onOrderFlow,\r\n async: async,\r\n scope: scope\r\n }, { headers: { 'Content-type': 'application/json; charset=utf-8' } }\r\n );\r\n return handleExternalLoginResult(res, mediaStorePartnerType, async, undefined, undefined, undefined, undefined, uid, accessToken);\r\n\t};\r\n\r\n\tconst handleLoginResult = (res: IExpressLoginResult, data: any) => {\r\n\t\tif (res.isNotAuthenticated && !res.errorMsg && !res.blockingErrorMsg) res.errorMsg = 'Something went wrong';\r\n\t\tif (res.errorMsg) {\r\n\t\t\t// show error in page\r\n\t\t\tformComponent.inputs['email'].setError(res.errorMsg);\r\n\t\t\tformComponent.inputs['password'].setError(res.errorMsg);\r\n\t\t}\r\n\r\n\t\tif (res.isSoftDeleted) {\r\n\t\t\tconst formData = {\r\n\t\t\t\tEmail: data['email'],\r\n\t\t\t\tPassword: stringToBase64(data['password']),\r\n\t\t\t\tRememberMe: data['rememberme'],\r\n\t\t\t\tRedirectUrl: decodeURIComponent(getParameter('ReturnUrl'))\r\n\t\t\t};\r\n\r\n\t\t\t// show popup\r\n\t\t\tcreateIsSoftDeletedPopup(\"ConfirmDialog\", \"isSoftDeleted\", formData);\r\n\t\t}\r\n\r\n\t\tif (res.blockingErrorLabel) {\r\n\t\t\tif (formComponent) {\r\n\t\t\t\tformComponent.inputs['password'].clear();\r\n\t\t\t\tformComponent.inputs['password'].setValue('');\r\n\t\t\t}\r\n\r\n\t\t\t// show popup\r\n\t\t\tcreatePopupWithBodyLabel(\"AccountBlocked\", \"blockingErrorMsg\", res.blockingErrorLabel, '', (popupEL: IPopup) => {\r\n\t\t\t\tconst link = expressQuerySelector(popupEL.popup, 'a', false);\r\n\t\t\t\tif (!link) return;\r\n\r\n\t\t\t\tlink.addEventListener('click', e => {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\tpopupEL.close();\r\n\t\t\t\t\topenForgotPasswordPopup();\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (!res.isNotAuthenticated && res.redirectUrl && res.redirectUrl.length > 0) {\r\n\t\t\tconst dataLayer = window.dataLayer || [];\r\n\t\t\tdataLayer.push({ 'event': 'login' });\r\n\t\t\tconst iframe = expressQuerySelector(document, '#dataLayerIframe', false);\r\n\t\t\tif (iframe && iframe.contentWindow && (iframe.contentWindow as any).pushDataLayer) {\r\n\t\t\t\t(iframe.contentWindow as any).pushDataLayer({ 'event': 'login' });\r\n\t\t\t}\r\n\r\n\t\t\tif (!getParameter('embed')) {\r\n\t\t\t\t// redirect\r\n\t\t\t\treturn onSuccess ? onSuccess() : window.location.href = res.redirectUrl;\r\n\t\t\t} else if (typeof parent != undefined) {\r\n\t\t\t\t// @ts-ignore\r\n\t\t\t\tparent.eXpress && parent.eXpress.loggedOn && parent.eXpress.loggedOn({ accountId: res.accountId, cartId: res.cartId });\r\n\t\t\t\tparent.document.dispatchEvent(new CustomEvent('loggedOn.loginDialog'));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\tconst handleExternalLoginResult = (\r\n\t\tresponse: ILoginResult | ILoginUserAtSmartPhotoResult,\r\n\t\tmediaStorePartnerType: string,\r\n\t\tasync: boolean,\r\n\t\taccountId = \"\",\r\n\t\ttempAccountId = \"\",\r\n\t\tshowConfirmationBeforeRedirect = false,\r\n\t\tloginNotCorrect = false,\r\n\t\tuid = \"\",\r\n\t\taccessToken = \"\") => {\r\n\t\tlet loginUserAtSmartPhotoResponse: ILoginUserAtSmartPhotoResult | undefined = undefined;\r\n\t\tlet loginResult: ILoginResult | undefined = undefined;\r\n\r\n\t\tif (response && (response as any).loginResult)\r\n\t\t\tloginUserAtSmartPhotoResponse = response as ILoginUserAtSmartPhotoResult;\r\n\t\telse\r\n\t\t\tloginResult = response as ILoginResult;\r\n\r\n\t\tlet asyncSuccess = true;\r\n\t\tif (async) {\r\n\t\t\tif (loginResult && loginResult.success == 'true') {\r\n\t\t\t\tasyncSuccess = false;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (async && asyncSuccess && loginUserAtSmartPhotoResponse) {\r\n\t\t\tloginResult = loginUserAtSmartPhotoResponse.loginResult as ILoginResult;\r\n\t\t}\r\n\t\tif (asyncSuccess && loginResult && loginResult.success == 'true') {\r\n\t\t\tif (loginResult.redirectUrl) {\r\n\t\t\t\tif (!getParameter('embed')) {\r\n\t\t\t\t\tonSuccess ? onSuccess() : window.location.href = loginResult.redirectUrl ? window.location.origin + loginResult.redirectUrl : window.location.origin;\r\n\t\t\t\t} else if (typeof parent != undefined) {\r\n\t\t\t\t\t// @ts-ignore\r\n\t\t\t\t\tparent.eXpress && parent.eXpress.loggedOn && parent.eXpress.loggedOn({ accountId: loginResult.AccountId, cartId: loginResult.CartId });\r\n\t\t\t\t\tparent.document.dispatchEvent(new CustomEvent('loggedOn.loginDialog'));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (loginResult) {\r\n\t\t\t// We need to correct the result for TEMP accounts (only Popupcase and success are returned)\r\n\t\t\tif (!loginResult.AccountId && accountId) loginResult.AccountId = accountId;\r\n\t\t\tif (!loginResult.tempAccountId && tempAccountId) loginResult.tempAccountId = tempAccountId;\r\n\t\t\thandleLoginFailed(loginResult, mediaStorePartnerType, loginNotCorrect, async, getMediaParterForLabel(mediaStorePartnerType), uid, accessToken);\r\n\t\t}\r\n\t};\r\n\tconst handleLoginFailed = (\r\n\t\tloginResult: ILoginResult,\r\n\t\tmediaStorePartnerType: string,\r\n\t\tloginNotCorrect: boolean,\r\n\t\tasync: boolean,\r\n\t\tmediaStorePartnerLabel: string,\r\n\t\tuid = \"\",\r\n\t\taccessToken = \"\",\r\n\t\texpire = 0,\r\n\t\tskipLogin = false) => {\r\n\r\n\t\tconst alreadyTriedNewEmail = false;\r\n\t\tlet accountInOtherDomainCalled = 0;\r\n\r\n\t\tswitch (loginResult.PopUpCase) {\r\n\t\t\tcase \"AccountDeleted\":\r\n\t\t\t\tcreateIsSoftDeletedPopup(\"ConfirmDialog\", \"isSoftDeleted\", {\r\n\t\t\t\t\tEmail: loginResult.Email,\r\n\t\t\t\t\tPassword: \"\",\r\n\t\t\t\t\tRememberMe: false,\r\n\t\t\t\t\tRedirectUrl: decodeURIComponent(getParameter('ReturnUrl')),\r\n\t\t\t\t\tLoginUserAtSmartPhotoModelData: {\r\n\t\t\t\t\t\tUserId: uid,\r\n\t\t\t\t\t\tAccessToken: accessToken,\r\n\t\t\t\t\t\tExpire: expire,\r\n\t\t\t\t\t\tMediaStorePartnerType: mediaStorePartnerType,\r\n\t\t\t\t\t\tNewEmail: \"\",\r\n\t\t\t\t\t\tSkipLogin: skipLogin,\r\n\t\t\t\t\t\tOnOrderFlow: false,\r\n\t\t\t\t\t\tAsync: async\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"AccountBlocked\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'AccountBlocked',\r\n\t\t\t\t\tview: 'GenericPopup',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tBodyLabel: 'Label.UserLogin.AccountBlocked',\r\n\t\t\t\t\t\tOkButtonLabel: 'Label.OkButtonText',\r\n\t\t\t\t\t\tExtraPopupCss: `p-default`\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst okButton = expressQuerySelector(res.popup, '.technical-general-popup-ok-button', true);\r\n\t\t\t\t\tokButton.addEventListener(\"click\", function () { res.close(); });\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"AskPassword\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'AskPassword',\r\n\t\t\t\t\tview: 'AskPasswordDialog',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tLoginNotCorrect: loginNotCorrect,\r\n\t\t\t\t\t\tAccountId: loginResult.AccountId,\r\n\t\t\t\t\t\tAlreadyTriedEmail: alreadyTriedNewEmail,\r\n\t\t\t\t\t\tMediaStorePartnerLabel: mediaStorePartnerLabel\r\n\t\t\t\t\t},\r\n\t\t\t\t\tforceRefresh: true\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst formEl = expressQuerySelector(res.popup, \".technical-ask-password-form\", true);\r\n\t\t\t\t\tconst sendPassWordLinkEl = expressQuerySelector(res.popup, \".technical-send-password-link\", true);\r\n\t\t\t\t\tconst passwordSendEl = expressQuerySelector(res.popup, \".technical-password-send\", true);\r\n\r\n\t\t\t\t\tconst confirmAskPassword = async (password: string) => {\r\n\t\t\t\t\t\tconst singleSignOnResponse = await postRequest<{ accountId: string; tempAccountId: string; mediastorePartnerType: string; password: string; async: boolean; }, ILoginResult | ILoginUserAtSmartPhotoResult>('/ajaxxhr/Login/SingleSignOnConfirmPassword', {\r\n accountId: loginResult.AccountId,\r\n tempAccountId: loginResult.tempAccountId,\r\n mediastorePartnerType: mediaStorePartnerType,\r\n password: stringToBase64(password),\r\n async: async\r\n }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n res.close();\r\n handleExternalLoginResult(singleSignOnResponse, mediaStorePartnerType, async, loginResult.AccountId, loginResult.tempAccountId, true, true);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tconst sendPassword = (email: string) => {\r\n\t\t\t\t\t\treturn postRequest('/ajaxxhr/Login/SingleSignOnSendPassword', {\r\n\t\t\t\t\t\t\temail: email,\r\n\t\t\t\t\t\t\turl: encodeURIComponent(window.location.href)\r\n\t\t\t\t\t\t}, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tinitForm(formEl, {\r\n\t\t\t\t\t\tonSubmitForm: (formData) => confirmAskPassword(formData[\"password\"]),\r\n\t\t\t\t\t\tsubmitOnEnter: true\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tsendPassWordLinkEl.addEventListener('click', e => {\r\n\t\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\t\tshow(passwordSendEl);\r\n\t\t\t\t\t\tconst email = sendPassWordLinkEl.dataset.email;\r\n\t\t\t\t\t\temail && sendPassword(email);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"AlreadyLoggedIn\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'AlreadyLoggedIn',\r\n\t\t\t\t\tview: 'GenericPopup',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tBodyLabel: 'Label.UserLogin.LoginPage.AlreadyLoggedIn',\r\n\t\t\t\t\t\tOkButtonLabel: 'Label.OkButtonText',\r\n\t\t\t\t\t\tExtraPopupCss: `p-default`\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst okButton = expressQuerySelector(res.popup, '.technical-general-popup-ok-button', true);\r\n\t\t\t\t\tokButton.addEventListener(\"click\", function () { res.close(); });\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"FatalErrorMessage\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: `${mediaStorePartnerLabel}_FatalErrorMessage`,\r\n\t\t\t\t\tview: 'GenericPopup',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tBodyLabel: 'Label.SingleSignOn.FatalError',\r\n\t\t\t\t\t\tOkButtonLabel: 'Label.OkButtonText',\r\n\t\t\t\t\t\tExtraPopupCss: `p-default`,\r\n\t\t\t\t\t\tBodyReplacements: [mediaStorePartnerLabel]\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst okButton = expressQuerySelector(res.popup, '.technical-general-popup-ok-button', true);\r\n\t\t\t\t\tokButton.addEventListener(\"click\", function () { res.close(); });\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\t// case \"ConfirmEmail\": break; // WEB-3835 => no longer used\r\n\t\t\t// case \"OtherEmail\": break;// WEB-3835 => no longer used\r\n\t\t\tcase \"FbIdAlreadyConnected\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: `${mediaStorePartnerLabel}_AlreadyConnected`,\r\n\t\t\t\t\tview: 'GenericPopup',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tBodyLabel: `Label.Profile.SingleSignOn.${mediaStorePartnerLabel}.Error.AlreadyConnected`,\r\n\t\t\t\t\t\tOkButtonLabel: 'Label.OkButtonText',\r\n\t\t\t\t\t\tExtraPopupCss: `p-default`,\r\n\t\t\t\t\t\tBodyReplacements: [mediaStorePartnerLabel]\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst okButton = expressQuerySelector(res.popup, '.technical-general-popup-ok-button', true);\r\n\t\t\t\t\tokButton.addEventListener(\"click\", function () { res.close(); });\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"AccountInOtherDomain\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'AccountInOtherDomain',\r\n\t\t\t\t\tview: 'AccountInOtherDomainDialog',\r\n\t\t\t\t\tforceRefresh: true,\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\taccountId: loginResult.AccountId,\r\n\t\t\t\t\t\talreadyTriedEmail: accountInOtherDomainCalled > 0\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tinitForm(\r\n\t\t\t\t\t\texpressQuerySelector(res.popup, '.technical-account-in-other-domain-form'),\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tonSubmitForm: formData => {\r\n\t\t\t\t\t\t\t\tres.close();\r\n\t\t\t\t\t\t\t\treturn loginUserAtSmartPhoto(uid, accessToken, expire, mediaStorePartnerType, formData[\"email\"], skipLogin, false, async);\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tsubmitOnEnter: true\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\taccountInOtherDomainCalled++;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"ShowNewsletter\":\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'ShowNewsletter',\r\n\t\t\t\t\tview: 'ShowNewsletterDialog',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst redirectUrl = loginResult.redirectUrl;\r\n\t\t\t\t\tconst confirmShowNewsletter = async (isChecked: boolean): Promise => {\r\n\t\t\t\t\t\tconst updatedResult = await postRequest('/ajaxxhr/Login/UpdateNewsletterCheckBox', {\r\n personId: loginResult.PersonId,\r\n isChecked: isChecked\r\n }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n res.close();\r\n redirectUrl &&\r\n window.setTimeout(function() {\r\n window.location.href = redirectUrl.replace(/'/g, '');\r\n }, 0);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tinitForm(\r\n\t\t\t\t\t\texpressQuerySelector(res.popup, '.technical-show-newsletter-form'),\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tonSubmitForm: formData => confirmShowNewsletter(formData[\"newslettersso\"] === 'true'),\r\n\t\t\t\t\t\t\tsubmitOnEnter: true\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'ConfirmEmail':\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'confirmation-email',\r\n\t\t\t\t\tview: 'GenericPopup',\r\n\t\t\t\t\tforceRefresh: true,\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tTitleLabel: 'Label.SingleSignOn.ConfirmationEmailTitle',\r\n\t\t\t\t\t\tBodyLabel: 'Label.SingleSignOn.ConfirmationEmailQuestion',\r\n\t\t\t\t\t\tOkButtonLabel: 'Label.ContinueButtonText',\r\n\t\t\t\t\t\tExtraPopupCss: 'p-default',\r\n\t\t\t\t\t\tExtraHeaderCss: 'm-popup__header__title a-typography__no-decoration',\r\n\t\t\t\t\t\tBodyReplacements: [loginResult.Email, mediaStorePartnerLabel]\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst continueButton = expressQuerySelector(res.popup, '.technical-general-popup-ok-button', true);\r\n\t\t\t\t\tconst singleSignOnConfirmationEmail = async (dialog: IPopup) => {\r\n\t\t\t\t\t\ttry {\r\n const _ = await postHtmlRequest('/ajaxxhr/Login/SingleSignOnConfirmEmailWs',\r\n {\r\n email: loginResult.Email,\r\n tempAccountId: loginResult.tempAccountId,\r\n mediastorePartnerType: mediaStorePartnerType,\r\n returnUrl: 'default'\r\n },\r\n { headers: { 'Content-type': 'application/json; charset=utf-8' } }\r\n );\r\n if (dialog)\r\n dialog.close();\r\n } catch (__1) {\r\n if (dialog)\r\n dialog.close();\r\n }\r\n\t\t\t\t\t};\r\n\t\t\t\t\tcontinueButton.addEventListener('click', _ => singleSignOnConfirmationEmail(res));\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'generalError',\r\n\t\t\t\t\tview: 'GenericPopup',\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tBodyLabel: 'Label.Profile.SingleSignOn.' + getMediaParterForLabel(mediaStorePartnerType) + '.GeneralError',\r\n\t\t\t\t\t\tOkButtonLabel: 'Label.OkButtonText',\r\n\t\t\t\t\t\tExtraPopupCss: `p-default`,\r\n\t\t\t\t\t\tBodyReplacements: [mediaStorePartnerLabel]\r\n\t\t\t\t\t}\r\n\t\t\t\t}).then(res => {\r\n\t\t\t\t\tconst okButton = expressQuerySelector(res.popup, '.technical-general-popup-ok-button', true);\r\n\t\t\t\t\tokButton.addEventListener(\"click\", function () { res.close(); });\r\n\t\t\t\t\tres.openAsync();\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\tconst register = async (data): Promise => {\r\n\t\ttry {\r\n const res = await postRequest('/ajaxxhr/Login/Registration', {\r\n Email: data['email'],\r\n Password: stringToBase64(data['password']),\r\n ConfirmedPassword: stringToBase64(data['password']),\r\n PersonalMessage: data['personalmessage'] || 'false',\r\n NewsLetter: data['newsletter'],\r\n Conditions: data['termsandconditions'],\r\n RedirectUrl: decodeURIComponent(getParameter('ReturnUrl') || '')\r\n },\r\n { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n if (res.switchToLogin && res.success)\r\n toggleElementClicked(loginMode);\r\n\r\n if (res.success) {\r\n const datalayer = window.dataLayer || [];\r\n datalayer.push({ 'event': 'fullAccount' });\r\n const iframe = expressQuerySelector(document, '#dataLayerIframe', false);\r\n if (iframe && iframe.contentWindow && (iframe.contentWindow as any).pushDataLayer)\r\n (iframe.contentWindow as any).pushDataLayer({ 'event': 'fullAccount' });\r\n\r\n if (!getParameter('embed')) {\r\n // redirect\r\n onSuccess ? onSuccess() : window.location.href = res.redirectUrl ? res.redirectUrl : window.location.origin;\r\n } else if (typeof parent != undefined) {\r\n // @ts-ignore\r\n parent.eXpress && parent.eXpress.loggedOn && parent.eXpress.loggedOn({ accountId: res.accountId, cartId: res.cartId });\r\n parent.document.dispatchEvent(new CustomEvent('loggedOn.loginDialog'));\r\n }\r\n }\r\n\r\n if (res.message) {\r\n // show message in page\r\n formComponent.inputs['password'].setError(res.message);\r\n }\r\n\r\n if (res.isSoftDeleted) {\r\n const formData = {\r\n Email: data['email'],\r\n Password: stringToBase64(data['password']),\r\n RememberMe: false,\r\n RedirectUrl: decodeURIComponent(getParameter('ReturnUrl'))\r\n };\r\n\r\n // show popup\r\n createIsSoftDeletedPopup(\"ConfirmDialog\", \"isSoftDeleted\", formData);\r\n }\r\n\r\n if (res.accountInOtherDomain) {\r\n // show popup\r\n createPopupWithBodyLabel(\"GenericPopup\", \"accountInOtherDomain\", res.accountInOtherDomain);\r\n }\r\n\r\n if (res.accountBlocked) {\r\n // show popup\r\n createPopupWithBodyLabel(\"AccountBlocked\", \"accountBlocked\", res.accountBlocked);\r\n }\r\n const _ = undefined;\r\n return;\r\n } catch (err) {\r\n const __1 = await postHtmlRequest(\"/apicore/logapi/LogInformation\", { InformationText: `user registerd with express with errors ${err}`, Error: true }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n return;\r\n }\r\n\t};\r\n\r\n\tconst formComponent = initForm(form, {\r\n\t\tonSubmitForm: !loginMode ? login : register,\r\n\t\talternativeButton: expressQuerySelector(containerEl, '.technical-submit-button')\r\n\t});\r\n\r\n\texternalLoginSubmitButtons.forEach(x => externalLogin(x, ExternalLoginProvider[x.dataset.provider]));\r\n\ttoggleEl && toggleEl.addEventListener('click', e => { e.preventDefault(); toggleElementClicked(loginMode); });\r\n\tconst openForgotPasswordPopup = (successMsg?: string) => {\r\n\t\tcreatePopup({\r\n\t\t\tdialogId: 'forgotPassword',\r\n\t\t\tview: 'ForgotPasswordDialog',\r\n\t\t\tforceRefresh: true,\r\n\t\t\tcloseOnClickOutsidePopup: true\r\n\t\t}).then(res => {\r\n\t\t\tconst formEl = expressQuerySelector(res.popup, '.technical-forgot-password-form');\r\n\t\t\tinitForm(formEl, {\r\n\t\t\t\tonSubmitForm: (data: { [inputName: string]: string }) => postRequest('/apicore/authenticationapi/forgotpassword', { email: data['email'] }, { headers: { 'Content-type': 'application/json; charset=utf-8' } }).then(_ => {\r\n\t\t\t\t\tif (successMsg && deps.pageLogEl) {\r\n\t\t\t\t\t\tsuccessMsg = successMsg.replace(\"[Email]\", data['email']);\r\n\t\t\t\t\t\tconst pageLog = createPageLog(deps.pageLogEl);\r\n\t\t\t\t\t\tpageLog.updateMessageAndStyle(PageLogStyle.Success, successMsg, true);\r\n\t\t\t\t\t\tif (closeLoginPopup) closeLoginPopup();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tres.close();\r\n\t\t\t\t}),\r\n\t\t\t\tsubmitOnEnter: true\r\n\t\t\t});\r\n\t\t\tres.openAsync();\r\n\t\t});\r\n\t};\r\n\tforgetPassword && forgetPassword.addEventListener('click', e => {\r\n\t\te.preventDefault();\r\n\t\tconst successMsg = forgetPassword.dataset.successmsg || '';\r\n\t\topenForgotPasswordPopup(successMsg);\r\n\t});\r\n\r\n\treturn {\r\n\t\tloginMode,\r\n\t\ttoggleShow: (force?: boolean) => {\r\n\t\t\tcontainerEl.classList.toggle('u-hide', force);\r\n\r\n\t\t\tif (force) return;\r\n\r\n\t\t\tgetFullQuerystring().includes(\"embed\") && containerEl.scrollIntoView({ inline: 'start', block: 'start', behavior: 'auto' });\r\n\t\t\thistory.replaceState(null, '', updateParameter('mode', containerEl.dataset.mode).toLowerCase());\r\n\t\t}\r\n\t};\r\n}\r\n\r\n\r\n\r\nconst enableButton = (button: IButton) => {\r\n\tbutton.enable();\r\n\r\n\tconst item = signInButtons.filter(b => b.Button == button)[0];\r\n\titem && expressRemoveClass(item.ButtonEl, 'skeleton-loading');\r\n};\r\n\r\nconst enableAllButtons = (provider: ExternalLoginProvider) => {\r\n\tsignInButtons.filter(b => b.Provider == provider).forEach(b => {\r\n\t\tenableButton(b.Button);\r\n\t});\r\n};\r\n\r\nlet gapiLoaded = false;\r\nexport function createGoogleLogin(googleLoginButtonEl: HTMLButtonElement, deps: { appId: string, loginCallback: (uid: string, accessToken: string, expire: number, scope: string) => Promise, onInit?: () => void }) {\r\n\tconst { appId, loginCallback, onInit } = deps;\r\n\tconst scope = \"profile email \" + googleLoginButtonEl.dataset.scope;\r\n\tconst errorsToIgnore = [\"popup_closed_by_user\", \"access_denied\"];\r\n\tlet disposableEvent: IDisposable;\r\n\r\n\tconst googleButton = createButton(googleLoginButtonEl);\r\n\tsignInButtons.push({ Provider: ExternalLoginProvider.Google, ButtonEl: googleLoginButtonEl, Button: googleButton});\r\n\r\n\tconst onClick = (ev: Event) => {\r\n\t\tif (ev.preventDefault) {\r\n\t\t\tev.preventDefault();\r\n\t\t}\r\n\t\tev.stopPropagation();\r\n\r\n\t\t// Google popups reuse the same popup. Enable all buttons before opening/reloading the popup\r\n\t\tenableAllButtons(ExternalLoginProvider.Google);\r\n\t\tgoogleButton.disable();\r\n\t};\r\n\r\n\tconst initClient = () => {\r\n\t\t// gapi not yet ready\r\n\t\tif (!gapiLoaded) {\r\n\t\t\tsetTimeout(initClient, 50);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tgapi.auth2.init({\r\n\t\t\tclient_id: appId,\r\n\t\t\tfetch_basic_profile: true,\r\n\t\t\tscope\r\n\t\t}).then(auth => {\r\n\t\t\tonInit && onInit();\r\n\t\t\tdisposableEvent = expressEventListener(googleLoginButtonEl, 'click', onClick);\r\n\t\t\tauth.attachClickHandler(\r\n\t\t\t\tgoogleLoginButtonEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tscope,\r\n\t\t\t\t\tprompt: \"select_account consent\"\r\n\t\t\t\t},\r\n\t\t\t\t(user) => {\r\n\t\t\t\t\tconst authResponse = user.getAuthResponse(true);\r\n\t\t\t\t\tloginCallback(\r\n\t\t\t\t\t\tuser.getBasicProfile().getId(),\r\n\t\t\t\t\t\tauthResponse.access_token,\r\n\t\t\t\t\t\tauthResponse.expires_in,\r\n\t\t\t\t\t\tauthResponse.scope\r\n\t\t\t\t\t).finally(() => enableAllButtons(ExternalLoginProvider.Google));\r\n\t\t\t\t},\r\n\t\t\t\t(reason) => { // sign in failed\r\n\t\t\t\t\tenableAllButtons(ExternalLoginProvider.Google);\r\n\t\t\t\t\tconst error = reason[\"error\"];\r\n\t\t\t\t\tif (error && !errorsToIgnore.some((value) => value === error)) {\r\n\t\t\t\t\t\tthrow new Error(error);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t\tenableButton(googleButton);\r\n\t\t}, (reason) => { // init client failed\r\n\t\t\tenableButton(googleButton); // Enable to remove skeleton-loading\r\n\t\t\tgoogleButton.disable();\r\n\t\t\tthrow new Error(`${reason.error} : ${reason.details}`);\r\n\t\t});\r\n\t};\r\n\r\n\t// Add the script only once\r\n\tconst googleScriptSrc = 'https://apis.google.com/js/client:platform.js';\r\n\tconst scripts = document.getElementsByTagName('script');\r\n\tfor (const item of scripts) {\r\n\t\tif (item.src === googleScriptSrc) {\r\n\t\t\t// Script-tag already exists. Manually call init-func\r\n\t\t\tinitClient();\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t// load google script async\r\n\tconst scriptEl = document.createElement('script');\r\n\tscriptEl.type = 'text/javascript';\r\n\tscriptEl.async = true;\r\n\tscriptEl.defer = true;\r\n\tscriptEl.onload = () => gapi.load('client:auth2', () => { gapiLoaded = true; initClient(); });\r\n\tscriptEl.src = googleScriptSrc;\r\n\tconst firstScriptEl = document.getElementsByTagName('script')[0];\r\n\tfirstScriptEl.parentElement!.insertBefore(scriptEl, firstScriptEl);\r\n}\r\n\r\nexport function createFacebookLoginButton(facebookLoginButtonEl: HTMLButtonElement, deps: ICreateFacebookLoginButtonDependencies) {\r\n\tconst { loginUserAtSmartPhoto } = deps;\r\n\tlet disposableEvent: IDisposable;\r\n\tlet isFacebookInitialized = false;\r\n\tlet facebookLoggedIn = false;\r\n\tlet onOrderFlow = false;\r\n\r\n\tconst scopePhotos = 'user_photos';\r\n\tlet scopeExtra = '';\r\n\tconst scopeEmail = 'email';\r\n\tlet facebookScope = scopePhotos + ',' + scopeEmail;\r\n\tconst mediaStorePartnerType = 'facebook';\r\n\r\n\tconst facebookButton = createButton(facebookLoginButtonEl);\r\n\tsignInButtons.push({ Provider: ExternalLoginProvider.Facebook, ButtonEl: facebookLoginButtonEl, Button: facebookButton });\r\n\r\n\tconst onClick = (ev: Event) => {\r\n\t\tif (ev.preventDefault) {\r\n\t\t\tev.preventDefault();\r\n\t\t}\r\n\t\tev.stopPropagation();\r\n\t\tfacebookButton.disable();\r\n\t\tconst perms = facebookLoginButtonEl.dataset.perms ? facebookLoginButtonEl.dataset.perms : '';\r\n\t\tloginToFacebook(false, perms, true);\r\n\t};\r\n\r\n\tconst init = () => {\r\n\t\tif (typeof (FB) === \"undefined\")\r\n\t\t\treturn;\r\n\r\n\t\tif (!isFacebookInitialized) {\r\n\t\t\tconst appId = facebookLoginButtonEl.dataset.appid ? facebookLoginButtonEl.dataset.appid : '';\r\n\t\t\tinitFacebook(appId);\r\n\t\t}\r\n\r\n\t\tdisposableEvent = expressEventListener(facebookLoginButtonEl, 'click', onClick);\r\n\t\tenableButton(facebookButton);\r\n\r\n\t\tFB.getLoginStatus(function (loginresponse) {\r\n\t\t\tif (loginresponse.status === 'connected') {\r\n\t\t\t\tconst uid = loginresponse.authResponse.userID;\r\n\t\t\t\t/* make the API call */\r\n\t\t\t\tFB.api(\r\n\t\t\t\t\t\"/\" + uid + \"/permissions\",\r\n\t\t\t\t\tfunction (response) {\r\n\t\t\t\t\t\tfacebookLoggedIn = false;\r\n\t\t\t\t\t\tif (response && !response.error) {\r\n\t\t\t\t\t\t\tif (response.data && response.data.length > 0 && response.data[0] !== null) {\r\n\t\t\t\t\t\t\t\tif (response.data[0].email === 1 && response.data[0].user_photos === 1) {\r\n\t\t\t\t\t\t\t\t\tfacebookLoggedIn = true;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t} else if (loginresponse.status === 'not_authorized') {\r\n\t\t\t\t// the user is logged in to Facebook, but has not authenticated your app\r\n\t\t\t\tfacebookLoggedIn = false;\r\n\t\t\t} else {\r\n\t\t\t\t// the user isn't logged in to Facebook.\r\n\t\t\t\tfacebookLoggedIn = false;\r\n\t\t\t}\r\n\t\t}, true);\r\n\t};\r\n\r\n\tconst initFacebook = (appId: string) => {\r\n\t\tFB.init({ appId: appId, status: false, cookie: true, version: 'v22.0' }); //status: false check the login status upon init -> we will do this with getLoginStatus\r\n\t\tisFacebookInitialized = true;\r\n\t};\r\n\r\n\tconst fBLoginWithPermissions = (skipLogin, async) => {\r\n\r\n\t\t//showLoadingDialog();\r\n\t\t// fbdialogTimer = window.setTimeout(HideLoadingDialog, 3000);\r\n\t\tFB.login(function (loginresponse) {\r\n\t\t\t// clearTimeout(fbdialogTimer);\r\n\t\t\t// connected\r\n\t\t\tif (loginresponse.authResponse) {\r\n\t\t\t\t// check if all permissions are granted (result is also 'connected' when permissions are partialy granted)\r\n\t\t\t\tconst uid = loginresponse.authResponse.userID;\r\n\t\t\t\t//showLoadingDialog();\r\n\t\t\t\tFB.api(\r\n\t\t\t\t\t\"/\" + uid + \"/permissions\",\r\n\t\t\t\t\tfunction (response) {\r\n\t\t\t\t\t\tfacebookLoggedIn = false;\r\n\t\t\t\t\t\tif (response && !response.error) {\r\n\t\t\t\t\t\t\tif (response.data && response.data.length > 0 && checkFacebookPermissions(response.data)) {\r\n\t\t\t\t\t\t\t\t// user granted extended permissions\r\n\t\t\t\t\t\t\t\tconst accessToken = loginresponse.authResponse.accessToken;\r\n\t\t\t\t\t\t\t\tconst expireTime = loginresponse.authResponse.expiresIn;\r\n\t\t\t\t\t\t\t\tloginUserAtSmartPhoto(uid, accessToken, expireTime, mediaStorePartnerType, '', skipLogin, onOrderFlow, async)\r\n\t\t\t\t\t\t\t\t\t.finally(() => enableButton(facebookButton));\r\n\t\t\t\t\t\t\t\tfacebookLoggedIn = true;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t// user cancelled extended permissions\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t//hideLoadingDialog();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tif (!facebookLoggedIn)\r\n\t\t\t\tenableButton(facebookButton);\r\n\r\n\t\t\t//hideLoadingDialog();\r\n\t\t}, { scope: facebookScope });\r\n\t};\r\n\r\n\tconst loginToFacebook = (skipLogin, extraPermissions, async) => {\r\n\t\tif (typeof (FB) === \"undefined\")\r\n\t\t\treturn;\r\n\r\n\t\tif (skipLogin === null) skipLogin = false;\r\n\t\tonOrderFlow = async;\r\n\t\tscopeExtra = extraPermissions;\r\n\t\tif (scopeExtra && scopeExtra !== '')\r\n\t\t\tfacebookScope = facebookScope + ',' + scopeExtra;\r\n\r\n\t\tif (facebookLoggedIn) {\r\n\t\t\t// are we still connected facebook?\r\n\t\t\t//showLoadingDialog();\r\n\t\t\tFB.getLoginStatus(function (loginresponse) {\r\n\t\t\t\tif (loginresponse.status === 'connected') {\r\n\t\t\t\t\t// the user is logged in and has authenticated your app, and response.authResponse supplies\r\n\t\t\t\t\t// the user's ID, a valid access token, a signed request, and the time the access token and signed request each expire\r\n\t\t\t\t\tconst uid = loginresponse.authResponse.userID;\r\n\t\t\t\t\t//showLoadingDialog();\r\n\t\t\t\t\tFB.api(\r\n\t\t\t\t\t\t\"/\" + uid + \"/permissions\",\r\n\t\t\t\t\t\tfunction (response) {\r\n\t\t\t\t\t\t\tfacebookLoggedIn = false;\r\n\t\t\t\t\t\t\tif (response && !response.error) {\r\n\t\t\t\t\t\t\t\t// Check if permissions are granted.\r\n\t\t\t\t\t\t\t\t// NOTE: We do not currently check the extraPermissions\r\n\t\t\t\t\t\t\t\t// But they are currently always empty on our website.\r\n\t\t\t\t\t\t\t\tif (response.data && response.data.length > 0 && checkFacebookPermissions(response.data)) {\r\n\t\t\t\t\t\t\t\t\tconst accessToken = loginresponse.authResponse.accessToken;\r\n\t\t\t\t\t\t\t\t\tconst expireTime = loginresponse.authResponse.expiresIn;\r\n\t\t\t\t\t\t\t\t\tloginUserAtSmartPhoto(uid, accessToken, expireTime, mediaStorePartnerType, '', skipLogin, onOrderFlow, async)\r\n\t\t\t\t\t\t\t\t\t\t.finally(() => enableButton(facebookButton));\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tfBLoginWithPermissions(skipLogin, async);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t//hideLoadingDialog();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t\t} else if (loginresponse.status === 'not_authorized') {\r\n\t\t\t\t\t// the user is logged in to Facebook, but has not authenticated your app\r\n\t\t\t\t\tfBLoginWithPermissions(skipLogin, async);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// the user isn't logged in to Facebook.\r\n\t\t\t\t\tfBLoginWithPermissions(skipLogin, async);\r\n\t\t\t\t}\r\n\t\t\t\t//hideLoadingDialog();\r\n\t\t\t}, true);\r\n\t\t} else {\r\n\t\t\tfBLoginWithPermissions(skipLogin, async);\r\n\t\t}\r\n\t};\r\n\r\n\tconst checkFacebookPermissions = (data) => {\r\n\r\n\t\t// todo: this is the old validation, can be removed after the fb apps are swithched to Oauth2.0\r\n\t\tif (data[0] !== null && typeof data[0].email !== \"undefined\" && typeof data[0].user_photos !== \"undefined\") {\r\n\t\t\treturn data[0] !== null && data[0].email === 1 && data[0].user_photos === 1;\r\n\t\t}\r\n\r\n\t\tconst email: any = (data as any[]).filter(e => e.permission === \"email\");\r\n\t\tconst photos: any = (data as any[]).filter(e => e.permission === \"user_photos\");\r\n\r\n\t\tconst emailGranted = email != null && email[0].status === \"granted\";\r\n\t\tconst photosGranted = photos != null && photos[0].status === \"granted\";\r\n\r\n\t\treturn emailGranted === photosGranted === true;\r\n\t};\r\n\r\n\tconst deInit = () => disposableEvent && disposableEvent.dispose();\r\n\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdispose: deInit,\r\n\t};\r\n}\r\n","import {IErrorLog, postRequest} from \"../utils/fetch\";\r\nimport {escapeForJavascript} from \"../utils/string\";\r\n\r\nexport function logErrorEvent(event: Event): boolean {\r\n\tconst errorEv = event as ErrorEvent;\r\n\treturn logError(errorEv.message, errorEv.filename, errorEv.lineno, errorEv.colno, errorEv.error);\r\n}\r\n\r\nexport function logError(msg: string, url?: string, line?: number, col?: number, error?: Error, process?: string): boolean {\r\n\tconst lastLoggedError = [\"\", \"\", \"\", 0];\r\n\tlet totalLoggedErrors = 0;\r\n\r\n\ttry {\r\n\t\t// Empty URLs, this is a browser issue or cross domain error (external JS files)\r\n\t\tif (!url && !line) return;\r\n\r\n\t\t/* For not log all errors in .net core except from line above\r\n\t\tif (msg && msg === \"Error loading script\" && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg === \"Script error.\" && line === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg === \"Script error\" && line === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Other specific errors\r\n\t\tif (msg && msg.toString().indexOf(\"EBCallBackMessageReceived\") >= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"NPObject\") >= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"cX\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"google_trackConversion\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"ma_track\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t} */\r\n\r\n\t\tlet urlString = \"\";\r\n\t\tlet errorString = \"\";\r\n\r\n\t\t// Simple URLs that give errors out of our control, Ignore keys\r\n\t\tif (Array.isArray(window.errorLogStrings) && Array.isArray(window.errorLogStrings['Ignore']) && !(!window.errorLogStrings['Ignore'].length)) {\r\n\t\t\tfor (let i = 0; i < window.errorLogStrings['Ignore'].length; i++) {\r\n\t\t\t\turlString = window.errorLogStrings['Ignore'][i][1];\r\n\t\t\t\terrorString = window.errorLogStrings['Ignore'][i][2];\r\n\r\n\t\t\t\t// check if both errorLogString values are filled\r\n\t\t\t\tif (url && msg && urlString !== \"\" && errorString !== \"\") {\r\n\t\t\t\t\tif (url.indexOf(urlString) >= 0 && msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// check if url contains urlString or if msg contains errorString\r\n\t\t\t\tif (url && urlString !== \"\") {\r\n\t\t\t\t\tif (url.indexOf(urlString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (msg && errorString !== \"\") {\r\n\t\t\t\t\tif (msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (lastLoggedError[0] === msg && lastLoggedError[1] === url && lastLoggedError[2] === line) {\r\n\t\t\tlet val = +lastLoggedError[3];\r\n\t\t\tlastLoggedError[3] = val++;\r\n\t\t} else {\r\n\t\t\tlastLoggedError[0] = msg.toString();\r\n\t\t\tlastLoggedError[1] = url;\r\n\t\t\tlastLoggedError[2] = line;\r\n\t\t\tlastLoggedError[3] = 1;\r\n\t\t}\r\n\r\n\t\tif (totalLoggedErrors < 10 && lastLoggedError[3] <= 3) {\r\n\t\t\ttotalLoggedErrors++;\r\n\t\t\tprocess = process || 'Browser';\r\n\t\t\tfor (const key in window.errorLogStrings) {\r\n\t\t\t\t// Only handle keys !== Ignore\r\n\t\t\t\tif (key !== \"Ignore\") {\r\n\t\t\t\t\tfor (let i = 0; i < window.errorLogStrings[key].length; i++) {\r\n\r\n\t\t\t\t\t\turlString = window.errorLogStrings[key][i][1];\r\n\t\t\t\t\t\terrorString = window.errorLogStrings[key][i][2];\r\n\r\n\t\t\t\t\t\t// check if both errorLogString values are filled\r\n\t\t\t\t\t\tif (url && msg && urlString !== \"\" && errorString !== \"\") {\r\n\t\t\t\t\t\t\tif (url.indexOf(urlString) >= 0 && msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// check if url contains urlString or if msg contains errorString\r\n\t\t\t\t\t\t\tif (url && urlString !== \"\") {\r\n\t\t\t\t\t\t\t\tif (url.indexOf(urlString) >= 0) {\r\n\t\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (msg !== null && errorString !== \"\") {\r\n\t\t\t\t\t\t\t\tif (msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (error && error.stack)\r\n\t\t\t\tmsg += \"\\n\\nStacktrace: \\n\" + error.stack;\r\n\r\n\t\t\tconst errorLog: IErrorLog = {\r\n\t\t\t\tline: line,\r\n\t\t\t\tmessage: escapeForJavascript(msg),\r\n\t\t\t\tprocess: process,\r\n\t\t\t\turl: url\r\n\t\t\t};\r\n\r\n\t\t\tpostRequest(\"/api/v1/ApplicationService.svc/json/LogJavascriptError\", errorLog, {headers: new Headers({'Content-type': 'application/json; charset=utf-8'})}).then(res => {\r\n\t\t\t\t//ts-gitignore\r\n\t\t\t});\r\n\t\t}\r\n\t} catch (exc) {\r\n\t\t//ts-gitignore\r\n\t}\r\n\treturn false;\r\n}\r\n","export function isValidTextWithoutAngleBrackets(text: string) {\r\n\tif (!text) return false;\r\n\treturn new RegExp(\"^[^<>]+$\").test(text);\r\n}\r\n\r\nexport function isValidEmailAddress (email: string) {\r\n\tconst sValidEmail = '^((([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+(\\\\.([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+)*)|((\\\\x22)((((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(([\\\\x01-\\\\x08\\\\x0b\\\\x0c\\\\x0e-\\\\x1f\\\\x7f]|\\\\x21|[\\\\x23-\\\\x5b]|[\\\\x5d-\\\\x7e])|(([\\\\x01-\\\\x09\\\\x0b\\\\x0c\\\\x0d-\\\\x7f]))))*(((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(\\\\x22)))@((([a-zA-Z]|\\\\d)|(([a-zA-Z]|\\\\d)([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z]|\\\\d)))\\\\.)+(([a-zA-Z])|(([a-zA-Z])([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z])))$';\r\n\tconst reValidEmail = new RegExp(sValidEmail);\r\n\treturn reValidEmail.test(punycode.toUnicode(email));\r\n}\r\n\r\nexport function isValidWithoutNonAlphaNumericCharsAtEnd(text: string, el: HTMLElement) {\r\n\t// Our zipcode db contains values like 'ANTWERPEN (2000)' as city => these should be valid => if last == ) return true\r\n\tconst reg = new RegExp('^[\\\\p{L}\\\\p{N}]*$', 'u');\r\n\tconst elName = el.getAttribute(\"name\") || \"\";\r\n\t// Why trim? We allow spaces as we trim those in the backend code\r\n\tconst alsoAlsoAllowBracket = elName && elName.toLowerCase().indexOf('city') !== -1;\r\n\tconst last = text.trim().charAt(text.trim().length - 1);\r\n\treturn reg.test(last) || (alsoAlsoAllowBracket && last === ')') || last === '.';\r\n}\r\n\r\nexport function canNotContainOnlyNumerics(text: string) {\r\n\tconst reg = new RegExp('^[0-9]+$');\r\n\treturn !reg.test(text);\r\n}\r\n\r\nexport function isValidOrderNumber(orderNr: string) {\r\n\treturn onlyNumber(orderNr) && orderNr.length === 14;\r\n}\r\n\r\nexport function onlyNumber(input: string): boolean {\r\n\treturn Boolean(input.match(/^[0-9]*$/));\r\n}\r\n\r\nexport function isTempAccountEmail(email: string): boolean {\r\n\treturn email.indexOf('TEMP_ACCOUNT_') >= 0;\r\n}\r\n","import {\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressAddClass,\r\n\texpressRemoveClass,\r\n\thide,\r\n\tshow,\r\n\tisElementVisible\r\n} from \"../common/html\";\r\nimport { initForm } from \"./form\";\r\nimport { subscribeAsync, toggleSubscribeAsync } from \"../services/account-service\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\nimport {trackAccountPrefEvent} from \"../common/events\";\r\nimport {isTempAccountEmail} from \"../utils/validation\";\r\n\r\n\r\nexport function createNewsletterSubscribeAndUnsubscribe(customDocument: Element = null) {\r\n\tconst subscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-subscribe\");\r\n\tconst unSubscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-unsubscribe\");\r\n\r\n\tif (subscriptionForms && subscriptionForms.length > 0) {\r\n\t\tlet ioSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterSubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tsubscriptionForms.forEach(el => ioSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tsubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterSubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (unSubscriptionForms && unSubscriptionForms.length > 0) {\r\n\t\tlet ioUnSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioUnSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterUnsubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tunSubscriptionForms.forEach(el => ioUnSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tunSubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterUnsubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function createNewsletterSubscribe(containerEl: HTMLElement) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-subscribe-email', true);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || \"\";\r\n\tconst email = getCookie('LastUsedEmail');\r\n\r\n\temailEl.setAttribute('required', 'required');\r\n\temailEl.setAttribute('emailRFC822', 'true');\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tlet source = formEl.dataset.source || undefined;\r\n\t!source && (source = emailEl.dataset.sourceid);\r\n\r\n\tconst subscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\treturn subscribeAsync(emailEl.value, appId, posId, lang, source)\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\ttrackAccountPrefEvent( \"Subscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t\t\t\t\t\texpressAddClass(formEl, 'm-newsletter__form');\r\n\t\t\t\t\t\twriteCookieThatExpiresAtTheEndOfTheDay(\"subscribedInThisSession\", \"true\");\r\n\t\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-subscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: subscribeForm.dispose };\r\n\r\n}\r\n\r\nexport interface INewsLetterUnsubscribeOptions {\r\n\tonSuccess?: () => void;\r\n\tonError?: () => void;\r\n\tpreFillLastUsedEmail?: boolean;\r\n}\r\n\r\nexport function createNewsletterUnsubscribe(containerEl: HTMLElement, opts?: INewsLetterUnsubscribeOptions, emarsysData?: string) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst successMessageEl = expressQuerySelector(containerEl, '.technical-success-message', false);\r\n\tconst errorMessageEl = expressQuerySelector(containerEl, '.technical-error-message', false);\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-unsubscribe-mail', false);\r\n\tconst checkBoxEl = expressQuerySelector(formEl, '#newsletter', false);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || window.context.language;\r\n\tconst preFillLastUsedEmail = opts ? opts.preFillLastUsedEmail !== undefined ? opts.preFillLastUsedEmail : true : true;\r\n\tconst email = getParameter('email') || preFillLastUsedEmail ? getCookie('LastUsedEmail') : '';\r\n\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tconst showSuccessMessage = () => {\r\n\t\tsuccessMessageEl && expressRemoveClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressAddClass(errorMessageEl, \"u-hide\");\r\n\t\thide(formEl);\r\n\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t};\r\n\r\n\tconst showErrorMessage = () => {\r\n\t\tsuccessMessageEl && expressAddClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressRemoveClass(errorMessageEl, \"u-hide\");\r\n\t\tshow(formEl);\r\n\t};\r\n\r\n\temailEl && emailEl.setAttribute('required', 'required');\r\n\tif (checkBoxEl) checkBoxEl.setAttribute('required', 'required');\r\n\r\n\tconst unsubscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\tconst personIdFromQuery = getParameter(\"personid\");\r\n\t\t\t\treturn (emailEl && emailEl.value) || personIdFromQuery\r\n\t\t\t\t\t? toggleSubscribeAsync(personIdFromQuery, emailEl && emailEl.value, appId, posId, lang, 'NewsletterUnsubscribe', false, false, undefined, undefined, emarsysData)\r\n\t\t\t\t\t\t.then(_ => {\r\n\t\t\t\t\t\t\topts?.onSuccess ? opts.onSuccess() : showSuccessMessage();\r\n\t\t\t\t\t\t\ttrackAccountPrefEvent(\"Unsubscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(_ => opts?.onError ? opts.onError() : showErrorMessage())\r\n\t\t\t\t\t: Promise.resolve(opts?.onSuccess ? opts.onSuccess() : showSuccessMessage());\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-unsubscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: unsubscribeForm.dispose };\r\n}\r\n","export function isTouchDevice (): boolean {\r\n\tlet result = false;\r\n\tif (window.PointerEvent && ('maxTouchPoints' in navigator)) {\r\n\t\tif (navigator.maxTouchPoints > 0) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t} else {\r\n\t\tif (window.matchMedia && window.matchMedia(\"(any-pointer:coarse)\").matches) {\r\n\t\t\tresult = true;\r\n\t\t} else if (window.TouchEvent || ('ontouchstart' in window)) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nexport function isMobileDevice (): boolean {\r\n\treturn window.matchMedia(\"only screen and (max-width: 960px)\").matches;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\tgetParentWithClassName,\r\n\thasClass,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass\r\n} from \"../common/html\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { isTouchDevice } from \"../common/device\";\r\nimport { debounce } from \"../utils/debounce\";\r\n\r\nexport interface ICreateNavigationDesktopDependencies {\r\n\treadonly loadDesktopMenuItemAsync: (firstLevel: number, secondLevel: number) => Promise;\r\n}\r\n\r\nexport function initNavigationDesktop(containerEl: HTMLElement, deps: ICreateNavigationDesktopDependencies) {\r\n\tconst firstLevelMenuEls = expressQuerySelectorAll(containerEl, \".technical-desktop-first-level-menu-item\");\r\n\tconst { loadDesktopMenuItemAsync } = deps;\r\n\tconst loadedMenuItemsKeys: number[][] = [];\r\n\tlet disposable: IDisposable;\r\n\tconst firstLevelActiveClass = \"o-menu-first-level__button--active\";\r\n\tconst secondLevelActiveClass = \"o-menu-second-level__list-item--active\";\r\n\r\n\tconst closeMenu = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tconst clickedItem = e.currentTarget as HTMLElement;\r\n\t\tif (getParentWithClassName(clickedItem, 'o-menu-second-level__list')) return;\r\n\t\tfirstLevelMenuEls.forEach(el => closeFirstLevelMenuItemAndResetChildMenus(el));\r\n\t};\r\n\r\n\tconst closeFirstLevelMenuItemAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst buttonEL = expressQuerySelector(menuItem, '.technical-level1-button', true);\r\n\t\texpressRemoveClass(buttonEL, firstLevelActiveClass);\r\n\t\tcloseAllSecondLevelMenuItemsAndResetChildMenus(menuItem);\r\n\t};\r\n\r\n\tconst closeAllSecondLevelMenuItemsAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst secondLevelMenuEls = expressQuerySelectorAll(menuItem, '.technical-desktop-menu-second');\r\n\t\tsecondLevelMenuEls.forEach(secondLevelMenuEl => {\r\n\t\t\texpressAddClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(secondLevelMenuEl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst closeAllThirdLevelMenuItemsAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst allThirdLevelMenuItems = expressQuerySelectorAll(menuItem, '.technical-desktop-second-level-menu-item');\r\n\t\tallThirdLevelMenuItems.forEach(el => {\r\n\t\t\tconst contentEl = expressQuerySelector(el, '.technical-desktop-second-level-content', false);\r\n\t\t\tcontentEl && expressAddClass(contentEl, 'u-hide');\r\n\t\t\texpressRemoveClass(el, secondLevelActiveClass);\r\n\t\t});\r\n\t};\r\n\r\n\tconst getOrLoadFirstLevelMenuItem = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (e.type.toLowerCase() === \"mouseenter\" && isTouchDevice()) return;\r\n\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\tconst secondLevelMenuEl = expressQuerySelector(menuItem, '.technical-desktop-menu-second', true);\r\n\t\tconst buttonEL = expressQuerySelector(menuItem, '.technical-level1-button', true);\r\n\r\n\t\tconst closeMenuOnMouseOut = (e: MouseEvent) => {\r\n\t\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\t\tcloseFirstLevelMenuItemAndResetChildMenus(menuItem);\r\n\t\t};\r\n\r\n\t\t// First hide all other items\r\n\t\tconst allSecondLevelMenuItems = expressQuerySelectorAll(containerEl, '.technical-desktop-menu-second');\r\n\t\tallSecondLevelMenuItems.forEach(el => closeAllSecondLevelMenuItemsAndResetChildMenus(el));\r\n\r\n\t\t// Set selected item and fetch content if needed\r\n\t\tif (expressQuerySelectorAll(secondLevelMenuEl, \".o-menu-second-level__list.skeleton-loading\").length === 1) {\r\n\t\t\tconst itemKey = parseInt(menuItem.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst alreadyLoaded = itemKey in loadedMenuItemsKeys;\r\n\t\t\tif (!alreadyLoaded) {\r\n\t\t\t\tloadedMenuItemsKeys[itemKey] = [];\r\n\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\tloadDesktopMenuItemAsync(itemKey, -1).then(res => {\r\n\t\t\t\t\tsecondLevelMenuEl.innerHTML = \"\"; // this removes the skeleton loading\r\n\t\t\t\t\tsecondLevelMenuEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\twindow.addEventListener('resize', () => {\r\n\t\t\t\t\t\tdebounce(() => {\r\n\t\t\t\t\t\t\tif (!secondLevelMenuEl) return;\r\n\t\t\t\t\t\t\tsecondLevelMenuEl.style.top = Math.floor(expressQuerySelector(document, '.technical-header', true).clientHeight) + 'px';\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tsecondLevelMenuEl.style.top = Math.floor(expressQuerySelector(document, '.technical-header', true).clientHeight) + 'px';\r\n\t\t\t\t\tconst buttonEls = expressQuerySelectorAll(secondLevelMenuEl, '.technical-third-link-item');\r\n\t\t\t\t\tif (buttonEls.length && buttonEls.every(x => x.nodeName.toLowerCase() === 'a')) {\r\n\t\t\t\t\t\tconst subMenuListEl = expressQuerySelector(secondLevelMenuEl, '.o-menu-second-level__list', true);\r\n\t\t\t\t\t\tsubMenuListEl.style.left = (menuItem.offsetLeft - containerEl.offsetLeft) + \"px\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tinitSecondLevelListeners();\r\n\t\t\t\t\t// To prevent opening the menu, when the visitor already moved to another menu item, we check the active class again\r\n\t\t\t\t\tif (hasClass(buttonEL, firstLevelActiveClass)) expressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t});\r\n\t\t\t\tdisposable.add(compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'mouseleave', closeMenuOnMouseOut))));\r\n\t\t\t\tdisposable.add(expressEventListener(secondLevelMenuEl, 'click', closeMenu));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (e.type.toLowerCase() === \"click\" && isTouchDevice()) {\r\n\t\t\t\tif (hasClass(buttonEL, firstLevelActiveClass)) {\r\n\t\t\t\t\texpressRemoveClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\t\texpressAddClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(secondLevelMenuEl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\t\texpressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\texpressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst initFirstLevelListeners = () => {\r\n\t\tdisposable = compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'mouseenter', getOrLoadFirstLevelMenuItem)));\r\n\t\tdisposable.add(compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'click', getOrLoadFirstLevelMenuItem))));\r\n\t};\r\n\r\n\tconst getOrLoadSecondLevelMenuItem = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (e.type.toLowerCase() === \"mouseenter\" && isTouchDevice()) return;\r\n\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\tif (hasClass(menuItem, secondLevelActiveClass)) return;\r\n\t\tconst parent = menuItem.closest(\".technical-desktop-first-level-menu-item\") as HTMLElement;\r\n\r\n\t\t// First hide all other items\r\n\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(parent);\r\n\r\n\t\t// Set selected item and fetch content if needed\r\n\t\texpressAddClass(menuItem, secondLevelActiveClass);\r\n\t\tconst contentEl = expressQuerySelector(menuItem, '.technical-desktop-second-level-content', false);\r\n\t\tcontentEl && expressRemoveClass(contentEl, 'u-hide');\r\n\r\n\t\tconst buttonEl = expressQuerySelector(menuItem, '.technical-third-link-item', true);\r\n\t\tif (buttonEl.nodeName.toLowerCase() === \"button\") {\r\n\t\t\tconst firstLevelIndex = parseInt(parent.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst secondLevelIndex = parseInt(menuItem.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst alreadyLoaded = loadedMenuItemsKeys[firstLevelIndex].includes(secondLevelIndex);\r\n\r\n\t\t\tif (!alreadyLoaded) {\r\n\t\t\t\tloadedMenuItemsKeys[firstLevelIndex].push(secondLevelIndex);\r\n\t\t\t\tloadDesktopMenuItemAsync(firstLevelIndex, secondLevelIndex).then(res => {\r\n\t\t\t\t\tmenuItem.querySelector(\".technical-desktop-second-level-content\").innerHTML = res;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst initSecondLevelListeners = () => {\r\n\t\tconst secondLevelMenuEls = expressQuerySelectorAll(containerEl, \".technical-desktop-second-level-menu-item\");\r\n\t\tdisposable.add(compositeDisposable(secondLevelMenuEls.map(el => expressEventListener(el, 'mouseenter', getOrLoadSecondLevelMenuItem))));\r\n\t\tdisposable.add(compositeDisposable(secondLevelMenuEls.map(el => expressEventListener(el, 'click', getOrLoadSecondLevelMenuItem))));\r\n\t};\r\n\r\n\t// init handlers on load\r\n\tinitFirstLevelListeners();\r\n\tconst disableHoverMenuItems = () => disposable && disposable.dispose();\r\n\r\n\treturn { dispose: disableHoverMenuItems };\r\n}\r\n","import {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener} from \"../common/html\";\r\n\r\nexport function initLanguageSelector(buttonEl: HTMLElement, containerEl: HTMLElement) {\r\n\tlet eventDisposables: IDisposable;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\r\n\tconst closeMenu = () => {\r\n\t\tcontainerEl.classList.add(\"u-hide\");\r\n\t\tdetachDocumentClick();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".technical-language-selector, .technical-language-selector-choices\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\t// we do don't want to load or attach handlers when the menu is closing\r\n\t\tif (containerEl.classList.contains(\"u-hide\"))\r\n\t\t\tattachOnDocumentClick();\r\n\t\tcontainerEl.classList.toggle(\"u-hide\");\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(\r\n\t\t\tonDocumentClickDisposable = compositeDisposable (\r\n\t\t\t\t[expressEventListener(document, 'click', onDocumentClick, true)]\r\n\t\t\t)\r\n\t\t);\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst init = () => {\r\n\t\teventDisposables = compositeDisposable (\r\n\t\t\t[\r\n\t\t\t\texpressEventListener(buttonEl, 'click', onButtonClick)\r\n\t\t\t]\r\n\t\t);\r\n\t};\r\n\r\n\tconst deInit = () => {\r\n\t\tdispose();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\t// remove all handlers\r\n\tconst dispose = () => {\r\n\t\tif (eventDisposables) eventDisposables.dispose();\r\n\t\tdetachDocumentClick();\r\n\t};\r\n\r\n\t// init component\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdeInit\r\n\t};\r\n}\r\n","import {getParents} from \"../common/html\";\r\n\r\nexport interface ICreateTooltipOptions {\r\n\treadonly buttonEl: HTMLElement;\r\n\treadonly containerEl: HTMLElement;\r\n\treadonly onOpen?: (containerEl: HTMLElement) => void;\r\n\treadonly onClose?: () => void;\r\n\treadonly iconCloseSelector?: string;\r\n\treadonly openClass?: string;\r\n\treadonly tooltipSelector?: string;\r\n\treadonly toggleIconSelector?: string;\r\n\treadonly useCapture?: boolean;\r\n}\r\n\r\nexport interface IToolTip {\r\n\treadonly dispose: () => void;\r\n\treadonly closeToolTip: () => void;\r\n}\r\nexport function initTooltip(options: ICreateTooltipOptions) {\r\n\tconst {\r\n\t\tbuttonEl,\r\n\t\tcontainerEl,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t\ticonCloseSelector,\r\n\t\topenClass,\r\n\t\ttooltipSelector,\r\n\t\ttoggleIconSelector,\r\n\t\tuseCapture = false\r\n\t} = options;\r\n\r\n\tconst closeIconEl = containerEl.querySelector(iconCloseSelector || \".icon-close\");\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseToolTip();\r\n\t};\r\n\r\n\tconst closeToolTip = () => {\r\n\t\tcontainerEl.classList.remove(openClass || \"is-tooltip-open\");\r\n\t\tif (onClose) onClose();\r\n\t\tdocument.removeEventListener(\"click\", onDocumentClick);\r\n\t};\r\n\r\n\tconst openToolTip = () => {\r\n\t\tcontainerEl.classList.add(openClass || \"is-tooltip-open\");\r\n\t\tif (onOpen) onOpen(containerEl);\r\n\t\tdocument.addEventListener(\"click\", onDocumentClick, { capture: useCapture });\r\n\t};\r\n\r\n\tconst onButtonClick = (e: MouseEvent) => {\r\n\t\tif (getParents(e.target as HTMLElement, (tooltipSelector || \".technical-price-tooltip\")).length < 1)\r\n\t\t{\r\n\t\t\tcontainerEl.classList.contains(openClass || \"is-tooltip-open\")\r\n\t\t\t\t? closeToolTip()\r\n\t\t\t\t: openToolTip();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tconst selector = (tooltipSelector || \".technical-price-tooltip\") + \", \" + (toggleIconSelector || \".technical-price-info-icon\");\r\n\t\tif (!(e.target as HTMLElement).closest(selector)) {\r\n\t\t\tcloseToolTip();\r\n\t\t}\r\n\t};\r\n\r\n\t//close tooltip\r\n\tif (closeIconEl) closeIconEl.addEventListener(\"click\", onCloseIconClick);\r\n\r\n\t//open tooltip + function\r\n\tbuttonEl.addEventListener(\"click\", onButtonClick);\r\n\r\n\tconst dispose = () => {\r\n\t\tbuttonEl.removeEventListener(\"click\", onButtonClick);\r\n\t\tdocument.removeEventListener(\"click\", onDocumentClick);\r\n\t\tif (closeIconEl) closeIconEl.removeEventListener(\"click\", onCloseIconClick);\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tcloseToolTip\r\n\t} as IToolTip;\r\n}\r\n","import {createTextInputWithAutoComplete} from \"./form-input\";\r\nimport {expressQuerySelector} from \"../common/html\";\r\nimport {isValidTextWithoutAngleBrackets} from \"../utils/validation\";\r\nimport {initTooltip} from \"./tooltip\";\r\n\r\nexport function initSearchBar(desktopSearchBarContainer: HTMLElement, mobileSearchBarContainer: HTMLElement, autoCompleteSearch: (searchTerm: string) => Promise, onOpen?: () => void, onClose?: () => void) {\r\n\tconst initAutoComplete = (buttonEl: HTMLElement, inputEl: HTMLInputElement) => {\r\n\t\tconst buttonDisabledClass = \"a-button--disabled\";\r\n\t\tconst form = inputEl.parentElement! as HTMLFormElement;\r\n\r\n\t\tif (buttonEl) buttonEl.classList.add(buttonDisabledClass);\r\n\r\n\t\tconst renderTextWithHighlights = (item: { value: string, label: string }, currentSearchterm: string) => {\r\n\t\t\tcurrentSearchterm = currentSearchterm.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n\t\t\tconst re = new RegExp(\"(\" + currentSearchterm.split(' ').join('|') + \")\", \"gi\");\r\n\t\t\treturn item.value.replace(re, \"$1\");\r\n\t\t};\r\n\r\n\t\tinputEl.onkeyup = function (ev: KeyboardEvent) {\r\n\t\t\tif (buttonEl) {\r\n\t\t\t\tif (inputEl && inputEl.value) buttonEl.classList.remove(buttonDisabledClass);\r\n\t\t\t\telse buttonEl.classList.add(buttonDisabledClass);\r\n\t\t\t}\r\n\t\t\tif (ev.keyCode === 13 || ev.key === 'Enter') {\r\n\t\t\t\tfixInputValue(inputEl);\r\n\t\t\t\tform.submit();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tform.onsubmit = function (e) {\r\n\t\t\tif (!inputEl || !inputEl.value || !validateInput(inputEl)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfixInputValue(inputEl);\r\n\t\t};\r\n\t\treturn createTextInputWithAutoComplete (\r\n\t\t\tinputEl,\r\n\t\t\t{\r\n\t\t\t\tonSelect: () => { onClose && onClose(); form.submit(); },\r\n\t\t\t\tautoCompleteSearch: (searchTerm) => {\r\n\t\t\t\t\tif (validateInput(inputEl, searchTerm))\r\n\t\t\t\t\t\treturn autoCompleteSearch(searchTerm).then(res => res.map(item => ({ value: item, label: item })));\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t},\r\n\t\t\t\tonOpen: onOpen,\r\n\t\t\t\tonClose: onClose,\r\n\t\t\t\trenderTextContent: renderTextWithHighlights,\r\n\t\t\t\tcontainerClass: 'm-autocomplete autocomplete-suggestions m-search-bar__autocomplete',\r\n\t\t\t\tcontainerInsertPosition: 'afterend',\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tconst fixInputValue = (inputEl: HTMLInputElement) => {\r\n\t\tinputEl.value = inputEl.value.replace(/[<>]+/g, '');\r\n\t};\r\n\r\n\tconst validateInput = (inputEl: HTMLInputElement, searchTerm?: string) => {\r\n\t\treturn isValidTextWithoutAngleBrackets(searchTerm ? searchTerm : inputEl.value);\r\n\t};\r\n\r\n\tconst initMobileSearchBar = (containerEl: HTMLElement) => {\r\n\t\tconst inputEl = expressQuerySelector(containerEl, \".m-search-bar__input\", true);\r\n\t\tconst buttonEl = expressQuerySelector(containerEl, \".icon-search_thin\", true);\r\n\t\tconst autoComplete = initAutoComplete(buttonEl, inputEl);\r\n\t\tconst onSearchTooltipOpen = () => inputEl.focus();\r\n\t\tconst form = inputEl.parentElement! as HTMLFormElement;\r\n\r\n\t\tform.onsubmit = function (e) {\r\n\t\t\tif (!inputEl || !inputEl.value || !validateInput(inputEl)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfixInputValue(inputEl);\r\n\t\t};\r\n\r\n\t\tconst overlayComponent = initTooltip({\r\n\t\t\tbuttonEl: containerEl.previousElementSibling as HTMLElement,\r\n\t\t\tcontainerEl: containerEl,\r\n\t\t\tonOpen: onSearchTooltipOpen,\r\n\t\t\topenClass: \"menu-is-open\",\r\n\t\t\ttooltipSelector: \".o-icon-navigation__search-bar\",\r\n\t\t\ttoggleIconSelector: \".icon-search_thin\"\r\n\t\t});\r\n\r\n\t\treturn {\r\n\t\t\tdipose: () => {\r\n\t\t\t\toverlayComponent.dispose();\r\n\t\t\t\tautoComplete.dispose();\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t// init desktop search autocomplete\r\n\tconst desktopSearchBar = initAutoComplete (\r\n\t\texpressQuerySelector (\r\n\t\t\tdesktopSearchBarContainer,\r\n\t\t\t'.icon-search_thin',\r\n\t\t\ttrue\r\n\t\t),\r\n\t\texpressQuerySelector (\r\n\t\t\tdesktopSearchBarContainer,\r\n\t\t\t'.m-search-bar__input',\r\n\t\t\ttrue\r\n\t\t)\r\n\t);\r\n\r\n\t// init mobile search\r\n\tconst mobileSearchBar = initMobileSearchBar(mobileSearchBarContainer);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\tmobileSearchBar.dipose();\r\n\t\t\tdesktopSearchBar.dispose();\r\n\t\t}\r\n\t};\r\n}\r\n","import {expressEventListener, hide, expressQuerySelector, expressQuerySelectorAll, remove, show} from \"../common/html\";\r\nimport {createClickableElement} from \"./button\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {trackOrderStatusEvent} from \"../common/events\";\r\n\r\nexport interface ICreateNotificationCenterDependencies {\r\n\treadonly getNotifications: () => Promise;\r\n\treadonly isMobile: () => boolean;\r\n\treadonly markNotificationsAsRead: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n}\r\n\r\nexport function createNotificationTile(containerEl: HTMLElement, markNotificationAsRead: (id: string) => Promise) {\r\n\tconst checkBoxEl = expressQuerySelector(containerEl, '.m-notification-tile__read-status', true);\r\n\tconst linkEl = expressQuerySelector(containerEl, '.m-notification-tile__title-with-link__link', false);\r\n\tconst onRemove = () => remove(containerEl);\r\n\r\n\tconst onTileClick = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\tconst cb = expressQuerySelector(checkBoxEl, '.a-form-input__input', true);\r\n\t\tcb.disabled = true;\r\n\t\tcheckBoxEl.removeEventListener('click', onTileClick);\r\n\t\tmarkNotificationAsRead(cb.value)\r\n\t\t\t.then(() => containerEl.classList.add(\"o-notifications-center__notification-tile--removed\"))\r\n\t\t\t.then(() => onRemove());\r\n\t};\r\n\r\n\tcheckBoxEl.addEventListener('click', onTileClick);\r\n\tlinkEl && linkEl.addEventListener('click', () => {\r\n\t\tconst orderNumber = linkEl.dataset.ordernumber || '';\r\n\t\tconst pvc = linkEl.dataset.sku || '';\r\n\t\tconst orderStatus = linkEl.dataset.orderstatus || '';\r\n\t\ttrackOrderStatusEvent(\"ClickOnOrderItemNotificationLink\", { orderNumber: orderNumber, pvc: pvc, orderStatus: orderStatus });\r\n\t});\r\n}\r\n\r\nexport function createNotificationCenter(containerEl: HTMLElement, deps: ICreateNotificationCenterDependencies) {\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tlet onMarkedAllAsReadDisposable: IDisposable;\r\n\tconst domParser = new DOMParser();\r\n\r\n\tlet loaded = false;\r\n\r\n\tconst { getNotifications, isMobile, markNotificationsAsRead, onClose, onOpen } = deps;\r\n\r\n\tconst buttonEl = expressQuerySelector(containerEl, '.o-icon-navigation__notifications-center__icon', true);\r\n\tconst notificationBellCountEl = expressQuerySelector(buttonEl, '.o-icon-navigation__count ', true);\r\n\tconst menuEl = expressQuerySelector(containerEl, '.o-icon-navigation__notifications-center-menu', true);\r\n\tconst overLayEl = expressQuerySelector(menuEl, '.technical-notification-center-overlay', true);\r\n\tconst contentEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__content', true);\r\n\tconst closeButtonEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__close-container', true);\r\n\tlet markAllAsReadButton: HTMLInputElement;\r\n\r\n\tconst setOverLayClass = () => {\r\n\t\tconst mobile = isMobile();\r\n\t\toverLayEl.classList.remove(...[\"m-navigation-overlay__mobile-view\", \"m-navigation-overlay__desktop-view\"]);\r\n\t\toverLayEl.classList.add(mobile ? \"m-navigation-overlay__mobile-view\" : \"m-navigation-overlay__desktop-view\");\r\n\t};\r\n\r\n\tconst setNotificationCount = (amount: number, markAllAsReadButton?: HTMLElement) => {\r\n\r\n\t\tif (amount > 0) {\r\n\t\t\tnotificationBellCountEl.innerHTML = amount.toString();\r\n\t\t\tif (markAllAsReadButton) markAllAsReadButton.innerHTML += `(${amount})`;\r\n\t\t\tshow(notificationBellCountEl);\r\n\r\n\t\t} else {\r\n\t\t\tnotificationBellCountEl.innerHTML = \"\";\r\n\t\t\thide(notificationBellCountEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst getTiles = () => expressQuerySelectorAll(contentEl, '.m-notification-tile');\r\n\r\n\tconst onMarkedAsReadSingle = (ids: string) => markNotificationsAsRead(ids.split(';'))\r\n\t\t.then(() => loadNotifications(true));\r\n\r\n\tconst onMarkedAllAsRead = () => {\r\n\t\tif (markAllAsReadButton) {\r\n\t\t\tmarkAllAsReadButton.disabled = true;\r\n\t\t\tmarkAllAsReadButton.classList.add(\"a-button--disabled\");\r\n\t\t}\r\n\t\tdetachMarkAllAsReadClick();\r\n\t\tconst ids = getTiles()\r\n\t\t\t.map(el => expressQuerySelector\r\n\t\t\t\t(el, '.a-form-input__input', true)\r\n\t\t\t\t\t.value.split(\";\")\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a.concat(b), []);\r\n\r\n\t\t// only execute if there are items to remove\r\n\t\tif (ids && ids.length > 0) {\r\n\t\t\treturn markNotificationsAsRead(ids)\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tif (res) loadNotifications(true);\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst loadNotifications = (reload = false) => {\r\n\r\n\t\tif (loaded && !reload) return Promise.resolve();\r\n\r\n\t\treturn getNotifications()\r\n\t\t\t.then(res => {\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tconst parsed = domParser.parseFromString(res, \"text/html\").documentElement;\r\n\t\t\t\t\tconst notificationCenterEl = expressQuerySelector(parsed, \".o-notifications-center__container\", true);\r\n\t\t\t\t\tcontentEl.innerHTML = \"\";\r\n\t\t\t\t\tcontentEl.insertAdjacentElement('beforeend', notificationCenterEl);\r\n\r\n\t\t\t\t\tmarkAllAsReadButton = expressQuerySelector(contentEl, '.o-notifications-center__mark-as-read', true);\r\n\r\n\t\t\t\t\tconst tiles = getTiles();\r\n\t\t\t\t\tif (tiles.length > 0) {\r\n\t\t\t\t\t\tmarkAllAsReadButton.classList.remove(\"a-button--disabled\");\r\n\r\n\t\t\t\t\t\ttiles.forEach(el => createNotificationTile(el, onMarkedAsReadSingle));\r\n\r\n\t\t\t\t\t\tattachMarkAllAsReadClick(markAllAsReadButton);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tiles.length === 0) {\r\n\t\t\t\t\t\tmarkAllAsReadButton.classList.add(\"a-button--disabled\");\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsetNotificationCount(tiles.length);\r\n\r\n\t\t\t\t\tloaded = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onNotificationCenterOpen = () => {\r\n\t\tsetOverLayClass();\r\n\t\treturn loadNotifications();\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tmenuEl.classList.remove(\"menu-is-open\");\r\n\t\tdetachDocumentClick();\r\n\t\tonClose && onClose();\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst openMenu = () => {\r\n\t\ttrackOrderStatusEvent(\"ClickOnNotificationIcon\", {});\r\n\t\treturn onNotificationCenterOpen()\r\n\t\t\t.then(() => {\r\n\t\t\t\tonOpen && onOpen();\r\n\t\t\t\tattachOnDocumentClick();\r\n\t\t\t\tmenuEl.classList.add(\"menu-is-open\");\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\treturn menuEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".o-icon-navigation__notifications-center-menu, .o-icon-navigation__notifications-center__icon\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(onDocumentClickDisposable = expressEventListener(document, 'click', onDocumentClick, true));\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst attachMarkAllAsReadClick = (buttonEl: HTMLElement) =>\r\n\t\t(onMarkedAllAsReadDisposable = expressEventListener(buttonEl, 'click', onMarkedAllAsRead));\r\n\r\n\tconst detachMarkAllAsReadClick = () => onMarkedAllAsReadDisposable && onMarkedAllAsReadDisposable.dispose();\r\n\r\n\t// init component\r\n\tconst button = createClickableElement(buttonEl, onButtonClick);\r\n\r\n\tconst eventDisposables = compositeDisposable (\r\n\t\t[\r\n\t\t\texpressEventListener(closeButtonEl, 'click', onCloseIconClick),\r\n\t\t\texpressEventListener(window, 'resize', setOverLayClass),\r\n\t\t]\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tbutton.dispose();\r\n\t\t\tdetachDocumentClick();\r\n\t\t\tdetachMarkAllAsReadClick();\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n}\r\n","export function calculateAndSetHeightOfMobileNavigationLevel(mobileNavigationLevel: HTMLElement) {\r\n\tmobileNavigationLevel.style.height = '100vh';\r\n\r\n\t// Calculate height of lvl menu (without browser bars)\r\n\tconst browserUiBars = mobileNavigationLevel.getBoundingClientRect().height - window.innerHeight;\r\n\tconst menuItemsLvlPositionTop = document.body.getBoundingClientRect().top - mobileNavigationLevel.getBoundingClientRect().top;\r\n\r\n\t// Set height of level menu items to correct size calculated\r\n\tmobileNavigationLevel.style.height = 'calc(100vh - ' + Math.abs(browserUiBars) + 'px + ' + menuItemsLvlPositionTop + 'px)';\r\n}\r\n","import { createClickableElement } from \"./button\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { IIconResult } from \"../utils/icons\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\n\r\nexport interface IInitMyAccountDependencies {\r\n\treadonly getIconsAsync: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n\treadonly isMobile: () => boolean;\r\n\treadonly loadAccountMenu: () => Promise;\r\n}\r\n\r\nexport function initMyAccount(mainNavigationEl: HTMLElement, deps: IInitMyAccountDependencies) {\r\n\r\n\tconst { getIconsAsync, onClose, onOpen, isMobile, loadAccountMenu } = deps;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tconst icons = {};\r\n\tlet loaded = false;\r\n\tconst buttonEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-icon', true);\r\n\tconst menuEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-menu', true);\r\n\tconst overLayEl = expressQuerySelector(menuEl, '.technical-navigation-overlay', true);\r\n\tconst contentEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__content', true);\r\n\tconst closeButtonEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__close-container', true);\r\n\r\n\tconst setOverLayClass = () => {\r\n\t\toverLayEl.classList.remove(...[\"m-navigation-overlay__mobile-view\", \"m-navigation-overlay__desktop-view\"]);\r\n\t\toverLayEl.classList.add(isMobile() ? \"m-navigation-overlay__mobile-view\" : \"m-navigation-overlay__desktop-view\");\r\n\t};\r\n\r\n\tconst onOpenMyAccount = () => {\r\n\t\tif (!loaded) {\r\n\t\t\treturn loadAccountMenu()\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tonOpen && onOpen();\r\n\t\t\t\t\tcontentEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\tconst buttonEls = expressQuerySelectorAll(contentEl, '.technical-hassvg')\r\n\t\t\t\t\t\t.filter(el => !!el.getAttribute('data-icon-svg'));\r\n\t\t\t\t\tconst urls = buttonEls\r\n\t\t\t\t\t\t.map(el => el.getAttribute('data-icon-svg')!)\r\n\t\t\t\t\t\t.filter((value, index, self) => self.indexOf(value) === index);\r\n\r\n\t\t\t\t\t// this can fire & forget\r\n\t\t\t\t\tgetIconsAsync(urls)\r\n\t\t\t\t\t\t.then(\r\n\t\t\t\t\t\t\tres => {\r\n\t\t\t\t\t\t\t\tres.forEach(icon => icons[icon.url] = icon.svg);\r\n\t\t\t\t\t\t\t\tbuttonEls.forEach(el => el.insertAdjacentHTML('beforeend', icons[el.getAttribute('data-icon-svg')!]));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\tloaded = true;\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\tonOpen && onOpen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tonClose && onClose();\r\n\t\tmenuEl.classList.remove(\"menu-is-open\");\r\n\t\tdetachDocumentClick();\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst openMenu = () => {\r\n\t\tsetOverLayClass();\r\n\t\treturn onOpenMyAccount()\r\n\t\t\t.then(() => {\r\n\t\t\t\tmenuEl.classList.add(\"menu-is-open\");\r\n\r\n\t\t\t\tif (isMobile()) {\r\n\t\t\t\t\tconst menuButtonList = expressQuerySelector(menuEl, '.o-my-account__list', true);\r\n\t\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuButtonList);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tattachOnDocumentClick();\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\treturn menuEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".o-icon-navigation__user-menu, .o-icon-navigation__user-icon\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst button = createClickableElement(buttonEl, onButtonClick);\r\n\tconst eventDisposables = compositeDisposable(\r\n\t\t[\r\n\r\n\t\t\texpressEventListener(closeButtonEl, 'click', onCloseIconClick),\r\n\t\t\texpressEventListener(window, 'resize', setOverLayClass)\r\n\t\t]\r\n\t);\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(onDocumentClickDisposable = expressEventListener(document, 'click', onDocumentClick, true));\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tdetachDocumentClick();\r\n\t\t\tbutton.dispose();\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n}\r\n","export interface IInitCountDownOptions {\r\n\treadonly showDays?: boolean;\r\n\treadonly onCountDownFinish?: () => void;\r\n\treadonly daysLabel?: string;\r\n\treadonly dayLabel?: string;\r\n}\r\n\r\nexport function initCountDown(containerEl: HTMLElement, el: HTMLElement, countDownToDate: string, opts: IInitCountDownOptions ) {\r\n\tconst {\r\n\t\tshowDays,\r\n\t\tonCountDownFinish,\r\n\t\tdaysLabel,\r\n\t\tdayLabel\r\n\t} = opts;\r\n\r\n\tconst toDate = (input: string): Date => {\r\n\t\tconst dateString = input.split(' ')[0];\r\n\t\tconst timeString = input.split(' ')[1];\r\n\t\tconst day = parseInt(dateString.split('/')[0], 10);\r\n\t\tconst month = parseInt(dateString.split('/')[1], 10) - 1;\r\n\t\tconst year = parseInt(dateString.split('/')[2], 10);\r\n\t\tconst hour = parseInt(timeString.split(':')[0], 10);\r\n\t\tconst minutes = parseInt(timeString.split(':')[1], 10);\r\n\t\tconst seconds = parseInt(timeString.split(':')[2], 10);\r\n\t\treturn new Date(year, month, day, hour, minutes, seconds, 0);\r\n\t};\r\n\r\n\tconst pad = (num: number, size: number) => {\r\n\t\tlet temp = num.toString();\r\n\t\twhile (temp.length < size) temp = \"0\" + temp;\r\n\t\treturn temp;\r\n\t};\r\n\r\n\tconst countDownTime = toDate(countDownToDate).getTime();\r\n\r\n\tconst countDown = () => {\r\n\t\tconst now = new Date().getTime();\r\n\t\tconst timeLeft = countDownTime - now;\r\n\t\tconst days = Math.floor(timeLeft / (1000 * 60 * 60 * 24));\r\n\t\tlet hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n\t\tconst minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60));\r\n\t\tconst seconds = Math.floor((timeLeft % (1000 * 60)) / 1000);\r\n\r\n\t\tif (timeLeft > 0) {\r\n\t\t\tif (!showDays || !daysLabel || !dayLabel) {\r\n\t\t\t\thours = hours + (days * 24);\r\n\t\t\t\tel.innerHTML = pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t} else {\r\n\t\t\t\tif (days > 1)\r\n\t\t\t\t\tel.innerHTML = days + ' ' + daysLabel + ' ' + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t\telse if (days === 1)\r\n\t\t\t\t\tel.innerHTML = days + ' ' + dayLabel + ' ' + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t\telse\r\n\t\t\t\t\tel.innerHTML = pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (onCountDownFinish) onCountDownFinish();\r\n\t\t\tclearInterval(interval);\r\n\t\t}\r\n\t};\r\n\r\n\tconst interval = setInterval(countDown, 1000);\r\n}\r\n","import { createClickableElement } from \"./button\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { IIconResult } from \"../utils/icons\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\n\r\nexport interface ICreateNavigationMobileDependencies {\r\n\treadonly getMobileMenu: (secondLevelIndex?: number, thirdLevelIndex?: number) => Promise;\r\n\treadonly getIconsAsync: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n}\r\n\r\nexport interface ICreateNavigationMobileOptions {\r\n\treadonly mobileMenuEl: HTMLElement;\r\n\treadonly containerEl: HTMLElement;\r\n\treadonly menuButtonEl: HTMLElement;\r\n\treadonly menuContainerEl: HTMLElement;\r\n\treadonly currentLanguage: string | undefined;\r\n}\r\n\r\nexport function initNavigationMobile(options: ICreateNavigationMobileOptions, deps: ICreateNavigationMobileDependencies) {\r\n\tlet firstLevelMenuSelected: HTMLElement | undefined;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tlet onCloseClickDisposable: IDisposable;\r\n\tlet onLanguageSelectorClickDisposable: IDisposable;\r\n\tlet userContainerEl: HTMLElement;\r\n\tlet closeContainerEl: HTMLElement;\r\n\tlet languageSelectorEl: HTMLElement | undefined;\r\n\tlet firstLevelMenuEls: HTMLElement[] = [];\r\n\tlet secondLevelMenuEls: HTMLElement[] = [];\r\n\tlet thirdLevelMenuEls: HTMLElement[] = [];\r\n\r\n\tlet loaded = false;\r\n\r\n\tconst {\r\n\t\tmobileMenuEl,\r\n\t\tcontainerEl,\r\n\t\tmenuButtonEl,\r\n\t\tmenuContainerEl,\r\n\t\tcurrentLanguage\r\n\t} = options;\r\n\r\n\tconst {\r\n\t\tgetMobileMenu,\r\n\t\tgetIconsAsync,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t} = deps;\r\n\r\n\tconst contentPreLoaded = mobileMenuEl.innerHTML.replace(/^\\s+|\\s+$/, '') !== \"\";\r\n\r\n\tconst closeMenu = () => {\r\n\t\tmenuButtonEl.classList.remove(\"menu-is-open\");\r\n\t\tmenuContainerEl.classList.remove(\"menu-is-open\");\r\n\r\n\t\t// reset to first level\r\n\t\tresetMenu();\r\n\r\n\t\tdetachDocumentClick();\r\n\t\tif (onClose) onClose();\r\n\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst onCloseMenuClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".technical-mobile-navigation-hamburger-menu-container, .technical-mobile-navigation-hamburger-menu-button\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t(\r\n\t\tonDocumentClickDisposable = compositeDisposable(\r\n\t\t\t[\r\n\t\t\t\texpressEventListener(document, 'click', onDocumentClick, true)\r\n\t\t\t]\r\n\t\t)\r\n\t);\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst loadIcons = (urls: string[]) => {\r\n\t\tconst icons = {};\r\n\t\tconst uniqueUrls = urls.filter((v, i) => urls.indexOf(v) === i);\r\n\t\treturn getIconsAsync(uniqueUrls)\r\n\t\t\t.then(res => {\r\n\t\t\t\tres.forEach(icon => (icons[icon.url] = icon.svg));\r\n\t\t\t\treturn icons;\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst initMenuItemsAndBehavior = () => {\r\n\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\tuserContainerEl = expressQuerySelector(mobileMenuEl, \".technical-mobile-navigation-user-container\", true);\r\n\t\tcloseContainerEl = expressQuerySelector(mobileMenuEl, \".technical-mobile-navigation-close-container\", true);\r\n\t\tlanguageSelectorEl = expressQuerySelector(mobileMenuEl, \".technical-language-selector\") || undefined;\r\n\t\tfirstLevelMenuEls = expressQuerySelectorAll(mobileMenuEl, \".technical-mobile-navigation-first-level-container\");\r\n\r\n\t\t// set language\r\n\t\tif (languageSelectorEl) {\r\n\t\t\tconst activeLanguageEl = expressQuerySelector(languageSelectorEl, \".a-language-selector__language-active\");\r\n\t\t\tif (activeLanguageEl && currentLanguage) {\r\n\t\t\t\tconst languageEl = expressQuerySelector(activeLanguageEl, \".a-language-selector__language\");\r\n\t\t\t\tif (languageEl) {\r\n\t\t\t\t\tlanguageEl.innerHTML = currentLanguage;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst iconButtonEls = expressQuerySelectorAll(firstLevelListEl, '.technical-icon-svg')\r\n\t\t\t.filter(el => !!el.getAttribute('data-icon-svg'));\r\n\r\n\t\tif (iconButtonEls.length > 0) {\r\n\t\t\tloadIcons(\r\n\t\t\t\ticonButtonEls.map(el => el.getAttribute('data-icon-svg')!)\r\n\t\t\t)\r\n\t\t\t\t.then(\r\n\t\t\t\t\tres =>\r\n\t\t\t\t\t\ticonButtonEls.forEach(el => {\r\n\t\t\t\t\t\t\tconst icon = res[el.getAttribute('data-icon-svg')!];\r\n\t\t\t\t\t\t\tif (icon) el.insertAdjacentHTML(\"beforeend\", icon);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (closeContainerEl) attachCloseMenuClick(closeContainerEl);\r\n\t\tif (languageSelectorEl) attachLanguageSelectorClick(languageSelectorEl);\r\n\t\tattachFirstMenuItemClick(firstLevelMenuEls);\r\n\t};\r\n\r\n\tconst loadMobileMenu = () => {\r\n\t\tif (!loaded) {\r\n\t\t\tif (!contentPreLoaded) {\r\n\t\t\t\treturn getMobileMenu()\r\n\t\t\t\t\t.then(res => {\r\n\t\t\t\t\t\tloaded = true;\r\n\t\t\t\t\t\tonOpen && onOpen();\r\n\t\t\t\t\t\tmobileMenuEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\t\tinitMenuItemsAndBehavior();\r\n\t\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tloaded = true;\r\n\t\t\t\tinitMenuItemsAndBehavior();\r\n\t\t\t\treturn Promise.resolve();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tonOpen && onOpen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onButtonClick = () =>\r\n\t\tmenuContainerEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\r\n\tconst openMenu = () => {\r\n\t\treturn loadMobileMenu()\r\n\t\t\t.then(() => {\r\n\t\t\t\tattachOnDocumentClick();\r\n\r\n\t\t\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(firstLevelListEl);\r\n\r\n\t\t\t\t// Save height for later use in data attribute 'elementHeight'\r\n\t\t\t\tfirstLevelListEl.dataset.elementHeight = firstLevelListEl.style.height || '';\r\n\r\n\t\t\t\t// only show mobile menu when whole thing is loaded / initialized\r\n\t\t\t\tmenuButtonEl.classList.add(\"menu-is-open\");\r\n\t\t\t\tmenuContainerEl.classList.add(\"menu-is-open\");\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst resetMenu = () => {\r\n\t\tcontainerEl.classList.remove(\"second-level-is-active\");\r\n\t\tcontainerEl.classList.remove(\"third-level-is-active\");\r\n\t\tuserContainerEl.classList.remove(\"u-hide\");\r\n\t\tcloseContainerEl.classList.remove(\"u-hide\");\r\n\r\n\t\t// Show first level\r\n\t\tfirstLevelMenuEls.forEach(firstLevelEl => {\r\n\t\t\tfirstLevelEl.classList.remove(\"u-hide\");\r\n\t\t\tconst firstLevelMenuButtons = expressQuerySelectorAll(firstLevelEl, \".o-navigation-mobile__first-level-navigation__button\");\r\n\t\t\tfirstLevelMenuButtons.forEach(el => el.classList.remove(\"u-hide\"));\r\n\t\t});\r\n\r\n\t\t//Hide second and third level\r\n\t\texpressQuerySelectorAll(containerEl, \".technical-mobile-navigation-second-level\").forEach(el => {\r\n\t\t\tif (!el.classList.contains(\"u-hide\")) el.classList.add(\"u-hide\");\r\n\t\t});\r\n\r\n\t\tsecondLevelMenuEls.forEach(secondLevelEl => {\r\n\t\t\tif (!secondLevelEl.classList.contains(\"u-hide\")) secondLevelEl.classList.add(\"u-hide\");\r\n\r\n\t\t\tconst menuSecondLevelContainerEls = expressQuerySelectorAll(secondLevelEl, \".technical-mobile-navigation-container\");\r\n\t\t\tmenuSecondLevelContainerEls.forEach(el => el.classList.remove(\"u-hide\"));\r\n\r\n\t\t\tconst thirdLevelEls = expressQuerySelectorAll(secondLevelEl, \".technical-mobile-navigation-third-level\");\r\n\t\t\tif (thirdLevelEls)\r\n\t\t\t\tthirdLevelEls.forEach(thirdLevelEl => {\r\n\t\t\t\t\tif (!thirdLevelEl.classList.contains(\"u-hide\")) thirdLevelEl.classList.add(\"u-hide\");\r\n\t\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\tconst hideOtherMenuItems = (elem: HTMLElement) => {\r\n\t\tif (elem.parentNode && elem.parentNode.hasChildNodes()) {\r\n\t\t\t[].slice.call(elem.parentNode.children)\r\n\t\t\t\t.forEach(el => {\r\n\t\t\t\t\tconst elm: HTMLElement = el;\r\n\t\t\t\t\tif (elem !== elm) {\r\n\t\t\t\t\t\telm.classList.toggle(\"u-hide\");\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst onFirstMenuItemClick = (e: Event) => {\r\n\t\tif (handleHeaderLink(e.target)) return;\r\n\t\tconst firstLevelEl = e.currentTarget as HTMLElement;\r\n\t\tconst secondLevelIndex = Number(firstLevelEl.dataset.index) ?? -1;\r\n\t\tconst secondLevelEl = expressQuerySelector(firstLevelEl, '.technical-mobile-navigation-second-level', false);\r\n\t\tif (!secondLevelEl) return; // no second level\r\n\r\n\t\tfirstLevelMenuSelected = expressQuerySelector(firstLevelEl, \".technical-mobile-navigation-second-level\") || undefined;\r\n\t\tconst prevClickedEl = expressQuerySelector(mobileMenuEl, \".technical-clicked\", false);\r\n\r\n\t\t// Values of first lvl menu (needs to be recalculated since the 'account' section isn't shown in 2nd lvl)\r\n\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\t// calculateAndSetHeightOfMobileNavigationLevel(firstLevelListEl);\r\n\r\n\t\t// Set height of first lvl again correct (get from data attribute elementHeight)\r\n\t\tfirstLevelListEl.style.height = '100vh';\r\n\r\n\t\t// Reset scroll position otherwise 2nd lvl can already be scrolled down:\r\n\t\tfirstLevelListEl.scrollTop = 0;\r\n\r\n\r\n\t\tif (firstLevelMenuSelected) {\r\n\t\t\t// Keep track of clicked element and its scrollTop\r\n\t\t\tif (!prevClickedEl) {\r\n\t\t\t\tfirstLevelEl.classList.add(\"technical-clicked\");\r\n\t\t\t\tfirstLevelEl.dataset.offset = firstLevelEl.offsetTop + \"\";\r\n\t\t\t\tconst parent = firstLevelEl.parentNode as HTMLElement;\r\n\t\t\t\tif (parent) parent.dataset.offset = parent.offsetTop + \"\";\r\n\t\t\t}\r\n\r\n\t\t\tcontainerEl.classList.add(\"second-level-is-active\");\r\n\t\t\tcontainerEl.classList.remove(\"third-level-is-active\");\r\n\t\t\tuserContainerEl.classList.toggle(\"u-hide\");\r\n\t\t\tcloseContainerEl.classList.toggle(\"u-hide\");\r\n\r\n\t\t\thideOtherMenuItems(firstLevelEl);\r\n\r\n\t\t\tfirstLevelMenuSelected.classList.toggle(\"u-hide\");\r\n\t\t\tconst firstLevelMenuButton = expressQuerySelector(firstLevelEl, \".o-navigation-mobile__first-level-navigation__button\");\r\n\t\t\tif (firstLevelMenuButton) firstLevelMenuButton.classList.toggle(\"u-hide\");\r\n\r\n\t\t\tconst secondLevelNavigationEl = expressQuerySelector(firstLevelMenuSelected, \".technical-second-level\");\r\n\t\t\tif (secondLevelNavigationEl) secondLevelNavigationEl.classList.remove(\"u-hide\");\r\n\r\n\t\t\tconst secondLevelContainerEl = expressQuerySelectorAll(firstLevelMenuSelected, \".technical-mobile-navigation-second-level-container\");\r\n\t\t\tsecondLevelContainerEl.forEach((el) => el.classList.remove(\"u-hide\"));\r\n\t\t}\r\n\r\n\t\t// In case we have a clicked element bring it into view\r\n\t\tif (prevClickedEl) {\r\n\t\t\tprevClickedEl.classList.remove(\"technical-clicked\");\r\n\t\t\tsetScrollTop(prevClickedEl);\r\n\t\t\tif (prevClickedEl.parentNode) {\r\n\t\t\t\tsetScrollTop(prevClickedEl.parentNode as HTMLElement);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst loadSecondLevelEl = expressQuerySelector(secondLevelEl, '.technical-replace-level-loaded', false);\r\n\t\tif (!loadSecondLevelEl || !loadSecondLevelEl.parentElement) {\r\n\t\t\t// Calculate height of second lvl menu (without browser bars)\r\n\t\t\tconst menuItemsSecondLvl = expressQuerySelector(firstLevelMenuSelected, '.o-navigation-mobile__second-level-navigation__button-list', false);\r\n\t\t\tif (menuItemsSecondLvl && menuItemsSecondLvl.clientHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsSecondLvl);\r\n\t\t\telse\r\n\t\t\t\tfirstLevelListEl.style.height = firstLevelListEl.dataset.elementHeight || '';\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// load second level\r\n\t\tgetMobileMenu(secondLevelIndex, -1).then(res => {\r\n\t\t\tconst frag = document.createRange().createContextualFragment(res);\r\n\t\t\tsecondLevelEl.replaceChild(frag, loadSecondLevelEl);\r\n\t\t\tconst secondLevelItems = expressQuerySelectorAll(firstLevelEl, \".technical-mobile-navigation-second-level-container\");\r\n\t\t\tsecondLevelMenuEls = secondLevelMenuEls.concat(secondLevelItems);\r\n\t\t\tattachSecondMenuItemClick(secondLevelItems);\r\n\r\n\t\t\t// Calculate height of second lvl menu (without browser bars)\r\n\t\t\tconst menuItemsSecondLvl = expressQuerySelector(firstLevelMenuSelected, '.o-navigation-mobile__second-level-navigation__button-list', false);\r\n\t\t\tif (menuItemsSecondLvl && menuItemsSecondLvl.clientHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsSecondLvl);\r\n\t\t\telse\r\n\t\t\t\tfirstLevelListEl.style.height = firstLevelListEl.dataset.elementHeight || '';\r\n\t\t});\r\n\t};\r\n\r\n\tconst setScrollTop = (el: HTMLElement) => {\r\n\t\tconst scrollPos = el.dataset.offset || \"\";\r\n\t\tif (scrollPos && el.parentNode) {\r\n\t\t\tconst parent = el.parentNode as HTMLElement;\r\n\t\t\tparent.scrollTop = parseInt(scrollPos, 10);\r\n\t\t\tel.dataset.offset = \"\";\r\n\t\t}\r\n\t};\r\n\r\n\tconst onSecondMenuItemClick = (e: Event) => {\r\n\t\tif (handleHeaderLink(e.target)) return;\r\n\t\te.stopPropagation();\r\n\t\tconst secondLevelEl = e.currentTarget as HTMLElement;\r\n\r\n\t\tconst thirdLevelDivEl = expressQuerySelector(secondLevelEl, '.technical-mobile-navigation-third-level', false);\r\n\t\tif (!thirdLevelDivEl) return; // no third level\r\n\r\n\t\t// 3th level\r\n\t\tconst thirdLevelEl = secondLevelEl.querySelector(\".technical-mobile-navigation-third-level\");\r\n\t\tif (thirdLevelEl) {\r\n\t\t\tcontainerEl.classList.toggle(\"third-level-is-active\");\r\n\t\t\tthirdLevelEl.classList.toggle(\"u-hide\");\r\n\r\n\t\t\thideOtherMenuItems(secondLevelEl);\r\n\r\n\t\t\tif (firstLevelMenuSelected) {\r\n\t\t\t\tconst secondeLevelNavigationEl = firstLevelMenuSelected.querySelector(\".technical-second-level\");\r\n\t\t\t\tif (secondeLevelNavigationEl) secondeLevelNavigationEl.classList.toggle(\"u-hide\");\r\n\t\t\t}\r\n\r\n\t\t\tconst thirdLevelContainerEl = secondLevelEl.querySelector(\".technical-mobile-navigation-container\");\r\n\t\t\tif (thirdLevelContainerEl) thirdLevelContainerEl.classList.toggle(\"u-hide\");\r\n\t\t}\r\n\r\n\t\tconst loadThridLevelEl = expressQuerySelector(thirdLevelDivEl, '.technical-replace-level-loaded', false);\r\n\t\tif (!loadThridLevelEl || !loadThridLevelEl.parentElement) {\r\n\t\t\tconst menuItemsThirdLvl = expressQuerySelector(secondLevelEl, '.o-navigation-mobile__third-level-navigation__button-list', false);\r\n\t\t\t// Calculate height of third lvl menu (without browser bars)\r\n\t\t\tif (menuItemsThirdLvl && menuItemsThirdLvl.offsetHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsThirdLvl);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// get from api\r\n\t\tconst secondLevelIndex = Number((secondLevelEl.closest('.technical-mobile-navigation-first-level-container') as HTMLElement).dataset.index) ?? -1;\r\n\t\tconst thirdLevelIndex = Number(secondLevelEl.dataset.index) ?? -1;\r\n\t\tgetMobileMenu(secondLevelIndex, thirdLevelIndex).then(res => {\r\n\t\t\tconst frag = document.createRange().createContextualFragment(res);\r\n\t\t\tthirdLevelDivEl.replaceChild(frag, loadThridLevelEl); // sub level of level\r\n\t\t\tconst thirdLevelItems = expressQuerySelectorAll(secondLevelEl, \".o-navigation-mobile__third-level-navigation__button-container\");\r\n\t\t\tthirdLevelMenuEls = thirdLevelMenuEls.concat(thirdLevelItems);\r\n\t\t\tattachThirdMenuItemClick(thirdLevelItems);\r\n\r\n\t\t\tconst menuItemsThirdLvl = expressQuerySelector(secondLevelEl, '.o-navigation-mobile__third-level-navigation__button-list', false);\r\n\t\t\t// Calculate height of third lvl menu (without browser bars)\r\n\t\t\tif (menuItemsThirdLvl && menuItemsThirdLvl.offsetHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsThirdLvl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst onThirdMenuItemClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t};\r\n\r\n\tconst handleHeaderLink = (evTarget: EventTarget | null): boolean => {\r\n\t\tif (evTarget) {\r\n\t\t\tconst target = evTarget as HTMLElement;\r\n\t\t\tif (target.nodeName.toLowerCase() === \"a\" || (target.parentNode && target.parentNode.nodeName.toLowerCase() === \"a\")) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tconst onLanguageSelectorClick = (e: Event) => {\r\n\t\tconst languageSelectorContainerEl = e.currentTarget as HTMLElement;\r\n\t\tconst languageCurrentEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__current\");\r\n\t\tconst languageChoicesContainerEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__choices\");\r\n\t\tconst languageSelectorDescrEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__description\");\r\n\t\tconst languageSelectorDescrOptionsEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__description-options\");\r\n\r\n\t\tif (languageCurrentEl)\r\n\t\t\tlanguageCurrentEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageChoicesContainerEl)\r\n\t\t\tlanguageChoicesContainerEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageSelectorDescrEl)\r\n\t\t\tlanguageSelectorDescrEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageSelectorDescrOptionsEl)\r\n\t\t\tlanguageSelectorDescrOptionsEl.classList.toggle(\"u-hide\");\r\n\t};\r\n\r\n\tconst attachCloseMenuClick = (closeContainerEl: HTMLElement) => {\r\n\r\n\t\tconst closeButtonEl = expressQuerySelector(closeContainerEl, \".m-navigation-overlay__close-icon\");\r\n\t\tif (closeButtonEl) {\r\n\t\t\tonCloseClickDisposable = compositeDisposable([expressEventListener(closeContainerEl, \"click\", onCloseMenuClick)]);\r\n\t\t}\r\n\t};\r\n\r\n\tconst detachCloseMenuClick = () => onCloseClickDisposable && onCloseClickDisposable.dispose();\r\n\r\n\tconst attachFirstMenuItemClick = (firstLevelMenuEls: HTMLElement[]) => {\r\n\t\tfirstLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onFirstMenuItemClick));\r\n\t};\r\n\r\n\tconst attachSecondMenuItemClick = (secondLevelMenuEls: HTMLElement[]) => {\r\n\t\tsecondLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onSecondMenuItemClick));\r\n\t};\r\n\r\n\tconst attachThirdMenuItemClick = (thirdLevelMenuEls: HTMLElement[]) => {\r\n\t\tthirdLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onThirdMenuItemClick));\r\n\t};\r\n\r\n\tconst attachLanguageSelectorClick = (languageSelectorEl: HTMLElement) => {\r\n\t\tonLanguageSelectorClickDisposable = compositeDisposable(\r\n\t\t\t[expressEventListener(languageSelectorEl, \"click\", onLanguageSelectorClick)]\r\n\t\t);\r\n\t};\r\n\r\n\tconst detachLanguageSelectorClick = () => onLanguageSelectorClickDisposable && onLanguageSelectorClickDisposable.dispose();\r\n\r\n\tconst menuButtonComponent = createClickableElement(menuButtonEl, onButtonClick);\r\n\r\n\tconst deInit = () => {\r\n\t\tdispose();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\t// remove all handlers\r\n\tconst dispose = () => {\r\n\t\tmenuButtonComponent.dispose();\r\n\t\tdetachLanguageSelectorClick();\r\n\t\tdetachCloseMenuClick();\r\n\t\tdetachDocumentClick();\r\n\r\n\t\tfirstLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onFirstMenuItemClick));\r\n\t\tsecondLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onSecondMenuItemClick));\r\n\t\tthirdLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onThirdMenuItemClick));\r\n\t};\r\n\r\n\treturn {\r\n\t\tdeInit\r\n\t};\r\n}\r\n","import { IIconResult } from \"../utils/icons\";\r\nimport {\r\n\tgetParentWithClassName,\r\n\thide,\r\n\tisMobileOnPageWithHeader,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll\r\n} from \"../common/html\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getHtmlRequest, getRequest, postRequest } from \"../utils/fetch\";\r\nimport { initNavigationDesktop } from \"./navigation-desktop\";\r\nimport { initLanguageSelector } from \"./language-selector\";\r\nimport { initSearchBar } from \"./search-bar\";\r\nimport { createNotificationCenter } from \"./notification-center\";\r\nimport { createClickableElement } from \"./button\";\r\nimport { initMyAccount } from \"./my-account\";\r\nimport { initCountDown } from \"./countdown\";\r\nimport { initNavigationMobile } from \"./navigation-mobile\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\n\r\nexport interface IMainNavigationDependencies {\r\n\treadonly getInlineSvgsAsync: (ids: string[]) => Promise;\r\n\treadonly openLeadTimesPopupAsync?: () => Promise;\r\n}\r\ninterface IEventAnimation {\r\n\ttoggleEventVisibility: (open: boolean) => void;\r\n}\r\n\r\nexport function createMainNavigation(containerEl: HTMLElement, deps: IMainNavigationDependencies) {\r\n\tconst mainNavigationEl = containerEl;\r\n\tconst mobileMenuEl = expressQuerySelector(mainNavigationEl, \"#technical-mobile-menu\", false);\r\n\tconst isMobile = () => isMobileOnPageWithHeader();\r\n\r\n\tconst initEventAnimation = (): IEventAnimation => {\r\n\t\tconst eventContainer = expressQuerySelector(containerEl, '.technical-event-container', false);\r\n\t\tif (!eventContainer || !window['lottie']) return {\r\n\t\t\ttoggleEventVisibility: () => { return; }\r\n\t\t};\r\n\t\tconst stickyNav = eventContainer.dataset.stickynav === 'true';\r\n\t\tconst mobile = isMobile();\r\n\t\tconst seen = getCookie('evSeen') && getCookie('evSeen') === '1';\r\n\t\tconst imageContainer = expressQuerySelector(containerEl, '.technical-animate-img', true);\r\n\t\tconst animation = lottie.loadAnimation({\r\n\t\t\tcontainer: imageContainer,\r\n\t\t\trenderer: 'svg', // Choose the renderer\r\n\t\t\tloop: false,\r\n\t\t\tautoplay: false,\r\n\t\t\tpath: window.context.cdn + imageContainer.dataset.catimage,\r\n\t\t\tinitialSegment: seen ? [255, 354] : [0, 354]\r\n\t\t});\r\n\r\n\t\tanimation.addEventListener('complete', () => {\r\n\t\t\t// Loop the last 4 seconds of the animation continuously\r\n\t\t\tanimation.playSegments([255, 354], true);\r\n\t\t});\r\n\r\n\t\tconst animate = expressQuerySelector(containerEl, `.technical-animate-img`, true);\r\n\t\tanimate.style.transition = \"opacity 0.5s\";\r\n\t\tanimate.style.opacity = \"1\";\r\n\r\n\t\tconst eventContainerInitialHeight = eventContainer.clientHeight;\r\n\t\tconst toggleEventVisibility = (visiblePx: number) => {\r\n\t\t\tif (!mobile) {\r\n\t\t\t\timageContainer.style.opacity = `${1 - ((100 / 70) * visiblePx) / 100}`;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\teventContainer.style.opacity = `${1 - ((100 / 70) * visiblePx) / 100}`; // Changes the opacity on scroll\r\n\t\t\teventContainer.style.height = `${eventContainerInitialHeight + 1 - ((100 / 70) * visiblePx) / 5}px`; // Slightly collapses the evenContainer for a nice effect (+1 is for the border)\r\n\t\t\tif (stickyNav) {\r\n\t\t\t\tconst mobileSearchBar = expressQuerySelector(containerEl, '.technical-mobile-searchbar', true);\r\n\t\t\t\tmobileSearchBar.style.top = `${130 - visiblePx}px`; // Lets the scrollbar go to its fixed place when scrolling\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (stickyNav)\r\n\t\t\tdocument.addEventListener('scroll', _ => !getScrollingElement().classList.contains('u-no-scroll-mobile') && toggleEventVisibility(mobile ? window.scrollY > eventContainerInitialHeight ? eventContainerInitialHeight : window.scrollY : 0));\r\n\r\n\t\tanimation.play();\r\n\t\tif (!seen) writeCookieThatExpiresAtTheEndOfTheDay('evSeen', '1');\r\n\r\n\t\treturn {\r\n\t\t\ttoggleEventVisibility: (hide: boolean) => toggleEventVisibility(hide ? eventContainerInitialHeight : 0)\r\n\t\t};\r\n\t};\r\n\r\n\tconst initComponents = () => {\r\n\t\tconst eventAnimation = initEventAnimation();\r\n\r\n\t\t// Mobile Menu\r\n\t\tconst onOpen = () => { eventAnimation.toggleEventVisibility(true); };\r\n\t\tconst onClose = () => { eventAnimation.toggleEventVisibility(false); };\r\n\t\tinitMobileMenu(onOpen, onClose);\r\n\t\tconst loadDesktopMenuItemAsync = (firstLevel = -1, secondLevel = -1) => {\r\n\t\t\tif (secondLevel < 0)\r\n\t\t\t\treturn getHtmlRequest(\"/apicore/header/desktopmenu?indexLevel1=\" + firstLevel).then(res => res as string);\r\n\t\t\telse\r\n\t\t\t\treturn getHtmlRequest(\"/apicore/header/desktopmenu?indexLevel1=\" + firstLevel + \"&indexLevel2=\" + secondLevel).then(res => res as string);\r\n\t\t};\r\n\t\t// Desktop Menu\r\n\t\tconst desktopLeftMenuEl = expressQuerySelector(mainNavigationEl, '.technical-desktop-left-menu', false);\r\n\t\tif (desktopLeftMenuEl) {\r\n\t\t\tinitNavigationDesktop(\r\n\t\t\t\tdesktopLeftMenuEl, { loadDesktopMenuItemAsync }\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Language Selector\r\n\t\tconst langButtonEl = expressQuerySelector(mainNavigationEl, \".technical-language-selector\", false);\r\n\t\tconst langContainerEl = expressQuerySelector(mainNavigationEl, \".technical-language-selector-choices\", false);\r\n\t\tif (langButtonEl && langContainerEl) {\r\n\t\t\tinitLanguageSelector(langButtonEl, langContainerEl);\r\n\t\t}\r\n\r\n\t\tconst searchBarEl = expressQuerySelector(mainNavigationEl, \".o-main-navigation__searchbar\", false);\r\n\t\tif (searchBarEl) {\r\n\t\t\tinitSearchBar(\r\n\t\t\t\tsearchBarEl,\r\n\t\t\t\texpressQuerySelector(mainNavigationEl, \".o-icon-navigation__search-bar\", true),\r\n\t\t\t\t(searchTerm: string) => getRequest(\"/apicore/searchapi/autocomplete?searchterm=\" + searchTerm).then((res: string[]) => res),\r\n\t\t\t\t() => { !isMobile() && eventAnimation.toggleEventVisibility(true); },\r\n\t\t\t\t() => { !isMobile() && eventAnimation.toggleEventVisibility(false); }\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Notification Center\r\n\t\tconst notificationCenterEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__notifications-center', false);\r\n\t\tif (notificationCenterEl) {\r\n\t\t\tcreateNotificationCenter(\r\n\t\t\t\tnotificationCenterEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetNotifications: () => getHtmlRequest(\"/apicore/Header/LoadNotificationTiles\", {\r\n\t\t\t\t\t\theaders: new Headers({\r\n\t\t\t\t\t\t\t'pragma': 'no-cache',\r\n\t\t\t\t\t\t\t'cache-control': 'no-cache'\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\t.then(res => res as string),\r\n\t\t\t\t\tisMobile: isMobile,\r\n\t\t\t\t\tmarkNotificationsAsRead: (notificationIds: string[]) => {\r\n\t\t\t\t\t\tconst data = new URLSearchParams();\r\n\t\t\t\t\t\tnotificationIds.forEach(el => {\r\n\t\t\t\t\t\t\tdata.append('notificationIds', el);\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\treturn postRequest(\"/apicore/Header/MarkNotificationAsRead\", data, { headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" } }, true)\r\n\t\t\t\t\t\t\t.then((res: boolean) => res);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tonOpen: () => { isMobile() && eventAnimation.toggleEventVisibility(true); toggleScroll(); },\r\n\t\t\t\t\tonClose: () => { eventAnimation.toggleEventVisibility(false); toggleScroll(); },\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// My-Account\r\n\t\tconst myAccountMenuEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-menu', false);\r\n\t\tif (myAccountMenuEl) {\r\n\t\t\tinitMyAccount(\r\n\t\t\t\tmainNavigationEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetIconsAsync: deps.getInlineSvgsAsync,\r\n\t\t\t\t\tisMobile: isMobile,\r\n\t\t\t\t\tonOpen: () => { isMobile() && eventAnimation.toggleEventVisibility(true); toggleScroll(); },\r\n\t\t\t\t\tonClose: () => { eventAnimation.toggleEventVisibility(false); toggleScroll(); },\r\n\t\t\t\t\tloadAccountMenu: () => getHtmlRequest(\"/apicore/Header/LoadMyAccount\").then((res: string) => res)\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tconst leadTimesBarEl = expressQuerySelector(mainNavigationEl, '.technical-leadtimes', false);\r\n\t\tif (leadTimesBarEl) {\r\n\t\t\tcreateClickableElement(\r\n\t\t\t\tleadTimesBarEl,\r\n\t\t\t\tdeps.openLeadTimesPopupAsync\r\n\t\t\t);\r\n\r\n\t\t\tgetParameter('leadtimes') === 'true' && leadTimesBarEl.click();\r\n\t\t}\r\n\r\n\t\t// init countdowns on value propositions\r\n\t\tconst topBarContainerEl = expressQuerySelector(mainNavigationEl, '.technical-top-bar-container', false);\r\n\t\tif (topBarContainerEl) {\r\n\t\t\tconst countDownEls = expressQuerySelectorAll(topBarContainerEl, \".technical-countdown\");\r\n\t\t\tcountDownEls.forEach(el => {\r\n\t\t\t\tconst countDownToDate = el.dataset.countdown || \"\";\r\n\t\t\t\tconst daysLabel = el.dataset.dayslabel || \"\";\r\n\t\t\t\tconst dayLabel = el.dataset.daylabel || \"\";\r\n\t\t\t\tif (countDownToDate !== \"\") {\r\n\t\t\t\t\tconst onCountDownFinish = () => {\r\n\t\t\t\t\t\tconst barEls = expressQuerySelectorAll(topBarContainerEl, \".technical-top-bar\");\r\n\t\t\t\t\t\tif (barEls.length === 1) {\r\n\t\t\t\t\t\t\t// Hide container\r\n\t\t\t\t\t\t\thide(topBarContainerEl);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// delete own top bar\r\n\t\t\t\t\t\t\tconst myTopBar = getParentWithClassName(el, \"technical-top-bar\");\r\n\t\t\t\t\t\t\tmyTopBar && myTopBar.remove();\r\n\r\n\t\t\t\t\t\t\t// switch container to single\r\n\t\t\t\t\t\t\ttopBarContainerEl.classList.remove(\"m-top-bar--combo\");\r\n\t\t\t\t\t\t\ttopBarContainerEl.classList.add(\"m-top-bar--single\");\r\n\r\n\t\t\t\t\t\t\t// remove div around other top bar\r\n\t\t\t\t\t\t\tconst otherTopBar = barEls.filter(el => el !== myTopBar)[0];\r\n\t\t\t\t\t\t\tif (otherTopBar)\r\n\t\t\t\t\t\t\t\totherTopBar.outerHTML = otherTopBar.innerHTML;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tinitCountDown(topBarContainerEl, el, countDownToDate, {\r\n\t\t\t\t\t\tshowDays: true,\r\n\t\t\t\t\t\tonCountDownFinish: onCountDownFinish,\r\n\t\t\t\t\t\tdaysLabel,\r\n\t\t\t\t\t\tdayLabel\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst initMobileMenu = (onOpen: () => void, onClose: () => void) => {\r\n\t\tif (mobileMenuEl) {\r\n\t\t\tconst path = '/apicore/header/mobilemenu';\r\n\t\t\tconst pageid = mobileMenuEl.getAttribute(\"data-page-id\");\r\n\t\t\tinitNavigationMobile(\r\n\t\t\t\t{\r\n\t\t\t\t\tmobileMenuEl: mobileMenuEl,\r\n\t\t\t\t\tcontainerEl: expressQuerySelector(document, \".technical-mobile-navigation\", true),\r\n\t\t\t\t\tmenuButtonEl: expressQuerySelector(document, \".technical-mobile-navigation-hamburger-menu-button\", true),\r\n\t\t\t\t\tmenuContainerEl: expressQuerySelector(document, \".technical-mobile-navigation-hamburger-menu-container\", true),\r\n\t\t\t\t\tcurrentLanguage: mobileMenuEl.getAttribute(\"data-current-language\") || undefined\r\n\t\t\t\t}, {\r\n\t\t\t\tgetMobileMenu: (indexLevel2: number, indexLevel3: number) =>\r\n\t\t\t\t\tgetHtmlRequest(path + `?indexLevel2=${indexLevel2 ?? -1}&indexLevel3=${indexLevel3 ?? -1}&pageId=${pageid}`, { headers: new Headers({ 'pragma': 'no-cache', 'cache-control': 'no-cache' }) }).then(res => res as string),\r\n\t\t\t\tgetIconsAsync: deps.getInlineSvgsAsync,\r\n\t\t\t\tonClose: () => { onClose(); toggleScroll(); },\r\n\t\t\t\tonOpen: () => { onOpen(); toggleScroll(); },\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleScroll = () => {\r\n\t\tconst scrollingElement = getScrollingElement();\r\n\r\n\t\tif (!scrollingElement.classList.contains('u-no-scroll-mobile')) {\r\n\t\t\tscrollingElement.dataset.scrollY = `${Math.round(window.scrollY)}`;\r\n\t\t\tscrollingElement.classList.add('u-no-scroll-mobile');\r\n\t\t} else {\r\n\t\t\tscrollingElement.classList.remove('u-no-scroll-mobile');\r\n\t\t\tconst scrollY = parseInt(scrollingElement.dataset.scrollY, 10) || window.scrollY;\r\n\t\t\tscrollingElement.dataset.scrollY = '';\r\n\t\t\twindow.scroll(0, scrollY);\r\n\t\t}\r\n};\r\n\r\nconst getScrollingElement = () => (document.scrollingElement || document.documentElement) as HTMLElement;\r\n\r\ninitComponents();\r\n}\r\n","export interface IIconResult {\r\n\treadonly url: string;\r\n\treadonly svg: string;\r\n}\r\n\r\nconst getInlineSvgAsync = (url: string): Promise => {\r\n\treturn fetch(url)\r\n\t\t.then(response => response.text())\r\n\t\t.then(data => new window.DOMParser().parseFromString(data, \"text/xml\"))\r\n\t\t.then(document => {\r\n\t\t\tif (document && document.documentElement.nodeName.toLowerCase() === 'svg') {\r\n\t\t\t\tconst svgString = new XMLSerializer().serializeToString(document);\r\n\t\t\t\treturn Promise.resolve(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\turl,\r\n\t\t\t\t\t\tsvg: svgString\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\treturn Promise.resolve(undefined);\r\n\t\t\t}\r\n\t\t});\r\n};\r\n\r\nexport function getInlineSvgsAsync(urls: string[]) {\r\n\treturn Promise.all(urls.map(u => getInlineSvgAsync(u)))\r\n\t\t.then(items => items.filter(item => !!item) as IIconResult[]);\r\n}","import {IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener, expressQuerySelector} from \"../common/html\";\r\n\r\nexport interface ICountrySelectionDependencies {\r\n readonly showCountrySelectionPopup: () => Promise;\r\n readonly close: () => void;\r\n}\r\n\r\nexport function createCountrySelection(deps: ICountrySelectionDependencies) {\r\n let onClickDisposable: IDisposable;\r\n\r\n const init = () => {\r\n deps.showCountrySelectionPopup().then(() => {\r\n const countrySelectionPopup = expressQuerySelector(document, '#country-selection');\r\n if (countrySelectionPopup) {\r\n const continueButton = expressQuerySelector(countrySelectionPopup, '.technical-countryselection');\r\n if (continueButton) {\r\n if (continueButton.dataset.countryselectionlink) {\r\n const navigateToLink = continueButton.dataset.countryselectionlink.toLowerCase();\r\n attachOnClick(continueButton, () => navigateTo(navigateToLink));\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const navigateTo = (navigateToLink: string | undefined) => {\r\n if (navigateToLink) document.location.href = navigateToLink;\r\n\r\n deps.close();\r\n };\r\n\r\n const attachOnClick = (button: HTMLElement, ev: any) =>\r\n (onClickDisposable = expressEventListener(button, 'click', ev));\r\n\r\n const detachClick = () => onClickDisposable && onClickDisposable.dispose();\r\n\r\n init();\r\n\r\n return {\r\n dispose: () => {\r\n detachClick();\r\n }\r\n };\r\n}\r\n","export function checkPersonalNumber(pin, regionCode): boolean {\r\n\tif (pin.trim() === \"\")\r\n\t\treturn true;\r\n\r\n\tswitch (regionCode) {\r\n\t\tcase \"SWE\":\r\n\t\t\treturn checksumSe(pin);\r\n\t\tcase \"NOR\":\r\n\t\t\treturn checksumNo(pin);\r\n\t\tcase \"DNK\":\r\n\t\t\treturn checksumDk(pin);\r\n\t\tcase \"FIN\":\r\n\t\t\treturn checksumFi(pin);\r\n\t\tdefault:\r\n\t\t\treturn true;\r\n\t}\r\n}\r\n\r\nconst checksumDk = (pin: string): boolean => {\r\n\tif (pin && pin.length === 11) {\r\n\t\tconst checkSumString = \"4327654321\";\r\n\t\tlet result1 = 0;\r\n\t\tconst temp = pin.toString().substring(0, 6) + pin.toString().substring(7, 10);\r\n\r\n\t\tfor (let i = 0; i < 9; i++) {\r\n\t\t\tresult1 += parseInt(checkSumString[i].toString(), 10) * parseInt(temp[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum = 11 - result1 % 11;\r\n\t\tif (checksum === 11)\r\n\t\t\tchecksum = 0;\r\n\r\n\t\tif (checksum.toString() === pin[10])\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumFi = (pin: string): boolean => {\r\n\tif (pin && pin.length === 11) {\r\n\t\tconst checkSumString = \"0123456789ABCDEFHJKLMNPRSTUVWXY\";\r\n\r\n\t\tconst temp = parseInt(pin.toString().substring(0, 6) + pin.toString().substring(7, 10), 10);\r\n\t\tconst result1 = temp % 31;\r\n\t\tconst checksum = checkSumString[result1];\r\n\r\n\t\tif (checksum === pin[10])\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumNo = (pin: string): boolean => {\r\n\tif (pin && pin.length === 12) {\r\n\t\tlet result1 = 0;\r\n\t\tlet result2 = 0;\r\n\t\tconst checkSumString1 = \"376189-452\";\r\n\t\tconst checkSumString2 = \"543276-5432\";\r\n\r\n\t\tfor (let i = 0; i < 10; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\t\t\tresult1 += parseInt(checkSumString1[i].toString(), 10) * parseInt(pin[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum1 = 11 - result1 % 11;\r\n\t\tif (checksum1 === 11)\r\n\t\t\tchecksum1 = 0;\r\n\r\n\t\tif (checksum1.toString() !== pin[10])\r\n\t\t\treturn false;\r\n\r\n\r\n\t\tfor (let i = 0; i < 11; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\t\t\tresult2 += parseInt(checkSumString2[i].toString(), 10) * parseInt(pin[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum2 = 11 - result2 % 11;\r\n\t\tif (checksum2 === 11)\r\n\t\t\tchecksum2 = 0;\r\n\r\n\t\tif (checksum2.toString() !== pin[11])\r\n\t\t\treturn false;\r\n\t\telse\r\n\t\t\treturn true;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumSe = (pin: string): boolean => {\r\n\tif (pin && (pin.length === 11 || pin.length === 13)) {\r\n\t\tlet result1 = 0;\r\n\t\tconst multiplier = \"212121-212\".split('').map(s => +s); // convert string to number using +\r\n\t\tlet temp = 0;\r\n\r\n\t\t// format must be 123456-1234\r\n\t\tif (pin.length === 13)\r\n\t\t\tpin = pin.toString().substring(2);\r\n\t\tconst pins = pin.split('').map(s => +s);\r\n\t\tfor (let i = 0; i < 10; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\ttemp = multiplier[i] * pins[i];\r\n\t\t\tif (temp > 9)\r\n\t\t\t\tresult1 += parseInt(temp.toString().split('')[0], 10) + parseInt(temp.toString().split('')[1], 10);\r\n\t\t\telse\r\n\t\t\t\tresult1 += temp;\r\n\t\t}\r\n\r\n\t\tconst lastDigit = parseInt(result1.toString().split('')[result1.toString().length - 1], 10);\r\n\r\n\t\tlet checksum;\r\n\t\tif (lastDigit === 0)\r\n\t\t\tchecksum = 0;\r\n\t\telse\r\n\t\t\tchecksum = 10 - lastDigit;\r\n\r\n\t\treturn checksum === pins[10];\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\n","import {expressQuerySelector, isElementVisible} from \"../common/html\";\r\nimport {debounce} from \"../utils/debounce\";\r\n\r\nexport function createScrollToTop()\r\n{\r\n\tconst scrollToTopEl = expressQuerySelector(document, \".technical-scroll-to-top\", false);\r\n\tconst init = () => {\r\n\t\tconst wobblerEl = expressQuerySelector(document, \".m-wobbler\", false);\r\n\t\tconst stickyCtaButtonEl = expressQuerySelector(document, \".technical-mobile-cta-button\", false);\r\n\t\tconst footerEl = expressQuerySelector(document, \"footer\", false);\r\n\t\tlet fade;\r\n\t\tlet displayNone;\r\n\t\tif (wobblerEl && stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\tscrollToTopEl!.classList.add('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t} else {\r\n\t\t\tif (wobblerEl) scrollToTopEl.classList.add('m-scroll-to-top--has-wobbler');\r\n\t\t\tif (stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) scrollToTopEl.classList.add(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t}\r\n\r\n\t\tconst isIOS = (): boolean => {\r\n\t\t\tconst iosQuirkPresent = () => {\r\n\t\t\t\tconst audio = new Audio();\r\n\t\t\t\taudio.volume = 0.5;\r\n\t\t\t\treturn audio.volume === 1; // volume cannot be changed from \"1\" on iOS 12 and below\r\n\t\t\t};\r\n\t\t\tconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n\t\t\tconst isAppleDevice = navigator.userAgent.indexOf('Macintosh') !== 0;\r\n\t\t\tconst isTouchScreen = navigator.maxTouchPoints >= 1; // true for iOS 13\r\n\t\t\treturn isIOS || (isAppleDevice && (isTouchScreen || iosQuirkPresent()));\r\n\t\t};\r\n\r\n\t\tconst setBottomStyle = () => {\r\n\t\t\tif (wobblerEl && stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = stickyCtaButtonEl.clientHeight + \"px\";\r\n\t\t\t\tif (stickyCtaButtonEl.clientHeight > 60) scrollToTopEl.style.bottom = \"125px\";\r\n\t\t\t\telse scrollToTopEl.style.bottom = \"110px\";\r\n\t\t\t} else if (stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = stickyCtaButtonEl.clientHeight + \"px\";\r\n\t\t\t\tif (stickyCtaButtonEl.clientHeight > 60) scrollToTopEl.style.bottom = \"105px\";\r\n\t\t\t\telse scrollToTopEl.style.bottom = \"90px\";\r\n\t\t\t} else {\r\n\t\t\t\tscrollToTopEl.style.bottom = \"\";\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = \"\";\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst showBtn = (num: number) => {\r\n\t\t\tif (document.documentElement.scrollTop >= num ) {\r\n\t\t\t\tclearTimeout(fade);\r\n\t\t\t\tfade = setTimeout( function() {\r\n\t\t\t\t\tclearTimeout(displayNone);\r\n\t\t\t\t\tscrollToTopEl!.classList.remove('u-hide');\r\n\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\tscrollToTopEl!.classList.remove('m-scroll-to-top--invisible');\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t}, 100);\r\n\t\t\t} else {\r\n\t\t\t\tclearTimeout(fade);\r\n\t\t\t\tfade = setTimeout( function() {\r\n\t\t\t\t\tscrollToTopEl!.classList.add('m-scroll-to-top--invisible');\r\n\t\t\t\t\tdisplayNone = setTimeout(function () {\r\n\t\t\t\t\t\tscrollToTopEl!.classList.add('u-hide');\r\n\t\t\t\t\t}, 500);\r\n\t\t\t\t}, 100);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onResize = () => {\r\n\t\t\tif (!stickyCtaButtonEl) return;\r\n\t\t\tif (isElementVisible(stickyCtaButtonEl))\r\n\t\t\t{\r\n\t\t\t\tif (wobblerEl) scrollToTopEl!.classList.add('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t\t\telse scrollToTopEl.classList.add(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t\t} else {\r\n\t\t\t\tif (wobblerEl) {\r\n\t\t\t\t\tscrollToTopEl!.classList.remove('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t\t\t\tscrollToTopEl.classList.add('m-scroll-to-top--has-wobbler');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscrollToTopEl.classList.remove(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsetBottomStyle();\r\n\t\t};\r\n\r\n\t\twindow.addEventListener('scroll', () => { showBtn(20); });\r\n\t\twindow.addEventListener('resize', () => { debounce(onResize, 100); });\r\n\r\n\t\tif (scrollToTopEl) {\r\n\t\t\tscrollToTopEl.addEventListener(\"click\", () => {\r\n\t\t\t\twindow.scrollTo({ top: 0, behavior: \"smooth\" });\r\n\t\t\t\tif (isIOS()) debounce(() => { window.scrollTo({ top: 0, behavior: \"smooth\" }); }, 100);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tsetBottomStyle();\r\n\t};\r\n\r\n\tscrollToTopEl && init();\r\n}\r\n","import { expressQuerySelector } from \"../common/html\";\r\nimport { createNewsletterSubscribe } from \"./newsletter\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport { getCookie } from \"../utils/cookie\";\r\n\r\nexport function initLeaveIntent() {\r\n\tconst toggleLeaveIntent = (enable: boolean) => { if (typeof window.enableLeaveIntent !== \"undefined\") window.enableLeaveIntent = enable; };\r\n\tconst isLeaveIntentEnabled = (): boolean => window.enableLeaveIntent && window.location.search.indexOf(\"embed\") < 0 && getCookie(\"subscribedInThisSession\") !== \"true\";\r\n\tconst triggerLeaveIntentPopup = () => {\r\n\t\tcreatePopup({\r\n\t\t\tdialogId: 'leave-intent-dialog',\r\n\t\t\tview: 'leaveintentdialog'\r\n\t\t}).then(popup => {\r\n\t\t\tif (!popup.popup) return;\r\n\t\t\tpopup.openAsync()\r\n\t\t\t\t.then(_ => createNewsletterSubscribe(expressQuerySelector(popup.popup, '.technical-newsletter-subscribe', true)));\r\n\t\t});\r\n\t};\r\n\tconst init = (forceEnable?: boolean) => {\r\n\t\tif (!isLeaveIntentEnabled() && !forceEnable) return;\r\n\r\n\t\ttry {\r\n\t\t\touibounce(false, {\r\n\t\t\t\tsensitivity: 20,\r\n\t\t\t\taggressive: false,\r\n\t\t\t\tsitewide: true,\r\n\t\t\t\ttimer: 1000,\r\n\t\t\t\tdelay: 100,\r\n\t\t\t\tcallback: triggerLeaveIntentPopup,\r\n\t\t\t\tcookieExpire: 1,\r\n\t\t\t\tcanFire: isLeaveIntentEnabled\r\n\t\t\t});\r\n\t\t} catch (exc) {\r\n\t\t\t// Adblocker probably blocked ouiBounce from loading.\r\n\t\t}\r\n\t};\r\n\r\n\tinit(false);\r\n\r\n\treturn {\r\n\t\tEnableLeaveIntentPopup: () => init(true),\r\n\t\tEnableLeaveIntent: () => toggleLeaveIntent(true),\r\n\t\tDisableLeaveIntent: () => toggleLeaveIntent(false)\r\n\t};\r\n}\r\n","import { expressQuerySelector, expressQuerySelectorAll, hasClass } from \"../common/html\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { toUrlHash } from \"../utils/string\";\r\n\r\nexport interface ITabDependencies {\r\n\treadonly onBeforeOpen?: (tabContentEl: HTMLElement) => Promise;\r\n\treadonly onTabSwitch?: (oldTabId: string, newTabId: string) => void;\r\n}\r\n\r\nexport interface ITabContentRequest {\r\n\tid: string;\r\n\tproductCategory: string;\r\n\ttheme: string;\r\n}\r\n\r\nexport function CreateTabs(container: HTMLElement, deps?: ITabDependencies) {\r\n\tlet tabsCollectionContainer;\r\n\tif (hasClass(container, 'm-tabs')) {\r\n\t\ttabsCollectionContainer = container;\r\n\t} else {\r\n\t\ttabsCollectionContainer = expressQuerySelector(container, '.m-tabs', true);\r\n\t}\r\n\tconst tabHideClass = tabsCollectionContainer.dataset.hideclass || 'u-hide';\r\n\tconst init = () => {\r\n\t\tconst tabEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__input');\r\n\t\tif (tabEls.length > 1) {\r\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\r\n\t\t\tconst activeTab = urlParams.get('activetab');\r\n\t\t\tif (tabEls.filter(el => el.dataset.url).length === 0) {\r\n\t\t\t\tfixDataAttributes(tabEls);\r\n\t\t\t}\r\n\t\t\tupdateTab(tabEls, tabHideClass, activeTab);\r\n\t\t\taddEventListenerToTabs(tabEls);\r\n\t\t}\r\n\t};\r\n\tconst addQueryStringParameter = (key: string, value: string) => {\r\n\t\tif ('URLSearchParams' in window) {\r\n\t\t\tconst searchParams = new URLSearchParams(window.location.search);\r\n\t\t\tsearchParams.set(key, value);\r\n\t\t\tconst newRelativePathQuery = window.location.pathname + '?' + searchParams.toString();\r\n\t\t\thistory.replaceState({}, document.title, newRelativePathQuery);\r\n\t\t}\r\n\t};\r\n\r\n\tconst fixDataAttributes = (tabEls: HTMLInputElement[]) => {\r\n\t\tconst tabContentEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__content');\r\n\t\tif (tabEls.filter(el => el.dataset.url).length === 0) {\r\n\t\t\tlet hash;\r\n\t\t\tfor (let i = 0; i < tabEls.length; i++) {\r\n\t\t\t\tif (tabEls[i].hasAttribute('id')) {\r\n\t\t\t\t\thash = toUrlHash(tabEls[i].getAttribute('id'));\r\n\t\t\t\t\ttabEls[i].dataset.url = hash;\r\n\t\t\t\t\ttabContentEls[i].dataset.url = hash;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thash = 'tab' + i + '';\r\n\t\t\t\t\ttabEls[i].dataset.url = hash;\r\n\t\t\t\t\ttabContentEls[i].dataset.url = hash;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst addEventListenerToTabs = (tabEls: HTMLInputElement[]) => {\r\n\t\t// make tabs click-able\r\n\t\tfor (let i = 0; i < tabEls.length; i++)\r\n\t\t\ttabEls[i].addEventListener('change', (e) => {\r\n\t\t\t\tupdateTab(tabEls, tabHideClass, (e.target as HTMLElement).dataset.url);\r\n\t\t\t});\r\n\t};\r\n\r\n\t// update tab content visibility\r\n\tconst updateTab = (tabEls: HTMLInputElement[], hideClass: string, hash: string | undefined, pushNewHash = true) => {\r\n\t\tconst tabToSelect = hash ? expressQuerySelector(tabsCollectionContainer, `input[data-url=\"${hash}\"]`, false) : undefined;\r\n\t\tconst tabToSelectContent = hash ? expressQuerySelector(tabsCollectionContainer, `div[data-url=\"${hash}\"]`, false) : undefined;\r\n\t\tconst tabContentEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__content');\r\n\r\n\t\tif (tabToSelectContent && deps?.onBeforeOpen && tabToSelect && (!tabToSelect.dataset.loaded || tabToSelect.dataset.loaded !== 'true')) {\r\n\t\t\tdeps.onBeforeOpen(tabToSelectContent).then(_ => { tabToSelect.dataset.loaded = 'true'; });\r\n\t\t}\r\n\r\n\t\tfor (let z = 0; z < tabEls.length; z++) {\r\n\t\t\t// set check if selected tab\r\n\t\t\ttabEls[z].checked = (tabEls[z] === tabToSelect || (!tabToSelect && z === 0));\r\n\r\n\t\t\t// hide/show content selected tab\r\n\t\t\ttabContentEls[z].classList.toggle(hideClass || 'u-hide', !tabEls[z].checked);\r\n\r\n\t\t\t// push new # to the url bar\r\n\t\t\tif (tabEls[z].checked && pushNewHash && tabToSelect) {\r\n\t\t\t\tdeps?.onTabSwitch && deps.onTabSwitch(getParameter('activetab'), hash);\r\n\t\t\t\taddQueryStringParameter(\"activetab\", `${hash}`);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tinit();\r\n}\r\n","import {expressEventListener, expressQuerySelector} from \"../common/html\";\r\nimport {ShowContentDialog} from \"./content-dialog\";\r\nimport {CreateTabs} from \"./tab\";\r\n\r\nexport function createPopupLauncher(el: HTMLElement) {\r\n\tconst dialogId = el.dataset.dialogid || '';\r\n\tconst contentKey = el.dataset.label || '';\r\n\tif (dialogId && contentKey) {\r\n\t\tconst initContentParts = (popupEl: HTMLElement) => {\r\n\t\t\tif (!popupEl) return;\r\n\t\t\tconst tabsEl = expressQuerySelector(popupEl, \".m-tabs\", false);\r\n\t\t\tif (tabsEl) CreateTabs(tabsEl);\r\n\t\t};\r\n\t\tconst onClick = (e:MouseEvent) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tShowContentDialog({dialogId: dialogId, label: contentKey, openFunction: initContentParts});\r\n\t\t}; \r\n\t\texpressEventListener(el, 'click', onClick);\r\n\t}\r\n}\r\n","import {getHtmlRequest} from \"../utils/fetch\";\r\nimport {addParameter, updateParameter} from \"../utils/querystring\";\r\nconst basePath = \"/apicore/componentapi/\";\r\n\r\nexport function getComponentContent(\r\n\tcomponent: string,\r\n\tcontentKey: string,\r\n\tepc = \"\",\r\n\tisProspect = false,\r\n\tthemeKey = '',\r\n\tpageTemplate = '',\r\n\tpageName = '',\r\n\tindex = \"0\",\r\n\thidepromotionvisualization = 'false'): Promise {\r\n\tlet path = basePath + component;\r\n\tif (contentKey) path = addParameter(\"contentKey\", contentKey, path);\r\n\tif (epc) path = addParameter(\"epc\", epc, path);\r\n\tpath = addParameter(\"isProspect\", isProspect+'', path);\r\n\tif (themeKey) path = addParameter(\"theme\", themeKey, path);\r\n\tif (pageTemplate) path = addParameter(\"pageTemplate\", pageTemplate, path);\r\n\tif (pageName) path = addParameter(\"pageName\", pageName, path);\r\n\tpath = addParameter(\"index\", index, path);\r\n\tpath = addParameter(\"hidepromotionvisualization\", hidepromotionvisualization, path);\r\n\treturn getHtmlRequest(\r\n\t\tpath,\r\n\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t.then() as Promise;\r\n}\r\n","export interface IDataLayerProduct {\r\n\tcurrency: string;\r\n\tdeliveryInfo: string;\r\n\tformatImageSrc: string;\r\n\tcategoryCode: string;\r\n\tcategoryName: string;\r\n\tprice: number;\r\n\tparentCategories: string;\r\n\tpvc: string;\r\n\tproductCode: string;\r\n\tpvcName: string;\r\n}\r\n\r\nexport function pushEecDetailEvent(newUrl: string, product: IDataLayerProduct) {\r\n\tif (window.dataLayer[0].datalayerVersion >= '2022-06') {\r\n\t\twindow.dataLayer = window.dataLayer || [];\r\n\t\twindow.dataLayer.push({\r\n\t\t\tevent: 'eec.detail',\r\n\t\t\tecommerce: {\r\n\t\t\t\tdetail: {\r\n\t\t\t\t\tactionField: {\r\n\t\t\t\t\t},\r\n\t\t\t\t\tproducts: [{\r\n\t\t\t\t\t\tvariant: product?.pvc,\r\n\t\t\t\t\t\tid: product?.productCode,\r\n\t\t\t\t\t\tname: product?.pvcName,\r\n\t\t\t\t\t\tcategory: product?.parentCategories,\r\n\t\t\t\t\t\tprice: product?.price,\r\n\t\t\t\t\t\tpriceWOVat: 0,\r\n\t\t\t\t\t\tcurrencyCode: product?.currency,\r\n\t\t\t\t\t\tisItemJustAddedToCart: false,\r\n\t\t\t\t\t\tproductCategoryName: product?.categoryName,\r\n\t\t\t\t\t\tproductCategoryCode: product?.categoryCode,\r\n\t\t\t\t\t\tproductCategoryUrl: newUrl,\r\n\t\t\t\t\t\tvariantFormatImageUrl: product?.formatImageSrc,\r\n\t\t\t\t\t\testDeliveryDate: product?.deliveryInfo,\r\n\t\t\t\t\t\tisVoucher: false // ?\r\n\t\t\t\t\t}]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport function pushComponentEvent(componentName: string) {\r\n\twindow.dataLayer = window.dataLayer || [];\r\n\twindow.dataLayer.push({\r\n\t\t'event': componentName +'.component.loaded'\r\n\t});\r\n}\r\n","import {\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\thasClass,\r\n\tisElementPartiallyVisibleInViewport,\r\n\tisMobileOnPageWithHeader\r\n} from \"../common/html\";\r\nimport {getComponentContent} from \"../services/component-service.\";\r\nimport {trackComponentEvent} from \"../common/events\";\r\nimport {pushComponentEvent} from \"./datalayer\";\r\nimport {isValidPartialViewResponse} from \"../utils/fetch\";\r\n\r\nexport interface IComponent {\r\n\treadonly name: string;\r\n\treadonly activate: () => void;\r\n\treadonly index: string;\r\n}\r\n\r\nexport function createComponentLoader() {\r\n\tconst componentEls = expressQuerySelectorAll(document, \"[data-component]\");\r\n\tconst components: IComponent[] = [];\r\n\t/*const loadedScripts: string[] = [];\r\n\tconst scriptBasePath = \"core/components/\";*/\r\n\tconst isMobile = () => isMobileOnPageWithHeader();\r\n\r\n\tconst observerOptions = {\r\n\t\trootMargin: \"200px 0px 200px 0px\",\r\n\t\tthreshold: [0, .5, 1]\r\n\t};\r\n\r\n\tconst initComponent = (el: HTMLElement) => {\r\n\t\tconst componentName =el.dataset.component || '';\r\n\t\tconst index = el.dataset.index || '';\r\n\t\tconst initialized = el.dataset.init === 'true' || false;\r\n\t\tif (!componentName || initialized) return;\r\n\t\tconst currentComponent = index\r\n\t\t\t? components.find(c => c.name === componentName && c.index === index)\r\n\t\t\t: components.find(c => c.name === componentName);\r\n\t\tif (!currentComponent) return;\r\n\t\tcurrentComponent.activate();\r\n\t};\r\n\r\n\tfunction callback(entries: IntersectionObserverEntry[], observer: IntersectionObserver) {\r\n\t\tentries.forEach(entry => {\r\n\t\t\tif (!entry.isIntersecting && entry.intersectionRatio <= 0) return;\r\n\t\t\tinitComponent(entry.target as HTMLElement);\r\n\t\t\tobserver.unobserve(entry.target);\r\n\t\t});\r\n\t}\r\n\r\n\tconst componentObserver = new IntersectionObserver(callback, observerOptions);\r\n\r\n\tconst createComponent = (componentEl: HTMLElement) => {\r\n\t\tconst name = componentEl.dataset.component || '';\r\n\t\tif (!name) return;\r\n\t\tconst callback = componentEl.dataset.componentCallback || '';\r\n\t\tconst passElInCallback = componentEl.dataset.componentPassElementInCallback === \"true\" || false;\r\n\t\tconst trackGaEvent = componentEl.dataset.componentGaEvent || '';\r\n\t\tconst trackHeight = componentEl.dataset.componentTrackHeight === \"true\" || false;\r\n\t\tconst pushDatalayerEvent = componentEl.dataset.componentPushDatalayerEvent === \"true\" || false;\r\n\t\tconst contentKey = componentEl.dataset.componentContentkey || '';\r\n\t\tconst epc = componentEl.dataset.componentEpc|| '';\r\n\t\tconst isProspect = componentEl.dataset.componentIsProspect === \"true\" || false;\r\n\t\tconst themeKey = componentEl.dataset.componentTheme || '';\r\n\t\tconst pageTemplate = componentEl.dataset.componentTemplate || '';\r\n\t\tconst replaceNode = componentEl.dataset.replaceNode || false;\r\n\t\tconst pageName = componentEl.dataset.componentPageName || '';\r\n\t\tconst hidepromotionvisualization = componentEl.dataset.hidepromotionvisualization || '';\r\n\r\n\t\t// Set an index in order for the observer to target the correct element\r\n\t\tlet index = \"0\";\r\n\t\tif (components.find(el => el.name === name)) {\r\n\t\t\tindex = components.filter(el => el.name === name).length+\"\";\r\n\t\t}\r\n\t\tcomponentEl.dataset.index = index;\r\n\r\n\t\tif (trackHeight) {\r\n\t\t\tconst height = sessionStorage.getItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\");\r\n\t\t\tif (height) {\r\n\t\t\t\tcomponentEl.style.minHeight = height + 'px';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst addComponentContent = (): Promise => {\r\n\t\t\treturn getComponentContent(name, contentKey, epc, isProspect, themeKey, pageTemplate, pageName, index, hidepromotionvisualization).then(r => {\r\n\t\t\t\tif (!r || !isValidPartialViewResponse(r)) return false;\r\n\t\t\t\tconst parent = componentEl.parentElement;\r\n\t\t\t\tif (parent && replaceNode) {\r\n\t\t\t\t\tconst elementHtml = document.createRange().createContextualFragment(r);\r\n\t\t\t\t\tparent.replaceChild(elementHtml, componentEl);\r\n\t\t\t\t\tcomponentEl = parent;\r\n\r\n\t\t\t\t\tif (trackGaEvent) trackComponentEvent(trackGaEvent);\r\n\t\t\t\t\tif (trackHeight) {\r\n\t\t\t\t\t\tconst height = componentEl.offsetHeight;\r\n\t\t\t\t\t\tsessionStorage.setItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\", height + '');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomponentEl.insertAdjacentHTML(\"afterbegin\", r);\r\n\r\n\t\t\t\t\tif (trackGaEvent) trackComponentEvent(trackGaEvent);\r\n\t\t\t\t\tif (trackHeight) {\r\n\t\t\t\t\t\tconst height = componentEl.offsetHeight;\r\n\t\t\t\t\t\tsessionStorage.setItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\", height + '');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (hasClass(componentEl, 'skeleton-loading')) {\r\n\t\t\t\t\t\texpressRemoveClass(componentEl, 'skeleton-loading');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (componentEl.getAttribute(\"style\")) {\r\n\t\t\t\t\t\tcomponentEl.removeAttribute(\"style\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (pushDatalayerEvent) {\r\n\t\t\t\t\tpushComponentEvent(name);\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst loadJavascriptAndRunMethod = () => {\r\n\t\t\tif (callback) {\r\n\t\t\t\t/* For now we disable the load of js on demand\r\n\t\t\t\tif (!loadedScripts.includes(name)) {\r\n\t\t\t\t\tconst scriptEl = document.createElement(\"script\");\r\n\t\r\n\t\t\t\t\tscriptEl.addEventListener(\"load\", () => {\r\n\t\t\t\t\t\tloadedScripts.push(name);\r\n\t\t\t\t\t\tif (passElInCallback) {\r\n\t\t\t\t\t\t\twindow[callback].call(this, componentEl);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\twindow[callback].call(this);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\r\n\t\t\t\t\tscriptEl.src = getCdnPathForJsFile(scriptBasePath + name + \".min.js\");\r\n\t\t\t\t\tdocument.body.appendChild(scriptEl);\r\n\t\t\t\t} else { */\r\n\t\t\t\t\tif (passElInCallback) {\r\n\t\t\t\t\t\twindow[callback].call(this, componentEl);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twindow[callback].call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t/*} */\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst activate = () => {\r\n\t\t\tcomponentEl.dataset.init = 'true';\r\n\t\t\taddComponentContent().then(r => {\r\n\t\t\t\tif (r) {\r\n\t\t\t\t\tif (callback) loadJavascriptAndRunMethod();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomponentEl.dataset.error = 'true';\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst component = {\r\n\t\t\tname,\r\n\t\t\tactivate,\r\n\t\t\tindex\r\n\t\t} as IComponent;\r\n\t\tcomponents.push(component);\r\n\t};\r\n\r\n\tconst init = (): Promise => {\r\n\t\tcomponentEls.forEach(el => createComponent(el));\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tinit().then(_ => {\r\n\t\tcomponentEls.forEach(el => {\r\n\t\t\tif (isElementPartiallyVisibleInViewport(el, 10)) {\r\n\t\t\t\tinitComponent(el);\r\n\t\t\t} else {\r\n\t\t\t\tcomponentObserver.observe(el);\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n","import { onlyLetters, onlyNumber } from \"./string\";\r\n\r\nexport function isValidVatNumber(input: string, countryCode: string) {\r\n\tif (vatNumberHasCorrectCountryCode(input, countryCode)) {\r\n\t\tif (countryCode.toLowerCase() !== 'bel') return true;\r\n\t\tconst vatNumber = input.match(/\\d/g);\r\n\t\tlet vatNumberString = '';\r\n\t\tif (vatNumber) vatNumberString = vatNumber.join('');\r\n\t\tconst part1 = parseInt(vatNumberString.substring(0, vatNumberString.length - 2), 10);\r\n\t\tconst part2 = parseInt(vatNumberString.substring(vatNumberString.length - 2), 10);\r\n\t\tconst temp = part1 - parseInt((part1 / 97) + \"\", 10) * 97;\r\n\t\treturn 97 - temp === part2;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nexport function vatNumberHasCorrectCountryCode(vatNumber: string, countryCode: string) {\r\n\tif (countryCode.toLowerCase() !== 'bel'\r\n\t\t&& countryCode.toLowerCase() !== 'ndl'\r\n\t\t&& countryCode.toLowerCase() !== 'che'\r\n\t\t&& countryCode.toLowerCase() !== 'swe') return true;\r\n\tlet testVal = '';\r\n\tswitch (countryCode.toLowerCase()) {\r\n\t\tcase 'bel':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'be');\r\n\t\t\tbreak;\r\n\t\tcase 'ndl':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'nl');\r\n\t\t\tbreak;\r\n\t\tcase 'che':\r\n\t\t\ttestVal = vatNumber.substring(0, 3);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'che');\r\n\t\t\tbreak;\r\n\t\tcase 'swe':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'se');\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n","// returns format YYYY-MM-DD (for html5 date input fields)\r\nexport function getFormattedDate(date: Date): string {\r\n\tlet year = date.getFullYear().toString();\r\n\tyear = year.length > 3 ? year\r\n\t\t: year.length > 2 ? '0' + year\r\n\t\t\t: year.length > 1 ? '00' + year\r\n\t\t\t\t: year.length > 0 ? '000' + year\r\n\t\t\t\t\t: '0000';\r\n\tlet month = (1 + date.getMonth()).toString();\r\n\tmonth = month.length > 1 ? month : '0' + month;\r\n\tlet day = date.getDate().toString();\r\n\tday = day.length > 1 ? day : '0' + day;\r\n\treturn year + '-' + month + '-' + day;\r\n}\r\n\r\nexport function getDate(dateString: string): Date {\r\n\tconst regex = new RegExp(/(^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4}$)|(^\\d{4}[-](0?[1-9]|1[012])[/-](0?[1-9]|[12][0-9]|3[01])$)/);\r\n\tif (!regex.test(dateString))\r\n\t\tthrow Error(\"invalid date format: \" + dateString + \". Expected either YYYY-MM-DD or DD-MM-YYYY\");\r\n\r\n\tlet date: Date;\r\n\tconst firstPart = dateString.substr(0, dateString.indexOf(\"-\"));\r\n\tif (firstPart.length === 4)\r\n\t\tdate = new Date(dateString);\r\n\telse {\r\n\t\tconst dateParts = dateString.split(\"-\").map(s => +s);\r\n\t\tdate = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]);\r\n\t}\r\n\r\n\treturn date;\r\n}\r\n\r\nexport function convertDateToUtcDate(date: Date): Date {\r\n\treturn new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));\r\n}\r\n\r\nexport function deserialiseDate(dateString: string | null): Date {\r\n\tconst MIN_DATE = new Date(\"0001-01-01\");\r\n\tif (!dateString) return MIN_DATE;\r\n\r\n\tconst timestamp = /Date\\(([^)]+)\\)/.exec(dateString)?.[1];\r\n\tif (!timestamp) return MIN_DATE;\r\n\r\n\treturn new Date(parseInt(timestamp));\r\n}\r\n","import { expressQuerySelector, pageVisibilityChange } from \"../common/html\";\r\n\r\nexport function createAbandonedVisitTitleSwapper() {\r\n\tconst origTitle = document.title;\r\n\tconst titleEl = expressQuerySelector(document, 'title', true);\r\n\tif (titleEl.dataset.abandonedvisitenabled && titleEl.dataset.abandonedvisitenabled.toLowerCase() === \"false\") return;\r\n\tlet blinkInterval: number | null;\r\n\tconst blinkTitle = () => {\r\n\t\tconst currentTitle = document.title;\r\n\t\tif (currentTitle === titleEl.dataset.abandonedvisittitle)\r\n\t\t\tdocument.title = titleEl.dataset.abandonedvisittitlealternate;\r\n\t\telse\r\n\t\t\tdocument.title = titleEl.dataset.abandonedvisittitle;\r\n\t};\r\n\r\n\tconst onVisible = () => {\r\n\t\tclearInterval(blinkInterval);\r\n\t\tblinkInterval = null;\r\n\t\tdocument.title = origTitle;\r\n\t};\r\n\tconst onHidden = () => {\r\n\t\tif (!blinkInterval) {\r\n\t\t\tconst interval = parseInt(titleEl.dataset.abandonedvisitspeed, 10) || 2000;\r\n\t\t\t// @ts-ignore\r\n\t\t\tblinkInterval = setInterval(blinkTitle, interval);\r\n\t\t}\r\n\t};\r\n\r\n\tpageVisibilityChange(onVisible, onHidden);\r\n}\r\n","// This component will be used on the pages typescript files and will execute the scripts tht should fire on every page e.g. footer, header, etc\r\nimport { logErrorEvent } from \"../services/logger-service\";\r\nimport { getCookie, writeCookie } from \"../utils/cookie\";\r\nimport {expressQuerySelector, expressQuerySelectorAll} from \"../common/html\";\r\nimport { createCollapsable } from \"./collapsable\";\r\nimport { createNewsletterSubscribeAndUnsubscribe } from \"./newsletter\";\r\nimport { createMainNavigation } from \"./main-navigation\";\r\nimport { getInlineSvgsAsync } from \"../utils/icons\";\r\nimport { createCountrySelection } from \"./country-selection\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport {\r\n\tcanNotContainOnlyNumerics,\r\n\tisValidEmailAddress,\r\n\tisValidOrderNumber,\r\n\tisValidTextWithoutAngleBrackets,\r\n\tisValidWithoutNonAlphaNumericCharsAtEnd\r\n} from \"../utils/validation\";\r\nimport { checkPersonalNumber } from \"../utils/personalNumbers\";\r\nimport { createScrollToTop } from \"./scroll-to-top\";\r\nimport { initLeaveIntent } from \"./leave-intent\";\r\nimport { createPopupLauncher } from \"./popup-launcher\";\r\nimport { createComponentLoader } from \"./component-loader\";\r\nimport { isValidVatNumber } from \"../utils/vat\";\r\nimport { getDate } from \"../utils/date\";\r\nimport {createAbandonedVisitTitleSwapper} from \"./abandoned-visit-title-swapper\";\r\nimport {isMobileDevice, isTouchDevice} from \"../common/device\";\r\n\r\nexport interface IGeneralPageComponents {\r\n\treadonly disableLeaveIntent: () => void;\r\n\treadonly enableLeaveIntent: () => void;\r\n}\r\n\r\nexport function createGeneralPageEventsAndComponents() {\r\n\t// Load GTMIframe\r\n\tconst gtmIFrame = expressQuerySelector(document, '.technical-loadGTMiframe', false);\r\n\tif (gtmIFrame)\r\n\t\tgtmIFrame.src = gtmIFrame.dataset.src;\r\n\r\n\tconst leaveIntent = initLeaveIntent();\r\n\r\n\t// Load dataLayerIframe\r\n\tconst dataLayerIframe = document.querySelector('#dataLayerIframe');\r\n\tif (!dataLayerIframe.getAttribute('data-cookieconsent')) {\r\n\t\tdataLayerIframe.setAttribute('data', dataLayerIframe.getAttribute('data-src'));\r\n\t}\r\n\twindow.addEventListener(\"CookiebotOnAccept\", function () {\r\n\t\tif (window.Cookiebot.consent.marketing) {\r\n\t\t\tconst dataLayerIframe = document.querySelector('#dataLayerIframe');\r\n\t\t\tdataLayerIframe.setAttribute('data', dataLayerIframe.getAttribute('data-src'));\r\n\r\n\t\t\tif ((typeof window.enableLeaveIntentConfigValue === \"undefined\" || window.enableLeaveIntentConfigValue)) {\r\n\t\t\t\tleaveIntent.EnableLeaveIntent();\r\n\t\t\t\tleaveIntent.EnableLeaveIntentPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t// Set global props for the form validation (if we have forms)\r\n\tconst forms = expressQuerySelectorAll(document, 'form');\r\n\tif (Pristine && forms && forms.length > 0) {\r\n\t\tconst isOptional = (el: HTMLInputElement) => {\r\n\t\t\treturn !el.hasAttribute('required') && !el.value;\r\n\t\t};\r\n\r\n\t\tPristine.addMessages((window as any).context.language, (window as any).validationMessages);\r\n\t\tPristine.setLocale((window as any).context.language);\r\n\t\tPristine.addValidator(\"min\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (this as HTMLInputElement).type === \"date\" || parseFloat(val) >= parseFloat(limit);\r\n\t\t}, window.validationMessages['min'], 1, true);\r\n\t\tPristine.addValidator(\"ordernumber\", function (val) {\r\n\t\t\treturn isValidOrderNumber(val);\r\n\t\t}, window.validationMessages['ordernumber'], 1, true);\r\n\t\tPristine.addValidator(\"max\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (this as HTMLInputElement).type === \"date\" || parseFloat(val) <= parseFloat(limit);\r\n\t\t}, window.validationMessages['max'], 1, true);\r\n\t\tPristine.addValidator(\"mindate\", function (val, limitValue) {\r\n\t\t\tconst date = new Date(val);\r\n\t\t\tconst limit = getDate(limitValue.replaceAll('/', '-').replaceAll('.', '-'));\r\n\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (date && limit && date >= limit);\r\n\t\t}, window.validationMessages['min'], 1, true);\r\n\t\tPristine.addValidator(\"maxdate\", function (val, limitValue) {\r\n\t\t\tconst date = new Date(val);\r\n\t\t\tconst limit = getDate(limitValue.replaceAll('/', '-').replaceAll('.', '-'));\r\n\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (date && limit && date <= limit);\r\n\t\t}, window.validationMessages['max'], 1, true);\r\n\t\tPristine.addValidator(\"maxlength\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || val && val.length <= limit;\r\n\t\t}, window.validationMessages['maxlength'], 1, true);\r\n\t\tPristine.addValidator(\"minlength\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || val && val.length >= limit;\r\n\t\t}, window.validationMessages['minlength'], 1, true);\r\n\t\tPristine.addValidator(\"vat\", function (value, vat) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidVatNumber(value, vat);\r\n\t\t}, window.validationMessages['vat'], 1, true);\r\n\t\tPristine.addValidator(\"regex\", function (value, regexp) {\r\n\t\t\t// get the regex yourself form the form input => the regexp of pristine is limited to 1119 chars\r\n\t\t\tconst regex = (this as HTMLElement).getAttribute('regex') || (this as HTMLElement).getAttribute('data-pristine-regex');\r\n\t\t\treturn isOptional(this as HTMLInputElement) || new RegExp(regex).test(value);\r\n\t\t}, window.validationMessages['regex'], 1, true);\r\n\t\tPristine.addValidator(\"phonenumber\", function (value, regexp) {\r\n\t\t\t// get the regex yourself form the form input => the regexp of pristine is limited to 1119 chars\r\n\t\t\tconst regex = (this as HTMLElement).getAttribute('phonenumber') || (this as HTMLElement).getAttribute('data-pristine-phonenumber');\r\n\t\t\treturn isOptional(this as HTMLInputElement) || new RegExp(regex).test(value);\r\n\t\t}, window.validationMessages['phonenumber'], 1, true);\r\n\t\tPristine.addValidator(\"urlsafe\", function (value) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidTextWithoutAngleBrackets(value);\r\n\t\t}, window.validationMessages['urlsafe'], 1, true);\r\n\t\tPristine.addValidator(\"blacklist\", function (value, blacklist) {\r\n\t\t\tif (!blacklist)\r\n\t\t\t\treturn true;\r\n\t\t\tconst list = blacklist.split(',');\r\n\t\t\tfor (let i = 0; i < list.length; i++)\r\n\t\t\t\tif (value.toLowerCase() === list[i])\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\treturn true;\r\n\t\t}, window.validationMessages['blacklist'], 1, true);\r\n\t\tPristine.addValidator(\"emailrfc822\", function (value) {\r\n\t\t\treturn isValidEmailAddress(value);\r\n\t\t}, null, 98, true); // validation will be fired after required validation a stop if it fails. If we don't do this the normal email validation is also fired and we get two equal error messages\r\n\t\tPristine.addValidator(\"personalnumber\", function (value) {\r\n\t\t\treturn checkPersonalNumber(value, this.dataset.regioncode || \"\");\r\n\t\t}, window.validationMessages['personalnumber'], 1, true);\r\n\t\tPristine.addValidator(\"usehousenumber\", function (value, useHouseNumber) {\r\n\t\t\tif (!useHouseNumber) return true;\r\n\t\t\tconst prefix = this.dataset.prefix || \"\";\r\n\t\t\tconst houseNumberEl = expressQuerySelector(this.form, \"input[name='\" + prefix + \"HouseNumber']\", false);\r\n\t\t\tif (!houseNumberEl || !houseNumberEl.value) return true;\r\n\t\t\tconst atStart = value.trim().substring(0, houseNumberEl.value.trim().length + 1) === houseNumberEl.value.trim() + ' ';\r\n\t\t\tconst atEnd = value.trim().substring(value.trim().length - (houseNumberEl.value.trim().length + 1), value.trim().length) === ' ' + houseNumberEl.value.trim();\r\n\t\t\treturn !atStart && !atEnd;\r\n\t\t}, window.validationMessages['usehousenumber'], 1, true);\r\n\t\tPristine.addValidator(\"passwordcheck\", function (value) {\r\n\t\t\tconst passwordEl = expressQuerySelector(this.form, \"input[name='password']\", false);\r\n\t\t\tif (!passwordEl) return true;\r\n\t\t\treturn value === passwordEl.value;\r\n\t\t}, window.validationMessages['passwordcheck'], 1, true);\r\n\t\tPristine.addValidator(\"strongpassword\",\r\n\t\t\t(value) => {\r\n\t\t\t\tconst passwordEl = expressQuerySelector(document, \"input[data-pristine-strongpassword='true']\", false);\r\n\t\t\t\tif (passwordEl.dataset['lastvalidatedpassword'] == value)\r\n\t\t\t\t\treturn passwordEl.dataset['lastvalidatedresult'] === \"true\";\r\n\t\t\t\telse\r\n\t\t\t\t\treturn true;\r\n\t\t\t}, window.validationMessages['strongpassword'], 0, true),\r\n\t\tPristine.addValidator(\"termsrequired\", function (value) {\r\n\t\t\tconst element = expressQuerySelector(this.form, '[data-pristine-termsrequired]', false);\r\n\t\t\treturn (element && element instanceof HTMLInputElement && element.checked);\r\n\t\t}, window.validationMessages['termsrequired'], 1, true);\r\n\t\tPristine.addValidator(\"invalidchars\", function (value) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidWithoutNonAlphaNumericCharsAtEnd(value, this as HTMLElement);\r\n\t\t}, window.validationMessages['invalidchars'], 1, true);\r\n\t\tPristine.addValidator(\"notonlynumbers\", function (value) {\r\n\t\t\treturn canNotContainOnlyNumerics(value);\r\n\t\t}, window.validationMessages['notonlynumbers'], 1, true);\r\n\t}\r\n\r\n\t// Add click event to buttons with a data-url attribute\r\n\tconst buttons = document.querySelectorAll('button[data-url]:not(.technical-disable-dataurl-onclick)');\r\n\tbuttons.forEach(el => {\r\n\t\tel.addEventListener('click', (ev) => {\r\n\t\t\tev.preventDefault();\r\n\t\t\twindow.location.href = el.getAttribute('data-url');\r\n\t\t});\r\n\t});\r\n\r\n\t// Set the isMobileDevice Cookie\r\n\tcheckMobileAndSetCookie();\r\n\r\n\t// Initialize the header\r\n\tconst openLeadTimesPopupAsync = () => {\r\n\t\tconst initCollapsingPanels = (popup: HTMLElement) => {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(popup, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => {\r\n\t\t\t\tcreateCollapsable(el, {\r\n\t\t\t\t\tscrollIntoViewAfterOpen: false,\r\n\t\t\t\t\ttitleElSelector: '.m-collapsable__title'\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\t\treturn createPopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"LeadTimesDialog\",\r\n\t\t\t\tdialogId: \"lead-times-dialog\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tonBeforeOpen: (popup) => initCollapsingPanels(popup)\r\n\t\t\t}\r\n\t\t)\r\n\t\t\t.then(popup => {\r\n\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\treturn popup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst header = expressQuerySelector(document, \".technical-header\", false);\r\n\theader && createMainNavigation(\r\n\t\theader,\r\n\t\t{\r\n\t\t\tgetInlineSvgsAsync: getInlineSvgsAsync,\r\n\t\t\topenLeadTimesPopupAsync: openLeadTimesPopupAsync\r\n\t\t}\r\n\t);\r\n\r\n\twindow.addEventListener('error', logErrorEvent);\r\n\r\n\t// Init the country selection popup\r\n\tconst bodyEl = expressQuerySelector(document, \"body\", true);\r\n\tconst showCountrySelectionPopup = bodyEl.dataset.showcountryselection === \"true\" || false;\r\n\tconst closeCountrySelectionPopup = () => {\r\n\t\twriteCookie(\"ShowCountrySelectionPopupAgainFrom\", new Date().toISOString().slice(0, 10), 365);\r\n\t};\r\n\r\n\tconst openCountrySelectionPopup = () => {\r\n\t\treturn createPopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"CountrySelectionDialog\",\r\n\t\t\t\tdialogId: \"country-selection\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tfromCache: false,\r\n\t\t\t\tonClose: closeCountrySelectionPopup,\r\n\t\t\t\tdata: { path: window.location.pathname }\r\n\t\t\t}\r\n\t\t)\r\n\t\t\t.then(popup => {\r\n\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\treturn popup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\r\n\tif (showCountrySelectionPopup) {\r\n\t\tcreateCountrySelection({\r\n\t\t\tshowCountrySelectionPopup: () => openCountrySelectionPopup(),\r\n\t\t\tclose: () => closeCountrySelectionPopup(),\r\n\t\t});\r\n\t}\r\n\r\n\t// Create scroll to top\r\n\tcreateScrollToTop();\r\n\r\n\t// create popup launchers (links from cms with a content dialog parser)\r\n\tconst popupLauncherEls = expressQuerySelectorAll(document, '.technical-popup-launcher');\r\n\tpopupLauncherEls.forEach(el => createPopupLauncher(el));\r\n\r\n\t// init the component loader if needed\r\n\tconst htmlElement = expressQuerySelector(document, 'html', true);\r\n\tconst isBot = htmlElement.dataset.isbot.toLowerCase() === 'true' || false;\r\n\tif (!isBot) createComponentLoader();\r\n\r\n\tcreateNewsletterSubscribeAndUnsubscribe();\r\n\r\n\t// Create global var for methods of dynamic components\r\n\twindow['initFooterComponent'] = function initFooterComponent() {\r\n\t\tconst footerCollapsibles = expressQuerySelectorAll(document, '.technical-footer-collapsable');\r\n\t\tfooterCollapsibles.forEach(el => createCollapsable(el, {\r\n\t\t\ttitleElSelector: '.technical-footer-collapsable-title',\r\n\t\t\tscrollIntoViewAfterOpen: false\r\n\t\t}));\r\n\r\n\t\tconst footerEl = expressQuerySelector(document, '.technical-footer', false);\r\n\t\tif (footerEl) createNewsletterSubscribeAndUnsubscribe(footerEl);\r\n\t};\r\n\r\n\t!isMobileDevice() && createAbandonedVisitTitleSwapper();\r\n\r\n\treturn {\r\n\t\tdisableLeaveIntent: leaveIntent.DisableLeaveIntent,\r\n\t\tenableLeaveIntent: leaveIntent.EnableLeaveIntent,\r\n\t} as IGeneralPageComponents;\r\n}\r\n\r\nconst checkMobileAndSetCookie = () => {\r\n\tif (isTouchDevice() && (window.innerWidth < 500 || window.innerHeight < 500)) {\r\n\t\tif (getCookie(\"IsMobileDevice\") !== \"true\")\r\n\t\t\twriteCookie(\"IsMobileDevice\", \"true\", 365);\r\n\t} else {\r\n\t\tif (getCookie(\"IsMobileDevice\") !== \"false\")\r\n\t\t\twriteCookie(\"IsMobileDevice\", \"false\", 365);\r\n\t}\r\n};\r\n","import { trackMgmEvent } from \"../common/events\";\r\nimport { expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { createCollapsable } from \"../components/collapsable\";\r\nimport { CreateAndStartLoginWatcher } from \"../components/login-check\";\r\nimport { CreateLoginRegisterComponents } from \"../components/login-register\";\r\nimport { createGeneralPageEventsAndComponents } from \"../components/page-general\";\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n\tcreateGeneralPageEventsAndComponents();\r\n\tCreateLoginRegisterComponents();\r\n\tCreateAndStartLoginWatcher();\r\n\r\n\tconst linkEl = expressQuerySelector(document, '.technical-share-link', false);\r\n\tconst shareLinkEL = expressQuerySelector(document, '.technical-copy-link', false);\r\n\tconst shareLinkButton = expressQuerySelector(document, '.technical-share-link-button', false);\r\n\tconst discoverAdvantages = expressQuerySelector(document, '.technical-discover-advantages', true);\r\n\tconst collapsables = expressQuerySelectorAll(document, '.technical-faq-collapsable');\r\n\tconst infoPageHeaderSection = expressQuerySelector(document, '.technical-info-page-header-section', false);\r\n\r\n\tconst shareData = {\r\n\t\ttitle: shareLinkButton ? shareLinkButton.dataset.title : '',\r\n\t\ttext: shareLinkButton ? shareLinkButton.dataset.text : ''\r\n\t};\r\n\r\n\t// navigator.canShare method not supported on all browsers\r\n\t// https://developer.mozilla.org/en-US/docs/Web/API/Navigator/canShare\r\n\tif (shareLinkButton) shareLinkButton.classList.toggle('o-info-page-header__button-share--inactive', navigator['canShare'] ? !navigator['canShare'](shareData) : true);\r\n\r\n\tconst sharePersonalLink = (nativeSharing: boolean) => {\r\n\t\tconst linkElText = linkEl.innerHTML;\r\n\t\tif (nativeSharing) {\r\n\t\t\ttrackMgmEvent('MGMLinkShared');\r\n\t\t\tnavigator.share(shareData);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst linkToolTipEl = expressQuerySelector(document, '.technical-link-copied', true);\r\n\t\tnavigator.clipboard.writeText(linkElText).then(\r\n\t\t\t() => {\r\n\t\t\t\ttrackMgmEvent('MGMLinkCopied');\r\n\r\n\t\t\t\t// show tooltip\r\n\t\t\t\tlinkToolTipEl.classList.add(\"o-info-page-header__share-link-tooltip--active\");\r\n\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\tlinkToolTipEl.classList.remove(\"o-info-page-header__share-link-tooltip--active\");\r\n\t\t\t\t}, 5000);\r\n\r\n\t\t\t\t// select text\r\n\t\t\t\tif (window.getSelection) {\r\n\t\t\t\t\tconst selection = window.getSelection();\r\n\t\t\t\t\tconst range = document.createRange();\r\n\t\t\t\t\trange.selectNodeContents(linkEl);\r\n\t\t\t\t\tselection.removeAllRanges();\r\n\t\t\t\t\tselection.addRange(range);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst documentBody = document.body;\r\n\t\t\t\tif (!documentBody.createTextRange) {\r\n\t\t\t\t\tconst range = documentBody.createTextRange();\r\n\t\t\t\t\trange.moveToElementText(linkEl);\r\n\t\t\t\t\trange.select();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t() => {\r\n\t\t\t\tthrow new Error('Copy to clipboard failed');\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tif (shareLinkButton) shareLinkButton.addEventListener('click', _ => sharePersonalLink(true));\r\n\tif (shareLinkEL) shareLinkEL.addEventListener('click', _ => sharePersonalLink(false));\r\n\tdiscoverAdvantages.addEventListener('click', _ => {\r\n\t\tconst advantages = expressQuerySelector(document, '.technical-advantages', false);\r\n\t\tlet elementToScrollTo = advantages ? advantages : undefined;\r\n\t\tif (!elementToScrollTo) {\r\n\t\t\tconst sections = expressQuerySelectorAll(document, '.m-section');\r\n\t\t\tconst filterdSections = sections.splice(sections.indexOf(infoPageHeaderSection) + 1);\r\n\t\t\telementToScrollTo = filterdSections[0];\r\n\t\t}\r\n\r\n\t\tif (elementToScrollTo) elementToScrollTo.scrollIntoView({ behavior: 'smooth' });\r\n\t});\r\n\tcollapsables.forEach(x => createCollapsable(x, { titleElSelector: '.m-collapsable__title', scrollIntoViewAfterOpen: false }));\r\n});\r\n"],"names":["getCookie","cName","allCookies","document","cookie","length","cStart","indexOf","cEnd","unescape","substring","writeCookie","cValue","extraDays","d","Date","setTime","getTime","expires","toUTCString","encodeURIComponent","writeCookieThatExpiresAtTheEndOfTheDay","getFullYear","getMonth","getDate","trackEvent","category","action","customParameters","window","dataLayer","push","Object","assign","event","trackOrderStatusEvent","partialEventParams","nrOrdersInAccount","nrItemsInOrder","accountId","trackComponentEvent","trackMgmEvent","trackAccountPrefEvent","eventParams","expressQuerySelector","el","selectors","isRequired","resultEl","querySelector","Error","hasClass","element","cssClass","regex","RegExp","match","className","expressEventListener","type","listener","useCapture","disposable","dispose","handler","removeEventListener","ev","addEventListener","expressQuerySelectorAll","slice","call","querySelectorAll","expressAddClass","expressToggleClass","expressRemoveClass","on","replace","source","show","offsetParent","style","display","getComputedStyle","hide","getParentWithClassName","parentElement","classList","contains","getParents","elem","selector","Element","prototype","matches","webkitMatchesSelector","s","this","ownerDocument","i","item","parentNode","parents","htmlToElement","html","template","createElement","trim","innerHTML","content","firstChild","isMobileOnPageWithHeader","isElementVisible","offsetWidth","offsetHeight","getBoundingClientRect","height","width","isElementVisibleInViewPort","rect","top","left","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isElementPartiallyVisibleInViewport","percentVisible","windowHeight","Math","floor","remove","removeChild","pageVisibilityChange","onVisible","onHidden","hidden","visibilityState","visibilityChange","mozHidden","msHidden","webkitHidden","setTimeout","createClickableElement","onClick","options","clickEvent","enable","disable","onClicked","e","preventDefault","stopPropagation","then","addClickEvent","createButton","buttonEl","removeAttribute","setAttribute","createCollapsable","container","deps","opts","singleOpen","swapTitleDataAttribute","onInit","onBeforeOpen","onBeforeClose","titleElSelector","scrollIntoViewAfterOpen","contentSelector","openClass","OPEN_CLASS","titleEl","contentEl","origTitle","collapseTitle","innerText","getAttribute","closeWithBefore","__awaiter","close","Promise","resolve","openWithBefore","scrollIntoView","open","shouldScrollIntoView","forEach","add","behavior","block","button","escapeForJavascript","str","onlyLetters","input","Boolean","onlyNumber","toUrlHash","toLowerCase","stringToBase64","inputString","bytes","TextEncoder","encode","binString","Array","from","byte","String","fromCodePoint","join","btoa","redirectTo500","location","pathname","redirectToLogin","logError","errorLog","postRequest","headers","Headers","http","path","config","keepCase","finalPath","request","Request","fetch","res","ok","json","catch","HandleError","status","statusText","_","reject","error","httpText","response","getHttpResponse","text","context","apiFailMsg","startsWith","ecomApiUrl","line","message","process","url","getRequest","init","method","body","traditionalBody","URLSearchParams","JSON","stringify","getHtmlRequest","postHtmlRequest","isValidPartialViewResponse","compositeDisposable","disposables","composite","addDisposable","addMany","addDisposables","fetchingPopupContent","createPopup","popupEl","isOpen","eventDisposables","undefined","currentY","scrollY","renderedDialogEl","closeOnClickOutsidePopup","onClose","onOpen","dialogId","view","forceRefresh","fromCache","data","closeOnEnter","filter","p","id","marginTop","scroll","onMouseDownEvent","target","onKeyDownEvent","which","keyCode","onCloseEvent","addOnClose","closeButton","popup","tempEl","replaceWith","temp","appendChild","finally","create","openAsync","round","replaceContent","ShowContentDialog","label","title","openFunction","okButtonKey","addTitleCssClass","extraPopupCss","BodyLabel","TitleLabel","ExtraPopupCss","TitleCssClass","OkButtonLabel","subscribeAsync","email","appId","posId","lang","subscription","applicationId","pointOfSaleId","language","toggleSubscribeAsync","personId","newsletter","personalMessage","mailFrequency","postalMail","emarsysData","toggleSubscription","Gender","UpdateAccountResult","ChangePasswordStatus","OkResult","checkAccountValidityAsync","oldAccountId","newAccountId","CreateAndStartLoginWatcher","pageRequiresAuth","loginWatcher","createLoginWatcher","start","startingAccId","accountType","dialog","timer","openDialog","run","currentAccountId","alert","clearTimeout","isValid","key","okButton","closeEventPopup","reload","force","setInterval","cancel","stop","autocomplete","settings","doc","containerStyle","userAgent","navigator","mobileFirefox","debounceWaitMs","preventSubmit","keyUpEventName","items","inputValue","minLen","showOnFocus","selected","debounceTimer","keypressCounter","minLength","clearDebounceTimer","containerDisplayed","clear","detach","parent","update","render","currentValue","itemElement","textContent","renderGroup","groupName","groupDiv","fragment","createDocumentFragment","prevGroup","group","div","onSelect","emptyMsg","empty","attach","updatePosition","inputRect","maxHeight","calc","docEl","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","customize","updateScroll","elements","getElementsByClassName","previous","previousElementSibling","offsetTop","selectBottom","containerBottom","updateIfDisplayed","resizeEventHandler","scrollEventHandler","keyupEventHandler","ignore","startFetch","keydownEventHandler","containerIsDisplayed","selectPrev","disableAutoSelect","selectNext","focusEventHandler","trigger","savedKeypressCounter","val","value","blurEventHandler","activeElement","position","evt","focus","destroy","createBaseFormInput","containerEl","altSelector","inputEl","errorParagraphEl","toggleEnable","attr","toggleAttribute","clearValue","setError","doClear","createSelectBox","onSelected","baseComponent","selectEl","disposableEvent","setValue","getValue","createFormInput","isCheckBox","checked","toString","createPasswordFormInput","formInput","iconEl","onPasswordShowHideIconClick","addEvent","validatePassword","dataset","Number","parseInt","minlength","password","cursor","createTextInputWithAutoComplete","onCloseDisposable","autoCompleteSearch","renderTextContent","containerInsertPosition","containerClass","autocompleteResult","itemEl","insertAdjacentElement","PageLogStyle","initForm","formEl","alternativeButton","onSubmitForm","buttonSelector","submitOnEnter","validatorOptions","submitButtonEl","validator","createFormValidator","onKeyUpEvent","formElements","inputs","attributes","getNamedItem","maxLength","getInputs","keys","map","clearAll","clearValues","resetValidation","reset","validate","validations","name","all","onSubmit","formData","submitButton","getInputByName","disableForm","disableInput","setErrors","errors","clearInputs","names","clearInput","setValues","values","v","hideInput","form","classTo","errorClass","successClass","errorTextClass","errorTextParent","errorTextTag","onValidate","Pristine","getFullQuerystring","pos","href","getParameters","pairs","split","params","pair","getParameter","required","queryStringParam","updateParameter","newAdditionalURL","tempArray","hash","additionalURL","baseURL","result","addParameter","createPageLog","descriptionEl","getClassesByPrefix","prefix","c","scrollTo","getOffsetTop","offsetElemet","updateMessageAndStyle","logStyle","description","overrideScrollTo","disableScroll","icon","Success","WarningBlue","WarningOrange","getLogIconAndType","hideLog","ExternalLoginProvider","signInButtons","getMediaParterForLabel","mediaStorePartnerType","CreateLoginRegisterComponents","addSuccessQueryToRedirectUrl","authenticationPopupEnabled","loginComponents","createAuthenticationPopup","mode","Email","Mode","CreateLoginRegister","onSuccess","pageLogEl","closeLoginPopup","x","registerLink","loginRegisterEls","ExpressLoginComponent","toggleElementClicked","loginMode","toggleShow","externalLoginSubmitButtons","toggleEl","forgetPassword","createIsSoftDeletedPopup","undeleteAsync","loginResult","handleExternalLoginResult","LoginUserAtSmartPhotoModelData","MediaStorePartnerType","Async","Uid","AccessToken","handleLoginResult","Question","Title","OkMnemonic","CancelMnemonic","cancelButton","createPopupWithBodyLabel","bodyLabel","extraPopupSetup","replacements","bodyArr","BodyReplacements","loginUserAtSmartPhoto","uid","accessToken","expire","newEmail","skipLogin","onOrderFlow","async","scope","userId","mediastorePartnerType","isNotAuthenticated","errorMsg","blockingErrorMsg","formComponent","isSoftDeleted","Password","RememberMe","RedirectUrl","decodeURIComponent","blockingErrorLabel","popupEL","link","openForgotPasswordPopup","redirectUrl","iframe","contentWindow","pushDataLayer","eXpress","loggedOn","cartId","dispatchEvent","CustomEvent","tempAccountId","showConfirmationBeforeRedirect","loginNotCorrect","loginUserAtSmartPhotoResponse","asyncSuccess","success","AccountId","CartId","origin","handleLoginFailed","mediaStorePartnerLabel","accountInOtherDomainCalled","PopUpCase","UserId","Expire","NewEmail","SkipLogin","OnOrderFlow","LoginNotCorrect","AlreadyTriedEmail","MediaStorePartnerLabel","sendPassWordLinkEl","passwordSendEl","confirmAskPassword","singleSignOnResponse","sendPassword","alreadyTriedEmail","confirmShowNewsletter","isChecked","PersonId","ExtraHeaderCss","continueButton","singleSignOnConfirmationEmail","returnUrl","__1","ConfirmedPassword","PersonalMessage","NewsLetter","Conditions","switchToLogin","accountInOtherDomain","accountBlocked","err","InformationText","CurrentUrl","provider","Google","createGoogleLogin","loginCallback","Facebook","createFacebookLoginButton","externalLogin","successMsg","successmsg","toggle","includes","inline","history","replaceState","enableButton","b","Button","ButtonEl","enableAllButtons","Provider","gapiLoaded","googleLoginButtonEl","errorsToIgnore","googleButton","initClient","gapi","auth2","client_id","fetch_basic_profile","auth","attachClickHandler","prompt","user","authResponse","getAuthResponse","getBasicProfile","getId","access_token","expires_in","reason","some","details","scripts","getElementsByTagName","src","scriptEl","defer","onload","load","firstScriptEl","insertBefore","facebookLoginButtonEl","isFacebookInitialized","facebookLoggedIn","scopeExtra","facebookScope","scopePhotos","facebookButton","perms","loginToFacebook","initFacebook","FB","version","fBLoginWithPermissions","login","loginresponse","userID","api","checkFacebookPermissions","expireTime","expiresIn","extraPermissions","getLoginStatus","user_photos","permission","photos","appid","logErrorEvent","errorEv","filename","lineno","colno","msg","col","lastLoggedError","totalLoggedErrors","urlString","errorString","isArray","errorLogStrings","stack","exc","isValidTextWithoutAngleBrackets","test","isValidEmailAddress","punycode","toUnicode","isValidWithoutNonAlphaNumericCharsAtEnd","reg","elName","alsoAlsoAllowBracket","last","charAt","canNotContainOnlyNumerics","isValidOrderNumber","orderNr","isTempAccountEmail","createNewsletterSubscribeAndUnsubscribe","customDocument","subscriptionForms","unSubscriptionForms","ioSubscribe","IntersectionObserverEntry","IntersectionObserver","entries","observer","entry","isIntersecting","createNewsletterSubscribe","unobserve","rootMargin","observe","formEL","ioUnSubscribe","createNewsletterUnsubscribe","emailEl","emptyGuid","posid","sourceid","page","pageName","successMessageEl","errorMessageEl","checkBoxEl","preFillLastUsedEmail","showSuccessMessage","personIdFromQuery","onError","isTouchDevice","PointerEvent","maxTouchPoints","matchMedia","TouchEvent","isMobileDevice","initNavigationDesktop","firstLevelMenuEls","loadDesktopMenuItemAsync","loadedMenuItemsKeys","firstLevelActiveClass","closeMenu","currentTarget","closeFirstLevelMenuItemAndResetChildMenus","menuItem","closeAllSecondLevelMenuItemsAndResetChildMenus","secondLevelMenuEl","closeAllThirdLevelMenuItemsAndResetChildMenus","getOrLoadFirstLevelMenuItem","buttonEL","closeMenuOnMouseOut","itemKey","insertAdjacentHTML","buttonEls","every","nodeName","offsetLeft","initSecondLevelListeners","getOrLoadSecondLevelMenuItem","closest","firstLevelIndex","secondLevelIndex","secondLevelMenuEls","initLanguageSelector","onDocumentClickDisposable","detachDocumentClick","onDocumentClick","onButtonClick","attachOnDocumentClick","deInit","initTooltip","iconCloseSelector","tooltipSelector","toggleIconSelector","closeIconEl","onCloseIconClick","closeToolTip","capture","initSearchBar","desktopSearchBarContainer","mobileSearchBarContainer","initAutoComplete","onkeyup","fixInputValue","submit","onsubmit","validateInput","searchTerm","currentSearchterm","re","desktopSearchBar","mobileSearchBar","autoComplete","overlayComponent","dipose","initMobileSearchBar","createNotificationTile","markNotificationAsRead","linkEl","onTileClick","cb","disabled","orderNumber","ordernumber","pvc","sku","orderStatus","orderstatus","createNotificationCenter","onMarkedAllAsReadDisposable","domParser","DOMParser","loaded","getNotifications","isMobile","markNotificationsAsRead","notificationBellCountEl","menuEl","overLayEl","closeButtonEl","markAllAsReadButton","setOverLayClass","mobile","getTiles","onMarkedAsReadSingle","ids","loadNotifications","onMarkedAllAsRead","detachMarkAllAsReadClick","reduce","a","concat","notificationCenterEl","parseFromString","tiles","attachMarkAllAsReadClick","amount","setNotificationCount","openMenu","calculateAndSetHeightOfMobileNavigationLevel","mobileNavigationLevel","browserUiBars","menuItemsLvlPositionTop","abs","initMyAccount","mainNavigationEl","getIconsAsync","loadAccountMenu","icons","urls","index","self","svg","initCountDown","countDownToDate","showDays","onCountDownFinish","daysLabel","dayLabel","pad","num","size","countDownTime","dateString","timeString","day","month","year","hour","minutes","seconds","toDate","interval","now","timeLeft","days","hours","clearInterval","initNavigationMobile","firstLevelMenuSelected","onCloseClickDisposable","onLanguageSelectorClickDisposable","userContainerEl","closeContainerEl","languageSelectorEl","thirdLevelMenuEls","mobileMenuEl","menuButtonEl","menuContainerEl","currentLanguage","getMobileMenu","contentPreLoaded","resetMenu","onCloseMenuClick","initMenuItemsAndBehavior","firstLevelListEl","activeLanguageEl","languageEl","iconButtonEls","uniqueUrls","loadIcons","attachCloseMenuClick","attachLanguageSelectorClick","attachFirstMenuItemClick","elementHeight","firstLevelEl","secondLevelEl","thirdLevelEls","thirdLevelEl","hideOtherMenuItems","hasChildNodes","children","onFirstMenuItemClick","handleHeaderLink","_a","prevClickedEl","offset","firstLevelMenuButton","secondLevelNavigationEl","setScrollTop","loadSecondLevelEl","frag","createRange","createContextualFragment","replaceChild","secondLevelItems","attachSecondMenuItemClick","menuItemsSecondLvl","scrollPos","onSecondMenuItemClick","thirdLevelDivEl","secondeLevelNavigationEl","thirdLevelContainerEl","loadThridLevelEl","menuItemsThirdLvl","thirdLevelIndex","_b","thirdLevelItems","attachThirdMenuItemClick","onThirdMenuItemClick","evTarget","onLanguageSelectorClick","languageSelectorContainerEl","languageCurrentEl","languageChoicesContainerEl","languageSelectorDescrEl","languageSelectorDescrOptionsEl","menuButtonComponent","createMainNavigation","initMobileMenu","pageid","indexLevel2","indexLevel3","pragma","getInlineSvgsAsync","toggleScroll","scrollingElement","getScrollingElement","eventAnimation","eventContainer","toggleEventVisibility","stickyNav","stickynav","seen","imageContainer","animation","lottie","loadAnimation","renderer","loop","autoplay","cdn","catimage","initialSegment","playSegments","animate","transition","opacity","eventContainerInitialHeight","visiblePx","play","initEventAnimation","firstLevel","secondLevel","desktopLeftMenuEl","langButtonEl","langContainerEl","searchBarEl","notificationIds","append","leadTimesBarEl","openLeadTimesPopupAsync","click","topBarContainerEl","countdown","dayslabel","daylabel","barEls","myTopBar","otherTopBar","outerHTML","initComponents","getInlineSvgAsync","svgString","XMLSerializer","serializeToString","u","createCountrySelection","onClickDisposable","navigateTo","navigateToLink","attachOnClick","showCountrySelectionPopup","countrySelectionPopup","countryselectionlink","checkPersonalNumber","pin","regionCode","checksumSe","checksumNo","checksumDk","checksumFi","checkSumString","result1","checksum","result2","checkSumString1","checkSumString2","checksum1","checksum2","multiplier","pins","lastDigit","createScrollToTop","scrollToTopEl","wobblerEl","stickyCtaButtonEl","footerEl","fade","displayNone","isIOS","isAppleDevice","isTouchScreen","audio","Audio","volume","iosQuirkPresent","marginBottom","initLeaveIntent","toggleLeaveIntent","enableLeaveIntent","isLeaveIntentEnabled","search","triggerLeaveIntentPopup","forceEnable","ouibounce","sensitivity","aggressive","sitewide","delay","callback","cookieExpire","canFire","EnableLeaveIntentPopup","EnableLeaveIntent","DisableLeaveIntent","CreateTabs","tabsCollectionContainer","tabHideClass","hideclass","addQueryStringParameter","searchParams","set","newRelativePathQuery","fixDataAttributes","tabEls","tabContentEls","hasAttribute","addEventListenerToTabs","updateTab","hideClass","pushNewHash","tabToSelect","tabToSelectContent","z","onTabSwitch","activeTab","get","createPopupLauncher","dialogid","contentKey","initContentParts","tabsEl","basePath","getComponentContent","component","epc","isProspect","themeKey","pageTemplate","hidepromotionvisualization","pushComponentEvent","componentName","createComponentLoader","componentEls","components","initComponent","initialized","currentComponent","find","activate","componentObserver","intersectionRatio","threshold","createComponent","componentEl","componentCallback","passElInCallback","componentPassElementInCallback","trackGaEvent","componentGaEvent","trackHeight","componentTrackHeight","pushDatalayerEvent","componentPushDatalayerEvent","componentContentkey","componentEpc","componentIsProspect","componentTheme","componentTemplate","replaceNode","componentPageName","sessionStorage","getItem","minHeight","loadJavascriptAndRunMethod","r","elementHtml","setItem","isValidVatNumber","countryCode","vatNumberHasCorrectCountryCode","vatNumber","vatNumberString","part1","part2","testVal","date","substr","dateParts","createAbandonedVisitTitleSwapper","abandonedvisitenabled","blinkInterval","blinkTitle","abandonedvisittitle","abandonedvisittitlealternate","abandonedvisitspeed","createGeneralPageEventsAndComponents","gtmIFrame","leaveIntent","dataLayerIframe","Cookiebot","consent","marketing","enableLeaveIntentConfigValue","forms","isOptional","addMessages","validationMessages","setLocale","addValidator","limit","parseFloat","limitValue","replaceAll","vat","regexp","blacklist","list","regioncode","useHouseNumber","houseNumberEl","atStart","atEnd","passwordEl","HTMLInputElement","checkMobileAndSetCookie","header","initCollapsingPanels","showcountryselection","closeCountrySelectionPopup","toISOString","isbot","initFooterComponent","disableLeaveIntent","shareLinkEL","shareLinkButton","discoverAdvantages","collapsables","infoPageHeaderSection","shareData","sharePersonalLink","nativeSharing","linkElText","share","linkToolTipEl","clipboard","writeText","getSelection","selection","range","selectNodeContents","removeAllRanges","addRange","documentBody","createTextRange","moveToElementText","select","advantages","elementToScrollTo","sections","splice"],"mappings":"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"}