{"version":3,"file":"designselectionpage.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/utils/debounce.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/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/utils/guid.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/customslider.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/product.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/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/popups/loading-dialog.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/atoms/amount.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/content-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/order-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/price.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/video-player.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/molecules/carrousel.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/popups/design-selection-page.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/molecules/empty-state.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/design-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/promotion-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/pages/designselectionpage.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\tconst el = expressQuerySelector(document, '.o-main-navigation__hamburger-button', false);\r\n\treturn el && isElementVisible(el);\r\n}\r\n\r\nexport function isElementVisible(el: HTMLElement) {\r\n\treturn el && !(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","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(this, 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\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\texpressToggleClass,\r\n\tgetParents\r\n} from \"../common/html\";\r\nimport {autocomplete, IAutocompleteItem} from \"../external/autocomplete\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {postRequest} from \"../utils/fetch\";\r\nimport {stringToBase64} from \"../utils/string\";\r\nimport {debounce} from \"../utils/debounce\";\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 interface ISlider extends IBaseFormInput {\r\n\treadonly dispose: () => void;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string;\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\nexport function createSingleSlider(containerEl: HTMLElement, sendPartialUpdateForInput?: (input: HTMLInputElement | HTMLTextAreaElement) => Promise) : ISlider {\r\n\tconst baseComponent = createBaseFormInput(containerEl, '.technical-slider-max-range');\r\n\tconst sliderMaxRangeEl = expressQuerySelector(containerEl, \".technical-slider-max-range\", true);\r\n\tconst sliderLabelEls = expressQuerySelectorAll(containerEl, '.technical-slider-label');\r\n\tconst sliderPostBarEl = expressQuerySelector(containerEl, \".technical-slider-post-bar\", true);\r\n\tlet currentValue = '';\r\n\tinterface ISnapData {\r\n\t\tsnappingPos: number,\r\n\t\tsnappingValue: number\r\n\t}\r\n\r\n\tconst snappingArray: ISnapData[] = [];\r\n\r\n\tconst onSliderInput = () => {\r\n\t\tcurrentValue = sliderMaxRangeEl.value;\r\n\t};\r\n\r\n\tconst disposableEvents = compositeDisposable(\r\n\t\t[\r\n\t\t\texpressEventListener(sliderMaxRangeEl, 'input', onSliderInput)\r\n\t\t]\r\n\t);\r\n\r\n\tconst setValue = (value: string) => {\r\n\t\tsliderMaxRangeEl.value = value;\r\n\t};\r\n\r\n\tconst getValue = () => {\r\n\t\treturn currentValue;\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tif (disposableEvents) disposableEvents.dispose();\r\n\t};\r\n\r\n\tconst orderLabels = () => {\r\n\t\tconst handleWidth = 17;\r\n\t\tconst sliderRect = sliderMaxRangeEl.getBoundingClientRect();\r\n\t\tconst sliderWidth = sliderRect.width;\r\n\t\tconst labelCount = sliderLabelEls.length;\r\n\t\tconst singleValueToTheLeft = (sliderWidth - handleWidth) / (labelCount - 1);\r\n\t\tsliderLabelEls.forEach((labelEl, index) => {\r\n\t\t\tconst valueToTheLeft = (singleValueToTheLeft * index) + (handleWidth / 2);\r\n\t\t\tlabelEl.style.left = `calc(${valueToTheLeft}px - ${labelEl.offsetWidth/2}px)`;\r\n\t\t\tsnappingArray.push({snappingPos: valueToTheLeft-labelEl.offsetWidth/2, snappingValue : index-1} as ISnapData);\r\n\t\t});\r\n\t};\r\n\r\n\tif (sliderLabelEls && sliderLabelEls.length) {\r\n\t\torderLabels();\r\n\t\tconst onLabelClick = (ev: MouseEvent) => {\r\n\t\t\tconst currentLabelEl = ev.currentTarget as HTMLSpanElement;\r\n\t\t\tsliderMaxRangeEl.value = currentLabelEl.innerText;\r\n\t\t\tsendPartialUpdateForInput && sendPartialUpdateForInput(sliderMaxRangeEl);\r\n\t\t};\r\n\t\tdisposableEvents.add(expressEventListener(window, 'resize', debounce(orderLabels, 250)));\r\n\t\tsliderLabelEls.forEach((labelEl, index) => {\r\n\t\t\tdisposableEvents.add(expressEventListener(labelEl, 'click', onLabelClick));\r\n\t\t});\r\n\t}\r\n\r\n\treturn {\r\n\t\t...baseComponent,\r\n\t\tdispose,\r\n\t\tsetValue,\r\n\t\tgetValue\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/myaccountapi/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 {\r\n\texpressEventListener,\r\n\texpressQuerySelector, expressQuerySelectorAll,\r\n\tgetParentWithClassName, getSelfOrParentWithClassName\r\n} from \"../common/html\";\r\nimport { createButton } from \"./button\";\r\nimport {\r\n\tcreateFormInput,\r\n\tcreatePasswordFormInput,\r\n\tcreateSelectBox,\r\n\tcreateSingleSlider,\r\n\tIFormInput,\r\n\tIPasswordInput,\r\n\tISelectBox, ISlider\r\n} from \"./form-input\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\nimport {debounce} from \"../utils/debounce\";\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\treadonly showFirstErrorOnValidate?: boolean;\r\n\treadonly enablePartialSubmit?: boolean;\r\n\treadonly partialSubmit?: (ev: Event) => Promise;\r\n\treadonly sendPartialUpdateForInput?: (input: HTMLInputElement | HTMLTextAreaElement) => Promise;\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\treadonly getAllVisibleInputs: () => (ISelectBox | IFormInput | ISlider)[]\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\tshowFirstErrorOnValidate,\r\n\t\tenablePartialSubmit,\r\n\t\tpartialSubmit,\r\n\t\tsendPartialUpdateForInput\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 | ISlider; } = {};\r\n\tlet invalidFormFields: HTMLElement[];\r\n\tlet isValid: boolean;\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 | ISlider | 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__slider-range\"))\r\n\t\t\t\tinput = createSingleSlider(getParentWithClassName(el, 'a-form-input')!, sendPartialUpdateForInput);\r\n\t\t\telse if (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 getAllVisibleInputs = () => {\r\n\t\tconst visibleInputs: (ISelectBox | IFormInput | ISlider)[] = [];\r\n\t\tgetInputs().forEach(input => {\r\n\t\t\tif (!getSelfOrParentWithClassName(input.inputEl, 'u-hide')) {\r\n\t\t\t\tvisibleInputs.push(input);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn visibleInputs;\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\t\tinvalidFormFields = [];\r\n\t\tisValid = false;\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\tisValid = validator.validate();\r\n\t\tif (!isValid && showFirstErrorOnValidate) {\r\n\t\t\tinvalidFormFields = expressQuerySelectorAll(formEl, \".a-form-input--error\");\r\n\t\t\tif (invalidFormFields[0]) {\r\n\t\t\t\tinvalidFormFields[0].scrollIntoView({ behavior: \"smooth\" });\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn isValid;\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\tif (enablePartialSubmit && partialSubmit) {\r\n\t\tconst onFormInput = async (ev: Event) => {\r\n\t\t\tawait partialSubmit(ev);\r\n\t\t};\r\n\r\n\t\tconst debounceOnFormInput = debounce(onFormInput, 600);\r\n\t\tformEl.addEventListener('input', (ev) => debounceOnFormInput(ev), false);\r\n\t}\r\n\r\n\tconst getInputByName: (name: string) => ISelectBox | IFormInput | ISlider | 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\tgetAllVisibleInputs\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","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] && 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\t// show mobile menu (add display block so height can be correctly calculated first)\r\n\t\t\t\tmenuButtonEl.classList.add(\"menu-is-open\");\r\n\t\t\t\tmenuContainerEl.classList.add(\"menu-is-open\");\r\n\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});\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\t// history.replaceState({}, origTitle, window.location.href);\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\twindow.addEventListener('beforeunload', () => {\r\n\t\tdocument.title = origTitle;\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, isElementVisible} 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\tPristine.addValidator(\"npssliderwithcheckbox\", function (value, min, max, sliderId, checkboxId) {\r\n\t\t\tconst sliderEl = expressQuerySelector(this.form, '#'+sliderId, false);\r\n\t\t\tif (isElementVisible(sliderEl)) {\r\n\t\t\t\treturn parseInt(sliderEl.value) >= parseInt(min) && parseInt(sliderEl.value) <= parseInt(max);\r\n\t\t\t} else {\r\n\t\t\t\tconst idk = expressQuerySelector(this.form, '#'+checkboxId, false);\r\n\t\t\t\treturn idk.checked;\r\n\t\t\t}\r\n\t\t}, window.validationMessages['npsslider'], 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","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 {\r\n\tdebounce,\r\n\tthrottle\r\n} from \"../utils/debounce\";\r\nimport {\r\n\texpressAddClass,\r\n\texpressEventListener,\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\nimport {\r\n\tcompositeDisposable,\r\n\tIDisposable\r\n} from \"../utils/disposable\";\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\tlet disposableEvents: IDisposable;\r\n\tlet disposableDragTouchEvents: IDisposable;\r\n\tlet disposableDragMouseEvents: IDisposable;\r\n\r\n\t// private methods\r\n\tconst init = function (element: HTMLElement, replaceWithElement: boolean) {\r\n\t\tdisposableEvents = compositeDisposable([]);\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\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\taddDefaultEventListeners();\r\n\t\t\tresizeObserver.observe(elementsEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tdisposableEvents.dispose();\r\n\t\tdisposableEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragTouchEvents.dispose();\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragMouseEvents.dispose();\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\t};\r\n\r\n\tconst addDefaultEventListeners = () => {\r\n\t\t// add touch listeners when touch\r\n\t\tif (isTouchDevice()) {\r\n\t\t\tif (sliderEl) {\r\n\t\t\t\tdisposableEvents.add(expressEventListener(sliderEl, 'touchstart', dragStart));\r\n\t\t\t}\r\n\t\t}\r\n\t\t// keyboard events\r\n\t\telse if (settings.enableKeyboardNavigation) {\r\n\t\t\tdisposableEvents.add(expressEventListener(document, 'keydown', onKeyDown));\r\n\t\t}\r\n\r\n\t\tif (window) {\r\n\t\t\tdisposableEvents.add(expressEventListener(window, 'scroll', scrollStart));\r\n\t\t}\r\n\r\n\t\t// slider mouse events\r\n\t\tif (sliderEl) {\r\n\t\t\tdisposableEvents.add(expressEventListener(sliderEl, '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}\r\n\r\n\t\taddPrevNextBtnEventListeners();\r\n\t};\r\n\r\n\tconst addPrevNextBtnEventListeners = () => {\r\n\t\t//button mouse events\r\n\t\tif (prevButton) {\r\n\t\t\tdisposableEvents.add(expressEventListener(prevButton, 'mouseup', (e) => { disableSliderDragging = false; previousEvent(e); }));\r\n\t\t\tdisposableEvents.add(expressEventListener(prevButton, 'mousedown', _ => disableSliderDragging = true));\r\n\t\t}\r\n\t\tif (nextButton) {\r\n\t\t\tdisposableEvents.add(expressEventListener(nextButton, 'mouseup', (e) => { disableSliderDragging = false; nextEvent(e); }));\r\n\t\t\tdisposableEvents.add(expressEventListener(nextButton, 'mousedown', _ => disableSliderDragging = true));\r\n\t\t}\r\n\t};\r\n\r\n\tconst addDragTouchEventListeners = () => {\r\n\t\tif (!sliderEl)\r\n\t\t\treturn;\r\n\r\n\t\t// remove exisiting events to prevent double triggering\r\n\t\tdisposableDragTouchEvents.dispose();\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragTouchEvents.add(expressEventListener(sliderEl, 'touchend', dragStop));\r\n\t\tdisposableDragTouchEvents.add(expressEventListener(sliderEl, 'touchmove', throttle(dragging, 100)));\r\n\t\tdisposableDragTouchEvents.add(expressEventListener(sliderEl, 'touchcancel', dragLeave));\r\n\t};\r\n\r\n\tconst addMouseDragEventListeners = () => {\r\n\t\tif (!sliderEl)\r\n\t\t\treturn;\r\n\r\n\t\t// remove exisiting events to prevent double triggering\r\n\t\tdisposableDragMouseEvents.dispose();\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragMouseEvents.add(expressEventListener(sliderEl, '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\tdisposableDragMouseEvents.add(expressEventListener(sliderEl, 'mouseleave', dragLeave));\r\n\r\n\t\tdisposableDragMouseEvents.add(expressEventListener(sliderEl, 'mouseup', dragStop));\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 onKeyDown = (ev: KeyboardEvent) => {\r\n\t\tswitch (ev.code) {\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 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\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\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\tisTouchDevice() ? addDragTouchEventListeners() : addMouseDragEventListeners();\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// remove events\r\n\t\tdisposableDragTouchEvents.dispose();\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragMouseEvents.dispose();\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\r\n\t\tisDragged = false;\r\n\t};\r\n\tconst getPositionX = (e: Event): number => {\r\n\t\tif (!e || !e.type) return 0;\r\n\t\tif (e.type.includes('mouse')) {\r\n\t\t\tconst mouseEvent = e as MouseEvent;\r\n\t\t\treturn mouseEvent.pageX;\r\n\t\t}\r\n\t\tif (e.type.includes('touch')) {\r\n\t\t\tconst touchEvent = e as TouchEvent;\r\n\t\t\treturn touchEvent.touches[0].pageX;\r\n\t\t}\r\n\t\treturn 0;\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: addDefaultEventListeners\r\n\t};\r\n}\r\n","export function getProductCodeFromPvc(pvc: string) {\r\n\t// PVC = productcode_attribute~aspectratio\r\n\tconst dashPos = pvc.indexOf('_');\r\n\tconst tildePos = pvc.indexOf('~');\r\n\tif (dashPos < 0 && tildePos < 0)\r\n\t\treturn pvc;\r\n\r\n\treturn pvc.substring(0, dashPos > 0 ? dashPos : tildePos);\r\n}\r\n\r\nexport function getAspectRatioFromPvc(pvc: string) {\r\n\t// PVC = productcode_attribute~aspectratio\r\n\tconst tildePos = pvc.indexOf('~');\r\n\tif (tildePos < 0)\r\n\t\treturn '';\r\n\r\n\treturn pvc.substring(tildePos + 1);\r\n}\r\n\r\nconst Orientation = Object.freeze({\r\n\tUndefined: \"Undefined\",\r\n\tHorizontal: \"Horizontal\",\r\n\tVertical: \"Vertical\",\r\n\tSquare: \"Square\",\r\n});\r\n\r\nexport function getOrientationFromPvc(pvc: string) {\r\n\tconst aspectRatio = getAspectRatioFromPvc(pvc);\r\n\r\n\treturn getOrientationFromAspectRatio(aspectRatio);\r\n}\r\nexport function getOrientationFromAspectRatio(aspectRatio: string) {\r\n\tif (!aspectRatio)\r\n\t\treturn Orientation.Undefined;\r\n\r\n\tconst parts = aspectRatio.split('x');\r\n\tif (parts.length !== 2)\r\n\t\treturn Orientation.Undefined;\r\n\r\n\r\n\tconst width = parseInt(parts[0], 10);\r\n\tconst height = parseInt(parts[1], 10);\r\n\r\n\tif (isNaN(width) || isNaN(height))\r\n\t\treturn Orientation.Undefined;\r\n\r\n\tif (width > height)\r\n\t\treturn Orientation.Horizontal;\r\n\telse if (width < height)\r\n\t\treturn Orientation.Vertical;\r\n\telse\r\n\t\treturn Orientation.Square;\r\n}\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","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 {IFilterDependencies, TypeOfFilter} from \"../../common/filter\";\r\nimport {expressEventListener, expressQuerySelector, getParentWithClassName} from \"../../common/html\";\r\nimport {compositeDisposable} from \"../../utils/disposable\";\r\nimport {onlyNumber} from \"../../utils/validation\";\r\nimport {getParameter} from \"../../utils/querystring\";\r\nimport {debounce} from \"../../utils/debounce\";\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\treadonly dispose: () => 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 containerEl = expressQuerySelector(filterEl, \".a-form-input__slider-container\", true);\r\n\tconst preBarEl = expressQuerySelector(containerEl, \".a-form-input__slider-pre-bar\", true);\r\n\tconst postBarEl = expressQuerySelector(containerEl, \".a-form-input__slider-post-bar\", true);\r\n\tconst rangeEl = expressQuerySelector(containerEl, \".a-form-input__slider-range\", true);\r\n\tconst minRangeInputEl = expressQuerySelector(filterEl, \".a-form-input__slider-range--min\", true);\r\n\tconst maxRangeInputEl = expressQuerySelector(filterEl, \".a-form-input__slider-range--max\", true);\r\n\tconst minBubbleContainerEl = expressQuerySelector(containerEl, \".a-form-input__slider-bubble-container--min\", false);\r\n\tconst maxBubbleContainerEl = expressQuerySelector(containerEl, \".a-form-input__slider-bubble-container--max\", false);\r\n\tconst minRangeThumbEl = expressQuerySelector(filterEl, \".a-form-input__slider-thumb--min\", true);\r\n\tconst maxRangeThumbEl = expressQuerySelector(filterEl, \".a-form-input__slider-thumb--max\", true);\r\n\tlet minBubbleInputEl: HTMLInputElement, maxBubbleInputEl: HTMLInputElement;\r\n\tif (minBubbleContainerEl)\r\n\t\tminBubbleInputEl = expressQuerySelector(minBubbleContainerEl, \".a-form-input__slider-bubble--min\", true);\r\n\tif (maxBubbleContainerEl)\r\n\t\tmaxBubbleInputEl = expressQuerySelector(maxBubbleContainerEl, \".a-form-input__slider-bubble--max\", true);\r\n\tconst disposableEvents = compositeDisposable ([]);\r\n\tconst selectedFilter: string = getParameter(filterQs);\r\n\tconst originalMinValue: string = minRangeInputEl.value;\r\n\tconst originalMaxValue: string = maxRangeInputEl.value;\r\n\tlet currentMinValue: string = minRangeInputEl.value;\r\n\tlet currentMaxValue: string = maxRangeInputEl.value;\r\n\tlet previousMinValue: string = '';\r\n\tlet previousMaxValue: string = '';\r\n\tlet timeout: NodeJS.Timeout = undefined; // timeout to trigger selected value\r\n\tconst inputDebounceValue = 350;\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 percent = (value: number, min: number, max: number) => Math.ceil(((value - min) / (max - min)) * 100);\r\n\r\n\tconst moveToTop = (input: HTMLInputElement) => {\r\n\t\tif (input === maxRangeInputEl) {\r\n\t\t\tmaxRangeInputEl.style.zIndex = \"2\";\r\n\t\t\tminRangeInputEl.style.zIndex = \"1\";\r\n\t\t} else {\r\n\t\t\tmaxRangeInputEl.style.zIndex = \"1\";\r\n\t\t\tminRangeInputEl.style.zIndex = \"2\";\r\n\t\t}\r\n\t};\r\n\r\n\tconst setValues = (minValue: number, maxValue: number) => {\r\n\t\tsetMinValue(minValue);\r\n\t\tsetMaxValue(maxValue);\r\n\t};\r\n\r\n\tconst setMinValue = (minValue: number) => {\r\n\t\tconst updateMinBar = (value: number) => {\r\n\t\t\tconst percentStyle = percent(value, parseInt(minRangeInputEl.min), parseInt(minRangeInputEl.max)) + '%';\r\n\t\t\tpreBarEl.style.width = percentStyle;\r\n\t\t\trangeEl.style.left = percentStyle;\r\n\t\t\tminRangeThumbEl.style.left = percentStyle;\r\n\t\t};\r\n\r\n\t\tminRangeInputEl.value = minValue+'';\r\n\t\tif (minBubbleInputEl) minBubbleInputEl.value = minValue+'';\r\n\t\tupdateMinBar(minValue);\r\n\t\tcurrentMinValue = minValue+'';\r\n\t};\r\n\r\n\tconst setMaxValue = (maxValue: number) => {\r\n\t\tconst updateMaxBar = (value: number) => {\r\n\t\t\tconst percentage = percent(value, parseInt(maxRangeInputEl.min), parseInt(maxRangeInputEl.max));\r\n\t\t\tconst percentStyle = percentage + '%';\r\n\t\t\tconst reversePercentStyle = 100 - percentage + '%';\r\n\t\t\tpostBarEl.style.width = reversePercentStyle;\r\n\t\t\trangeEl.style.right = reversePercentStyle;\r\n\t\t\tmaxRangeThumbEl.style.left = percentStyle;\r\n\t\t};\r\n\r\n\t\tmaxRangeInputEl.value = maxValue+'';\r\n\t\tif (maxBubbleInputEl) maxBubbleInputEl.value = maxValue+'';\r\n\t\tupdateMaxBar(maxValue);\r\n\t\tcurrentMaxValue = maxValue+'';\r\n\t};\r\n\r\n\tconst performFiltering = (updateQuerystring = true) => {\r\n\t\t// Nothing changed => exit\r\n\t\tif (previousMinValue === currentMinValue && previousMaxValue === currentMaxValue) return;\r\n\t\tpreviousMinValue = currentMinValue;\r\n\t\tpreviousMaxValue = currentMaxValue;\r\n\t\t// Perform the actual filtering\r\n\t\tconst value = isNoneInputSelected()\r\n\t\t\t? '0'\r\n\t\t\t: currentMinValue == currentMaxValue ? currentMaxValue : currentMinValue + \" - \" + currentMaxValue;\r\n\t\taddTextToFilterContainer && addTextToFilterContainer(filtersContainerEl, TypeOfFilter.Slider, selectedFiltersContainerEl, filterCategory, value, removeRangeFilter);\r\n\t\ttriggerFilter(true, getSliderValue());\r\n\t\tif (updateQuerystring)\r\n\t\t\tupdateParametersForUrl && updateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\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 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}_${minBubbleInputEl.value}-${maxBubbleInputEl.value}`;\r\n\t};\r\n\r\n\tconst triggerFilter = (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 toggleOption = (selectOptionValue: string[], enable: boolean) => {\r\n\t\tif (!showSliderEls || !showSliderEls.length) return;\r\n\t\tconst originalSliderValue = 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 (originalSliderValue == afterChangesSliderValue) return;\r\n\t\ttriggerFilter(true);\r\n\t\tupdateParametersForUrl && updateParametersForUrl(TypeOfFilter.Slider, filterQs, getSliderValue(), false, filterEl.dataset.analytics);\r\n\t};\r\n\r\n\tconst removeRangeFilter = (update = true) => {\r\n\t\tconst deselect = (currentEl?: HTMLInputElement | null) => {\r\n\t\t\tif (showSliderEls.length) filterEl.classList.add(\"u-hide\");\r\n\r\n\t\t\tshowSliderEls.forEach(chk => {\r\n\t\t\t\tif (currentEl && currentEl.id !== chk.id) chk.checked = false;\r\n\t\t\t\tif (!currentEl) chk.checked = false;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tdeselect();\r\n\r\n\t\tsetValues(parseInt(originalMinValue), parseInt(originalMaxValue));\r\n\t\tconst value = getSliderValue();\r\n\t\tonFilter && onFilter(false, filterQs, value, false, containerEl, update);\r\n\t\tupdateParametersForUrl && updateParametersForUrl(TypeOfFilter.Slider, filterQs, value, true, filterEl.dataset.analytics);\r\n\t\tremoveFromFilterContainer && removeFromFilterContainer(filtersContainerEl, selectedFiltersContainerEl, filterCategory);\r\n\t};\r\n\r\n\tconst addHandlers = () => {\r\n\t\t// This event is fired when the user leaves the bubble input or presses enter. It will update the position of the slider handles\r\n\t\tconst onBubbleInputElConfirm = (ev: Event) => {\r\n\t\t\tif (ev.type === 'focusout') {\r\n\t\t\t\tperformFiltering();\r\n\t\t\t} else if (ev.type === 'keydown') {\r\n\t\t\t\tconst kbEvent = ev as KeyboardEvent;\r\n\t\t\t\tif (kbEvent.key === \"Enter\") {\r\n\t\t\t\t\tperformFiltering();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// This event is triggered when the user inputs in one of the bubble inputs or moves one of the handles\r\n\t\tconst onInput = (ev: Event) => {\r\n\t\t\tconst target = ev.target as HTMLInputElement;\r\n\t\t\tif (!onlyNumber(target.value) || isNaN(parseInt(target.value))) {\r\n\t\t\t\tif (target.value === '') return;\r\n\t\t\t\tif (target === minBubbleInputEl || target === minRangeInputEl)\r\n\t\t\t\t{\r\n\t\t\t\t\ttarget.value = currentMinValue;\r\n\t\t\t\t} else if (target === maxBubbleInputEl || target === maxRangeInputEl) {\r\n\t\t\t\t\ttarget.value = currentMaxValue;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// Move the handles\r\n\t\t\t\tlet value: number;\r\n\r\n\t\t\t\tconst fixWrongValue = (value: number, correctionValue: number) => {\r\n\t\t\t\t\tif (value !== 0 && !value) {\r\n\t\t\t\t\t\tvalue = correctionValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tconst targetValue = parseInt(target.value);\r\n\t\t\t\tconst minRangeInputElValue = parseInt(minRangeInputEl.value);\r\n\t\t\t\tconst minRangeInputElMinValue = parseInt(minRangeInputEl.min);\r\n\t\t\t\tconst maxRangeInputElValue = parseInt(maxRangeInputEl.value);\r\n\t\t\t\tconst maxRangeInputElMaxValue = parseInt(maxRangeInputEl.max);\r\n\t\t\t\tif (target === minBubbleInputEl || target === minRangeInputEl) {\r\n\t\t\t\t\tvalue = targetValue < minRangeInputElMinValue ? minRangeInputElMinValue : targetValue;\r\n\t\t\t\t\tvalue = fixWrongValue(value, minRangeInputElValue);\r\n\t\t\t\t\tvalue = value > maxRangeInputElValue ? maxRangeInputElValue : value;\r\n\t\t\t\t\tsetMinValue(value);\r\n\t\t\t\t\tmoveToTop(minRangeInputEl);\r\n\t\t\t\t} else if (target === maxBubbleInputEl || target === maxRangeInputEl) {\r\n\t\t\t\t\tvalue = targetValue > maxRangeInputElMaxValue ? maxRangeInputElMaxValue : targetValue;\r\n\t\t\t\t\tvalue = fixWrongValue(value, maxRangeInputElValue);\r\n\t\t\t\t\tvalue = value < minRangeInputElValue ? minRangeInputElValue: value;\r\n\t\t\t\t\tsetMaxValue(value);\r\n\t\t\t\t\tmoveToTop(maxRangeInputEl);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (minBubbleInputEl) {\r\n\t\t\tdisposableEvents.add(expressEventListener(minBubbleInputEl, 'input', debounce(onInput, inputDebounceValue)));\r\n\t\t\tdisposableEvents.add(expressEventListener(minBubbleInputEl, 'focusout', onBubbleInputElConfirm));\r\n\t\t\tdisposableEvents.add(expressEventListener(minBubbleInputEl, 'keydown', debounce(onBubbleInputElConfirm, inputDebounceValue)));\r\n\t\t}\r\n\r\n\t\tif (maxBubbleInputEl) {\r\n\t\t\tdisposableEvents.add(expressEventListener(maxBubbleInputEl, 'input', debounce(onInput, inputDebounceValue)));\r\n\t\t\tdisposableEvents.add(expressEventListener(maxBubbleInputEl, 'focusout', onBubbleInputElConfirm));\r\n\t\t\tdisposableEvents.add(expressEventListener(maxBubbleInputEl, 'keydown', debounce(onBubbleInputElConfirm, inputDebounceValue)));\r\n\t\t}\r\n\r\n\t\tdisposableEvents.add(expressEventListener(minRangeInputEl, 'input', onInput));\r\n\t\tdisposableEvents.add(expressEventListener(minRangeInputEl, 'change', performFiltering));\r\n\t\tdisposableEvents.add(expressEventListener(minRangeInputEl, 'mousedown', () => { moveToTop(minRangeInputEl); }));\r\n\r\n\t\tdisposableEvents.add(expressEventListener(maxRangeInputEl, 'input', onInput));\r\n\t\tdisposableEvents.add(expressEventListener(maxRangeInputEl, 'mousedown', () => { moveToTop(maxRangeInputEl); }));\r\n\t\tdisposableEvents.add(expressEventListener(maxRangeInputEl, 'change', performFiltering));\r\n\t};\r\n\r\n\tconst toggleSlider = (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 = maxRangeInputEl.max;\r\n\t\t\t\tconst min = minRangeInputEl.min;\r\n\t\t\t\tsetValues(parseInt(min), parseInt(max));\r\n\t\t\t\taddTextToFilterContainer && addTextToFilterContainer(filtersContainerEl, TypeOfFilter.Slider, selectedFiltersContainerEl, filterCategory, min + \" - \" + max, removeRangeFilter);\r\n\t\t\t\tfilterEl.classList.remove(\"u-hide\");\r\n\t\t\t\ttriggerFilter(true);\r\n\t\t\t} else {\r\n\t\t\t\taddTextToFilterContainer && addTextToFilterContainer(filtersContainerEl, TypeOfFilter.Slider, selectedFiltersContainerEl, filterCategory, \"0\", removeRangeFilter);\r\n\t\t\t\tfilterEl.classList.add(\"u-hide\");\r\n\t\t\t\ttriggerFilter(true);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tif (selectedFiltersContainerEl && attachRemoveFilterEvent)\r\n\t\tattachRemoveFilterEvent(selectedFiltersContainerEl, filterCategory, removeRangeFilter);\r\n\r\n\tshowSliderEls.forEach(el => expressEventListener(el, 'click', () => {\r\n\t\ttoggleSlider(el);\r\n\t\tupdateParametersForUrl && updateParametersForUrl(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\t// We need to validate the querystring value and perform some corrections\r\n\t\tlet min: string;\r\n\t\tlet max: string;\r\n\t\tlet querystringCorrected = false;\r\n\t\tif (values[0] && onlyNumber(values[0]) && !isNaN(parseInt(values[0])))\r\n\t\t{\r\n\t\t\tmin = values[0];\r\n\t\t} else {\r\n\t\t\tmin = minRangeInputEl.min;\r\n\t\t\tquerystringCorrected = true;\r\n\t\t}\r\n\t\tif (values[1] && onlyNumber(values[1]) && !isNaN(parseInt(values[0])))\r\n\t\t{\r\n\t\t\tmax = values[1];\r\n\t\t} else {\r\n\t\t\tmax = maxRangeInputEl.max;\r\n\t\t\tquerystringCorrected = true;\r\n\t\t}\r\n\t\tif (min > max) { min = max; querystringCorrected = true; }\r\n\t\tif (max < min) { max = min; querystringCorrected = true; }\r\n\r\n\t\tif (selectedOption[0] != 'none' && 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\tsetValues(parseInt(min), parseInt(max));\r\n\r\n\t\tif (min == max && (max == minRangeInputEl.min || min == maxRangeInputEl.max)) {\r\n\t\t\tconst sliderCompletelyOnMax = min == maxRangeInputEl.max;\r\n\t\t\tif (sliderCompletelyOnMax)\r\n\t\t\t\tmoveToTop(minRangeInputEl);\r\n\t\t\telse\r\n\t\t\t\tmoveToTop(maxRangeInputEl);\r\n\t\t}\r\n\t\tconst isNoneSelected = isNoneInputSelected();\r\n\t\tperformFiltering(querystringCorrected);\r\n\t\ttriggerFilter(!isNoneSelected && (originalMaxValue !== max || originalMinValue !== min), isNoneSelected ? '0' : null);\r\n\t\ttoggleResetFilters && toggleResetFilters(filtersContainerEl, false);\r\n\t\tcollapsableComponent.open();\r\n\t}\r\n\r\n\t// Correct the bubble values if they are visible and haven't got a value\r\n\tif (minBubbleInputEl && !minBubbleInputEl.value || maxBubbleInputEl && !maxBubbleInputEl.value) {\r\n\t\tif (minBubbleInputEl && !minBubbleInputEl.value) minBubbleInputEl.value = currentMinValue;\r\n\t\tif (maxBubbleInputEl && !maxBubbleInputEl.value) maxBubbleInputEl.value = currentMaxValue;\r\n\t}\r\n\r\n\taddHandlers();\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\tdispose: () => disposableEvents.dispose()\r\n\t} as IRangeFilter;\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\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 filterKeys.every(k => {\r\n\t\t\t\t\t\t\t\tconst filterCategoryToCheck = ownCategory == k\r\n\t\t\t\t\t\t\t\t\t? [ownValue]\r\n\t\t\t\t\t\t\t\t\t: filtersToCheck[k];\r\n\r\n\t\t\t\t\t\t\t\tif (!filterCategoryToCheck.length)\r\n\t\t\t\t\t\t\t\t\treturn true;\r\n\r\n\t\t\t\t\t\t\t\tconst categoryWithoutSuffix = k && k.split('[')[0];\r\n\t\t\t\t\t\t\t\tswitch (categoryWithoutSuffix) {\r\n\t\t\t\t\t\t\t\t\tcase 'Pr': {\r\n\t\t\t\t\t\t\t\t\t\tconst selectedOption = filterCategoryToCheck[0]?.split('_') ?? [];\r\n\t\t\t\t\t\t\t\t\t\tconst price = (selectedOption[1] || filterCategoryToCheck[0])?.split('-');\r\n\t\t\t\t\t\t\t\t\t\tif (!price) return true;\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst min = +price[0];\r\n\t\t\t\t\t\t\t\t\t\tconst max = +price[1];\r\n\t\t\t\t\t\t\t\t\t\tswitch (selectedOption[0]?.toLowerCase()) {\r\n\t\t\t\t\t\t\t\t\t\t\tcase 'unit': {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst tileUnitPrice = +tile.dataset.sortUnitPrice;\r\n\t\t\t\t\t\t\t\t\t\t\t\treturn tileUnitPrice >= min && tileUnitPrice <= max;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tcase 'set':\r\n\t\t\t\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\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\t\t\t\tconst tileHighPrice = +tile.dataset.priceHigh;\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn (tileLowPrice >= min && tileLowPrice <= max)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t|| (tileHighPrice >= min && tileHighPrice <= max)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t|| ((min - tileLowPrice) > 0 && (tileHighPrice - max) > 0);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tcase 'Re': {\r\n\t\t\t\t\t\t\t\t\t\tconst tileReviewRating = + tile.dataset.reviewrating;\r\n\t\t\t\t\t\t\t\t\t\treturn filterCategoryToCheck.some(x => +x <= tileReviewRating);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tdefault: {\r\n\t\t\t\t\t\t\t\t\t\tconst tagIds = tile.dataset.tagid.split('|');\r\n\t\t\t\t\t\t\t\t\t\treturn filterCategoryToCheck.some(x => tagIds.includes(x));\r\n\t\t\t\t\t\t\t\t\t}\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}).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 {disableUserEvents, expressQuerySelector, expressToggleClass} from \"../common/html\";\r\nimport {IDisposable} from \"../utils/disposable\";\r\n\r\nexport function showLoadingDialog(promise: Promise, timeToShowLoadingDialog = 200, extraTimeOutAfterResolving?: number, timeoutToDisableLoadingDialog?: number): Promise {\r\n\tconst htmlEl = expressQuerySelector(document, \"html\", true);\r\n\tconst bodyEl = expressQuerySelector(document, \"body\", true);\r\n\tconst dialogEl = expressQuerySelector(bodyEl, \".technical-loading-dialog\", true);\r\n\tlet disposable: IDisposable;\r\n\thtmlEl.style.top = -(document.documentElement.scrollTop) + 'px';\r\n\tbodyEl.style.top = -(document.documentElement.scrollTop) + 'px';\r\n\r\n\tconst toggleClasses = (show: boolean) => {\r\n\t\texpressToggleClass(dialogEl, \"u-hide\", !show);\r\n\t};\r\n\r\n\tconst show = setTimeout(() => toggleClasses(true), timeToShowLoadingDialog);\r\n\tconst blockingEventDisposables = disableUserEvents();\r\n\tlet manualTimeoutToDisableLoadingDialog;\r\n\tconst disableLoadingDialog = () => {\r\n\t\tclearTimeout(show);\r\n\t\tif (manualTimeoutToDisableLoadingDialog)\r\n\t\t\tclearInterval(manualTimeoutToDisableLoadingDialog);\r\n\t\tblockingEventDisposables.dispose();\r\n\t\thtmlEl.style.top = '';\r\n\t\tbodyEl.style.top = '';\r\n\t\ttoggleClasses(false);\r\n\t\tif (disposable) disposable.dispose();\r\n\t};\r\n\r\n\tif (timeoutToDisableLoadingDialog)\r\n\t\tmanualTimeoutToDisableLoadingDialog = setInterval(() => disableLoadingDialog(), timeoutToDisableLoadingDialog);\r\n\r\n\treturn promise.finally(() => {\r\n\t\tif (extraTimeOutAfterResolving) {\r\n\t\t\tsetTimeout(() => disableLoadingDialog(), extraTimeOutAfterResolving);\r\n\t\t}\r\n\t\telse\r\n\t\t\tdisableLoadingDialog();\r\n\t});\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressRemoveClass,\r\n\thasClass\r\n} from \"../common/html\";\r\nimport {compositeDisposable} from \"../utils/disposable\";\r\nimport {onlyNumber} from \"../utils/validation\";\r\n\r\nexport interface IAmountOptions {\r\n\treadonly onSubtractClick?: (amount: number) => void;\r\n\treadonly onAddClick?: (amount: number) => void;\r\n\treadonly onManualInput?: (amount: number) => void;\r\n}\r\n\r\nexport interface IAmount {\r\n\treadonly dispose: () => void;\r\n\treadonly getCurrentValue: () => string;\r\n\treadonly getCode: () => string;\r\n\treadonly setValue: (value: number) => void;\r\n\treadonly minAmount: number;\r\n\treadonly maxAmount: number;\r\n}\r\n\r\nexport function createAmount(container: HTMLElement, opts: IAmountOptions)\r\n{\r\n\tconst subtractEl = expressQuerySelector(container, '.technical-subtract', true);\r\n\tconst addEl = expressQuerySelector(container, '.technical-add', true);\r\n\tconst amountValueEl = expressQuerySelector(container, '.technical-amountvalue', true);\r\n\tconst minAmountFormAttribute = parseInt(amountValueEl.dataset.minamount || \"1\", 10);\r\n\tconst minAmount = !minAmountFormAttribute && minAmountFormAttribute != 0 ? 1 : minAmountFormAttribute;\r\n\tconst maxAmount = parseInt(amountValueEl.dataset.maxamount || \"999\", 10) || 999;\r\n\tlet currentValue = amountValueEl.value;\r\n\tconst regex = new RegExp(\"[^0-9]\", 'g');\r\n\r\n\tconst {\r\n\t\tonSubtractClick,\r\n\t\tonAddClick,\r\n\t\tonManualInput\r\n\t} = opts;\r\n\r\n\tconst onSubtractClickEvent = (ev: MouseEvent) => {\r\n\t\tev.preventDefault();\r\n\t\tconst currentAmount = parseInt(amountValueEl.value, 10) - 1;\r\n\t\tif (hasClass(subtractEl, 'a-button--disabled') ||isNaN(currentAmount) || currentAmount < minAmount) return;\r\n\r\n\t\tcurrentValue = currentAmount+'';\r\n\t\tamountValueEl.value = currentAmount+'';\r\n\t\tonSubtractClick && onSubtractClick(currentAmount);\r\n\t\tupdateDisabledButtons(currentAmount);\r\n\t};\r\n\r\n\tconst onAddClickEvent = (ev: MouseEvent) => {\r\n\t\tev.preventDefault();\r\n\t\tconst currentAmount = parseInt(amountValueEl.value, 10) + 1;\r\n\t\tif (hasClass(addEl, 'a-button--disabled') || isNaN(currentAmount) || currentAmount >maxAmount) return;\r\n\r\n\t\tcurrentValue = currentAmount+'';\r\n\t\tamountValueEl.value = currentAmount+'';\r\n\t\tonAddClick && onAddClick(currentAmount);\r\n\t\tupdateDisabledButtons(currentAmount);\r\n\t};\r\n\r\n\tconst updateDisabledButtons = (amount: number) => {\r\n\t\tif (amount < maxAmount)\r\n\t\t\texpressRemoveClass(addEl, 'a-button--disabled');\r\n\t\telse\r\n\t\t\texpressAddClass(addEl, 'a-button--disabled');\r\n\r\n\t\tif (amount > minAmount)\r\n\t\t\texpressRemoveClass(subtractEl, 'a-button--disabled');\r\n\t\telse\r\n\t\t\texpressAddClass(subtractEl, 'a-button--disabled');\r\n\t};\r\n\r\n\tconst onInput = () => {\r\n\t\tif (!onlyNumber(amountValueEl.value)) {\r\n\t\t\tamountValueEl.value = '';\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst inputValue = parseInt(amountValueEl.value, 10);\r\n\t\tif (isNaN(inputValue) || inputValue < minAmount || inputValue > maxAmount) {\r\n\t\t\tamountValueEl.value = '';\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcurrentValue = inputValue+'';\r\n\t\tupdateDisabledButtons(inputValue);\r\n\t\tif (onManualInput) onManualInput(inputValue);\r\n\t};\r\n\r\n\tconst onFocusOut = () => {\r\n\t\tconst currentAmount = parseInt(amountValueEl.value, 10);\r\n\t\tif (amountValueEl.value.match(regex) || isNaN(currentAmount) || currentAmount > maxAmount || currentAmount < minAmount) {\r\n\t\t\tamountValueEl.value = currentValue;\r\n\t\t}\r\n\t};\r\n\r\n\tconst disposable = compositeDisposable([\r\n\t\texpressEventListener(addEl, 'click', onAddClickEvent),\r\n\t\texpressEventListener(subtractEl, 'click', onSubtractClickEvent),\r\n\t\texpressEventListener(amountValueEl, 'input', onInput),\r\n\t\texpressEventListener(amountValueEl, 'focusout', onFocusOut)\r\n\t]);\r\n\r\n\tconst getCurrentValue = () => {\r\n\t\treturn amountValueEl.value;\r\n\t};\r\n\r\n\tconst getCode = () => {\r\n\t\treturn amountValueEl.dataset.attributecode || '';\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose: () => disposable.dispose(),\r\n\t\tgetCurrentValue,\r\n\t\tgetCode,\r\n\t\tsetValue: (value: number) => { amountValueEl.value = `${value}`; updateDisabledButtons(value); },\r\n\t\tminAmount,\r\n\t\tmaxAmount\r\n\t} as IAmount;\r\n}\r\n","import {getHtmlRequest, postRequest} from \"../utils/fetch\";\r\nimport {objectToQueryString} from \"../utils/querystring\";\r\nimport {ITabContentRequest} from \"../components/tab\";\r\nimport {ICollapsibleContentRequest} from \"../components/collapsable\";\r\n\r\nconst basePath = \"/apicore/contentapi/\";\r\nconst showLabels = false;\r\nconst labels: StringKeyValuePair[] = [];\r\nconst icons: StringKeyValuePair[] = [];\r\n\r\nexport interface IKeyValueValuePair {\r\n\tkey: TKey;\r\n\tvalue: TValue;\r\n}\r\n\r\nexport type StringKeyValuePair = IKeyValueValuePair;\r\n\r\nexport interface IBaseContentRequest {\r\n\tlanguage: string;\r\n\tpointOfSaleId: string;\r\n}\r\n\r\nexport interface IBaseStepContentRequest extends IBaseContentRequest {\r\n\tpreselectedOccasion?: string;\r\n\tproductCategory: string;\r\n\tselectedAttributeValueMa: string[];\r\n\tstepIndex: number;\r\n\toptionGroup?: string;\r\n\ttargetDeliveryDate?: string;\r\n\tpurpose?: string;\r\n\toccasion?: string;\r\n\ttheme?: string;\r\n}\r\n\r\nexport interface IProductCategoryReviewsResult {\r\n\treadonly productCategoryReviews: IProductCategoryReview[];\r\n\treadonly totalAmountOfReviews: number;\r\n\treadonly starAmounts: { key: number, value: number }[];\r\n}\r\n\r\nexport interface IContentRequest extends IBaseContentRequest{\r\n\tcontentKeys: string[];\r\n}\r\n\r\nexport interface IIconsRequest {\r\n\tcontentKeys: string[];\r\n}\r\n\r\nexport interface IProductCategoryReview {\r\n\treadonly score: number;\r\n\treadonly reviewDate: string;\r\n\treadonly formattedReviewDate: string;\r\n\treadonly reviewerFirstname: string;\r\n\treadonly reviewerLastname: string;\r\n\treadonly comment: string;\r\n\treadonly feedback: string;\r\n\treadonly feedbackDate: string;\r\n\treadonly formattedFeedbackDate: string;\r\n\treadonly reviewLanguageIso: string;\r\n\treadonly trustPilotDesignClass?: string;\r\n}\r\n\r\nexport interface IProductCategoryReviewsRequest extends IBaseContentRequest {\r\n\tproductCategoryId: string;\r\n\tpage: number;\r\n\tstars?: number,\r\n\treviewLanguage?: string;\r\n\ttheme?: string\r\n}\r\n\r\nexport function getCollapsibleContent(request: ICollapsibleContentRequest): Promise {\r\n\treturn getHtmlRequest(\r\n\t\tbasePath + \"getcollapsiblecontent\" + objectToQueryString(request),\r\n\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t.then(res => {\r\n\t\t\treturn res;\r\n\t\t}) as Promise;\r\n}\r\n\r\nexport function getLabelsAsync(keys: (string | undefined)[]) : Promise{\r\n\tconst missingKeys: string[] = [];\r\n\tconst result: StringKeyValuePair[] = [];\r\n\tkeys.forEach((key) => {\r\n\t\tif (!key)\r\n\t\t\treturn;\r\n\r\n\t\tconst label = getLabelByKey(key);\r\n\t\tif (label === null)\r\n\t\t\tmissingKeys.push(key);\r\n\t\telse\r\n\t\t\tresult.push({ key: key, value: label });\r\n\t});\r\n\r\n\tif (missingKeys.length > 0) {\r\n\t\treturn postRequest(\r\n\t\t\tbasePath + \"getcontentlist\",\r\n\t\t\t{\r\n\t\t\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\t\t\tlanguage: window.context.language,\r\n\t\t\t\tcontentKeys: missingKeys || []\r\n\t\t\t},\r\n\t\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t\t.then(res => {\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\taddLabels(...res);\r\n\t\t\t\t\treturn Promise.resolve(result.concat(res));\r\n\t\t\t\t}\r\n\t\t\t\treturn Promise.resolve(result);\r\n\t\t\t}) as Promise;\r\n\t}\r\n\r\n\treturn Promise.resolve(result);\r\n}\r\n\r\nexport function getIconsAsync(keys: (string | undefined)[]) : Promise{\r\n\tconst missingKeys: string[] = [];\r\n\tconst result: StringKeyValuePair[] = [];\r\n\tkeys.forEach((key) => {\r\n\t\tif (!key)\r\n\t\t\treturn;\r\n\r\n\t\tconst icon = getIconByKey(key);\r\n\t\tif (icon === null)\r\n\t\t\tmissingKeys.push(key);\r\n\t\telse\r\n\t\t\tresult.push({ key: key, value: icon });\r\n\t});\r\n\r\n\tif (missingKeys.length > 0) {\r\n\t\treturn postRequest(\r\n\t\t\tbasePath + \"GetIconsByName\",\r\n\t\t\t{\r\n\t\t\t\tcontentKeys: missingKeys || []\r\n\t\t\t},\r\n\t\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t\t.then(res => {\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\taddIcons(...res);\r\n\t\t\t\t\treturn Promise.resolve(result.concat(res));\r\n\t\t\t\t}\r\n\t\t\t\treturn Promise.resolve(result);\r\n\t\t\t}) as Promise;\r\n\t}\r\n\r\n\treturn Promise.resolve(result);\r\n}\r\nexport function getLabel(key: string, defaultContent = \"\"): string {\r\n\tif (showLabels)\r\n\t\tdefaultContent = formatLabel(key, defaultContent);\r\n\r\n\tif (labels.length === 0)\r\n\t\treturn defaultContent;\r\n\r\n\treturn getLabelByKey(key) || defaultContent;\r\n}\r\n\r\nexport function getIcon(key: string, defaultContent = \"\"): string {\r\n\treturn getIconByKey(key) || defaultContent;\r\n}\r\n\r\nexport function getTabContent(request: ITabContentRequest): Promise {\r\n\treturn getHtmlRequest(\r\n\t\tbasePath + \"gettabcontent\" + objectToQueryString(request),\r\n\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t.then(res => {\r\n\t\t\treturn res;\r\n\t\t}) as Promise;\r\n}\r\n\r\nconst getLabelByKey = (key: string) => {\r\n\tconst filtered = labels\r\n\t\t.filter(keyVal => keyVal.key.toLowerCase() === key.toLowerCase())\r\n\t\t.map(p => p.value);\r\n\r\n\tif (filtered.length === 0)\r\n\t\treturn null;\r\n\r\n\treturn filtered[0];\r\n};\r\n\r\nconst getIconByKey = (key: string) => {\r\n\tconst filtered = icons\r\n\t\t.filter(keyVal => keyVal.key.toLowerCase() === key.toLowerCase())\r\n\t\t.map(p => p.value);\r\n\r\n\tif (filtered.length === 0)\r\n\t\treturn null;\r\n\r\n\treturn filtered[0];\r\n};\r\n\r\nconst addLabels = (...labelsToAdd: StringKeyValuePair[]) => {\r\n\tlabelsToAdd.forEach((label) => {\r\n\t\tif (!containsKey(label.key, labels)) {\r\n\t\t\tlabels.push({ key: label.key, value: formatLabel(label.key, label.value) });\r\n\t\t}\r\n\t});\r\n};\r\n\r\nconst addIcons = (...iconsToAdd: StringKeyValuePair[]) => {\r\n\ticonsToAdd.forEach((icon) => {\r\n\t\tif (!containsKey(icon.key, icons)) {\r\n\t\t\ticons.push({ key: icon.key, value: icon.value });\r\n\t\t}\r\n\t});\r\n};\r\n\r\nconst containsKey = (key: string, source: StringKeyValuePair[]): boolean => {\r\n\treturn source.filter(keyVal => keyVal.key === key).length > 0;\r\n};\r\n\r\nconst formatLabel = (key: string, value: string): string => {\r\n\tvalue = value || \"\";\r\n\treturn showLabels ? `[${key}]${value}` : value;\r\n};\r\n\r\n\r\n","import {postRequest} from \"../utils/fetch\";\r\n\r\nconst basePath = \"/api/v1/OrderService.svc/json/\";\r\nexport interface IBaseOrderRequest {\r\n\tlanguage: string;\r\n\tpointOfSaleId: string;\r\n}\r\n\r\nexport interface IPriceRequest extends IBaseOrderRequest {\r\n\tpvc: string;\r\n\tquantity: number;\r\n\tvariableAmount: number;\r\n\toptions: string[];\r\n\tpromoCode: string | undefined;\r\n\tforceQuantityBreak: number;\r\n}\r\n\r\nexport interface ICurrency {\r\n\tCurrencyCode: string;\r\n\tCurrencySymbol: string;\r\n\tDisplayLeftToPrice: boolean;\r\n\tDecimalSeparator: string;\r\n}\r\n\r\nexport interface IPrice {\r\n\tCurrency: ICurrency;\r\n\tAmount: number;\r\n}\r\n\r\nexport interface IProductPriceDetails {\r\n\tPrice: IPrice;\r\n\tPriceItems: IPriceItem[];\r\n}\r\n\r\nexport interface IPriceItem {\r\n\tDescription: string;\r\n\tCalculationDescription: string;\r\n\tItemTotal: string;\r\n\tType: string;\r\n}\r\n\r\nexport function getPrice (\r\n\tpvc: string,\r\n\tquantity: number,\r\n\tvariableAmount = 0,\r\n\toptions: string[] = [],\r\n\tpromoCode: string | undefined = undefined,\r\n\tforceQuantityBreak = -1): Promise {\r\n\tconst request: IPriceRequest = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tlanguage: window.context.language,\r\n\t\tpvc,\r\n\t\tquantity,\r\n\t\tvariableAmount,\r\n\t\toptions,\r\n\t\tpromoCode: promoCode === undefined ? '' : promoCode,\r\n\t\tforceQuantityBreak\r\n\t};\r\n\treturn postRequest(\r\n\t\tbasePath + \"GetPrice\",\r\n\t\trequest,\r\n\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t.then(res => {\r\n\t\t\treturn res.GetPriceResult;\r\n\t\t}) as Promise;\r\n}\r\n","import {IPrice} from \"../services/order-service\";\r\n\r\nexport function formatPrice (price: IPrice) {\r\n\tlet formattedPrice = '';\r\n\r\n\tconst replaceDecimalSeparatorInPrice = (amount: number, decimalSeparator: string) => {\r\n\t\treturn amount.toFixed(2).replace('.', decimalSeparator);\r\n\t};\r\n\r\n\tif (window.context.removeCurrencySymbolFormUpperFunnelPages === \"true\") {\r\n\t\tformattedPrice += replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator);\r\n\t} else {\r\n\t\tif (price.Currency.DisplayLeftToPrice)\r\n\t\t\tformattedPrice += price.Currency.CurrencySymbol + ' ' + replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator);\r\n\t\telse\r\n\t\t\tformattedPrice += replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator) + ' ' + price.Currency.CurrencySymbol;\r\n\t}\r\n\r\n\treturn formattedPrice;\r\n}\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 {\r\n\tcreateCustomSlider,\r\n\tICustomPhotoSliderItem,\r\n\tICustomPhotoSliderWithDivSettings,\r\n\tICustomSlider,\r\n} from \"../components/customslider\";\r\nimport { expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { initVideoPlayer } from \"../components/video-player\";\r\nimport { getParameter, updateParameter } from \"../utils/querystring\";\r\n\r\nexport enum CarrouselItemType {\r\n\tFormatImage = 0,\r\n\tPackShot = 1\r\n}\r\n\r\nexport interface ICarrousel {\r\n\treadonly reInit: () => void;\r\n\treadonly reStart: () => void;\r\n\treadonly resize: () => void;\r\n\treadonly addAndSelectElement: (imgSrc: string) => boolean;\r\n\treadonly removeFirstElementAndSelect: (itemType: CarrouselItemType) => void;\r\n\treadonly getCurrentElement: (sliderIndex: number) => ICustomPhotoSliderItem;\r\n\treadonly getAllElements: (sliderIndex: number) => ICustomPhotoSliderItem[];\r\n\treadonly removeSliderElement: (sliderIndex: number, visiblePhotoEl: ICustomPhotoSliderItem) => void;\r\n\treadonly goToSlide: (currentSlide: ICustomPhotoSliderItem) => void;\r\n\treadonly dispose: () => void;\r\n}\r\nexport interface ICarrouselOptions {\r\n\treadonly initFormatImage?: (sliderElement: any) => void;\r\n\treadonly enableKeyboardNavigation?: boolean;\r\n}\r\n\r\nenum SideButtonOption {\r\n\tPrev,\r\n\tNext\r\n}\r\n\r\nexport function createCarrousel(containerEl: HTMLElement, opts?: ICarrouselOptions) {\r\n\tconst sliderComponents: ICustomSlider[] = [];\r\n\tlet currentlySelectedEl: Element;\r\n\tconst VIDEO_EXTENSIONS = ['mp4', 'webm'];\r\n\tlet youtubePlayer: {\r\n\t\tdispose: () => void,\r\n\t\tplayPauseYoutubeVideo: (action: \"play\" | \"pause\") => void,\r\n\t\tshowOverlay: () => void,\r\n\t\tisOverlayVisible: () => boolean | null\r\n\t} | undefined;\r\n\r\n\tconst GetHtmlElementWidthWithMargins = (element: HTMLElement): 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, // use this instead of client width to handle the rounding of the elements => worse case 1 px of the image is not shown\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\t\treturn (width + (margin ? margin : 0) + (padding ? padding : 0));\r\n\t};\r\n\r\n\tconst resizeSliderElements = (settings: ICustomPhotoSliderWithDivSettings, sliderWidth: number, slider: HTMLElement, sliderChildren?: HTMLElement[]) => {\r\n\t\tif (sliderWidth <= 0 || (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-preview-container') === -1)) return;\r\n\r\n\t\t// set all slider elements to the width of there slide element so only 1 slide is visible at a time\r\n\t\tconst slidesInSlider = sliderChildren ? sliderChildren : expressQuerySelectorAll(slider, '.technical-slider-element');\r\n\t\tfor (let i = 0; i < slidesInSlider.length; i++) {\r\n\t\t\tconst slide = slidesInSlider[i];\r\n\t\t\tslide.style.minWidth = sliderWidth + 'px';\r\n\t\t\tslide.style.width = sliderWidth + 'px';\r\n\t\t\tslide.style.maxWidth = sliderWidth + 'px';\r\n\t\t}\r\n\r\n\t\t// block iframe too on width\r\n\t\tconst iframesInSlider = expressQuerySelectorAll(slider, 'iframe');\r\n\t\tconst sliderWidthForIframe = sliderWidth - 1; // iframe always .2 or more => 1 more px on page\r\n\t\tfor (let z = 0; z < iframesInSlider.length; z++) {\r\n\t\t\tconst iframe = iframesInSlider[z];\r\n\t\t\tiframe.width = sliderWidthForIframe.toString();\r\n\t\t\tiframe.style.minWidth = sliderWidthForIframe + 'px';\r\n\t\t\tiframe.style.width = sliderWidthForIframe + 'px';\r\n\t\t\tiframe.style.maxWidth = sliderWidthForIframe + 'px';\r\n\t\t}\r\n\t};\r\n\r\n\tconst playPauseVideo = () => {\r\n\t\tif (!youtubePlayer || youtubePlayer.isOverlayVisible()) return;\r\n\t\tyoutubePlayer.playPauseYoutubeVideo('pause');\r\n\t};\r\n\r\n\tconst isElementVisibleInContainer = (element, container) => {\r\n\t\tconst rect = element.getBoundingClientRect();\r\n\t\tconst containerRect = container.getBoundingClientRect();\r\n\t\treturn rect.left >= containerRect.left && rect.right <= containerRect.right;\r\n\t};\r\n\r\n\tconst onSideButtonClicked = (e: Event, eyeCatcher: Element[], option: SideButtonOption) => {\r\n\t\tplayPauseVideo();\r\n\t\teyeCatcher.forEach(x => x.classList.toggle('u-hide', (youtubePlayer && !youtubePlayer.isOverlayVisible()) || false));\r\n\t\tconst target = e.currentTarget as HTMLElement;\r\n\t\tif (!target || !target.classList || target.classList.contains('technical-thumb-container') || target.parentElement.classList.contains('technical-thumb-container')) return;\r\n\r\n\t\tupdateImageCount(sliderComponents[0], eyeCatcher);\r\n\r\n\t\tif (currentlySelectedEl) {\r\n\t\t\tconst element = option === SideButtonOption.Prev\r\n\t\t\t\t? currentlySelectedEl.previousElementSibling || currentlySelectedEl.parentElement.lastElementChild\r\n\t\t\t\t: currentlySelectedEl.nextElementSibling || currentlySelectedEl.parentElement.firstElementChild;\r\n\t\t\tif (element) {\r\n\t\t\t\tchangeSelectedElement(element);\r\n\t\t\t\tconst bottomSlider = sliderComponents[1];\r\n\t\t\t\tif (bottomSlider) {\r\n\t\t\t\t\tconst isFullyVisible = isElementVisibleInContainer(element, bottomSlider.GetSliderElement());\r\n\t\t\t\t\tif (isFullyVisible) return;\r\n\t\t\t\t\tconst sliderElement = bottomSlider.Settings.sliderElements.find(x => x.id === element.id);\r\n\t\t\t\t\tbottomSlider.JumpIntoView(sliderElement, undefined, option === SideButtonOption.Prev ? 'start' : 'end');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateImageCount = (sliderComponent: ICustomSlider, eyeCatcher?: Element[]) => {\r\n\t\tif (!sliderComponent) return;\r\n\r\n\t\tconst imageCountEl = (eyeCatcher || expressQuerySelectorAll(sliderComponent.GetSliderElement(), '.technical-carrousel-eyecatcher')).find(x => x.classList.contains('technical-image-eyecatcher'));\r\n\t\tif (!imageCountEl) return;\r\n\t\timageCountEl.innerHTML = `${sliderComponent.Settings.sliderElements.indexOf(sliderComponent.GetCurrentSlide()) + 1}/${sliderComponent.Settings.sliderElements.length}`;\r\n\t};\r\n\r\n\tconst changeSelectedElement = (newElement: Element) => {\r\n\t\tcurrentlySelectedEl?.classList.toggle('m-carrousel__thumb--active', false);\r\n\t\tnewElement.classList.toggle('m-carrousel__thumb--active', true);\r\n\t\tcurrentlySelectedEl = newElement;\r\n\t};\r\n\r\n\tconst init = () => {\r\n\t\tif (!sliderComponents || sliderComponents.length === 0) {\r\n\t\t\t// both sliders in m-carrousel\r\n\t\t\tconst sliders = expressQuerySelectorAll(containerEl, '.technical-slider');\r\n\r\n\t\t\tfor (let i = 0; i < sliders.length; i++) {\r\n\t\t\t\tconst sliderEl = sliders[i];\r\n\r\n\t\t\t\t// convert so slider elements\r\n\t\t\t\tconst sliderElements: ICustomPhotoSliderItem[] = [];\r\n\r\n\t\t\t\tfor (let z = 0, l = sliderEl.children.length; z < l; z++)\r\n\t\t\t\t\tsliderElements.push({ template: sliderEl.children[z] as HTMLElement });\r\n\r\n\t\t\t\t// settings for slider\r\n\t\t\t\tconst eyeCatcher = expressQuerySelectorAll(sliderEl.parentElement, '.technical-carrousel-eyecatcher');\r\n\t\t\t\tconst settings = {\r\n\t\t\t\t\tenableKeyboardNavigation: opts && opts.enableKeyboardNavigation,\r\n\t\t\t\t\tsliderElements: sliderElements,\r\n\t\t\t\t\tsliderContainerSettings: {\r\n\t\t\t\t\t\textraSliderClass: 'm-carrousel__slider ' + (i === 0 ? 'technical-preview-container ' : 'technical-thumb-container '),\r\n\t\t\t\t\t\telementsContainerSettings: {\r\n\t\t\t\t\t\t\textraSliderClass: 'm-carrousel__slider-elements',\r\n\t\t\t\t\t\t\tslideClicked: (e: Event, settings: ICustomPhotoSliderWithDivSettings) => {\r\n\t\t\t\t\t\t\t\t// play youtube video from first slider\r\n\t\t\t\t\t\t\t\tconst target = (e.target as HTMLElement).closest('.technical-slider-element') as HTMLElement;\r\n\t\t\t\t\t\t\t\tif (target && target.classList.contains('technical-video-container') && youtubePlayer && (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-preview-container') !== -1))\r\n\t\t\t\t\t\t\t\t\tyoutubePlayer.playPauseYoutubeVideo(youtubePlayer.isOverlayVisible() ? 'play' : 'pause');\r\n\t\t\t\t\t\t\t\telse if (youtubePlayer && !youtubePlayer.isOverlayVisible() && (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-thumb-container') !== -1))\r\n\t\t\t\t\t\t\t\t\tyoutubePlayer.playPauseYoutubeVideo('pause');\r\n\r\n\t\t\t\t\t\t\t\teyeCatcher.forEach(x => x.classList.toggle('u-hide', (youtubePlayer && !youtubePlayer.isOverlayVisible()) || false));\r\n\r\n\t\t\t\t\t\t\t\t// update sliders\r\n\t\t\t\t\t\t\t\tif (!e.target || (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-preview-container') >= 0)) return;\r\n\t\t\t\t\t\t\t\tlet clickedItemTemplate = ((e.target as HTMLElement).closest('.q-video-cover-overlay__button') || (e.target as HTMLElement).closest('img') || (e.target as HTMLElement).closest('picture') || (e.target as HTMLElement).closest('video')) as HTMLImageElement;\r\n\t\t\t\t\t\t\t\tif ((!clickedItemTemplate && (e.target as HTMLElement).classList.contains(\"m-carrousel__cover-container\"))\r\n\t\t\t\t\t\t\t\t\t|| (clickedItemTemplate && clickedItemTemplate.classList.contains(\"q-video-cover-overlay__button\"))) {\r\n\t\t\t\t\t\t\t\t\tconst el = (e.target as HTMLElement).closest('.technical-slider-element');\r\n\t\t\t\t\t\t\t\t\tconst imgs = (el.getElementsByTagName('img') || el.getElementsByTagName('picture') || el.getElementsByTagName('video')) as HTMLCollectionOf;\r\n\t\t\t\t\t\t\t\t\tif (imgs.length) clickedItemTemplate = imgs[0];\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (!clickedItemTemplate) return;\r\n\r\n\t\t\t\t\t\t\t\tconst clickedItemTemplateSrc = clickedItemTemplate instanceof HTMLVideoElement ? expressQuerySelector(clickedItemTemplate, 'source')?.src : clickedItemTemplate.src;\r\n\r\n\t\t\t\t\t\t\t\t// get all sliders of the page except own slider\r\n\t\t\t\t\t\t\t\tfor (let i = 0; i < sliderComponents.length; i++) {\r\n\t\t\t\t\t\t\t\t\tconst sliderComponent = sliderComponents[i];\r\n\t\t\t\t\t\t\t\t\tconst sliderEl = sliderComponent.GetSliderElement();\r\n\t\t\t\t\t\t\t\t\tconst sliderElement = sliderComponent.Settings.sliderElements.filter(x => {\r\n\t\t\t\t\t\t\t\t\t\tif (!x.template) return;\r\n\t\t\t\t\t\t\t\t\t\tconst sliderItemTemplate = expressQuerySelector(x.template, 'img')\r\n\t\t\t\t\t\t\t\t\t\t\t|| expressQuerySelector(x.template, 'iframe')\r\n\t\t\t\t\t\t\t\t\t\t\t|| expressQuerySelector(x.template, 'picture')\r\n\t\t\t\t\t\t\t\t\t\t\t|| expressQuerySelector(x.template, 'video > source');\r\n\t\t\t\t\t\t\t\t\t\treturn sliderItemTemplate instanceof HTMLIFrameElement\r\n\t\t\t\t\t\t\t\t\t\t\t? sliderItemTemplate && sliderItemTemplate.parentElement && sliderItemTemplate.parentElement.classList.contains('technical-video-container') && clickedItemTemplate.classList.contains('m-carrousel__thumb-video-img')\r\n\t\t\t\t\t\t\t\t\t\t\t: sliderItemTemplate && (sliderItemTemplate.dataset.src || sliderItemTemplate.src) === clickedItemTemplateSrc;\r\n\t\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\t\t// show eye catcher if the video is not playing\r\n\t\t\t\t\t\t\t\t\tconst sliderEyeCatchers = expressQuerySelectorAll(sliderEl, '.technical-carrousel-eyecatcher');\r\n\t\t\t\t\t\t\t\t\tsliderEyeCatchers.forEach(x => x.classList.toggle('u-hide', (youtubePlayer && !youtubePlayer.isOverlayVisible()) || false));\r\n\r\n\t\t\t\t\t\t\t\t\t// slider has not the same element\r\n\t\t\t\t\t\t\t\t\tif (sliderElement.length <= 0)\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t\t\tconst element = sliderElement[0];\r\n\r\n\t\t\t\t\t\t\t\t\tif (element.template.classList.contains('m-carrousel__thumb')) {\r\n\t\t\t\t\t\t\t\t\t\tconst clickedEl = expressQuerySelector(sliderEl, `#${element.id}`);\r\n\t\t\t\t\t\t\t\t\t\tchangeSelectedElement(clickedEl);\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// don't jump into view if thumbs are all shown already\r\n\t\t\t\t\t\t\t\t\tconst sliderButtonRight = expressQuerySelector(sliderEl, '.m-carrousel__button--right', true);\r\n\t\t\t\t\t\t\t\t\tconst sliderButtonLeft = expressQuerySelector(sliderEl, '.m-carrousel__button--left', true);\r\n\t\t\t\t\t\t\t\t\tif (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-thumb-container') !== -1\r\n\t\t\t\t\t\t\t\t\t\t&& sliderButtonRight.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax)\r\n\t\t\t\t\t\t\t\t\t\t&& sliderButtonLeft.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax))\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t\t\t// slider has the same element jump into view\r\n\t\t\t\t\t\t\t\t\tsliderComponent.JumpIntoView(element);\r\n\r\n\t\t\t\t\t\t\t\t\t// update image count\r\n\t\t\t\t\t\t\t\t\tupdateImageCount(sliderComponent, sliderEyeCatchers);\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\tnextButton: {\r\n\t\t\t\t\t\t\tcss: `a-button a-button--slider-button m-carrousel__button--right ${i === 0 ? 'm-carrousel__button--large' : ''} icon-arrow-right technical-slider-button ${sliderElements.length <= 1 ? 'u-hide' : ''}`,\r\n\t\t\t\t\t\t\tonClick: (e: Event) => {\r\n\t\t\t\t\t\t\t\tonSideButtonClicked(e, eyeCatcher, SideButtonOption.Next);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tpreviousButton: {\r\n\t\t\t\t\t\t\tcss: `a-button a-button--slider-button m-carrousel__button--left ${i === 0 ? 'm-carrousel__button--large' : ''} icon-arrow-left technical-slider-button ${sliderElements.length <= 1 ? 'u-hide' : ''}`,\r\n\t\t\t\t\t\t\tonClick: (e: Event) => {\r\n\t\t\t\t\t\t\t\tonSideButtonClicked(e, eyeCatcher, SideButtonOption.Prev);\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\ttranslateForMovement: i == 0,\r\n\t\t\t\t\tSliderCreated: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider: HTMLElement | undefined) => {\r\n\t\t\t\t\t\tconst sliderWidth = Math.ceil(GetHtmlElementWidthWithMargins(oldSlider ? oldSlider : sliderEl));\r\n\t\t\t\t\t\tresizeSliderElements(settings, sliderWidth, slider, expressQuerySelectorAll(slider, '.technical-slider-element'));\r\n\r\n\t\t\t\t\t\t// only for thumb slider\r\n\t\t\t\t\t\tif ((settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-thumb-container') !== -1)) {\r\n\t\t\t\t\t\t\t// add extra div for styling of the thumbs\r\n\t\t\t\t\t\t\tconst sliderElementsEl = expressQuerySelector(slider, '.technical-slider-elements', true);\r\n\t\t\t\t\t\t\tconst extraDivForStyling = document.createElement('div');\r\n\t\t\t\t\t\t\textraDivForStyling.classList.add('m-carrousel__slider-elements-container');\r\n\t\t\t\t\t\t\textraDivForStyling.appendChild(sliderElementsEl);\r\n\t\t\t\t\t\t\tslider.appendChild(extraDivForStyling);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// init video players\r\n\t\t\t\t\t\tconst videoPlayers = expressQuerySelectorAll(slider, '.technical-video-container');\r\n\t\t\t\t\t\tfor (let i = 0; i < videoPlayers.length; i++) {\r\n\t\t\t\t\t\t\tconst videoPlayerContainer = videoPlayers[i];\r\n\r\n\t\t\t\t\t\t\t// create video player\r\n\t\t\t\t\t\t\tyoutubePlayer = initVideoPlayer(videoPlayerContainer, false);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\tResizeEvent: (settings, slider) => {\r\n\t\t\t\t\t\tslider = sliderComponent.GetSliderElement();\r\n\t\t\t\t\t\t// get current slide to reset to that slide after resize\r\n\t\t\t\t\t\t// get the current selected from thumb => after resize the slides get other widths => calculation for the current selected slide could be wrong then\r\n\t\t\t\t\t\tconst currentSlide = i === 0 && sliderComponents.length > 1 && currentlySelectedEl\r\n\t\t\t\t\t\t\t? sliderComponents[0].Settings.sliderElements[sliderComponents[1].Settings.sliderElements.findIndex(x => x.id === currentlySelectedEl.id)]\r\n\t\t\t\t\t\t\t: sliderComponent.GetCurrentSlide();\r\n\t\t\t\t\t\tif (!currentSlide) return;\r\n\r\n\t\t\t\t\t\tconst sliderWidth = Math.ceil(GetHtmlElementWidthWithMargins(slider));\r\n\t\t\t\t\t\tresizeSliderElements(settings, sliderWidth, slider);\r\n\t\t\t\t\t\tsliderComponent.JumpIntoView(currentSlide, false);\r\n\t\t\t\t\t\tupdateImageCount(sliderComponent);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tInitializedEvent: (settings, slider: HTMLElement) => {\r\n\t\t\t\t\t\teyeCatcher.forEach(x => {\r\n\t\t\t\t\t\t\tslider.prepend(x);\r\n\t\t\t\t\t\t\tx.classList.remove('u-hide');\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tslider.classList.add(\"m-carrousel__slider--initialized\");\r\n\t\t\t\t\t\tif (settings && opts && opts.initFormatImage)\r\n\t\t\t\t\t\t\topts.initFormatImage(settings);\r\n\t\t\t\t\t}\r\n\t\t\t\t} as ICustomPhotoSliderWithDivSettings;\r\n\r\n\t\t\t\tconst sliderComponent = createCustomSlider(sliderEl, settings);\r\n\t\t\t\tsliderComponents.push(sliderComponent);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tsliderComponents.forEach(slider => slider.AddHandlers());\r\n\t\t}\r\n\r\n\t\tconst bottomSlider = sliderComponents[1];\r\n\t\tif (bottomSlider) {\r\n\t\t\tconst firstEl = bottomSlider.GetSliderElement() && expressQuerySelector(bottomSlider.GetSliderElement(), `#${bottomSlider.Settings.sliderElements[0].id}`);\r\n\t\t\tfirstEl && changeSelectedElement(firstEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst reStart = () => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tconst slideEls = slider.Settings.sliderElements;\r\n\t\t\tif (slideEls.length > 1) {\r\n\t\t\t\tif (slideEls[0]) {\r\n\t\t\t\t\tslider.JumpIntoView(slideEls[0], false);\r\n\t\t\t\t\tupdateImageCount(slider);\r\n\t\t\t\t}\r\n\t\t\t\tslider.ShowButtons();\r\n\t\t\t} else {\r\n\t\t\t\tslider.HideButtons();\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\tconst moveBottomSliderToSelectedItem = () => {\r\n\t\tconst topSlider = sliderComponents[0];\r\n\t\tconst bottomSlider = sliderComponents[1];\r\n\r\n\t\tif (!bottomSlider) return;\r\n\r\n\t\tconst topSliderSelectedItem = topSlider\r\n\t\t\t? topSlider.Settings.sliderElements.indexOf(topSlider.GetCurrentSlide())\r\n\t\t\t: -1;\r\n\r\n\t\t// top and bottom should have the same elements on the same index\r\n\t\tconst bottomSliderToSelectEl = bottomSlider.GetSliderElement && expressQuerySelector(bottomSlider.GetSliderElement(), `#${bottomSlider.Settings.sliderElements[topSliderSelectedItem > -1 ? topSliderSelectedItem : 0].id}`);\r\n\t\tbottomSliderToSelectEl && changeSelectedElement(bottomSliderToSelectEl);\r\n\r\n\t};\r\n\r\n\tconst removeFirstElementAndSelect = (itemType: CarrouselItemType) => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tconst isPreviewSlider = slider.Settings.sliderContainerSettings.extraSliderClass && slider.Settings.sliderContainerSettings.extraSliderClass.includes('technical-preview-container');\r\n\r\n\t\t\tswitch (itemType) {\r\n\t\t\t\tcase CarrouselItemType.FormatImage:\r\n\t\t\t\t\tif (slider.Settings && slider.Settings.sliderElements && slider.Settings.sliderElements.length > 0) {\r\n\t\t\t\t\t\tconst currentSlide = slider.GetCurrentSlide();\r\n\t\t\t\t\t\tconst currentSelected = currentSlide.id == slider.Settings.sliderElements[0].id\r\n\t\t\t\t\t\t\t? slider.Settings.sliderElements[1]\r\n\t\t\t\t\t\t\t: currentSlide;\r\n\r\n\t\t\t\t\t\tslider.RemoveSliderElementOnIndex(0);\r\n\t\t\t\t\t\t!isPreviewSlider && slider.JumpIntoView(currentSelected, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tupdateImageCount(slider);\r\n\t\t\t\t\tmoveBottomSliderToSelectedItem();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CarrouselItemType.PackShot:\r\n\t\t\t\t\tif (slider.Settings && slider.Settings.sliderElements && slider.Settings.sliderElements.length > 0 && slider.Settings.sliderElements[0].template.classList.contains(\"technical-packshot\")) {\r\n\t\t\t\t\t\tconst currentSlide = slider.GetCurrentSlide();\r\n\t\t\t\t\t\tconst currentSelected = currentSlide.id == slider.Settings.sliderElements[0].id\r\n\t\t\t\t\t\t\t? slider.Settings.sliderElements[1]\r\n\t\t\t\t\t\t\t: currentSlide;\r\n\r\n\t\t\t\t\t\tslider.RemoveSliderElementOnIndex(0);\r\n\t\t\t\t\t\t!isPreviewSlider && slider.JumpIntoView(currentSelected, false);\r\n\t\t\t\t\t\tupdateImageCount(slider);\r\n\t\t\t\t\t\tmoveBottomSliderToSelectedItem();\r\n\r\n\t\t\t\t\t\tlet newUrl = document.location.href;\r\n\t\t\t\t\t\tconst design = getParameter('design', newUrl, false);\r\n\t\t\t\t\t\tif (design) {\r\n\t\t\t\t\t\t\tnewUrl = updateParameter(\"design\", \"\");\r\n\t\t\t\t\t\t\tif (document.location.href !== newUrl)\r\n\t\t\t\t\t\t\t\thistory.replaceState({}, '', newUrl);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t};\r\n\r\n\tconst addAndSelectElement = (imgSrc: string): boolean => {\r\n\t\tif (!imgSrc) return false;\r\n\t\t[...sliderComponents].reverse().forEach(slider => {\r\n\t\t\t// do a deep clone of a non video element so there is no reference to the current slide template anymore => else the thumb click does nothing anymore\r\n\t\t\tconst formatImageContainerTemplate = slider.GetAllSlides().find(x => x.template.querySelector('img') && !x.template.querySelector('.technical-overlay')).template.cloneNode(true) as HTMLElement;\r\n\t\t\tconst extension = imgSrc.substring(imgSrc.lastIndexOf('.') + 1, imgSrc.length);\r\n\t\t\tconst isPreviewSlider = slider.Settings.sliderContainerSettings.extraSliderClass && slider.Settings.sliderContainerSettings.extraSliderClass.includes('technical-preview-container');\r\n\r\n\t\t\tif (VIDEO_EXTENSIONS.some(x => x === extension)) {\r\n\t\t\t\tformatImageContainerTemplate.classList.remove('m-carrousel__preview-image-container');\r\n\r\n\t\t\t\tformatImageContainerTemplate.classList.toggle('m-carrousel__preview-video-container', isPreviewSlider);\r\n\r\n\t\t\t\tconst videoContainer = document.createElement('video');\r\n\t\t\t\tvideoContainer.classList.add(isPreviewSlider ? 'm-carrousel__preview-local-video' : 'm-carrousel__thumb-local-video');\r\n\t\t\t\tvideoContainer.loop = true;\r\n\t\t\t\tvideoContainer.muted = true;\r\n\t\t\t\tvideoContainer.preload = 'metadata';\r\n\t\t\t\tvideoContainer['disableRemotePlayback'] = true;\r\n\t\t\t\tvideoContainer.crossOrigin = 'anonymous';\r\n\t\t\t\tvideoContainer.playsInline = true;\r\n\t\t\t\tvideoContainer.autoplay = true;\r\n\r\n\t\t\t\tconst videoContainerSource = document.createElement('source');\r\n\t\t\t\tvideoContainerSource.src = imgSrc;\r\n\t\t\t\tvideoContainerSource.type = `video/${extension}`;\r\n\r\n\t\t\t\tformatImageContainerTemplate.innerHTML = ''; // remove all\r\n\r\n\t\t\t\tvideoContainer.appendChild(videoContainerSource);\r\n\t\t\t\tformatImageContainerTemplate.appendChild(videoContainer);\r\n\t\t\t} else {\r\n\t\t\t\tconst imgEl = expressQuerySelector(formatImageContainerTemplate, \"img\", true);\r\n\t\t\t\timgEl.src = imgSrc;\r\n\t\t\t\tconst sourceEl = expressQuerySelector(formatImageContainerTemplate, \"source\", false);\r\n\t\t\t\tif (sourceEl) {\r\n\t\t\t\t\tsourceEl.srcset = imgSrc.endsWith('.jpg') ? imgSrc + '.webp' : imgSrc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// add correct dimentions\r\n\t\t\tconst sliderEl = slider.GetSliderElement();\r\n\t\t\tconst element = isPreviewSlider\r\n\t\t\t\t? sliderEl\r\n\t\t\t\t: expressQuerySelector(sliderEl, `#${slider.Settings.sliderElements[0].id}`);\r\n\r\n\t\t\tconst elementStyle = window.getComputedStyle(element),\r\n\t\t\t\telementWidth = elementStyle.width ? parseFloat(elementStyle!.width) : element.clientWidth; // use this instead of client width to handle the rounding of the elements => worse case 1 px of the image is not shown\r\n\r\n\t\t\tformatImageContainerTemplate.style.width = `${elementWidth}px`;\r\n\t\t\tformatImageContainerTemplate.style.minWidth = `${elementWidth}px`;\r\n\t\t\tformatImageContainerTemplate.style.maxWidth = `${elementWidth}px`;\r\n\r\n\t\t\tslider.AddSliderElement({ template: formatImageContainerTemplate }, 0);\r\n\t\t\tupdateImageCount(slider);\r\n\r\n\t\t\t// update bottom slider\r\n\t\t\tif (!isPreviewSlider) {\r\n\t\t\t\tconst firstEl = slider.GetSliderElement && expressQuerySelector(slider.GetSliderElement(), `#${slider.Settings.sliderElements[0].id}`);\r\n\t\t\t\tfirstEl && changeSelectedElement(firstEl);\r\n\t\t\t}\r\n\r\n\t\t\t// trigger resize for container to be the same width as other elements\r\n\t\t\tconst sliderSettings = slider.Settings;\r\n\t\t\tif (sliderSettings.ResizeEvent) sliderSettings.ResizeEvent(sliderSettings, sliderEl);\r\n\t\t});\r\n\r\n\t\treturn true;\r\n\t};\r\n\r\n\tconst getCurrentElement = (sliderIndex: number): ICustomPhotoSliderItem => {\r\n\t\treturn sliderComponents[sliderIndex].GetCurrentSlide();\r\n\t};\r\n\r\n\tconst getAllElements = (sliderIndex: number): ICustomPhotoSliderItem[] => {\r\n\t\treturn sliderComponents[sliderIndex].GetAllSlides();\r\n\t};\r\n\r\n\tconst resize = () => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tconst sliderEl = slider.GetSliderElement();\r\n\t\t\tconst sliderWidth = Math.ceil(GetHtmlElementWidthWithMargins(sliderEl));\r\n\t\t\tresizeSliderElements(slider.Settings, sliderWidth, sliderEl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst removeSliderElement = (sliderIndex: number, visiblePhotoEl: ICustomPhotoSliderItem) => {\r\n\t\tsliderComponents[sliderIndex].RemoveSliderElement(visiblePhotoEl);\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tslider.Dispose();\r\n\t\t});\r\n\t};\r\n\r\n\tinit();\r\n\r\n\tconst reInit = () => {\r\n\t\tinit();\r\n\t};\r\n\r\n\treturn {\r\n\t\treInit,\r\n\t\treStart,\r\n\t\tresize,\r\n\t\taddAndSelectElement,\r\n\t\tremoveFirstElementAndSelect,\r\n\t\tgetCurrentElement,\r\n\t\tgetAllElements,\r\n\t\tremoveSliderElement,\r\n\t\tgoToSlide: (currentSlide: ICustomPhotoSliderItem) => sliderComponents.forEach(slider => {\r\n\t\t\tslider.JumpIntoView(currentSlide, false);\r\n\t\t\tupdateImageCount(slider);\r\n\t\t}),\r\n\t\tdispose\r\n\t} as ICarrousel;\r\n}\r\n","import { createPopup, IPopup } from \"../components/popup-new\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll, expressRemoveClass, getParentWithClassName,\r\n\thasClass, hide, htmlToElement, show\r\n} from \"../common/html\";\r\nimport { createCollapsable, ICollapsable, ICreateCollapsableDependencies } from \"../components/collapsable\";\r\nimport { addParameter, getParameter, updateParameter } from \"../utils/querystring\";\r\nimport { createAmount, IAmount } from \"../atoms/amount\";\r\nimport { getIcon, getIconsAsync } from \"../services/content-service\";\r\nimport { getPrice, IProductPriceDetails } from \"../services/order-service\";\r\nimport { initTooltip, IToolTip } from \"../components/tooltip\";\r\nimport { getCookie } from \"../utils/cookie\";\r\nimport { postHtmlRequest } from \"../utils/fetch\";\r\nimport { formatPrice } from \"../utils/price\";\r\nimport { createCarrousel, ICarrousel } from \"../molecules/carrousel\";\r\nimport { createPopupLauncher } from \"../components/popup-launcher\";\r\nimport { getAspectRatioFromPvc } from \"../utils/product\";\r\nimport { ProductEvent, trackShopInShopEvent } from \"../common/events\";\r\nimport { createProductGrid } from \"../components/product-grid\";\r\n\r\nexport interface IDesignSelectionPageDialog {\r\n\treadonly open: () => void;\r\n\treadonly dispose: () => void;\r\n\treadonly getId: () => string;\r\n\treadonly resetOtherFormatSpecificClass: () => void;\r\n}\r\n\r\ninterface IPopupContent {\r\n\tkey: string;\r\n\tcontent: HTMLElement;\r\n\tcarrousel?: ICarrousel;\r\n\tisDefault: boolean;\r\n\tproductCode: string;\r\n\tpreDefinedProductName: string;\r\n}\r\n\r\ninterface IPriceRequest {\r\n\tkey: string;\r\n\tresponse: IProductPriceDetails;\r\n}\r\n\r\nexport async function createDesignSelectionPageDialog(\r\n\tdefaultProductCode: string,\r\n\tproductCode: string,\r\n\tproductCategory: string,\r\n\tdefaultPreDefinedProductName: string,\r\n\tpreDefinedProductName: string,\r\n\taspectRatio: string,\r\n\tdesignGroup: string,\r\n\tpackShotUrl: string,\r\n\tcontentTheme: string,\r\n\tpvc: string,\r\n\ttimeoutBeforeShowingSkeletonScreen: number,\r\n\tentrance: number) {\r\n\tlet popupEl: IPopup;\r\n\tconst popupContents: IPopupContent[] = [];\r\n\tconst priceRequests: IPriceRequest[] = [];\r\n\tconst optionPricePopups: { id: string, popup: IPopup }[] = [];\r\n\r\n\tlet buttonEls: HTMLAnchorElement[];\r\n\tlet sampleButtonEls: HTMLAnchorElement[];\r\n\tlet amountEls: HTMLElement[];\r\n\tlet priceEls: HTMLElement[];\r\n\tlet optionSelect: HTMLSelectElement;\r\n\tlet iconEls: HTMLElement[];\r\n\tlet infoIconEls: HTMLElement[];\r\n\tlet disposable: IDisposable;\r\n\tconst collapsibleArray: ICollapsable[] = [];\r\n\tlet amountArray: IAmount[] = [];\r\n\tlet tooltips: IToolTip[] = [];\r\n\tlet otherFormatLinkEl: HTMLElement | null;\r\n\tlet popupId = '';\r\n\tlet currentProductCode = productCode || defaultProductCode;\r\n\tconst currentPvc = pvc;\r\n\tlet currentPredefinedProductName = preDefinedProductName || defaultPreDefinedProductName;\r\n\tconst dt = defaultProductCode + '|' + defaultPreDefinedProductName;\r\n\tlet currentAspectRatio = getAspectRatioFromPvc(currentPvc);\r\n\tlet carrouselEl: HTMLElement;\r\n\tlet unSelectableDefaultOptionsFormUrl: string[];\r\n\tlet hasUserSelectedOptions: boolean = false;\r\n\tlet hasUserSelectedIconOptions: boolean = false;\r\n\tlet emptyOtherFormatPopupContent: ChildNode;\r\n\r\n\tconst loadingClass = 'skeleton-loading';\r\n\r\n\tconst open = () => {\r\n\t\tcollapsibleArray && collapsibleArray.forEach(c => c.close());\r\n\t\tpopupEl.openAsync();\r\n\r\n\t\tProductEvent(\"productSelection\", { viewedUniqueSkuWithDesign: popupEl.popup.dataset.uniqueskuwithdesign });\r\n\t};\r\n\r\n\tconst resetOtherFormatSpecificClass = () => {\r\n\t\texpressRemoveClass(popupEl.popup, 'p-design-selection-page--different-formats');\r\n\t};\r\n\r\n\tconst getColorFromPredefinedProductName = (predefinedProductName: string) => {\r\n\t\tlet color = \"\";\r\n\t\tif (predefinedProductName && predefinedProductName.indexOf(\"_\") > 0) {\r\n\t\t\tconst arr = predefinedProductName.split('_');\r\n\t\t\tcolor = arr[arr.length - 1];\r\n\t\t}\r\n\t\treturn color;\r\n\t};\r\n\tconst createPopupContentKey = (prefix?: string) => {\r\n\t\tconst key = currentProductCode + '_' + getColorFromPredefinedProductName(currentPredefinedProductName) + '_' + getSelectedOptions(false).join(',') + '_' + currentAspectRatio + currentPvc;\r\n\t\tif (!prefix) return key;\r\n\t\treturn prefix + '_' + key;\r\n\t};\r\n\r\n\tconst getSelectedOptions = (skipUserSelectedCheck = true) => {\r\n\t\tconst options: string[] = [];\r\n\r\n\t\tif (optionSelect && (skipUserSelectedCheck || hasUserSelectedOptions)) {\r\n\t\t\t// if options are passed and not in drop down => selected index -1\r\n\t\t\tconst selectedIndex = optionSelect.selectedIndex <= -1 ? 0 : optionSelect.selectedIndex;\r\n\t\t\tconst selectedDropDownOption = optionSelect.options[selectedIndex].value;\r\n\t\t\tif (selectedDropDownOption) options.push(selectedDropDownOption.toLowerCase());\r\n\t\t}\r\n\r\n\t\tif (iconEls && (skipUserSelectedCheck && hasUserSelectedIconOptions)) {\r\n\t\t\tconst selectedIconOption = iconEls.find(el => el.dataset.optioncode && hasClass(el, 'a-icon--selected'));\r\n\t\t\tif (selectedIconOption && selectedIconOption.dataset.optioncode && !selectedIconOption.dataset.optioncode.toLowerCase().startsWith(\"nooption\")) options.push(selectedIconOption.dataset.optioncode.toLowerCase());\r\n\t\t}\r\n\r\n\t\tif (!skipUserSelectedCheck) return options; // don't add unselectable when skipUserSelectedCheck so the defaults are selected\r\n\r\n\t\tif (unSelectableDefaultOptionsFormUrl && unSelectableDefaultOptionsFormUrl.length) {\r\n\t\t\tfor (const unselectableOption of unSelectableDefaultOptionsFormUrl)\r\n\t\t\t\toptions.indexOf(unselectableOption.toLowerCase()) < 0 && options.push(unselectableOption.toLowerCase());\r\n\t\t}\r\n\r\n\t\treturn options;\r\n\t};\r\n\r\n\tconst setSelectedIcon = (iconEl: HTMLElement) => {\r\n\t\tconst iconSetEl = getParentWithClassName(iconEl, 'technical-icon-set');\r\n\t\tif (!iconSetEl) return;\r\n\t\tconst iconElsInSet = expressQuerySelectorAll(iconSetEl, '.a-icon');\r\n\t\ticonElsInSet.forEach(el => {\r\n\t\t\texpressRemoveClass(el, 'a-icon--selected');\r\n\t\t\texpressAddClass(el, 'a-icon--unselected');\r\n\t\t});\r\n\t\texpressRemoveClass(iconEl, 'a-icon--unselected');\r\n\t\texpressAddClass(iconEl, 'a-icon--selected');\r\n\t};\r\n\r\n\tconst addSkeleton = (popup: HTMLElement) => {\r\n\t\tconst skeletonScreens = expressQuerySelectorAll(popup, '.technical-skeleton-container');\r\n\t\tskeletonScreens.forEach(el => expressAddClass(el, loadingClass));\r\n\t};\r\n\tconst removeSkeleton = (popup: HTMLElement) => {\r\n\t\tconst skeletonScreens = expressQuerySelectorAll(popup, '.technical-skeleton-container');\r\n\t\tskeletonScreens.forEach(el => expressRemoveClass(el, loadingClass));\r\n\t};\r\n\r\n\tconst init = async () => {\r\n\t\tconst getAndSetPrice = async () => {\r\n\t\t\tconst getUpdatedPrice = async () => {\r\n\t\t\t\tconst infoTooltipEl = expressQuerySelector(infoIconEls[0].parentElement, '.technical-price-tooltip', true);\r\n\t\t\t\tconst forceQuantityBreak = infoTooltipEl.dataset.quantitypricebreak || '-1';\r\n\t\t\t\tconst pvc = currentProductCode || '';\r\n\t\t\t\tconst options = getSelectedOptions();\r\n\t\t\t\tconst amount = getAmount();\r\n\t\t\t\tconst promoCode = getCookie(\"promo\");\r\n\t\t\t\tlet forceQuantityBreakInt: number;\r\n\t\t\t\tif (forceQuantityBreak)\r\n\t\t\t\t\tforceQuantityBreakInt = parseInt(forceQuantityBreak, 10);\r\n\t\t\t\tconst key = pvc + '_' + amount + '_' + options.join(',') + '_' + promoCode + '_' + forceQuantityBreakInt + '';\r\n\t\t\t\tconst savedPriceRequest = priceRequests.find(el => el.key === key);\r\n\t\t\t\tif (savedPriceRequest) {\r\n\t\t\t\t\treturn savedPriceRequest.response;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst response = await getPrice(pvc, amount, 0, options, promoCode, forceQuantityBreakInt);\r\n\t\t\t\t\tpriceRequests.push({ key, response } as IPriceRequest);\r\n\t\t\t\t\treturn response;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tconst updatePriceAndInfo = (infoTooltipEl: HTMLElement, priceDetails: IProductPriceDetails) => {\r\n\t\t\t\tconst templateEl = expressQuerySelectorAll(infoTooltipEl, '.technical-price-template')[0];\r\n\t\t\t\tconst containerEl = expressQuerySelector(infoTooltipEl, '.technical-price-container', true);\r\n\t\t\t\tcontainerEl.innerHTML = '';\r\n\t\t\t\tif (priceDetails.Price) {\r\n\t\t\t\t\tpriceEls.forEach(el => {\r\n\t\t\t\t\t\tel.innerHTML = formatPrice(priceDetails.Price);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tif (priceDetails.PriceItems) {\r\n\t\t\t\t\tpriceDetails.PriceItems.forEach(item => {\r\n\t\t\t\t\t\t// no item properties to set => skip\r\n\t\t\t\t\t\tif (!item.Description && !item.CalculationDescription && !item.ItemTotal)\r\n\t\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t\tconst newEl = templateEl.cloneNode(true) as HTMLElement;\r\n\t\t\t\t\t\tconst description = expressQuerySelector(newEl, '.technical-price-tooltip-description', true);\r\n\t\t\t\t\t\titem.Description ? description.innerHTML = item.Description : description.remove();\r\n\r\n\t\t\t\t\t\tconst calculation = expressQuerySelector(newEl, '.technical-price-tooltip-calculation', true);\r\n\t\t\t\t\t\titem.CalculationDescription ? calculation.innerHTML = item.CalculationDescription : calculation.remove();\r\n\r\n\t\t\t\t\t\tconst result = expressQuerySelector(newEl, '.technical-price-tooltip-result', true);\r\n\t\t\t\t\t\titem.ItemTotal ? result.innerHTML = item.ItemTotal : result.remove();\r\n\r\n\t\t\t\t\t\tcontainerEl.insertAdjacentElement('beforeend', newEl);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tconst priceResult = await getUpdatedPrice();\r\n\r\n\t\t\tfor (const infoIconEl of infoIconEls) {\r\n\t\t\t\tconst infoTooltipEl = expressQuerySelector(infoIconEl.parentElement, '.technical-price-tooltip', true);\r\n\t\t\t\tupdatePriceAndInfo(infoTooltipEl, priceResult);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst getAmount = () => {\r\n\t\t\tlet amount = 0;\r\n\t\t\tamountArray.forEach(amountEl => {\r\n\t\t\t\tamount += parseInt(amountEl.getCurrentValue() || \"1\", 10);\r\n\t\t\t});\r\n\t\t\treturn amount;\r\n\t\t};\r\n\r\n\t\tconst onButtonClick = (ev: MouseEvent) => {\r\n\t\t\tev.preventDefault();\r\n\t\t\tconst el = (ev.currentTarget);\r\n\t\t\tlet link = el.href;\r\n\r\n\t\t\tif (amountArray.length === 1) {\r\n\t\t\t\tlet amount = 0;\r\n\t\t\t\tlet code = '';\r\n\t\t\t\tamountArray.forEach(amountEl => {\r\n\t\t\t\t\tamount += parseInt(amountEl.getCurrentValue() || \"1\", 10);\r\n\t\t\t\t\tcode = amountEl.getCode();\r\n\t\t\t\t});\r\n\t\t\t\tif (amount > 0)\r\n\t\t\t\t\tif (code)\r\n\t\t\t\t\t\tlink = addParameter('quantity', code + '|' + amount + '', link);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tlink = addParameter('quantity', amount + '', link);\r\n\t\t\t} else {\r\n\t\t\t\tlet amountString = '';\r\n\t\t\t\tamountArray.forEach(amountEl => {\r\n\t\t\t\t\tconst code = amountEl.getCode();\r\n\t\t\t\t\tconst value = parseInt(amountEl.getCurrentValue() || \"0\", 10);\r\n\t\t\t\t\tif (code && value > 0)\r\n\t\t\t\t\t\tamountString += code + '|' + amountEl.getCurrentValue() + ',';\r\n\t\t\t\t});\r\n\t\t\t\tlink = addParameter('quantity', amountString.slice(0, -1), link);\r\n\t\t\t}\r\n\r\n\t\t\tconst options = getSelectedOptions().join(',');\r\n\t\t\tif (options)\r\n\t\t\t\tlink = addParameter('options', options, link);\r\n\r\n\t\t\tif (contentTheme && link.indexOf(\"contentTheme?\") < 0)\r\n\t\t\t\tlink = addParameter('contentTheme', contentTheme, link);\r\n\r\n\t\t\tif (!hasClass(el, 'a-button--disabled') && link) window.location.href = link;\r\n\t\t};\r\n\r\n\t\tlet skeletonTimeout;\r\n\t\tconst updatePopupContent = async (popup: HTMLElement, clickedIconEl: HTMLElement) => {\r\n\t\t\tdispose();\r\n\t\t\tconst key = createPopupContentKey();\r\n\t\t\tconst existingPopupContent = popupContents.find(pc => pc.key === key);\r\n\r\n\t\t\tif (existingPopupContent && existingPopupContent.content) {\r\n\t\t\t\tcurrentProductCode = existingPopupContent.productCode;\r\n\t\t\t\tcurrentPredefinedProductName = existingPopupContent.preDefinedProductName;\r\n\t\t\t\tpopupEl.replaceContent(existingPopupContent.content);\r\n\t\t\t\taddHandlers(popupEl.popup, false);\r\n\t\t\t\tif (existingPopupContent.carrousel) {\r\n\t\t\t\t\texistingPopupContent.carrousel.reInit();\r\n\t\t\t\t\texistingPopupContent.carrousel.reStart();\r\n\t\t\t\t}\r\n\t\t\t\tupdateQuantity(popupEl.popup);\r\n\r\n\t\t\t\tconst body = expressQuerySelector(popupEl.popup, '.technical-popup-body', false);\r\n\t\t\t\tbody && setUnselectableOptions(body.dataset.defaultoptions?.split(',') ?? []);\r\n\t\t\t\tupdateUrl(getSelectedOptions().join(','), getParameter('quantity'));\r\n\r\n\t\t\t\tawait getAndSetPrice();\r\n\t\t\t\tremoveSkeleton(popup);\r\n\t\t\t\treturn Promise.resolve();\r\n\t\t\t} else {\r\n\t\t\t\tconst data = {\r\n\t\t\t\t\tproductCode: currentProductCode,\r\n\t\t\t\t\tproductCategory,\r\n\t\t\t\t\tpreDefinedProductName: currentPredefinedProductName,\r\n\t\t\t\t\taspectRatio: currentAspectRatio,\r\n\t\t\t\t\tdesignGroup,\r\n\t\t\t\t\ttheme: getParameter('theme') ?? '',\r\n\t\t\t\t\tforWho: getParameter('forwho') ?? '',\r\n\t\t\t\t\tforWhat: getParameter('forwhat') ?? '',\r\n\t\t\t\t\tforWhen: getParameter('forwhen') ?? '',\r\n\t\t\t\t\toptions: getSelectedOptions(false),\r\n\t\t\t\t\tpvc: currentPvc,\r\n\t\t\t\t\tselectedQuantity: decodeURIComponent(getParameter('quantity') || ''),\r\n\t\t\t\t\tentrance\r\n\t\t\t\t};\r\n\r\n\t\t\t\tskeletonTimeout = setTimeout(() => addSkeleton(popup), timeoutBeforeShowingSkeletonScreen);\r\n\t\t\t\treturn postHtmlRequest(\"/apicore/dialog/designSelectionPageContentDialog\", data, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) }).then(\r\n\t\t\t\t\tres => {\r\n\t\t\t\t\t\tif (!res) return;\r\n\t\t\t\t\t\tconst node = htmlToElement(res);\r\n\t\t\t\t\t\tpopupEl.replaceContent(node);\r\n\t\t\t\t\t\tconst popupContentEl = expressQuerySelector(popup, '.m-popup__content', true);\r\n\t\t\t\t\t\tconst carrousel = addHandlers(popup, true);\r\n\t\t\t\t\t\tupdateQuantity(popupContentEl);\r\n\r\n\t\t\t\t\t\tconst iconEl = expressQuerySelector(popupContentEl, '#' + clickedIconEl.id, false);\r\n\t\t\t\t\t\tif (iconEl) setSelectedIcon(iconEl);\r\n\r\n\t\t\t\t\t\tconst body = expressQuerySelector(popupContentEl, '.technical-popup-body', false);\r\n\t\t\t\t\t\tbody && setUnselectableOptions(body.dataset.defaultoptions?.split(',') ?? []);\r\n\r\n\t\t\t\t\t\tgetAndSetPrice();\r\n\t\t\t\t\t\tpopupContents.push({\r\n\t\t\t\t\t\t\tkey: createPopupContentKey(),\r\n\t\t\t\t\t\t\tcontent: popupContentEl,\r\n\t\t\t\t\t\t\tcarrousel,\r\n\t\t\t\t\t\t\tisDefault: false,\r\n\t\t\t\t\t\t\tproductCode: currentProductCode,\r\n\t\t\t\t\t\t\tpreDefinedProductName: currentPredefinedProductName,\r\n\t\t\t\t\t\t} as IPopupContent);\r\n\t\t\t\t\t}\r\n\t\t\t\t).finally(() => {\r\n\t\t\t\t\tclearTimeout(skeletonTimeout);\r\n\t\t\t\t\tremoveSkeleton(popup);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst addHandlers = (popup: HTMLElement, initMode: boolean, initCarrousel = true) => {\r\n\t\t\tdisposable = compositeDisposable(undefined);\r\n\t\t\tbuttonEls = expressQuerySelectorAll(popup, '.technical-continue-button');\r\n\t\t\tsampleButtonEls = expressQuerySelectorAll(popup, '.technical-sample-button');\r\n\t\t\tamountEls = expressQuerySelectorAll(popup, '.technical-amount');\r\n\t\t\tpriceEls = expressQuerySelectorAll(popup, '.technical-price-tag');\r\n\t\t\toptionSelect = expressQuerySelector(popup, '.technical-option-select', false);\r\n\t\t\ticonEls = expressQuerySelectorAll(popup, '.a-icon');\r\n\t\t\tinfoIconEls = expressQuerySelectorAll(popup, '.technical-price-info-icon');\r\n\t\t\tcarrouselEl = expressQuerySelector(popup, '.technical-carrousel', false);\r\n\t\t\totherFormatLinkEl = expressQuerySelector(popup, '.technical-different-formats-button', false);\r\n\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(popup, '.technical-popup-collapsible');\r\n\t\t\tif (collapsibleEls && collapsibleEls.length > 0)\r\n\t\t\t\tcollapsibleEls.forEach(el => {\r\n\t\t\t\t\tconst onInit = (containerEl: HTMLElement) => {\r\n\t\t\t\t\t\tinitPopupLaunchers(containerEl);\r\n\t\t\t\t\t\tinitOptionPriceInfoLinks(containerEl);\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst initOptionPriceInfoLinks = (containerEl: HTMLElement) => {\r\n\t\t\t\t\t\tconst moreInfoLinkEls = expressQuerySelectorAll(containerEl, '.technical-option-price-more-info-link');\r\n\t\t\t\t\t\tif (moreInfoLinkEls && moreInfoLinkEls.length > 0) {\r\n\t\t\t\t\t\t\tconst initOptionPricesMoreInfoLink = (moreInfoLinkEl: HTMLElement) => {\r\n\t\t\t\t\t\t\t\tconst init = (popupEl: HTMLElement) => {\r\n\t\t\t\t\t\t\t\t\tconst pvcSelect = expressQuerySelector(popupEl, \".technical-price-option-select\", false);\r\n\t\t\t\t\t\t\t\t\tconst quantityBreakListItemContainer = expressQuerySelector(popupEl, \".p-option-price-details__body-container\", true);\r\n\t\t\t\t\t\t\t\t\tconst quantityBreakListItems = expressQuerySelectorAll(quantityBreakListItemContainer, \".m-quantity-break-list__item-container\");\r\n\t\t\t\t\t\t\t\t\tconst noOptionsDiv = expressQuerySelector(popupEl, \"#noOptionsDiv\", true);\r\n\t\t\t\t\t\t\t\t\tconst onChange = () => pvcSelectChange();\r\n\t\t\t\t\t\t\t\t\tconst pvcSelectChange = (selectedValue?: string) => {\r\n\t\t\t\t\t\t\t\t\t\tlet visibleItems = 0;\r\n\t\t\t\t\t\t\t\t\t\tif (!selectedValue) selectedValue = pvcSelect.value;\r\n\t\t\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\t\t\tconst options = [...pvcSelect.options];\r\n\t\t\t\t\t\t\t\t\t\t\tconst selectedOption = options.find(o => o.value.toLowerCase() === selectedValue.toLowerCase());\r\n\t\t\t\t\t\t\t\t\t\t\tif (selectedOption) pvcSelect.selectedIndex = selectedOption.index;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\tquantityBreakListItems.forEach(item => {\r\n\t\t\t\t\t\t\t\t\t\t\tconst itemPvc = item.dataset.pvc || '';\r\n\t\t\t\t\t\t\t\t\t\t\tif (itemPvc.toLowerCase() == selectedValue.toLowerCase()) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tshow(item);\r\n\t\t\t\t\t\t\t\t\t\t\t\tvisibleItems++;\r\n\t\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\t\thide(item);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\tif (visibleItems > 0) {\r\n\t\t\t\t\t\t\t\t\t\t\thide(noOptionsDiv);\r\n\t\t\t\t\t\t\t\t\t\t\tshow(quantityBreakListItemContainer);\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tshow(noOptionsDiv);\r\n\t\t\t\t\t\t\t\t\t\t\thide(quantityBreakListItemContainer);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t\tif (quantityBreakListItemContainer && quantityBreakListItems && noOptionsDiv) {\r\n\t\t\t\t\t\t\t\t\t\thide(noOptionsDiv);\r\n\t\t\t\t\t\t\t\t\t\tif (!pvcSelect) return;\r\n\t\t\t\t\t\t\t\t\t\tif (currentPvc) pvcSelectChange(currentPvc);\r\n\t\t\t\t\t\t\t\t\t\telse pvcSelectChange();\r\n\t\t\t\t\t\t\t\t\t\texpressEventListener(pvcSelect, 'change', onChange);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\tconst showOptionPricePopup = () => {\r\n\r\n\t\t\t\t\t\t\t\t\tconst contentKey = moreInfoLinkEl.dataset.contentkey || '';\r\n\r\n\t\t\t\t\t\t\t\t\tif (contentKey) {\r\n\t\t\t\t\t\t\t\t\t\tlet uniqueId = contentKey;\r\n\t\t\t\t\t\t\t\t\t\tif (uniqueId.indexOf('_') > 0) uniqueId = uniqueId.split('_')[1];\r\n\t\t\t\t\t\t\t\t\t\tif (optionPricePopups.filter(p => p.id === uniqueId).length <= 0) {\r\n\t\t\t\t\t\t\t\t\t\t\tcreatePopup({\r\n\t\t\t\t\t\t\t\t\t\t\t\tdialogId: 'optionpricedetails_' + uniqueId,\r\n\t\t\t\t\t\t\t\t\t\t\t\tview: 'OptionPriceDetailsDialog',\r\n\t\t\t\t\t\t\t\t\t\t\t\tdata: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tproductCategoryOptionContentKey: contentKey,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpvc: currentPvc\r\n\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\tonBeforeOpen: popupEl => init(popupEl)\r\n\t\t\t\t\t\t\t\t\t\t\t}).then(popup => {\r\n\t\t\t\t\t\t\t\t\t\t\t\t// TODO: Do we need to save the popup? I think the popup script itself opens the existing one\r\n\t\t\t\t\t\t\t\t\t\t\t\toptionPricePopups.push({ \"id\": uniqueId, \"popup\": popup });\r\n\t\t\t\t\t\t\t\t\t\t\t\tpopup.openAsync();\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\tconst popup = optionPricePopups.filter(p => p.id === uniqueId);\r\n\t\t\t\t\t\t\t\t\t\t\tif (popup[0]) popup[0].popup.openAsync();\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\tconst onClick = (e: Event) => {\r\n\t\t\t\t\t\t\t\t\te.preventDefault();\r\n\t\t\t\t\t\t\t\t\tif (hasClass(moreInfoLinkEl, 'a-link--disabled\"')) return;\r\n\t\t\t\t\t\t\t\t\tshowOptionPricePopup();\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\tif (moreInfoLinkEl) expressEventListener(moreInfoLinkEl, 'click', onClick);\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tmoreInfoLinkEls.forEach(el => initOptionPricesMoreInfoLink(el));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst initPopupLaunchers = (containerEl: HTMLElement) => {\r\n\t\t\t\t\t\t// create popup launchers (links from cms with a content dialog parser)\r\n\t\t\t\t\t\tconst popupLauncherEls = expressQuerySelectorAll(containerEl, '.technical-popup-launcher');\r\n\t\t\t\t\t\tpopupLauncherEls.forEach(el => createPopupLauncher(el));\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst toggleShowMore = (showMoreEl: HTMLElement, reset?: boolean) => {\r\n\t\t\t\t\t\tconst arrow = expressQuerySelector(showMoreEl, '.technical-showmore-arrow', true);\r\n\t\t\t\t\t\tarrow.style.transform = `rotate(${reset || arrow.style.transform.indexOf('-180') >= 0 ? 0 : -180}deg)`;\r\n\t\t\t\t\t\tshowMoreEl.nextElementSibling.classList.toggle('u-hide', reset ? true : undefined);\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst toggleShowMoreEvent = (ev: Event, reset?: boolean) => toggleShowMore((ev.target as HTMLElement).closest('.technical-delivery-collapsibles'), reset);\r\n\t\t\t\t\tconst onBeforeOpen = (containerEl: HTMLElement) => {\r\n\t\t\t\t\t\tconst innerCollapsibleEls = expressQuerySelectorAll(containerEl, '.technical-delivery-collapsibles');\r\n\t\t\t\t\t\tinnerCollapsibleEls.forEach(x => {\r\n\t\t\t\t\t\t\ttoggleShowMore(x, true); // reset dropdowns to closed\r\n\t\t\t\t\t\t\tx.addEventListener('click', toggleShowMoreEvent);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst onBeforeClose = (containerEl: HTMLElement) => {\r\n\t\t\t\t\t\tconst innerCollapsibleEls = expressQuerySelectorAll(containerEl, '.technical-delivery-collapsibles');\r\n\t\t\t\t\t\tinnerCollapsibleEls.forEach(x => x.removeEventListener('click', toggleShowMoreEvent));\r\n\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst collapsableDeps = {\r\n\t\t\t\t\t\tcontentSelector: '.m-collapsable__content',\r\n\t\t\t\t\t\ttitleElSelector: '.m-collapsable__title',\r\n\t\t\t\t\t\tscrollIntoViewAfterOpen: false,\r\n\t\t\t\t\t\tonBeforeOpen,\r\n\t\t\t\t\t\tonBeforeClose,\r\n\t\t\t\t\t\tonInit\r\n\t\t\t\t\t} as ICreateCollapsableDependencies;\r\n\t\t\t\t\tcollapsibleArray.push(createCollapsable(el, collapsableDeps, { singleOpen: true }));\r\n\t\t\t\t});\r\n\r\n\t\t\tconst setSelectedIcon = (iconEl: HTMLElement) => {\r\n\t\t\t\tconst iconSetEl = getParentWithClassName(iconEl, 'technical-icon-set');\r\n\t\t\t\tif (iconSetEl) {\r\n\t\t\t\t\tconst iconElsInSet = expressQuerySelectorAll(iconSetEl, '.a-icon');\r\n\t\t\t\t\ticonElsInSet.forEach(el => {\r\n\t\t\t\t\t\texpressRemoveClass(el, 'a-icon--selected');\r\n\t\t\t\t\t\texpressAddClass(el, 'a-icon--unselected');\r\n\t\t\t\t\t});\r\n\t\t\t\t\texpressRemoveClass(iconEl, 'a-icon--unselected');\r\n\t\t\t\t\texpressAddClass(iconEl, 'a-icon--selected');\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tif (optionSelect) {\r\n\t\t\t\tconst onChange = () => {\r\n\t\t\t\t\thasUserSelectedOptions = true;\r\n\t\t\t\t\tgetAndSetPrice();\r\n\t\t\t\t\tupdateUrl(getSelectedOptions().join(','), getParameter('quantity'));\r\n\t\t\t\t};\r\n\t\t\t\tdisposable.add(expressEventListener(optionSelect, 'change', onChange));\r\n\t\t\t}\r\n\r\n\t\t\tif (sampleButtonEls && sampleButtonEls.length > 0) {\r\n\t\t\t\tconst onSampleButtonClick = () => {\r\n\t\t\t\t\ttrackShopInShopEvent(\"Order sample product button clicked\", { pvc: currentPvc });\r\n\t\t\t\t};\r\n\t\t\t\tsampleButtonEls.forEach(el => disposable.add(expressEventListener(el, 'click', onSampleButtonClick)));\r\n\t\t\t}\r\n\r\n\t\t\tif (buttonEls && buttonEls.length > 0) {\r\n\t\t\t\tbuttonEls.forEach(el => disposable.add(expressEventListener(el, 'click', onButtonClick)));\r\n\t\t\t}\r\n\r\n\t\t\tif (amountEls && amountEls.length > 0) {\r\n\t\t\t\tamountArray = [];\r\n\t\t\t\tconst updatePrice = () => {\r\n\t\t\t\t\tconst amount = getAmount();\r\n\t\t\t\t\tconst totalEl = expressQuerySelector(popup, '.technical-total', false);\r\n\t\t\t\t\tif (totalEl) totalEl.innerText = amount + '';\r\n\t\t\t\t\tgetAndSetPrice();\r\n\r\n\t\t\t\t\tbuttonEls.forEach(x => x.classList.toggle('a-button--disabled', amount <= 0));\r\n\t\t\t\t\tupdateUrl(getSelectedOptions().join(','), getQuantity());\r\n\t\t\t\t};\r\n\t\t\t\tamountEls.forEach(el => {\r\n\t\t\t\t\tamountArray.push(createAmount(el, {\r\n\t\t\t\t\t\tonSubtractClick: updatePrice,\r\n\t\t\t\t\t\tonAddClick: updatePrice,\r\n\t\t\t\t\t\tonManualInput: updatePrice\r\n\t\t\t\t\t}));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tconst giveIconsAnId = () => {\r\n\t\t\t\tconst iconSetEls = expressQuerySelectorAll(popup, '.technical-icon-set');\r\n\t\t\t\ticonSetEls.forEach(el => {\r\n\t\t\t\t\tconst iconEls = expressQuerySelectorAll(el, '.a-icon');\r\n\t\t\t\t\ticonEls.forEach(iconEl => {\r\n\t\t\t\t\t\tif (hasClass(iconEl, 'technical-icon-alternative-option')) {\r\n\t\t\t\t\t\t\ticonEl.id = \"icon-option-\" + iconEl.dataset.optioncode;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (hasClass(iconEl, 'technical-icon-alternative-product')) {\r\n\t\t\t\t\t\t\ticonEl.id = \"icon-product-\" + iconEl.dataset.productcode;\r\n\t\t\t\t\t\t\tif (iconEl.dataset.aspectration)\r\n\t\t\t\t\t\t\t\ticonEl.id += '-' + iconEl.dataset.aspectration;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (hasClass(iconEl, 'technical-icon-alternative-color')) {\r\n\t\t\t\t\t\t\ticonEl.id = \"icon-color-\" + getColorFromPredefinedProductName(iconEl.dataset.predefinedproductname);\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 (iconEls && iconEls.length > 0) {\r\n\t\t\t\tgiveIconsAnId();\r\n\t\t\t\tif (initMode) {\r\n\t\t\t\t\tconst iconContentKeyDataAttribute = \"data-iconcontentkey\";\r\n\t\t\t\t\tconst iconsWithoutSvg = iconEls.filter(el => !expressQuerySelector(el, 'svg', false));\r\n\t\t\t\t\tconst iconKeys = iconsWithoutSvg.map(el => el.getAttribute(iconContentKeyDataAttribute) || \"\");\r\n\t\t\t\t\tgetIconsAsync(iconKeys.filter((x, i, a) => a.indexOf(x) == i)).then(_ => {\r\n\t\t\t\t\t\ticonsWithoutSvg.forEach(el => {\r\n\t\t\t\t\t\t\tif (el.hasAttribute(iconContentKeyDataAttribute)) {\r\n\t\t\t\t\t\t\t\tconst iconContentKey = el.getAttribute(iconContentKeyDataAttribute);\r\n\t\t\t\t\t\t\t\tif (iconContentKey) {\r\n\t\t\t\t\t\t\t\t\tconst icon = getIcon(iconContentKey.toLocaleLowerCase().replace(\"icon.\", \"\"));\r\n\t\t\t\t\t\t\t\t\tif (icon) {\r\n\t\t\t\t\t\t\t\t\t\tfetch(icon)\r\n\t\t\t\t\t\t\t\t\t\t\t.then(response => response.text())\r\n\t\t\t\t\t\t\t\t\t\t\t.then(svg => {\r\n\t\t\t\t\t\t\t\t\t\t\t\tconst iEl = expressQuerySelector(el, '.a-icon__icon', true);\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!iEl.innerText) iEl.insertAdjacentHTML(\"afterbegin\", svg);\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t}\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\tconst onIconCLick = (_: MouseEvent, iconEl: HTMLElement) => {\r\n\t\t\t\t\t// alternative option\r\n\t\t\t\t\tif (hasClass(iconEl, 'technical-icon-alternative-option')) {\r\n\t\t\t\t\t\thasUserSelectedIconOptions = true;\r\n\t\t\t\t\t\tsetSelectedIcon(iconEl);\r\n\t\t\t\t\t\tgetAndSetPrice();\r\n\t\t\t\t\t\tupdateUrl(getSelectedOptions().join(','), getQuantity());\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Alternative product\r\n\t\t\t\t\tif (hasClass(iconEl, 'technical-icon-alternative-product')) {\r\n\t\t\t\t\t\tcurrentProductCode = iconEl.dataset.productcode;\r\n\t\t\t\t\t\tcurrentPredefinedProductName = iconEl.dataset.predefinedproductname;\r\n\t\t\t\t\t\tcurrentAspectRatio = iconEl.dataset.aspectratio || getAspectRatioFromPvc(currentPvc);\r\n\t\t\t\t\t\tupdatePopupContent(popup, iconEl);\r\n\t\t\t\t\t\tupdateUrl(getParameter('options'), getQuantity());\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Alternative color\r\n\t\t\t\t\tif (hasClass(iconEl, 'technical-icon-alternative-color')) {\r\n\t\t\t\t\t\tcurrentPredefinedProductName = iconEl.dataset.predefinedproductname;\r\n\t\t\t\t\t\tupdatePopupContent(popup, iconEl);\r\n\t\t\t\t\t\tupdateUrl(getParameter('options'), getQuantity());\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\ticonEls.forEach(el => disposable.add(expressEventListener(el, 'click', (e) => onIconCLick(e, el))));\r\n\t\t\t}\r\n\r\n\t\t\tif (infoIconEls && infoIconEls.length > 0) {\r\n\t\t\t\ttooltips = [];\r\n\t\t\t\tinfoIconEls.forEach(infoIconEl => {\r\n\t\t\t\t\tconst infoTooltipEl = expressQuerySelector(infoIconEl.parentElement, '.technical-price-tooltip', true);\r\n\t\t\t\t\ttooltips.push(initTooltip({\r\n\t\t\t\t\t\tbuttonEl: infoIconEl,\r\n\t\t\t\t\t\tcontainerEl: infoTooltipEl,\r\n\t\t\t\t\t\topenClass: \"is-tooltip-open\",\r\n\t\t\t\t\t\tonOpen: getAndSetPrice\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 (otherFormatLinkEl) {\r\n\t\t\t\tconst data = {\r\n\t\t\t\t\tproductCode: currentProductCode,\r\n\t\t\t\t\tpreDefinedProductName: currentPredefinedProductName,\r\n\t\t\t\t\tproductCategoryGroup: getParameter('pcg') ?? '',\r\n\t\t\t\t\tcolor: '',\r\n\t\t\t\t\taspectRatio: currentAspectRatio,\r\n\t\t\t\t\tdesignGroup,\r\n\t\t\t\t\ttheme: getParameter('theme') ?? '',\r\n\t\t\t\t\tpromoCode: getCookie(\"promo\") ?? '',\r\n\t\t\t\t};\r\n\r\n\t\t\t\tpostHtmlRequest(\"/apicore/dialog/emptyDesignSelectionPageOtherFormatsContentDialog\", data, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) }).then(\r\n\t\t\t\t\tres => {\r\n\t\t\t\t\t\tif (!res) return;\r\n\t\t\t\t\t\temptyOtherFormatPopupContent = htmlToElement(res);\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\r\n\t\t\t\tconst otherFormatLinkClick = (e: Event) => {\r\n\t\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\t\tconst existingPopupContent = popupContents.find(pc => pc.key === createPopupContentKey('otherFormats'));\r\n\t\t\t\t\tconst addFormatPopupHandlers = (formatPopup: HTMLElement) => {\r\n\t\t\t\t\t\tconst backIconEl = expressQuerySelector(formatPopup, '.technical-back-icon', false);\r\n\t\t\t\t\t\tif (backIconEl) {\r\n\t\t\t\t\t\t\tconst onBackIconClick = () => {\r\n\t\t\t\t\t\t\t\tconst currentPopupKey = createPopupContentKey();\r\n\t\t\t\t\t\t\t\tconst existingPopupContent = popupContents.find(pc => pc.key === currentPopupKey);\r\n\t\t\t\t\t\t\t\tif (existingPopupContent) {\r\n\t\t\t\t\t\t\t\t\taddSkeleton(existingPopupContent.content);\r\n\t\t\t\t\t\t\t\t\tpopupEl.replaceContent(existingPopupContent.content);\r\n\t\t\t\t\t\t\t\t\texpressRemoveClass(popupEl.popup, 'p-design-selection-page--different-formats');\r\n\t\t\t\t\t\t\t\t\tsetTimeout(removeSkeleton, 200, popup);\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\tdisposable.add(expressEventListener(backIconEl, 'click', onBackIconClick));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tconst gridEl = expressQuerySelector(formatPopup, '.technical-product-grid', false);\r\n\t\t\t\t\t\tcreateProductGrid(gridEl, {});\r\n\t\t\t\t\t\tconst anchorEls = expressQuerySelectorAll(gridEl, 'a');\r\n\t\t\t\t\t\tanchorEls.forEach(anchorEl => {\r\n\t\t\t\t\t\t\tdisposable.add(expressEventListener(anchorEl, 'click', onButtonClick));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t};\r\n\t\t\t\t\tif (existingPopupContent) {\r\n\t\t\t\t\t\tpopupEl.replaceContent(existingPopupContent.content);\r\n\t\t\t\t\t\texpressAddClass(popupEl.popup, 'p-design-selection-page--different-formats');\r\n\t\t\t\t\t\tremoveSkeleton(popup);\r\n\t\t\t\t\t\taddFormatPopupHandlers(existingPopupContent.content);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tpopupEl.replaceContent(emptyOtherFormatPopupContent);\r\n\t\t\t\t\t\texpressAddClass(popupEl.popup, 'p-design-selection-page--different-formats');\r\n\t\t\t\t\t\tpostHtmlRequest(\"/apicore/dialog/designSelectionPageOtherFormatsContentDialog\", data, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) }).then(\r\n\t\t\t\t\t\t\tres => {\r\n\t\t\t\t\t\t\t\tif (!res) return;\r\n\t\t\t\t\t\t\t\tconst node = htmlToElement(res);\r\n\t\t\t\t\t\t\t\tpopupEl.replaceContent(node);\r\n\r\n\t\t\t\t\t\t\t\tconst popupContentEl = expressQuerySelector(popupEl.popup, '.m-popup__content', true);\r\n\t\t\t\t\t\t\t\taddFormatPopupHandlers(popupEl.popup);\r\n\t\t\t\t\t\t\t\tpopupContents.push({\r\n\t\t\t\t\t\t\t\t\tkey: createPopupContentKey('otherFormats'),\r\n\t\t\t\t\t\t\t\t\tcontent: popupContentEl,\r\n\t\t\t\t\t\t\t\t\tcarrousel: null,\r\n\t\t\t\t\t\t\t\t\tisDefault: false\r\n\t\t\t\t\t\t\t\t} as IPopupContent);\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\tdisposable.add(expressEventListener(otherFormatLinkEl, 'click', (e) => otherFormatLinkClick(e)));\r\n\t\t\t}\r\n\r\n\t\t\tif (carrouselEl && initMode && initCarrousel)\r\n\t\t\t\treturn createCarrousel(carrouselEl);\r\n\t\t\treturn null;\r\n\t\t};\r\n\r\n\t\tconst getQuantity = () => {\r\n\t\t\tif (amountArray.length === 1) {\r\n\t\t\t\tlet amount = 0;\r\n\t\t\t\tlet code = '';\r\n\t\t\t\tamountArray.forEach(amountEl => {\r\n\t\t\t\t\tamount += parseInt(amountEl.getCurrentValue() || \"1\", 10);\r\n\t\t\t\t\tcode = amountEl.getCode();\r\n\t\t\t\t});\r\n\t\t\t\tif (amount > 0)\r\n\t\t\t\t\tif (code)\r\n\t\t\t\t\t\treturn `${code}|${amount}`;\r\n\t\t\t\treturn `${amount}`;\r\n\t\t\t} else {\r\n\t\t\t\tlet amountString = '';\r\n\t\t\t\tamountArray.forEach(amountEl => {\r\n\t\t\t\t\tconst code = amountEl.getCode();\r\n\t\t\t\t\tconst value = parseInt(amountEl.getCurrentValue() || \"0\", 10);\r\n\t\t\t\t\tif (code && value > 0)\r\n\t\t\t\t\t\tamountString += `${code}|${amountEl.getCurrentValue()},`;\r\n\t\t\t\t});\r\n\t\t\t\treturn amountString.slice(0, -1);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst updateUrl = (options = '', quantity = '', updatePopupCode = true) => {\r\n\t\t\tlet url = window.location.href;\r\n\t\t\turl = updateParameter('dt', (options || quantity) && updatePopupCode ? dt : '', url);\r\n\t\t\turl = updateParameter('pc', (options || quantity) && updatePopupCode ? currentProductCode : '', url);\r\n\t\t\turl = updateParameter('ppn', (options || quantity) && updatePopupCode ? currentPredefinedProductName : '', url);\r\n\t\t\turl = updateParameter('options', options, url);\r\n\t\t\turl = updateParameter('quantity', quantity, url);\r\n\t\t\twindow.history.replaceState(null, null, url);\r\n\t\t};\r\n\r\n\t\tconst onPopupOpen = (popup: HTMLElement) => {\r\n\t\t\tconst existingPopupContent = popupContents.find(pc => pc.isDefault);\r\n\r\n\t\t\tif (existingPopupContent && existingPopupContent.content) {\r\n\t\t\t\tcurrentProductCode = existingPopupContent.productCode;\r\n\t\t\t\tcurrentPredefinedProductName = existingPopupContent.preDefinedProductName;\r\n\t\t\t\tif (existingPopupContent.carrousel) {\r\n\t\t\t\t\texistingPopupContent.carrousel.reInit();\r\n\t\t\t\t\texistingPopupContent.carrousel.reStart();\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tpopupContents.push({\r\n\t\t\t\t\tkey: createPopupContentKey(),\r\n\t\t\t\t\tcontent: expressQuerySelector(popup, '.m-popup__content', true),\r\n\t\t\t\t\tcarrousel: createCarrousel(carrouselEl),\r\n\t\t\t\t\tisDefault: true,\r\n\t\t\t\t\tproductCode: currentProductCode,\r\n\t\t\t\t\tpreDefinedProductName: currentPredefinedProductName,\r\n\t\t\t\t} as IPopupContent);\r\n\t\t\t}\r\n\r\n\t\t\tclearTimeout(skeletonTimeout);\r\n\t\t\tremoveSkeleton(popup);\r\n\t\t};\r\n\r\n\t\tconst updateQuantity = (popup: HTMLElement) => {\r\n\t\t\t// set amount\r\n\t\t\tconst quantity = getParameter('quantity')?.split(',') ?? [];\r\n\t\t\tquantity.forEach(x => {\r\n\t\t\t\tconst codeParts = x.split('|');\r\n\t\t\t\tconst code = codeParts.length > 1 ? codeParts[0] : '';\r\n\t\t\t\tconst value = codeParts.length > 1 ? codeParts[1] : codeParts[0];\r\n\r\n\t\t\t\tconst amount = amountArray.find(x => x.getCode().toLowerCase() === code.toLowerCase());\r\n\t\t\t\tif (!amount) return;\r\n\r\n\t\t\t\tconst intValue = value ? parseInt(value, 10) : amount.minAmount;\r\n\t\t\t\tif (isNaN(intValue)) return;\r\n\t\t\t\tamount.setValue(intValue);\r\n\t\t\t});\r\n\r\n\t\t\t// update total\r\n\t\t\tconst amount = amountArray.map(x => +x.getCurrentValue()).reduce((a, b) => a + b);\r\n\t\t\tconst totalEl = expressQuerySelector(popup, '.technical-total', false);\r\n\t\t\tif (totalEl) totalEl.innerText = `${amount}`;\r\n\t\t};\r\n\r\n\t\tconst setUnselectableOptions = (defaultOptions: string[]) => {\r\n\t\t\tconst optionSelectOptions = [];\r\n\t\t\tif (optionSelect)\r\n\t\t\t\tfor (let i = 0; i < optionSelect.options.length; i++) {\r\n\t\t\t\t\toptionSelectOptions.push(optionSelect.options[i]);\r\n\t\t\t\t}\r\n\r\n\t\t\t// set unSelectableDefaultOptionsFormUrl default options that cant be selected in the popup\r\n\t\t\tconst altOptions = (iconEls && iconEls.length && iconEls.filter(x => x.classList.contains('technical-icon-alternative-option')).map(x => x.dataset.optioncode)) || [];\r\n\t\t\tunSelectableDefaultOptionsFormUrl = defaultOptions.filter(x => !optionSelectOptions.some(option => option.value === x) && !altOptions.some(opt => opt === x.toLowerCase()));\r\n\t\t};\r\n\r\n\t\tconst onPopupBeforeOpen = async (popup: HTMLElement) => {\r\n\t\t\tif (!popup) return;\r\n\t\t\tskeletonTimeout = setTimeout(() => addSkeleton(popup), timeoutBeforeShowingSkeletonScreen);\r\n\r\n\t\t\tconst existingPopupContent = popupContents.find(pc => pc.isDefault);\r\n\r\n\t\t\tif (existingPopupContent && existingPopupContent.content) {\r\n\t\t\t\tpopupEl.replaceContent(existingPopupContent.content);\r\n\t\t\t\tcurrentProductCode = existingPopupContent.productCode;\r\n\t\t\t\taddHandlers(popupEl.popup, false, false);\r\n\t\t\t} else {\r\n\t\t\t\taddHandlers(popupEl.popup, true, false);\r\n\t\t\t}\r\n\r\n\t\t\t// update new content with new data\r\n\t\t\tconst queryOptions = getParameter('options');\r\n\t\t\tconst options = queryOptions ? decodeURIComponent(queryOptions).split(',') : [];\r\n\t\t\tconst optionSelectOptions = [];\r\n\t\t\tif (optionSelect)\r\n\t\t\t\tfor (let i = 0; i < optionSelect.options.length; i++) {\r\n\t\t\t\t\toptionSelectOptions.push(optionSelect.options[i]);\r\n\t\t\t\t}\r\n\r\n\t\t\t// icons\r\n\t\t\tconst iconOption = options && iconEls.find(x => x.classList.contains('technical-icon-alternative-option') && options.find(opt => opt === x.id));\r\n\t\t\ticonOption && setSelectedIcon(iconOption);\r\n\t\t\thasUserSelectedIconOptions = false;\r\n\r\n\t\t\t// options\r\n\t\t\tif (options && options.find(x => optionSelectOptions.some(option => option.value === x))) optionSelect.value = options.find(x => optionSelectOptions.some(option => option.value === x));\r\n\t\t\thasUserSelectedOptions = false;\r\n\r\n\t\t\tsetUnselectableOptions(options);\r\n\t\t\tupdateQuantity(popup);\r\n\t\t\tawait getAndSetPrice();\r\n\t\t};\r\n\r\n\t\tconst dispose = () => {\r\n\t\t\tcollapsibleArray.forEach(el => el.dispose());\r\n\t\t\tamountArray.forEach(el => el.dispose());\r\n\t\t\tdisposable && disposable.dispose();\r\n\t\t\ttooltips.forEach(el => el.dispose());\r\n\t\t\tpopupContents.forEach(c => c.carrousel && c.carrousel.dispose());\r\n\t\t};\r\n\r\n\t\tconst onPopupClose = () => {\r\n\t\t\tupdateUrl('', undefined, false); // clear current open popup url\r\n\t\t\tdispose();\r\n\t\t\thasUserSelectedIconOptions = false;\r\n\t\t\thasUserSelectedOptions = false;\r\n\t\t};\r\n\r\n\t\tpopupId = 'DesignSelectionPageDialog-' + currentProductCode + '_' + productCategory + '-' + currentPredefinedProductName + '-' + designGroup + '-' + aspectRatio + '-' + currentPvc;\r\n\t\tpopupEl = await createPopup({\r\n\t\t\tdialogId: popupId.replace(\"~\", \"\").replace('.', ''),\r\n\t\t\tview: 'DesignSelectionPageDialog',\r\n\t\t\tdata: {\r\n\t\t\t\tproductCode: currentProductCode,\r\n\t\t\t\tproductCategory,\r\n\t\t\t\tpreDefinedProductName: currentPredefinedProductName,\r\n\t\t\t\taspectRatio,\r\n\t\t\t\ttheme: getParameter('theme') ?? '',\r\n\t\t\t\tforWho: getParameter('forwho') ?? '',\r\n\t\t\t\tforWhat: getParameter('forwhat') ?? '',\r\n\t\t\t\tforWhen: getParameter('forwhen') ?? '',\r\n\t\t\t\tdesignGroup,\r\n\t\t\t\tpackShotUrl,\r\n\t\t\t\tcontentTheme,\r\n\t\t\t\tpvc: currentPvc,\r\n\t\t\t\tselectedQuantity: decodeURIComponent(getParameter('quantity') || ''),\r\n\t\t\t\toptions: decodeURIComponent(getParameter('options') || ''),\r\n\t\t\t\tcrossSellFrom: getParameter('crossSellFrom') ?? '',\r\n\t\t\t\tentrance\r\n\t\t\t},\r\n\t\t\tforceRefresh: false,\r\n\t\t\tonBeforeOpen: onPopupBeforeOpen,\r\n\t\t\tonOpen: onPopupOpen,\r\n\t\t\tonClose: onPopupClose\r\n\t\t});\r\n\t};\r\n\r\n\tconst getId = () => {\r\n\t\treturn popupId;\r\n\t};\r\n\r\n\tawait init();\r\n\r\n\treturn {\r\n\t\topen,\r\n\t\tdispose: () => disposable.dispose,\r\n\t\tgetId,\r\n\t\tresetOtherFormatSpecificClass\r\n\t} as IDesignSelectionPageDialog;\r\n}\r\n","import {expressAddClass, expressEventListener, expressQuerySelector, expressRemoveClass} from \"../common/html\";\r\nimport {compositeDisposable} from \"../utils/disposable\";\r\n\r\nexport interface IEmptyState {\r\n\treadonly show: () => void;\r\n\treadonly hide: () => void;\r\n\treadonly dispose: () => void;\r\n}\r\n\r\nexport interface IEmptyStateOptions {\r\n\treadonly onResetButtonClick: () => void;\r\n\treadonly onShow?: () => void;\r\n\treadonly onHide?: () => void;\r\n}\r\n\r\nexport function createEmptyState(containerEl: HTMLElement, opts?: IEmptyStateOptions) {\r\n\tlet disposable;\r\n\tconst resetButtonEl = expressQuerySelector(containerEl, '.technical-reset-filters-empty-state', false);\r\n\r\n\tif (resetButtonEl && opts && opts.onResetButtonClick) {\r\n\t\tdisposable = compositeDisposable([expressEventListener(resetButtonEl, 'click', opts.onResetButtonClick)]);\r\n\t}\r\n\r\n\tconst show = () => {\r\n\t\texpressRemoveClass(containerEl, 'u-hide');\r\n\t\topts && opts.onShow && opts.onShow();\r\n\t};\r\n\r\n\tconst hide = () => {\r\n\t\texpressAddClass(containerEl, 'u-hide');\r\n\t\topts && opts.onHide && opts.onHide();\r\n\t};\r\n\r\n\treturn {\r\n\t\tshow,\r\n\t\thide,\r\n\t\tdispose: () => disposable && disposable.dispose(),\r\n\t} as IEmptyState;\r\n}\r\n","import { getCookie } from \"../utils/cookie\";\r\nimport {getRequest, postRequest} from \"../utils/fetch\";\r\nimport {objectToQueryString} from \"../utils/querystring\";\r\n\r\nexport interface IAlternativeColor {\r\n\treadonly predefinedProductName: string;\r\n\treadonly color: string;\r\n}\r\n\r\nexport interface IDesign {\r\n\treadonly packshotUrl: string;\r\n\treadonly defaultOptions: string;\r\n}\r\n\r\ninterface IGetDesignRequest {\r\n\tproductCode: string;\r\n\tdesignPredefinedProductName: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\ttheme: string;\r\n\tmobile: boolean;\r\n\talternativeIndex: boolean;\r\n}\r\n\r\nexport function getDesign(productCode: string, designPredefinedProductName: string, theme: string): Promise{\r\n\tconst request = {\r\n\t\tproductCode,\r\n\t\tdesignPredefinedProductName,\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tlanguage: window.context.language,\r\n\t\ttheme: theme,\r\n\t\tmobile: false,\r\n\t\talternativeIndex: getCookie('elastic') === 'alternative'\r\n\t} as IGetDesignRequest;\r\n\treturn postRequest(\"apicore/dspapi/getdesign\", request, { headers: { 'Content-type': 'application/json; charset=utf-8' } }).then(res => res as IDesign);\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 { createGeneralPageEventsAndComponents } from \"../components/page-general\";\r\nimport {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll, expressRemoveClass, getParentWithClassName, hasClass\r\n} from \"../common/html\";\r\nimport { createCustomSlider, ICustomPhotoSliderItem, ICustomPhotoSliderWithDivSettings } from \"../components/customslider\";\r\nimport { postRequest } from \"../utils/fetch\";\r\nimport { getParameter, updateParameter } from \"../utils/querystring\";\r\nimport { getProductCodeFromPvc, getOrientationFromPvc } from \"../utils/product\";\r\nimport {createProductGrid} from \"../components/product-grid\";\r\nimport {initPagedShowMoreElements, ShowMoreClickedReturn} from \"../components/show-more-elements\";\r\nimport { showLoadingDialog } from \"../popups/loading-dialog\";\r\nimport { createDesignSelectionPageDialog, IDesignSelectionPageDialog } from \"../popups/design-selection-page\";\r\nimport {getIcon, getIconsAsync} from \"../services/content-service\";\r\nimport {createEmptyState, IEmptyState} from \"../molecules/empty-state\";\r\nimport {getDesign} from \"../services/design-service\";\r\nimport { createPromotionBar } from \"../components/promotion-bar\";\r\nimport {getCookie} from \"../utils/cookie\";\r\nimport { sortGroupFilterValues } from \"../organisms/filters\";\r\n\r\n\r\nenum SearchSortColumns { OrderCounts, Top, New, PriceHighLow, PriceLowHigh }\r\n\r\nexport interface IDspSearchRequest {\r\n\tcurrentPage: number,\r\n\tforWho?: string[],\r\n\tforWhat?: string[],\r\n\tforWhen?: string[],\r\n\torientation?: string[],\r\n\tpredefinedProductCategory?: string[], // DesignStyle\r\n\tsearchColor?: string[],\r\n\tminImageCount?: number,\r\n\tmaxImageCount?: number,\r\n\tminPrice?: number,\r\n\tmaxPrice?: number,\r\n\tproductCode?: string[],\r\n\tmainProductCategoryGroupCode?: string[],\r\n\tdesignGroup?: string,\r\n\ttheme?: string,\r\n\tsortMethod?: SearchSortColumns,\r\n\tpromoCode?: string,\r\n\tdspEntrance: number\r\n}\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n\twindow.showMores = [];\r\n\tconst validateQueryString = (): { productVariant?: string, themeContentKey?: string, designGroup?: string } => {\r\n\t\tconst designGroup = getParameter('dg') ?? '';\r\n\t\tif (designGroup) return { designGroup: designGroup };\r\n\r\n\t\treturn {\r\n\t\t\tproductVariant: getParameter('pvc') ?? '',\r\n\t\t\tthemeContentKey: (getParameter('theme') ?? '').split(',')[0]\r\n\t\t};\r\n\t};\r\n\r\n\tconst dspContainerEl = expressQuerySelector(document, '.technical-dsp', true);\r\n\tconst dspEntrance = parseInt(dspContainerEl.dataset.entrance, 10);\r\n\tconst promoBar = expressQuerySelector(document, '.technical-promotion-bar', false);\r\n\tconst body = expressQuerySelector(document, \"body\", true);\r\n\tconst timeoutBeforeShowingLoadingDialog = parseInt(body.dataset.timeoutbeforeshowingloadingdialog ||\"200\", 10);\r\n\tconst timeoutBeforeShowingSkeletonScreen = parseInt(body.dataset.timeoutbeforeshowingskeletonscreen ||\"200\", 10);\r\n\tcreateGeneralPageEventsAndComponents();\r\n\tpromoBar && createPromotionBar(promoBar);\r\n\tconst popups: IDesignSelectionPageDialog[] = [];\r\n\tconst sliderContainer = expressQuerySelector(document, '.technical-sliders-container');\r\n\tconst { themeContentKey = '', productVariant= '', designGroup = '' } = validateQueryString();\r\n\tlet productCode = getProductCodeFromPvc(productVariant);\r\n\tlet orientation = getOrientationFromPvc(productVariant);\r\n\tconst isMobile = window.innerWidth <= 767;\r\n\tlet emptyState: IEmptyState;\r\n\r\n\tconst themeUsedForDesigns = dspContainerEl.dataset.themeusedfordesigns;\r\n\r\n\tconst updateGridTitle = (productName: string) => {\r\n\t\tconst productGridTitle = expressQuerySelector(dspContainerEl, '.technical-grid-title', false);\r\n\t\tif (productGridTitle) {\r\n\t\t\tconst titleLabel = productGridTitle.dataset.titlelabel || '';\r\n\t\t\tif (titleLabel && titleLabel.includes(\"{0}\") && productName) {\r\n\t\t\t\tproductGridTitle.innerHTML = titleLabel.replace(\"{0}\", productName);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst heightScriptButtons = (slider, height) => {\r\n\t\t// BUTTONS\r\n\t\tconst sliderButtons = expressQuerySelectorAll(slider, '.technical-slider-button');\r\n\t\tconst bottom = height / 2;\r\n\t\tconst buttonHeightAdjust = 18;\r\n\t\tfor (let i = 0, l = sliderButtons.length; i < l; i++) {\r\n\t\t\tsliderButtons[i].style.top = `${bottom - buttonHeightAdjust}px`;\r\n\t\t}\r\n\t};\r\n\r\n\tconst initPvcSlider = () => {\r\n\t\tif (!sliderContainer)\r\n\t\t\treturn;\r\n\r\n\t\t// init sliders\r\n\t\tconst sliders = expressQuerySelectorAll(document, '.technical-slider');\r\n\t\tsliders.forEach(slider => {\r\n\t\t\tconst sliderElements: ICustomPhotoSliderItem[] = [];\r\n\t\t\tfor (let z = 0, l = slider.children.length; z < l; z++)\r\n\t\t\t\tsliderElements.push({ template: slider.children[z] as HTMLElement });\r\n\r\n\t\t\tconst sliderSettings: ICustomPhotoSliderWithDivSettings = {\r\n\t\t\t\tsliderElements: sliderElements,\r\n\t\t\t\tsliderContainerSettings: {\r\n\t\t\t\t\textraSliderClass: 'm-product-slider__slider-container',\r\n\t\t\t\t\telementsContainerSettings: {\r\n\t\t\t\t\t\textraSliderClass: slider.dataset.sliderelementsextraclass,\r\n\t\t\t\t\t\tslideClicked: (e: Event, settings: ICustomPhotoSliderWithDivSettings) => {\r\n\t\t\t\t\t\t\tconst slideToActivate = ((e.target as HTMLElement).closest('.technical-slider-element') as HTMLElement);\r\n\t\t\t\t\t\t\tif(!slideToActivate) // when clicked between slides, their is no slide to activate\r\n\t\t\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t\t\tconst pvc = slideToActivate.dataset['pvc'];\r\n\t\t\t\t\t\t\tconst productGridTitleReplacement = slideToActivate.dataset['productgridtitlereplacement'];\r\n\t\t\t\t\t\t\tupdateGridTitle(productGridTitleReplacement);\r\n\t\t\t\t\t\t\tproductCode = getProductCodeFromPvc(pvc);\r\n\t\t\t\t\t\t\torientation = getOrientationFromPvc(pvc);\r\n\t\t\t\t\t\t\tproductGrid.reFilter(productGridEl);\r\n\r\n\t\t\t\t\t\t\tconst slideElements = (e.target as HTMLElement).closest('.technical-slider-elements');\r\n\t\t\t\t\t\t\tif (!slideToActivate || !slideElements || slideElements.children.length <= 0) return;\r\n\t\t\t\t\t\t\tfor (let i = 0; i < slideElements.children.length; i++) {\r\n\t\t\t\t\t\t\t\tslideElements.children[i].classList.toggle('m-product-slider__slide--active', slideElements.children[i] === slideToActivate);\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\tnextButton: {\r\n\t\t\t\t\t\tonClick: (_: Event, draggedSlider: boolean) => { return; }\r\n\t\t\t\t\t},\r\n\t\t\t\t\tpreviousButton: {\r\n\t\t\t\t\t\tonClick: (_: Event, draggedSlider: boolean) => { return; }\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tSliderCreated: (settings, initializedSlider, oldSlider) => {\r\n\t\t\t\t\tconst firstSlide = expressQuerySelectorAll(slider, '.technical-slide')[0];\r\n\t\t\t\t\tconst height = expressQuerySelector(firstSlide, '.m-product__link-container').clientHeight;\r\n\t\t\t\t\theightScriptButtons(initializedSlider, height);\r\n\r\n\t\t\t\t\t// Set PVC to the one selected\r\n\t\t\t\t\tconst activeSlides = expressQuerySelectorAll(initializedSlider, '.m-product-slider__slide--active');\r\n\t\t\t\t\tconst pvc = activeSlides[0].dataset.pvc;\r\n\t\t\t\t\tif (pvc) {\r\n\t\t\t\t\t\tproductCode = getProductCodeFromPvc(pvc);\r\n\t\t\t\t\t\torientation = getOrientationFromPvc(pvc);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tResizeEvent: (settings, slider) => { return; }\r\n\t\t\t};\r\n\t\t\tcreateCustomSlider(slider, sliderSettings);\r\n\t\t});\r\n\t};\r\n\r\n\tconst productContentEl = expressQuerySelector(dspContainerEl, '.m-product-grid__content', true);\r\n\r\n\tconst productTempUnavailableEls = expressQuerySelectorAll(productContentEl, \".m-product--temporarily-unavailable\");\r\n\tproductTempUnavailableEls.forEach(el => {\r\n\t\tconst icons = el.querySelectorAll(\".a-icon\");\r\n\t\ticons.forEach(icon => {\r\n\t\t\ticon.classList.add(\"a-icon--unavailable\");\r\n\t\t});\r\n\t});\r\n\r\n\tconst productGridEl = expressQuerySelector(dspContainerEl, '.technical-product-grid');\r\n\tconst showMoreElements = (currentPage: number, sizeDesktop = null, sizeMobile = null, sortMethod: string = null, selectedFilters: { [inputName: string]: string[] }): Promise => {\r\n\t\tif (currentPage == 1) {\r\n\t\t\tconst showMoreButton = expressQuerySelector(productGridEl, '.technical-showmore-button');\r\n\t\t\tconst allShown = showMoreButton.classList.contains('u-hide-on-desktop-full') || showMoreButton.classList.contains('u-hide-on-mobile-full');\r\n\t\t\treturn Promise.resolve({ allShownDesktop: allShown, allShownMobile: allShown } as ShowMoreClickedReturn);\r\n\t\t}\r\n\r\n\t\tconst price = selectedFilters ? selectedFilters['Pr'] : null;\r\n\t\tlet splitPrice: string[] = null;\r\n\t\tif (price && price.length > 0) {\r\n\t\t\tsplitPrice = (price[0].split('_')[1] || price[0]).split('-');\r\n\t\t}\r\n\r\n\t\tconst imageCount = selectedFilters && selectedFilters['Ic'];\r\n\t\tconst splitImageCount = imageCount && (imageCount[imageCount.length - 1]?.split('_')[1] || imageCount[imageCount.length - 1])?.split('-');\r\n\r\n\t\treturn showLoadingDialog(postRequest('/apicore/dspapi/getdesigns',\r\n\t\t\t{\r\n\t\t\t\tcurrentPage: currentPage,\r\n\t\t\t\ttheme: themeUsedForDesigns,\r\n\t\t\t\tforWho: selectedFilters ? selectedFilters['ForWho'] : null,\r\n\t\t\t\tforWhat: selectedFilters ? selectedFilters['ForWhat'] : null,\r\n\t\t\t\tforWhen: selectedFilters ? selectedFilters['ForWhen'] : null,\r\n\t\t\t\tdesignGroup: designGroup,\r\n\t\t\t\tproductCode: [productCode],\r\n\t\t\t\tpredefinedProductCategory: selectedFilters ? selectedFilters['Ppc'] : null,\r\n\t\t\t\tmainProductCategoryGroupCode: selectedFilters ? selectedFilters['Pcg'] : null,\r\n\t\t\t\tsearchColor: selectedFilters ? selectedFilters['Sc'] : null,\r\n\t\t\t\tmaxImageCount: splitImageCount ? +(splitImageCount[1] || splitImageCount[0]) : null,\r\n\t\t\t\tminImageCount: splitImageCount ? +(splitImageCount[0]) : null,\r\n\t\t\t\tmaxPrice: splitPrice ? parseInt(splitPrice[1]) : null,\r\n\t\t\t\tminPrice: splitPrice ? parseInt(splitPrice[0]) : null,\r\n\t\t\t\torientation: [orientation],\r\n\t\t\t\tsortMethod: sortMethodToApiSortMethod(sortMethod || getParameter('sortmethod[0]')),\r\n\t\t\t\tpromoCode: getParameter(\"epc\") || getCookie(\"promo\"),\r\n\t\t\t\tdspEntrance: dspEntrance\r\n\t\t\t},\r\n\t\t\t{ headers: { 'Content-type': 'application/json; charset=utf-8' } }\r\n\t\t).then(x => {\r\n\t\t\tconst parser = new DOMParser();\r\n\t\t\tconst doc = parser.parseFromString(x.tiles, 'text/html');\r\n\r\n\t\t\tconst productTiles = expressQuerySelector(dspContainerEl, '.technical-product-grid-content');\r\n\t\t\tdoc.body.childNodes.forEach(x => {\r\n\t\t\t\tproductTiles.appendChild(x);\r\n\t\t\t\tloadIcons(x as HTMLElement);\r\n\t\t\t\taddTileOnClick(x as HTMLElement);\r\n\t\t\t});\r\n\r\n\t\t\tupdateFromLabelInYourSelection(Array.from(doc.body.children));\r\n\r\n\t\t\treturn {\r\n\t\t\t\tallShownDesktop: x.allShownDesktop,\r\n\t\t\t\tallShownMobile: x.allShownMobile,\r\n\t\t\t} as ShowMoreClickedReturn;\r\n\t\t}), timeoutBeforeShowingLoadingDialog);\r\n\t};\r\n\r\n\tconst addTileOnClick = (el: HTMLElement) => {\r\n\t\tconst links = expressQuerySelectorAll(el, `a[href='#'],.a-icon`);\r\n\t\tlinks.forEach(x => {\r\n\t\t\texpressEventListener(x, 'click', (e) => el.dataset.tempunavailable === 'false' ? onDetailsPopupTriggerElClick(e, el) : e.preventDefault());\r\n\t\t});\r\n\t};\r\n\r\n\tconst sortMethodToApiSortMethod = (method: string) => {\r\n\t\tswitch (method) {\r\n\t\t\tcase 'default': return SearchSortColumns.OrderCounts;\r\n\t\t\tcase 'price-high-low': return SearchSortColumns.PriceHighLow;\r\n\t\t\tcase 'price-low-high': return SearchSortColumns.PriceLowHigh;\r\n\t\t\tcase 'top': return SearchSortColumns.Top;\r\n\t\t\tcase 'new': return SearchSortColumns.New;\r\n\t\t\tdefault: return undefined;\r\n\t\t}\r\n\t};\r\n\r\n\t// { allShownDesktop: boolean, allShownMobile: boolean, tiles: string }\r\n\tconst getDesignTiles = (body: IDspSearchRequest) => postRequest('/apicore/dspapi/getdesigns', body, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n\tconst getFilters = (body: IDspSearchRequest) => postRequest('/apicore/dspapi/getfilters', body, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\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\r\n\tconst filterProductGrid = (grid: HTMLElement, filterName: string = null, sortMethod: string = null, selectedFilters: { [inputName: string]: string[] } = null) => {\r\n\t\tselectedFilters = selectedFilters || {};\r\n\t\tconst button = expressQuerySelector(dspContainerEl, '.technical-showmore-button', false);\r\n\r\n\t\tconst reset = filterName === 'reset' || (selectedFilters && (Object.keys(selectedFilters).every(x => !selectedFilters[x] || selectedFilters[x].length === 0) || Object.keys(selectedFilters).length === 0));\r\n\t\tif (reset && !sortMethod) {\r\n\t\t\thistory.replaceState(null, '', updateParameter('currentpage[0]', ''));\r\n\t\t\tbutton.dataset.currentpage = '1';\r\n\t\t}\r\n\r\n\t\tconst urlParam = parseInt(getParameter('currentpage[0]'));\r\n\t\tconst currentPage = isNaN(urlParam) ? 1 : urlParam;\r\n\t\tconst imageCount = selectedFilters['Ic'];\r\n\t\tconst splitImageCount = imageCount && (imageCount[imageCount.length - 1]?.split('_')[1] || imageCount[imageCount.length - 1])?.split('-');\r\n\t\tconst priceFilter = selectedFilters['Pr'];\r\n\t\tconst price = priceFilter && (priceFilter[priceFilter.length - 1]?.split('_')[1] || priceFilter[priceFilter.length - 1])?.split('-');\r\n\r\n\t\tconst dspData = {\r\n\t\t\t// Stuff from JS variables\r\n\t\t\tcurrentPage: currentPage,\r\n\r\n\t\t\t// Stuff from querystring that never changes\r\n\t\t\tdesignGroup: getParameter('dg'),\r\n\t\t\ttheme: themeUsedForDesigns,\r\n\r\n\t\t\t// Stuff from filters that changes each click\r\n\t\t\tforWho: selectedFilters['ForWho'],\r\n\t\t\tforWhat: selectedFilters['ForWhat'],\r\n\t\t\tforWhen: selectedFilters['ForWhen'],\r\n\t\t\tmainProductCategoryGroupCode: selectedFilters['Pcg'],\r\n\t\t\torientation: [orientation],\r\n\t\t\tmaxImageCount: splitImageCount ? +(splitImageCount[1] || splitImageCount[0]) : null,\r\n\t\t\tminImageCount: splitImageCount ? +splitImageCount[0] : null,\r\n\t\t\tmaxPrice: +(price && price[1]),\r\n\t\t\tminPrice: +(price && price[0]),\r\n\t\t\t// theme: getParameter('theme'),\r\n\t\t\tsearchColor: selectedFilters['Sc'],\r\n\t\t\tproductCode: [productCode],\r\n\t\t\tpredefinedProductCategory: selectedFilters['Ppc'],\r\n\t\t\tsortMethod: sortMethodToApiSortMethod(sortMethod || getParameter('sortmethod[0]')),\r\n\t\t\tpromoCode: getParameter(\"epc\") || getCookie(\"promo\"),\r\n\t\t\tdspEntrance: dspEntrance\r\n\t\t} as IDspSearchRequest;\r\n\r\n\t\t// reset button\r\n\t\tbutton && button.classList.toggle('u-hide', true);\r\n\t\tbutton && button.parentElement && button.parentElement.classList.toggle('u-hide-on-desktop-full', true);\r\n\t\tbutton && button.parentElement && button.parentElement.classList.toggle('u-hide-on-mobile-full', true);\r\n\r\n\t\tconst designCount = expressQuerySelector(dspContainerEl, '.technical-amount-of-tiles');\r\n\r\n\t\t// replace tiles\r\n\t\tconst productTiles = expressQuerySelector(grid, '.technical-product-grid-content');\r\n\t\tproductTiles.innerHTML = '';\r\n\t\temptyState && emptyState.dispose();\r\n\t\tconst parser = new DOMParser();\r\n\r\n\t\t// reset filters/ designs\r\n\t\tconst pageArray = Array.from({ length: currentPage }, (_, i) => i + 1);\r\n\t\tshowLoadingDialog(Promise.all([getFilters(dspData), ...pageArray.map(i => { dspData.currentPage = i; return getDesignTiles(dspData); })]).then(result => {\r\n\t\t\t// replace count filters\r\n\t\t\tconst filters = result.shift();\r\n\t\t\tif (!filters) return;\r\n\t\t\tlet totalTiles = 0;\r\n\t\t\tconst htmlFilters = expressQuerySelectorAll(dspContainerEl, '.technical-filter');\r\n\t\t\thtmlFilters.forEach(htmlFilter => {\r\n\t\t\t\tconst filter = filters.find(x => htmlFilter.dataset.filterqs === x.code);\r\n\t\t\t\tconst htmlFilterValues = expressQuerySelectorAll(htmlFilter, '.technical-filter-value');\r\n\r\n\t\t\t\thtmlFilterValues.forEach(htmlFilterValue => {\r\n\t\t\t\t\tconst filterValue = filter ? filter.values.find(fv => htmlFilterValue.dataset.filterkey.toLowerCase() === fv.key.toLowerCase()) || { count: 0 } : { count: 0 };\r\n\r\n\t\t\t\t\tconst label = expressQuerySelector(htmlFilterValue, 'label', false);\r\n\t\t\t\t\tconst labelText = label && expressQuerySelector(label, '.technical-label', false);\r\n\t\t\t\t\tconst input = expressQuerySelector(htmlFilterValue, 'input', false);\r\n\t\t\t\t\tconst icon = expressQuerySelector(htmlFilterValue, 'i', false);\r\n\r\n\t\t\t\t\tif (labelText) {\r\n\t\t\t\t\t\tconst indexCount = labelText.textContent.lastIndexOf('(');\r\n\t\t\t\t\t\tlabelText.textContent = labelText.textContent.substring(0, indexCount) + `(${filterValue.count})`;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst shouldFilterBeDisabled = ((input && !input.checked) || (icon && !htmlFilterValue.classList.contains('a-icon--selected'))) && filterValue.count === 0;\r\n\t\t\t\t\thtmlFilterValue.classList.toggle(icon ? 'a-icon--disabled' : 'a-form-input--disabled', shouldFilterBeDisabled);\r\n\t\t\t\t\tinput && input.toggleAttribute('disabled', shouldFilterBeDisabled);\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// WEB-9628: Group disabled filter values and move them to the end of de list\r\n\t\t\t\tif (htmlFilter.dataset.typeoffilter !== \"Slider\") sortGroupFilterValues(htmlFilterValues, htmlFilter);\r\n\t\t\t});\r\n\r\n\t\t\t// add tiles paged\r\n\t\t\tresult.sort(r => (r as any).currentPage).forEach(res => {\r\n\t\t\t\tconst { tiles, allShownDesktop, allShownMobile, count } = res as any;\r\n\t\t\t\ttotalTiles = count;\r\n\t\t\t\tconst doc = parser.parseFromString(tiles, 'text/html');\r\n\t\t\t\tconst productTiles = expressQuerySelector(dspContainerEl, '.technical-product-grid-content');\r\n\t\t\t\tif (doc.body.childNodes.length > 0) {\r\n\t\t\t\t\temptyState && emptyState.hide();\r\n\t\t\t\t\tdoc.body.childNodes.forEach(x => {\r\n\t\t\t\t\t\tproductTiles.appendChild(x);\r\n\t\t\t\t\t\tloadIcons(x as HTMLElement);\r\n\t\t\t\t\t\taddTileOnClick(x as HTMLElement);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// toggle show more\r\n\t\t\t\tbutton && button.classList.toggle('u-hide', allShownDesktop && allShownMobile);\r\n\t\t\t\tbutton && button.parentElement && button.parentElement.classList.toggle('u-hide-on-desktop-full', allShownDesktop);\r\n\t\t\t\tbutton && button.parentElement && button.parentElement.classList.toggle('u-hide-on-mobile-full', allShownMobile);\r\n\t\t\t\tbutton && button.parentElement && button.parentElement.classList.toggle('u-hide', allShownDesktop && allShownMobile);\r\n\r\n\t\t\t\t// update count\r\n\t\t\t\tdesignCount.innerHTML = count > 1\r\n\t\t\t\t\t? designCount.dataset['multi'].replace(\"{0}\", count)\r\n\t\t\t\t\t: designCount.innerHTML = designCount.dataset['single'];\r\n\t\t\t\tdesignCount.classList.toggle('u-hide', count <= 0);\r\n\r\n\t\t\t\tupdateFromLabelInYourSelection(Array.from(doc.body.children));\r\n\t\t\t});\r\n\r\n\t\t\tif (emptyStateEl && totalTiles === 0) {\r\n\t\t\t\tproductTiles.appendChild(emptyStateEl);\r\n\t\t\t\temptyState.dispose();\r\n\t\t\t\temptyState = createEmptyState(emptyStateEl, { onResetButtonClick: productGrid.resetFilter, onShow: () => productGrid.disableSort(true), onHide: () => productGrid.disableSort(false) });\r\n\t\t\t\temptyState.show();\r\n\t\t\t}\r\n\r\n\t\t\tif (sortMethod) {\r\n\t\t\t\tlet url = location.href;\r\n\t\t\t\tif (sortMethod === 'default')\r\n\t\t\t\t\turl = updateParameter('sortmethod[0]', '', url);\r\n\t\t\t\telse\r\n\t\t\t\t\turl = updateParameter('sortmethod[0]', sortMethod, url);\r\n\t\t\t\tif (url != location.href)\r\n\t\t\t\t\thistory.replaceState(null, '', url.toLowerCase());\r\n\t\t\t}\r\n\r\n\t\t\tcalculateHackFor2TilesOnLastLine(grid);\r\n\r\n\t\t\tif (!reset) return;\r\n\r\n\t\t\t// reset show more button\r\n\t\t\tif (window.showMores[0])\r\n\t\t\t\twindow.showMores[0].dispose();\r\n\t\t\twindow.showMores[0] = initPagedShowMoreElements(grid, button, 'currentpage', null, 0, (currentPage: number) => showMoreElements(currentPage, null, null, sortMethod, selectedFilters), () => calculateHackFor2TilesOnLastLine(grid));\r\n\r\n\t\t}), timeoutBeforeShowingLoadingDialog);\r\n\t};\r\n\r\n\tconst updateFromLabelInYourSelection = (childNodes: Element[]) => {\r\n\t\t// update from in your selection\r\n\t\tconst selectionFromEl = expressQuerySelector(document, \".technical-selection-from\", false);\r\n\t\tif (!selectionFromEl) return;\r\n\t\tconst currentPrice = parseInt(selectionFromEl.dataset.price || '0', 10);\r\n\t\tconst newTilePrices = childNodes.map(el => {\r\n\t\t\tconst tile = expressQuerySelector(el, '.technical-tile', true);\r\n\t\t\treturn parseInt(tile.dataset.sortPrice || '0', 10);\r\n\t\t});\r\n\t\tif (hasClass(selectionFromEl, 'u-hide') && newTilePrices.filter(p => p !== currentPrice).length > 0) {\r\n\t\t\texpressRemoveClass(selectionFromEl, 'u-hide');\r\n\t\t}\r\n\t};\r\n\r\n\tconst productGrid = createProductGrid(productGridEl, { showMoreClick: showMoreElements, filterGrid: filterProductGrid, enableShowLess: true }, { refreshOnResize: false });\r\n\tconst emptyStateEl = expressQuerySelector(productContentEl, '.technical-no-elements', false);\r\n\tif (emptyStateEl) emptyState = createEmptyState(emptyStateEl, { onResetButtonClick: productGrid.resetFilter, onShow: () => productGrid.disableSort(true), onHide: () => productGrid.disableSort(false)});\r\n\r\n\t// Init the product detail popup for each tile\r\n\tconst tileEls = expressQuerySelectorAll(productGridEl, '.m-product--dsp-tile');\r\n\r\n\tconst loadIcons = (tileEl: HTMLElement) => {\r\n\t\tconst iconEls = expressQuerySelectorAll(tileEl, '.a-icon');\r\n\t\tif (iconEls && iconEls.length > 0) {\r\n\t\t\tconst iconContentKeyDataAttribute = \"data-iconcontentkey\";\r\n\t\t\tconst iconsWithoutSvg = iconEls.filter(el => !expressQuerySelector(el, 'svg', false));\r\n\t\t\tconst iconKeys = iconsWithoutSvg.map(el => el.getAttribute(iconContentKeyDataAttribute) || \"\");\r\n\t\t\tgetIconsAsync(iconKeys.filter((x, i, a) => a.indexOf(x) == i)).then(_ => {\r\n\t\t\t\ticonsWithoutSvg.forEach(el => {\r\n\t\t\t\t\tif (el.hasAttribute(iconContentKeyDataAttribute)) {\r\n\t\t\t\t\t\tconst iconContentKey = el.getAttribute(iconContentKeyDataAttribute);\r\n\t\t\t\t\t\tif (iconContentKey) {\r\n\t\t\t\t\t\t\tconst icon = getIcon(iconContentKey.toLocaleLowerCase().replace(\"icon.\", \"\"));\r\n\t\t\t\t\t\t\tif (icon) {\r\n\t\t\t\t\t\t\t\tfetch(icon)\r\n\t\t\t\t\t\t\t\t\t.then(response => response.text())\r\n\t\t\t\t\t\t\t\t\t.then(svg => {\r\n\t\t\t\t\t\t\t\t\t\tconst iEl = expressQuerySelector(el, '.a-icon__icon', true);\r\n\t\t\t\t\t\t\t\t\t\tif (!iEl.innerText) iEl.insertAdjacentHTML(\"afterbegin\", svg);\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}\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\tconst onDetailsPopupTriggerElClick = async (e: MouseEvent, tile: HTMLElement) => {\r\n\t\tconst targetEl = e.target as HTMLElement;\r\n\t\te.preventDefault();\r\n\t\tconst clickedIconEL = targetEl.classList.contains('technical-icon-alternative-color') ? targetEl : getParentWithClassName(targetEl,'technical-icon-alternative-color') as HTMLElement;\r\n\t\tif (clickedIconEL) {\r\n\t\t\tconst removeSelectedIconItems = () => {\r\n\t\t\t\tconst iconSelEl = getParentWithClassName(targetEl, 'technical-icon-set');\r\n\t\t\t\tif (iconSelEl) {\r\n\t\t\t\t\tconst iconEls = expressQuerySelectorAll(iconSelEl, '.technical-icon-alternative-color');\r\n\t\t\t\t\ticonEls.forEach(iconEl => {\r\n\t\t\t\t\t\texpressRemoveClass(iconEl, 'a-icon--selected');\r\n\t\t\t\t\t\texpressAddClass(iconEl, 'a-icon--unselected');\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tconst selectIconEl = (iconEl: HTMLElement) => {\r\n\t\t\t\texpressRemoveClass(iconEl, 'a-icon--unselected');\r\n\t\t\t\texpressAddClass(iconEl, 'a-icon--selected');\r\n\t\t\t};\r\n\r\n\t\t\t// Change this on the tile in order to open the popup with the selected color\r\n\t\t\ttile.dataset.ppn = clickedIconEL.dataset.predefinedproductname;\r\n\t\t\ttile.dataset.defaultoptions = clickedIconEL.dataset.defaultoptions || tile.dataset.defaultoptions || '';\r\n\t\t\tconst packShotImgEl = expressQuerySelector(tile, 'img.m-product__img', true);\r\n\t\t\tif (clickedIconEL.dataset.packshoturl && packShotImgEl.src !== clickedIconEL.dataset.packshoturl) {\r\n\t\t\t\tpackShotImgEl.src = clickedIconEL.dataset.packshoturl;\r\n\t\t\t\tremoveSelectedIconItems();\r\n\t\t\t\tselectIconEl(clickedIconEL);\r\n\t\t\t} else {\r\n\t\t\t\tgetDesign(tile.dataset.productcode || '', clickedIconEL.dataset.predefinedproductname || '', themeUsedForDesigns || '')\r\n\t\t\t\t\t.then(res => {\r\n\t\t\t\t\t\tif (res && res.packshotUrl) {\r\n\t\t\t\t\t\t\tif (packShotImgEl.src !== res.packshotUrl) {\r\n\t\t\t\t\t\t\t\tpackShotImgEl.src = res.packshotUrl;\r\n\t\t\t\t\t\t\t\tremoveSelectedIconItems();\r\n\t\t\t\t\t\t\t\tselectIconEl(clickedIconEL);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tclickedIconEL.dataset.packshoturl = res.packshotUrl;\r\n\t\t\t\t\t\t\tclickedIconEL.dataset.defaultoptions = res.defaultOptions || '';\r\n\t\t\t\t\t\t\ttile.dataset.defaultoptions = res.defaultOptions || '';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tawait openPopupForDesign(tile);\r\n\t\t}\r\n\t};\r\n\r\n\tconst openPopupForDesign = async (tile: HTMLElement) => {\r\n\t\tconst defaultProductCode = tile.dataset.productcode || '';\r\n\t\tconst defaultPreDefinedProductName = tile.dataset.predefinedproductname || '';\r\n\t\tconst productCode = getParameter('pc') || '';\r\n\t\tconst productCategory = tile.dataset.productcategory || '';\r\n\t\tconst preDefinedProductName = getParameter('ppn') || (tile.dataset.ppn && tile.dataset.predefinedproductname !== tile.dataset.ppn ? tile.dataset.ppn : '');\r\n\t\tconst aspectRatio = tile.dataset.aspectratio || '';\r\n\t\tconst designGroup = tile.dataset.designgroup || '';\r\n\t\tconst pvc = tile.dataset.pvc || '';\r\n\t\tconst defaultOptions = tile.dataset.defaultoptions || '';\r\n\t\tconst packShot = expressQuerySelector(tile, \"img.m-product__img\", false);\r\n\t\tconst packShotUri = !productCode && !preDefinedProductName && packShot ? packShot.src : '';\r\n\t\tconst contentTheme = tile.dataset.contenttheme || '';\r\n\t\tconst popupId = 'DesignSelectionPageDialog-' + (productCode || defaultProductCode) + '_' + productCategory + '-' + (preDefinedProductName || defaultPreDefinedProductName) + '-' + designGroup + '-' + aspectRatio + '-' + pvc;\r\n\t\tlet popup = popups.find(p => p.getId() === popupId);\r\n\t\tupdateUrl(defaultProductCode, defaultPreDefinedProductName, productCode, preDefinedProductName, defaultOptions);\r\n\t\tif (popup) {\r\n\t\t\tpopup.resetOtherFormatSpecificClass();\r\n\t\t\tpopup.open();\r\n\t\t} else {\r\n\t\t\tpopup = await showLoadingDialog(createDesignSelectionPageDialog(defaultProductCode, productCode, productCategory, defaultPreDefinedProductName, preDefinedProductName, aspectRatio, designGroup, packShotUri, contentTheme, pvc, timeoutBeforeShowingSkeletonScreen, parseInt(dspContainerEl.dataset.entrance || '0')), timeoutBeforeShowingLoadingDialog);\r\n\t\t\tpopups.push(popup);\r\n\t\t\tpopup.open();\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateUrl = (defaultProductCode: string, defaultPreDefinedProductName: string, productCode: string, preDefinedProductName: string, defaultOptions: string) => {\r\n\t\tlet url = window.location.href;\r\n\t\turl = updateParameter('dt', defaultProductCode + '|' + defaultPreDefinedProductName, url);\r\n\t\turl = updateParameter('pc', productCode, url);\r\n\t\turl = updateParameter('ppn', preDefinedProductName, url);\r\n\t\turl = updateParameter('options', defaultOptions || '', url);\r\n\t\twindow.history.replaceState(null, null, url);\r\n\t};\r\n\r\n\ttileEls.forEach(el => {\r\n\t\tloadIcons(el);\r\n\t\taddTileOnClick(el);\r\n\t});\r\n\r\n\t// Init slider if a theme entrance\r\n\tif (themeContentKey && !productVariant && !designGroup)\r\n\t\tinitPvcSlider();\r\n\r\n\t// try open popup from url params\r\n\tconst defaultTile = getParameter('dt');\r\n\tconst dtItems = defaultTile ? decodeURI(defaultTile).split('|') : [];\r\n\tconst defaultProductCode = dtItems[0]?.toLocaleLowerCase() || decodeURI(getParameter('cpc'))?.toLocaleLowerCase();\r\n\tconst defaultPreDefinedProductName = dtItems[1]?.toLocaleLowerCase() || decodeURI(getParameter('cppn'))?.toLocaleLowerCase();\r\n\tconst designToOpenInPopup = expressQuerySelector(productGridEl, `[data-productcode='${defaultProductCode}'][data-predefinedproductname='${defaultPreDefinedProductName}']`, false);\r\n\tif (designToOpenInPopup) {\r\n\t\topenPopupForDesign(designToOpenInPopup);\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","getSelfOrParentWithClassName","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","disableUserEvents","blockingEvents","map","e","blockEvent","forEach","blockedEvent","preventDefault","stopPropagation","pageVisibilityChange","onVisible","onHidden","hidden","visibilityState","visibilityChange","mozHidden","msHidden","webkitHidden","setTimeout","createClickableElement","onClick","options","clickEvent","enable","disable","onClicked","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","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","debounce","fn","delay","timeoutID","args","apply","throttle","fnAlways","lastTimestamp","now","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","createSingleSlider","sendPartialUpdateForInput","sliderMaxRangeEl","sliderLabelEls","snappingArray","disposableEvents","orderLabels","singleValueToTheLeft","labelEl","index","valueToTheLeft","snappingPos","snappingValue","onLabelClick","currentLabelEl","currentTarget","createTextInputWithAutoComplete","onCloseDisposable","autoCompleteSearch","onOpen","onClose","renderTextContent","containerInsertPosition","containerClass","autocompleteResult","itemEl","insertAdjacentElement","onMouseDownEvent","Gender","UpdateAccountResult","ChangePasswordStatus","OkResult","initForm","formEl","alternativeButton","onSubmitForm","buttonSelector","submitOnEnter","validatorOptions","showFirstErrorOnValidate","enablePartialSubmit","partialSubmit","submitButtonEl","validator","createFormValidator","onKeyUpEvent","formElements","inputs","invalidFormFields","isValid","filter","email","attributes","getNamedItem","maxLength","id","getInputs","keys","clearAll","clearValues","resetValidation","reset","validate","validations","name","all","onSubmit","data","formData","submitButton","debounceOnFormInput","getInputByName","disableForm","disableInput","setErrors","errors","clearInputs","names","clearInput","setValues","values","v","hideInput","getAllVisibleInputs","visibleInputs","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","ProductEvent","trackShopInShopEvent","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","initNavigationDesktop","firstLevelMenuEls","loadDesktopMenuItemAsync","loadedMenuItemsKeys","firstLevelActiveClass","closeMenu","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","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","min","max","sliderId","checkboxId","sliderEl","checkMobileAndSetCookie","header","initCollapsingPanels","showcountryselection","closeCountrySelectionPopup","toISOString","isbot","initFooterComponent","disableLeaveIntent","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","elementsEl","firstVisibleElement","prevButton","disposableDragTouchEvents","disposableDragMouseEvents","sliderPxX","widthBeforeResize","mouseDownOnSlider","startSliderDragX","currentSliderDragX","isDragged","disableSliderDragging","preventPageScrolling","preventSliderDragging","prevSliderWidth","ioSlider","getSliderTemplate","InitializedEvent","checkEdgesAndMove","addDefaultEventListeners","resizeObserver","dragStart","enableKeyboardNavigation","onKeyDown","scrollStart","addPrevNextBtnEventListeners","previousEvent","nextEvent","ResizeObserver","contentRect","resize","code","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","getProductCodeFromPvc","dashPos","tildePos","getAspectRatioFromPvc","Orientation","freeze","Undefined","Horizontal","Vertical","Square","getOrientationFromPvc","getOrientationFromAspectRatio","aspectRatio","parts","isNaN","initPagedShowMoreElements","parameter","elementSelector","arrayCounter","showmoreClick","afterShowMore","elementElsDesktop","elementElsMobile","batchSizeDesktop","batchSizeMobile","showAllOnMore","urlParam","currentPage","currentpage","toggleButtonVisibility","allDesktopVisible","allMobileVisible","showElements","sizeMobile","sizeDesktop","allShownDesktop","allShownMobile","showMore","urlParameter","resetElement","initShowMoreElements","showMoreClick","buttonTextEl","buttonIconEl","reFetchElements","updateUrl","shouldUpdateUrl","showLess","baseamount","setShowLess","lesstext","setShowMore","moretext","findInsertIndex","arr","getIndexOfElement","start","end","mid","TemplateType","TypeOfFilter","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","preBarEl","postBarEl","rangeEl","minRangeInputEl","maxRangeInputEl","minBubbleContainerEl","maxBubbleContainerEl","minRangeThumbEl","maxRangeThumbEl","minBubbleInputEl","maxBubbleInputEl","originalMinValue","originalMaxValue","timeout","currentMinValue","currentMaxValue","previousMinValue","previousMaxValue","percent","moveToTop","zIndex","minValue","maxValue","setMinValue","setMaxValue","percentStyle","updateMinBar","reversePercentStyle","updateMaxBar","performFiltering","updateQuerystring","isNoneInputSelected","Slider","removeRangeFilter","triggerFilter","getSliderValue","some","isNoneSelected","checkedOptionValue","valueOverride","toggleOption","selectOptionValue","originalSliderValue","isFilterActive","filterValue","currentEl","chk","toggleSlider","selectedOption","querystringCorrected","sliderCompletelyOnMax","onBubbleInputElConfirm","onInput","fixWrongValue","correctionValue","targetValue","minRangeInputElValue","minRangeInputElMinValue","maxRangeInputElValue","maxRangeInputElMaxValue","addHandlers","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","k","filterCategoryToCheck","tagIds","gridAmount","multi","single","refilter","productGrid","filterCreateForOneGrid","filterContainer","multiselect","updateValue","gridToFilter","previousSelectedValue","filteredOutValue","mobileButton","mobileContainer","onClickMobile","sortElMobile","selectedSortingValue","selectedIndex","refreshOnResize","isMobileOnResize","refreshFiltersAndSortingOnWindowResize","resetAllFilters","reFilter","showLoadingDialog","promise","timeToShowLoadingDialog","extraTimeOutAfterResolving","timeoutToDisableLoadingDialog","htmlEl","bodyEl","dialogEl","toggleClasses","blockingEventDisposables","manualTimeoutToDisableLoadingDialog","disableLoadingDialog","createAmount","subtractEl","addEl","amountValueEl","minAmountFormAttribute","minamount","minAmount","maxAmount","maxamount","onSubtractClick","onAddClick","onManualInput","updateDisabledButtons","currentAmount","getCurrentValue","getCode","attributecode","missingKeys","getIconByKey","contentKeys","addIcons","getIcon","defaultContent","filtered","keyVal","iconsToAdd","containsKey","getPrice","quantity","variableAmount","promoCode","forceQuantityBreak","GetPriceResult","formatPrice","formattedPrice","replaceDecimalSeparatorInPrice","decimalSeparator","toFixed","removeCurrencySymbolFormUpperFunnelPages","Amount","Currency","DecimalSeparator","DisplayLeftToPrice","CurrencySymbol","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","CarrouselItemType","SideButtonOption","createCarrousel","sliderComponents","currentlySelectedEl","VIDEO_EXTENSIONS","youtubePlayer","GetHtmlElementWidthWithMargins","resizeSliderElements","sliderChildren","iframesInSlider","sliderWidthForIframe","iframe","onSideButtonClicked","eyeCatcher","option","updateImageCount","Prev","lastElementChild","nextElementSibling","firstElementChild","changeSelectedElement","bottomSlider","isFullyVisible","containerRect","isElementVisibleInContainer","sliderComponent","imageCountEl","newElement","sliders","clickedItemTemplate","imgs","getElementsByTagName","clickedItemTemplateSrc","HTMLVideoElement","sliderItemTemplate","HTMLIFrameElement","sliderEyeCatchers","clickedEl","sliderButtonRight","sliderButtonLeft","sliderElementsEl","extraDivForStyling","videoPlayers","videoPlayerContainer","initFormatImage","firstEl","moveBottomSliderToSelectedItem","topSlider","topSliderSelectedItem","bottomSliderToSelectEl","reInit","reStart","slideEls","addAndSelectElement","imgSrc","reverse","formatImageContainerTemplate","extension","lastIndexOf","isPreviewSlider","videoContainer","preload","crossOrigin","playsInline","videoContainerSource","sourceEl","srcset","endsWith","elementStyle","sliderSettings","removeFirstElementAndSelect","itemType","FormatImage","currentSelected","PackShot","newUrl","sliderIndex","visiblePhotoEl","goToSlide","createDesignSelectionPageDialog","defaultProductCode","productCode","productCategory","defaultPreDefinedProductName","preDefinedProductName","designGroup","packShotUrl","contentTheme","timeoutBeforeShowingSkeletonScreen","entrance","popupContents","priceRequests","optionPricePopups","sampleButtonEls","amountEls","priceEls","optionSelect","iconEls","infoIconEls","collapsibleArray","otherFormatLinkEl","amountArray","tooltips","popupId","currentProductCode","currentPvc","currentPredefinedProductName","dt","carrouselEl","unSelectableDefaultOptionsFormUrl","emptyOtherFormatPopupContent","currentAspectRatio","hasUserSelectedOptions","hasUserSelectedIconOptions","getColorFromPredefinedProductName","predefinedProductName","createPopupContentKey","getSelectedOptions","skipUserSelectedCheck","selectedDropDownOption","selectedIconOption","optioncode","unselectableOption","setSelectedIcon","iconSetEl","addSkeleton","removeSkeleton","getAndSetPrice","updatePriceAndInfo","infoTooltipEl","priceDetails","templateEl","Price","PriceItems","Description","CalculationDescription","ItemTotal","newEl","description","calculation","priceResult","quantitypricebreak","getAmount","forceQuantityBreakInt","savedPriceRequest","getUpdatedPrice","infoIconEl","amountEl","link","amountString","skeletonTimeout","updatePopupContent","clickedIconEl","existingPopupContent","pc","carrousel","updateQuantity","setUnselectableOptions","defaultoptions","theme","forWho","_j","forWhat","_k","forWhen","_l","selectedQuantity","node","popupContentEl","isDefault","initMode","initCarrousel","initOptionPriceInfoLinks","moreInfoLinkEls","initOptionPricesMoreInfoLink","moreInfoLinkEl","showOptionPricePopup","contentkey","uniqueId","productCategoryOptionContentKey","pvcSelect","quantityBreakListItemContainer","quantityBreakListItems","noOptionsDiv","onChange","pvcSelectChange","selectedValue","visibleItems","o","initPopupLaunchers","toggleShowMore","arrow","toggleShowMoreEvent","collapsableDeps","onSampleButtonClick","updatePrice","totalEl","getQuantity","productcode","aspectration","predefinedproductname","iconContentKeyDataAttribute","iconsWithoutSvg","iconContentKey","toLocaleLowerCase","iEl","onIconCLick","aspectratio","productCategoryGroup","otherFormatLinkClick","addFormatPopupHandlers","formatPopup","backIconEl","onBackIconClick","currentPopupKey","gridEl","anchorEl","updatePopupCode","codeParts","intValue","defaultOptions","optionSelectOptions","altOptions","opt","crossSellFrom","queryOptions","iconOption","viewedUniqueSkuWithDesign","uniqueskuwithdesign","getId","resetOtherFormatSpecificClass","createEmptyState","resetButtonEl","onResetButtonClick","onShow","onHide","getDesign","designPredefinedProductName","alternativeIndex","createPromotionBar","SearchSortColumns","dspContainerEl","dspEntrance","promoBar","timeoutBeforeShowingLoadingDialog","timeoutbeforeshowingloadingdialog","timeoutbeforeshowingskeletonscreen","popups","sliderContainer","themeContentKey","productVariant","validateQueryString","emptyState","orientation","themeUsedForDesigns","themeusedfordesigns","productContentEl","productGridEl","showMoreElements","showMoreButton","allShown","splitPrice","imageCount","splitImageCount","predefinedProductCategory","mainProductCategoryGroupCode","searchColor","maxImageCount","minImageCount","maxPrice","minPrice","sortMethodToApiSortMethod","productTiles","childNodes","addTileOnClick","updateFromLabelInYourSelection","tempunavailable","onDetailsPopupTriggerElClick","OrderCounts","PriceHighLow","PriceLowHigh","Top","New","getFilters","selectionFromEl","currentPrice","newTilePrices","priceFilter","dspData","designCount","parser","pageArray","getDesignTiles","shift","totalTiles","htmlFilterValue","fv","count","indexCount","emptyStateEl","enableShowLess","tileEls","tileEl","targetEl","clickedIconEL","removeSelectedIconItems","iconSelEl","selectIconEl","ppn","packShotImgEl","packshoturl","packshotUrl","openPopupForDesign","productcategory","designgroup","packShot","packShotUri","contenttheme","sliderelementsextraclass","slideToActivate","productName","productGridTitle","titleLabel","titlelabel","updateGridTitle","initializedSlider","heightScriptButtons","initPvcSlider","defaultTile","dtItems","decodeURI","designToOpenInPopup"],"mappings":"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"}