{"version":3,"file":"contactpage.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/utils/disposable.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/guid.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/file-upload.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/button.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/form.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/truncate.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/validation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/contact-form.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/page-log.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/login-check.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/components/collapsable.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/components/parcel.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/pages/contactpage.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","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","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 class Guid {\r\n\t// normal guid cannot be used in query selector => prefix with s\r\n\tstatic newSliderGuid() {\r\n\t\treturn 'sxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\t\tconst r = Math.random() * 16 | 0,\r\n\t\t\t\tv = c === 'x' ? r : (r & 0x3 | 0x8);\r\n\t\t\treturn v.toString(16);\r\n\t\t});\r\n\t}\r\n\r\n\tstatic newGuid() {\r\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\t\tconst r = Math.random() * 16 | 0,\r\n\t\t\t\tv = c === 'x' ? r : (r & 0x3 | 0x8);\r\n\t\t\treturn v.toString(16);\r\n\t\t});\r\n\t}\r\n}\r\n","import {trackContactPageEvent } from \"../common/events\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { compositeDisposable } from \"../utils/disposable\";\r\nimport { postRequest } from \"../utils/fetch\";\r\nimport { Guid } from \"../utils/guid\";\r\n\r\nexport interface IGetSignedUrl {\r\n\tsessionId: string;\r\n\turl: string;\r\n}\r\n\r\nexport interface IFileUploadDependencies {\r\n\tgetPreventedFileTypes: () => Promise;\r\n\tgetUploadUrl: (sessionId: string, filename: string) => Promise;\r\n\tonUploadComplete: () => void;\r\n\tonUploadFailed: () => void;\r\n\tonUploadLoad: () => void;\r\n\tonUpload: () => void;\r\n\tonFilesSelected: () => void;\r\n\tonFileDeleted: () => void;\r\n\tshowInformation: (title: string, label: string) => void;\r\n}\r\n\r\nexport default function createFileUpload(containerEl: HTMLElement, deps: IFileUploadDependencies) {\r\n\tconst infoButtons = expressQuerySelectorAll(containerEl, '.technical-info-button');\r\n\tconst files = expressQuerySelector(containerEl, '.technical-contact-form-files', true);\r\n\tconst fileInput = expressQuerySelector(files, '.technical-upload-input', true);\r\n\tconst fileTemplate = expressQuerySelector(files, '.technical-contact-from-file-template', true);\r\n\tconst useExtendedLogging = files.dataset.logging === 'true';\r\n\r\n\tlet filesUsed: string[] = [];\r\n\tlet filesUploading: string[] = [];\r\n\tlet selectedFilesUploading = false;\r\n\tconst filesAlreadyUploaded: string[] = [];\r\n\tlet sessionId;\r\n\tconst {\r\n\t\tgetPreventedFileTypes,\r\n\t\tonFilesSelected,\r\n\t\tgetUploadUrl,\r\n\t\tonUploadComplete,\r\n\t\tonUploadFailed,\r\n\t\tonUploadLoad,\r\n\t\tonUpload,\r\n\t\tshowInformation,\r\n\t\tonFileDeleted\r\n\t} = deps;\r\n\r\n\tconst startUpload = (e: Event) => {\r\n\t\ttrackContactPageEvent('UploadFiles');\r\n\r\n\t\t// For each file, we need to start an upload. Only first 5 files are taken into account, we ignore more ...\r\n\t\te.preventDefault();\r\n\r\n\t\tconst fileInput = e.currentTarget as HTMLInputElement;\r\n\r\n\t\tconst allFiles = fileInput.files;\r\n\t\tif (!allFiles)\r\n\t\t\treturn; // Nothing selected\r\n\r\n\t\tif (!sessionId)\r\n\t\t\tsessionId = Guid.newGuid();\r\n\r\n\t\tselectedFilesUploading = (filesUsed.length + filesUploading.length) < 5;\r\n\t\tonFilesSelected();\r\n\r\n\t\tfor (let i = 0; i < allFiles.length; i++) {\r\n\t\t\tconst file = allFiles[i];\r\n\r\n\t\t\tif (filesUsed.indexOf(file.name) !== -1)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\t// Display the file in the list of files\r\n\t\t\tconst newFile = fileTemplate.cloneNode(true) as HTMLElement;\r\n\t\t\tnewFile.classList.remove('u-hide', 'technical-contact-from-file-template');\r\n\t\t\tnewFile.classList.add('technical-contact-from-file');\r\n\t\t\tnewFile.dataset.filename = file.name;\r\n\t\t\tconst filename = expressQuerySelector(newFile, \".technical-loadingbar-text\", true);\r\n\t\t\tfilename.innerHTML = file.name;\r\n\t\t\tfiles.appendChild(newFile);\r\n\r\n\t\t\t// if more then max for upload show and start timer that user can not upload more then X files\r\n\t\t\tif (i >= 5 - (filesUsed.length + filesUploading.length)) {\r\n\t\t\t\tsetProcessbarState(newFile, true, fileInput.dataset.fileuploadlimiterror || '');\r\n\t\t\t\tselectedFilesUploading = filesUploading.length > 0;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tgetPreventedFileTypes().then(res => {\r\n\t\t\t\tconst fileType = file.name.split('.').pop() || '';\r\n\t\t\t\tif (res.toLowerCase().indexOf(fileType.toLowerCase()) === -1) {\r\n\t\t\t\t\tif (filesUsed.indexOf(file.name) === -1 || filesUploading.indexOf(file.name) === -1) {\r\n\r\n\t\t\t\t\t\tgetUploadUrl(sessionId, file.name).then(res => {\r\n\t\t\t\t\t\t\tif (file.size === 0 || file.size > 1024 * 1024 * 20) {\r\n\t\t\t\t\t\t\t\tsetProcessbarState(newFile, true, fileInput.dataset.filelimiterror || '');\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tfilesUploading.push(file.name);\r\n\r\n\t\t\t\t\t\t\t\t// onUpload valid files\r\n\t\t\t\t\t\t\t\tonUpload();\r\n\r\n\t\t\t\t\t\t\t\tconst progress = expressQuerySelector(newFile, \".technical-loadingbar-progress\", true);\r\n\t\t\t\t\t\t\t\tconst visualprogress = expressQuerySelector(newFile, \".technical-loadingbar-visual-progress\", true);\r\n\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t// get data from form\r\n\t\t\t\t\t\t\t\t\tconst formdata = new FormData();\r\n\t\t\t\t\t\t\t\t\tformdata.append(\"file\", file, file.name);\r\n\t\t\t\t\t\t\t\t\tconst ajax = new XMLHttpRequest();\r\n\t\t\t\t\t\t\t\t\tajax.open(\"POST\", res.url);\r\n\r\n\t\t\t\t\t\t\t\t\t// showprogress upload\r\n\t\t\t\t\t\t\t\t\tajax.upload.addEventListener(\"progress\", (evt: ProgressEvent) => {\r\n\t\t\t\t\t\t\t\t\t\tif (evt.lengthComputable) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst percentComplete = evt.loaded / evt.total * 100;\r\n\t\t\t\t\t\t\t\t\t\t\tprogress.innerHTML = Math.round(percentComplete) + '%';\r\n\t\t\t\t\t\t\t\t\t\t\tvisualprogress.style.width = Math.round(percentComplete) + '%';\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\t\t// load progress\r\n\t\t\t\t\t\t\t\t\tajax.upload.addEventListener(\"load\", (evt: ProgressEvent) => {\r\n\t\t\t\t\t\t\t\t\t\tfilesAlreadyUploaded.push(file.name);\r\n\t\t\t\t\t\t\t\t\t\tonUploadLoad();\r\n\t\t\t\t\t\t\t\t\t\t// clean fileinput\r\n\t\t\t\t\t\t\t\t\t\tfileInput.value = '';\r\n\t\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\t\t// state change\r\n\t\t\t\t\t\t\t\t\tajax.onreadystatechange = () => {\r\n\t\t\t\t\t\t\t\t\t\tfilesUploading = filesUploading.filter(f => f !== file.name);\r\n\t\t\t\t\t\t\t\t\t\tselectedFilesUploading = filesUploading.length > 0;\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (ajax.status && (ajax.status >= 200 && ajax.status < 300 || filesAlreadyUploaded.indexOf(file.name) !== -1)) {\r\n\t\t\t\t\t\t\t\t\t\t\tprogress.innerHTML = '100%';\r\n\t\t\t\t\t\t\t\t\t\t\tvisualprogress.style.width = '100%';\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tif (filesUsed.indexOf(file.name) === -1) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tfilesUsed.push(file.name);\r\n\t\t\t\t\t\t\t\t\t\t\t\tsetProcessbarState(newFile, false, 'file ' + file.name + ' was uploaded successfully', ajax.status);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tonUploadComplete();\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tonUploadFailed();\r\n\t\t\t\t\t\t\t\t\t\t\tsetProcessbarState(newFile, true, (fileInput.dataset.fileuploaderror || (\"Upload to contact form error.Filename: {0}\")).replace(\"{0}\", file.name), ajax.status);\r\n\t\t\t\t\t\t\t\t\t\t\tselectedFilesUploading = filesUploading.length > 0;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t// clean fileinput\r\n\t\t\t\t\t\t\t\t\t\tfileInput.value = '';\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t\tajax.send(formdata);\r\n\t\t\t\t\t\t\t\t} catch (err) {\r\n\t\t\t\t\t\t\t\t\tsetProcessbarState(newFile, true, (fileInput.dataset.fileuploaderror || (\"Upload to contact form error. Filename: {0}\")).replace(\"{0}\", file.name), undefined, err as string | undefined);\r\n\t\t\t\t\t\t\t\t\tselectedFilesUploading = filesUploading.length > 0;\r\n\t\t\t\t\t\t\t\t}\r\n\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 {\r\n\t\t\t\t\tsetProcessbarState(newFile, true, fileInput.dataset.fileextensionnotvaliderror || '');\r\n\t\t\t\t\tselectedFilesUploading = filesUploading.length > 0;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst isUploadComplete = () => {\r\n\t\treturn filesUploading.length <= 0 && !selectedFilesUploading;\r\n\t};\r\n\r\n\tconst filesClicked = (e: MouseEvent) => {\r\n\t\tconst target = e.target as HTMLElement;\r\n\r\n\t\tif (target.classList.contains('technical-progressbar-delete') && target.parentElement && target.parentElement.parentElement) {\r\n\t\t\t// Clicked the delete of a file\r\n\t\t\tdeleteprogressbar(target.parentElement.parentElement);\r\n\t\t}\r\n\t};\r\n\r\n\tconst log = (message: string, error: boolean) => {\r\n\t\tpostRequest(\r\n\t\t\t'/apicore/Logapi/LogInformation',\r\n\t\t\t{ InformationText: message, Error: error },\r\n\t\t\t{ headers: { 'Content-type': 'application/json; charset=utf-8' } }\r\n\t\t);\r\n\t};\r\n\r\n\tconst deleteprogressbar = (el: HTMLElement) => {\r\n\t\tif (el) {\r\n\t\t\tconst filename = expressQuerySelector(el, '.technical-loadingbar-text', true).innerHTML;\r\n\t\t\tif (filename)\r\n\t\t\t\tfilesUsed = filesUsed.filter(f => f !== filename);\r\n\r\n\t\t\tselectedFilesUploading = filesUploading.length > 0;\r\n\r\n\t\t\tel.remove();\r\n\t\t\tonFileDeleted();\r\n\t\t}\r\n\t};\r\n\r\n\tconst deleteprogressbartimer = (el: HTMLElement) => {\r\n\t\tconst errormessageCountDown = expressQuerySelector(el, '.m-progress-bar__error__timer', true);\r\n\t\tlet timerseconds = parseInt(errormessageCountDown.getAttribute('errortimerseconds') ? errormessageCountDown.getAttribute('errortimerseconds')! : '', 10);\r\n\r\n\t\tif (timerseconds) {\r\n\t\t\tconst intervalId = setInterval(() => {\r\n\t\t\t\t// if seconds 0\r\n\t\t\t\tif (timerseconds <= 1) {\r\n\t\t\t\t\tclearInterval(intervalId);\r\n\t\t\t\t\tdeleteprogressbar(el);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// countdown seconds\r\n\t\t\t\ttimerseconds--;\r\n\t\t\t\terrormessageCountDown.innerHTML = timerseconds.toString() + 's';\r\n\t\t\t}, 1000);\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateBarPercentage = (percentage: number) => {\r\n\t\tconst progress = expressQuerySelector(containerEl, \".technical-loadingbar-progress\", true);\r\n\t\tconst visualprogress = expressQuerySelector(containerEl, \".technical-loadingbar-visual-progress\", true);\r\n\r\n\t\tprogress.innerHTML = Math.round(percentage) + '%';\r\n\t\tvisualprogress.style.width = Math.round(percentage) + '%';\r\n\t};\r\n\r\n\tconst getFileUrls = () => {\r\n\t\treturn filesUsed.map(f => sessionId + '/' + f).join('||');\r\n\t};\r\n\r\n\tconst clickShowInformation = (e: MouseEvent) => {\r\n\t\tconst button = (e.currentTarget as HTMLElement);\r\n\r\n\t\tif (button.dataset.title && button.dataset.label)\r\n\t\t\tshowInformation(button.dataset.title, button.dataset.label);\r\n\t};\r\n\r\n\tconst eventDisposables = compositeDisposable(\r\n\t\t[\r\n\t\t\texpressEventListener(fileInput, 'change', startUpload),\r\n\t\t\texpressEventListener(files, 'click', filesClicked),\r\n\t\t]\r\n\t);\r\n\r\n\tconst setProcessbarState = (el: HTMLElement, error: boolean, message: string, status?: number, errorMessageForLogging?: string) => {\r\n\t\t// if progressbar\r\n\t\tif (!el.classList.contains('m-progress-bar')) return;\r\n\r\n\t\t// set loadingbar error\r\n\t\tconst loadingbar = expressQuerySelector(el, '.a-loading-bar', true);\r\n\t\tloadingbar.classList.add(error ? 'a-loading-bar--error' : 'a-loading-bar--success');\r\n\t\tloadingbar.classList.remove(!error ? 'a-loading-bar--error' : 'a-loading-bar--success');\r\n\r\n\t\t// set progressbar error\r\n\t\tel.classList.remove('m-progress-bar--loading');\r\n\t\tel.classList.remove(error ? 'm-progress-bar--success' : 'm-progress-bar--error');\r\n\t\tel.classList.add(!error ? 'm-progress-bar--success' : 'm-progress-bar--error');\r\n\r\n\t\t// set error message progressbar\r\n\t\tconst errorspan = expressQuerySelector(el, '.m-progress-bar__error', false);\r\n\t\tif (errorspan && error) {\r\n\t\t\tconst errormessagespan = expressQuerySelector(el, '.m-progress-bar__error__message', true);\r\n\t\t\terrormessagespan.innerHTML = message ? message : '';\r\n\r\n\t\t\t// add timer\r\n\t\t\tdeleteprogressbartimer(el);\r\n\t\t}\r\n\r\n\t\t// log error for logviewer\r\n\t\tif (useExtendedLogging) {\r\n\t\t\tconst filename = expressQuerySelector(loadingbar, '.technical-loadingbar-text', false);\r\n\t\t\tconst logMessage = message + (errorMessageForLogging ? errorMessageForLogging : '') + (status ? ' with status ' + status : '') + (error\r\n\t\t\t\t? (filename ? '\\n happend on file ' + filename.innerHTML + '\\n this happend on session id ' + sessionId : '\\n this happend on session id ' + sessionId)\r\n\t\t\t\t: ' file is now in bucket folder: ' + sessionId\r\n\t\t\t);\r\n\t\t\tlog(logMessage, error);\r\n\t\t}\r\n\t};\r\n\r\n\t// Enable the mini info buttons\r\n\tinfoButtons.forEach(b => {\r\n\t\teventDisposables && eventDisposables.add && eventDisposables.add(expressEventListener(b, 'click', clickShowInformation));\r\n\t});\r\n\r\n\treturn {\r\n\t\tdispose: () => { eventDisposables.dispose(); },\r\n\t\tSetProgressBarState: setProcessbarState,\r\n\t\tUpdateProgressBarPercentage: updateBarPercentage,\r\n\t\tIsUploadComplete: isUploadComplete,\r\n\t\tGetFileUrls: getFileUrls\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","/*\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 { 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","import { expressQuerySelector, hasClass, expressRemoveClass } from \"../common/html\";\r\nexport declare class Truncate {\r\n\tconstructor(element: HTMLElement, options: ITruncateOptions)\r\n\tcollapse(): void;\r\n\texpand(): void;\r\n\tupdate(html: string): void;\r\n\tconfig(config: any): void;\r\n}\r\n\r\nexport interface ITruncate {\r\n\tdispose: () => void;\r\n\tupdateConfig: (opts: ITruncateOptions, overrideDefault?: boolean) => void;\r\n\tupdateContent: (html: string) => void;\r\n\tcollapse: () => void;\r\n}\r\n\r\nexport interface ITruncateOptions {\r\n\tlineHeight?: number;\r\n\tlines?: number;\r\n\tellipsis?: string;\r\n\tshowMore?: string;\r\n\tshowLess?: string;\r\n\tposition?: string;\r\n\tmaxHeight?: number;\r\n\teventTrackingMethod?: (action: string) => void;\r\n\tcloseEventAction?: string;\r\n\topenEventAction?: string;\r\n\tonInitEvent?: () => void;\r\n}\r\n\r\nexport function createTruncate(containerEl: HTMLElement, opts: ITruncateOptions) {\r\n\t// calculate the height yourself\r\n\t// => package does same calculations but with parseInt() so there is no support for float lineheights then visable lines -= 1\r\n\t// height of a element auto rounds to a round number do the same here\r\n\tconst lineHeight = Math.ceil(opts.lineHeight ? opts.lineHeight : parseFloat(window.getComputedStyle(containerEl).lineHeight || \"0\"));\r\n\tconst lines = Math.ceil(opts.lines ? opts.lines : 1);\r\n\tconst maxHeight = Math.ceil(opts.maxHeight ? opts.maxHeight : lineHeight * lines);\r\n\tconst shaveMoreOnContainer = expressQuerySelector(containerEl, '.technical-shave-more');\r\n\tconst shaveLessOnContainer = expressQuerySelector(containerEl, '.technical-shave-less');\r\n\r\n\tconst defaults: ITruncateOptions = {\r\n\t\tellipsis: '\\u2026 ',\r\n\t\tshowMore: opts.showMore || (shaveMoreOnContainer ? shaveMoreOnContainer.outerHTML : expressQuerySelector(document, '.technical-shave-more').outerHTML),\r\n\t\tshowLess: opts.showLess || (shaveLessOnContainer? shaveLessOnContainer.outerHTML : expressQuerySelector(document, '.technical-shave-less').outerHTML),\r\n\t\tlineHeight: lineHeight,\r\n\t\tlines: lines,\r\n\t\tmaxHeight: maxHeight < lineHeight ? lineHeight : maxHeight // a minimum of 1 line is visible (if max height > line height => no content is shown on the page)\r\n\t};\r\n\r\n\tif (hasClass(containerEl, \"truncate-loading-1-line\")) expressRemoveClass(containerEl, \"truncate-loading-1-line\");\r\n\tif (hasClass(containerEl, \"truncate-loading-2-lines\")) expressRemoveClass(containerEl, \"truncate-loading-2-lines\");\r\n\tif (hasClass(containerEl, \"truncate-loading-5-lines--pcp\")) expressRemoveClass(containerEl, \"truncate-loading-5-lines--pcp\");\r\n\r\n\tconst onClick = (ev: MouseEvent) => {\r\n\t\tconst currentEl = ev.target as HTMLElement;\r\n\t\tif (currentEl.classList.contains(\"technical-shave-more\")) {\r\n\t\t\tif (opts.eventTrackingMethod && opts.openEventAction) opts.eventTrackingMethod(opts.openEventAction);\r\n\t\t\ttruncate.expand();\r\n\t\t}\r\n\t\telse if (currentEl.classList.contains(\"technical-shave-less\")) {\r\n\t\t\tif (opts.eventTrackingMethod && opts.closeEventAction) opts.eventTrackingMethod(opts.closeEventAction);\r\n\t\t\ttruncate.collapse();\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateConfig = (newOpts: ITruncateOptions, overrideDefault?: boolean) => {\r\n\t\ttruncate.config(overrideDefault\r\n\t\t\t? {\r\n\t\t\t\tellipsis: defaults.ellipsis,\r\n\t\t\t\tshowMore: defaults.showMore,\r\n\t\t\t\tshowLess: defaults.showLess,\r\n\t\t\t\tlineHeight: defaults.lineHeight,\r\n\t\t\t\tlines: newOpts.lines,\r\n\t\t\t\tmaxHeight: newOpts.maxHeight\r\n\t\t\t}\r\n\t\t\t: { ...newOpts, ...defaults });\r\n\t\ttruncate.collapse();\r\n\t};\r\n\r\n\tconst updateContent = (html: string) => {\r\n\t\ttruncate.update(html);\r\n\t\ttruncate.collapse();\r\n\t};\r\n\r\n\tconst collapse = () => {\r\n\t\ttruncate.collapse();\r\n\t};\r\n\r\n\t// We need to find a nog jquery alternative to our truncate.js\r\n\tconst truncate = new Truncate(containerEl, { ...opts, ...defaults });\r\n\tif (opts.onInitEvent) opts.onInitEvent();\r\n\tcontainerEl.addEventListener('click', onClick);\r\n\r\n\treturn {\r\n\t\tdispose: () => containerEl.removeEventListener('click', onClick),\r\n\t\tupdateConfig,\r\n\t\tupdateContent,\r\n\t\tcollapse\r\n\t} as ITruncate;\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 { trackContactPageEvent } from \"../common/events\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll, inViewTrigger } from \"../common/html\";\r\nimport { getCookie } from \"../utils/cookie\";\r\nimport { compositeDisposable } from \"../utils/disposable\";\r\nimport createFileUpload, { IGetSignedUrl } from \"./file-upload\";\r\nimport { initForm } from \"./form\";\r\nimport { createTruncate } from \"./truncate\";\r\nimport {isTempAccountEmail} from \"../utils/validation\";\r\n\r\nexport interface ITopicWithSubtopicsResult {\r\n\tinformativeTitle: string;\r\n\tinformativeText: string;\r\n\tsubtopics: string[];\r\n}\r\n\r\nexport interface ISubtopicWithSubtopicsResult {\r\n\tinformativeTitle: string;\r\n\tinformativeText: string;\r\n\torderNrRequired: boolean;\r\n}\r\n\r\nexport interface IContactFormSubmitResult {\r\n\terror: string;\r\n\ttext: string;\r\n\ttitle: string;\r\n}\r\n\r\n\r\nexport interface IContactFormDependencies {\r\n\tgetTopicWithSubtopics: (index: number) => Promise;\r\n\tgetSubtopic: (topicIndex: number, subtopicIndex: number) => Promise;\r\n\tsubmitData: (data: { [inputName: string]: string }) => Promise;\r\n\tshowInformation: (title: string, label: string) => void;\r\n\tgetUploadUrl: (sessionId: string, filename: string) => Promise;\r\n\tgetPreventedFileTypes: () => Promise;\r\n}\r\n\r\nexport default function createContactForm(containerEl: HTMLElement, formEl: HTMLElement, thankYouEl: HTMLElement, deps: IContactFormDependencies) {\r\n\tconst { getTopicWithSubtopics, getSubtopic, submitData, getUploadUrl, getPreventedFileTypes, showInformation } = deps;\r\n\r\n\tconst topicDropdown = expressQuerySelector(formEl, \".technical-contact-form-topic\", true);\r\n\tconst subtopicDropdown = expressQuerySelector(formEl, \".technical-contact-form-subtopic\", true);\r\n\tconst suggestionCloseBt = expressQuerySelector(formEl, \".technical-suggestion-close\", true);\r\n\tconst submitBt = expressQuerySelector(formEl, '.technical-contact-form-submit', true);\r\n\tconst thankYouTitleEl = expressQuerySelector(thankYouEl, \".technical-contact-thankyou-title\", true);\r\n\tconst thankYouTextEl = expressQuerySelector(thankYouEl, \".technical-contact-thankyou-description\", true);\r\n\tconst suggestion = expressQuerySelector(formEl, \".technical-suggestion\", true);\r\n\tconst numberOfLines = 4;\r\n\tconst truncatedEls: HTMLElement[] = [];\r\n\r\n\tconst changeTopic = () => {\r\n\t\ttrackContactPageEvent('TopicSelected');\r\n\t\tif (topicDropdown.value)\r\n\t\t\tgetTopicWithSubtopics(parseInt(topicDropdown.value, 10)).then(res => {\r\n\t\t\t\tsubtopicDropdown.disabled = false;\r\n\t\t\t\tsubtopicDropdown.closest(\".a-form-input\").classList.remove('a-form-input--disabled');\r\n\r\n\t\t\t\t// Remove all existing options (except the first one)\r\n\t\t\t\tfor (let i = subtopicDropdown.options.length - 1; i >= 1; i--)\r\n\t\t\t\t\tsubtopicDropdown.remove(i);\r\n\t\t\t\tsubtopicDropdown.selectedIndex = 0;\r\n\r\n\t\t\t\tlet counter = 0;\r\n\t\t\t\tres.subtopics.forEach(s => {\r\n\t\t\t\t\tconst newSubtopic = document.createElement(\"option\");\r\n\t\t\t\t\tnewSubtopic.text = s;\r\n\t\t\t\t\tnewSubtopic.value = counter.toString();\r\n\t\t\t\t\tsubtopicDropdown.add(newSubtopic);\r\n\t\t\t\t\tcounter++;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst changeSubtopic = () => {\r\n\t\ttrackContactPageEvent('SubtopicSelected');\r\n\t\tif (!subtopicDropdown.value) return;\r\n\r\n\t\t// reset all to invisible\r\n\t\tconst faqItems = expressQuerySelectorAll(suggestion, '.technical-faq-item:not(.u-hide)');\r\n\t\tfaqItems.forEach(x => x.classList.add('u-hide'));\r\n\r\n\t\t// search specific item\r\n\t\tconst infoItem = expressQuerySelector(suggestion, `[data-topicIndex=\"${parseInt(topicDropdown.value, 10)}\"][data-subTopicIndex=\"${parseInt(subtopicDropdown.value, 10)}\"]`, false);\r\n\t\tif (!infoItem) return;\r\n\r\n\t\t// show info item\r\n\t\tinfoItem.classList.remove('u-hide');\r\n\t\tsuggestion.classList.remove(\"u-hide\");\r\n\r\n\t\tif (truncatedEls.every(x => x !== infoItem)) {\r\n\t\t\tconst suggestionText = expressQuerySelector(infoItem, \".technical-suggestion-text\");\r\n\t\t\tconst lineHeight = parseFloat(window.getComputedStyle(suggestionText).lineHeight || \"0\");\r\n\t\t\tconst maxHeight = numberOfLines * lineHeight;\r\n\t\t\tconst shaveControlsContainer = expressQuerySelector(suggestion, '.technical-shave-controls', false);\r\n\r\n\t\t\tcreateTruncate(suggestionText, {\r\n\t\t\t\tcloseEventAction: \"ShowLessInformativeText\",\r\n\t\t\t\topenEventAction: \"ShowMoreInformativeText\",\r\n\t\t\t\teventTrackingMethod: (action: string) => trackContactPageEvent(action),\r\n\t\t\t\tlines: numberOfLines,\r\n\t\t\t\tmaxHeight: maxHeight,\r\n\t\t\t\tlineHeight: lineHeight,\r\n\t\t\t\tshowMore: shaveControlsContainer && expressQuerySelector(shaveControlsContainer, '.technical-shave-more', true).outerHTML,\r\n\t\t\t\tshowLess: shaveControlsContainer && expressQuerySelector(shaveControlsContainer, '.technical-shave-less', true).outerHTML\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// show or hide the ordernumber\r\n\t\tconst ordernr = expressQuerySelector(formEl, \".technical-contact-ordernumber\", true);\r\n\t\tordernr && ordernr.classList.toggle('u-hide', infoItem.dataset.ordernrrequired !== 'true');\r\n\t};\r\n\r\n\tconst closeSuggestion = (e: MouseEvent) => {\r\n\t\ttrackContactPageEvent('InformativeTextClosed');\r\n\t\tconst parentEl = (e.currentTarget as HTMLElement).parentElement;\r\n\t\tif (parentEl) parentEl.classList.add('u-hide');\r\n\t};\r\n\r\n\tconst resetSelectedOptions = () => {\r\n\t\t// reset the default selected values of the selects (for FF and older browser that don't support the autocomplete attribute)\r\n\t\ttopicDropdown.options.selectedIndex = 0;\r\n\t\tsubtopicDropdown.options.selectedIndex = 0;\r\n\t};\r\n\r\n\tconst eventDisposables = compositeDisposable(\r\n\t\t[\r\n\t\t\texpressEventListener(topicDropdown, 'change', changeTopic),\r\n\t\t\texpressEventListener(subtopicDropdown, 'change', changeSubtopic),\r\n\t\t\texpressEventListener(suggestionCloseBt, 'click', closeSuggestion),\r\n\t\t\texpressEventListener(window, \"onbeforeunload\", resetSelectedOptions)\r\n\t\t]\r\n\t);\r\n\r\n\tconst showThankYou = (title: string, text: string) => {\r\n\t\tsetTimeout(() => {\r\n\t\t\tcontainerEl.classList.toggle('u-hide', true);\r\n\t\t\tthankYouTitleEl.innerHTML = title;\r\n\t\t\tthankYouTextEl.innerHTML = text;\r\n\t\t\tthankYouEl.classList.toggle('u-hide', false);\r\n\t\t\tthankYouEl.scrollIntoView(true);\r\n\t\t}, 401);\r\n\t};\r\n\r\n\t// Add event tracking\r\n\tinViewTrigger(containerEl, () => {\r\n\t\ttrackContactPageEvent('ContactFormRead');\r\n\t});\r\n\r\n\t// Enable the actual form to submit data\r\n\tconst contactForm = initForm(\r\n\t\tformEl as HTMLFormElement,\r\n\t\t{\r\n\t\t\tonSubmitForm: (data) => {\r\n\t\t\t\tdata['files'] = fileupload.GetFileUrls();\r\n\t\t\t\treturn submitData(data).then(res => {\r\n\t\t\t\t\tif (res.error) {\r\n\t\t\t\t\t\tswitch (res.error) {\r\n\t\t\t\t\t\t\tcase \"ordernr\":\r\n\t\t\t\t\t\t\t\tcontactForm.inputs[\"contactordernr\"].setError(res.text);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tcase \"spam\":\r\n\t\t\t\t\t\t\t\tshowThankYou(res.title, res.text);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tshowThankYou(res.title, res.text);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\tconst toggleEnableDisableButton = () => {\r\n\t\tif (fileupload.IsUploadComplete()) {\r\n\t\t\tsubmitBt.classList.remove(\"a-button--disabled\");\r\n\t\t\tsubmitBt.disabled = false;\r\n\t\t} else if (!submitBt.disabled) {\r\n\t\t\tsubmitBt.classList.add(\"a-button--disabled\");\r\n\t\t\tsubmitBt.disabled = true;\r\n\t\t}\r\n\t};\r\n\tconst onUploadFile = () => {\r\n\t\tcontactForm.inputs[\"uploadfield\"].clear(false);\r\n\t\tcontactForm.inputs[\"uploadfield\"].setError('');\r\n\r\n\t\ttoggleEnableDisableButton();\r\n\t};\r\n\r\n\tconst fileupload = createFileUpload(\r\n\t\tcontainerEl,\r\n\t\t{\r\n\t\t\tgetPreventedFileTypes: getPreventedFileTypes,\r\n\t\t\tgetUploadUrl: getUploadUrl,\r\n\t\t\tonUpload: onUploadFile,\r\n\t\t\tonUploadComplete: toggleEnableDisableButton,\r\n\t\t\tonUploadFailed: toggleEnableDisableButton,\r\n\t\t\tonUploadLoad: toggleEnableDisableButton,\r\n\t\t\tshowInformation: showInformation,\r\n\t\t\tonFilesSelected: toggleEnableDisableButton,\r\n\t\t\tonFileDeleted: toggleEnableDisableButton\r\n\t\t});\r\n\r\n\t// Wha?\r\n\t// It seems that BACK-FORWARD in the browser causes the topic to be preselected but the subtopic to still be disabled. Solution, reset the topic.\r\n\tcontactForm.inputs['topic'].clear(true);\r\n\r\n\tconst email = getCookie('LastUsedEmail');\r\n\temail && !isTempAccountEmail(email) && contactForm.inputs['contactemail'].setValue(email);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tfileupload.dispose();\r\n\t\t}\r\n\t};\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 {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 {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","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","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","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 { trackContactPageEvent } from \"../common/events\";\r\nimport { expressEventListener, expressQuerySelector, htmlToElement } from \"../common/html\";\r\nimport { getCookie } from \"../utils/cookie\";\r\nimport { initForm } from \"./form\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport {isTempAccountEmail} from \"../utils/validation\";\r\n\r\nexport interface IOrderDetailsResult {\r\n\tfound: boolean;\r\n\tnewParcelHtml: string;\r\n\tneedsLogout: boolean;\r\n\tnoOrderFoundLabel: string;\r\n\tpopupDialogId: string;\r\n\tuseErrorLabelInPopup: string;\r\n}\r\nexport interface IParcelDependencies {\r\n\treadonly getOrderDetails: (email: string, ordernumber: string) => Promise;\r\n}\r\n\r\nexport default function createParcel(containerEl: HTMLElement, deps: IParcelDependencies) {\r\n\tconst { getOrderDetails } = deps;\r\n\tconst orderDetails = expressQuerySelector(containerEl, \".technical-order-details\", false);\r\n\tconst findOrderForm = expressQuerySelector(containerEl, \".technical-parcel-tile-order-form\", false);\r\n\r\n\t// get the initial login state & send event\r\n\tconst initState = containerEl.dataset.initState;\r\n\tif (initState) trackContactPageEvent(initState);\r\n\r\n\tif (orderDetails) {\r\n\t\tconst orderOverviewButtonEl = expressQuerySelector(orderDetails, \".technical-order-overview-button\", true);\r\n\t\texpressEventListener(orderOverviewButtonEl, 'click', _ => trackContactPageEvent('GoToFullOrderOverview'));\r\n\t}\r\n\r\n\tif (!findOrderForm) return;\r\n\tconst onSubmit = (data: { [inputName: string]: string }) => {\r\n\t\treturn getOrderDetails(data['parceltile-find-order-email'], data['ordernumber']).then(res => {\r\n\t\t\tif (res.useErrorLabelInPopup) {\r\n\t\t\t\tconst dialogId = res.popupDialogId;\r\n\r\n\t\t\t\tcreatePopup(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tview: \"GenericPopup\",\r\n\t\t\t\t\t\tdialogId: dialogId,\r\n\t\t\t\t\t\tforceRefresh: true,\r\n\t\t\t\t\t\tdata:\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tBodyLabel: res.useErrorLabelInPopup,\r\n\t\t\t\t\t\t\tOkButtonLabel: 'Label.CloseButtonText',\r\n\t\t\t\t\t\t\tExtraPopupCss: 'p-default m-popup--content-width'\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.then(popup => {\r\n\t\t\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\t\t\tconst dialog = expressQuerySelector(document, '#' + dialogId, true);\r\n\t\t\t\t\t\tconst okButton = expressQuerySelector(dialog, '.technical-general-popup-ok-button', true);\r\n\r\n\t\t\t\t\t\tokButton.addEventListener(\"click\", function () { popup.close(); });\r\n\t\t\t\t\t\tpopup.openAsync();\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (res.found) {\r\n\t\t\t\ttrackContactPageEvent('SearchParcelSuccess');\r\n\t\t\t\tconst node = htmlToElement(res.newParcelHtml);\r\n\t\t\t\tnode && containerEl.replaceWith(node);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttrackContactPageEvent('SearchParcelFail');\r\n\r\n\t\t\t// reset error text => in case user filled in wrong input first\r\n\t\t\tform.inputs['ordernumber'].clear(false);\r\n\t\t\tform.inputs['parceltile-find-order-email'].clear(false);\r\n\r\n\t\t\t// handle order not found exception\r\n\t\t\tif (res.noOrderFoundLabel) {\r\n\t\t\t\t// set label\r\n\t\t\t\tform.inputs['ordernumber'].setError(res.noOrderFoundLabel, false);\r\n\t\t\t\tform.inputs['parceltile-find-order-email'].setError('', false);\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\tconst form = initForm(findOrderForm, { onSubmitForm: onSubmit });\r\n\r\n\tconst email = getCookie('LastUsedEmail');\r\n\temail && !isTempAccountEmail(email) && form.inputs['parceltile-find-order-email'].setValue(email);\r\n}\r\n","import {trackContactPageEvent } from \"../common/events\";\r\nimport { expressEventListener, expressQuerySelector } from \"../common/html\";\r\nimport createContactForm, { IContactFormSubmitResult, ISubtopicWithSubtopicsResult, ITopicWithSubtopicsResult } from \"../components/contact-form\";\r\nimport { IGetSignedUrl } from \"../components/file-upload\";\r\nimport { CreateAndStartLoginWatcher } from \"../components/login-check\";\r\nimport { CreateLoginRegisterComponents } from \"../components/login-register\";\r\nimport { createGeneralPageEventsAndComponents } from \"../components/page-general\";\r\nimport createParcel, { IOrderDetailsResult } from \"../components/parcel\";\r\nimport { createPopup } from \"../components/popup-new\";\r\nimport { postRequest, postRequestWithoutBody } from \"../utils/fetch\";\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n\tcreateGeneralPageEventsAndComponents();\r\n\tCreateLoginRegisterComponents();\r\n\tCreateAndStartLoginWatcher();\r\n\r\n\tconst parcelContainerEl = expressQuerySelector(document, \".technical-split-panel\", true);\r\n\tconst contactFormContainerEl = expressQuerySelector(document, \".technical-content-container\", false);\r\n\tconst contactFormEl = expressQuerySelector(document, \".technical-contact-form\", false);\r\n\tconst contactThankYouEl = expressQuerySelector(document, \".technical-contact-thankyou\", false);\r\n\tconst contactInfoEl = expressQuerySelector(document, \".technical-contact-information-container\", true);\r\n\tconst googleRecaptchaEnabled = contactFormEl.dataset.recaptchaenabled === \"true\";\r\n\tconst useEnterprise = contactFormEl!.dataset.recaptchaenterpriseenabled === \"true\";\r\n\tconst getOrderDetails = (email: string, orderNumber: string) => postRequest<{ Email, Ordernumber }, IOrderDetailsResult>(\"/apicore/ContactApi/ContactOrderDetails\", { Email: email, Ordernumber: orderNumber }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\tconst getTopicWithSubtopics = (index: number) => postRequest<{ TopicIndex }, ITopicWithSubtopicsResult>(\"/apicore/ContactApi/ContactTopicWithSubtopics\", { TopicIndex: index }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\tconst getSubtopic = (topicIndex: number, subtopicIndex: number) => postRequest<{ TopicIndex, SubtopicIndex }, ISubtopicWithSubtopicsResult>(\"/apicore/ContactApi/ContactSubtopic\", { TopicIndex: topicIndex, SubtopicIndex: subtopicIndex }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\tconst getUploadUrl = (sessionId: string, filename: string) => postRequest<{ SessionId, Filename }, IGetSignedUrl>(\"/apicore/ContactApi/ContactGetUploadUrl\", { SessionId: sessionId, Filename: filename }, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\tconst getPreventedFileTypes = () => postRequestWithoutBody(\"/apicore/ContactApi/ContactGetPreventFileTypes\", { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\r\n\tconst fetchRecaptchaToken = (): Promise => {\r\n\t\treturn new Promise((resolve, _) => {\r\n\t\t\tconst siteKey = contactFormEl!.dataset.sitekey || \"\";\r\n\t\t\tconst key = contactFormEl!.dataset.key || \"\";\r\n\t\t\tif (useEnterprise) {\r\n\t\t\t\tgrecaptcha.enterprise.execute(key, { action: 'contact_us' })\r\n\t\t\t\t\t.then((token) => {\r\n\t\t\t\t\t\tresolve(token);\r\n\t\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tgrecaptcha.execute(siteKey, { action: 'contact_us' })\r\n\t\t\t\t\t.then((token) => {\r\n\t\t\t\t\t\tresolve(token);\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t};\r\n\r\n\tconst submitData = (data: { [inputName: string]: string }) => {\r\n\t\ttrackContactPageEvent('SendContact');\r\n\t\tconst submitContactForm = (token?: string) => {\r\n\t\t\treturn postRequest(\r\n\t\t\t\t\"/apicore/ContactApi/SubmitContactForm\",\r\n\t\t\t\t{\r\n\t\t\t\t\tfirstname: data['contactfirstname'],\r\n\t\t\t\t\tlastname: data['contactlastname'],\r\n\t\t\t\t\temail: data['contactemail'],\r\n\t\t\t\t\tphone: data['contactphone'],\r\n\t\t\t\t\tordernr: data['contactordernr'],\r\n\t\t\t\t\tmessage: data['contactmessage'],\r\n\t\t\t\t\ttoken: token || '',\r\n\t\t\t\t\ttopicIndex: data['topic'],\r\n\t\t\t\t\tsubTopicIndex: data['sub_topic'],\r\n\t\t\t\t\tfiles: data['files']\r\n\t\t\t\t},\r\n\t\t\t\t{ headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\t\t};\r\n\t\tif (googleRecaptchaEnabled) {\r\n\t\t\treturn fetchRecaptchaToken().then(token => {\r\n\t\t\t\treturn submitContactForm(token);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\treturn submitContactForm();\r\n\t\t}\r\n\t};\r\n\r\n\tconst showInformation = (title: string, label: string) => {\r\n\t\tcreatePopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"GenericPopup\",\r\n\t\t\t\tdialogId: \"information\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tdata:\r\n\t\t\t\t{\r\n\t\t\t\t\tTitleLabel: title,\r\n\t\t\t\t\tBodyLabel: label\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.then(popup => popup.openAsync());\r\n\t};\r\n\r\n\tcreateParcel(\r\n\tparcelContainerEl,\r\n\t\t{\r\n\t\t\tgetOrderDetails\r\n\t\t},\r\n\t);\r\n\r\n\tif (contactFormContainerEl && contactFormEl && contactThankYouEl) {\r\n\t\tconst createContactFormEl = () => {\r\n\t\t\tcreateContactForm(contactFormContainerEl, contactFormEl, contactThankYouEl, {\r\n\t\t\t\tgetTopicWithSubtopics,\r\n\t\t\t\tgetSubtopic,\r\n\t\t\t\tsubmitData,\r\n\t\t\t\tshowInformation,\r\n\t\t\t\tgetUploadUrl,\r\n\t\t\t\tgetPreventedFileTypes\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tif (googleRecaptchaEnabled) {\r\n\t\t\tif (useEnterprise) {\r\n\t\t\t\tgrecaptcha.enterprise.ready(() => {\r\n\t\t\t\t\tcreateContactFormEl();\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tgrecaptcha.ready(() => {\r\n\t\t\t\t\tcreateContactFormEl();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tcreateContactFormEl();\r\n\t\t}\r\n\t}\r\n\r\n\tif (contactInfoEl) {\r\n\t\tconst phoneLinkEl = expressQuerySelector(contactInfoEl, \".m-contact-tile__telephone-link\", false);\r\n\t\tconst emailLinkEl = expressQuerySelector(contactInfoEl, \".m-contact-tile__email-link\", false);\r\n\t\tconst faqLink = expressQuerySelector(contactInfoEl, \".technical-faq-link\", false);\r\n\r\n\t\tphoneLinkEl && expressEventListener(phoneLinkEl, 'click', (ev: Event) => trackContactPageEvent('PhoneNumberClick'));\r\n\t\temailLinkEl && expressEventListener(emailLinkEl, 'click', (ev: Event) => trackContactPageEvent('EmailAddressClick'));\r\n\t\tfaqLink && expressEventListener(faqLink, 'click', (ev: Event) => trackContactPageEvent('LinkFaq'));\r\n\t}\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","trackContactPageEvent","trackComponentEvent","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","inViewArray","inViewTrigger","callBack","inViewScrollHandler","scrollY","pageYOffset","scrollPosition","elementHeight","splice","pageVisibilityChange","onVisible","onHidden","hidden","visibilityState","visibilityChange","mozHidden","msHidden","webkitHidden","setTimeout","compositeDisposable","disposables","composite","forEach","add","addDisposable","addMany","addDisposables","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","__awaiter","postRequest","headers","Headers","http","path","config","keepCase","finalPath","request","Request","fetch","then","res","ok","json","catch","HandleError","status","statusText","_","Promise","reject","error","httpText","response","getHttpResponse","text","context","apiFailMsg","startsWith","ecomApiUrl","line","message","process","url","getRequest","init","method","body","traditionalBody","URLSearchParams","JSON","stringify","postRequestWithoutBody","getHtmlRequest","postHtmlRequest","isValidPartialViewResponse","Guid","newSliderGuid","c","r","random","toString","newGuid","createFileUpload","containerEl","deps","infoButtons","files","fileInput","fileTemplate","useExtendedLogging","dataset","logging","filesUsed","filesUploading","selectedFilesUploading","filesAlreadyUploaded","sessionId","getPreventedFileTypes","onFilesSelected","getUploadUrl","onUploadComplete","onUploadFailed","onUploadLoad","onUpload","showInformation","onFileDeleted","deleteprogressbar","filename","filter","f","clickShowInformation","e","button","currentTarget","title","label","eventDisposables","preventDefault","allFiles","file","name","newFile","cloneNode","appendChild","setProcessbarState","fileuploadlimiterror","fileType","split","pop","size","filelimiterror","progress","visualprogress","formdata","FormData","append","ajax","XMLHttpRequest","open","upload","evt","lengthComputable","percentComplete","loaded","total","round","value","onreadystatechange","fileuploaderror","send","err","undefined","fileextensionnotvaliderror","target","errorMessageForLogging","loadingbar","errormessageCountDown","timerseconds","parseInt","getAttribute","intervalId","setInterval","clearInterval","deleteprogressbartimer","InformationText","log","b","SetProgressBarState","UpdateProgressBarPercentage","percentage","IsUploadComplete","GetFileUrls","map","createClickableElement","onClick","options","clickEvent","enable","disable","onClicked","stopPropagation","addClickEvent","createButton","buttonEl","removeAttribute","setAttribute","autocomplete","settings","doc","container","containerStyle","userAgent","navigator","mobileFirefox","debounceWaitMs","preventSubmit","keyUpEventName","items","inputValue","minLen","showOnFocus","selected","debounceTimer","keypressCounter","minLength","clearDebounceTimer","clearTimeout","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","scrollLeft","pageXOffset","customize","updateScroll","elements","getElementsByClassName","previous","previousElementSibling","offsetTop","selectBottom","containerBottom","updateIfDisplayed","resizeEventHandler","scrollEventHandler","keyupEventHandler","keyCode","which","ignore","key","startFetch","keydownEventHandler","containerIsDisplayed","selectPrev","disableAutoSelect","selectNext","focusEventHandler","trigger","savedKeypressCounter","val","blurEventHandler","activeElement","position","focus","destroy","createBaseFormInput","altSelector","inputEl","errorParagraphEl","toggleEnable","attr","force","toggleAttribute","clearValue","setError","doClear","createSelectBox","onSelected","baseComponent","selectEl","disposableEvent","setValue","getValue","createFormInput","isCheckBox","checked","createPasswordFormInput","formInput","iconEl","onPasswordShowHideIconClick","addEvent","validatePassword","Number","minlength","resolve","password","cursor","createTextInputWithAutoComplete","onCloseDisposable","autoCompleteSearch","onOpen","onClose","renderTextContent","containerInsertPosition","containerClass","autocompleteResult","itemEl","insertAdjacentElement","onMouseDownEvent","initForm","formEl","alternativeButton","onSubmitForm","buttonSelector","submitOnEnter","validatorOptions","submitButtonEl","validator","createFormValidator","onKeyUpEvent","formElements","inputs","email","attributes","getNamedItem","maxLength","id","getInputs","keys","clearAll","clearValues","resetValidation","reset","validate","validations","all","onSubmit","data","formData","submitButton","getInputByName","disableForm","disableInput","setErrors","errors","scrollIntoView","behavior","block","clearInputs","names","clearInput","setValues","values","v","hideInput","form","classTo","errorClass","successClass","errorTextClass","errorTextParent","errorTextTag","onValidate","Pristine","createTruncate","opts","lineHeight","ceil","parseFloat","lines","shaveMoreOnContainer","shaveLessOnContainer","defaults","ellipsis","showMore","outerHTML","showLess","currentEl","eventTrackingMethod","openEventAction","truncate","expand","closeEventAction","collapse","Truncate","onInitEvent","updateConfig","newOpts","overrideDefault","updateContent","isValidTextWithoutAngleBrackets","test","isValidEmailAddress","punycode","toUnicode","isValidWithoutNonAlphaNumericCharsAtEnd","reg","elName","alsoAlsoAllowBracket","last","charAt","canNotContainOnlyNumerics","isValidOrderNumber","orderNr","isTempAccountEmail","createContactForm","thankYouEl","getTopicWithSubtopics","getSubtopic","submitData","topicDropdown","subtopicDropdown","suggestionCloseBt","submitBt","thankYouTitleEl","thankYouTextEl","suggestion","truncatedEls","disabled","closest","selectedIndex","counter","subtopics","newSubtopic","x","infoItem","every","suggestionText","shaveControlsContainer","ordernr","toggle","ordernrrequired","parentEl","showThankYou","contactForm","fileupload","toggleEnableDisableButton","fetchingPopupContent","createPopup","popupEl","isOpen","currentY","renderedDialogEl","closeOnClickOutsidePopup","onBeforeOpen","onBeforeClose","dialogId","view","forceRefresh","fromCache","closeOnEnter","openClass","close","p","marginTop","scroll","onKeyDownEvent","onCloseEvent","addOnClose","closeButton","popup","tempEl","replaceWith","temp","finally","create","openAsync","replaceContent","ShowContentDialog","openFunction","okButtonKey","addTitleCssClass","extraPopupCss","BodyLabel","TitleLabel","ExtraPopupCss","TitleCssClass","OkButtonLabel","subscribeAsync","appId","posId","lang","subscription","applicationId","pointOfSaleId","language","toggleSubscribeAsync","personId","newsletter","personalMessage","mailFrequency","postalMail","emarsysData","toggleSubscription","Gender","UpdateAccountResult","ChangePasswordStatus","OkResult","PageLogStyle","checkAccountValidityAsync","oldAccountId","newAccountId","CreateAndStartLoginWatcher","pageRequiresAuth","loginWatcher","createLoginWatcher","start","startingAccId","accountType","dialog","timer","openDialog","run","currentAccountId","alert","isValid","okButton","closeEventPopup","reload","cancel","stop","getFullQuerystring","pos","href","getParameters","pairs","params","pair","getParameter","required","queryStringParam","updateParameter","newAdditionalURL","tempArray","hash","additionalURL","baseURL","result","addParameter","createPageLog","descriptionEl","getClassesByPrefix","prefix","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","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","CurrentUrl","provider","Google","createGoogleLogin","loginCallback","Facebook","createFacebookLoginButton","externalLogin","successMsg","successmsg","includes","inline","history","replaceState","enableButton","Button","ButtonEl","enableAllButtons","Provider","gapiLoaded","googleLoginButtonEl","onInit","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","lineno","colno","msg","col","lastLoggedError","totalLoggedErrors","urlString","errorString","isArray","errorLogStrings","stack","exc","createCollapsable","singleOpen","swapTitleDataAttribute","titleElSelector","scrollIntoViewAfterOpen","contentSelector","OPEN_CLASS","titleEl","contentEl","origTitle","collapseTitle","innerText","closeWithBefore","openWithBefore","shouldScrollIntoView","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","closeFirstLevelMenuItemAndResetChildMenus","menuItem","closeAllSecondLevelMenuItemsAndResetChildMenus","secondLevelMenuEl","closeAllThirdLevelMenuItemsAndResetChildMenus","getOrLoadFirstLevelMenuItem","buttonEL","closeMenuOnMouseOut","itemKey","insertAdjacentHTML","buttonEls","nodeName","offsetLeft","initSecondLevelListeners","getOrLoadSecondLevelMenuItem","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","orderNumber","ordernumber","pvc","sku","orderStatus","orderstatus","createNotificationCenter","onMarkedAllAsReadDisposable","domParser","DOMParser","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","countDownTime","dateString","timeString","day","month","year","hour","minutes","seconds","toDate","interval","now","timeLeft","days","hours","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","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","leadTimesBarEl","openLeadTimesPopupAsync","click","topBarContainerEl","countdown","dayslabel","daylabel","barEls","myTopBar","otherTopBar","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","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","limitValue","replaceAll","vat","regexp","blacklist","list","regioncode","useHouseNumber","houseNumberEl","atStart","atEnd","passwordEl","HTMLInputElement","checkMobileAndSetCookie","header","initCollapsingPanels","showcountryselection","closeCountrySelectionPopup","toISOString","isbot","initFooterComponent","disableLeaveIntent","createParcel","getOrderDetails","orderDetails","findOrderForm","initState","useErrorLabelInPopup","popupDialogId","found","node","newParcelHtml","noOrderFoundLabel","parcelContainerEl","contactFormContainerEl","contactFormEl","contactThankYouEl","contactInfoEl","googleRecaptchaEnabled","recaptchaenabled","useEnterprise","recaptchaenterpriseenabled","TopicIndex","topicIndex","subtopicIndex","SubtopicIndex","SessionId","Filename","submitContactForm","token","firstname","lastname","phone","subTopicIndex","siteKey","sitekey","grecaptcha","enterprise","execute","Ordernumber","createContactFormEl","ready","phoneLinkEl","emailLinkEl","faqLink"],"mappings":"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"}