{"version":3,"file":"generalpage.min.js","sources":["../../../../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/services/logger-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/cookie.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/html.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/button.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/collapsable.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/external/autocomplete.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/disposable.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form-input.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/account-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/querystring.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/events.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/validation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/newsletter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/device.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/debounce.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/components/popup-new.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/content-dialog.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/usp.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/guid.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/customslider.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/skeleton.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/video-player.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/show-more-elements.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/dom-tree.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/filter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/highlighted-tiles.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/image-description.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/filters/checkboxFilter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/filters/colorFilter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/filters/rangeFilter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/organisms/filters.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/product-grid.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/truncate.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/homepage-elements.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/promotion-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/faq.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/pages/generalpage.ts"],"sourcesContent":["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","import {IErrorLog, postRequest} from \"../utils/fetch\";\r\nimport {escapeForJavascript} from \"../utils/string\";\r\n\r\nexport function logErrorEvent(event: Event): boolean {\r\n\tconst errorEv = event as ErrorEvent;\r\n\treturn logError(errorEv.message, errorEv.filename, errorEv.lineno, errorEv.colno, errorEv.error);\r\n}\r\n\r\nexport function logError(msg: string, url?: string, line?: number, col?: number, error?: Error, process?: string): boolean {\r\n\tconst lastLoggedError = [\"\", \"\", \"\", 0];\r\n\tlet totalLoggedErrors = 0;\r\n\r\n\ttry {\r\n\t\t// Empty URLs, this is a browser issue or cross domain error (external JS files)\r\n\t\tif (!url && !line) return;\r\n\r\n\t\t/* For not log all errors in .net core except from line above\r\n\t\tif (msg && msg === \"Error loading script\" && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg === \"Script error.\" && line === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg === \"Script error\" && line === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Other specific errors\r\n\t\tif (msg && msg.toString().indexOf(\"EBCallBackMessageReceived\") >= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"NPObject\") >= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"cX\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"google_trackConversion\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"ma_track\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t} */\r\n\r\n\t\tlet urlString = \"\";\r\n\t\tlet errorString = \"\";\r\n\r\n\t\t// Simple URLs that give errors out of our control, Ignore keys\r\n\t\tif (Array.isArray(window.errorLogStrings) && Array.isArray(window.errorLogStrings['Ignore']) && !(!window.errorLogStrings['Ignore'].length)) {\r\n\t\t\tfor (let i = 0; i < window.errorLogStrings['Ignore'].length; i++) {\r\n\t\t\t\turlString = window.errorLogStrings['Ignore'][i][1];\r\n\t\t\t\terrorString = window.errorLogStrings['Ignore'][i][2];\r\n\r\n\t\t\t\t// check if both errorLogString values are filled\r\n\t\t\t\tif (url && msg && urlString !== \"\" && errorString !== \"\") {\r\n\t\t\t\t\tif (url.indexOf(urlString) >= 0 && msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// check if url contains urlString or if msg contains errorString\r\n\t\t\t\tif (url && urlString !== \"\") {\r\n\t\t\t\t\tif (url.indexOf(urlString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (msg && errorString !== \"\") {\r\n\t\t\t\t\tif (msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (lastLoggedError[0] === msg && lastLoggedError[1] === url && lastLoggedError[2] === line) {\r\n\t\t\tlet val = +lastLoggedError[3];\r\n\t\t\tlastLoggedError[3] = val++;\r\n\t\t} else {\r\n\t\t\tlastLoggedError[0] = msg.toString();\r\n\t\t\tlastLoggedError[1] = url;\r\n\t\t\tlastLoggedError[2] = line;\r\n\t\t\tlastLoggedError[3] = 1;\r\n\t\t}\r\n\r\n\t\tif (totalLoggedErrors < 10 && lastLoggedError[3] <= 3) {\r\n\t\t\ttotalLoggedErrors++;\r\n\t\t\tprocess = process || 'Browser';\r\n\t\t\tfor (const key in window.errorLogStrings) {\r\n\t\t\t\t// Only handle keys !== Ignore\r\n\t\t\t\tif (key !== \"Ignore\") {\r\n\t\t\t\t\tfor (let i = 0; i < window.errorLogStrings[key].length; i++) {\r\n\r\n\t\t\t\t\t\turlString = window.errorLogStrings[key][i][1];\r\n\t\t\t\t\t\terrorString = window.errorLogStrings[key][i][2];\r\n\r\n\t\t\t\t\t\t// check if both errorLogString values are filled\r\n\t\t\t\t\t\tif (url && msg && urlString !== \"\" && errorString !== \"\") {\r\n\t\t\t\t\t\t\tif (url.indexOf(urlString) >= 0 && msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// check if url contains urlString or if msg contains errorString\r\n\t\t\t\t\t\t\tif (url && urlString !== \"\") {\r\n\t\t\t\t\t\t\t\tif (url.indexOf(urlString) >= 0) {\r\n\t\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (msg !== null && errorString !== \"\") {\r\n\t\t\t\t\t\t\t\tif (msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (error && error.stack)\r\n\t\t\t\tmsg += \"\\n\\nStacktrace: \\n\" + error.stack;\r\n\r\n\t\t\tconst errorLog: IErrorLog = {\r\n\t\t\t\tline: line,\r\n\t\t\t\tmessage: escapeForJavascript(msg),\r\n\t\t\t\tprocess: process,\r\n\t\t\t\turl: url\r\n\t\t\t};\r\n\r\n\t\t\tpostRequest(\"/api/v1/ApplicationService.svc/json/LogJavascriptError\", errorLog, {headers: new Headers({'Content-type': 'application/json; charset=utf-8'})}).then(res => {\r\n\t\t\t\t//ts-gitignore\r\n\t\t\t});\r\n\t\t}\r\n\t} catch (exc) {\r\n\t\t//ts-gitignore\r\n\t}\r\n\treturn false;\r\n}\r\n","export function 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 {IDisposable} from \"../utils/disposable\";\r\n\r\nexport function expressQuerySelector(el: Element | Document, selectors: T, isRequired: true): HTMLElementTagNameMap[T];\r\nexport function expressQuerySelector(el: Element | Document, selectors: T, isRequired?: boolean): HTMLElementTagNameMap[T] | null;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired: true): T;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired?: boolean): T | null;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired = false): T | null {\r\n\tconst resultEl = el.querySelector(selectors);\r\n\tif (isRequired && !resultEl) throw new Error(\"querySelector didn't return any results for: \" + selectors);\r\n\treturn resultEl;\r\n}\r\n\r\n/* Use the default js scrollIntoView => this code was created for IE if I remember correctly\r\nexport interface IScrollIntoViewOptions {\r\n\treadonly vertical?: 'center' | 'top' | 'bottom'; // TODO: implement bottom, top\r\n\treadonly behavior?: 'auto' | 'smooth';\r\n}\r\n\r\nexport function scrollIntoView(el: HTMLElement, options: IScrollIntoViewOptions = {}) {\r\n\tconst d = document;\r\n\tconst w = window;\r\n\tconst scrollAlignment = {\"top\": 0, \"center\": 0.5, \"bottom\": 1};\r\n\tconst {vertical = 'center', behavior = 'smooth'} = options;\r\n\tconst alignment = {y: scrollAlignment[vertical]};\r\n\r\n\tconst hasScrollableSpace = (el: Element) => el.clientHeight < el.scrollHeight;\r\n\r\n\tconst canOverflow = (el: Element) => {\r\n\t\tconst overflowValue = w.getComputedStyle(el, null)['overflow' + 'Y'];\r\n\t\treturn overflowValue === 'auto' || overflowValue === 'scroll';\r\n\t};\r\n\r\n\tconst isScrollable = (el: Element) => hasScrollableSpace(el) && canOverflow(el);\r\n\r\n\tconst findScrollableParent = (el: Element) => {\r\n\t\twhile (el !== d.body && isScrollable(el) === false) {\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t};\r\n\r\n\tconst scrollableParent = findScrollableParent(el);\r\n\tconst clientRect = el.getBoundingClientRect();\r\n\tconst parentRect = scrollableParent.getBoundingClientRect();\r\n\tconst y = clientRect.top - parentRect.top - scrollableParent.scrollTop + ((parentRect.height - el.offsetHeight) * alignment.y);\r\n\r\n\tif (scrollableParent !== d.body) {\r\n\t\t'scrollBehavior' in document.documentElement.style\r\n\t\t\t? scrollableParent.scroll({\r\n\t\t\t\ttop: y,\r\n\t\t\t\tbehavior,\r\n\t\t\t})\r\n\t\t\t: scrollableParent.scrollTop = y; // IE: scroll on element not supported\r\n\r\n\t} else {\r\n\t\tconst windowSize = getWindowSize();\r\n\t\tconst y = Math.round(window.pageYOffset + clientRect.top - (windowSize.height - el.offsetHeight) * alignment.y);\r\n\t\t'scrollBehavior' in document.documentElement.style\r\n\t\t\t? window.scroll({\r\n\t\t\t\ttop: y,\r\n\t\t\t\tbehavior,\r\n\t\t\t})\r\n\t\t\t: window.scroll(0, y); // IE: scroll options not supported\r\n\t}\r\n}*/\r\n\r\nexport function getWindowSize() {\r\n\tconst w = window;\r\n\tconst d = document;\r\n\tconst e = d.documentElement;\r\n\tconst g = d.body;\r\n\tconst x = w.innerWidth || e.clientWidth || g.clientWidth;\r\n\tconst y = w.innerHeight || e.clientHeight || g.clientHeight;\r\n\r\n\treturn {width: x, height: y};\r\n}\r\n\r\nexport function hasClass(element: HTMLElement, cssClass: string): boolean {\r\n\tconst regex = new RegExp('(?:^|\\\\s)' + cssClass + '(?!\\\\S)');\r\n\tconst match = element.className.match(regex);\r\n\treturn !!match && !!match.length;\r\n}\r\n\r\nexport function expressEventListener(element: any, type: string, listener: (ev: any) => T, useCapture?: boolean): IDisposable {\r\n\tconst disposable = {\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.handler) { // Prevent unregistering twice\r\n\t\t\t\telement.removeEventListener(disposable.type, disposable.handler, useCapture);\r\n\t\t\t\tdelete disposable.handler;\r\n\t\t\t}\r\n\t\t},\r\n\t\thandler: (ev: any): T => {\r\n\t\t\treturn listener(ev);\r\n\t\t},\r\n\t\ttype\r\n\t};\r\n\r\n\telement.addEventListener(disposable.type, disposable.handler, useCapture);\r\n\r\n\treturn disposable;\r\n}\r\n\r\nexport function expressQuerySelectorAll(el: Element | Document | DocumentFragment, selectors: string): T[] {\r\n\treturn el ? [].slice.call(el.querySelectorAll(selectors)) : [];\r\n}\r\n\r\nexport function expressAddClass(element: HTMLElement, cssClass) {\r\n\texpressToggleClass(element, cssClass, true);\r\n}\r\n\r\nexport function expressRemoveClass(element: HTMLElement, cssClass) {\r\n\texpressToggleClass(element, cssClass, false);\r\n}\r\n\r\nexport function expressToggleClass(element: HTMLElement, cssClass: string, on: boolean) {\r\n\tconst regex = new RegExp('(?:^|\\\\s)' + cssClass + '(?!\\\\S)');\r\n\r\n\tconst hasClass = element.className.match(regex);\r\n\tif (hasClass && !on) {\r\n\t\telement.className = element.className.replace(new RegExp(regex.source, \"g\"), '');\r\n\t} else if (!hasClass && on) {\r\n\t\telement.className += \" \" + cssClass;\r\n\t}\r\n}\r\n\r\nexport function show(el: HTMLElement) {\r\n\tif (el.offsetParent === null) { // is el visible in dom?\r\n\t\tif (el.style.display === 'none') { // check style attribute\r\n\t\t\tel.style.display = '';\r\n\t\t} else {\r\n\t\t\tif (getComputedStyle(el).display === 'none') { // el not visible -> check css display -> force display block\r\n\t\t\t\tel.style.display = 'block';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function hide(el: HTMLElement) {\r\n\tel.style.display = 'none';\r\n}\r\n\r\nexport function getHeightWithMargins(el: HTMLElement): number {\r\n\treturn el.getBoundingClientRect().height\r\n\t\t+ parseInt(window.getComputedStyle(el).marginTop || \"0\", 10)\r\n\t\t+ parseInt(window.getComputedStyle(el).marginBottom || \"0\", 10);\r\n}\r\n\r\nexport function getParentWithClassName(el: Element | null, className: string): T | null {\r\n\tif (el)\r\n\t\tel = el.parentElement;\r\n\r\n\twhile (el) {\r\n\t\tif (el.classList.contains(className))\r\n\t\t\treturn el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getSelfOrParentWithClassName(el: Element | null, className: string): T | null {\r\n\tif (!el) return null;\r\n\tif (el.classList && el.classList.contains(className))\r\n\t\treturn el;\r\n\treturn getParentWithClassName(el, className);\r\n}\r\n\r\nexport function getNextSiblingWithClassName(el: Element | null, className: string): T | null {\r\n\tif (el)\r\n\t\tel = el.nextElementSibling;\r\n\r\n\twhile (el) {\r\n\t\tif (el.classList.contains(className))\r\n\t\t\treturn el;\r\n\t\tel = el.nextElementSibling;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getParentWithId(el: Element | null, id: string): T | null {\r\n\tif (el)\r\n\t\tel = el.parentElement;\r\n\r\n\twhile (el) {\r\n\t\tif (el.id === id)\r\n\t\t\treturn el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getParents (elem, selector?) {\r\n\tif (!Element.prototype.matches) {\r\n\t\tElement.prototype.matches =\r\n\t\t\tElement.prototype.webkitMatchesSelector ||\r\n\t\t\tfunction(s) {\r\n\t\t\t\tconst matches = (this.document || this.ownerDocument).querySelectorAll(s);\r\n\t\t\t\tlet i = matches.length;\r\n\t\t\t\twhile (--i >= 0 && matches.item(i) !== this) {\r\n\t\t\t\t\t//\r\n\t\t\t\t}\r\n\t\t\t\treturn i > -1;\r\n\t\t\t};\r\n\t}\r\n\t// We check on the parents of an element => select the first parent\r\n\telem = elem.parentNode;\r\n\tconst parents = [];\r\n\tfor ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n\t\tif (selector) {\r\n\t\t\tif (elem.matches(selector)) {\r\n\t\t\t\tparents.push(elem);\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tparents.push(elem);\r\n\t}\r\n\treturn parents;\r\n\r\n}\r\n\r\nexport function htmlToElement(html): ChildNode {\r\n\tconst template = document.createElement('template');\r\n\thtml = html.trim(); // Never return a text node of whitespace as the result\r\n\ttemplate.innerHTML = html;\r\n\treturn template.content.firstChild;\r\n}\r\n\r\nexport function isMobileOnPageWithHeader() {\r\n\treturn isElementVisible(\r\n\t\texpressQuerySelector(\r\n\t\t\tdocument,\r\n\t\t\t'.o-main-navigation__hamburger-button',\r\n\t\t\tfalse\r\n\t\t)\r\n\t);\r\n}\r\n\r\nexport function isElementVisible(el: HTMLElement) {\r\n\treturn !(el.offsetWidth\r\n\t\t+ el.offsetHeight\r\n\t\t+ el.getBoundingClientRect().height\r\n\t\t+ el.getBoundingClientRect().width === 0);\r\n}\r\n\r\nexport function isElementVisibleInViewPort(el: HTMLElement): boolean {\r\n\tif (!el) return false; // return default\r\n\tconst rect = el.getBoundingClientRect();\r\n\r\n\treturn rect.top >= 0\r\n\t\t&& rect.left >= 0\r\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\r\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth);\r\n}\r\n\r\nexport function isElementPartiallyVisibleInViewport(el, percentVisible) {\r\n\tif (!el) return false;\r\n\tconst rect = el.getBoundingClientRect();\r\n\tconst windowHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n\treturn !(\r\n\t\tMath.floor(100 - (((rect.top >= 0 ? 0 : rect.top) / +-rect.height) * 100)) < percentVisible ||\r\n\t\tMath.floor(100 - ((rect.bottom - windowHeight) / rect.height) * 100) < percentVisible\r\n\t);\r\n}\r\n\r\nexport function remove(el: Element) {\r\n\tif (el.parentElement) el.parentElement.removeChild(el);\r\n}\r\n\r\nlet inViewArray: { element: HTMLElement; callBack: IInViewCallback; }[];\r\n\r\ninterface IInViewCallback {\r\n\t(element: HTMLElement): void;\r\n}\r\n\r\n// Can be replaced with a intersection observer with threshold = 1\r\nexport function inViewTrigger(element: HTMLElement, callBack: IInViewCallback) {\r\n\tconst inViewScrollHandler = () => {\r\n\t\t// What does in view mean? We assume people are scrolling down, so if BOTTOM of the element is in view -> the element has been in view!\r\n\t\tfor (let i = inViewArray.length - 1; i >= 0; i--) {\r\n\t\t\tconst { element, callBack } = inViewArray[i];\r\n\r\n\t\t\tconst windowHeight = window.innerHeight;\r\n\t\t\tconst scrollY = window.scrollY || window.pageYOffset;\r\n\t\t\tconst scrollPosition = scrollY + windowHeight;\r\n\r\n\t\t\tconst elementHeight = element.clientHeight;\r\n\t\t\tconst elementPosition = element.getBoundingClientRect().top + scrollY + elementHeight;\r\n\r\n\t\t\tif (scrollPosition > elementPosition) {\r\n\t\t\t\tcallBack(element);\r\n\t\t\t\tinViewArray.splice(i, 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (inViewArray.length === 0) {\r\n\t\t\t// I no longer need myself! Cleanup....\r\n\t\t\tdocument.removeEventListener('scroll', inViewScrollHandler);\r\n\t\t}\r\n\t};\r\n\r\n\t// We should only have 1 scroll event listener that checks all elements that want to use this feature.\r\n\tif (!inViewArray || inViewArray.length === 0) {\r\n\t\tinViewArray = [];\r\n\t\tdocument.addEventListener('scroll', inViewScrollHandler);\r\n\t}\r\n\r\n\tinViewArray.push({ element, callBack });\r\n\r\n\t// Do 1 check without scrolling -> items might already be completely in view\r\n\tinViewScrollHandler();\r\n}\r\n\r\nexport function disableUserEvents(): IDisposable {\r\n\tconst eventsToBlock = [\"click\", \"keydown\", \"keyup\", \"mouseenter\", \"mouseleave\", \"focus\"];\r\n\r\n\tconst disposable = {\r\n\t\tblockingEvents: eventsToBlock.map((event) => expressEventListener(window, event, (e) => blockEvent(e), true)),\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.blockingEvents) {\r\n\t\t\t\tdisposable.blockingEvents.forEach((blockedEvent) => blockedEvent.dispose());\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\treturn disposable;\r\n}\r\n\r\nconst blockEvent = (event: Event): void => {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n};\r\n\r\nexport const pageVisibilityChange = (onVisible?: () => void | undefined, onHidden?: () => void | undefined) => {\r\n\tif (!onVisible && !onHidden)\r\n\t\treturn;\r\n\r\n\tlet hidden: string, visibilityState: string, visibilityChange: string;\r\n\r\n\tif (typeof document.hidden !== \"undefined\") {\r\n\t\thidden = \"hidden\"; visibilityChange = \"visibilitychange\"; visibilityState = \"visibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.mozHidden !== \"undefined\") {\r\n\t\thidden = \"mozHidden\"; visibilityChange = \"mozvisibilitychange\"; visibilityState = \"mozVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.msHidden !== \"undefined\") {\r\n\t\thidden = \"msHidden\"; visibilityChange = \"msvisibilitychange\"; visibilityState = \"msVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.webkitHidden !== \"undefined\") {\r\n\t\thidden = \"webkitHidden\"; visibilityChange = \"webkitvisibilitychange\"; visibilityState = \"webkitVisibilityState\";\r\n\t}\r\n\r\n\tif (typeof document.addEventListener === \"undefined\" || typeof hidden === \"undefined\") {\r\n\t\t// not supported\r\n\t} else {\r\n\t\texpressEventListener(document, visibilityChange, () => {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tswitch (document[visibilityState]) {\r\n\t\t\t\t\tcase \"visible\":\r\n\t\t\t\t\t\tonVisible && onVisible();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"hidden\":\r\n\t\t\t\t\t\tonHidden && onHidden();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}, 0);\r\n\t\t}, false);\r\n\t}\r\n};\r\n","import {expressEventListener, expressRemoveClass, expressAddClass} from '../common/html';\r\nimport {IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface ICreateClickableOptions {\r\n\treadonly enable?: () => void;\r\n\treadonly disable?: () => void;\r\n}\r\n\r\nexport interface IButton {\r\n\treadonly dispose: () => void;\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n}\r\n\r\nexport function createClickableElement(el: HTMLElement, onClick?: () => Promise, options: ICreateClickableOptions = {}) {\r\n\tlet clickEvent: IDisposable;\r\n\tconst {enable, disable} = options;\r\n\r\n\tconst onClicked = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tif (onClick) {\r\n\t\t\tdispose();\r\n\t\t\tdisable && disable();\r\n\t\t\tonClick()\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tenable && enable();\r\n\t\t\t\t\taddClickEvent();\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst addClickEvent = () => {\r\n\t\tclickEvent = expressEventListener(el, 'click', onClicked);\r\n\t};\r\n\r\n\tconst dispose = () => clickEvent.dispose();\r\n\r\n\taddClickEvent();\r\n\r\n\treturn {\r\n\t\taddClickEvent,\r\n\t\tdispose\r\n\t};\r\n}\r\n\r\nexport function createButton(buttonEl: HTMLButtonElement, onClick?: () => Promise): IButton {\r\n\tconst enable = () => { // add component specific classes\r\n\t\texpressRemoveClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.removeAttribute(\"disabled\");\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\texpressAddClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.setAttribute(\"disabled\", \"disabled\");\r\n\t};\r\n\r\n\tconst button = createClickableElement(\r\n\t\tbuttonEl,\r\n\t\tonClick,\r\n\t\t{\r\n\t\t\tenable,\r\n\t\t\tdisable\r\n\t\t}\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tenable,\r\n\t\tdisable\r\n\t};\r\n}\r\n","import {expressQuerySelector, expressQuerySelectorAll, hasClass, isElementVisibleInViewPort} from '../common/html';\r\nimport { createClickableElement } from './button';\r\n\r\nexport interface ICreateCollapsableOptions {\r\n\treadonly singleOpen?: boolean;\r\n\treadonly swapTitleDataAttribute?: string;\r\n}\r\n\r\nexport interface ICreateCollapsableDependencies {\r\n\tonInit?: (container: HTMLElement) => Promise;\r\n\tonBeforeOpen?: (container: HTMLElement) => Promise;\r\n\treadonly onBeforeClose?: (container: HTMLElement) => Promise;\r\n\treadonly titleElSelector?: string;\r\n\treadonly scrollIntoViewAfterOpen: boolean;\r\n\treadonly contentSelector?: string;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nexport interface ICollapsibleContentRequest {\r\n\treadonly type: string;\r\n\treadonly theme: string;\r\n}\r\n\r\nexport interface ICollapsable {\r\n\tdispose(): void;\r\n\tshow(): void;\r\n\tclose(): void;\r\n\thide(): void;\r\n\topen(scrollIntoView?: boolean): void;\r\n\telement: HTMLElement;\r\n}\r\n\r\nexport function createCollapsable(container: HTMLElement, deps?: ICreateCollapsableDependencies, opts?: ICreateCollapsableOptions): ICollapsable {\r\n\tconst { singleOpen, swapTitleDataAttribute } = opts || {};\r\n\tconst { onInit, onBeforeOpen, onBeforeClose, titleElSelector, scrollIntoViewAfterOpen, contentSelector, openClass } = deps || {};\r\n\tconst OPEN_CLASS = openClass ? openClass : \"is-collapse-open\";\r\n\tconst titleEl = expressQuerySelector(container, titleElSelector ? titleElSelector : '.technical-collapsable-title', true);\r\n\tconst contentEl = expressQuerySelector(container, contentSelector ? contentSelector : '.technical-collapse-content', false);\r\n\tlet origTitle: string;\r\n\tlet collapseTitle: string;\r\n\tif (swapTitleDataAttribute) {\r\n\t\torigTitle = titleEl.innerText;\r\n\t\tcollapseTitle = swapTitleDataAttribute ? container.getAttribute(swapTitleDataAttribute) : null;\r\n\t}\r\n\tconst closeWithBefore = async () => {\r\n\t\tif (!onBeforeClose) {\r\n\t\t\tclose();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeClose(container);\r\n\t\treturn close();\r\n\t};\r\n\r\n\tconst openWithBefore = async (scrollIntoView = false) => {\r\n\t\tif (!onBeforeOpen) {\r\n\t\t\topen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeOpen(container);\r\n\t\treturn open(scrollIntoView);\r\n\t};\r\n\r\n\tconst close = () => {\r\n\t\tif (swapTitleDataAttribute && origTitle && titleEl.innerText !== origTitle) {\r\n\t\t\ttitleEl.innerText = origTitle;\r\n\t\t}\r\n\t\tcontainer.classList.remove(OPEN_CLASS);\r\n\t};\r\n\tconst open = (shouldScrollIntoView?: boolean) => {\r\n\t\tif (singleOpen) {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(container.parentElement, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => el.classList.remove(OPEN_CLASS));\r\n\t\t}\r\n\t\tif (swapTitleDataAttribute && titleEl.innerText !== collapseTitle) {\r\n\t\t\ttitleEl.innerText = collapseTitle;\r\n\t\t}\r\n\t\tcontainer.classList.add(OPEN_CLASS);\r\n\t\tif ((scrollIntoViewAfterOpen && !isElementVisibleInViewPort(contentEl)) || shouldScrollIntoView)\r\n\t\t\ttitleEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n\t};\r\n\r\n\tconst isOpen = () => hasClass(container, OPEN_CLASS);\r\n\r\n\tconst onClick = () => !isOpen() ? openWithBefore() : closeWithBefore();\r\n\r\n\tconst button = createClickableElement(titleEl, onClick);\r\n\r\n\tonInit && onInit(container);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tshow: () => container.classList.remove('u-hide'),\r\n\t\thide: () => container.classList.add('u-hide'),\r\n\t\tclose,\r\n\t\topen: (scrollIntoView?: boolean) => openWithBefore(scrollIntoView),\r\n\t\telement: container\r\n\t} as ICollapsable;\r\n}\r\n","/*\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","export interface IDisposable {\r\n\tdispose: () => void;\r\n\tadd?: (addDisposable: IDisposable) => void;\r\n\taddMany?: (addDisposables: IDisposable[]) => void;\r\n}\r\n\r\n/** Returns a composite disposable (disposing all child disposables) */\r\nexport function compositeDisposable(disposables: IDisposable[] | undefined): IDisposable {\r\n\t// TODO: This creates a closure, optimize?\r\n\tconst dispose = (): void => {\r\n\t\tif (composite) {\r\n\t\t\t// To avoid endless loops when calling dispose on the composite again, we first clear it.\r\n\t\t\tcomposite = null;\r\n\t\t\tif (disposables) disposables.forEach(d => d.dispose());\r\n\t\t}\r\n\t};\r\n\tconst addMany = (addDisposables: IDisposable[]): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(...addDisposables);\r\n\t};\r\n\tconst add = (addDisposable: IDisposable): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(addDisposable);\r\n\t};\r\n\tlet composite: IDisposable | null = { dispose, add, addMany };\r\n\treturn composite;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\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 { 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 { expressEventListener, expressQuerySelector, getParentWithClassName } from \"../common/html\";\r\nimport { createButton } from \"./button\";\r\nimport { createFormInput, createPasswordFormInput, createSelectBox, IFormInput, IPasswordInput, ISelectBox } from \"./form-input\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\n\r\n\r\nexport interface IInitFormDependencies {\r\n\treadonly alternativeButton?: HTMLButtonElement;\r\n\treadonly buttonSelector?: string;\r\n\treadonly onSubmitForm: (data: { [inputName: string]: string }) => Promise;\r\n\treadonly submitOnEnter?: boolean;\r\n\treadonly validatorOptions?: ICreateFromValidatorOptions;\r\n}\r\n\r\n// provide custom behaviour\r\nexport interface ICreateFromValidatorOptions {\r\n\treadonly classTo?: string; // class of the parent element where the error/success class is added\r\n\treadonly errorClass?: string;\r\n\treadonly successClass?: string;\r\n\treadonly errorTextParent?: string; // class of the parent element where error text element is appended\r\n\treadonly errorTextTag?: string; // type of element to create for the error text\r\n\treadonly errorTextClass?: string; // class of the error text element\r\n\treadonly onValidate?: () => void;\r\n}\r\n\r\nexport interface IFormValidator {\r\n\treadonly validate: () => boolean;\r\n\treadonly reset: () => void;\r\n}\r\n\r\nexport interface IForm {\r\n\treadonly dispose: () => void;\r\n\treadonly disableForm: (disable: boolean) => void;\r\n\treadonly disableInput: (name: string) => void;\r\n\treadonly validate: () => Promise;\r\n\treadonly setErrors: (clear?: boolean, ...errors: { name: string, error: string }[]) => void;\r\n\treadonly clearInputs: (clearValue?: boolean, ...names: string[]) => void;\r\n\treadonly clearAll: () => void;\r\n\treadonly setValues: (...values: { name: string, value: string }[]) => void;\r\n\treadonly hideInput: (name: string) => void;\r\n\treadonly inputs: { [p: string]: ISelectBox | IFormInput }\r\n}\r\n\r\nexport function initForm(formEl: HTMLFormElement, deps: IInitFormDependencies) {\r\n\tconst {\r\n\t\talternativeButton,\r\n\t\tonSubmitForm,\r\n\t\tbuttonSelector,\r\n\t\tsubmitOnEnter,\r\n\t\tvalidatorOptions,\r\n\t} = deps;\r\n\tconst submitButtonEl = alternativeButton || expressQuerySelector(formEl, buttonSelector || '.m-form__button-continue', true);\r\n\tconst validator = createFormValidator(formEl, validatorOptions);\r\n\tlet onKeyUpEvent: IDisposable;\r\n\tconst formElements = [].slice.call(formEl.elements);\r\n\tconst inputs: { [name: string]: ISelectBox | IFormInput; } = {};\r\n\r\n\tformElements\r\n\t\t.filter(el => !el.matches(\"button\"))\r\n\t\t.forEach(el => {\r\n\t\t\t// The element can be : INPUT (regular or password), TEXTAREA, SELECT,\r\n\t\t\tlet input: ISelectBox | IFormInput | null = null;\r\n\t\t\tconst email = el.attributes.getNamedItem(\"email\");\r\n\t\t\tif ((email && email.value === \"email\") || el.type === \"email\")\r\n\t\t\t\tel.maxLength = 100;\r\n\r\n\t\t\tif (el.classList.contains('a-form-input__select'))\r\n\t\t\t\tinput = createSelectBox(getParentWithClassName(el, 'a-form-input')!);\r\n\t\t\telse if (el.classList.contains('a-form-input__input'))\r\n\t\t\t\tinput = el.type === \"password\" ? createPasswordFormInput(getParentWithClassName(el, 'a-form-input')!) : createFormInput(getParentWithClassName(el, 'a-form-input')!);\r\n\r\n\t\t\t// If not those 3, it's something else -> leave it alone\r\n\t\t\tif (input)\r\n\t\t\t\tinputs[input.inputEl.id.toLowerCase()] = input;\r\n\t\t});\r\n\r\n\tconst getInputs = () => Object.keys(inputs).map(key => inputs[key]);\r\n\r\n\tconst clearAll = (clearValues = false) => {\r\n\t\tgetInputs()\r\n\t\t\t.map(input => {\r\n\t\t\t\tinput.clear(clearValues);\r\n\t\t\t\tinput.setError('', true);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst resetValidation = () => {\r\n\t\tclearAll();\r\n\t\tvalidator.reset();\r\n\t};\r\n\r\n\tconst validate = async (): Promise => {\r\n\t\tresetValidation();\r\n\r\n\t\t// Pristine validation cannot handle async api calls\r\n\t\t// Call the validation before the pristine call\r\n\t\t// So pristine can look at dataattributes to valiate\r\n\t\tconst validations = Object.keys(inputs)\r\n\t\t\t.map(name => !inputs[name]['validatePassword'] ? Promise.resolve(true) : (inputs[name] as IPasswordInput).validatePassword());\r\n\t\tawait Promise.all(validations);\r\n\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\tconst formData = () => {\r\n\t\tconst data: { [name: string]: string } = {};\r\n\t\tObject.keys(inputs).forEach(name => data[name] = inputs[name].getValue().toString() || \"\");\r\n\t\treturn data;\r\n\t};\r\n\r\n\tconst onSubmit = () => {\r\n\t\treturn validate().then(res => res ? onSubmitForm(formData()) : Promise.resolve());\r\n\t};\r\n\r\n\tconst submitButton = createButton(submitButtonEl, onSubmit);\r\n\r\n\tif (submitOnEnter && submitButtonEl && submitButtonEl.type.toLowerCase() !== \"submit\") {\r\n\t\tonKeyUpEvent = expressEventListener(\r\n\t\t\tformEl,\r\n\t\t\t'keypress',\r\n\t\t\t(ev: KeyboardEvent) => {\r\n\t\t\t\tif (ev.key === \"Enter\" || ev.keyCode === 13) {\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tonSubmit();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tconst getInputByName: (name: string) => ISelectBox | IFormInput | undefined =\r\n\t\t(name: string) => inputs[name.toLowerCase()];\r\n\r\n\tconst dispose = () => {\r\n\t\tclearAll(true);\r\n\t\tsubmitButton.dispose();\r\n\t\tonKeyUpEvent && onKeyUpEvent.dispose();\r\n\t};\r\n\r\n\tconst toggleSubmitButton = (enable: boolean) => enable ? submitButton.enable() : submitButton.disable();\r\n\r\n\tconst setError = (name: string, error: string, clear = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setError(error, clear);\r\n\t};\r\n\r\n\tconst setErrors = (clear = false, ...errors: { name: string, error: string }[]) => {\r\n\t\terrors.forEach(e => setError(e.name, e.error, clear));\r\n\t\tif (errors.length) {\r\n\t\t\tconst input = getInputByName(errors[0].name);\r\n\t\t\tif (input) input.inputEl.parentElement!.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n\t\t}\r\n\t};\r\n\r\n\tconst clearInput = (name: string, clearValue = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.clear(clearValue);\r\n\t};\r\n\r\n\tconst clearInputs = (clearValue = false, ...names: string[]) => names.forEach(name => clearInput(name, clearValue));\r\n\r\n\tconst disableForm = (disable: boolean) => {\r\n\t\tgetInputs().map(i => disable ? i.disable() : i.enable());\r\n\t\tresetValidation();\r\n\t\ttoggleSubmitButton(!disable);\r\n\t};\r\n\r\n\tconst disableInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.disable();\r\n\t};\r\n\r\n\tconst setValue = (name: string, value: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setValue(value);\r\n\t};\r\n\r\n\tconst setValues = (...values: { name: string, value: string }[]) =>\r\n\t\tvalues.filter(v => getInputByName(v.name))\r\n\t\t\t.forEach(v => setValue(v.name, v.value));\r\n\r\n\tconst hideInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.hide();\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tdisableForm,\r\n\t\tdisableInput,\r\n\t\tvalidate,\r\n\t\tsetErrors,\r\n\t\tclearInputs,\r\n\t\tclearAll: () => clearAll(true),\r\n\t\tsetValues,\r\n\t\thideInput,\r\n\t\tinputs\r\n\t} as IForm;\r\n}\r\n\r\nexport function createFormValidator(form: HTMLFormElement, options: ICreateFromValidatorOptions = {}): IFormValidator {\r\n\r\n\tconst {\r\n\t\tclassTo = \"a-form-input\",\r\n\t\terrorClass = \"a-form-input--error\",\r\n\t\tsuccessClass = \"a-form-input--validated\",\r\n\t\terrorTextClass = \"a-form-input__error-text\",\r\n\t\terrorTextParent = \"a-form-input\",\r\n\t\terrorTextTag = \"p\",\r\n\t\tonValidate\r\n\t} = options;\r\n\r\n\tconst config: config = {\r\n\t\tclassTo: classTo,\r\n\t\terrorClass: errorClass,\r\n\t\tsuccessClass: successClass,\r\n\t\terrorTextClass: errorTextClass,\r\n\t\terrorTextParent: errorTextParent,\r\n\t\terrorTextTag: errorTextTag\r\n\t};\r\n\r\n\tconst validator = new Pristine(form, config, false);\r\n\tconst validate = () => {\r\n\t\tif (onValidate) onValidate();\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\treturn {\r\n\t\tvalidate,\r\n\t\treset: () => validator.reset()\r\n\t};\r\n}\r\n","export function getFullQuerystring(url?: string): string {\r\n\turl = url || window.location.href;\r\n\tconst pos = url.indexOf(\"?\");\r\n\tif (pos > -1) {\r\n\t\treturn url.substring(pos + 1);\r\n\t} else {\r\n\t\treturn url;\r\n\t}\r\n}\r\n\r\nexport function getParameters(url?: string): { [key: string]: string } {\r\n\tconst queryString = getFullQuerystring(url);\r\n\t// remove hash parameter and split querystring param\r\n\tconst pairs = queryString.split('#')[0].split(\"&\");\r\n\tconst params: { [key: string]: string } = {};\r\n\tfor (const pair of pairs) {\r\n\t\tconst [key, value] = pair.split(\"=\");\r\n\t\tparams[key.toLowerCase()] = value !== undefined ? value : \"true\"; // Providing just the key means key=true\r\n\t}\r\n\treturn params;\r\n}\r\n\r\nexport function getParameter(key: string, url?: string, required?: boolean): string;\r\nexport function getParameter(key: string, url?: string, required = false): string {\r\n\tconst queryStringParam = getParameters(url)[key ? key.toLowerCase() : key];\r\n\tif (required && !queryStringParam) throw new Error(`No queryStringParam for Required key: ${key}`);\r\n\treturn queryStringParam;\r\n}\r\n\r\nexport function updateParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\r\n\tlet newAdditionalURL = \"\";\r\n\tlet tempArray = url.split(\"#\");\r\n\tconst hash = tempArray[1] ? tempArray[1] : '';\r\n\tconst additionalURL = tempArray[0] ? tempArray[0].split(\"?\")[1] : '';\r\n\tconst baseURL = tempArray[0] ? tempArray[0].split(\"?\")[0] : '';\r\n\tlet temp = \"\";\r\n\tif (additionalURL) {\r\n\t\ttempArray = additionalURL.split(\"&\");\r\n\t\tfor (let i = 0; i < tempArray.length; i++) {\r\n\t\t\tif (tempArray[i].split('=')[0] !== key) {\r\n\t\t\t\tnewAdditionalURL += temp + tempArray[i];\r\n\t\t\t\ttemp = \"&\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet result = temp;\r\n\tif (value)\r\n\t\tresult += \"\" + key + \"=\" + value;\r\n\telse\r\n\t\tresult = result.substring(0, result.length - 1);\r\n\r\n\tif (!newAdditionalURL && !result)\r\n\t\treturn baseURL + (hash ? '#' + hash : '');\r\n\r\n\treturn baseURL + \"?\" + newAdditionalURL + result + (hash ? '#' + hash : '');\r\n}\r\n\r\nexport function addParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\tif (url.indexOf(key) > 0) return updateParameter(key, value, url);\r\n\tif (url.indexOf('?') > 0) {\r\n\t\turl += '&' + key + \"=\" + value;\r\n\t} else {\r\n\t\turl += '?' + key + \"=\" + value;\r\n\t}\r\n\treturn url;\r\n}\r\n\r\nexport function objectToQueryString(o: object): string {\r\n\treturn '?' + Object.keys(o).map(function (key) {\r\n\t\treturn key + '=' + o[key];\r\n\t}).join('&');\r\n}\r\n\r\nexport function queryRemoveKeys(queryKeys: string[]): string {\r\n\tlet url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\r\n\tqueryKeys.forEach(x => {\r\n\t\turl = updateParameter(x ? x.toLowerCase() : x, '', url);\r\n\t});\r\n\r\n\treturn url;\r\n}\r\n\r\nexport function queryRemove(): string {\r\n\tconst url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\tconst b = url.substring(a);\r\n\treturn url.replace(b, \"\");\r\n}\r\n","import {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","export function isValidTextWithoutAngleBrackets(text: string) {\r\n\tif (!text) return false;\r\n\treturn new RegExp(\"^[^<>]+$\").test(text);\r\n}\r\n\r\nexport function isValidEmailAddress (email: string) {\r\n\tconst sValidEmail = '^((([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+(\\\\.([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+)*)|((\\\\x22)((((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(([\\\\x01-\\\\x08\\\\x0b\\\\x0c\\\\x0e-\\\\x1f\\\\x7f]|\\\\x21|[\\\\x23-\\\\x5b]|[\\\\x5d-\\\\x7e])|(([\\\\x01-\\\\x09\\\\x0b\\\\x0c\\\\x0d-\\\\x7f]))))*(((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(\\\\x22)))@((([a-zA-Z]|\\\\d)|(([a-zA-Z]|\\\\d)([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z]|\\\\d)))\\\\.)+(([a-zA-Z])|(([a-zA-Z])([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z])))$';\r\n\tconst reValidEmail = new RegExp(sValidEmail);\r\n\treturn reValidEmail.test(punycode.toUnicode(email));\r\n}\r\n\r\nexport function isValidWithoutNonAlphaNumericCharsAtEnd(text: string, el: HTMLElement) {\r\n\t// Our zipcode db contains values like 'ANTWERPEN (2000)' as city => these should be valid => if last == ) return true\r\n\tconst reg = new RegExp('^[\\\\p{L}\\\\p{N}]*$', 'u');\r\n\tconst elName = el.getAttribute(\"name\") || \"\";\r\n\t// Why trim? We allow spaces as we trim those in the backend code\r\n\tconst alsoAlsoAllowBracket = elName && elName.toLowerCase().indexOf('city') !== -1;\r\n\tconst last = text.trim().charAt(text.trim().length - 1);\r\n\treturn reg.test(last) || (alsoAlsoAllowBracket && last === ')') || last === '.';\r\n}\r\n\r\nexport function canNotContainOnlyNumerics(text: string) {\r\n\tconst reg = new RegExp('^[0-9]+$');\r\n\treturn !reg.test(text);\r\n}\r\n\r\nexport function isValidOrderNumber(orderNr: string) {\r\n\treturn onlyNumber(orderNr) && orderNr.length === 14;\r\n}\r\n\r\nexport function onlyNumber(input: string): boolean {\r\n\treturn Boolean(input.match(/^[0-9]*$/));\r\n}\r\n\r\nexport function isTempAccountEmail(email: string): boolean {\r\n\treturn email.indexOf('TEMP_ACCOUNT_') >= 0;\r\n}\r\n","import {\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressAddClass,\r\n\texpressRemoveClass,\r\n\thide,\r\n\tshow,\r\n\tisElementVisible\r\n} from \"../common/html\";\r\nimport { initForm } from \"./form\";\r\nimport { subscribeAsync, toggleSubscribeAsync } from \"../services/account-service\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\nimport {trackAccountPrefEvent} from \"../common/events\";\r\nimport {isTempAccountEmail} from \"../utils/validation\";\r\n\r\n\r\nexport function createNewsletterSubscribeAndUnsubscribe(customDocument: Element = null) {\r\n\tconst subscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-subscribe\");\r\n\tconst unSubscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-unsubscribe\");\r\n\r\n\tif (subscriptionForms && subscriptionForms.length > 0) {\r\n\t\tlet ioSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterSubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tsubscriptionForms.forEach(el => ioSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tsubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterSubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (unSubscriptionForms && unSubscriptionForms.length > 0) {\r\n\t\tlet ioUnSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioUnSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterUnsubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tunSubscriptionForms.forEach(el => ioUnSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tunSubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterUnsubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function createNewsletterSubscribe(containerEl: HTMLElement) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-subscribe-email', true);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || \"\";\r\n\tconst email = getCookie('LastUsedEmail');\r\n\r\n\temailEl.setAttribute('required', 'required');\r\n\temailEl.setAttribute('emailRFC822', 'true');\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tlet source = formEl.dataset.source || undefined;\r\n\t!source && (source = emailEl.dataset.sourceid);\r\n\r\n\tconst subscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\treturn subscribeAsync(emailEl.value, appId, posId, lang, source)\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\ttrackAccountPrefEvent( \"Subscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t\t\t\t\t\texpressAddClass(formEl, 'm-newsletter__form');\r\n\t\t\t\t\t\twriteCookieThatExpiresAtTheEndOfTheDay(\"subscribedInThisSession\", \"true\");\r\n\t\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-subscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: subscribeForm.dispose };\r\n\r\n}\r\n\r\nexport interface INewsLetterUnsubscribeOptions {\r\n\tonSuccess?: () => void;\r\n\tonError?: () => void;\r\n\tpreFillLastUsedEmail?: boolean;\r\n}\r\n\r\nexport function createNewsletterUnsubscribe(containerEl: HTMLElement, opts?: INewsLetterUnsubscribeOptions, emarsysData?: string) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst successMessageEl = expressQuerySelector(containerEl, '.technical-success-message', false);\r\n\tconst errorMessageEl = expressQuerySelector(containerEl, '.technical-error-message', false);\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-unsubscribe-mail', false);\r\n\tconst checkBoxEl = expressQuerySelector(formEl, '#newsletter', false);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || window.context.language;\r\n\tconst preFillLastUsedEmail = opts ? opts.preFillLastUsedEmail !== undefined ? opts.preFillLastUsedEmail : true : true;\r\n\tconst email = getParameter('email') || preFillLastUsedEmail ? getCookie('LastUsedEmail') : '';\r\n\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tconst showSuccessMessage = () => {\r\n\t\tsuccessMessageEl && expressRemoveClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressAddClass(errorMessageEl, \"u-hide\");\r\n\t\thide(formEl);\r\n\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t};\r\n\r\n\tconst showErrorMessage = () => {\r\n\t\tsuccessMessageEl && expressAddClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressRemoveClass(errorMessageEl, \"u-hide\");\r\n\t\tshow(formEl);\r\n\t};\r\n\r\n\temailEl && emailEl.setAttribute('required', 'required');\r\n\tif (checkBoxEl) checkBoxEl.setAttribute('required', 'required');\r\n\r\n\tconst unsubscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\tconst personIdFromQuery = getParameter(\"personid\");\r\n\t\t\t\treturn (emailEl && emailEl.value) || personIdFromQuery\r\n\t\t\t\t\t? toggleSubscribeAsync(personIdFromQuery, emailEl && emailEl.value, appId, posId, lang, 'NewsletterUnsubscribe', false, false, undefined, undefined, emarsysData)\r\n\t\t\t\t\t\t.then(_ => {\r\n\t\t\t\t\t\t\topts?.onSuccess ? opts.onSuccess() : showSuccessMessage();\r\n\t\t\t\t\t\t\ttrackAccountPrefEvent(\"Unsubscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(_ => opts?.onError ? opts.onError() : showErrorMessage())\r\n\t\t\t\t\t: Promise.resolve(opts?.onSuccess ? opts.onSuccess() : showSuccessMessage());\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-unsubscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: unsubscribeForm.dispose };\r\n}\r\n","export function isTouchDevice (): boolean {\r\n\tlet result = false;\r\n\tif (window.PointerEvent && ('maxTouchPoints' in navigator)) {\r\n\t\tif (navigator.maxTouchPoints > 0) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t} else {\r\n\t\tif (window.matchMedia && window.matchMedia(\"(any-pointer:coarse)\").matches) {\r\n\t\t\tresult = true;\r\n\t\t} else if (window.TouchEvent || ('ontouchstart' in window)) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nexport function isMobileDevice (): boolean {\r\n\treturn window.matchMedia(\"only screen and (max-width: 960px)\").matches;\r\n}\r\n","export function debounce void>(fn: F, delay: number) {\r\n\tlet timeoutID = 0;\r\n\r\n\tconst callable = (...args: any[]) => {\r\n\t\tclearTimeout(timeoutID);\r\n\t\ttimeoutID = window.setTimeout(() => fn.apply(args), delay);\r\n\t};\r\n\r\n\treturn callable;\r\n}\r\n\r\nexport function throttle void>(fn: F, delay: number, fnAlways?: F) {\r\n\tlet lastTimestamp = 0;\r\n\r\n\tconst callable = (...args: any[]) => {\r\n\t\tconst now = Date.now();\r\n\r\n\t\tfnAlways && fnAlways(...args);\r\n\t\tif (!lastTimestamp || now - lastTimestamp >= delay) {\r\n\t\t\tlastTimestamp = now;\r\n\t\t\tfn(...args);\r\n\t\t}\r\n\t};\r\n\r\n\treturn callable;\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","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","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 {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 { 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 {expressQuerySelectorAll} from \"../common/html\";\r\nimport {getInlineSvgsAsync} from \"../utils/icons\";\r\n\r\nexport function createUsps(containerEl: HTMLElement) {\r\n\tconst iconEls = expressQuerySelectorAll(containerEl, '.m-usp__icon');\r\n\tconst icons = {};\r\n\tgetInlineSvgsAsync(\r\n\t\ticonEls\r\n\t\t\t.filter(el => !!el.getAttribute('data-icon-url'))\r\n\t\t\t.map(el => el.getAttribute('data-icon-url')!)\r\n\t)\r\n\t\t.then(\r\n\t\t\tres => {\r\n\t\t\t\tres.forEach(icon => icons[icon.url] = icon.svg);\r\n\t\t\t\ticonEls.forEach(el => {\r\n\t\t\t\t\tconst icon = icons[el.getAttribute('data-icon-url')!.replace(\"Icon.\", \"\").toLowerCase()];\r\n\t\t\t\t\ticon && el.insertAdjacentHTML(\"beforeend\", icon);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t);\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 { debounce, throttle } from \"../utils/debounce\";\r\nimport {\r\n\texpressAddClass,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\tgetHeightWithMargins,\r\n} from \"../common/html\";\r\nimport { Guid } from \"../utils/guid\";\r\nimport { trackSliderEvent } from \"../common/events\";\r\n\r\n\r\nexport interface ICustomPhotoSliderItem {\r\n\tid?: string;\r\n\ttemplate?: HTMLElement;\r\n}\r\n\r\nexport interface IButtonElement {\r\n\ttext?: string;\r\n\tcss?: string;\r\n\tcssWhenOnMax?: string;\r\n\tonClick(e: Event, draggedSliderEventTracking: boolean): void;\r\n}\r\n\r\nexport interface ISliderElementSettings {\r\n\textraSliderClass?: string;\r\n\tslideClicked?(e: Event, settings: ICustomPhotoSliderWithDivSettings): void;\r\n}\r\n\r\nexport interface ISliderElementContainerSettings {\r\n\textraSliderClass?: string;\r\n\telementsContainerSettings: ISliderElementSettings;\r\n\tcssWhenButtonsBothOnMax?: string;\r\n\tnextButton?: IButtonElement;\r\n\tpreviousButton?: IButtonElement;\r\n}\r\nexport enum EternalSlidingMode {\r\n\tInfinite,\r\n\tScrollToBegin\r\n}\r\n\r\nexport interface ICustomPhotoSliderWithDivSettings {\r\n\tenableKeyboardNavigation?: boolean;\r\n\tsliderElements: ICustomPhotoSliderItem[];\r\n\tsliderContainerSettings: ISliderElementContainerSettings;\r\n\tshowHalfSlides?: boolean;\r\n\treplaceWithElement?: boolean;\r\n\t// false if the slider should not continue when at end\r\n\tenableEternalSliding?: boolean;\r\n\t// Mode that is used once the enableEternalSliding param is enabled => by default Infinite if nothing is passed\r\n\teternalSlidingMode?: EternalSlidingMode;\r\n\ttranslateForMovement?: boolean;\r\n\tresize1SlideToFullWidth?: boolean;\r\n\t// don't wait on IntersectionObserver to render the slider\r\n\tforceRenderSlider?: boolean;\r\n\r\n\t// custom events\r\n\tSliderCreated?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider: HTMLElement | undefined) => void;\r\n\tInitializedEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tResizeEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tBeforeResizeEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tHeightScriptButtons?: (slider: HTMLElement, bottomTitleHeight: number, highestSlideEl: HTMLElement) => void;\r\n}\r\n\r\nexport interface ICustomSlider {\r\n\tRemoveSliderElement(sliderElement: ICustomPhotoSliderItem, indexToRemove?: number): void;\r\n\tRemoveSliderElementOnIndex(indexToRemove: number): void;\r\n\tAddSliderElement(sliderElement: ICustomPhotoSliderItem, indexToInsert: number): void;\r\n\tPrevious(): void;\r\n\tNext(): void;\r\n\tJumpIntoView(sliderElement: ICustomPhotoSliderItem, smoothSlide?: boolean, align?: string): void;\r\n\tSettings: ICustomPhotoSliderWithDivSettings;\r\n\tGetCurrentSlide(): ICustomPhotoSliderItem | undefined;\r\n\tGetAllSlides(): ICustomPhotoSliderItem[];\r\n\tGetSliderElement(): HTMLElement;\r\n\tShowButtons(): void;\r\n\tHideButtons(): void;\r\n\tDispose(): void;\r\n\tAddHandlers(): void;\r\n}\r\n\r\n\r\n// Gets the highest slide element in the slider elements\r\nconst getHighestSlideOfSlider = (slidesInSlider: HTMLElement[]): HTMLElement => {\r\n\tlet highestSlideEl: HTMLElement;\r\n\tlet maxTitleHeight = 0;\r\n\r\n\tfor (let i = slidesInSlider.length - 1; i >= 0; i--) {\r\n\t\tconst slideEl = slidesInSlider[i] as HTMLElement;\r\n\t\tconst sliderTitleEl = expressQuerySelector(slideEl, '.technical-slide-title', false);\r\n\t\tconst tileTitle = expressQuerySelector(slideEl, '.technical-tile-title', false);\r\n\t\tconst tileSubTitle = expressQuerySelector(slideEl, '.technical-tile-subtitle', false);\r\n\r\n\t\tconst titleHeight = tileTitle ? getHeightWithMargins(tileTitle) : 0;\r\n\t\tconst subTitleHeight = tileSubTitle ? getHeightWithMargins(tileSubTitle) : 0;\r\n\t\tconst titleheight = titleHeight + subTitleHeight;\r\n\r\n\t\t// reset height\r\n\t\tif (sliderTitleEl)\r\n\t\t\tsliderTitleEl.style.height = '';\r\n\r\n\t\tif (maxTitleHeight <= titleheight) {\r\n\t\t\tmaxTitleHeight = titleheight;\r\n\t\t\thighestSlideEl = slideEl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn highestSlideEl!;\r\n};\r\n\r\n// Gets the slide element with the highest link in the slider elements\r\nconst getHighestSlideLinkElOfSlider = (slidesInSlider: HTMLElement[]): HTMLElement => {\r\n\tlet highestSlideEl: HTMLElement;\r\n\tlet maxLinkHeight = 0;\r\n\r\n\tfor (let i = slidesInSlider.length - 1; i >= 0; i--) {\r\n\t\tconst slideEl = slidesInSlider[i] as HTMLElement;\r\n\t\tconst sliderLinkEl = expressQuerySelector(slideEl, '.technical-tile-link-text', false) || expressQuerySelector(slideEl, '.technical-info-content-items', false);\r\n\r\n\t\tconst linkHeight = sliderLinkEl ? getHeightWithMargins(sliderLinkEl) : 0;\r\n\r\n\t\tif (maxLinkHeight <= linkHeight) {\r\n\t\t\tmaxLinkHeight = linkHeight;\r\n\t\t\thighestSlideEl = slideEl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn highestSlideEl!;\r\n};\r\n\r\nexport const SetHeight = (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider?: HTMLElement) => {\r\n\tconst visibleSlides = expressQuerySelectorAll(slider, '.technical-slide') as HTMLElement[];\r\n\tconst highestSlideEl = getHighestSlideOfSlider(visibleSlides);\r\n\tconst highestSlideTitle = expressQuerySelector(highestSlideEl, '.technical-tile-title', false);\r\n\tconst highestSlideSubTitle = expressQuerySelector(highestSlideEl, '.technical-tile-subtitle', false);\r\n\r\n\tconst highestSlideLinkEl = getHighestSlideLinkElOfSlider(visibleSlides);\r\n\tconst highestSlideLinkText = expressQuerySelector(highestSlideLinkEl, '.technical-tile-link-text', false) || expressQuerySelector(highestSlideLinkEl, '.technical-info-content-items', false);\r\n\r\n\tconst highestSlideTitlepx = highestSlideTitle ? getHeightWithMargins(highestSlideTitle) : 0;\r\n\tconst highestSlideSubTitlepx = highestSlideSubTitle ? getHeightWithMargins(highestSlideSubTitle) : 0;\r\n\tconst highestSlideLinkTextpx = highestSlideLinkText ? getHeightWithMargins(highestSlideLinkText) : 0;\r\n\tconst highestSlideFullTitlepx = highestSlideTitlepx + highestSlideSubTitlepx;\r\n\r\n\tif (highestSlideFullTitlepx > 0) {\r\n\t\tfor (let i = 0, l = visibleSlides.length; i < l; i++) {\r\n\t\t\tconst slideFullTitleEl = expressQuerySelector(visibleSlides[i] as HTMLElement, '.technical-slide-title', false);\r\n\r\n\t\t\tif (slideFullTitleEl && highestSlideFullTitlepx > 0)\r\n\t\t\t\tslideFullTitleEl.style.height = `${highestSlideFullTitlepx}px`;\r\n\t\t}\r\n\t}\r\n\r\n\tsettings.HeightScriptButtons(slider, highestSlideLinkTextpx, highestSlideEl);\r\n};\r\n\r\nconst CustomPhotoSliderWithDivSettingsDefaults: ICustomPhotoSliderWithDivSettings = {\r\n\tsliderElements: [],\r\n\tsliderContainerSettings: {\r\n\t\telementsContainerSettings: {\r\n\t\t\textraSliderClass: '',\r\n\t\t\tslideClicked: () => { return; }\r\n\t\t},\r\n\t\tcssWhenButtonsBothOnMax: 'u-hide',\r\n\t\tnextButton: {\r\n\t\t\tcss: 'a-button a-button--slider-button m-product-slider__button--next icon-arrow-right technical-slider-button',\r\n\t\t\tcssWhenOnMax: 'a-button--disabled',\r\n\t\t\tonClick: (_: Event, draggedSlider: boolean) => {\r\n\t\t\t\ttrackSliderEvent(`nextbutton_${draggedSlider ? 'dragged' : 'clicked'}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t\tpreviousButton: {\r\n\t\t\tcss: 'a-button a-button--slider-button m-product-slider__button--prev icon-arrow-left technical-slider-button',\r\n\t\t\tcssWhenOnMax: 'a-button--disabled',\r\n\t\t\tonClick: (_: Event, draggedSlider: boolean) => {\r\n\t\t\t\ttrackSliderEvent(`prevbutton_${draggedSlider ? 'dragged' : 'clicked'}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tshowHalfSlides: false,\r\n\treplaceWithElement: true,\r\n\tenableEternalSliding: true,\r\n\teternalSlidingMode: EternalSlidingMode.Infinite,\r\n\ttranslateForMovement: true,\r\n\tforceRenderSlider: true, // selecting a format image on mobile then go to desktop => format image not there when false\r\n\r\n\r\n\t// height script buttons\r\n\tSliderCreated: (settings, slider, oldSlider) => {\r\n\t\tsetTimeout(() => {\r\n\t\t\tSetHeight(settings, slider, oldSlider);\r\n\t\t}, 0);\r\n\t},\r\n\tResizeEvent: (settings, slider) => {\r\n\t\tSetHeight(settings, slider);\r\n\t},\r\n\r\n\tHeightScriptButtons: (slider: HTMLElement, bottomTitleHeight: number, highestSlideEl: HTMLElement) => {\r\n\t\tconst sliderButtons = expressQuerySelectorAll(slider, '.technical-slider-button');\r\n\t\tconst hightestImage = expressQuerySelector(highestSlideEl, '.technical-slide-imageContainer', false);\r\n\t\tlet buttonCenterImage = 0;\r\n\t\tif (hightestImage) {\r\n\t\t\tconst btnHeight = sliderButtons[0].offsetHeight;\r\n\t\t\tbuttonCenterImage = (hightestImage.offsetHeight / 2) + bottomTitleHeight - (btnHeight / 2);\r\n\t\t}\r\n\r\n\t\tfor (let i = 0, l = sliderButtons.length; i < l; i++) {\r\n\t\t\t(sliderButtons[i] as HTMLElement).style.bottom = `${buttonCenterImage > 0 ? buttonCenterImage : (highestSlideEl.offsetHeight / 2)}px`;\r\n\t\t}\r\n\t},\r\n};\r\n\r\n\r\n\r\nexport function createCustomSlider(element: HTMLElement, settings: ICustomPhotoSliderWithDivSettings): ICustomSlider {\r\n\r\n\tsettings = {\r\n\t\t...CustomPhotoSliderWithDivSettingsDefaults, ...settings,\r\n\t\tsliderContainerSettings: {\r\n\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings, ...settings.sliderContainerSettings,\r\n\t\t\telementsContainerSettings: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.elementsContainerSettings, ...settings.sliderContainerSettings.elementsContainerSettings,\r\n\t\t\t},\r\n\t\t\tnextButton: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.nextButton, ...settings.sliderContainerSettings.nextButton,\r\n\t\t\t},\r\n\t\t\tpreviousButton: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.previousButton, ...settings.sliderContainerSettings.previousButton,\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n\r\n\t// prop to move div from left to right\r\n\tlet sliderPxX = 0;\r\n\tlet widthBeforeResize = 0;\r\n\t// slider elements\r\n\tlet sliderEl: HTMLElement;\r\n\tlet elementsEl: HTMLElement;\r\n\tlet firstVisibleElement: HTMLElement | undefined;\r\n\tlet prevButton: HTMLElement;\r\n\tlet nextButton: HTMLElement;\r\n\t// properties for sliding\r\n\tlet mouseDownOnSlider = false;\r\n\tlet startSliderDragX = 0;\r\n\tlet currentSliderDragX = 0;\r\n\tlet isDragged = false;\r\n\tlet disableSliderDragging = false;\r\n\tlet preventPageScrolling = false;\r\n\tlet preventSliderDragging = false;\r\n\tlet prevSliderWidth = 0;\r\n\r\n\t// private methods\r\n\tconst init = function (element: HTMLElement, replaceWithElement: boolean) {\r\n\t\tif (ioSlider && !settings.forceRenderSlider) {\r\n\t\t\tioSlider.observe(element);\r\n\t\t} else {\r\n\t\t\t// create slider template\r\n\t\t\tsliderEl = getSliderTemplate();\r\n\r\n\t\t\t// append slider to HTML\r\n\t\t\tif (replaceWithElement && element.parentElement)\r\n\t\t\t\telement.parentElement.replaceChild(sliderEl, element);\r\n\t\t\telse\r\n\t\t\t\telement.appendChild(sliderEl);\r\n\r\n\t\t\t// trigger initialized event\r\n\t\t\tif (settings.InitializedEvent) settings.InitializedEvent(settings, sliderEl);\r\n\r\n\t\t\t// to check if the buttons should be disabled or not\r\n\t\t\tcheckEdgesAndMove(0);\r\n\t\t\taddHandlers();\r\n\t\t\tresizeObserver.observe(elementsEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tprevButton && prevButton.removeEventListener('click', previousEvent);\r\n\t\tnextButton && nextButton.removeEventListener('click', nextEvent);\r\n\t\tif (sliderEl) {\r\n\t\t\tsliderEl.removeEventListener('mousedown', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tdragStart(e);\r\n\t\t\t});\r\n\t\t\tsliderEl.removeEventListener('touchstart', dragStart);\r\n\r\n\t\t\tif (isTouchDevice()) {\r\n\t\t\t\tsliderEl.removeEventListener('touchend', dragStop);\r\n\t\t\t\tsliderEl.removeEventListener('touchmove', dragging);\r\n\t\t\t\tsliderEl.removeEventListener('touchcancel', dragLeave);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdocument.removeEventListener('keydown', onKeyDown);\r\n\t\t\tsliderEl.removeEventListener('mousemove', dragging);\r\n\t\t\tsliderEl.removeEventListener('mouseleave', dragLeave);\r\n\t\t\tsliderEl.removeEventListener('mouseup', dragStop);\r\n\r\n\t\t}\r\n\t\tif (window) {\r\n\t\t\twindow.removeEventListener('scroll', scrollStart);\r\n\t\t\t// window.removeEventListener('resize', resize);\r\n\t\t}\r\n\t};\r\n\r\n\tconst addHandlers = () => {\r\n\t\tprevButton && prevButton.addEventListener('mouseup', (e) => { disableSliderDragging = false; previousEvent(e); });\r\n\t\tprevButton && prevButton.addEventListener('mousedown', _ => disableSliderDragging = true);\r\n\t\tnextButton && nextButton.addEventListener('mouseup', (e) => { disableSliderDragging = false; nextEvent(e); });\r\n\t\tnextButton && nextButton.addEventListener('mousedown', _ => disableSliderDragging = true);\r\n\r\n\t\t// add event listeners of slider\r\n\t\taddSliderEventListeners();\r\n\r\n\t\t// add external events\r\n\t\t// externalEventListeners();\r\n\t};\r\n\r\n\tconst resizeObserver = new ResizeObserver((entries) => {\r\n\t\tfor (const entry of entries)\r\n\t\t\tif (entry.contentRect && entry.target)\r\n\t\t\t\tresize();\r\n\t});\r\n\r\n\t// #region SliderEvents\r\n\tconst isTouchDevice = () => ('ontouchstart' in window) || (navigator.maxTouchPoints > 0);\r\n\r\n\tconst addSliderEventListeners = () => {\r\n\t\t// add touch listeners when touch\r\n\t\tif (isTouchDevice())\r\n\t\t\tsliderTouchEventListeners();\r\n\t\telse if (settings.enableKeyboardNavigation)\r\n\t\t\taddSliderKeyboardEventListeners();\r\n\t\tsliderMouseEventListeners();\r\n\t};\r\n\tconst sliderMouseEventListeners = () => {\r\n\t\t// mouse events\r\n\t\tsliderEl.addEventListener('mousedown', (e) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tdragStart(e);\r\n\t\t});\r\n\t};\r\n\r\n\tconst onKeyDown = (ev: KeyboardEvent) => {\r\n\t\tswitch (ev.code)\r\n\t\t{\r\n\t\t\tcase \"ArrowLeft\":\r\n\t\t\t\tpreviousEvent(ev);\r\n\t\t\t\treturn;\r\n\t\t\tcase \"ArrowRight\":\r\n\t\t\t\tnextEvent(ev);\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t};\r\n\r\n\tconst addSliderKeyboardEventListeners = () => {\r\n\t\tdocument.addEventListener('keydown', onKeyDown);\r\n\t};\r\n\r\n\tconst sliderTouchEventListeners = () => {\r\n\t\t// touch events\r\n\t\t// passive => opt-in to better scroll performance by eliminating the need for scrolling to block on touch and wheel event listeners\r\n\t\tsliderEl.addEventListener('touchstart', dragStart, { passive: true });\r\n\t\twindow.addEventListener('scroll', scrollStart);\r\n\t};\r\n\tconst resize = () => {\r\n\t\t// Android/IOS triggers resize caused by scrolling (navigation bar goes away) => don't change anything when slider width is the same\r\n\t\tconst sliderWidth = getFullWidthElement(sliderEl);\r\n\t\tif (prevSliderWidth === sliderWidth) return;\r\n\r\n\t\tprevSliderWidth = sliderWidth;\r\n\r\n\t\tdebounce(reset, 250)();\r\n\t};\r\n\t/*const externalEventListeners = () => {\r\n\t\twindow && window.addEventListener('resize', resize);\r\n\t\tdocument && document.addEventListener('mouseup', _ => disableSliderDragging = false);\r\n\t};*/\r\n\tconst preventClick = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopImmediatePropagation();\r\n\t};\r\n\tconst scrollStart = () => {\r\n\t\tpreventSliderDragging = true;\r\n\t};\r\n\t// drag methods\r\n\tconst dragStart = (e: Event) => {\r\n\t\tisDragged = false;\r\n\t\tmouseDownOnSlider = true;\r\n\t\tstartSliderDragX = getPositionX(e);\r\n\t\tcurrentSliderDragX = startSliderDragX;\r\n\t\tpreventPageScrolling = false;\r\n\t\tpreventSliderDragging = disableSliderDragging || nextButton.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax) && prevButton.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\r\n\t\tif (isTouchDevice()) {\r\n\t\t\tsliderEl.addEventListener('touchend', dragStop, { passive: true });\r\n\t\t\tsliderEl.addEventListener('touchmove', throttle(dragging, 100), { passive: false });\r\n\t\t\tsliderEl.addEventListener('touchcancel', dragLeave, { passive: true });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// mouse events\r\n\t\tsliderEl.addEventListener('mousemove', (e) => {\r\n\t\t\tif (!mouseDownOnSlider) return;\r\n\t\t\te.preventDefault();\r\n\t\t\tdragging(e);\r\n\t\t});\r\n\t\tsliderEl.addEventListener('mouseleave', dragLeave, { passive: true });\r\n\t\tsliderEl.addEventListener('mouseup', dragStop, { passive: true });\r\n\t};\r\n\tconst dragLeave = (e: Event) => {\r\n\t\tif (!mouseDownOnSlider) return;\r\n\t\tmouseDownOnSlider = false;\r\n\t\telementsEl.parentElement.style.scrollBehavior = \"smooth\";\r\n\r\n\t\t// Move the next/previous slider fully into view\r\n\t\tif (startSliderDragX < currentSliderDragX)\r\n\t\t\tpreviousEvent(e, false, true);\r\n\t\telse if (startSliderDragX > currentSliderDragX)\r\n\t\t\tnextEvent(e, false, true);\r\n\t};\r\n\tconst dragging = (e: Event) => {\r\n\t\tif (!mouseDownOnSlider || preventSliderDragging) return;\r\n\r\n\t\telementsEl.parentElement.style.scrollBehavior = 'auto';\r\n\r\n\t\tconst posX = getPositionX(e);\r\n\t\tsliderPxX += Math.round(posX - currentSliderDragX);\r\n\r\n\t\t// Stop page scrolling if your finger moves more than 10 pixels left or right\r\n\t\tconst movedSinceStart = posX - startSliderDragX;\r\n\t\tisDragged = Math.abs(movedSinceStart) > 10;\r\n\t\tif (Math.abs(movedSinceStart) > 10)\r\n\t\t\tpreventPageScrolling = true;\r\n\r\n\t\tif (preventPageScrolling)\r\n\t\t\te.preventDefault();\r\n\r\n\t\tif (settings.enableEternalSliding\r\n\t\t\t&& (settings.eternalSlidingMode || EternalSlidingMode.Infinite) === EternalSlidingMode.Infinite)\r\n\t\t\tdebounce(_ => {\r\n\t\t\t\tif (currentSliderDragX === posX || !mouseDownOnSlider) return; // mouseDownOnSlider == false => already moved by dragStop/dragLeave\r\n\r\n\t\t\t\tconst element = getFirstVisibleElement();\r\n\t\t\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\t\t\t\tconst visibleElements = Math.ceil(getFullWidthElement(sliderEl) / elementWidth);\r\n\t\t\t\tconst sliderxPassedTiles = -sliderPxX / elementWidth;\r\n\r\n\t\t\t\tconst direction = currentSliderDragX > posX ? 'left' : 'right';\r\n\r\n\t\t\t\tif (direction === 'right' && (sliderxPassedTiles + visibleElements >= settings.sliderElements.length)) {\r\n\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]); // add to right\r\n\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\tmoveSlider(true); // should not move slider\r\n\r\n\t\t\t\t} else if (direction === 'left' && (sliderxPassedTiles < 0.2)) {\r\n\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]); // add to left\r\n\t\t\t\t\tsliderPxX += -elementWidth;\r\n\t\t\t\t\tmoveSlider(true); // should not move slider\r\n\t\t\t\t}\r\n\t\t\t}, 250)();\r\n\r\n\t\t// set new location here\r\n\t\tcurrentSliderDragX = posX;\r\n\r\n\t\t// move without check => check when stopped\r\n\t\tmoveSlider(true);\r\n\t};\r\n\tconst dragStop = (e: Event) => {\r\n\t\tmouseDownOnSlider = false;\r\n\t\telementsEl.parentElement.style.scrollBehavior = \"smooth\";\r\n\r\n\t\t// enable/disable click event on slider-element when dragging\r\n\t\tif (!isDragged && e.target && !(e.target as HTMLElement).classList.contains('technical-slider-button'))\r\n\t\t\tsettings.sliderContainerSettings.elementsContainerSettings.slideClicked(e, settings);\r\n\r\n\t\tconst slideElements = expressQuerySelectorAll(elementsEl, '.technical-slider-element');\r\n\t\tconst elMethod = isDragged ? 'addEventListener' : 'removeEventListener';\r\n\t\tslideElements.forEach(el => el[elMethod]('click', preventClick));\r\n\r\n\t\t// Move the next/previous slider fully into view\r\n\t\tif (startSliderDragX < currentSliderDragX)\r\n\t\t\tpreviousEvent(e, false, true);\r\n\t\telse if (startSliderDragX > currentSliderDragX)\r\n\t\t\tnextEvent(e, false, true);\r\n\r\n\t\t// touch events\r\n\t\tif (isTouchDevice()) {\r\n\t\t\tsliderEl.removeEventListener('touchend', dragStop);\r\n\t\t\tsliderEl.removeEventListener('touchmove', dragging);\r\n\t\t\tsliderEl.removeEventListener('touchcancel', dragLeave);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// remove mouse events\r\n\t\tsliderEl.removeEventListener('mousemove', dragging);\r\n\t\tsliderEl.removeEventListener('mouseleave', dragLeave);\r\n\t\tsliderEl.removeEventListener('mouseup', dragStop);\r\n\r\n\t\tisDragged = false;\r\n\t};\r\n\tconst getPositionX = (e) => {\r\n\t\treturn e.type.includes('mouse') ? e.pageX : e.touches[0].pageX;\r\n\t};\r\n\t// #endregion SliderEvents\r\n\tconst getSliderTemplate = (): HTMLElement => {\r\n\t\tif (settings.sliderElements.length === 0) return document.createElement('span');\r\n\r\n\t\t// generate div to hold slider\r\n\t\tconst div = document.createElement('div');\r\n\t\tdiv.className += settings.sliderContainerSettings.extraSliderClass;\r\n\r\n\t\t// prev\r\n\t\tprevButton = document.createElement('a');\r\n\t\tprevButton.textContent = settings.sliderContainerSettings.previousButton.text ? settings.sliderContainerSettings.previousButton.text : '';\r\n\t\tprevButton.title = \"previous\";\r\n\r\n\t\t// prev.style\r\n\t\tprevButton.className += settings.sliderContainerSettings.previousButton.css;\r\n\t\tprevButton.classList.add(settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\t\tdiv.appendChild(prevButton);\r\n\r\n\t\t// images\r\n\t\telementsEl = document.createElement('div');\r\n\t\telementsEl.className += settings.sliderContainerSettings.elementsContainerSettings.extraSliderClass;\r\n\t\telementsEl.classList.add('technical-slider-elements');\r\n\r\n\t\tfor (let i = 0, l = settings.sliderElements.length; i < l; i++) {\r\n\t\t\tconst customPhotoSliderItem = settings.sliderElements[i];\r\n\t\t\tconst sliderElementDiv = createSliderElement(customPhotoSliderItem);\r\n\t\t\telementsEl.appendChild(sliderElementDiv);\r\n\t\t}\r\n\r\n\t\t// append to elementsDiv\r\n\t\tdiv.appendChild(elementsEl);\r\n\r\n\t\t// next\r\n\t\tnextButton = document.createElement('a');\r\n\t\tnextButton.textContent = settings.sliderContainerSettings.nextButton.text ? settings.sliderContainerSettings.nextButton.text : '';\r\n\t\tprevButton.title = \"next\";\r\n\r\n\t\t// next.style\r\n\t\tnextButton.className += settings.sliderContainerSettings.nextButton.css;\r\n\t\tdiv.appendChild(nextButton);\r\n\r\n\r\n\t\tsettings.SliderCreated && settings.SliderCreated(settings, div, sliderEl);\r\n\t\t// return div element\r\n\t\treturn div;\r\n\t};\r\n\tconst getCurrentElement = (): ICustomPhotoSliderItem | undefined => {\r\n\t\tconst elementEl = getFirstVisibleElement();\r\n\t\tif (!elementEl) return; // if no element visible return\r\n\t\tconst elementElWidth = getFullWidthElement(elementEl, true);\r\n\t\tconst currentElementIndex = elementElWidth <= 0 ? 0 : Math.round(Math.abs(sliderPxX) / elementElWidth);\r\n\t\tconst index = currentElementIndex % elementsEl.children.length;\r\n\t\treturn settings.sliderElements.find(x => elementsEl.children[index].id === x.id);\r\n\t};\r\n\tconst getAllElements = (): ICustomPhotoSliderItem[] => {\r\n\t\tconst slides = Array.from(elementsEl.children);\r\n\t\treturn [...settings.sliderElements].sort((a, b) => {\r\n\t\t\tconst elementA = slides.find(e => e.id === a.id);\r\n\t\t\tconst elementB = slides.find(e => e.id === b.id);\r\n\t\t\treturn slides.indexOf(elementA) - slides.indexOf(elementB);\r\n\t\t}); //sort a copy of the list\r\n\t};\r\n\tconst resizeSliderElementsToFullWidth = () => {\r\n\t\tconst element = getFirstVisibleElement();\r\n\t\tif (!element || !element.parentElement || element.clientWidth <= 0)\r\n\t\t\treturn;\r\n\r\n\t\tconst widthAfterResize = getFullWidthElement(element.parentElement!);\r\n\r\n\t\tif (widthBeforeResize === widthAfterResize)\r\n\t\t\treturn;\r\n\r\n\t\tfor (let i = 0; i < elementsEl.children.length; i++) {\r\n\t\t\tconst slide = elementsEl.children[i] as HTMLElement;\r\n\t\t\tslide.style.width = `${widthAfterResize}px`;\r\n\t\t\tslide.style.minWidth = `${widthAfterResize}px`;\r\n\t\t\tslide.style.maxWidth = `${widthAfterResize}px`;\r\n\t\t}\r\n\r\n\t\t// Realign the slider with the first visible element\r\n\t\t// sliderPxX = the amount the slider was moved to the left, usually a multiple of widthBeforeResize\r\n\t\t// We need to realign it, so we divide sliderPxX by the widthBeforeResize, so we know how many slides we need to move it\r\n\t\tif (widthBeforeResize > 0) {\r\n\t\t\tconst amountOfSlides = Math.abs(Math.ceil(sliderPxX / widthBeforeResize));\r\n\t\t\tsliderPxX = sliderPxX - ((widthAfterResize - widthBeforeResize) * amountOfSlides);\r\n\t\t}\r\n\r\n\t\twidthBeforeResize = widthAfterResize;\r\n\t};\r\n\tconst checkEdgesAndMove = (movePx: number, draggedSlider?: boolean, jumpIntoView = false) => {\r\n\t\t// if beginning or end stop\r\n\t\tsliderPxX += movePx;\r\n\t\tlet prevButtonClasslistMethod = 'add';\r\n\t\tlet nextButtonClasslistMethod = 'add';\r\n\t\tconst element = getFirstVisibleElement();\r\n\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\t\tlet moveToOtherside = false;\r\n\r\n\t\t// we calculate the total width of the elements because of the gap property on the slider\r\n\t\t// without gap => every slider the same width => is the same as elementsEl.scrollWidth\r\n\t\t// with gap => we come 1 gap to short at the end to have the same width\r\n\t\tconst endOfSlider = () => getFullWidthElement(sliderEl) - (elementWidth * settings.sliderElements.length);\r\n\t\tconst widthRightSidePx = () => (elementWidth * settings.sliderElements.length) - Math.abs(sliderPxX);\r\n\r\n\t\tif (sliderPxX >= 0) { // test negative scroll\r\n\t\t\tnextButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding) prevButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding && !jumpIntoView && sliderPxX > 0) {\r\n\t\t\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\t\t\tmoveToOtherside = true;\r\n\t\t\t\t\t\tsliderPxX = endOfSlider();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]);\r\n\t\t\t\t\t\tmoveSlider(true, false, -sliderPxX); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\tsliderPxX = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else sliderPxX = 0;\r\n\t\t} else if (widthRightSidePx() <= getFullWidthElement(sliderEl)) { // test positive scroll\r\n\t\t\tprevButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding) nextButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding && !jumpIntoView && widthRightSidePx() < getFullWidthElement(sliderEl)) {\r\n\t\t\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\t\t\tmoveToOtherside = true;\r\n\t\t\t\t\t\tsliderPxX = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif (elementWidth <= 0) break; // if you element is not visiable don't do anything\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]);\r\n\t\t\t\t\t\t\tmoveSlider(true, false, sliderPxX + Math.abs(movePx) + elementWidth); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\t\t} while (widthRightSidePx() < getFullWidthElement(sliderEl));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else sliderPxX = endOfSlider();\r\n\t\t} else { // the sroll is not over positive or over negative\r\n\t\t\tprevButtonClasslistMethod = 'remove';\r\n\t\t\tnextButtonClasslistMethod = 'remove';\r\n\t\t}\r\n\r\n\t\t// check if images div is greater then px width\r\n\t\tif (getFullWidthElementWithoutRounding(sliderEl) >= (elementsEl.scrollWidth - 20)) { // +20? The right margin of the item on the right can be invisible\r\n\t\t\tnextButtonClasslistMethod = 'add';\r\n\t\t\tprevButtonClasslistMethod = 'add';\r\n\t\t}\r\n\r\n\t\tif (settings.sliderContainerSettings.cssWhenButtonsBothOnMax) {\r\n\t\t\tif (prevButton) prevButton.classList.toggle(settings.sliderContainerSettings.cssWhenButtonsBothOnMax, nextButtonClasslistMethod === 'add' && prevButtonClasslistMethod === 'add');\r\n\t\t\tif (nextButton) nextButton.classList.toggle(settings.sliderContainerSettings.cssWhenButtonsBothOnMax, nextButtonClasslistMethod === 'add' && prevButtonClasslistMethod === 'add');\r\n\t\t}\r\n\r\n\t\t// add or remove class from classlist depending on ifs\r\n\t\tif (prevButton) prevButton.classList[prevButtonClasslistMethod](settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\t\tif (nextButton) nextButton.classList[nextButtonClasslistMethod](settings.sliderContainerSettings.nextButton.cssWhenOnMax);\r\n\r\n\t\tif (prevButton || nextButton)\r\n\t\t\tmoveSlider(draggedSlider, moveToOtherside);\r\n\t};\r\n\tconst moveSlider = (draggedSlider?: boolean, moveToOtherside = false, sliderPxXOverride?: number) => {\r\n\t\tconst ms = moveToOtherside ? elementsEl.children.length * 250 : 200;\r\n\t\telementsEl.style.transition = draggedSlider ? 'none' : `all ${ms}ms ease-in-out 0s`;\r\n\r\n\t\tconst pixelX = sliderPxXOverride || sliderPxXOverride >= 0 ? sliderPxXOverride : sliderPxX;\r\n\t\tif (settings.translateForMovement) {\r\n\t\t\telementsEl.style.transform = `translateX(${pixelX}px)`;\r\n\t\t} else {\r\n\t\t\telementsEl.parentElement && elementsEl.parentElement.scroll({\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: -pixelX,\r\n\t\t\t\t// @ts-ignore https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll => instant is a behavior that is supported\r\n\t\t\t\tbehavior: draggedSlider ? 'instant' : 'smooth'\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\tconst createSliderElement = (customPhotoSliderItem: ICustomPhotoSliderItem): HTMLElement => {\r\n\t\tif (!customPhotoSliderItem.id)\r\n\t\t\tcustomPhotoSliderItem.id = Guid.newSliderGuid();\r\n\r\n\t\t// elements\r\n\t\tconst sliderElement = customPhotoSliderItem.template ? customPhotoSliderItem.template.cloneNode(true) as HTMLElement : document.createElement('div');\r\n\t\tsliderElement.id = customPhotoSliderItem.id;\r\n\t\tsliderElement.classList.add('technical-slider-element');\r\n\r\n\t\t//return div\r\n\t\treturn sliderElement;\r\n\t};\r\n\tconst removeImageFromArray = (indexToRemove: number) => {\r\n\t\tif (!settings.sliderElements || indexToRemove > settings.sliderElements.length - 1 || indexToRemove < 0 || !settings.sliderElements[indexToRemove])\r\n\t\t\tthrow Error('Something is wrong with your current parameters');\r\n\t\telse {\r\n\t\t\tlet tempArray = settings.sliderElements.slice(0, indexToRemove);\r\n\r\n\t\t\t// if last item remove this is faster\r\n\t\t\tif (tempArray.length === settings.sliderElements.length - 1) {\r\n\t\t\t\tsettings.sliderElements = tempArray;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttempArray = tempArray.concat(settings.sliderElements.slice(indexToRemove + 1));\r\n\t\t\tsettings.sliderElements = tempArray;\r\n\t\t}\r\n\t};\r\n\tconst insertIntoSliderElements = (sliderElement: ICustomPhotoSliderItem, indexToInsert: number) => {\r\n\t\t// if images.length => just push\r\n\t\tif (indexToInsert === settings.sliderElements.length) {\r\n\t\t\tsettings.sliderElements.push(sliderElement);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// if 0 add to new array copy old array into new array => change array\r\n\t\tif (indexToInsert === 0) {\r\n\t\t\tconst tempArray: ICustomPhotoSliderItem[] = [sliderElement];\r\n\t\t\tsettings.sliderElements = tempArray.concat(settings.sliderElements);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// insert in between\r\n\t\tlet tempArray = settings.sliderElements.slice(0, indexToInsert);\r\n\t\ttempArray.push(sliderElement);\r\n\t\ttempArray = tempArray.concat(settings.sliderElements.slice(indexToInsert));\r\n\r\n\t\tsettings.sliderElements = tempArray;\r\n\t};\r\n\tconst calculateNextMove = function (positiveMove: boolean): number {\r\n\t\tconst elementEl = getFirstVisibleElement();\r\n\r\n\t\t// if no slider just skip\r\n\t\tif (settings.sliderElements.length <= 1 || !elementEl)\r\n\t\t\treturn 0;\r\n\r\n\t\t// !!! WARNING !!! solution for all same width elements !!!\r\n\t\tconst elementElWidth = getFullWidthElement(elementEl, true);\r\n\r\n\t\tif (Math.ceil(getFullWidthElement(elementsEl)) / elementElWidth < 1)\r\n\t\t\treturn elementElWidth * (positiveMove ? -0.5 : 0.5); // default 0.50 % of slide move\r\n\r\n\t\t// calculate sliderElement.width / width elements => get % of visible slide on each side\r\n\t\tconst pxRight = (elementElWidth * settings.sliderElements.length) - (Math.ceil(getFullWidthElement(sliderEl)) + Math.abs(sliderPxX));\r\n\t\tconst maxPossibleSliderItemsRightPx = pxRight / elementElWidth;\r\n\t\tconst maxPossibleSliderItemsLeftpx = Math.abs(sliderPxX) / elementElWidth;\r\n\r\n\t\tlet percentage = positiveMove\r\n\t\t\t? (settings.eternalSlidingMode || EternalSlidingMode.Infinite) == EternalSlidingMode.Infinite ? (maxPossibleSliderItemsLeftpx - Math.floor(maxPossibleSliderItemsLeftpx)) - 1 : - (maxPossibleSliderItemsRightPx - Math.floor(maxPossibleSliderItemsRightPx))\r\n\t\t\t: maxPossibleSliderItemsLeftpx - Math.floor(maxPossibleSliderItemsLeftpx);\r\n\r\n\t\t// Floating point arithmetic is not always 100% accurate\r\n\t\tconst rounding = 10000000000;\r\n\t\tpercentage = parseInt(`${percentage * rounding}`) / rounding;\r\n\r\n\t\t// for the case that the slide is exactly on the page\r\n\t\t// or slider the slide is already almost fully visitable and you want to go to the next slide\r\n\t\tif (percentage === 0 || Math.abs(percentage) <= 0.08)\r\n\t\t\tpercentage += positiveMove ? -1 : 1;\r\n\r\n\t\t// if half slides have to be shown\r\n\t\tif (settings.showHalfSlides)\r\n\t\t\tpercentage *= 1.5;\r\n\r\n\t\t// calculate how much % the slide needs to be completely shown\r\n\t\treturn elementElWidth * percentage;\r\n\t};\r\n\tconst jumpIntoView = (sliderElement: ICustomPhotoSliderItem, smoothSlideIntoView = true, align: 'start' | 'end' = 'start') => {\r\n\t\tconst elements = getAllElements();\r\n\t\tlet indexOfElement = elements.indexOf(sliderElement);\r\n\t\tif (indexOfElement < 0)\r\n\t\t\treturn;\r\n\r\n\t\tconst visibleEl = getFirstVisibleElement(); // this slide is already visible => no width of 0\r\n\t\tconst element = expressQuerySelector(elementsEl, `#${visibleEl.id}`, true);\r\n\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\r\n\t\tlet moveToLocation: number;\r\n\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\tmoveToLocation = (elementWidth * indexOfElement) - (align == 'start' ? 0 : (elementWidth * ((getFullWidthElement(sliderEl) / elementWidth) - 1))); // -1 because this is a count, not an index\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\tdefault: {\r\n\t\t\t\tconst currentSlide = getCurrentElement();\r\n\t\t\t\tconst currentSlideIndex = elements.indexOf(currentSlide);\r\n\t\t\t\tconst visibleElements = Math.ceil(getFullWidthElement(sliderEl) / elementWidth);\r\n\r\n\t\t\t\tswitch (align) {\r\n\t\t\t\t\tcase 'start':\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (currentSlideIndex > indexOfElement || visibleElements == 1) break;\r\n\t\t\t\t\t\t\tconst elementsToMoveToFront = [...elements].splice(currentSlideIndex + visibleElements);\r\n\r\n\t\t\t\t\t\t\telementsToMoveToFront.forEach((_, i) => {\r\n\t\t\t\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]);\r\n\t\t\t\t\t\t\t\tsliderPxX -= elementWidth;\r\n\t\t\t\t\t\t\t\tmoveSlider(true, false); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tcase 'end':\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (currentSlideIndex < indexOfElement) break;\r\n\t\t\t\t\t\t\tconst elementsToMoveToBack = [...elements].splice(currentSlideIndex);\r\n\r\n\t\t\t\t\t\t\telementsToMoveToBack.forEach((_, i) => {\r\n\t\t\t\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]);\r\n\t\t\t\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\t\t\t\tmoveSlider(true, false); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tindexOfElement = getAllElements().indexOf(sliderElement); // recalculate index after move\r\n\t\t\t\tmoveToLocation = (elementWidth * indexOfElement) - (align == 'start' ? 0 : (elementWidth * ((getFullWidthElement(sliderEl) / elementWidth) - 1))); // -1 because this is a count, not an index\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// update item\r\n\t\tconst movePx = moveToLocation > Math.abs(sliderPxX) ? -moveToLocation - sliderPxX : Math.abs(sliderPxX) - moveToLocation;\r\n\t\tcheckEdgesAndMove(movePx, !smoothSlideIntoView, true);\r\n\t};\r\n\tconst getFirstVisibleElement = (): HTMLElement | undefined => {\r\n\t\tif (!elementsEl) return;\r\n\t\tif (firstVisibleElement) return firstVisibleElement;\r\n\t\tfor (let i = 0; i < elementsEl.children.length; i++) {\r\n\t\t\tconst element = elementsEl.children[i];\r\n\t\t\tif (element && element.id) {\r\n\t\t\t\tconst htmlElement = expressQuerySelector(elementsEl, `#${element.id}`, true);\r\n\r\n\t\t\t\tif (getFullWidthElement(htmlElement) > 0 && htmlElement.clientWidth > 0) {\r\n\t\t\t\t\tfirstVisibleElement = htmlElement;\r\n\t\t\t\t\treturn htmlElement;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// return default\r\n\t\treturn undefined;\r\n\t};\r\n\r\n\t// Math.ceil to get a rounded number => Firefox, Edge don't work with decimals\r\n\tconst getFullWidthElement = (element: HTMLElement | undefined, isSliderElement: boolean = false): number => Math.ceil(getFullWidthElementWithoutRounding(element, isSliderElement));\r\n\tconst getFullWidthElementWithoutRounding = (element: HTMLElement | undefined, isSliderElement: boolean = false): number => {\r\n\t\tif (!element) return 0;\r\n\t\tconst style = window.getComputedStyle(element),\r\n\t\t\twidth = style.width ? parseFloat(style.width) : element.clientWidth, // style.width already had the border in the calculation\r\n\t\t\tmargin = parseFloat(style.marginLeft ? style.marginLeft : '0') + parseFloat(style.marginRight ? style.marginRight : '0'),\r\n\t\t\tpadding = parseFloat(style.paddingLeft ? style.paddingLeft : '0') + parseFloat(style.paddingRight ? style.paddingRight : '0');\r\n\r\n\t\treturn width + (margin ? margin : 0) + (padding ? padding : 0) + (isSliderElement ? parseFloat(window.getComputedStyle(elementsEl).gap || '0') || 0 : 0);\r\n\t};\r\n\t// public methods\r\n\tconst removeSliderElement = (sliderElement: ICustomPhotoSliderItem, indexToRemove?: number) => {\r\n\t\t// check params\r\n\t\tif ((!indexToRemove && settings.sliderElements.filter(x => x.id === sliderElement).length < 0) || (indexToRemove && (indexToRemove < 0 || indexToRemove > settings.sliderElements.length - 1)))\r\n\t\t\tthrow Error('Index to remove not found');\r\n\r\n\t\t// remove image\r\n\t\tremoveImageFromArray(indexToRemove ? indexToRemove : settings.sliderElements.indexOf(sliderElement));\r\n\r\n\t\t// reset firstVisibleElement\r\n\t\tfirstVisibleElement = undefined;\r\n\r\n\t\t// Manipulate dom\r\n\t\tif (!sliderElement.id)\r\n\t\t\tthrow Error('invalid image id');\r\n\r\n\t\t// search image el to delete\r\n\t\tconst deleteImageEl = expressQuerySelector(elementsEl, `#${sliderElement.id}`, true);\r\n\t\telementsEl.removeChild(deleteImageEl);\r\n\r\n\t\t// check edges over invalid sliderPxX\r\n\t\tcheckEdgesAndMove(0);\r\n\t};\r\n\tconst removeSliderElementOnIndex = (indexToRemove: number) => {\r\n\t\t// check params\r\n\t\tif ((indexToRemove < 0 || indexToRemove > settings.sliderElements.length - 1)) throw Error('Index to remove not found');\r\n\r\n\t\t// remove image\r\n\t\tconst deletedElement = settings.sliderElements[indexToRemove];\r\n\t\tremoveSliderElement(deletedElement, indexToRemove);\r\n\t};\r\n\tconst addSliderElement = (sliderElement: ICustomPhotoSliderItem, indexToInsert: number = settings.sliderElements.length) => {\r\n\t\t// id check for UI\r\n\t\t// if id already found generate new one => no bugs in dots this way\r\n\t\tif (!sliderElement.id || settings.sliderElements.find(x => x.id === sliderElement.id))\r\n\t\t\tsliderElement.id = Guid.newSliderGuid();\r\n\r\n\t\t// insert element in slider on index\r\n\t\tconst element = indexToInsert === settings.sliderElements.length\r\n\t\t\t? settings.sliderElements[settings.sliderElements.length - 1]\r\n\t\t\t: settings.sliderElements[indexToInsert];\r\n\r\n\t\tinsertIntoSliderElements(sliderElement, indexToInsert);\r\n\t\tconst prevElement = expressQuerySelector(elementsEl, `#${element.id}`, true);\r\n\t\tconst newSlideElement = createSliderElement(sliderElement);\r\n\r\n\t\tindexToInsert === settings.sliderElements.length\r\n\t\t\t? elementsEl.insertAdjacentElement(\"afterend\", newSlideElement)\r\n\t\t\t: elementsEl.insertBefore(newSlideElement, prevElement);\r\n\r\n\t\tjumpIntoView(sliderElement);\r\n\t};\r\n\tconst reset = () => {\r\n\t\tif (settings.resize1SlideToFullWidth)\r\n\t\t\tresizeSliderElementsToFullWidth();\r\n\t\tsettings.BeforeResizeEvent && settings.BeforeResizeEvent(settings, sliderEl);\r\n\t\tcheckEdgesAndMove(0);\r\n\t\tsettings.ResizeEvent && settings.ResizeEvent(settings, sliderEl);\r\n\t};\r\n\tconst previousEvent = (e?: Event, draggedSlider = false, draggedSliderEventTracking = false) => {\r\n\t\tif (!settings.enableEternalSliding) checkEdgesAndMove(0);\r\n\t\tif (prevButton.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax)) return;\r\n\r\n\t\t// calculate next move\r\n\t\tconst nextMove = calculateNextMove(false);\r\n\t\t// update item\r\n\t\tcheckEdgesAndMove(nextMove, draggedSlider);\r\n\r\n\t\t// on click event of settings\r\n\t\tsettings.sliderContainerSettings.previousButton.onClick(e, draggedSliderEventTracking);\r\n\t};\r\n\tconst nextEvent = (e?: Event, draggedSlider = false, draggedSliderEventTracking = false) => {\r\n\t\tif (!settings.enableEternalSliding) checkEdgesAndMove(0);\r\n\t\tif (nextButton.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax)) return;\r\n\r\n\t\t// calculate next move\r\n\t\tconst nextMove = calculateNextMove(true);\r\n\t\t// update item\r\n\t\tcheckEdgesAndMove(nextMove, draggedSlider);\r\n\r\n\t\t// on click event of settings\r\n\t\tsettings.sliderContainerSettings.nextButton.onClick(e, draggedSliderEventTracking);\r\n\t};\r\n\tconst createIntersectionObserver = () => {\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\treturn new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting && entry.target.classList.contains(element.classList[0])) {\r\n\t\t\t\t\t\tioSlider = undefined;\r\n\t\t\t\t\t\t// init slider when in parent element in view\r\n\t\t\t\t\t\tinit(element, settings.replaceWithElement);\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}\r\n\t};\r\n\r\n\tconst showButtons = () => {\r\n\t\tnextButton && expressRemoveClass(nextButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t\tprevButton && expressRemoveClass(prevButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t};\r\n\r\n\tconst hideButtons = () => {\r\n\t\tnextButton && expressAddClass(nextButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t\tprevButton && expressAddClass(prevButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t};\r\n\r\n\tlet ioSlider: IntersectionObserver | undefined = createIntersectionObserver();\r\n\r\n\t// init slider\r\n\tinit(element, settings.replaceWithElement);\r\n\r\n\t// return\r\n\treturn {\r\n\t\tRemoveSliderElement: removeSliderElement,\r\n\t\tRemoveSliderElementOnIndex: removeSliderElementOnIndex,\r\n\t\tAddSliderElement: addSliderElement,\r\n\t\tPrevious: previousEvent,\r\n\t\tNext: nextEvent,\r\n\t\tJumpIntoView: jumpIntoView,\r\n\t\tSettings: settings,\r\n\t\tGetCurrentSlide: getCurrentElement,\r\n\t\tGetAllSlides: getAllElements,\r\n\t\tGetSliderElement: () => sliderEl,\r\n\t\tShowButtons: showButtons,\r\n\t\tHideButtons: hideButtons,\r\n\t\tDispose: dispose,\r\n\t\tAddHandlers: addHandlers\r\n\t};\r\n}\r\n","import {getParentWithClassName, expressQuerySelectorAll} from \"../common/html\";\r\n\r\nexport function stopSkeletonLoading() {\r\n\texpressQuerySelectorAll(document, \".skeleton-loading img\").forEach(img => {\r\n\t\tconst removeSkeleton = () => {\r\n\t\t\tconst parent = getParentWithClassName(img, \"skeleton-loading\");\r\n\t\t\tif (parent) parent.classList.remove(\"skeleton-loading\");\r\n\t\t};\r\n\r\n\t\tif (img.complete) {\r\n\t\t\tremoveSkeleton();\r\n\t\t} else {\r\n\t\t\timg.addEventListener(\"load\", () => { removeSkeleton(); });\r\n\t\t}\r\n\t});\r\n}\r\n","import { expressEventListener, expressQuerySelector } from \"../common/html\";\r\n\r\nexport function initVideoPlayer(videoContainerEl: HTMLElement, autoplayOnClick = true) {\r\n\tconst playerEl = expressQuerySelector(videoContainerEl, '.technical-video-frame', true);\r\n\tconst overlayEl = expressQuerySelector(videoContainerEl, '.technical-video-overlay', false);\r\n\tlet overlayButtonEl: HTMLElement;\r\n\tif (overlayEl) {\r\n\t\toverlayButtonEl = expressQuerySelector(overlayEl, '.q-video-cover-overlay__button', false);\r\n\t}\r\n\tlet vimeoVideoPlayer;\r\n\tlet scriptAlreadyLoaded = false;\r\n\r\n\tconst onOverlayClick = (ev: Event) => {\r\n\t\tev.preventDefault();\r\n\t\tev.stopPropagation();\r\n\t\tplayPauseYoutubeVideo('play');\r\n\t};\r\n\r\n\tconst playPauseYoutubeVideo = (action: \"play\" | \"pause\") => {\r\n\t\ttoggleOverLay(action == 'play');\r\n\r\n\t\tconst isVimeoVideo = playerEl.src.toLowerCase().indexOf('vimeo') > -1;\r\n\r\n\t\tif (isVimeoVideo && !scriptAlreadyLoaded) {\r\n\t\t\tconst scriptEl = document.createElement(\"script\");\r\n\t\t\tscriptEl.onload = () => {\r\n\t\t\t\tvimeoVideoPlayer = new Vimeo.Player(playerEl, {\r\n\t\t\t\t\tautoplay: 1,\r\n\t\t\t\t\tmuted: false,\r\n\t\t\t\t});\r\n\t\t\t\tvimeoVideoPlayer[action]();\r\n\t\t\t\treturn;\r\n\t\t\t};\r\n\t\t\tscriptEl.src = 'https://player.vimeo.com/api/player.js';\r\n\t\t\tdocument.body.appendChild(scriptEl);\r\n\t\t\tscriptAlreadyLoaded = true;\r\n\t\t\treturn;\r\n\t\t} else if (isVimeoVideo && vimeoVideoPlayer && vimeoVideoPlayer[action]) {\r\n\t\t\tvimeoVideoPlayer[action]();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tpostMessageToPlayer(\r\n\t\t\t{\r\n\t\t\t\t\"event\": \"command\",\r\n\t\t\t\t\"func\": action === 'play' ? 'playVideo' : 'pauseVideo',\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tconst toggleOverLay = (hideOverlay?: boolean) => {\r\n\t\tif (!overlayEl) return;\r\n\t\toverlayEl.classList.toggle('u-hide', hideOverlay);\r\n\t};\r\n\r\n\tconst postMessageToPlayer = (command) => {\r\n\t\tif (playerEl && playerEl.contentWindow) {\r\n\t\t\tplayerEl.contentWindow.postMessage(JSON.stringify(command), \"*\");\r\n\t\t}\r\n\t};\r\n\r\n\tconst init = () => {\r\n\t\tif (overlayEl && autoplayOnClick) expressEventListener(overlayEl, 'click', onOverlayClick);\r\n\t\tif (overlayButtonEl && autoplayOnClick) expressEventListener(overlayButtonEl, 'click', onOverlayClick);\r\n\t};\r\n\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdispose: () => { if (overlayEl) expressEventListener(overlayEl, 'click', onOverlayClick); },\r\n\t\tplayPauseYoutubeVideo: (action: \"play\" | \"pause\") => playPauseYoutubeVideo(action),\r\n\t\tshowOverlay: () => toggleOverLay(false),\r\n\t\tisOverlayVisible: () => {\r\n\t\t\treturn overlayEl && !overlayEl.classList.contains(\"u-hide\");\r\n\t\t}\r\n\t};\r\n}\r\n","import {expressEventListener, expressQuerySelector, expressQuerySelectorAll} from \"../common/html\";\r\nimport {getParameter, queryRemove, queryRemoveKeys, updateParameter} from \"../utils/querystring\";\r\nimport { compositeDisposable } from \"../utils/disposable\";\r\n\r\nexport interface IShowMoreElementsComponent {\r\n\tdispose: () => void;\r\n\tresetElement: () => void;\r\n}\r\n\r\nexport interface ShowMoreClickedReturn {\r\n\tallShownDesktop: boolean;\r\n\tallShownMobile: boolean;\r\n\r\n}\r\n\r\nexport function initPagedShowMoreElements(containerEl: HTMLElement, buttonEl: HTMLElement, parameter?: string, elementSelector?: string, arrayCounter = -1, showmoreClick?: (currentPage: number, sizeDesktop: number, sizeMobile: number) => Promise, afterShowMore?: () => void): IShowMoreElementsComponent {\r\n\tconst elementElsDesktop = expressQuerySelectorAll(containerEl, (elementSelector ? elementSelector : '.technical-showmore') + '.u-hide-on-desktop-full');\r\n\tconst elementElsMobile = expressQuerySelectorAll(containerEl, (elementSelector ? elementSelector : '.technical-showmore') + '.u-hide-on-mobile-full');\r\n\tconst batchSizeDesktop = parseInt(buttonEl.dataset['batchsizeDesktop'] || '999', 10);\r\n\tconst batchSizeMobile = parseInt(buttonEl.dataset['batchsizeMobile'] || '999', 10);\r\n\tconst showAllOnMore = buttonEl.dataset['showallonmore'] || false;\r\n\tconst urlParam = parseInt(getParameter(parameter || \"currentpage\"));\r\n\tlet currentPage = isNaN(urlParam) ? parseInt(buttonEl.dataset.currentpage || '0', 0) : urlParam;\r\n\r\n\tif (elementElsDesktop.length === 0 && elementElsMobile.length === 0 && !showmoreClick)\r\n\t\treturn;\r\n\r\n\tconst toggleButtonVisibility = (allDesktopVisible: boolean, allMobileVisible: boolean) => {\r\n\t\tif (allDesktopVisible || showAllOnMore) {\r\n\t\t\tif (buttonEl.parentElement && !buttonEl.classList.contains('technical-no-hide-parrent'))\r\n\t\t\t\tbuttonEl.parentElement.classList.add('u-hide-on-desktop-full');\r\n\t\t\telse\r\n\t\t\t\tbuttonEl.classList.add('u-hide-on-desktop-full');\r\n\t\t}\r\n\r\n\t\tif (allMobileVisible || showAllOnMore) {\r\n\t\t\tif (buttonEl.parentElement && !buttonEl.classList.contains('technical-no-hide-parrent'))\r\n\t\t\t\tbuttonEl.parentElement.classList.add('u-hide-on-mobile-full');\r\n\t\t\telse\r\n\t\t\t\tbuttonEl.classList.add('u-hide-on-mobile-full');\r\n\t\t}\r\n\t};\r\n\r\n\tconst showElements = (sizeMobile: number, sizeDesktop: number) => {\r\n\t\tif (showmoreClick)\r\n\t\t\treturn showmoreClick(currentPage, sizeDesktop, sizeMobile)\r\n\t\t\t\t.then(x => {\r\n\t\t\t\t\ttoggleButtonVisibility(x.allShownDesktop, x.allShownMobile);\r\n\t\t\t\t\tafterShowMore && afterShowMore();\r\n\t\t\t\t});\r\n\r\n\t\tconst toShowDesktop = showAllOnMore ? elementElsDesktop : elementElsDesktop.splice(0, sizeDesktop);\r\n\t\ttoShowDesktop.forEach(e => e.classList.remove('u-hide-on-desktop-full'));\r\n\r\n\t\tconst toShowMobile = showAllOnMore ? elementElsMobile.splice(0, elementElsMobile.length) : elementElsMobile.splice(0, sizeMobile);\r\n\t\ttoShowMobile.forEach(e => e.classList.remove('u-hide-on-mobile-full'));\r\n\r\n\t\ttoggleButtonVisibility(elementElsDesktop.length === 0, elementElsMobile.length === 0);\r\n\t\tafterShowMore && afterShowMore();\r\n\t};\r\n\r\n\tconst showMore = () => {\r\n\t\tcurrentPage = currentPage + 1;\r\n\t\tbuttonEl.dataset.currentpage = currentPage.toString();\r\n\t\tif (parameter) {\r\n\t\t\tlet url = location.href;\r\n\t\t\tlet urlParameter = parameter ? parameter : \"currentpage\";\r\n\t\t\tif (arrayCounter >= 0) urlParameter += \"[\" + arrayCounter + \"]\";\r\n\t\t\turl = updateParameter(urlParameter.toLowerCase(), buttonEl.dataset.currentpage, url.toLowerCase());\r\n\t\t\thistory.replaceState(null, '', url.toLowerCase());\r\n\t\t}\r\n\r\n\t\tshowElements(batchSizeMobile, batchSizeDesktop);\r\n\t};\r\n\r\n\tconst disposableEvents = compositeDisposable(\r\n\t\t[\r\n\t\t\texpressEventListener(buttonEl, 'click', (e: Event) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tshowMore();\r\n\t\t\t})\r\n\t\t]\r\n\t);\r\n\r\n\t// init\r\n\t// currentPage on button different from url? => html from cache server side => init showmore here\r\n\tconst toCheckParameter = (arrayCounter > -1 && parameter ? `${parameter}[${arrayCounter}]` : parameter);\r\n\tif (currentPage > 0 && parseInt(getParameter(toCheckParameter || \"currentpage\")) != parseInt(buttonEl.dataset.currentpage || '0'))\r\n\t\tfor (let i = 0; i < currentPage; i++) {\r\n\t\t\tshowElements(batchSizeMobile, batchSizeDesktop);\r\n\t\t}\r\n\r\n\treturn {\r\n\t\tdispose: () => disposableEvents.dispose(),\r\n\t\tresetElement: () => showMore()\r\n\t};\r\n}\r\n\r\nexport function initShowMoreElements(containerEl: HTMLElement, buttonEl: HTMLElement, parameter?: string, elementSelector?: string, arrayCounter = -1, showMoreClick?: (currentPage: number) => Promise, afterShowMore?: () => void): IShowMoreElementsComponent {\r\n\tlet elementElsDesktop = expressQuerySelectorAll(containerEl, (elementSelector ? elementSelector : '.technical-showmore'));\r\n\tlet elementElsMobile = expressQuerySelectorAll(containerEl, (elementSelector ? elementSelector : '.technical-showmore'));\r\n\tconst urlParam = parseInt(getParameter(parameter));\r\n\tlet currentPage = isNaN(urlParam) ? parseInt(buttonEl.dataset.currentpage || '0', 0) : urlParam;\r\n\tconst buttonTextEl = expressQuerySelector(buttonEl, '.technical-link-text', false);\r\n\tconst buttonIconEl = expressQuerySelector(buttonEl, '.a-link__icon', false);\r\n\r\n\tif (elementElsDesktop.length === 0 && elementElsMobile.length === 0 && !showMoreClick)\r\n\t\treturn;\r\n\r\n\tconst reFetchElements = () => {\r\n\t\telementElsDesktop = expressQuerySelectorAll(containerEl, (elementSelector ? elementSelector : '.technical-showmore'));\r\n\t\telementElsMobile = expressQuerySelectorAll(containerEl, (elementSelector ? elementSelector : '.technical-showmore'));\r\n\t};\r\n\r\n\tconst showElements = () => {\r\n\t\tif (showMoreClick)\r\n\t\t\treturn showMoreClick(currentPage)\r\n\t\t\t\t.then(x => {\r\n\t\t\t\t\tafterShowMore && afterShowMore();\r\n\t\t\t\t});\r\n\r\n\t\treFetchElements();\r\n\t\telementElsDesktop.forEach(e => e.classList.remove('u-hide-on-desktop-full'));\r\n\t\telementElsMobile.forEach(e => e.classList.remove('u-hide-on-mobile-full'));\r\n\r\n\t\tafterShowMore && afterShowMore();\r\n\t};\r\n\r\n\tconst hideElements = () => {\r\n\t\treFetchElements();\r\n\t\telementElsDesktop.slice(parseInt(buttonEl.dataset.baseamount || '0', 10), elementElsDesktop.length).forEach(e => e.classList.add('u-hide-on-desktop-full'));\r\n\t\telementElsMobile.slice(parseInt(buttonEl.dataset.baseamount || '0', 10), elementElsDesktop.length).forEach(e => e.classList.add('u-hide-on-mobile-full'));\r\n\r\n\t\tafterShowMore && afterShowMore();\r\n\t};\r\n\r\n\tconst updateUrl = (add: boolean) => {\r\n\t\tif (!add && currentPage !== 0)\r\n\t\t\tcurrentPage-=1;\r\n\t\telse if (add && currentPage !== 1)\r\n\t\t\tcurrentPage+=1;\r\n\t\tbuttonEl.dataset.currentpage = currentPage.toString();\r\n\t\tif (parameter) {\r\n\t\t\tlet url = location.href;\r\n\t\t\tlet urlParameter = parameter ? parameter : \"currentpage\";\r\n\t\t\tif (arrayCounter >= 0) urlParameter += \"[\" + arrayCounter + \"]\";\r\n\t\t\turl = updateParameter(urlParameter.toLowerCase(), buttonEl.dataset.currentpage, url.toLowerCase());\r\n\t\t\thistory.replaceState(null, '', url.toLowerCase());\r\n\t\t}\r\n\t};\r\n\r\n\tconst showMore = (shouldUpdateUrl = false) => {\r\n\t\tshouldUpdateUrl && updateUrl(true);\r\n\t\tshowElements();\r\n\t};\r\n\r\n\tconst showLess = (shouldUpdateUrl = false) => {\r\n\t\tshouldUpdateUrl && updateUrl(false);\r\n\t\thideElements();\r\n\t};\r\n\r\n\tconst setShowLess = (shouldUpdateUrl = false) => {\r\n\t\tbuttonTextEl.innerHTML = buttonEl.dataset.lesstext;\r\n\t\tbuttonIconEl.classList.add('icon-arrow-up');\r\n\t\tbuttonIconEl.classList.remove('icon-arrow-down');\r\n\t\tshowMore(shouldUpdateUrl);\r\n\t};\r\n\r\n\tconst setShowMore = (shouldUpdateUrl = false) => {\r\n\t\tbuttonTextEl.innerHTML = buttonEl.dataset.moretext;\r\n\t\tbuttonIconEl.classList.remove('icon-arrow-up');\r\n\t\tbuttonIconEl.classList.add('icon-arrow-down');\r\n\t\tshowLess(shouldUpdateUrl);\r\n\t};\r\n\r\n\tconst toggle = () => {\r\n\t\tif (buttonTextEl && buttonIconEl) {\r\n\t\t\tif (buttonTextEl.innerHTML === buttonEl.dataset.moretext) {\r\n\t\t\t\tsetShowLess(true);\r\n\t\t\t} else {\r\n\t\t\t\tsetShowMore(true);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tshowMore(true);\r\n\t\t}\r\n\t};\r\n\r\n\tconst disposableEvents = compositeDisposable(\r\n\t\t[\r\n\t\t\texpressEventListener(buttonEl, 'click', (e: Event) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\ttoggle();\r\n\t\t\t})\r\n\t\t]\r\n\t);\r\n\r\n\tconst cleanUrl = () => {\r\n\t\tif (parameter) queryRemoveKeys([parameter]);\r\n\t};\r\n\r\n\t// init\r\n\t// currentPage on button different from url? => html from cache server side => init show more here\r\n\t// only for POP, DSP isn't cached and set server side\r\n\tconst toCheckParameter = (arrayCounter > -1 && parameter ? `${parameter}[${arrayCounter}]` : parameter);\r\n\tif (buttonTextEl && buttonIconEl && parseInt(getParameter(toCheckParameter) || '0') != parseInt(buttonEl.dataset.currentpage || '0'))\r\n\t\tif (currentPage === 1) {\r\n\t\t\tsetShowLess();\r\n\t\t} else {\r\n\t\t\tsetShowMore();\r\n\t\t}\r\n\r\n\treturn {\r\n\t\tdispose: () => disposableEvents.dispose(),\r\n\t\tresetElement: () => {\r\n\t\t\tsetShowMore(false);\r\n\t\t\tcleanUrl();\r\n\t\t}\r\n\t};\r\n}\r\n","export function findInsertIndex(arr: HTMLElement[], val: HTMLDivElement, getIndexOfElement: (val1: HTMLElement) => number): number {\r\n\t// Lower and upper bounds\r\n\tlet start = 0;\r\n\tlet end = arr.length - 1;\r\n\tconst indexOfElement = getIndexOfElement(val);\r\n\r\n\t// Traverse the search space\r\n\twhile (start <= end) {\r\n\t\tconst mid = Math.floor((start + end) / 2);\r\n\t\tconst index = getIndexOfElement(arr[mid]);\r\n\r\n\t\t// If K is found\r\n\t\tif (index == indexOfElement)\r\n\t\t\treturn mid;\r\n\t\telse if (index < indexOfElement)\r\n\t\t\tstart = mid + 1;\r\n\t\telse\r\n\t\t\tend = mid - 1;\r\n\t}\r\n\r\n\t// Return insert position\r\n\treturn end + 1;\r\n}\r\n","export enum TemplateType { Text = 0, Icon = 1 }\r\nexport enum TypeOfFilter { Regular = 0,\tMultiSelect = 1, Icons = 2, Slider = 3 }\r\nexport interface IFilterDependencies {\r\n\treadonly onFilter?: (multiselect: boolean, filterName: string, filterValue: string, checked: boolean, containerEl: HTMLElement, updateValue?: boolean) => void;\r\n\treadonly addFilterTemplate?: (templateType: TemplateType, filterCategory: string, selectedFilterName: string, htmlOrColor: string, removeFilterEvent: any) => HTMLDivElement;\r\n\treadonly attachRemoveFilterEvent?: (selectedFiltersContainerEl: HTMLElement, filterForCategory: string, removeEvent: any, filterForCategoryValue?: string) => void;\r\n\treadonly removeFromFilterContainer?: (filtersContainerEl: HTMLElement, selectedFiltersContainerEl: HTMLElement, filterCategory: string, filterCategoryValue?: string) => void;\r\n\treadonly showSelectedFilters?: (filtersContainerEl: HTMLElement, selectedFiltersContainerEl: HTMLElement) => void;\r\n\treadonly toggleResetFilters?: (filtersContainerEl: HTMLElement, force?: boolean) => void;\r\n\treadonly updateParametersForUrl?: (typeOfFilter: TypeOfFilter, filterQs: string, msg: string, removeFromUrl: boolean, analytics?: string, possibleValues?: string[]) => void;\r\n\treadonly addTextToFilterContainer?: (filtersContainerEl: HTMLElement, typeOfFilter: TypeOfFilter, selectedFiltersContainerEl: HTMLElement, filterCategory: string, selectedFilterValue: string, removeFilterEvent: any, selectedFilterName?: string) => void;\r\n}\r\n\r\n","// SG organism: http://brandplatform.smartphoto.com/general/organisms/highlighted-tiles/\r\nimport { expressEventListener, expressQuerySelectorAll } from \"../common/html\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\nimport { debounce } from \"../utils/debounce\";\r\nimport { createTruncate, ITruncate } from \"./truncate\";\r\nimport {initVideoPlayer} from \"./video-player\";\r\n\r\nexport enum Device {\r\n\tDesktop = 1,\r\n\tTablet = 2,\r\n\tMobile = 3\r\n}\r\n\r\nexport function createHighlightedTiles(containerEl: HTMLElement) {\r\n\tconst truncateEls = expressQuerySelectorAll(containerEl, '.technical-shave');\r\n\tconst videoEls = expressQuerySelectorAll(containerEl, '.technical-video-tile');\r\n\r\n\tlet eventDisposable: IDisposable;\r\n\tlet currentDevice: Device;\r\n\r\n\tconst getDevice = (): Device => {\r\n\t\tif (window.innerWidth <= 767) {\r\n\t\t\treturn Device.Mobile;\r\n\t\t} else if (window.innerWidth > 768 && window.innerWidth < 960) {\r\n\t\t\treturn Device.Tablet;\r\n\t\t} else {\r\n\t\t\treturn Device.Desktop;\r\n\t\t}\r\n\t};\r\n\r\n\tconst onResize = () =>\r\n\t\tcurrentDevice !== getDevice() &&\r\n\t\ttruncatedEls.forEach(t => t.updateConfig({ lines: 2 }));\r\n\r\n\tlet truncatedEls: ITruncate[] = [];\r\n\r\n\tconst init = () => {\r\n\t\ttruncatedEls = truncateEls.map(el => createTruncate(el, { lines: 2 }));\r\n\t\teventDisposable = expressEventListener(window, \"resize\", debounce(onResize, 250));\r\n\t\tvideoEls && videoEls.forEach(vEl => initVideoPlayer(vEl));\r\n\t};\r\n\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposable.dispose();\r\n\t\t\ttruncatedEls.forEach(t => t.dispose());\r\n\t\t}\r\n\t};\r\n}\r\n","import {expressEventListener, expressQuerySelector, expressQuerySelectorAll, expressRemoveClass} from \"../common/html\";\r\nimport { debounce } from \"../utils/debounce\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\nimport { createTruncate, ITruncate, ITruncateOptions } from \"./truncate\";\r\nexport enum Device {\r\n\tDesktop = 1,\r\n\tTablet = 2,\r\n\tMobile = 3\r\n}\r\n\r\nexport function createImageDescription(containerEl: HTMLElement) {\r\n\tconst truncateEls = expressQuerySelectorAll(containerEl, '.technical-shave');\r\n\tconst getDevice = (): Device => window.innerWidth <= 767 ? Device.Mobile : Device.Desktop;\r\n\tlet currentDevice: Device = getDevice();\r\n\tlet truncatedEls: ITruncate[] = [];\r\n\tconst useMaxHeight = expressQuerySelectorAll(containerEl, '.technical-max-width').length > 0;\r\n\tconst button = expressQuerySelector(containerEl, '.technical-image-description-button', false);\r\n\r\n\tconst outerHeight = (el?: HTMLElement, includeOffset = true) => {\r\n\t\tif (!el) return 0;\r\n\t\tlet height = includeOffset ? el.offsetHeight : 0;\r\n\t\tconst style = getComputedStyle(el);\r\n\t\theight += parseInt(style.marginTop || '0', 10) + parseInt(style.marginBottom || '0', 10);\r\n\t\treturn height;\r\n\t};\r\n\r\n\tconst calculateTruncateMaxHeight = (): number => {\r\n\t\tlet maxHeight = outerHeight(expressQuerySelector(containerEl, '.technical-image-container', false) || expressQuerySelector(containerEl, '.technical-video-container', false));\r\n\t\tif (!maxHeight) return undefined;\r\n\r\n\t\tconst headerStyle = getComputedStyle(expressQuerySelector(containerEl, '.m-image-description__header', false));\r\n\r\n\t\tmaxHeight -= (parseInt(headerStyle.marginTop || '0') + parseInt(headerStyle.marginBottom || '0')); // header margins around the text\r\n\t\tmaxHeight -= outerHeight(expressQuerySelector(containerEl, '.m-image-description__title-content', false)); // titleEl => take element with margin to calculate this in the maxheight\r\n\t\tmaxHeight -= outerHeight(button);\r\n\r\n\t\tmaxHeight += parseInt(headerStyle.lineHeight || '1') * 2; // for special cases that need a few extra pixels to show there content\r\n\r\n\t\treturn maxHeight;\r\n\t};\r\n\r\n\tconst removeSkeletons = () => {\r\n\t\tconst skeletonEls = expressQuerySelectorAll(containerEl, '.skeleton-loading');\r\n\t\tskeletonEls.forEach(el => expressRemoveClass(el, 'skeleton-loading'));\r\n\t};\r\n\r\n\tconst getTruncateOptions = (useMaxHeight: boolean): ITruncateOptions => {\r\n\t\tswitch (currentDevice) {\r\n\t\t\tcase Device.Mobile: return { lines: button ? 4 : 999, onInitEvent: removeSkeletons};\r\n\t\t\tcase Device.Desktop: return {\r\n\t\t\t\tlines: button ? 4 : undefined,\r\n\t\t\t\tmaxHeight: useMaxHeight ? calculateTruncateMaxHeight() : undefined,\r\n\t\t\t\tonInitEvent: removeSkeletons\r\n\t\t\t};\r\n\t\t\tdefault: return { onInitEvent: removeSkeletons };\r\n\t\t}\r\n\t};\r\n\r\n\tconst onResize = () => {\r\n\t\tconst device = getDevice();\r\n\t\tif (currentDevice == device) return;\r\n\r\n\t\tcurrentDevice = device;\r\n\t\ttruncatedEls.forEach(t => t.updateConfig(getTruncateOptions(useMaxHeight), true));\r\n\t};\r\n\r\n\t// init\r\n\ttruncatedEls = truncateEls.map(el => createTruncate(el, getTruncateOptions(useMaxHeight)));\r\n\tif (!truncateEls || truncateEls.length === 0) {\r\n\t\tremoveSkeletons();\r\n\t}\r\n\tbutton && button.getAttribute('href') && button.addEventListener('click', _ => window.location.href = button.getAttribute('href'));\r\n\texpressEventListener(window, \"resize\", debounce(onResize, 250));\r\n}\r\n","import {ICollapsable} from \"../collapsable\";\r\nimport {getParameter} from \"../../utils/querystring\";\r\nimport {expressEventListener, expressQuerySelector} from \"../../common/html\";\r\nimport {trackFiltersEvent} from \"../../common/events\";\r\nimport {IFilterDependencies, TypeOfFilter} from \"../../common/filter\";\r\n\r\nexport function createCheckBoxSelectFilter(collapsableComponent: ICollapsable, typeOfFilter: TypeOfFilter, selectedFiltersContainerEl: HTMLElement, filterqs: string, filterCategory: string, filterEl: HTMLElement, checkboxEls: HTMLElement[], possibleValues: string[], containerEl: HTMLElement, deps: IFilterDependencies) {\r\n\tconst selectedFilterName = filterEl.dataset.filterelement;\r\n\tconst selectedFilter = decodeURIComponent(getParameter(filterqs)).split(',');\r\n\tconst selectedLabel = expressQuerySelector(filterEl, '.technical-label', false);\r\n\tconst regExpForNumberInParentheses = /\\(([0-9]+)\\)$/;\r\n\r\n\tconst {\r\n\t\tupdateParametersForUrl,\r\n\t\tremoveFromFilterContainer,\r\n\t\tonFilter,\r\n\t\tattachRemoveFilterEvent,\r\n\t\ttoggleResetFilters,\r\n\t\taddTextToFilterContainer\r\n\t} = deps;\r\n\r\n\tconst removeSingleSelectFilter = () => {\r\n\t\tif (typeOfFilter === TypeOfFilter.Regular)\r\n\t\t\tcheckboxEls.forEach(el => {\r\n\t\t\t\tconst checkboxEl = expressQuerySelector(el, 'input[type=checkbox],input[type=radio]', true);\r\n\t\t\t\tcheckboxEl.checked = false;\r\n\t\t\t});\r\n\t\telse {\r\n\t\t\tconst filterCheckboxEl = expressQuerySelector(filterEl, 'input[type=checkbox],input[type=radio]', true);\r\n\t\t\tfilterCheckboxEl.checked = false;\r\n\t\t}\r\n\r\n\t\tif (onFilter)\r\n\t\t\tonFilter(typeOfFilter !== TypeOfFilter.Regular, filterqs, filterCheckboxEl.value, filterCheckboxEl.checked, containerEl, true);\r\n\r\n\t\tupdateParametersForUrl(typeOfFilter, filterqs, selectedFilterName, true, filterEl.dataset.analytics, possibleValues);\r\n\t\tremoveFromFilterContainer(containerEl, selectedFiltersContainerEl, filterCategory, selectedFilterName);\r\n\t};\r\n\r\n\tconst addSingleSelectFilter = (checkBoxEl: HTMLInputElement) => {\r\n\t\tif (typeOfFilter === TypeOfFilter.Regular)\r\n\t\t\tcheckboxEls.filter(f => f.dataset.filterelement != selectedFilterName).forEach(el => {\r\n\t\t\t\tconst checkboxEl = expressQuerySelector(el, 'input[type=checkbox],input[type=radio]', false);\r\n\t\t\t\tif (checkboxEl)\r\n\t\t\t\t\tcheckboxEl.checked = false;\r\n\t\t\t});\r\n\r\n\t\tif (checkBoxEl.checked)\r\n\t\t\taddTextToFilterContainer(containerEl, typeOfFilter, selectedFiltersContainerEl, filterCategory, selectedFilterName, removeSingleSelectFilter, filterEl.dataset.selectedtext || selectedLabel?.textContent.replace(regExpForNumberInParentheses, ''));\r\n\t\telse\r\n\t\t\tremoveFromFilterContainer(containerEl, selectedFiltersContainerEl, filterCategory, selectedFilterName);\r\n\t};\r\n\r\n\tif (selectedFiltersContainerEl)\r\n\t\tattachRemoveFilterEvent(selectedFiltersContainerEl, filterCategory, removeSingleSelectFilter, selectedFilterName);\r\n\r\n\tconst filterCheckboxEl = expressQuerySelector(filterEl, 'input[type=checkbox],input[type=radio]', true);\r\n\texpressEventListener(filterEl, 'change', function () {\r\n\t\tif (onFilter)\r\n\t\t\tonFilter(typeOfFilter !== TypeOfFilter.Regular, filterqs, filterCheckboxEl.value, filterCheckboxEl.checked, containerEl, true);\r\n\t\tif (filterqs)\r\n\t\t{\r\n\t\t\taddSingleSelectFilter(filterCheckboxEl);\r\n\t\t\tupdateParametersForUrl(typeOfFilter, filterqs, filterEl.dataset.filterelement, !filterCheckboxEl.checked, filterEl.dataset.analytics, possibleValues);\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttrackFiltersEvent('FilterClicked', { filter: `${filterCategory}_${filterEl.dataset.analytics || filterEl.dataset.filterelement}` });\r\n\t\t\taddSingleSelectFilter(filterCheckboxEl);\r\n\t\t}\r\n\t});\r\n\r\n\tif (selectedFilter && filterCheckboxEl && selectedFilterName && selectedFilter.includes(selectedFilterName.toLowerCase())) {\r\n\t\tconst valueWasUpdated = !filterCheckboxEl.checked;\r\n\t\tfilterCheckboxEl.checked = true;\r\n\r\n\t\tif (onFilter)\r\n\t\t\tonFilter(typeOfFilter !== TypeOfFilter.Regular, filterqs, filterCheckboxEl.value, filterCheckboxEl.checked, containerEl, valueWasUpdated);\r\n\t\ttoggleResetFilters(containerEl, false);\r\n\t\taddSingleSelectFilter(filterCheckboxEl);\r\n\t\tcollapsableComponent.open();\r\n\t}\r\n}\r\n","import {ICollapsable} from \"../collapsable\";\r\nimport {getParameter} from \"../../utils/querystring\";\r\nimport {expressEventListener, expressQuerySelector, expressQuerySelectorAll} from \"../../common/html\";\r\nimport {findInsertIndex} from \"../../utils/dom-tree\";\r\nimport {IFilterDependencies, TemplateType, TypeOfFilter} from \"../../common/filter\";\r\n\r\nexport function createColorFilter(collapsableComponent: ICollapsable, selectedFiltersContainerEl: HTMLElement, queryString: string, filterCategory: string, filterEl: HTMLElement, containerEl: HTMLElement, possibleUrlValues: string[], deps: IFilterDependencies) {\r\n\tconst selectedFilterName = filterEl.dataset.filterelement;\r\n\tconst selectedFilter = decodeURIComponent(getParameter(queryString)).split(',');\r\n\tconst {\r\n\t\tshowSelectedFilters,\r\n\t\taddFilterTemplate,\r\n\t\tupdateParametersForUrl,\r\n\t\tremoveFromFilterContainer,\r\n\t\tonFilter,\r\n\t\tattachRemoveFilterEvent,\r\n\t\ttoggleResetFilters\r\n\t} = deps;\r\n\r\n\tconst addColorToFilterContainer = (containerEl: HTMLElement, selectedFiltersContainerEl: HTMLElement, selectedFilterName: string, filterForCategory: string, removeFilterEvent: any) => {\r\n\t\tshowSelectedFilters(containerEl, selectedFiltersContainerEl);\r\n\r\n\t\tif (!selectedFiltersContainerEl)\r\n\t\t\treturn;\r\n\r\n\t\tconst selectedFilterEl = expressQuerySelector(selectedFiltersContainerEl, `[data-filterforcategory=\"${filterForCategory}\"][data-filterforcategoryvalue=\"${selectedFilterName}\"]`, false);\r\n\t\tif (selectedFilterEl) return;\r\n\r\n\t\tconst colorFilter = addFilterTemplate(TemplateType.Icon, filterForCategory, selectedFilterName, selectedFilterName, removeFilterEvent);\r\n\t\tconst allSelectedColorFilters = expressQuerySelectorAll(selectedFiltersContainerEl, `[data-filterforcategory=\"${filterForCategory}\"]`);\r\n\t\tif (allSelectedColorFilters.length) {\r\n\t\t\tallSelectedColorFilters[allSelectedColorFilters.length - 1].insertAdjacentElement('afterend', colorFilter);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst compare = (val1: HTMLElement) => filters.findIndex(e => val1.dataset.filterforcategory === e.dataset.filtercategory);\r\n\t\tconst filters = expressQuerySelectorAll(document, '[data-typeoffilter][data-filtercategory]') as HTMLElement[];\r\n\t\tconst selectedFiltersChildren = expressQuerySelectorAll(selectedFiltersContainerEl, '[data-filterforcategory]');\r\n\t\tconst index = findInsertIndex(selectedFiltersChildren, colorFilter, compare);\r\n\t\tconst elementToInsertBefore = selectedFiltersChildren[index];\r\n\t\tif (!elementToInsertBefore || index <= -1 || index > selectedFiltersChildren.length) {\r\n\t\t\tselectedFiltersContainerEl.appendChild(colorFilter);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telementToInsertBefore.insertAdjacentElement('beforebegin', colorFilter);\r\n\t};\r\n\r\n\tconst removeColorFilter = () => {\r\n\t\tfilterEl.classList.remove(\"a-icon--selected\");\r\n\t\tfilterEl.classList.add(\"a-icon--unselected\");\r\n\r\n\t\tupdateParametersForUrl(TypeOfFilter.Icons, queryString, selectedFilterName, true, filterEl.dataset.analytics, possibleUrlValues);\r\n\t\tremoveFromFilterContainer(containerEl, selectedFiltersContainerEl, filterCategory, selectedFilterName);\r\n\t\tonFilter && onFilter(true, queryString, filterEl.dataset.filterelement, false, containerEl, true);\r\n\t};\r\n\r\n\tconst toggleColorFilter = () => {\r\n\t\tconst selected = filterEl.classList.contains(\"a-icon--selected\");\r\n\t\tonFilter && onFilter(true, queryString, filterEl.dataset.filterelement, !selected, containerEl, true);\r\n\r\n\t\tif (selected) {\r\n\t\t\tfilterEl.classList.remove(\"a-icon--selected\");\r\n\t\t\tfilterEl.classList.add(\"a-icon--unselected\");\r\n\r\n\t\t\tremoveFromFilterContainer(containerEl, selectedFiltersContainerEl, filterCategory, selectedFilterName);\r\n\t\t} else {\r\n\t\t\tfilterEl.classList.remove(\"a-icon--unselected\");\r\n\t\t\tfilterEl.classList.add(\"a-icon--selected\");\r\n\r\n\t\t\taddColorToFilterContainer(containerEl, selectedFiltersContainerEl, selectedFilterName, filterCategory, removeColorFilter);\r\n\t\t}\r\n\r\n\t\tupdateParametersForUrl(TypeOfFilter.Icons, queryString, filterEl.dataset.filterelement, selected, filterEl.dataset.analytics, possibleUrlValues);\r\n\t};\r\n\r\n\tif (selectedFiltersContainerEl)\r\n\t\tattachRemoveFilterEvent(selectedFiltersContainerEl, filterCategory, removeColorFilter, filterEl.dataset.filterelement);\r\n\r\n\texpressEventListener(filterEl, 'click', () => toggleColorFilter());\r\n\r\n\tif (selectedFilter && selectedFilter.includes(filterEl.dataset.filterelement.toLowerCase())) {\r\n\t\tif (filterEl.classList.contains('a-icon--selected'))\r\n\t\t\tonFilter && onFilter(true, queryString, filterEl.dataset.filterelement, true, containerEl, false);\r\n\t\tcollapsableComponent.open();\r\n\t\ttoggleResetFilters(containerEl, false);\r\n\t}\r\n}\r\n","import { ICollapsable } from \"../collapsable\";\r\nimport { expressEventListener, expressQuerySelector, getParentWithClassName } from \"../../common/html\";\r\nimport { getParameter } from \"../../utils/querystring\";\r\nimport { TypeOfFilter, IFilterDependencies } from \"../../common/filter\";\r\nimport { onlyNumber } from \"../../utils/validation\";\r\n\r\nexport interface IRangeFilter {\r\n\treadonly filterQs: string;\r\n\treadonly disable: (selectOptionValue: string[]) => void;\r\n\treadonly enable: (selectOptionValue: string[]) => void;\r\n\treadonly getSelectOptions: () => string[];\r\n\treadonly removeRangeFilter: (update?: boolean) => void;\r\n}\r\n\r\nexport function createRangeFilter(collapsableComponent: ICollapsable, selectedFiltersContainerEl: HTMLElement, filterQs: string, filterCategory: string, filterEl: HTMLElement, showSliderEls: HTMLInputElement[], filtersContainerEl: HTMLElement, deps: IFilterDependencies): IRangeFilter {\r\n\tconst {\r\n\t\tupdateParametersForUrl,\r\n\t\tremoveFromFilterContainer,\r\n\t\tonFilter,\r\n\t\tattachRemoveFilterEvent,\r\n\t\ttoggleResetFilters,\r\n\t\taddTextToFilterContainer\r\n\t} = deps;\r\n\tconst outOfBoundsMinBarEl = expressQuerySelector(filterEl, \".a-form-input__slider-pre-bar\", true);\r\n\tconst outOfBoundsMaxBarEl = expressQuerySelector(filterEl, \".a-form-input__slider-post-bar\", true);\r\n\tconst sliderMinRangeInputEl = expressQuerySelector(filterEl, \".a-form-input__slider-range--min\", true);\r\n\tconst sliderMaxRangeInputEl = expressQuerySelector(filterEl, \".a-form-input__slider-range--max\", true);\r\n\tconst sliderMinRangeThumbEl = expressQuerySelector(filterEl, \".a-form-input__slider-thumb--min\", true);\r\n\tconst sliderMaxRangeThumbEl = expressQuerySelector(filterEl, \".a-form-input__slider-thumb--max\", true);\r\n\r\n\tconst containerEl = expressQuerySelector(filterEl, \".a-form-input__slider-container\", true);\r\n\tconst containerMinSliderTextInputEl = expressQuerySelector(containerEl, \".a-form-input__slider-bubble-container--min\", true);\r\n\tconst containerMaxSliderTextInputEl = expressQuerySelector(containerEl, \".a-form-input__slider-bubble-container--max\", true);\r\n\tconst sliderMinTextInputEl = expressQuerySelector(containerMinSliderTextInputEl, \".a-form-input__slider-bubble--min\", true);\r\n\tconst sliderMaxTextInputEl = expressQuerySelector(containerMaxSliderTextInputEl, \".a-form-input__slider-bubble--max\", true);\r\n\r\n\tconst originalMinValue = sliderMinRangeInputEl.min;\r\n\tconst originalMaxValue = sliderMaxRangeInputEl.max;\r\n\tlet currentMinValue = sliderMinRangeInputEl.min;\r\n\tlet currentMaxValue = sliderMaxRangeInputEl.max;\r\n\tlet valueChanged = false;\r\n\tconst selectedFilter = getParameter(filterQs);\r\n\tlet timeout: NodeJS.Timeout = undefined; // timeout to trigger selected value\r\n\r\n\tconst deselect = (currentEl?: HTMLInputElement | null) => {\r\n\t\tif (showSliderEls.length) filterEl.classList.add(\"u-hide\");\r\n\r\n\t\tshowSliderEls.forEach(chk => {\r\n\t\t\tif (currentEl && currentEl.id !== chk.id) chk.checked = false;\r\n\t\t\tif (!currentEl) chk.checked = false;\r\n\t\t});\r\n\t};\r\n\r\n\tconst drawSlider = (sliderRangeInputEl: HTMLInputElement, sliderRangeThumbEl: HTMLElement, sliderTextInputEl: HTMLInputElement, containerSliderTextInputEl: HTMLElement, outOfBoundsBarEl: HTMLElement, isLeftSliderMoved: boolean, isTextInputChanged: boolean): boolean => {\r\n\t\tconst rangeMin = parseInt(sliderRangeInputEl.min);\r\n\t\tconst rangeMax = parseInt(sliderRangeInputEl.max);\r\n\r\n\t\tif (isTextInputChanged) {\r\n\t\t\t// Value is empty => correct to currentValue\r\n\t\t\tif (!sliderTextInputEl.value) {\r\n\t\t\t\tif (isLeftSliderMoved)\r\n\t\t\t\t\tsliderTextInputEl.value = currentMinValue;\r\n\t\t\t\telse\r\n\t\t\t\t\tsliderTextInputEl.value = currentMaxValue;\r\n\t\t\t\treturn false;\r\n\t\t\t} else {\r\n\t\t\t\t// Value hasn't changed return false to omit updating the page\r\n\t\t\t\tif (isLeftSliderMoved && sliderTextInputEl.value === currentMinValue || !isLeftSliderMoved && sliderTextInputEl.value === currentMaxValue) return false;\r\n\r\n\t\t\t\tlet value = isLeftSliderMoved\r\n\t\t\t\t\t? parseInt(sliderTextInputEl.value) < parseInt(sliderMinRangeInputEl.min) ? parseInt(sliderMinRangeInputEl.min) : parseInt(sliderTextInputEl.value)\r\n\t\t\t\t\t: parseInt(sliderTextInputEl.value) > parseInt(sliderMaxRangeInputEl.max) ? parseInt(sliderMaxRangeInputEl.max) : parseInt(sliderTextInputEl.value);\r\n\r\n\t\t\t\t// !value triggers on 0 => we don't want this\r\n\t\t\t\tif (value !== 0 && !value)\r\n\t\t\t\t\tvalue = isLeftSliderMoved\r\n\t\t\t\t\t\t? parseInt(sliderMaxRangeInputEl.min)\r\n\t\t\t\t\t\t: parseInt(sliderMinRangeInputEl.max);\r\n\r\n\t\t\t\t// Numerical value => use it or fallback to max or min if bounds are exceeded\r\n\t\t\t\tsliderTextInputEl.value = isLeftSliderMoved\r\n\t\t\t\t\t? Math.min(value, parseInt(sliderMaxRangeInputEl.value)).toString()\r\n\t\t\t\t\t: Math.max(value, parseInt(sliderMinRangeInputEl.value)).toString();\r\n\r\n\t\t\t\tsliderRangeInputEl.value = sliderTextInputEl.value;\r\n\t\t\t}\r\n\r\n\t\t\t// All ok, save new values\r\n\t\t\tif (isLeftSliderMoved)\r\n\t\t\t\tcurrentMinValue = sliderTextInputEl.value;\r\n\t\t\telse\r\n\t\t\t\tcurrentMaxValue = sliderTextInputEl.value;\r\n\r\n\t\t} else {\r\n\t\t\tsliderRangeInputEl.value = isLeftSliderMoved\r\n\t\t\t\t? Math.min(parseInt(sliderRangeInputEl.value), parseInt(sliderMaxRangeInputEl.value)).toString()\r\n\t\t\t\t: Math.max(parseInt(sliderRangeInputEl.value), parseInt(sliderMinRangeInputEl.value)).toString();\r\n\t\t\tsliderTextInputEl.value = sliderRangeInputEl.value;\r\n\t\t}\r\n\r\n\t\t// set correct z index when inputs on max/min so user can slide again\r\n\t\tif ((!isLeftSliderMoved && parseInt(sliderTextInputEl.value) === rangeMax)\r\n\t\t\t|| (isLeftSliderMoved && parseInt(sliderTextInputEl.value) === rangeMin)) {\r\n\t\t\tconst sliderCompletelyOnMax = !isLeftSliderMoved && parseInt(sliderTextInputEl.value) === rangeMax;\r\n\r\n\t\t\tsliderMaxRangeInputEl.style.zIndex = sliderCompletelyOnMax ? '1' : '2';\r\n\t\t\tsliderMinRangeInputEl.style.zIndex = sliderCompletelyOnMax ? '2' : '1';\r\n\t\t}\r\n\r\n\t\tconst percent = (min, max) => Math.ceil(((parseInt(sliderRangeInputEl.value) - min) / (max - min)) * 100);\r\n\t\tconst percentStyle = percent(rangeMin, rangeMax) + '%';\r\n\t\tconst reversePercentStyle = 100 - percent(rangeMin, rangeMax) + '%';\r\n\r\n\t\tconst inBoundsBarEl = expressQuerySelector(filterEl, \".a-form-input__slider-range\", true);\r\n\t\tif (isLeftSliderMoved) {\r\n\t\t\tinBoundsBarEl.style.left = percentStyle;\r\n\t\t\toutOfBoundsBarEl.style.width = percentStyle;\r\n\t\t} else {\r\n\t\t\tinBoundsBarEl.style.right = reversePercentStyle;\r\n\t\t\toutOfBoundsBarEl.style.width = reversePercentStyle;\r\n\t\t}\r\n\r\n\t\tsliderRangeThumbEl.style.left = percentStyle;\r\n\t\treturn true;\r\n\t};\r\n\r\n\tconst getSliderValue = () => {\r\n\t\tconst isNoneSelected = isNoneInputSelected();\r\n\t\tconst checkedOptionValue = showSliderEls.length > 0 && showSliderEls.some(x => x.checked) ? `${showSliderEls.find(x => x.checked).value}` : '';\r\n\t\treturn isNoneSelected ? `${checkedOptionValue}_0` : `${checkedOptionValue}_${sliderMinTextInputEl.value}-${sliderMaxTextInputEl.value}`;\r\n\t};\r\n\tconst onInput = (sliderTextInputEl: HTMLInputElement) => {\r\n\t\tif (!onlyNumber(sliderTextInputEl.value) || isNaN(parseInt(sliderTextInputEl.value))) {\r\n\t\t\tsliderTextInputEl.value = '';\r\n\t\t}\r\n\t};\r\n\r\n\tconst isNoneInputSelected = () => {\r\n\t\treturn showSliderEls.some(x => !x.classList.contains('technical-show-slider') && x.checked);\r\n\t};\r\n\r\n\tconst hideSlider = (el: HTMLInputElement) => {\r\n\t\tif (!showSliderEls.length) return;\r\n\r\n\t\tif (showSliderEls.every(f => !f.checked))\r\n\t\t\tremoveRangeFilter();\r\n\t\telse {\r\n\t\t\tconst showSlider = el.classList.contains(\"technical-show-slider\") && el.checked;\r\n\r\n\t\t\tif (showSlider) {\r\n\t\t\t\tconst max = sliderMaxRangeInputEl.max;\r\n\t\t\t\tconst min = sliderMinRangeInputEl.min;\r\n\r\n\t\t\t\tsliderMinTextInputEl.value = min;\r\n\t\t\t\tsliderMaxTextInputEl.value = max;\r\n\t\t\t\tsliderMinRangeInputEl.value = min;\r\n\t\t\t\tsliderMaxRangeInputEl.value = max;\r\n\r\n\t\t\t\tdrawSlider(sliderMinRangeInputEl, sliderMinRangeThumbEl, sliderMinTextInputEl, containerMinSliderTextInputEl, outOfBoundsMinBarEl, true, false);\r\n\t\t\t\tdrawSlider(sliderMaxRangeInputEl, sliderMaxRangeThumbEl, sliderMaxTextInputEl, containerMaxSliderTextInputEl, outOfBoundsMaxBarEl, false, false);\r\n\r\n\t\t\t\taddTextToFilterContainer(filtersContainerEl, TypeOfFilter.Slider, selectedFiltersContainerEl, filterCategory, min + \" - \" + max, removeRangeFilter);\r\n\t\t\t\tfilterEl.classList.remove(\"u-hide\");\r\n\t\t\t\ttriggerValueClicked(true);\r\n\t\t\t} else {\r\n\t\t\t\taddTextToFilterContainer(filtersContainerEl, TypeOfFilter.Slider, selectedFiltersContainerEl, filterCategory, \"0\", removeRangeFilter);\r\n\t\t\t\tfilterEl.classList.add(\"u-hide\");\r\n\t\t\t\ttriggerValueClicked(true);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst addSliderFilter = () => {\r\n\t\tconst isNoneSelected = isNoneInputSelected();\r\n\r\n\t\tconst min = sliderMinTextInputEl.value;\r\n\t\tconst max = sliderMaxTextInputEl.value;\r\n\t\tconst value = isNoneSelected\r\n\t\t\t? '0'\r\n\t\t\t: min == max ? max : min + \" - \" + max;\r\n\r\n\t\taddTextToFilterContainer(filtersContainerEl, TypeOfFilter.Slider, selectedFiltersContainerEl, filterCategory, value, removeRangeFilter);\r\n\t\ttriggerValueClicked(true, getSliderValue());\r\n\t};\r\n\r\n\tconst triggerValueClicked = (update: boolean, valueOverride?: string) => {\r\n\t\tif (timeout) clearTimeout(timeout);\r\n\t\ttimeout = onFilter && setTimeout(() => {\r\n\t\t\tonFilter(false, filterQs, valueOverride || getSliderValue(), true, containerEl, update);\r\n\t\t}, 1000);\r\n\t};\r\n\r\n\tconst removeRangeFilter = (update = true) => {\r\n\t\tdeselect();\r\n\r\n\t\tsliderMinTextInputEl.value = originalMinValue;\r\n\t\tsliderMaxTextInputEl.value = originalMaxValue;\r\n\t\tsliderMinRangeInputEl.value = originalMinValue;\r\n\t\tsliderMaxRangeInputEl.value = originalMaxValue;\r\n\r\n\t\tdrawSlider(sliderMinRangeInputEl, sliderMinRangeThumbEl, sliderMinTextInputEl, containerMinSliderTextInputEl, outOfBoundsMinBarEl, true, false);\r\n\t\tdrawSlider(sliderMaxRangeInputEl, sliderMaxRangeThumbEl, sliderMaxTextInputEl, containerMaxSliderTextInputEl, outOfBoundsMaxBarEl, false, false);\r\n\r\n\t\tconst value = getSliderValue();\r\n\t\tonFilter(false, filterQs, value, false, containerEl, update);\r\n\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, value, true, filterEl.dataset.analytics);\r\n\t\tremoveFromFilterContainer(filtersContainerEl, selectedFiltersContainerEl, filterCategory);\r\n\t};\r\n\r\n\tif (selectedFiltersContainerEl)\r\n\t\tattachRemoveFilterEvent(selectedFiltersContainerEl, filterCategory, removeRangeFilter);\r\n\r\n\texpressEventListener(sliderMinRangeInputEl, 'mousedown', () => {\r\n\t\tsliderMinRangeInputEl.style.zIndex = \"2\";\r\n\t\tsliderMaxRangeInputEl.style.zIndex = \"1\";\r\n\t});\r\n\texpressEventListener(sliderMaxRangeInputEl, 'mousedown', () => {\r\n\t\tsliderMaxRangeInputEl.style.zIndex = \"2\";\r\n\t\tsliderMinRangeInputEl.style.zIndex = \"1\";\r\n\t});\r\n\r\n\t// Change event is fired while moving the handle\r\n\texpressEventListener(sliderMinRangeInputEl, 'input', () => {\r\n\t\tvalueChanged = drawSlider(sliderMinRangeInputEl, sliderMinRangeThumbEl, sliderMinTextInputEl, containerMinSliderTextInputEl, outOfBoundsMinBarEl, true, false);\r\n\t});\r\n\texpressEventListener(sliderMaxRangeInputEl, 'input', () => {\r\n\t\tvalueChanged = drawSlider(sliderMaxRangeInputEl, sliderMaxRangeThumbEl, sliderMaxTextInputEl, containerMaxSliderTextInputEl, outOfBoundsMaxBarEl, false, false);\r\n\t});\r\n\r\n\t// Change event is fired when you stop moving the handle\r\n\texpressEventListener(sliderMinRangeInputEl, 'change', () => {\r\n\t\tif (!valueChanged) return;\r\n\t\taddSliderFilter();\r\n\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t});\r\n\texpressEventListener(sliderMaxRangeInputEl, 'change', () => {\r\n\t\tif (!valueChanged) return;\r\n\t\taddSliderFilter();\r\n\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t});\r\n\r\n\t// Events for the input fields\r\n\texpressEventListener(sliderMinTextInputEl, 'input', () => onInput(sliderMinTextInputEl));\r\n\texpressEventListener(sliderMaxTextInputEl, 'input', () => onInput(sliderMaxTextInputEl));\r\n\texpressEventListener(sliderMinTextInputEl, 'focusout', () => {\r\n\t\tif (drawSlider(sliderMinRangeInputEl, sliderMinRangeThumbEl, sliderMinTextInputEl, containerMinSliderTextInputEl, outOfBoundsMinBarEl, true, true)) {\r\n\t\t\taddSliderFilter();\r\n\t\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t\t}\r\n\t});\r\n\texpressEventListener(sliderMaxTextInputEl, 'focusout', () => {\r\n\t\tif (drawSlider(sliderMaxRangeInputEl, sliderMaxRangeThumbEl, sliderMaxTextInputEl, containerMaxSliderTextInputEl, outOfBoundsMaxBarEl, false, true)) {\r\n\t\t\taddSliderFilter();\r\n\t\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t\t}\r\n\t});\r\n\texpressEventListener(sliderMinTextInputEl, 'keydown', (ev: KeyboardEvent) => {\r\n\t\tif (ev.which === 13 || ev.keyCode === 13) {\r\n\t\t\tif (drawSlider(sliderMinRangeInputEl, sliderMinRangeThumbEl, sliderMinTextInputEl, containerMinSliderTextInputEl, outOfBoundsMinBarEl, true, true)) {\r\n\t\t\t\taddSliderFilter();\r\n\t\t\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\texpressEventListener(sliderMaxTextInputEl, 'keydown', (ev: KeyboardEvent) => {\r\n\t\tif (ev.which === 13 || ev.keyCode === 13) {\r\n\t\t\tif (drawSlider(sliderMaxRangeInputEl, sliderMaxRangeThumbEl, sliderMaxTextInputEl, containerMaxSliderTextInputEl, outOfBoundsMaxBarEl, false, true)) {\r\n\t\t\t\taddSliderFilter();\r\n\t\t\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\tshowSliderEls.forEach(el => expressEventListener(el, 'click', () => {\r\n\t\thideSlider(el);\r\n\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), (el.classList.contains('technical-show-slider') && !el.checked), filterEl.dataset.analytics);\r\n\t}));\r\n\r\n\tif (!showSliderEls.length) {\r\n\t\tfilterEl.classList.remove(\"u-hide\");\r\n\t}\r\n\r\n\tif (selectedFilter && collapsableComponent) {\r\n\t\tconst selectedOption = selectedFilter.split('_');\r\n\t\tconst values = (selectedOption[1] || selectedFilter).split('-');\r\n\t\tconst min = values[0];\r\n\t\tconst max = values[1] || values[0];\r\n\r\n\t\tif (selectedOption[0] && showSliderEls) {\r\n\t\t\tshowSliderEls.forEach(x => x.checked = selectedOption[0].toLowerCase() == x.value.toLowerCase());\r\n\t\t\tfilterEl.classList.remove(\"u-hide\");\r\n\t\t}\r\n\r\n\t\tconst originalMinValue = sliderMinTextInputEl.value;\r\n\t\tconst originalMaxValue = sliderMaxTextInputEl.value;\r\n\r\n\t\tsliderMinTextInputEl.value = min;\r\n\t\tsliderMaxTextInputEl.value = max;\r\n\t\tsliderMinRangeInputEl.value = min;\r\n\t\tsliderMaxRangeInputEl.value = max;\r\n\r\n\t\tif (min == max && (max == sliderMinRangeInputEl.min || min == sliderMaxRangeInputEl.max)) {\r\n\t\t\tconst sliderCompletelyOnMax = min == sliderMaxRangeInputEl.max;\r\n\r\n\t\t\tsliderMaxRangeInputEl.style.zIndex = sliderCompletelyOnMax ? '1' : '2';\r\n\t\t\tsliderMinRangeInputEl.style.zIndex = sliderCompletelyOnMax ? '2' : '1';\r\n\t\t}\r\n\t\tconst isNoneSelected = isNoneInputSelected();\r\n\t\tdrawSlider(sliderMinRangeInputEl, sliderMinRangeThumbEl, sliderMinTextInputEl, containerMinSliderTextInputEl, outOfBoundsMinBarEl, true, false);\r\n\t\tdrawSlider(sliderMaxRangeInputEl, sliderMaxRangeThumbEl, sliderMaxTextInputEl, containerMaxSliderTextInputEl, outOfBoundsMaxBarEl, false, false);\r\n\t\taddSliderFilter();\r\n\t\ttriggerValueClicked(!isNoneSelected && (originalMaxValue !== max || originalMinValue !== min), isNoneSelected ? '0' : null);\r\n\t\ttoggleResetFilters(filtersContainerEl, false);\r\n\t\tcollapsableComponent.open();\r\n\t}\r\n\r\n\tconst toggleOption = (selectOptionValue: string[], enable: boolean) => {\r\n\t\tif (!showSliderEls || !showSliderEls.length) return;\r\n\t\tconst orginalSliderValue = getSliderValue();\r\n\t\tconst isFilterActive = showSliderEls.some(x => x.checked);\r\n\r\n\t\tshowSliderEls.forEach(x => {\r\n\t\t\tif (!selectOptionValue.includes(x.value)) return;\r\n\r\n\t\t\tconst filterValue = getParentWithClassName(x, 'a-form-input');\r\n\t\t\tfilterValue?.classList.toggle('a-form-input--disabled', !enable);\r\n\t\t\tx.toggleAttribute('disabled', !enable);\r\n\t\t\tx.disabled = !enable;\r\n\t\t});\r\n\r\n\t\t// if only 1 option is left check it by default\r\n\t\tif (showSliderEls.filter(x => !x.disabled).length > 1 || !isFilterActive) return;\r\n\t\tshowSliderEls.forEach(x => x.checked = !x.disabled);\r\n\t\tfilterEl.classList.remove(\"u-hide\");\r\n\r\n\t\tconst afterChangesSliderValue = getSliderValue();\r\n\t\tif (orginalSliderValue == afterChangesSliderValue) return;\r\n\t\ttriggerValueClicked(true);\r\n\t\tupdateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t};\r\n\r\n\treturn {\r\n\t\tfilterQs,\r\n\t\tremoveRangeFilter,\r\n\t\tdisable: (selectOptionValue: string[]) => toggleOption(selectOptionValue, false),\r\n\t\tenable: (selectOptionValue: string[]) => toggleOption(selectOptionValue, true),\r\n\t\tgetSelectOptions: () => showSliderEls.map(x => x.value)\r\n\t};\r\n}\r\n","import { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { trackFiltersEvent } from \"../common/events\";\r\nimport { getParameter, queryRemoveKeys, updateParameter } from \"../utils/querystring\";\r\nimport { findInsertIndex } from \"../utils/dom-tree\";\r\nimport { initShowMoreElements, IShowMoreElementsComponent } from \"../components/show-more-elements\";\r\nimport { createCollapsable } from \"../components/collapsable\";\r\nimport { createCheckBoxSelectFilter } from \"../components/filters/checkboxFilter\";\r\nimport { createColorFilter } from \"../components/filters/colorFilter\";\r\nimport { createRangeFilter, IRangeFilter } from \"../components/filters/rangeFilter\";\r\nimport { TemplateType, TypeOfFilter } from \"../common/filter\";\r\n\r\nexport interface IFilters {\r\n\treadonly disable: (filterQs: string, selectOptionValue: string[]) => void;\r\n\treadonly enable: (filterQs: string, selectOptionValue: string[]) => void;\r\n\treadonly getSelectOptions: (filterQs: string) => string[];\r\n\treadonly resetFiltersContainerEl: () => void;\r\n}\r\n\r\nexport interface ICreateFilterOptions {\r\n\treadonly onFilter?: (multiselect: boolean, filterName: string, filterValue: string, checked: boolean, containerEl: HTMLElement, updateValue?: boolean) => void;\r\n\treadonly resetAll?: (containerEl: HTMLElement) => void;\r\n}\r\n\r\nexport function createFilters(containerEl: HTMLElement, opts: ICreateFilterOptions): IFilters {\r\n\tconst selectedFiltersContainerEl = expressQuerySelector(containerEl, '.technical-selectedfilters', false);\r\n\tconst noneSelectedLabelEl = selectedFiltersContainerEl && expressQuerySelector(selectedFiltersContainerEl, '.technical-no-selected-filters', false);\r\n\tconst { onFilter, resetAll } = opts;\r\n\tconst showMoreElementsComponents: IShowMoreElementsComponent[] = [];\r\n\r\n\tconst addFilterTemplate = (templateType: TemplateType, filterCategory: string, selectedFilterName: string, htmlOrColor: string, removeFilterEvent: any): HTMLDivElement => {\r\n\t\tconst div = document.createElement('div');\r\n\t\tdiv.dataset.filterforcategory = filterCategory;\r\n\t\tdiv.classList.add(\"a-filter-tag\", templateType === TemplateType.Text ? \"a-filter-tag--text\" : \"a-filter-tag--color\");\r\n\t\tdiv.dataset.filterforcategoryvalue = selectedFilterName;\r\n\r\n\t\tif (templateType === TemplateType.Text) {\r\n\t\t\tconst p = document.createElement('p');\r\n\t\t\tp.classList.add(\"a-filter-tag__label\");\r\n\t\t\tconst content = document.createTextNode(htmlOrColor);\r\n\t\t\tp.appendChild(content);\r\n\t\t\tdiv.appendChild(p);\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst iconSpan = document.createElement('span');\r\n\t\t\ticonSpan.classList.add(\"a-icon\", \"a-icon--color\", \"a-icon--unselected\", \"a-icon--small\", \"a-icon--no-hover\", \"a-icon--\" + htmlOrColor);\r\n\t\t\ticonSpan.style.color = htmlOrColor;\r\n\t\t\tif (htmlOrColor === \"white\" || htmlOrColor === \"custom-nocolor\") iconSpan.classList.add(\"a-icon--outline\");\r\n\t\t\tconst icon = document.createElement('i');\r\n\t\t\ticon.classList.add(\"a-icon__icon\");\r\n\t\t\tconst iconColorSpan = document.createElement('span');\r\n\t\t\ticonColorSpan.classList.add(\"a-icon__color\");\r\n\t\t\ticon.appendChild(iconColorSpan);\r\n\t\t\ticonSpan.appendChild(icon);\r\n\t\t\tdiv.appendChild(iconSpan);\r\n\t\t}\r\n\r\n\t\tconst span = document.createElement('span');\r\n\t\tspan.dataset.eventalreadybinded = \"true\";\r\n\t\tspan.classList.add(\"a-filter-tag__remove\", \"icon-close\");\r\n\t\tspan.addEventListener(\"click\", removeFilterEvent);\r\n\t\tdiv.appendChild(span);\r\n\r\n\t\treturn div;\r\n\t};\r\n\r\n\tconst removeFromFilterContainer = (filtersContainerEl: HTMLElement, selectedFiltersContainerEl: HTMLElement, filterCategory: string, filterCategoryValue?: string) => {\r\n\t\tconst selector = !filterCategoryValue ? `[data-filterforcategory=\"${filterCategory}\"]` : `[data-filterforcategory=\"${filterCategory}\"][data-filterforcategoryvalue=\"${filterCategoryValue}\"]`;\r\n\t\tconst selectedFilterCategoryEl = expressQuerySelector(selectedFiltersContainerEl, selector, false);\r\n\t\tif (selectedFilterCategoryEl) selectedFilterCategoryEl.remove();\r\n\r\n\t\thideSelectedFilters(filtersContainerEl, selectedFiltersContainerEl);\r\n\t};\r\n\r\n\tconst addTextToFilterContainer = (filtersContainerEl: HTMLElement, typeOfFilter: TypeOfFilter, selectedFiltersContainerEl: HTMLElement, filterCategory: string, selectedFilterValue: string, removeFilterEvent: any, selectedFilterName?: string) => {\r\n\t\tshowSelectedFilters(filtersContainerEl, selectedFiltersContainerEl);\r\n\r\n\t\tif (!selectedFiltersContainerEl)\r\n\t\t\treturn;\r\n\r\n\t\tconst selector = typeOfFilter === TypeOfFilter.Regular || typeOfFilter === TypeOfFilter.Slider ? `[data-filterforcategory=\"${filterCategory}\"]` : `[data-filterforcategory=\"${filterCategory}\"][data-filterforcategoryvalue=\"${selectedFilterValue}\"]`;\r\n\t\tconst selectedFilterCategoryEl = expressQuerySelector(selectedFiltersContainerEl, selector, false);\r\n\t\tconst selectedFilterDisplayName = selectedFilterName || selectedFilterValue;\r\n\t\tif (selectedFilterCategoryEl) {\r\n\t\t\tconst filterCategoryContentEl = expressQuerySelector(selectedFilterCategoryEl, 'p.a-filter-tag__label', true);\r\n\t\t\tfilterCategoryContentEl.innerHTML = typeOfFilter === TypeOfFilter.Slider ? filterCategory + \": \" + selectedFilterDisplayName : selectedFilterDisplayName;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst filter = addFilterTemplate(TemplateType.Text, filterCategory, selectedFilterValue, typeOfFilter === TypeOfFilter.Slider ? filterCategory + \": \" + selectedFilterDisplayName : selectedFilterDisplayName, removeFilterEvent);\r\n\t\tconst allSelectedColorFilters = expressQuerySelectorAll(selectedFiltersContainerEl, `[data-filterforcategory=\"${filterCategory}\"]`);\r\n\t\tif (allSelectedColorFilters.length) {\r\n\t\t\tallSelectedColorFilters[allSelectedColorFilters.length - 1].insertAdjacentElement('afterend', filter);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst filters = expressQuerySelectorAll(document, '[data-typeoffilter][data-filtercategory]') as HTMLElement[];\r\n\t\tconst compare = (val1: HTMLElement) => filters.findIndex(e => val1.dataset.filterforcategory === e.dataset.filtercategory);\r\n\t\tconst selectedFiltersChildren = expressQuerySelectorAll(selectedFiltersContainerEl, '[data-filterforcategory]');\r\n\t\tconst index = findInsertIndex(selectedFiltersChildren, filter, compare);\r\n\t\tconst elementToInsertBefore = selectedFiltersChildren[index];\r\n\t\tif (!elementToInsertBefore || index <= -1 || index > selectedFiltersChildren.length) {\r\n\t\t\tselectedFiltersContainerEl.appendChild(filter);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\telementToInsertBefore.insertAdjacentElement('beforebegin', filter);\r\n\t};\r\n\r\n\tconst attachRemoveFilterEvent = (selectedFiltersContainerEl: HTMLElement, filterForCategory: string, removeEvent: any, filterForCategoryValue?: string) => {\r\n\t\tconst selectedFilterCategoryEl = expressQuerySelector(selectedFiltersContainerEl, !filterForCategoryValue ? `[data-filterforcategory=\"${filterForCategory}\"]` : `[data-filterforcategory=\"${filterForCategory}\"][data-filterforcategoryvalue=\"${filterForCategoryValue}\"]`, false);\r\n\r\n\t\tif (selectedFilterCategoryEl) {\r\n\t\t\tconst removeEl = expressQuerySelector(selectedFilterCategoryEl, '.a-filter-tag__remove', false);\r\n\t\t\tif (removeEl && (!removeEl.dataset.eventalreadybinded || removeEl.dataset.eventalreadybinded !== \"true\")) {\r\n\t\t\t\tremoveEl.dataset.eventalreadybinded = \"true\";\r\n\t\t\t\tremoveEl.addEventListener(\"click\", removeEvent);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst hideSelectedFilters = (filtersContainerEl: HTMLElement, selectedFiltersContainerEl: HTMLElement) => {\r\n\t\tconst resetFilterEls = expressQuerySelectorAll(filtersContainerEl, '.o-filters__button-reset');\r\n\r\n\t\tif (!selectedFiltersContainerEl) {\r\n\t\t\tresetFilterEls.forEach(resetFilterEl => resetFilterEl.classList.add(\"a-button--disabled\"));\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst filterContainerTagEls = expressQuerySelectorAll(selectedFiltersContainerEl.parentElement, '.a-filter-tag');\r\n\r\n\t\tif (!filterContainerTagEls.length && !selectedFiltersContainerEl.classList.contains(\"o-filters__selected-filters--none\")) {\r\n\t\t\tselectedFiltersContainerEl.classList.add(\"o-filters__selected-filters--none\");\r\n\t\t\tnoneSelectedLabelEl && noneSelectedLabelEl.classList.remove('u-hide');\r\n\t\t\tresetFilterEls.forEach(resetFilterEl => resetFilterEl.classList.add(\"a-button--disabled\"));\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleResetFilters = (filtersContainerEl: HTMLElement, force?: boolean) => {\r\n\t\tconst resetFilterEls = expressQuerySelectorAll(filtersContainerEl, '.o-filters__button-reset');\r\n\t\tresetFilterEls.forEach(resetFilterEl => resetFilterEl.classList.toggle(\"a-button--disabled\", force));\r\n\t};\r\n\r\n\tconst showSelectedFilters = (filtersContainerEl: HTMLElement, selectedFiltersContainerEl: HTMLElement) => {\r\n\t\ttoggleResetFilters(filtersContainerEl, false);\r\n\r\n\t\tif (!selectedFiltersContainerEl)\r\n\t\t\treturn;\r\n\r\n\t\tif (selectedFiltersContainerEl.classList.contains(\"o-filters__selected-filters--none\")) {\r\n\t\t\tselectedFiltersContainerEl.classList.remove(\"o-filters__selected-filters--none\");\r\n\t\t\tnoneSelectedLabelEl && noneSelectedLabelEl.classList.add('u-hide');\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateParametersForUrl = (typeOfFilter: TypeOfFilter, filterQs: string, msg: string, removeFromUrl: boolean, analytics?: string, possibleValues?: string[]) => {\r\n\t\ttrackFiltersEvent('FilterClicked', { filter: analytics ? analytics : `${filterQs}_${msg}` });\r\n\r\n\t\tif (!filterQs)\r\n\t\t\treturn;\r\n\r\n\t\tlet url: string;\r\n\t\tconst value = encodeURIComponent(msg.toLowerCase());\r\n\t\tif (typeOfFilter === TypeOfFilter.Regular || typeOfFilter === TypeOfFilter.Slider) {\r\n\t\t\turl = removeFromUrl ? updateParameter(filterQs.toLowerCase(), '') : updateParameter(filterQs.toLowerCase(), value);\r\n\t\t} else {\r\n\t\t\tconst param = getParameter(filterQs.toLowerCase());\r\n\t\t\tlet params = param ? param.split(\",\") : [];\r\n\t\t\tif (params.indexOf(value) < 0)\r\n\t\t\t\tparams.push(value);\r\n\t\t\telse if (removeFromUrl)\r\n\t\t\t\tparams = params.filter(f => f !== value);\r\n\r\n\t\t\tif (possibleValues) {\r\n\t\t\t\tparams = params.filter(x => possibleValues.includes(x));\r\n\t\t\t}\r\n\r\n\t\t\turl = updateParameter(filterQs.toLowerCase(), params.join(\",\"));\r\n\t\t}\r\n\r\n\t\twindow.history.pushState({}, null, url.toLowerCase());\r\n\t};\r\n\r\n\thideSelectedFilters(containerEl, selectedFiltersContainerEl);\r\n\r\n\tconst collapsibleEls = expressQuerySelectorAll(containerEl, '.m-collapsable');\r\n\tconst filterQsArr: string[] = [];\r\n\tconst rangeFilterComponents: IRangeFilter[] = [];\r\n\tcollapsibleEls.forEach(el => {\r\n\t\tif (el.classList.contains('technical-selectedfilters')) return; // skip the selected filters collapsible\r\n\r\n\t\tconst filterCategory = el.dataset.filtercategory;\r\n\t\tconst elFilterQs = el.dataset.filterqs;\r\n\r\n\t\tconst filterCollapsable = createCollapsable(el, { titleElSelector: '.m-collapsable__title', scrollIntoViewAfterOpen: false, openClass: 'is-collapse-open' });\r\n\t\tconst showMore = expressQuerySelector(el, '.technical-showmore', false);\r\n\t\tfilterQsArr.push(elFilterQs);\r\n\r\n\t\tif (showMore) {\r\n\t\t\tfilterQsArr.push(elFilterQs ? `showmore${elFilterQs.toLowerCase()}` : null);\r\n\t\t\tshowMoreElementsComponents.push(initShowMoreElements(el, showMore, elFilterQs ? `showmore${elFilterQs.toLowerCase()}` : null, '.technical-filter-value', -1, null, null));\r\n\t\t}\r\n\r\n\t\tconst filterCheckboxEls = expressQuerySelectorAll(el, '.a-form-input--checkbox, .a-form-input--radio');\r\n\t\tconst filterCheckboxPossibleValues = filterCheckboxEls.map(x => [encodeURIComponent(x.dataset.filterelement)?.toLowerCase(), encodeURIComponent(x.dataset.filterkey)?.toLowerCase()]).flat();\r\n\t\tfilterCheckboxEls.forEach(filterEl => {\r\n\t\t\tif (TypeOfFilter[el.dataset.typeoffilter] === TypeOfFilter.Regular || TypeOfFilter[el.dataset.typeoffilter] === TypeOfFilter.MultiSelect)\r\n\t\t\t\tcreateCheckBoxSelectFilter(filterCollapsable, TypeOfFilter[el.dataset.typeoffilter], selectedFiltersContainerEl, elFilterQs, filterCategory, filterEl, filterCheckboxEls, filterCheckboxPossibleValues, containerEl, { updateParametersForUrl, removeFromFilterContainer, onFilter, attachRemoveFilterEvent, toggleResetFilters, addTextToFilterContainer });\r\n\t\t});\r\n\r\n\t\tconst colorEls = expressQuerySelectorAll(el, '.a-icon--color');\r\n\t\tconst colorElsPossibleValues = colorEls.map(x => encodeURIComponent(x.dataset.filterelement.toLowerCase()));\r\n\t\tcolorEls.forEach(filterEl => {\r\n\t\t\tcreateColorFilter(filterCollapsable, selectedFiltersContainerEl, elFilterQs, filterCategory, filterEl, containerEl, colorElsPossibleValues, { showSelectedFilters, addFilterTemplate, updateParametersForUrl, removeFromFilterContainer, onFilter, attachRemoveFilterEvent, toggleResetFilters });\r\n\t\t});\r\n\r\n\t\tconst sliderEls = expressQuerySelectorAll(el, '.a-form-input--slider');\r\n\t\tsliderEls.forEach(filterEl => {\r\n\t\t\tconst showSliderEls = expressQuerySelectorAll(el, 'input[type=checkbox],input[type=radio]');\r\n\t\t\tconst rangeFilterComponent = createRangeFilter(filterCollapsable, selectedFiltersContainerEl, elFilterQs, filterCategory, filterEl, showSliderEls, containerEl, { updateParametersForUrl, removeFromFilterContainer, onFilter, attachRemoveFilterEvent, toggleResetFilters, addTextToFilterContainer });\r\n\r\n\t\t\trangeFilterComponents.push(rangeFilterComponent);\r\n\t\t});\r\n\t});\r\n\r\n\tconst resetFilters = expressQuerySelectorAll(containerEl.parentElement, '.technical-reset-filters');\r\n\tconst resetFiltersContainerEl = () => {\r\n\t\ttrackFiltersEvent('FilterReset');\r\n\t\tif (resetAll)\r\n\t\t\tresetAll(containerEl);\r\n\r\n\t\tcollapsibleEls.forEach(collapsibleEl => {\r\n\t\t\tif (collapsibleEl.classList.contains('is-collapse-open') && !collapsibleEl.classList.contains('m-collapsable--sorting-top')) collapsibleEl.classList.remove('is-collapse-open');\r\n\t\t});\r\n\r\n\t\tconst colorEls = expressQuerySelectorAll(containerEl, '.a-icon--color');\r\n\t\tcolorEls.forEach(colorEl => {\r\n\t\t\tif (colorEl.classList.contains('a-icon--selected')) {\r\n\t\t\t\tcolorEl.classList.remove('a-icon--selected');\r\n\t\t\t\tcolorEl.classList.add('a-icon--unselected');\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tconst filterEls = expressQuerySelectorAll(containerEl, '.technical-filter');\r\n\t\tfilterEls.forEach((filterEl, index) => {\r\n\t\t\tconst showMoreEl = expressQuerySelector(filterEl, \".technical-showmore\", false);\r\n\t\t\tif (showMoreEl) {\r\n\t\t\t\tshowMoreElementsComponents[index]?.resetElement && showMoreElementsComponents[index].resetElement();\r\n\t\t\t}\r\n\t\t\tconst checkboxElsPerFilter = expressQuerySelectorAll(filterEl, 'input[type=checkbox]:not(.technical-sorting-radio),input[type=radio]:not(.technical-sorting-radio)');\r\n\t\t\tcheckboxElsPerFilter.forEach(checkboxEl => {\r\n\t\t\t\tcheckboxEl.checked = false;\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\trangeFilterComponents.forEach(showSliderEl => showSliderEl.removeRangeFilter(false));\r\n\r\n\t\tconst filterTagEls = expressQuerySelectorAll(selectedFiltersContainerEl, '.a-filter-tag');\r\n\t\tfilterTagEls.forEach(el => el.remove());\r\n\r\n\t\thideSelectedFilters(containerEl, selectedFiltersContainerEl);\r\n\t\twindow.history.pushState({}, null, queryRemoveKeys(filterQsArr));\r\n\t};\r\n\tresetFilters.forEach(resetFilter => expressEventListener(resetFilter, \"click\", _ => !resetFilter.classList.contains('a-button--disabled') && resetFiltersContainerEl()));\r\n\tconst filterEl = expressQuerySelector(containerEl, '.technical-filters-container', false) || containerEl;\r\n\tfilterEl.classList.remove('skeleton-loading');\r\n\r\n\tconst disable = (filterQs: string, selectOptionValue: string[]) => {\r\n\t\tconst foundfilter = rangeFilterComponents.find(x => x.filterQs === filterQs);\r\n\t\tfoundfilter && foundfilter.disable(selectOptionValue);\r\n\t};\r\n\r\n\tconst enable = (filterQs: string, selectOptionValue: string[]) => {\r\n\t\tconst foundfilter = rangeFilterComponents.find(x => x.filterQs === filterQs);\r\n\t\tfoundfilter && foundfilter.enable(selectOptionValue);\r\n\t};\r\n\r\n\tconst getSelectOptions = (filterQs: string) => {\r\n\t\tconst foundfilter = rangeFilterComponents.find(x => x.filterQs === filterQs);\r\n\t\treturn foundfilter ? foundfilter.getSelectOptions() : [];\r\n\t};\r\n\r\n\treturn {\r\n\t\tresetFiltersContainerEl,\r\n\t\tdisable,\r\n\t\tenable,\r\n\t\tgetSelectOptions\r\n\t} as IFilters;\r\n}\r\n\r\nexport function sortGroupFilterValues(htmlFilterValues: HTMLElement[], htmlFilter: HTMLElement) {\r\n\tconst disabledFilterValues = htmlFilterValues.filter(el => el.classList.contains('a-form-input--disabled') || el.classList.contains('a-icon--disabled')).sort((a, b) => {\r\n\t\tif (a.dataset.selectedtext < b.dataset.selectedtext)\r\n\t\t\treturn -1;\r\n\t\tif (a.dataset.selectedtext > b.dataset.selectedtext)\r\n\t\t\treturn 1;\r\n\t\treturn 0;\r\n\t});\r\n\r\n\tconst enabledFilterValues = htmlFilterValues.filter(el => !el.classList.contains('a-form-input--disabled') && !el.classList.contains('a-icon--disabled')).sort((a, b) => {\r\n\t\tif (a.dataset.selectedtext < b.dataset.selectedtext)\r\n\t\t\treturn -1;\r\n\t\tif (a.dataset.selectedtext > b.dataset.selectedtext)\r\n\t\t\treturn 1;\r\n\t\treturn 0;\r\n\t});\r\n\r\n\tconst filtersContainer = expressQuerySelector(htmlFilter, '.m-collapsable__content', true);\r\n\tconst showMoreEl = expressQuerySelector(filtersContainer, '.technical-showmore', false);\r\n\r\n\tfiltersContainer.innerHTML = '';\r\n\tenabledFilterValues.forEach(el => {\r\n\t\tfiltersContainer.insertAdjacentElement('beforeend', el);\r\n\t});\r\n\tdisabledFilterValues.forEach(el => {\r\n\t\tfiltersContainer.insertAdjacentElement('beforeend', el);\r\n\t});\r\n\tif (showMoreEl) {\r\n\t\tconst buttonTextEl = expressQuerySelector(showMoreEl, '.technical-link-text', false);\r\n\t\tconst sorterFilterValues = expressQuerySelectorAll(filtersContainer, '.technical-filter-value');\r\n\t\tif (buttonTextEl.innerHTML === showMoreEl.dataset.moretext) {\r\n\t\t\tsorterFilterValues.slice(0, parseInt(showMoreEl.dataset.baseamount || '0', 10) - 1).forEach(e => e.classList.remove('u-hide-on-desktop-full'));\r\n\t\t\tsorterFilterValues.slice(0, parseInt(showMoreEl.dataset.baseamount || '0', 10) - 1).forEach(e => e.classList.remove('u-hide-on-mobile-full'));\r\n\t\t\tsorterFilterValues.slice(parseInt(showMoreEl.dataset.baseamount || '0', 10), sorterFilterValues.length).forEach(e => e.classList.add('u-hide-on-desktop-full'));\r\n\t\t\tsorterFilterValues.slice(parseInt(showMoreEl.dataset.baseamount || '0', 10), sorterFilterValues.length).forEach(e => e.classList.add('u-hide-on-mobile-full'));\r\n\t\t} else {\r\n\t\t\tsorterFilterValues.forEach(e => e.classList.remove('u-hide-on-desktop-full'));\r\n\t\t\tsorterFilterValues.forEach(e => e.classList.remove('u-hide-on-mobile-full'));\r\n\t\t}\r\n\t\tfiltersContainer.insertAdjacentElement('beforeend', showMoreEl);\r\n\t}\r\n};\r\n","import { expressQuerySelector, expressQuerySelectorAll, getParentWithClassName, isMobileOnPageWithHeader } from \"../common/html\";\r\nimport { initPagedShowMoreElements, ShowMoreClickedReturn } from \"./show-more-elements\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport { getParameter, queryRemoveKeys, updateParameter } from \"../utils/querystring\";\r\nimport { createFilters, IFilters, sortGroupFilterValues } from \"../organisms/filters\";\r\n\r\nexport interface IProductGridDeps {\r\n\tshowMoreClick?: (currentPage: number, sizeDesktop?: number, sizeMobile?: number, sortMethod?: string, selectedFilters?: { [inputName: string]: string[] }) => Promise; // returns all shown\r\n\tfilterGrid?: (grid: HTMLElement, filterName: string, sortMethod: string, selectedFilters: { [inputName: string]: string[] }) => void;\r\n\tenableShowLess?: boolean;\r\n}\r\n\r\nexport interface IProductGridOptions {\r\n\trefreshOnResize: boolean;\r\n}\r\n\r\nexport interface IProductGrid {\r\n\treadonly resetFilter: () => void;\r\n\treadonly reFilter: (productGrid: HTMLElement) => void;\r\n\treadonly disableSort: (force: boolean) => void;\r\n}\r\n\r\nexport function createProductGrid(grid: HTMLElement, deps: IProductGridDeps, opts?: IProductGridOptions) {\r\n\tconst { showMoreClick, filterGrid } = deps;\r\n\tconst filters: { mobile: IFilters, desktop: IFilters } = {\r\n\t\tmobile: null,\r\n\t\tdesktop: null\r\n\t};\r\n\tconst gridCounter = parseInt(grid.dataset['gridcounter'] || '', 10);\r\n\tconst filteredValues: { [gridCount: string]: { [filterCategory: string]: string[] } } = {};\r\n\tlet savedSortMethod: string;\r\n\tconst regExpForNumberInParentheses = /\\(([0-9]+)\\)$/;\r\n\r\n\tconst calculateHackFor2TilesOnLastLine = (grid: HTMLElement): void => {\r\n\t\tconst filters = expressQuerySelector(grid.parentElement, '.technical-filters-container', false);\r\n\t\tconst tiles = expressQuerySelectorAll(grid, '.technical-tile:not(.u-hide-on-desktop-full):not(.u-hide)');\r\n\r\n\t\tif (tiles.length % (filters ? 3 : 4) == 2)\r\n\t\t\tgrid.classList.add('m-product-grid--tail-2-tiles-on-desktop');\r\n\t\telse\r\n\t\t\tgrid.classList.remove('m-product-grid--tail-2-tiles-on-desktop');\r\n\t};\r\n\tconst refreshFiltersAndSortingOnWindowResize = () => {\r\n\t\tlet isMobile = isMobileOnPageWithHeader();\r\n\r\n\t\tconst onWindowResize = () => {\r\n\t\t\tconst isMobileOnResize = isMobileOnPageWithHeader();\r\n\t\t\tif (isMobile !== isMobileOnResize) {\r\n\t\t\t\tdocument.location.reload();\r\n\t\t\t\tisMobile = isMobileOnResize;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\topts?.refreshOnResize && window.addEventListener('resize', onWindowResize);\r\n\t};\r\n\tconst disableSort = (force: boolean) => {\r\n\t\tconst sortingGrid = expressQuerySelector(grid, '.technical-sorting-container', false);\r\n\t\tif (sortingGrid) {\r\n\t\t\tconst sortEl = expressQuerySelector(sortingGrid, '.technical-dropdown', false);\r\n\t\t\tif (sortEl) {\r\n\t\t\t\tgrid.classList.toggle('a-form-input--disabled', force);\r\n\t\t\t\tsortEl.toggleAttribute('disabled', force);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\tconst filterAndSortGrid = (grid: HTMLElement, filterName: string = null, sortMethod: string = null, selectedFilters: { [inputName: string]: string[] } = null): void => {\r\n\t\tsavedSortMethod = sortMethod;\r\n\r\n\t\tif (filterGrid) {\r\n\t\t\treturn filterGrid(grid, filterName, sortMethod, selectedFilters);\r\n\t\t}\r\n\r\n\t\tconst gridCounter = parseInt(grid.dataset['gridcounter'] || '', 10);\r\n\t\tconst gridContent = expressQuerySelector(grid, '.technical-product-grid-content', true);\r\n\r\n\t\t// always resort when filtering => order can possibly change\r\n\t\tsortMethod = sortMethod || (selectedFilters && getParameter(`sortmethod[${gridCounter}]`));\r\n\r\n\t\tconst tiles = expressQuerySelectorAll(grid, '.technical-tile');\r\n\t\tconst resetTiles = filterName === 'reset' || (filteredValues[gridCounter] && (Object.keys(filteredValues[gridCounter]).every(x => !filteredValues[gridCounter][x] || filteredValues[gridCounter][x].length === 0) || Object.keys(filteredValues[gridCounter]).length === 0));\r\n\t\tlet switchedPrices = false;\r\n\r\n\t\t// Reset all tiles\r\n\t\ttiles.forEach(tile => {\r\n\t\t\ttile.classList.remove(\"technical-showmore\");\r\n\t\t\ttile.classList.remove(\"u-hide-on-desktop-full\");\r\n\t\t\ttile.classList.remove(\"u-hide-on-mobile-full\");\r\n\t\t\tif (resetTiles) tile.classList.remove('u-hide');\r\n\t\t});\r\n\r\n\t\t// Reset the show more\r\n\t\tconst button = expressQuerySelector(grid, '.technical-showmore-button', false);\r\n\t\tbutton && button.classList.remove('u-hide');\r\n\r\n\t\tconst switchPrices = (shouldSwitchPrices: boolean, showOriginalPrice: boolean, tile: HTMLElement): boolean => {\r\n\t\t\tconst fromPriceLabelEl = expressQuerySelector(tile, '.technical-staring-from-price', false);\r\n\t\t\tconst mainPrice = expressQuerySelector(tile, '.technical-main-tile-price', false);\r\n\t\t\tconst strikedPriceEl = expressQuerySelector(tile, '.technical-striked-price', false);\r\n\t\t\tconst detailPrice = expressQuerySelector(tile, '.technical-detail-price', false);\r\n\r\n\t\t\tconst isStartingPrice = fromPriceLabelEl && fromPriceLabelEl.dataset.startingprice === 'true';\r\n\t\t\tconst units = fromPriceLabelEl && parseInt(fromPriceLabelEl.dataset.units, 10);\r\n\t\t\tfromPriceLabelEl && fromPriceLabelEl.classList.toggle('u-hide', showOriginalPrice\r\n\t\t\t\t? !isStartingPrice\r\n\t\t\t\t: !isStartingPrice && units <= 0);\r\n\r\n\t\t\tif (shouldSwitchPrices && mainPrice && detailPrice) {\r\n\t\t\t\tconst price = mainPrice.dataset.price;\r\n\t\t\t\tconst altPrice = mainPrice.dataset.altPrice;\r\n\t\t\t\tmainPrice.innerHTML = mainPrice.innerHTML === price ? altPrice : price;\r\n\r\n\t\t\t\tconst unitPrice = detailPrice.dataset.unitPrice;\r\n\t\t\t\tconst unitPriceWithPrice = detailPrice.dataset.unitPriceWithPrice;\r\n\t\t\t\tdetailPrice.innerHTML = detailPrice.innerHTML === unitPrice ? unitPriceWithPrice : unitPrice;\r\n\r\n\t\t\t\tif (strikedPriceEl) {\r\n\t\t\t\t\tconst strikedUnitPrice = strikedPriceEl.dataset.strikedUnitPrice;\r\n\t\t\t\t\tconst strikedPrice = strikedPriceEl.dataset.strikedPrice;\r\n\t\t\t\t\tstrikedPriceEl.innerHTML = strikedPriceEl.innerHTML == strikedUnitPrice ? strikedPrice : strikedUnitPrice;\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// Sort the tiles\r\n\t\tif (sortMethod) {\r\n\t\t\tconst setPriceSelected = (selectedFilters && selectedFilters['Pr'] || [])[0]?.split('_')[0] !== 'Unit';\r\n\t\t\tconst sortTile = (a: HTMLElement, b: HTMLElement, sortMethod: string) => {\r\n\t\t\t\tswitch (sortMethod) {\r\n\t\t\t\t\tcase \"price-low-high\": {\r\n\t\t\t\t\t\tconst priceA = setPriceSelected ? parseFloat(a.dataset.sortPrice) : parseFloat(a.dataset.sortUnitPrice);\r\n\t\t\t\t\t\tconst priceB = setPriceSelected ? parseFloat(b.dataset.sortPrice) : parseFloat(b.dataset.sortUnitPrice);\r\n\r\n\t\t\t\t\t\tif (priceA === priceB)\r\n\t\t\t\t\t\t\treturn parseInt(a.dataset.sortDefault, 10) > parseInt(b.dataset.sortDefault, 10) ? 1 : -1;\r\n\t\t\t\t\t\treturn priceA > priceB ? 1 : -1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcase \"price-high-low\":\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tconst priceA = setPriceSelected ? parseFloat(a.dataset.sortPrice) : parseFloat(a.dataset.sortUnitPrice);\r\n\t\t\t\t\t\t\tconst priceB = setPriceSelected ? parseFloat(b.dataset.sortPrice) : parseFloat(b.dataset.sortUnitPrice);\r\n\r\n\t\t\t\t\t\t\tif (priceA === priceB)\r\n\t\t\t\t\t\t\t\treturn parseInt(a.dataset.sortDefault, 10) > parseInt(b.dataset.sortDefault, 10) ? 1 : -1;\r\n\t\t\t\t\t\t\treturn priceA <= priceB ? 1 : -1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tcase 'delivery-early-late':\r\n\t\t\t\t\t\tif (a.dataset.sortDate === b.dataset.sortDate)\r\n\t\t\t\t\t\t\treturn parseInt(a.dataset.sortDefault, 10) > parseInt(b.dataset.sortDefault, 10) ? 1 : -1;\r\n\t\t\t\t\t\treturn a.dataset.sortDate > b.dataset.sortDate ? 1 : -1;\r\n\t\t\t\t\tcase \"review-high-low\": {\r\n\t\t\t\t\t\tconst ratingA = a.dataset.reviewrating ? parseFloat(a.dataset.reviewrating) : -1;\r\n\t\t\t\t\t\tconst ratingB = b.dataset.reviewrating ? parseFloat(b.dataset.reviewrating) : -1;\r\n\r\n\t\t\t\t\t\tconst sortDefaultA = parseInt(a.dataset.sortDefault, 10);\r\n\t\t\t\t\t\tconst sortDefaultB = parseInt(b.dataset.sortDefault, 10);\r\n\r\n\t\t\t\t\t\treturn ratingA !== ratingB\r\n\t\t\t\t\t\t\t? ratingB - ratingA\r\n\t\t\t\t\t\t\t: sortDefaultA - sortDefaultB;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcase \"unit-price-low-high\":\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tconst unitPriceA = parseFloat(a.dataset.sortUnitPrice);\r\n\t\t\t\t\t\t\tconst unitPriceB = parseFloat(b.dataset.sortUnitPrice);\r\n\r\n\t\t\t\t\t\t\tconst sortDefaultA = parseInt(a.dataset.sortDefault, 10);\r\n\t\t\t\t\t\t\tconst sortDefaultB = parseInt(b.dataset.sortDefault, 10);\r\n\r\n\t\t\t\t\t\t\treturn unitPriceA === unitPriceB\r\n\t\t\t\t\t\t\t\t? sortDefaultA > sortDefaultB ? 1 : -1\r\n\t\t\t\t\t\t\t\t: unitPriceA > unitPriceB ? 1 : -1;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn parseInt(a.dataset.sortDefault, 10) > parseInt(b.dataset.sortDefault, 10) ? 1 : -1;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\ttiles.sort((a, b) => { // This sort method will sort by the actual sortmethod BUT (see next comment)\r\n\t\t\t\tconst statusA = a.dataset.status;\r\n\t\t\t\tconst statusB = b.dataset.status;\r\n\r\n\t\t\t\tif (statusA == statusB)\r\n\t\t\t\t\treturn sortTile(a, b, sortMethod);\r\n\r\n\t\t\t\tconst isAUnavailable = statusA && statusA != 'available' && statusA != 'comingsoon';\r\n\t\t\t\tconst isBUnavailable = statusB && statusB != 'available' && statusB != 'comingsoon';\r\n\r\n\t\t\t\tif (isAUnavailable && !isBUnavailable)\r\n\t\t\t\t\treturn 1;\r\n\r\n\t\t\t\tif (!isAUnavailable && isBUnavailable)\r\n\t\t\t\t\treturn -1;\r\n\r\n\t\t\t\treturn sortTile(a, b, sortMethod);\r\n\t\t\t});\r\n\r\n\r\n\t\t\t// This will put back the immutable tiles (e.g. tiles with no price)\r\n\t\t\tif (sortMethod !== 'default' && sortMethod != 'review-high-low') {\r\n\t\t\t\tlet wrongTileIndex = 999;\r\n\t\t\t\twhile (wrongTileIndex >= 0) {\r\n\t\t\t\t\twrongTileIndex = tiles.findIndex((value, index) => {\r\n\t\t\t\t\t\tconst defaultIndex = parseInt(value.dataset.sortDefault, 10);\r\n\t\t\t\t\t\tconst temporarilyUnavailable = expressQuerySelector(value, '.m-product__temporarily-unavailable', false);\r\n\r\n\t\t\t\t\t\tif (defaultIndex === index || temporarilyUnavailable)\r\n\t\t\t\t\t\t\treturn false;\r\n\r\n\t\t\t\t\t\tif (sortMethod == 'delivery-early-late' && !value.dataset.sortDate)\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\telse if ((sortMethod === 'price-high-low' || sortMethod === 'price-low-high') && (!value.dataset.sortPrice || parseFloat(value.dataset.sortPrice) == -1))\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tif (wrongTileIndex >= 0) {\r\n\t\t\t\t\t\tconst element = tiles[wrongTileIndex];\r\n\t\t\t\t\t\ttiles.splice(wrongTileIndex, 1);\r\n\t\t\t\t\t\ttiles.splice(parseInt(element.dataset.sortDefault, 10), 0, element);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// This will put back the tiles in the DOM\r\n\t\t\tconst previousSortMethod = getParameter(`sortmethod[${gridCounter}]`);\r\n\t\t\tconst showOriginalPrice = sortMethod != 'unit-price-low-high';\r\n\t\t\tconst shouldSwitch = sortMethod == 'unit-price-low-high' || (previousSortMethod == 'unit-price-low-high' && showOriginalPrice && (selectedFilters && selectedFilters['Pr'] || [])[0]?.split('_')[0] !== 'Unit');\r\n\t\t\ttiles.forEach(tile => {\r\n\t\t\t\t//Show delivery when sorting by delivery-early-late\r\n\t\t\t\tconst hideDeliveryDate = sortMethod != 'delivery-early-late';\r\n\t\t\t\tconst deliveryElem = expressQuerySelector(tile, '.technical-deliverydate', false);\r\n\t\t\t\tdeliveryElem && deliveryElem.classList.toggle('u-hide', hideDeliveryDate);\r\n\r\n\t\t\t\t// Switch price fields on tile\r\n\t\t\t\tswitchedPrices = switchPrices(shouldSwitch, showOriginalPrice, tile);\r\n\r\n\t\t\t\t//Only aplly class m-product__info--has-shipping when showing delivery\r\n\t\t\t\tconst infoContentItems = expressQuerySelector(tile, '.technical-info-content-items', false);\r\n\t\t\t\tinfoContentItems && infoContentItems.classList.toggle('m-product__info--has-shipping', !hideDeliveryDate);\r\n\r\n\t\t\t\tgridContent.appendChild(tile);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// disable/enable setprice checkbox\r\n\t\tconst options = filters.desktop?.getSelectOptions('Pr') ?? [];\r\n\t\tif (options.length > 1) {\r\n\t\t\tconst previousSortMethod = getParameter(`sortmethod[${gridCounter}]`);\r\n\t\t\tif (sortMethod == 'unit-price-low-high' || (previousSortMethod == 'unit-price-low-high' && !sortMethod)) {\r\n\t\t\t\tfilters.desktop?.disable('Pr', [options[0]]);\r\n\t\t\t\tfilters.mobile?.disable('Pr', [options[0]]);\r\n\t\t\t} else {\r\n\t\t\t\tfilters.desktop?.enable('Pr', [options[0]]);\r\n\t\t\t\tfilters.mobile?.enable('Pr', [options[0]]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Only show tiles that have the specific filter value\r\n\t\tif (filteredValues[gridCounter] && Object.keys(filteredValues[gridCounter]).length > 0 && Object.keys(filteredValues[gridCounter]).some(x => filteredValues[gridCounter][x] && filteredValues[gridCounter][x].length > 0)) {\r\n\t\t\ttiles.forEach(tile => {\r\n\t\t\t\tif (!selectedFilters) return; // no filters => nothing to do\r\n\t\t\t\tconst tags = tile.dataset.tagid.split('|');\r\n\t\t\t\tlet validTile = true;\r\n\r\n\t\t\t\tObject.keys(selectedFilters).forEach(category => {\r\n\t\t\t\t\tconst selectedFilterInCategory = selectedFilters[category];\r\n\r\n\t\t\t\t\tconst categoryWithoutSuffix = category && category.split('[')[0];\r\n\t\t\t\t\tswitch (categoryWithoutSuffix) {\r\n\t\t\t\t\t\tcase 'Pr': {\r\n\t\t\t\t\t\t\tconst selectedOption = selectedFilterInCategory[0]?.split('_') ?? [];\r\n\t\t\t\t\t\t\tconst price = (selectedOption[1] || selectedFilterInCategory[0])?.split('-');\r\n\t\t\t\t\t\t\tif (!price) break;\r\n\t\t\t\t\t\t\tconst min = +price[0];\r\n\t\t\t\t\t\t\tconst max = +price[1];\r\n\r\n\t\t\t\t\t\t\tswitch (selectedOption[0]?.toLowerCase()) {\r\n\t\t\t\t\t\t\t\tcase 'unit':\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tif (!switchedPrices) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst mainPrice = expressQuerySelector(tile, '.technical-main-tile-price', false);\r\n\t\t\t\t\t\t\t\t\t\t\tconst shouldSwitch = mainPrice && mainPrice.innerHTML === mainPrice.dataset.price;\r\n\t\t\t\t\t\t\t\t\t\t\tswitchPrices(shouldSwitch, false, tile);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst tileUnitPrice = +tile.dataset.sortUnitPrice;\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst isValidUnitPrice = tileUnitPrice >= min && tileUnitPrice <= max;\r\n\r\n\t\t\t\t\t\t\t\t\t\tvalidTile = validTile && (!selectedFilterInCategory.length || isValidUnitPrice);\r\n\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tcase 'set':\r\n\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\tif (selectedOption[0] && !switchedPrices) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst mainPrice = expressQuerySelector(tile, '.technical-main-tile-price', false);\r\n\t\t\t\t\t\t\t\t\t\t\tconst shouldSwitch = mainPrice && mainPrice.innerHTML === mainPrice.dataset.altPrice;\r\n\t\t\t\t\t\t\t\t\t\t\tswitchPrices(shouldSwitch, true, tile);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst tileLowPrice = +tile.dataset.sortPrice;\r\n\t\t\t\t\t\t\t\t\t\tconst tileHighPrice = +tile.dataset.priceHigh;\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst isValidLowPrice = tileLowPrice >= min && tileLowPrice <= max;\r\n\t\t\t\t\t\t\t\t\t\tconst isValidHighPrice = tileHighPrice >= min && tileHighPrice <= max;\r\n\t\t\t\t\t\t\t\t\t\tconst isValidBetweenLowPriceAndHighPrice = (min - tileLowPrice) > 0 && (tileHighPrice - max) > 0;\r\n\r\n\t\t\t\t\t\t\t\t\t\tvalidTile = validTile && (!selectedFilterInCategory.length || (isValidLowPrice || isValidHighPrice || isValidBetweenLowPriceAndHighPrice));\r\n\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\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\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcase 'Re': {\r\n\t\t\t\t\t\t\tconst selectedReviewRating = +selectedFilterInCategory[0];\r\n\t\t\t\t\t\t\tif (!selectedReviewRating) break;\r\n\r\n\t\t\t\t\t\t\tconst tileReviewRating = +tile.dataset.reviewrating;\r\n\t\t\t\t\t\t\tvalidTile = validTile && (!selectedFilterInCategory.length || (tileReviewRating && tileReviewRating >= selectedReviewRating));\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\tvalidTile = validTile && (!selectedFilterInCategory.length || tags.filter(x => selectedFilterInCategory.includes(x)).length > 0);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\ttile.classList.toggle(\"u-hide\", !validTile);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// all tiles hidden => show no elements label\r\n\t\tconst noElementsEl = expressQuerySelector(gridContent, '.technical-no-elements', false);\r\n\t\tnoElementsEl && noElementsEl.classList.toggle('u-hide', !tiles.every(t => t.classList.contains('u-hide')));\r\n\t\tdisableSort(tiles.every(t => t.classList.contains('u-hide')));\r\n\r\n\t\tconst showMore = expressQuerySelector(grid, '.technical-showmore-button', false);\r\n\t\tif (showMore) {\r\n\t\t\tif (resetTiles) {\r\n\t\t\t\tshowMore.dataset.currentpage = '0';\r\n\t\t\t\twindow.history.pushState({}, null, queryRemoveKeys(['currentpage[' + gridCounter + ']']));\r\n\t\t\t}\r\n\r\n\t\t\tconst baseAmountDesktop = parseInt(showMore.dataset.baseamountDesktop, 10);\r\n\t\t\tconst baseAmountMobile = parseInt(showMore.dataset.baseamountMobile, 10);\r\n\t\t\tconst batchSizeDesktop = parseInt(showMore.dataset.batchsizeDesktop, 10);\r\n\t\t\tconst batchSizeMobile = parseInt(showMore.dataset.batchsizeMobile, 10);\r\n\r\n\t\t\tconst currentPage = parseInt(getParameter('currentpage[' + gridCounter + ']') || '0', 10);\r\n\t\t\tlet hideButtonDesktop = true;\r\n\t\t\tlet hideButtonMobile = true;\r\n\r\n\t\t\tconst visibleTiles = tiles.filter(x => !x.classList.contains('u-hide'));\r\n\t\t\tfor (let i = 0; i < visibleTiles.length; i++) {\r\n\t\t\t\tif (i >= baseAmountDesktop + (currentPage * batchSizeDesktop)) {\r\n\t\t\t\t\tvisibleTiles[i].classList.add('u-hide-on-desktop-full');\r\n\t\t\t\t\tvisibleTiles[i].classList.add('technical-showmore');\r\n\t\t\t\t\thideButtonDesktop = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (i >= baseAmountMobile + (currentPage * batchSizeMobile)) {\r\n\t\t\t\t\tvisibleTiles[i].classList.add('u-hide-on-mobile-full');\r\n\t\t\t\t\tvisibleTiles[i].classList.add('technical-showmore');\r\n\t\t\t\t\thideButtonMobile = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tshowMore.parentElement.classList.toggle('u-hide-on-desktop-full', hideButtonDesktop);\r\n\t\t\tshowMore.parentElement.classList.toggle('u-hide-on-mobile-full', hideButtonMobile);\r\n\r\n\t\t\tif (window.showMores[gridCounter])\r\n\t\t\t\twindow.showMores[gridCounter].dispose();\r\n\t\t\twindow.showMores[gridCounter] = initPagedShowMoreElements(grid, showMore, 'currentpage', null, gridCounter, showMoreClick ? (currentPage: number) => showMoreClick(currentPage, null, null, sortMethod, selectedFilters) : null, () => calculateHackFor2TilesOnLastLine(grid));\r\n\t\t}\r\n\r\n\t\t// Recount all the filter values except for the filter that was just clicked\r\n\t\tif (filterName) {\r\n\t\t\tconst filters = expressQuerySelectorAll(grid.parentElement, '.technical-filter');\r\n\t\t\tfilters.forEach(filter => {\r\n\t\t\t\tconst filterValues = expressQuerySelectorAll(filter, '.technical-filter-value');\r\n\t\t\t\tconst ownCategory = filter.dataset.filterqs;\r\n\t\t\t\tfilterValues.forEach(filterValue => {\r\n\t\t\t\t\tconst label = expressQuerySelector(filterValue, 'label', true);\r\n\t\t\t\t\tconst labelText = expressQuerySelector(label, '.technical-label', true);\r\n\t\t\t\t\tconst input = expressQuerySelector(filterValue, 'input', true);\r\n\r\n\t\t\t\t\tif (filterName === ownCategory) {\r\n\t\t\t\t\t\tconst shouldFilterBeDisabled = !input.checked && (labelText.innerHTML.includes('(0)'));\r\n\t\t\t\t\t\tfilterValue.classList.toggle('a-form-input--disabled', shouldFilterBeDisabled);\r\n\t\t\t\t\t\tinput.toggleAttribute('disabled', shouldFilterBeDisabled);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst ownValue = filterValue.dataset.filterkey;\r\n\t\t\t\t\tconst filtersToCheck = { ...selectedFilters };\r\n\t\t\t\t\tfiltersToCheck[ownCategory] = !filtersToCheck[ownCategory] || filtersToCheck[ownCategory].length <= 0\r\n\t\t\t\t\t\t? [ownValue]\r\n\t\t\t\t\t\t: [...filtersToCheck[ownCategory], ownValue];\r\n\t\t\t\t\tconst filterKeys = Object.keys(filtersToCheck);\r\n\r\n\t\t\t\t\t// if only filter selected => default valid tiles count\r\n\t\t\t\t\tconst validTiles = filterValue.dataset.default_tile_count && filterKeys.every(x => (x != ownCategory && filtersToCheck[x].length == 0) || (x == ownCategory && filtersToCheck[x].length > 0))\r\n\t\t\t\t\t\t? parseInt(filterValue.dataset.default_tile_count)\r\n\t\t\t\t\t\t: tiles.filter(tile => {\r\n\t\t\t\t\t\t\treturn tile.classList.contains('u-hide') // u-hide is toggled on in filter step above\r\n\t\t\t\t\t\t\t\t? false\r\n\t\t\t\t\t\t\t\t: tile.dataset.tagid.split('|').includes(ownValue) || (+tile.dataset.reviewrating && +ownValue && +tile.dataset.reviewrating >= +ownValue);\r\n\t\t\t\t\t\t}).length;\r\n\r\n\t\t\t\t\tconst shouldFilterBeDisabled = validTiles == 0 && !input.checked;\r\n\t\t\t\t\tfilterValue.classList.toggle('a-form-input--disabled', shouldFilterBeDisabled);\r\n\t\t\t\t\tinput.toggleAttribute('disabled', shouldFilterBeDisabled);\r\n\r\n\t\t\t\t\tconst html = labelText.innerHTML;\r\n\t\t\t\t\tlabelText.innerHTML = html.replace(regExpForNumberInParentheses, \"(\" + validTiles + \")\");\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tfilters.forEach(filter => {\r\n\t\t\t\tif (filter.dataset.typeoffilter.includes(\"Slider\") || filter.classList.contains('technical-ignore-groupfiltervalues')) return;\r\n\t\t\t\tconst filterValues = expressQuerySelectorAll(filter, '.technical-filter-value');\r\n\t\t\t\tsortGroupFilterValues(filterValues, filter);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tcalculateHackFor2TilesOnLastLine(grid);\r\n\r\n\t\tif (sortMethod) {\r\n\t\t\tlet url = location.href;\r\n\t\t\tif (sortMethod === 'default')\r\n\t\t\t\turl = updateParameter('sortmethod[' + gridCounter + ']', '', url);\r\n\t\t\telse\r\n\t\t\t\turl = updateParameter('sortmethod[' + gridCounter + ']', sortMethod, url);\r\n\t\t\tif (url != location.href)\r\n\t\t\t\thistory.replaceState(null, '', url.toLowerCase());\r\n\t\t}\r\n\r\n\t\t// update tile counter\r\n\t\tconst gridAmount = expressQuerySelector(grid, '.technical-amount-of-tiles', false);\r\n\t\tif (!gridAmount) return; // when html is wrong in cache this element is not there\r\n\t\tconst visibleTiles = tiles.filter(x => !x.classList.contains('u-hide')).length;\r\n\t\tgridAmount.innerHTML = visibleTiles > 1\r\n\t\t\t? (gridAmount.dataset.multi || '').replace('{0}', visibleTiles.toString())\r\n\t\t\t: visibleTiles <= 0 ? '' : (gridAmount.dataset.single || '');\r\n\t\tgridAmount.classList.toggle('u-hide', visibleTiles <= 0);\r\n\t};\r\n\tconst refilter = (productGrid: HTMLElement) => {\r\n\t\tconst gridCounter = parseInt(productGrid.dataset['gridcounter'] || '', 10);\r\n\t\tfilterAndSortGrid(productGrid, null, null, filteredValues[gridCounter]);\r\n\t};\r\n\tconst filterCreateForOneGrid = (filterContainer: HTMLElement): IFilters => {\r\n\t\tconst onFilter = (multiselect: boolean, filterName: string, filterValue: string, checked: boolean, containerEl: HTMLElement, updateValue?: boolean) => {\r\n\t\t\tconst gridToFilter = expressQuerySelector(getParentWithClassName(containerEl, 'technical-grid-and-filters'), '.technical-product-grid', true);\r\n\t\t\tconst gridCounter = parseInt(gridToFilter.dataset['gridcounter'] || '', 10);\r\n\t\t\tif (!filteredValues[gridCounter])\r\n\t\t\t\tfilteredValues[gridCounter] = {};\r\n\r\n\t\t\tconst previousSelectedValue = filteredValues[gridCounter][filterName];\r\n\t\t\tif (!multiselect && checked)\r\n\t\t\t\tfilteredValues[gridCounter][filterName] = [];\r\n\t\t\tconst filteredOutValue = filteredValues[gridCounter][filterName] && filteredValues[gridCounter][filterName].find(x => x == filterValue);\r\n\t\t\tfilteredValues[gridCounter][filterName] = (!filteredValues[gridCounter][filterName] || filteredValues[gridCounter][filterName].length <= 0) && checked\r\n\t\t\t\t? [filterValue]\r\n\t\t\t\t: checked\r\n\t\t\t\t\t? [...filteredValues[gridCounter][filterName], filterValue]\r\n\t\t\t\t\t: filteredOutValue ? filteredValues[gridCounter][filterName].filter(x => x != filterValue) : []; // case filteredOutValue false => happens with slider(old value new value)\r\n\r\n\t\t\tconst currentValue = filteredValues[gridCounter][filterName];\r\n\t\t\t// only update when called and there are differences in the selected filter\r\n\t\t\tif (updateValue && previousSelectedValue?.toString() !== currentValue?.toString())\r\n\t\t\t\tfilterAndSortGrid(gridToFilter, filterName, null, filteredValues[gridCounter]);\r\n\t\t};\r\n\r\n\t\tconst resetFilter = (containerEl: HTMLElement) => {\r\n\t\t\t// This resets the filter\r\n\t\t\tconst gridToFilter = expressQuerySelector(getParentWithClassName(containerEl, 'technical-grid-and-filters'), '.technical-product-grid', true);\r\n\t\t\tconst gridCounter = parseInt(gridToFilter.dataset['gridcounter'] || '', 10);\r\n\t\t\tfilteredValues[gridCounter] = {};\r\n\t\t\tfilterAndSortGrid(gridToFilter, 'reset', null, filteredValues[gridCounter]);\r\n\t\t};\r\n\r\n\t\treturn createFilters(filterContainer, { onFilter, resetAll: resetFilter });\r\n\t};\r\n\tif (!grid.classList.contains('technical-load-api')) {\r\n\t\tconst buttonEl = expressQuerySelector(grid.parentElement ? grid.parentElement : document, '.technical-showmore-button', false);\r\n\t\tif (buttonEl)\r\n\t\t\twindow.showMores[gridCounter] = initPagedShowMoreElements(grid, buttonEl, 'currentpage', null, gridCounter, showMoreClick ? (currentPage: number, sizeDesktop: number, sizeMobile: number) => showMoreClick(currentPage, sizeDesktop, sizeMobile, savedSortMethod, filteredValues[gridCounter]) : null, () => calculateHackFor2TilesOnLastLine(grid));\r\n\r\n\t\t// filter?\r\n\t\tconst filterContainer = expressQuerySelector(grid.parentElement ? grid.parentElement : document, '.technical-filters-container', false);\r\n\t\tif (filterContainer) {\r\n\t\t\t// Desktop\r\n\t\t\tfilters.desktop = filterCreateForOneGrid(filterContainer);\r\n\r\n\t\t\t// Mobile\r\n\t\t\tconst mobileButton = expressQuerySelector(grid, '.technical-filters-mobile-button', true);\r\n\t\t\tconst popup = expressQuerySelector(document, '#MobileFilters' + gridCounter, true);\r\n\t\t\tconst mobileContainer = expressQuerySelector(popup, '.technical-filters-container', true);\r\n\t\t\tfilters.mobile = filterCreateForOneGrid(mobileContainer);\r\n\r\n\t\t\tconst onClickMobile = () => {\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'MobileFilters' + gridCounter,\r\n\t\t\t\t\tview: 'none'\r\n\t\t\t\t}).then(popup => {\r\n\t\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\t\tpopup.openAsync();\r\n\t\t\t\t\tconst button = expressQuerySelector(popup.popup, '.technical-close-dialog', true);\r\n\t\t\t\t\tbutton.addEventListener('click', popup.close);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t\tmobileButton.addEventListener('click', onClickMobile);\r\n\r\n\t\t\t// Mobile sorting\r\n\t\t\tconst sortElsMobile = expressQuerySelectorAll(mobileContainer, '.technical-sorting-radio');\r\n\t\t\tsortElsMobile.forEach(sortElMobile => {\r\n\t\t\t\tsortElMobile.addEventListener('click', () => {\r\n\t\t\t\t\tfilterAndSortGrid(grid, null, sortElMobile.value, filteredValues[gridCounter]);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst gridContent = expressQuerySelector(grid, '.technical-product-grid-content', true);\r\n\t\tgridContent.classList.remove('skeleton-loading');\r\n\t\tconst gridAmount = expressQuerySelector(grid, '.technical-amount-of-tiles', false);\r\n\t\tgridAmount && gridAmount.classList.remove('skeleton-loading');\r\n\r\n\t\t// sorting?\r\n\t\tconst sortEl = expressQuerySelector(grid, '.technical-dropdown', false);\r\n\t\tif (sortEl) {\r\n\t\t\tsortEl.addEventListener('change', () => {\r\n\t\t\t\tconst selectedSortingValue = sortEl[sortEl.selectedIndex] as HTMLOptionElement;\r\n\t\t\t\tfilterAndSortGrid(grid, null, selectedSortingValue.value, filteredValues[gridCounter]);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\trefreshFiltersAndSortingOnWindowResize();\r\n\r\n\t\tcalculateHackFor2TilesOnLastLine(grid);\r\n\r\n\t\tconst resetAllFilters = () => {\r\n\t\t\tfilters.mobile.resetFiltersContainerEl();\r\n\t\t\tfilters.desktop.resetFiltersContainerEl();\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\tresetFilter: filters && resetAllFilters,\r\n\t\t\treFilter: refilter,\r\n\t\t\tdisableSort\r\n\t\t} as IProductGrid;\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","import {\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\tgetParentWithClassName\r\n} from \"../common/html\";\r\nimport { createUsps } from \"./usp\";\r\nimport { createCustomSlider, ICustomPhotoSliderItem, ICustomPhotoSliderWithDivSettings } from \"./customslider\";\r\nimport { IRecommendationEventParams, trackRecommendationCartEvent } from \"../common/events\";\r\nimport { stopSkeletonLoading } from \"./skeleton\";\r\nimport { initVideoPlayer } from \"./video-player\";\r\nimport { createProductGrid } from \"./product-grid\";\r\nimport { createHighlightedTiles } from \"./highlighted-tiles\";\r\nimport { createImageDescription } from \"./image-description\";\r\nimport { createTruncate } from \"./truncate\";\r\nimport { createNewsletterSubscribe, createNewsletterUnsubscribe } from \"./newsletter\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport {logError} from \"../services/logger-service\";\r\n\r\nexport function createHomepageElements() {\r\n\twindow.showMores = [];\r\n\tconst uspDesktopEls = expressQuerySelectorAll(document, '.technical-usp-desktop');\r\n\r\n\t// Initialize the usp's\r\n\tif (uspDesktopEls) {\r\n\t\tuspDesktopEls.forEach(uspDesktopEl => createUsps(uspDesktopEl));\r\n\t}\r\n\r\n\twindow['initProductSliderComponent'] = function initProductSliderComponent(containerEl: HTMLElement) {\r\n\t\tconst sliderEl = expressQuerySelector(containerEl, '.technical-slider', true);\r\n\r\n\t\t// convert so slider elements\r\n\t\tconst sliderElements: ICustomPhotoSliderItem[] = [];\r\n\t\tfor (let z = 0, l = sliderEl.children.length; z < l; z++)\r\n\t\t\tsliderElements.push({ template: sliderEl.children[z] as HTMLElement });\r\n\r\n\t\t// settings for slider\r\n\t\tconst settings = {\r\n\t\t\tsliderElements: sliderElements,\r\n\t\t\tsliderContainerSettings: {\r\n\t\t\t\textraSliderClass: 'm-product-slider__slider-container',\r\n\t\t\t\telementsContainerSettings: {\r\n\t\t\t\t\textraSliderClass: 'm-product-slider__slider-content',\r\n\t\t\t\t\tslideClicked: (e: Event, settings: ICustomPhotoSliderWithDivSettings) => {\r\n\t\t\t\t\t\tconst slider = getParentWithClassName(e.target as Element, 'technical-recommendations');\r\n\t\t\t\t\t\tif (!slider) return; // only have on click on recommendations\r\n\r\n\t\t\t\t\t\tconst currentEl = getParentWithClassName(e.target as Element, 'technical-slide');\r\n\t\t\t\t\t\tif (!currentEl)\r\n\t\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t\tconst anchorEl = expressQuerySelector(currentEl, 'a');\r\n\t\t\t\t\t\tconst label = {\r\n\t\t\t\t\t\t\tpageType: containerEl.getAttribute('data-pagetype') || slider.getAttribute('data-pagetype'),\r\n\t\t\t\t\t\t\tpageCode: containerEl.getAttribute('data-pageCode') || slider.getAttribute('data-pageCode'),\r\n\t\t\t\t\t\t\tpvc: getParameter('pvc', anchorEl.href, false) || ''\r\n\t\t\t\t\t\t} as IRecommendationEventParams;\r\n\t\t\t\t\t\ttrackRecommendationCartEvent(\"Recommended product clicked\", label);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t} as ICustomPhotoSliderWithDivSettings;\r\n\r\n\t\t// create slider\r\n\t\tif (sliderEl.parentElement) createCustomSlider(sliderEl.parentElement, settings);\r\n\t};\r\n\r\n\t// init highlighted tiles\r\n\tconst highlightedTilesEl = expressQuerySelectorAll(document, \".technical-highlighted-tiles\");\r\n\thighlightedTilesEl.forEach(x => createHighlightedTiles(x));\r\n\r\n\tconst headerComponents = expressQuerySelectorAll(document, '.technical-header-component');\r\n\theaderComponents.forEach(header => {\r\n\t\tconst truncateEl = expressQuerySelector(header, '.technical-shave', false);\r\n\t\tif (!truncateEl) return;\r\n\t\tcreateTruncate(truncateEl, { lines: 2 });\r\n\t});\r\n\r\n\twindow['initProductGridComponent'] = function initProductGridComponent(containerEl: HTMLElement) {\r\n\t\tconst grid = expressQuerySelector(containerEl, \".technical-product-grid\", true);\r\n\t\tif (grid) createProductGrid(grid, {}, { refreshOnResize: true });\r\n\t};\r\n\twindow['initMaterialTilesComponent'] = function initMaterialTilesComponent(containerEl: HTMLElement) {\r\n\t\tcreateImageDescription(containerEl);\r\n\t\tconst videoTileEls = expressQuerySelectorAll(containerEl, '.technical-video-tile, .technical-video-container');\r\n\t\tvideoTileEls.forEach(el => {\r\n\t\t\tif (!getParentWithClassName(el, 'technical-product-grid-content'))\r\n\t\t\t\tinitVideoPlayer(el);\r\n\t\t});\r\n\r\n\t\tconst newsletterSubscribeEls = expressQuerySelectorAll(containerEl, '.m-material-tiles .technical-newsletter-subscribe');\r\n\t\tnewsletterSubscribeEls.forEach(el => createNewsletterSubscribe(el));\r\n\r\n\t\tconst newsletterUnSubscribeEls = expressQuerySelectorAll(containerEl, '.m-material-tiles .technical-newsletter-unsubscribe');\r\n\t\tnewsletterUnSubscribeEls.forEach(el => createNewsletterUnsubscribe(el));\r\n\t};\r\n\r\n\tconst productGrids = expressQuerySelectorAll(document, ':not([data-component-callback=initProductGridComponent]) .technical-grid-and-filters');\r\n\tproductGrids.forEach(x => window['initProductGridComponent'](x));\r\n\r\n\tconst materialTiles = expressQuerySelectorAll(document, ':not([data-component-callback=initMaterialTilesComponent]) .technical-image-description');\r\n\tmaterialTiles.forEach(x => window['initMaterialTilesComponent'](x));\r\n\r\n\tconst videoElements = expressQuerySelectorAll(document, '.technical-video');\r\n\tvideoElements.forEach(x => initVideoPlayer(x));\r\n\tstopSkeletonLoading();\r\n\r\n\tif (window.location.hash) {\r\n\t\tconst elContainerEl = expressQuerySelector(document, '.technical-homepage-elements', true);\r\n\t\tconst hashEl = expressQuerySelector(elContainerEl, window.location.hash, false);\r\n\t\tif (hashEl)\r\n\t\t\thashEl.scrollIntoView({behavior: 'smooth'});\r\n\t\telse\r\n\t\t\tlogError(\"Can't scroll to item with id = \" + window.location.hash + \" as it can't be found on the page\", window.location.href, undefined, undefined, undefined, \"Content\");\r\n\t}\r\n}\r\n","import { createCollapsable } from \"../components/collapsable\";\r\nimport { initCountDown } from \"./countdown\";\r\nimport { expressQuerySelectorAll } from \"../common/html\";\r\n\r\nexport function createPromotionBar(containerEl: HTMLElement) {\r\n\r\n\tcreateCollapsable(containerEl, {\r\n\t\ttitleElSelector: '.technical-promotion-bar-header',\r\n\t\tscrollIntoViewAfterOpen: false\r\n\t});\r\n\r\n\tconst countDownEls = expressQuerySelectorAll(containerEl, \".technical-countdown\");\r\n\tcountDownEls.forEach(el => {\r\n\t\tconst countDownToDate = el.dataset.countdown || \"\";\r\n\t\tconst daysLabel = el.dataset.dayslabel || \"\";\r\n\t\tconst dayLabel = el.dataset.daylabel || \"\";\r\n\r\n\t\tif (countDownToDate !== \"\") {\r\n\t\t\tconst onCountDownFinish = () => {\r\n\t\t\t\tconst parent = containerEl.parentElement;\r\n\t\t\t\tif (parent)\r\n\t\t\t\t\tparent.removeChild(containerEl);\r\n\t\t\t};\r\n\r\n\t\t\tinitCountDown(containerEl, el, countDownToDate, {\r\n\t\t\t\tshowDays: true,\r\n\t\t\t\tonCountDownFinish: onCountDownFinish,\r\n\t\t\t\tdaysLabel,\r\n\t\t\t\tdayLabel\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n}\r\n","import {\r\n\texpressQuerySelectorAll\r\n} from \"../common/html\";\r\nimport { createCollapsable, ICreateCollapsableDependencies } from \"../components/collapsable\";\r\n\r\nexport function createFaq(el: HTMLElement) {\r\n\tconst init = () => {\r\n\t\tconst collapsableDeps = {\r\n\t\t\tcontentSelector: '.m-collapsable__content',\r\n\t\t\ttitleElSelector: '.m-collapsable__title',\r\n\t\t\tscrollIntoViewAfterOpen: false\r\n\t\t} as ICreateCollapsableDependencies;\r\n\r\n\t\tconst collapsableEls = expressQuerySelectorAll(el, '.m-collapsable');\r\n\t\tif (collapsableEls && collapsableEls.length > 0)\r\n\t\t\tcollapsableEls.forEach(el => createCollapsable(el, collapsableDeps));\r\n\t};\r\n\r\n\tinit();\r\n}\r\n\r\n","import {createGeneralPageEventsAndComponents} from \"../components/page-general\";\r\nimport {createHomepageElements} from \"../components/homepage-elements\";\r\nimport { createPromotionBar } from \"../components/promotion-bar\";\r\nimport { expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport {initPagedShowMoreElements } from \"../components/show-more-elements\";\r\nimport { createFaq } from \"../components/faq\";\r\n\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\n\t// Promotion bar\r\n\tconst promotionBar = expressQuerySelector(document, '.technical-promotion-bar', false);\r\n\tif (promotionBar)\r\n\t\tcreatePromotionBar(promotionBar);\r\n\r\n\tcreateGeneralPageEventsAndComponents();\r\n\tcreateHomepageElements();\r\n\r\n\tconst faqs = expressQuerySelectorAll(document, '.technical-faq-container');\r\n\tfaqs.forEach(faqEl => {\r\n\t\tcreateFaq(faqEl);\r\n\r\n\t\tconst buttonEl = expressQuerySelector(faqEl, '.technical-showmore-button', false);\r\n\t\tif (buttonEl) {\r\n\t\t\tinitPagedShowMoreElements(faqEl, buttonEl, null, '.technical-showmore-faq', 0);\r\n\t\t}\r\n\t});\r\n});\r\n"],"names":["escapeForJavascript","str","replace","onlyLetters","input","Boolean","match","onlyNumber","toUrlHash","toLowerCase","stringToBase64","inputString","bytes","TextEncoder","encode","binString","Array","from","byte","String","fromCodePoint","join","window","btoa","redirectTo500","location","pathname","indexOf","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","Object","assign","URLSearchParams","JSON","stringify","getHtmlRequest","postHtmlRequest","isValidPartialViewResponse","logErrorEvent","event","errorEv","filename","lineno","colno","msg","col","lastLoggedError","totalLoggedErrors","urlString","errorString","isArray","errorLogStrings","length","i","toString","val","key","stack","exc","getCookie","cName","allCookies","document","cookie","cStart","cEnd","unescape","substring","writeCookie","cValue","extraDays","d","Date","setTime","getTime","expires","toUTCString","encodeURIComponent","writeCookieThatExpiresAtTheEndOfTheDay","getFullYear","getMonth","getDate","expressQuerySelector","el","selectors","isRequired","resultEl","querySelector","Error","hasClass","element","cssClass","regex","RegExp","className","expressEventListener","type","listener","useCapture","disposable","dispose","handler","removeEventListener","ev","addEventListener","expressQuerySelectorAll","slice","call","querySelectorAll","expressAddClass","expressToggleClass","expressRemoveClass","on","source","show","offsetParent","style","display","getComputedStyle","hide","getHeightWithMargins","getBoundingClientRect","height","parseInt","marginTop","marginBottom","getParentWithClassName","parentElement","classList","contains","getParents","elem","selector","Element","prototype","matches","webkitMatchesSelector","s","this","ownerDocument","item","parentNode","parents","push","htmlToElement","html","template","createElement","trim","innerHTML","content","firstChild","isMobileOnPageWithHeader","isElementVisible","offsetWidth","offsetHeight","width","isElementVisibleInViewPort","rect","top","left","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isElementPartiallyVisibleInViewport","percentVisible","windowHeight","Math","floor","remove","removeChild","pageVisibilityChange","onVisible","onHidden","hidden","visibilityState","visibilityChange","mozHidden","msHidden","webkitHidden","setTimeout","createClickableElement","onClick","options","clickEvent","enable","disable","onClicked","e","preventDefault","stopPropagation","addClickEvent","createButton","buttonEl","removeAttribute","setAttribute","createCollapsable","container","deps","opts","singleOpen","swapTitleDataAttribute","onInit","onBeforeOpen","onBeforeClose","titleElSelector","scrollIntoViewAfterOpen","contentSelector","openClass","OPEN_CLASS","titleEl","contentEl","origTitle","collapseTitle","innerText","getAttribute","closeWithBefore","close","resolve","openWithBefore","scrollIntoView","open","shouldScrollIntoView","forEach","add","behavior","block","button","autocomplete","settings","doc","containerStyle","userAgent","navigator","mobileFirefox","debounceWaitMs","preventSubmit","keyUpEventName","items","inputValue","minLen","showOnFocus","selected","debounceTimer","keypressCounter","undefined","minLength","clearDebounceTimer","clearTimeout","containerDisplayed","clear","detach","parent","update","render","currentValue","itemElement","textContent","label","renderGroup","groupName","groupDiv","fragment","createDocumentFragment","prevGroup","group","appendChild","div","onSelect","emptyMsg","empty","attach","updatePosition","inputRect","maxHeight","calc","docEl","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","customize","updateScroll","elements","getElementsByClassName","previous","previousElementSibling","offsetTop","selectBottom","containerBottom","updateIfDisplayed","resizeEventHandler","scrollEventHandler","target","keyupEventHandler","keyCode","which","ignore","startFetch","keydownEventHandler","containerIsDisplayed","selectPrev","disableAutoSelect","selectNext","focusEventHandler","trigger","savedKeypressCounter","value","blurEventHandler","activeElement","position","evt","focus","destroy","compositeDisposable","disposables","composite","addDisposable","addMany","addDisposables","createBaseFormInput","containerEl","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","dataset","Number","minlength","password","cursor","createTextInputWithAutoComplete","onCloseDisposable","autoCompleteSearch","onOpen","onClose","renderTextContent","containerInsertPosition","containerClass","autocompleteResult","itemEl","insertAdjacentElement","onMouseDownEvent","Gender","UpdateAccountResult","ChangePasswordStatus","OkResult","initForm","formEl","alternativeButton","onSubmitForm","buttonSelector","submitOnEnter","validatorOptions","submitButtonEl","validator","createFormValidator","onKeyUpEvent","formElements","inputs","filter","email","attributes","getNamedItem","maxLength","id","getInputs","keys","map","clearAll","clearValues","resetValidation","reset","validate","validations","name","all","onSubmit","data","formData","submitButton","getInputByName","disableForm","disableInput","setErrors","errors","clearInputs","names","clearInput","setValues","values","v","hideInput","form","classTo","errorClass","successClass","errorTextClass","errorTextParent","errorTextTag","onValidate","Pristine","subscribeAsync","appId","posId","lang","subscription","applicationId","pointOfSaleId","language","toggleSubscribeAsync","personId","newsletter","personalMessage","mailFrequency","postalMail","emarsysData","toggleSubscription","getFullQuerystring","pos","href","getParameters","pairs","split","params","pair","getParameter","required","queryStringParam","updateParameter","newAdditionalURL","tempArray","hash","additionalURL","baseURL","temp","result","addParameter","queryRemoveKeys","queryKeys","x","trackEvent","category","action","customParameters","dataLayer","trackOrderStatusEvent","partialEventParams","nrOrdersInAccount","nrItemsInOrder","accountId","trackComponentEvent","trackFiltersEvent","eventParams","trackSliderEvent","trackAccountPrefEvent","trackRecommendationCartEvent","recommendationLabel","isValidTextWithoutAngleBrackets","test","isValidEmailAddress","punycode","toUnicode","isValidWithoutNonAlphaNumericCharsAtEnd","reg","elName","alsoAlsoAllowBracket","last","charAt","canNotContainOnlyNumerics","isValidOrderNumber","orderNr","isTempAccountEmail","createNewsletterSubscribeAndUnsubscribe","customDocument","subscriptionForms","unSubscriptionForms","ioSubscribe","IntersectionObserverEntry","IntersectionObserver","entries","observer","entry","isIntersecting","createNewsletterSubscribe","unobserve","rootMargin","observe","formEL","ioUnSubscribe","createNewsletterUnsubscribe","emailEl","emptyGuid","appid","posid","sourceid","finally","page","pageName","successMessageEl","errorMessageEl","checkBoxEl","preFillLastUsedEmail","showSuccessMessage","personIdFromQuery","onSuccess","onError","isTouchDevice","PointerEvent","maxTouchPoints","matchMedia","TouchEvent","isMobileDevice","debounce","fn","delay","timeoutID","args","apply","throttle","fnAlways","lastTimestamp","now","initNavigationDesktop","firstLevelMenuEls","loadDesktopMenuItemAsync","loadedMenuItemsKeys","firstLevelActiveClass","closeMenu","currentTarget","closeFirstLevelMenuItemAndResetChildMenus","menuItem","closeAllSecondLevelMenuItemsAndResetChildMenus","secondLevelMenuEl","closeAllThirdLevelMenuItemsAndResetChildMenus","getOrLoadFirstLevelMenuItem","buttonEL","closeMenuOnMouseOut","itemKey","insertAdjacentHTML","buttonEls","every","nodeName","offsetLeft","initSecondLevelListeners","getOrLoadSecondLevelMenuItem","closest","firstLevelIndex","secondLevelIndex","includes","secondLevelMenuEls","initLanguageSelector","eventDisposables","onDocumentClickDisposable","detachDocumentClick","onDocumentClick","onButtonClick","attachOnDocumentClick","toggle","deInit","initTooltip","iconCloseSelector","tooltipSelector","toggleIconSelector","closeIconEl","onCloseIconClick","closeToolTip","capture","initSearchBar","desktopSearchBarContainer","mobileSearchBarContainer","initAutoComplete","onkeyup","fixInputValue","submit","onsubmit","validateInput","searchTerm","currentSearchterm","re","desktopSearchBar","mobileSearchBar","autoComplete","overlayComponent","dipose","initMobileSearchBar","createNotificationTile","markNotificationAsRead","linkEl","onTileClick","cb","disabled","orderNumber","ordernumber","pvc","sku","orderStatus","orderstatus","createNotificationCenter","onMarkedAllAsReadDisposable","domParser","DOMParser","loaded","getNotifications","isMobile","markNotificationsAsRead","notificationBellCountEl","menuEl","overLayEl","closeButtonEl","markAllAsReadButton","setOverLayClass","mobile","getTiles","onMarkedAsReadSingle","ids","loadNotifications","onMarkedAllAsRead","detachMarkAllAsReadClick","reduce","a","b","concat","reload","notificationCenterEl","parseFromString","tiles","attachMarkAllAsReadClick","amount","setNotificationCount","openMenu","calculateAndSetHeightOfMobileNavigationLevel","mobileNavigationLevel","browserUiBars","menuItemsLvlPositionTop","abs","initMyAccount","mainNavigationEl","getIconsAsync","loadAccountMenu","icons","urls","index","self","icon","svg","initCountDown","countDownToDate","showDays","onCountDownFinish","daysLabel","dayLabel","pad","num","size","countDownTime","dateString","timeString","day","month","year","hour","minutes","seconds","toDate","interval","setInterval","timeLeft","days","hours","clearInterval","initNavigationMobile","firstLevelMenuSelected","onCloseClickDisposable","onLanguageSelectorClickDisposable","userContainerEl","closeContainerEl","languageSelectorEl","thirdLevelMenuEls","mobileMenuEl","menuButtonEl","menuContainerEl","currentLanguage","getMobileMenu","contentPreLoaded","resetMenu","onCloseMenuClick","initMenuItemsAndBehavior","firstLevelListEl","activeLanguageEl","languageEl","iconButtonEls","uniqueUrls","loadIcons","attachCloseMenuClick","attachLanguageSelectorClick","attachFirstMenuItemClick","elementHeight","firstLevelEl","secondLevelEl","thirdLevelEls","thirdLevelEl","hideOtherMenuItems","hasChildNodes","children","onFirstMenuItemClick","handleHeaderLink","_a","prevClickedEl","offset","firstLevelMenuButton","secondLevelNavigationEl","setScrollTop","loadSecondLevelEl","frag","createRange","createContextualFragment","replaceChild","secondLevelItems","attachSecondMenuItemClick","menuItemsSecondLvl","scrollPos","onSecondMenuItemClick","thirdLevelDivEl","secondeLevelNavigationEl","thirdLevelContainerEl","loadThridLevelEl","menuItemsThirdLvl","thirdLevelIndex","_b","thirdLevelItems","attachThirdMenuItemClick","onThirdMenuItemClick","evTarget","onLanguageSelectorClick","languageSelectorContainerEl","languageCurrentEl","languageChoicesContainerEl","languageSelectorDescrEl","languageSelectorDescrOptionsEl","menuButtonComponent","createMainNavigation","initMobileMenu","pageid","indexLevel2","indexLevel3","pragma","getInlineSvgsAsync","toggleScroll","scrollingElement","getScrollingElement","scrollY","scroll","round","eventAnimation","eventContainer","toggleEventVisibility","stickyNav","stickynav","seen","imageContainer","animation","lottie","loadAnimation","renderer","loop","autoplay","cdn","catimage","initialSegment","playSegments","animate","transition","opacity","eventContainerInitialHeight","visiblePx","play","initEventAnimation","firstLevel","secondLevel","desktopLeftMenuEl","langButtonEl","langContainerEl","searchBarEl","notificationIds","append","leadTimesBarEl","openLeadTimesPopupAsync","click","topBarContainerEl","countdown","dayslabel","daylabel","barEls","myTopBar","otherTopBar","outerHTML","initComponents","getInlineSvgAsync","svgString","XMLSerializer","serializeToString","u","createCountrySelection","onClickDisposable","navigateTo","navigateToLink","attachOnClick","showCountrySelectionPopup","countrySelectionPopup","continueButton","countryselectionlink","fetchingPopupContent","createPopup","popupEl","isOpen","currentY","renderedDialogEl","closeOnClickOutsidePopup","dialogId","view","forceRefresh","fromCache","closeOnEnter","p","onKeyDownEvent","onCloseEvent","addOnClose","closeButton","popup","tempEl","replaceWith","create","openAsync","replaceContent","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","scrollTo","isIOS","isAppleDevice","isTouchScreen","audio","Audio","volume","iosQuirkPresent","initLeaveIntent","toggleLeaveIntent","enableLeaveIntent","isLeaveIntentEnabled","search","triggerLeaveIntentPopup","forceEnable","ouibounce","sensitivity","aggressive","sitewide","timer","callback","cookieExpire","canFire","EnableLeaveIntentPopup","EnableLeaveIntent","DisableLeaveIntent","ShowContentDialog","title","openFunction","okButtonKey","addTitleCssClass","extraPopupCss","BodyLabel","TitleLabel","ExtraPopupCss","TitleCssClass","OkButtonLabel","CreateTabs","tabsCollectionContainer","tabHideClass","hideclass","addQueryStringParameter","searchParams","set","newRelativePathQuery","history","replaceState","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","c","activate","componentObserver","intersectionRatio","threshold","createComponent","componentEl","componentCallback","passElInCallback","componentPassElementInCallback","trackGaEvent","componentGaEvent","trackHeight","componentTrackHeight","pushDatalayerEvent","componentPushDatalayerEvent","componentContentkey","componentEpc","componentIsProspect","componentTheme","componentTemplate","replaceNode","componentPageName","sessionStorage","getItem","minHeight","loadJavascriptAndRunMethod","r","elementHtml","setItem","isValidVatNumber","countryCode","vatNumberHasCorrectCountryCode","vatNumber","vatNumberString","part1","part2","testVal","date","substr","dateParts","createAbandonedVisitTitleSwapper","abandonedvisitenabled","blinkInterval","blinkTitle","abandonedvisittitle","abandonedvisittitlealternate","abandonedvisitspeed","createGeneralPageEventsAndComponents","gtmIFrame","src","leaveIntent","dataLayerIframe","Cookiebot","consent","marketing","enableLeaveIntentConfigValue","forms","isOptional","addMessages","validationMessages","setLocale","addValidator","limit","parseFloat","limitValue","replaceAll","vat","regexp","blacklist","list","regioncode","useHouseNumber","prefix","houseNumberEl","atStart","atEnd","passwordEl","HTMLInputElement","checkMobileAndSetCookie","header","initCollapsingPanels","showcountryselection","closeCountrySelectionPopup","toISOString","isbot","initFooterComponent","disableLeaveIntent","createUsps","iconEls","Guid","newSliderGuid","random","newGuid","EternalSlidingMode","getHighestSlideOfSlider","slidesInSlider","highestSlideEl","maxTitleHeight","slideEl","sliderTitleEl","tileTitle","tileSubTitle","titleheight","getHighestSlideLinkElOfSlider","maxLinkHeight","sliderLinkEl","linkHeight","SetHeight","slider","oldSlider","visibleSlides","highestSlideTitle","highestSlideSubTitle","highestSlideLinkEl","highestSlideLinkText","highestSlideTitlepx","highestSlideSubTitlepx","highestSlideLinkTextpx","highestSlideFullTitlepx","l","slideFullTitleEl","HeightScriptButtons","CustomPhotoSliderWithDivSettingsDefaults","sliderElements","sliderContainerSettings","elementsContainerSettings","extraSliderClass","slideClicked","cssWhenButtonsBothOnMax","nextButton","css","cssWhenOnMax","draggedSlider","previousButton","showHalfSlides","replaceWithElement","enableEternalSliding","eternalSlidingMode","Infinite","translateForMovement","forceRenderSlider","SliderCreated","ResizeEvent","bottomTitleHeight","sliderButtons","hightestImage","buttonCenterImage","btnHeight","createCustomSlider","sliderEl","elementsEl","firstVisibleElement","prevButton","sliderPxX","widthBeforeResize","mouseDownOnSlider","startSliderDragX","currentSliderDragX","isDragged","disableSliderDragging","preventPageScrolling","preventSliderDragging","prevSliderWidth","ioSlider","getSliderTemplate","InitializedEvent","checkEdgesAndMove","addHandlers","resizeObserver","previousEvent","nextEvent","addSliderEventListeners","ResizeObserver","contentRect","resize","sliderTouchEventListeners","enableKeyboardNavigation","addSliderKeyboardEventListeners","sliderMouseEventListeners","dragStart","onKeyDown","code","passive","scrollStart","sliderWidth","getFullWidthElement","preventClick","stopImmediatePropagation","getPositionX","dragStop","dragging","dragLeave","scrollBehavior","posX","movedSinceStart","getFirstVisibleElement","elementWidth","visibleElements","ceil","sliderxPassedTiles","direction","moveSlider","prepend","slideElements","elMethod","pageX","touches","customPhotoSliderItem","sliderElementDiv","createSliderElement","getCurrentElement","elementEl","elementElWidth","getAllElements","slides","sort","elementA","elementB","movePx","jumpIntoView","prevButtonClasslistMethod","nextButtonClasslistMethod","moveToOtherside","endOfSlider","widthRightSidePx","ScrollToBegin","getFullWidthElementWithoutRounding","scrollWidth","sliderPxXOverride","ms","pixelX","transform","sliderElement","cloneNode","calculateNextMove","positiveMove","maxPossibleSliderItemsRightPx","maxPossibleSliderItemsLeftpx","percentage","smoothSlideIntoView","align","indexOfElement","visibleEl","moveToLocation","currentSlide","currentSlideIndex","splice","htmlElement","isSliderElement","margin","marginLeft","marginRight","padding","paddingLeft","paddingRight","gap","removeSliderElement","indexToRemove","removeImageFromArray","deleteImageEl","resize1SlideToFullWidth","widthAfterResize","slide","minWidth","maxWidth","amountOfSlides","resizeSliderElementsToFullWidth","BeforeResizeEvent","draggedSliderEventTracking","nextMove","createIntersectionObserver","RemoveSliderElement","RemoveSliderElementOnIndex","deletedElement","AddSliderElement","indexToInsert","insertIntoSliderElements","prevElement","newSlideElement","insertBefore","Previous","Next","JumpIntoView","Settings","GetCurrentSlide","GetAllSlides","GetSliderElement","ShowButtons","HideButtons","Dispose","AddHandlers","stopSkeletonLoading","img","removeSkeleton","complete","initVideoPlayer","videoContainerEl","autoplayOnClick","playerEl","overlayEl","overlayButtonEl","vimeoVideoPlayer","scriptAlreadyLoaded","onOverlayClick","playPauseYoutubeVideo","toggleOverLay","isVimeoVideo","scriptEl","onload","Vimeo","Player","muted","postMessageToPlayer","func","hideOverlay","command","contentWindow","postMessage","showOverlay","isOverlayVisible","initPagedShowMoreElements","parameter","elementSelector","arrayCounter","showmoreClick","afterShowMore","elementElsDesktop","elementElsMobile","batchSizeDesktop","batchSizeMobile","showAllOnMore","urlParam","currentPage","isNaN","currentpage","toggleButtonVisibility","allDesktopVisible","allMobileVisible","showElements","sizeMobile","sizeDesktop","allShownDesktop","allShownMobile","showMore","urlParameter","disposableEvents","resetElement","initShowMoreElements","showMoreClick","buttonTextEl","buttonIconEl","reFetchElements","updateUrl","shouldUpdateUrl","showLess","baseamount","setShowLess","lesstext","setShowMore","moretext","findInsertIndex","arr","getIndexOfElement","start","end","mid","TemplateType","TypeOfFilter","Device","createCheckBoxSelectFilter","collapsableComponent","typeOfFilter","selectedFiltersContainerEl","filterqs","filterCategory","filterEl","checkboxEls","possibleValues","selectedFilterName","filterelement","selectedFilter","decodeURIComponent","selectedLabel","regExpForNumberInParentheses","updateParametersForUrl","removeFromFilterContainer","onFilter","attachRemoveFilterEvent","toggleResetFilters","addTextToFilterContainer","removeSingleSelectFilter","Regular","filterCheckboxEl","analytics","addSingleSelectFilter","f","checkboxEl","selectedtext","valueWasUpdated","createColorFilter","queryString","possibleUrlValues","showSelectedFilters","addFilterTemplate","removeColorFilter","Icons","toggleColorFilter","filterForCategory","removeFilterEvent","colorFilter","Icon","allSelectedColorFilters","filters","selectedFiltersChildren","val1","findIndex","filterforcategory","filtercategory","elementToInsertBefore","addColorToFilterContainer","createRangeFilter","filterQs","showSliderEls","filtersContainerEl","outOfBoundsMinBarEl","outOfBoundsMaxBarEl","sliderMinRangeInputEl","sliderMaxRangeInputEl","sliderMinRangeThumbEl","sliderMaxRangeThumbEl","containerMinSliderTextInputEl","containerMaxSliderTextInputEl","sliderMinTextInputEl","sliderMaxTextInputEl","originalMinValue","min","originalMaxValue","max","currentMinValue","currentMaxValue","valueChanged","timeout","drawSlider","sliderRangeInputEl","sliderRangeThumbEl","sliderTextInputEl","containerSliderTextInputEl","outOfBoundsBarEl","isLeftSliderMoved","isTextInputChanged","rangeMin","rangeMax","sliderCompletelyOnMax","zIndex","percent","percentStyle","reversePercentStyle","inBoundsBarEl","getSliderValue","isNoneSelected","isNoneInputSelected","checkedOptionValue","some","onInput","addSliderFilter","Slider","removeRangeFilter","triggerValueClicked","valueOverride","currentEl","chk","hideSlider","selectedOption","toggleOption","selectOptionValue","orginalSliderValue","isFilterActive","filterValue","getSelectOptions","createFilters","noneSelectedLabelEl","resetAll","showMoreElementsComponents","templateType","htmlOrColor","Text","filterforcategoryvalue","createTextNode","iconSpan","color","iconColorSpan","span","eventalreadybinded","filterCategoryValue","selectedFilterCategoryEl","hideSelectedFilters","selectedFilterValue","selectedFilterDisplayName","removeEvent","filterForCategoryValue","removeEl","resetFilterEls","resetFilterEl","removeFromUrl","param","pushState","collapsibleEls","filterQsArr","rangeFilterComponents","elFilterQs","filterCollapsable","filterCheckboxEls","filterCheckboxPossibleValues","filterkey","flat","typeoffilter","MultiSelect","colorEls","colorElsPossibleValues","rangeFilterComponent","resetFilters","resetFiltersContainerEl","collapsibleEl","colorEl","showSliderEl","resetFilter","foundfilter","sortGroupFilterValues","htmlFilterValues","htmlFilter","disabledFilterValues","enabledFilterValues","filtersContainer","showMoreEl","sorterFilterValues","createProductGrid","grid","filterGrid","desktop","gridCounter","filteredValues","savedSortMethod","calculateHackFor2TilesOnLastLine","disableSort","sortingGrid","sortEl","filterAndSortGrid","filterName","sortMethod","selectedFilters","gridContent","resetTiles","switchedPrices","tile","switchPrices","shouldSwitchPrices","showOriginalPrice","fromPriceLabelEl","mainPrice","strikedPriceEl","detailPrice","isStartingPrice","startingprice","units","price","altPrice","unitPrice","unitPriceWithPrice","strikedUnitPrice","strikedPrice","setPriceSelected","sortTile","priceA","sortPrice","sortUnitPrice","priceB","sortDefault","sortDate","ratingA","reviewrating","ratingB","sortDefaultA","sortDefaultB","unitPriceA","unitPriceB","statusA","statusB","isAUnavailable","isBUnavailable","wrongTileIndex","defaultIndex","temporarilyUnavailable","previousSortMethod","shouldSwitch","hideDeliveryDate","deliveryElem","infoContentItems","_d","_c","_e","_f","_g","_h","tags","tagid","validTile","selectedFilterInCategory","tileUnitPrice","isValidUnitPrice","tileLowPrice","tileHighPrice","priceHigh","isValidLowPrice","isValidHighPrice","isValidBetweenLowPriceAndHighPrice","selectedReviewRating","tileReviewRating","noElementsEl","t","baseAmountDesktop","baseamountDesktop","baseAmountMobile","baseamountMobile","batchsizeDesktop","batchsizeMobile","hideButtonDesktop","hideButtonMobile","visibleTiles","showMores","filterValues","ownCategory","labelText","shouldFilterBeDisabled","ownValue","filtersToCheck","filterKeys","validTiles","default_tile_count","gridAmount","multi","single","refilter","productGrid","filterCreateForOneGrid","filterContainer","multiselect","updateValue","gridToFilter","previousSelectedValue","filteredOutValue","mobileButton","mobileContainer","onClickMobile","sortElMobile","selectedSortingValue","selectedIndex","refreshOnResize","isMobileOnResize","refreshFiltersAndSortingOnWindowResize","resetAllFilters","reFilter","createTruncate","lineHeight","lines","shaveMoreOnContainer","shaveLessOnContainer","defaults","ellipsis","eventTrackingMethod","openEventAction","truncate","expand","closeEventAction","collapse","Truncate","onInitEvent","updateConfig","newOpts","overrideDefault","updateContent","createHighlightedTiles","truncateEls","videoEls","eventDisposable","onResize","currentDevice","Mobile","Tablet","Desktop","truncatedEls","vEl","createImageDescription","getDevice","useMaxHeight","outerHeight","includeOffset","calculateTruncateMaxHeight","headerStyle","removeSkeletons","getTruncateOptions","device","createHomepageElements","uspDesktopEls","uspDesktopEl","initProductSliderComponent","anchorEl","pageType","pageCode","truncateEl","initProductGridComponent","initMaterialTilesComponent","elContainerEl","hashEl","createPromotionBar","createFaq","collapsableDeps","collapsableEls","promotionBar","faqEl"],"mappings":"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"}