{"version":3,"file":"productcategory.min.js","sources":["../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/string.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/fetch.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/logger-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/cookie.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/html.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/button.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/collapsable.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/external/autocomplete.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/disposable.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form-input.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/account-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/querystring.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/events.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/validation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/newsletter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/device.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/debounce.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/navigation-desktop.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/language-selector.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/tooltip.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/search-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/notification-center.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/mobile-menu.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/my-account.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/countdown.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/navigation-mobile.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/main-navigation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/icons.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/country-selection.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/popup-new.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/personalNumbers.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/scroll-to-top.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/leave-intent.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/content-dialog.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/tab.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/popup-launcher.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/component-service..ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/datalayer.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/component-loader.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/vat.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/date.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/abandoned-visit-title-swapper.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/page-general.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/content-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/truncate.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/order-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/guid.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/customslider.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/video-player.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/molecules/carrousel.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/steps.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/my-namebook.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/promotion-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/reviews-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/steps-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/molecules/review-blocks.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/molecules/review-blocks-controls.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/review-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/molecules/review-bars.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/review-language-select.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/organisms/user-reviews.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/price.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/pages/productcategory.ts"],"sourcesContent":["export function escapeForJavascript(str: string | undefined): string {\r\n\tif (!str) return \"\";\r\n\tstr = str.replace(/'/g, \"\");\r\n\tstr = str.replace(/\"/g, \"\");\r\n\tstr = str.replace(/\\\\/g, \"\");\r\n\tstr = str.replace(/[\\n\\r]/g, \"\\\\\\\\n\");\r\n\treturn str;\r\n}\r\n\r\nexport function capitalizeFirstLetterOfWords(input: string): string {\r\n\tconst words = input.split(\" \").filter(element => element);\r\n\r\n\tfor (let i = 0; i < words.length; i++) {\r\n\t\twords[i] = words[i][0].toUpperCase() + words[i].substring(1).toLowerCase();\r\n\t}\r\n\r\n\treturn words.join(\" \");\r\n}\r\n\r\nexport function onlyLetters(input: string): boolean {\r\n\treturn Boolean(input.match(/^[A-Za-z]*$/));\r\n}\r\n\r\nexport function onlyNumber(input: string): boolean {\r\n\treturn Boolean(input.match(/^[0-9]*$/));\r\n}\r\n\r\nexport function toUrlHash(input: string): string {\r\n\treturn escapeForJavascript(input).replace(' ', '-').toLowerCase();\r\n}\r\n\r\nexport function stringToBase64(inputString: string): string {\r\n\tconst bytes = new TextEncoder().encode(inputString);\r\n\tconst binString = Array.from(bytes, (byte) =>\r\n\t\tString.fromCodePoint(byte),\r\n\t).join(\"\");\r\n\treturn window.btoa(binString);\r\n}\r\n\r\nexport function base64ToString(inputBase64: string): string {\r\n\tconst binString = window.atob(inputBase64);\r\n\tconst bytes = Uint8Array.from(binString, (m) => m.codePointAt(0));\r\n\treturn new TextDecoder().decode(bytes);\r\n}\r\n","import { escapeForJavascript } from \"./string\";\r\nexport interface IErrorLog {\r\n\tmessage: string;\r\n\turl?: string;\r\n\tline?: number;\r\n\tprocess: string;\r\n}\r\n\r\nconst redirectTo500 = () => {\r\n\tif (window.location.pathname.indexOf('500.aspx') === -1) window.location.replace(\"/error\");\r\n};\r\n\r\nconst redirectToLogin = () => {\r\n\tif (window.location.pathname.indexOf('login') === -1) window.location.replace(\"/login\");\r\n};\r\n\r\nconst logError = async (errorLog: IErrorLog) => {\r\n\tawait postRequest(\"/api/v1/ApplicationService.svc/json/LogJavascriptError\", errorLog, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n};\r\n\r\nconst http = async (path: string, config: RequestInit, keepCase?: boolean): Promise => {\r\n\tconst finalPath = keepCase ? path : path.toLowerCase();\r\n\tconst request = new Request(finalPath, config);\r\n\treturn fetch(request)\r\n\t\t.then(res => {\r\n\t\t\tif (!res.ok) {\r\n\t\t\t\tHandleError(res.status, path, res.statusText).then(_ => {\r\n\t\t\t\t\treturn Promise.reject(res.statusText);\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\treturn res.json().catch(() => ({}));\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n\t\t\tHandleError(error.status, path, error.statusText).then(_ => {\r\n\t\t\t\treturn Promise.reject(error.statusText);\r\n\t\t\t});\r\n\t\t});\r\n};\r\n\r\nconst httpText = async (path: string, config: RequestInit): Promise => {\r\n\tconst response = await getHttpResponse(path.toLowerCase(), config);\r\n\treturn response.ok ? response.text() : window.context.apiFailMsg || '';\r\n};\r\n\r\nconst HandleError = async (status: number, path: string, statusText: string) => {\r\n\tswitch (status) {\r\n\t\tcase 500:\r\n\t\t\tif (path.startsWith(window.context.ecomApiUrl)) {\r\n\t\t\t\treturn logError({\r\n\t\t\t\t\tline: 0,\r\n\t\t\t\t\tmessage: escapeForJavascript(statusText),\r\n\t\t\t\t\tprocess: 'Browser',\r\n\t\t\t\t\turl: path\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\tredirectTo500();\r\n\t\t\tbreak;\r\n\t\tcase 450:\r\n\t\tcase 401:\r\n\t\t\tredirectToLogin();\r\n\t\t\tbreak;\r\n\t\tcase 403:\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\t// We can't call the logger service here => circular ref\r\n\t\t\tawait logError({\r\n\t\t\t\tline: 0,\r\n\t\t\t\tmessage: escapeForJavascript(statusText),\r\n\t\t\t\tprocess: 'Browser',\r\n\t\t\t\turl: path\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\nexport async function getHttpResponse(path: string, config?: RequestInit): Promise {\r\n\tconst request = new Request(path.toLowerCase(), config);\r\n\tconst response = await fetch(request);\r\n\tif (!response.ok) {\r\n\t\tawait HandleError(response.status, path, response.statusText);\r\n\t\treturn Promise.reject(response.statusText);\r\n\t}\r\n\treturn response;\r\n}\r\n\r\nexport async function getRequest(path: string, config?: RequestInit, keepCase?: boolean): Promise {\r\n\tconst init = { method: 'get', ...config };\r\n\treturn await http(path, init, keepCase);\r\n}\r\n\r\nexport async function postRequest(path: string, body: T, config?: RequestInit, traditionalBody?: boolean): Promise {\r\n\tconst init = { method: 'post', body: traditionalBody && body instanceof URLSearchParams ? body as unknown as BodyInit : JSON.stringify(body), ...config };\r\n\treturn await http(path, init);\r\n}\r\n\r\nexport async function deleteRequest(path: string, body: T, config?: RequestInit): Promise {\r\n\tconst init = { method: 'delete', body: JSON.stringify(body), ...config };\r\n\treturn await http(path, init);\r\n}\r\n\r\nexport async function postRequestWithoutBody(path: string, config?: RequestInit): Promise {\r\n\tconst init = { method: 'post', ...config };\r\n\treturn await http(path, init);\r\n}\r\n\r\nexport async function getHtmlRequest(path: string, config?: RequestInit): Promise {\r\n\tconst init = { method: 'get', ...config };\r\n\treturn await httpText(path, init);\r\n}\r\n\r\nexport async function postHtmlRequest(path: string, body: T, config?: RequestInit): Promise {\r\n\tconst init = { method: 'post', body: JSON.stringify(body), ...config };\r\n\treturn await httpText(path, init);\r\n}\r\n\r\n/* unused for now\r\nexport async function putRequest(path: string, body: T, config?: RequestInit): Promise {\r\n\tconst init = { method: 'put', body: JSON.stringify(body), ...config };\r\n\treturn await http(path, init);\r\n}*/\r\n\r\nexport function isValidPartialViewResponse(res: string) {\r\n\treturn res.indexOf('') <= 0;\r\n}\r\n","import {IErrorLog, postRequest} from \"../utils/fetch\";\r\nimport {escapeForJavascript} from \"../utils/string\";\r\n\r\nexport function logErrorEvent(event: Event): boolean {\r\n\tconst errorEv = event as ErrorEvent;\r\n\treturn logError(errorEv.message, errorEv.filename, errorEv.lineno, errorEv.colno, errorEv.error);\r\n}\r\n\r\nexport function logError(msg: string, url?: string, line?: number, col?: number, error?: Error, process?: string): boolean {\r\n\tconst lastLoggedError = [\"\", \"\", \"\", 0];\r\n\tlet totalLoggedErrors = 0;\r\n\r\n\ttry {\r\n\t\t// Empty URLs, this is a browser issue or cross domain error (external JS files)\r\n\t\tif (!url && !line) return;\r\n\r\n\t\t/* For not log all errors in .net core except from line above\r\n\t\tif (msg && msg === \"Error loading script\" && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg === \"Script error.\" && line === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg === \"Script error\" && line === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Other specific errors\r\n\t\tif (msg && msg.toString().indexOf(\"EBCallBackMessageReceived\") >= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"NPObject\") >= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"cX\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"google_trackConversion\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (msg && msg.toString().indexOf(\"ma_track\") >= 0 && line === 1) {\r\n\t\t\treturn;\r\n\t\t} */\r\n\r\n\t\tlet urlString = \"\";\r\n\t\tlet errorString = \"\";\r\n\r\n\t\t// Simple URLs that give errors out of our control, Ignore keys\r\n\t\tif (Array.isArray(window.errorLogStrings) && Array.isArray(window.errorLogStrings['Ignore']) && !(!window.errorLogStrings['Ignore'].length)) {\r\n\t\t\tfor (let i = 0; i < window.errorLogStrings['Ignore'].length; i++) {\r\n\t\t\t\turlString = window.errorLogStrings['Ignore'][i][1];\r\n\t\t\t\terrorString = window.errorLogStrings['Ignore'][i][2];\r\n\r\n\t\t\t\t// check if both errorLogString values are filled\r\n\t\t\t\tif (url && msg && urlString !== \"\" && errorString !== \"\") {\r\n\t\t\t\t\tif (url.indexOf(urlString) >= 0 && msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t// check if url contains urlString or if msg contains errorString\r\n\t\t\t\tif (url && urlString !== \"\") {\r\n\t\t\t\t\tif (url.indexOf(urlString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (msg && errorString !== \"\") {\r\n\t\t\t\t\tif (msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (lastLoggedError[0] === msg && lastLoggedError[1] === url && lastLoggedError[2] === line) {\r\n\t\t\tlet val = +lastLoggedError[3];\r\n\t\t\tlastLoggedError[3] = val++;\r\n\t\t} else {\r\n\t\t\tlastLoggedError[0] = msg.toString();\r\n\t\t\tlastLoggedError[1] = url;\r\n\t\t\tlastLoggedError[2] = line;\r\n\t\t\tlastLoggedError[3] = 1;\r\n\t\t}\r\n\r\n\t\tif (totalLoggedErrors < 10 && lastLoggedError[3] <= 3) {\r\n\t\t\ttotalLoggedErrors++;\r\n\t\t\tprocess = process || 'Browser';\r\n\t\t\tfor (const key in window.errorLogStrings) {\r\n\t\t\t\t// Only handle keys !== Ignore\r\n\t\t\t\tif (key !== \"Ignore\") {\r\n\t\t\t\t\tfor (let i = 0; i < window.errorLogStrings[key].length; i++) {\r\n\r\n\t\t\t\t\t\turlString = window.errorLogStrings[key][i][1];\r\n\t\t\t\t\t\terrorString = window.errorLogStrings[key][i][2];\r\n\r\n\t\t\t\t\t\t// check if both errorLogString values are filled\r\n\t\t\t\t\t\tif (url && msg && urlString !== \"\" && errorString !== \"\") {\r\n\t\t\t\t\t\t\tif (url.indexOf(urlString) >= 0 && msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// check if url contains urlString or if msg contains errorString\r\n\t\t\t\t\t\t\tif (url && urlString !== \"\") {\r\n\t\t\t\t\t\t\t\tif (url.indexOf(urlString) >= 0) {\r\n\t\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (msg !== null && errorString !== \"\") {\r\n\t\t\t\t\t\t\t\tif (msg.toString().indexOf(errorString) >= 0) {\r\n\t\t\t\t\t\t\t\t\tprocess = key;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (error && error.stack)\r\n\t\t\t\tmsg += \"\\n\\nStacktrace: \\n\" + error.stack;\r\n\r\n\t\t\tconst errorLog: IErrorLog = {\r\n\t\t\t\tline: line,\r\n\t\t\t\tmessage: escapeForJavascript(msg),\r\n\t\t\t\tprocess: process,\r\n\t\t\t\turl: url\r\n\t\t\t};\r\n\r\n\t\t\tpostRequest(\"/api/v1/ApplicationService.svc/json/LogJavascriptError\", errorLog, {headers: new Headers({'Content-type': 'application/json; charset=utf-8'})}).then(res => {\r\n\t\t\t\t//ts-gitignore\r\n\t\t\t});\r\n\t\t}\r\n\t} catch (exc) {\r\n\t\t//ts-gitignore\r\n\t}\r\n\treturn false;\r\n}\r\n","export function getCookie(cName: string): string {\r\n\tconst allCookies = document.cookie;\r\n\tif (allCookies.length > 0) {\r\n\t\tlet cStart = allCookies.indexOf(cName + \"=\");\r\n\t\tif (cStart !== -1) {\r\n\t\t\tcStart = cStart + cName.length + 1;\r\n\t\t\tlet cEnd = allCookies.indexOf(\";\", cStart);\r\n\t\t\tif (cEnd === -1) cEnd = allCookies.length;\r\n\t\t\treturn unescape(allCookies.substring(cStart, cEnd));\r\n\t\t}\r\n\t}\r\n\treturn \"\";\r\n}\r\nexport function writeCookie(cName: string, cValue: string, extraDays: number) {\r\n\tconst d = new Date();\r\n\td.setTime(d.getTime() + (extraDays * 24 * 60 * 60 * 1000));\r\n\tconst expires = \"expires=\" + d.toUTCString();\r\n\tdocument.cookie = encodeURIComponent(cName) + \"=\" + encodeURIComponent(cValue) + \";\" + expires + \"; path=/\";\r\n}\r\n\r\nexport function writeCookieThatExpiresAtTheEndOfTheDay(cName: string, cValue) {\r\n\tconst d = new Date();\r\n\tconst midnight = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59);\r\n\tconst expires = \"expires=\" + midnight.toUTCString();\r\n\tdocument.cookie = encodeURIComponent(cName) + \"=\" + encodeURIComponent(cValue) + \";\" + expires + \"; path=/\";\r\n}\r\n","import {IDisposable} from \"../utils/disposable\";\r\n\r\nexport function expressQuerySelector(el: Element | Document, selectors: T, isRequired: true): HTMLElementTagNameMap[T];\r\nexport function expressQuerySelector(el: Element | Document, selectors: T, isRequired?: boolean): HTMLElementTagNameMap[T] | null;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired: true): T;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired?: boolean): T | null;\r\nexport function expressQuerySelector(el: Element | Document, selectors: string, isRequired = false): T | null {\r\n\tconst resultEl = el.querySelector(selectors);\r\n\tif (isRequired && !resultEl) throw new Error(\"querySelector didn't return any results for: \" + selectors);\r\n\treturn resultEl;\r\n}\r\n\r\n/* Use the default js scrollIntoView => this code was created for IE if I remember correctly\r\nexport interface IScrollIntoViewOptions {\r\n\treadonly vertical?: 'center' | 'top' | 'bottom'; // TODO: implement bottom, top\r\n\treadonly behavior?: 'auto' | 'smooth';\r\n}\r\n\r\nexport function scrollIntoView(el: HTMLElement, options: IScrollIntoViewOptions = {}) {\r\n\tconst d = document;\r\n\tconst w = window;\r\n\tconst scrollAlignment = {\"top\": 0, \"center\": 0.5, \"bottom\": 1};\r\n\tconst {vertical = 'center', behavior = 'smooth'} = options;\r\n\tconst alignment = {y: scrollAlignment[vertical]};\r\n\r\n\tconst hasScrollableSpace = (el: Element) => el.clientHeight < el.scrollHeight;\r\n\r\n\tconst canOverflow = (el: Element) => {\r\n\t\tconst overflowValue = w.getComputedStyle(el, null)['overflow' + 'Y'];\r\n\t\treturn overflowValue === 'auto' || overflowValue === 'scroll';\r\n\t};\r\n\r\n\tconst isScrollable = (el: Element) => hasScrollableSpace(el) && canOverflow(el);\r\n\r\n\tconst findScrollableParent = (el: Element) => {\r\n\t\twhile (el !== d.body && isScrollable(el) === false) {\r\n\t\t\tel = el.parentElement;\r\n\t\t}\r\n\r\n\t\treturn el;\r\n\t};\r\n\r\n\tconst scrollableParent = findScrollableParent(el);\r\n\tconst clientRect = el.getBoundingClientRect();\r\n\tconst parentRect = scrollableParent.getBoundingClientRect();\r\n\tconst y = clientRect.top - parentRect.top - scrollableParent.scrollTop + ((parentRect.height - el.offsetHeight) * alignment.y);\r\n\r\n\tif (scrollableParent !== d.body) {\r\n\t\t'scrollBehavior' in document.documentElement.style\r\n\t\t\t? scrollableParent.scroll({\r\n\t\t\t\ttop: y,\r\n\t\t\t\tbehavior,\r\n\t\t\t})\r\n\t\t\t: scrollableParent.scrollTop = y; // IE: scroll on element not supported\r\n\r\n\t} else {\r\n\t\tconst windowSize = getWindowSize();\r\n\t\tconst y = Math.round(window.pageYOffset + clientRect.top - (windowSize.height - el.offsetHeight) * alignment.y);\r\n\t\t'scrollBehavior' in document.documentElement.style\r\n\t\t\t? window.scroll({\r\n\t\t\t\ttop: y,\r\n\t\t\t\tbehavior,\r\n\t\t\t})\r\n\t\t\t: window.scroll(0, y); // IE: scroll options not supported\r\n\t}\r\n}*/\r\n\r\nexport function getWindowSize() {\r\n\tconst w = window;\r\n\tconst d = document;\r\n\tconst e = d.documentElement;\r\n\tconst g = d.body;\r\n\tconst x = w.innerWidth || e.clientWidth || g.clientWidth;\r\n\tconst y = w.innerHeight || e.clientHeight || g.clientHeight;\r\n\r\n\treturn {width: x, height: y};\r\n}\r\n\r\nexport function hasClass(element: HTMLElement, cssClass: string): boolean {\r\n\tconst regex = new RegExp('(?:^|\\\\s)' + cssClass + '(?!\\\\S)');\r\n\tconst match = element.className.match(regex);\r\n\treturn !!match && !!match.length;\r\n}\r\n\r\nexport function expressEventListener(element: any, type: string, listener: (ev: any) => T, useCapture?: boolean): IDisposable {\r\n\tconst disposable = {\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.handler) { // Prevent unregistering twice\r\n\t\t\t\telement.removeEventListener(disposable.type, disposable.handler, useCapture);\r\n\t\t\t\tdelete disposable.handler;\r\n\t\t\t}\r\n\t\t},\r\n\t\thandler: (ev: any): T => {\r\n\t\t\treturn listener(ev);\r\n\t\t},\r\n\t\ttype\r\n\t};\r\n\r\n\telement.addEventListener(disposable.type, disposable.handler, useCapture);\r\n\r\n\treturn disposable;\r\n}\r\n\r\nexport function expressQuerySelectorAll(el: Element | Document | DocumentFragment, selectors: string): T[] {\r\n\treturn el ? [].slice.call(el.querySelectorAll(selectors)) : [];\r\n}\r\n\r\nexport function expressAddClass(element: HTMLElement, cssClass) {\r\n\texpressToggleClass(element, cssClass, true);\r\n}\r\n\r\nexport function expressRemoveClass(element: HTMLElement, cssClass) {\r\n\texpressToggleClass(element, cssClass, false);\r\n}\r\n\r\nexport function expressToggleClass(element: HTMLElement, cssClass: string, on: boolean) {\r\n\tconst regex = new RegExp('(?:^|\\\\s)' + cssClass + '(?!\\\\S)');\r\n\r\n\tconst hasClass = element.className.match(regex);\r\n\tif (hasClass && !on) {\r\n\t\telement.className = element.className.replace(new RegExp(regex.source, \"g\"), '');\r\n\t} else if (!hasClass && on) {\r\n\t\telement.className += \" \" + cssClass;\r\n\t}\r\n}\r\n\r\nexport function show(el: HTMLElement) {\r\n\tif (el.offsetParent === null) { // is el visible in dom?\r\n\t\tif (el.style.display === 'none') { // check style attribute\r\n\t\t\tel.style.display = '';\r\n\t\t} else {\r\n\t\t\tif (getComputedStyle(el).display === 'none') { // el not visible -> check css display -> force display block\r\n\t\t\t\tel.style.display = 'block';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function hide(el: HTMLElement) {\r\n\tel.style.display = 'none';\r\n}\r\n\r\nexport function getHeightWithMargins(el: HTMLElement): number {\r\n\treturn el.getBoundingClientRect().height\r\n\t\t+ parseInt(window.getComputedStyle(el).marginTop || \"0\", 10)\r\n\t\t+ parseInt(window.getComputedStyle(el).marginBottom || \"0\", 10);\r\n}\r\n\r\nexport function getParentWithClassName(el: Element | null, className: string): T | null {\r\n\tif (el)\r\n\t\tel = el.parentElement;\r\n\r\n\twhile (el) {\r\n\t\tif (el.classList.contains(className))\r\n\t\t\treturn el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getSelfOrParentWithClassName(el: Element | null, className: string): T | null {\r\n\tif (!el) return null;\r\n\tif (el.classList && el.classList.contains(className))\r\n\t\treturn el;\r\n\treturn getParentWithClassName(el, className);\r\n}\r\n\r\nexport function getNextSiblingWithClassName(el: Element | null, className: string): T | null {\r\n\tif (el)\r\n\t\tel = el.nextElementSibling;\r\n\r\n\twhile (el) {\r\n\t\tif (el.classList.contains(className))\r\n\t\t\treturn el;\r\n\t\tel = el.nextElementSibling;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getParentWithId(el: Element | null, id: string): T | null {\r\n\tif (el)\r\n\t\tel = el.parentElement;\r\n\r\n\twhile (el) {\r\n\t\tif (el.id === id)\r\n\t\t\treturn el;\r\n\t\tel = el.parentElement;\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nexport function getParents (elem, selector?) {\r\n\tif (!Element.prototype.matches) {\r\n\t\tElement.prototype.matches =\r\n\t\t\tElement.prototype.webkitMatchesSelector ||\r\n\t\t\tfunction(s) {\r\n\t\t\t\tconst matches = (this.document || this.ownerDocument).querySelectorAll(s);\r\n\t\t\t\tlet i = matches.length;\r\n\t\t\t\twhile (--i >= 0 && matches.item(i) !== this) {\r\n\t\t\t\t\t//\r\n\t\t\t\t}\r\n\t\t\t\treturn i > -1;\r\n\t\t\t};\r\n\t}\r\n\t// We check on the parents of an element => select the first parent\r\n\telem = elem.parentNode;\r\n\tconst parents = [];\r\n\tfor ( ; elem && elem !== document; elem = elem.parentNode ) {\r\n\t\tif (selector) {\r\n\t\t\tif (elem.matches(selector)) {\r\n\t\t\t\tparents.push(elem);\r\n\t\t\t}\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tparents.push(elem);\r\n\t}\r\n\treturn parents;\r\n\r\n}\r\n\r\nexport function htmlToElement(html): ChildNode {\r\n\tconst template = document.createElement('template');\r\n\thtml = html.trim(); // Never return a text node of whitespace as the result\r\n\ttemplate.innerHTML = html;\r\n\treturn template.content.firstChild;\r\n}\r\n\r\nexport function isMobileOnPageWithHeader() {\r\n\treturn isElementVisible(\r\n\t\texpressQuerySelector(\r\n\t\t\tdocument,\r\n\t\t\t'.o-main-navigation__hamburger-button',\r\n\t\t\tfalse\r\n\t\t)\r\n\t);\r\n}\r\n\r\nexport function isElementVisible(el: HTMLElement) {\r\n\treturn !(el.offsetWidth\r\n\t\t+ el.offsetHeight\r\n\t\t+ el.getBoundingClientRect().height\r\n\t\t+ el.getBoundingClientRect().width === 0);\r\n}\r\n\r\nexport function isElementVisibleInViewPort(el: HTMLElement): boolean {\r\n\tif (!el) return false; // return default\r\n\tconst rect = el.getBoundingClientRect();\r\n\r\n\treturn rect.top >= 0\r\n\t\t&& rect.left >= 0\r\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\r\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth);\r\n}\r\n\r\nexport function isElementPartiallyVisibleInViewport(el, percentVisible) {\r\n\tif (!el) return false;\r\n\tconst rect = el.getBoundingClientRect();\r\n\tconst windowHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n\treturn !(\r\n\t\tMath.floor(100 - (((rect.top >= 0 ? 0 : rect.top) / +-rect.height) * 100)) < percentVisible ||\r\n\t\tMath.floor(100 - ((rect.bottom - windowHeight) / rect.height) * 100) < percentVisible\r\n\t);\r\n}\r\n\r\nexport function remove(el: Element) {\r\n\tif (el.parentElement) el.parentElement.removeChild(el);\r\n}\r\n\r\nlet inViewArray: { element: HTMLElement; callBack: IInViewCallback; }[];\r\n\r\ninterface IInViewCallback {\r\n\t(element: HTMLElement): void;\r\n}\r\n\r\n// Can be replaced with a intersection observer with threshold = 1\r\nexport function inViewTrigger(element: HTMLElement, callBack: IInViewCallback) {\r\n\tconst inViewScrollHandler = () => {\r\n\t\t// What does in view mean? We assume people are scrolling down, so if BOTTOM of the element is in view -> the element has been in view!\r\n\t\tfor (let i = inViewArray.length - 1; i >= 0; i--) {\r\n\t\t\tconst { element, callBack } = inViewArray[i];\r\n\r\n\t\t\tconst windowHeight = window.innerHeight;\r\n\t\t\tconst scrollY = window.scrollY || window.pageYOffset;\r\n\t\t\tconst scrollPosition = scrollY + windowHeight;\r\n\r\n\t\t\tconst elementHeight = element.clientHeight;\r\n\t\t\tconst elementPosition = element.getBoundingClientRect().top + scrollY + elementHeight;\r\n\r\n\t\t\tif (scrollPosition > elementPosition) {\r\n\t\t\t\tcallBack(element);\r\n\t\t\t\tinViewArray.splice(i, 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (inViewArray.length === 0) {\r\n\t\t\t// I no longer need myself! Cleanup....\r\n\t\t\tdocument.removeEventListener('scroll', inViewScrollHandler);\r\n\t\t}\r\n\t};\r\n\r\n\t// We should only have 1 scroll event listener that checks all elements that want to use this feature.\r\n\tif (!inViewArray || inViewArray.length === 0) {\r\n\t\tinViewArray = [];\r\n\t\tdocument.addEventListener('scroll', inViewScrollHandler);\r\n\t}\r\n\r\n\tinViewArray.push({ element, callBack });\r\n\r\n\t// Do 1 check without scrolling -> items might already be completely in view\r\n\tinViewScrollHandler();\r\n}\r\n\r\nexport function disableUserEvents(): IDisposable {\r\n\tconst eventsToBlock = [\"click\", \"keydown\", \"keyup\", \"mouseenter\", \"mouseleave\", \"focus\"];\r\n\r\n\tconst disposable = {\r\n\t\tblockingEvents: eventsToBlock.map((event) => expressEventListener(window, event, (e) => blockEvent(e), true)),\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.blockingEvents) {\r\n\t\t\t\tdisposable.blockingEvents.forEach((blockedEvent) => blockedEvent.dispose());\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\treturn disposable;\r\n}\r\n\r\nconst blockEvent = (event: Event): void => {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n};\r\n\r\nexport const pageVisibilityChange = (onVisible?: () => void | undefined, onHidden?: () => void | undefined) => {\r\n\tif (!onVisible && !onHidden)\r\n\t\treturn;\r\n\r\n\tlet hidden: string, visibilityState: string, visibilityChange: string;\r\n\r\n\tif (typeof document.hidden !== \"undefined\") {\r\n\t\thidden = \"hidden\"; visibilityChange = \"visibilitychange\"; visibilityState = \"visibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.mozHidden !== \"undefined\") {\r\n\t\thidden = \"mozHidden\"; visibilityChange = \"mozvisibilitychange\"; visibilityState = \"mozVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.msHidden !== \"undefined\") {\r\n\t\thidden = \"msHidden\"; visibilityChange = \"msvisibilitychange\"; visibilityState = \"msVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.webkitHidden !== \"undefined\") {\r\n\t\thidden = \"webkitHidden\"; visibilityChange = \"webkitvisibilitychange\"; visibilityState = \"webkitVisibilityState\";\r\n\t}\r\n\r\n\tif (typeof document.addEventListener === \"undefined\" || typeof hidden === \"undefined\") {\r\n\t\t// not supported\r\n\t} else {\r\n\t\texpressEventListener(document, visibilityChange, () => {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tswitch (document[visibilityState]) {\r\n\t\t\t\t\tcase \"visible\":\r\n\t\t\t\t\t\tonVisible && onVisible();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"hidden\":\r\n\t\t\t\t\t\tonHidden && onHidden();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}, 0);\r\n\t\t}, false);\r\n\t}\r\n};\r\n","import {expressEventListener, expressRemoveClass, expressAddClass} from '../common/html';\r\nimport {IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface ICreateClickableOptions {\r\n\treadonly enable?: () => void;\r\n\treadonly disable?: () => void;\r\n}\r\n\r\nexport interface IButton {\r\n\treadonly dispose: () => void;\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n}\r\n\r\nexport function createClickableElement(el: HTMLElement, onClick?: () => Promise, options: ICreateClickableOptions = {}) {\r\n\tlet clickEvent: IDisposable;\r\n\tconst {enable, disable} = options;\r\n\r\n\tconst onClicked = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tif (onClick) {\r\n\t\t\tdispose();\r\n\t\t\tdisable && disable();\r\n\t\t\tonClick()\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tenable && enable();\r\n\t\t\t\t\taddClickEvent();\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst addClickEvent = () => {\r\n\t\tclickEvent = expressEventListener(el, 'click', onClicked);\r\n\t};\r\n\r\n\tconst dispose = () => clickEvent.dispose();\r\n\r\n\taddClickEvent();\r\n\r\n\treturn {\r\n\t\taddClickEvent,\r\n\t\tdispose\r\n\t};\r\n}\r\n\r\nexport function createButton(buttonEl: HTMLButtonElement, onClick?: () => Promise): IButton {\r\n\tconst enable = () => { // add component specific classes\r\n\t\texpressRemoveClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.removeAttribute(\"disabled\");\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\texpressAddClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.setAttribute(\"disabled\", \"disabled\");\r\n\t};\r\n\r\n\tconst button = createClickableElement(\r\n\t\tbuttonEl,\r\n\t\tonClick,\r\n\t\t{\r\n\t\t\tenable,\r\n\t\t\tdisable\r\n\t\t}\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tenable,\r\n\t\tdisable\r\n\t};\r\n}\r\n","import {expressQuerySelector, expressQuerySelectorAll, hasClass, isElementVisibleInViewPort} from '../common/html';\r\nimport { createClickableElement } from './button';\r\n\r\nexport interface ICreateCollapsableOptions {\r\n\treadonly singleOpen?: boolean;\r\n\treadonly swapTitleDataAttribute?: string;\r\n}\r\n\r\nexport interface ICreateCollapsableDependencies {\r\n\tonInit?: (container: HTMLElement) => Promise;\r\n\tonBeforeOpen?: (container: HTMLElement) => Promise;\r\n\treadonly onBeforeClose?: (container: HTMLElement) => Promise;\r\n\treadonly titleElSelector?: string;\r\n\treadonly scrollIntoViewAfterOpen: boolean;\r\n\treadonly contentSelector?: string;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nexport interface ICollapsibleContentRequest {\r\n\treadonly type: string;\r\n\treadonly theme: string;\r\n}\r\n\r\nexport interface ICollapsable {\r\n\tdispose(): void;\r\n\tshow(): void;\r\n\tclose(): void;\r\n\thide(): void;\r\n\topen(scrollIntoView?: boolean): void;\r\n\telement: HTMLElement;\r\n}\r\n\r\nexport function createCollapsable(container: HTMLElement, deps?: ICreateCollapsableDependencies, opts?: ICreateCollapsableOptions): ICollapsable {\r\n\tconst { singleOpen, swapTitleDataAttribute } = opts || {};\r\n\tconst { onInit, onBeforeOpen, onBeforeClose, titleElSelector, scrollIntoViewAfterOpen, contentSelector, openClass } = deps || {};\r\n\tconst OPEN_CLASS = openClass ? openClass : \"is-collapse-open\";\r\n\tconst titleEl = expressQuerySelector(container, titleElSelector ? titleElSelector : '.technical-collapsable-title', true);\r\n\tconst contentEl = expressQuerySelector(container, contentSelector ? contentSelector : '.technical-collapse-content', false);\r\n\tlet origTitle: string;\r\n\tlet collapseTitle: string;\r\n\tif (swapTitleDataAttribute) {\r\n\t\torigTitle = titleEl.innerText;\r\n\t\tcollapseTitle = swapTitleDataAttribute ? container.getAttribute(swapTitleDataAttribute) : null;\r\n\t}\r\n\tconst closeWithBefore = async () => {\r\n\t\tif (!onBeforeClose) {\r\n\t\t\tclose();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeClose(container);\r\n\t\treturn close();\r\n\t};\r\n\r\n\tconst openWithBefore = async (scrollIntoView = false) => {\r\n\t\tif (!onBeforeOpen) {\r\n\t\t\topen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeOpen(container);\r\n\t\treturn open(scrollIntoView);\r\n\t};\r\n\r\n\tconst close = () => {\r\n\t\tif (swapTitleDataAttribute && origTitle && titleEl.innerText !== origTitle) {\r\n\t\t\ttitleEl.innerText = origTitle;\r\n\t\t}\r\n\t\tcontainer.classList.remove(OPEN_CLASS);\r\n\t};\r\n\tconst open = (shouldScrollIntoView?: boolean) => {\r\n\t\tif (singleOpen) {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(container.parentElement, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => el.classList.remove(OPEN_CLASS));\r\n\t\t}\r\n\t\tif (swapTitleDataAttribute && titleEl.innerText !== collapseTitle) {\r\n\t\t\ttitleEl.innerText = collapseTitle;\r\n\t\t}\r\n\t\tcontainer.classList.add(OPEN_CLASS);\r\n\t\tif ((scrollIntoViewAfterOpen && !isElementVisibleInViewPort(contentEl)) || shouldScrollIntoView)\r\n\t\t\ttitleEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n\t};\r\n\r\n\tconst isOpen = () => hasClass(container, OPEN_CLASS);\r\n\r\n\tconst onClick = () => !isOpen() ? openWithBefore() : closeWithBefore();\r\n\r\n\tconst button = createClickableElement(titleEl, onClick);\r\n\r\n\tonInit && onInit(container);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tshow: () => container.classList.remove('u-hide'),\r\n\t\thide: () => container.classList.add('u-hide'),\r\n\t\tclose,\r\n\t\topen: (scrollIntoView?: boolean) => openWithBefore(scrollIntoView),\r\n\t\telement: container\r\n\t} as ICollapsable;\r\n}\r\n","/*\r\n * https://github.com/kraaden/autocomplete\r\n * Copyright (c) 2016 Denys Krasnoshchok\r\n * MIT License\r\n *\r\n * this commit is used : https://github.com/kraaden/autocomplete/pull/40\r\n *\r\n */\r\n\r\nexport const enum EventTrigger {\r\n\tKeyboard = 0,\r\n\tFocus = 1\r\n}\r\n\r\nexport interface IAutocompleteItem {\r\n\tlabel?: string;\r\n\tgroup?: string;\r\n}\r\n\r\nexport interface IAutocompleteSettings {\r\n\tinput: HTMLInputElement;\r\n\trender?: (item: T, currentValue: string) => HTMLDivElement | undefined;\r\n\trenderGroup?: (name: string, currentValue: string) => HTMLDivElement | undefined;\r\n\tclassName?: string;\r\n\tminLength?: number;\r\n\temptyMsg?: string;\r\n\tonSelect: (item: T, input: HTMLInputElement) => void;\r\n\t/**\r\n\t * Show autocomplete on focus event. Focus event will ignore the `minLength` property and will always call `fetch`.\r\n\t */\r\n\tshowOnFocus?: boolean;\r\n\tfetch: (text: string, update: (items: T[] | false) => void, trigger: EventTrigger) => void;\r\n\tdebounceWaitMs?: number;\r\n\t/**\r\n\t * Callback for additional autocomplete customization\r\n\t * @param {HTMLInputElement} input - input box associated with autocomplete\r\n\t * @param {ClientRect | DOMRect} inputRect - size of the input box and its position relative to the viewport\r\n\t * @param {HTMLDivElement} container - container with suggestions\r\n\t * @param {number} maxHeight - max height that can be used by autocomplete\r\n\t */\r\n\tcustomize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n\t/**\r\n\t * Prevents automatic form submit when ENTER is pressed\r\n\t */\r\n\tpreventSubmit?: boolean;\r\n\t/**\r\n\t * Prevents automatic selection of first entry when ENTER is pressed\r\n\t */\r\n\tdisableAutoSelect?: boolean;\r\n}\r\n\r\nexport interface IAutocompleteResult {\r\n\tdestroy: () => void;\r\n}\r\n\r\nconst enum Keys {\r\n\tEnter = 13,\r\n\tEsc = 27,\r\n\tUp = 38,\r\n\tDown = 40,\r\n\tLeft = 37,\r\n\tRight = 39,\r\n\tShift = 16,\r\n\tCtrl = 17,\r\n\tAlt = 18,\r\n\tCapsLock = 20,\r\n\tWindowsKey = 91,\r\n\tTab = 9,\r\n\tF1 = 112,\r\n\tF12 = 123\r\n}\r\n\r\nexport function autocomplete(settings: IAutocompleteSettings): IAutocompleteResult {\r\n\r\n\t// just an alias to minimize JS file size\r\n\tconst doc = document;\r\n\r\n\tconst container: HTMLDivElement = doc.createElement(\"div\");\r\n\tconst containerStyle = container.style;\r\n\tconst userAgent = navigator.userAgent;\r\n\tconst mobileFirefox = userAgent.indexOf(\"Firefox\") !== -1 && userAgent.indexOf(\"Mobile\") !== -1;\r\n\tconst debounceWaitMs = settings.debounceWaitMs || 0;\r\n\tconst preventSubmit = settings.preventSubmit || false;\r\n\r\n\t// 'keyup' event will not be fired on Mobile Firefox, so we have to use 'input' event instead\r\n\tconst keyUpEventName = mobileFirefox ? \"input\" : \"keyup\";\r\n\r\n\tlet items: T[] = [];\r\n\tlet inputValue = \"\";\r\n\tlet minLen = 2;\r\n\tconst showOnFocus = settings.showOnFocus;\r\n\tlet selected: T | undefined;\r\n\tlet keypressCounter = 0;\r\n\tlet debounceTimer: number | undefined;\r\n\r\n\tif (settings.minLength !== undefined) {\r\n\t\tminLen = settings.minLength;\r\n\t}\r\n\r\n\tif (!settings.input) {\r\n\t\tthrow new Error(\"input undefined\");\r\n\t}\r\n\r\n\tconst input: HTMLInputElement = settings.input;\r\n\r\n\tcontainer.className = \"autocomplete \" + (settings.className || \"\");\r\n\r\n\t// IOS implementation for fixed positioning has many bugs, so we will use absolute positioning\r\n\tcontainerStyle.position = \"absolute\";\r\n\r\n\t/**\r\n\t * Detach the container from DOM\r\n\t */\r\n\tfunction detach(): void {\r\n\t\tconst parent = container.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.removeChild(container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clear debouncing timer if assigned\r\n\t */\r\n\tfunction clearDebounceTimer(): void {\r\n\t\tif (debounceTimer) {\r\n\t\t\twindow.clearTimeout(debounceTimer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Attach the container to DOM\r\n\t */\r\n\tfunction attach(): void {\r\n\t\tif (!container.parentNode) {\r\n\t\t\tdoc.body.appendChild(container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Check if container for autocomplete is displayed\r\n\t */\r\n\tfunction containerDisplayed(): boolean {\r\n\t\treturn !!container.parentNode;\r\n\t}\r\n\r\n\t/**\r\n\t * Clear autocomplete state and hide container\r\n\t */\r\n\tfunction clear(): void {\r\n\t\t// prevent the update call if there are pending AJAX requests\r\n\t\tkeypressCounter++;\r\n\r\n\t\titems = [];\r\n\t\tinputValue = \"\";\r\n\t\tselected = undefined;\r\n\t\tdetach();\r\n\t}\r\n\r\n\t/**\r\n\t * Update autocomplete position\r\n\t */\r\n\tfunction updatePosition(): void {\r\n\t\tif (!containerDisplayed()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcontainerStyle.height = \"auto\";\r\n\t\tcontainerStyle.width = input.offsetWidth + \"px\";\r\n\r\n\t\tlet maxHeight = 0;\r\n\t\tlet inputRect: ClientRect | DOMRect | undefined;\r\n\r\n\t\tfunction calc() {\r\n\t\t\tconst docEl = doc.documentElement as HTMLElement;\r\n\t\t\tconst clientTop = docEl.clientTop || doc.body.clientTop || 0;\r\n\t\t\tconst clientLeft = docEl.clientLeft || doc.body.clientLeft || 0;\r\n\t\t\tconst scrollTop = window.pageYOffset || docEl.scrollTop;\r\n\t\t\tconst scrollLeft = window.pageXOffset || docEl.scrollLeft;\r\n\r\n\t\t\tinputRect = input.getBoundingClientRect();\r\n\r\n\t\t\tconst top = inputRect.top + input.offsetHeight + scrollTop - clientTop;\r\n\t\t\tconst left = inputRect.left + scrollLeft - clientLeft;\r\n\r\n\t\t\tcontainerStyle.top = top + \"px\";\r\n\t\t\tcontainerStyle.left = left + \"px\";\r\n\r\n\t\t\tmaxHeight = window.innerHeight - (inputRect.top + input.offsetHeight);\r\n\r\n\t\t\tif (maxHeight < 0) {\r\n\t\t\t\tmaxHeight = 0;\r\n\t\t\t}\r\n\r\n\t\t\tcontainerStyle.top = top + \"px\";\r\n\t\t\tcontainerStyle.bottom = \"\";\r\n\t\t\tcontainerStyle.left = left + \"px\";\r\n\t\t\tcontainerStyle.maxHeight = maxHeight + \"px\";\r\n\t\t}\r\n\r\n\t\t// the calc method must be called twice, otherwise the calculation may be wrong on resize event (chrome browser)\r\n\t\tcalc();\r\n\t\tcalc();\r\n\r\n\t\tif (settings.customize && inputRect) {\r\n\t\t\tsettings.customize(input, inputRect, container, maxHeight);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Redraw the autocomplete div element with suggestions\r\n\t */\r\n\tfunction update(): void {\r\n\r\n\t\t// delete all children from autocomplete DOM container\r\n\t\twhile (container.firstChild) {\r\n\t\t\tcontainer.removeChild(container.firstChild);\r\n\t\t}\r\n\r\n\t\t// function for rendering autocomplete suggestions\r\n\t\tlet render = function (item: T, currentValue: string): HTMLDivElement | undefined {\r\n\t\t\tconst itemElement = doc.createElement(\"div\");\r\n\t\t\titemElement.textContent = item.label || \"\";\r\n\t\t\treturn itemElement;\r\n\t\t};\r\n\t\tif (settings.render) {\r\n\t\t\trender = settings.render;\r\n\t\t}\r\n\r\n\t\t// function to render autocomplete groups\r\n\t\tlet renderGroup = function (groupName: string, currentValue: string): HTMLDivElement | undefined {\r\n\t\t\tconst groupDiv = doc.createElement(\"div\");\r\n\t\t\tgroupDiv.textContent = groupName;\r\n\t\t\treturn groupDiv;\r\n\t\t};\r\n\t\tif (settings.renderGroup) {\r\n\t\t\trenderGroup = settings.renderGroup;\r\n\t\t}\r\n\r\n\t\tconst fragment = doc.createDocumentFragment();\r\n\t\tlet prevGroup = \"#9?$\";\r\n\r\n\t\titems.forEach(function (item: T): void {\r\n\t\t\tif (item.group && item.group !== prevGroup) {\r\n\t\t\t\tprevGroup = item.group;\r\n\t\t\t\tconst groupDiv = renderGroup(item.group, inputValue);\r\n\t\t\t\tif (groupDiv) {\r\n\t\t\t\t\tgroupDiv.className += \" group\";\r\n\t\t\t\t\tfragment.appendChild(groupDiv);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tconst div = render(item, inputValue);\r\n\t\t\tif (div) {\r\n\t\t\t\tdiv.addEventListener(\"click\", function (ev: MouseEvent): void {\r\n\t\t\t\t\tsettings.onSelect(item, input);\r\n\t\t\t\t\tclear();\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tev.stopPropagation();\r\n\t\t\t\t});\r\n\t\t\t\tif (item === selected) {\r\n\t\t\t\t\tdiv.className += \" selected\";\r\n\t\t\t\t}\r\n\t\t\t\tfragment.appendChild(div);\r\n\t\t\t}\r\n\t\t});\r\n\t\tcontainer.appendChild(fragment);\r\n\t\tif (items.length < 1) {\r\n\t\t\tif (settings.emptyMsg) {\r\n\t\t\t\tconst empty = doc.createElement(\"div\");\r\n\t\t\t\tempty.className = \"empty\";\r\n\t\t\t\tempty.textContent = settings.emptyMsg;\r\n\t\t\t\tcontainer.appendChild(empty);\r\n\t\t\t} else {\r\n\t\t\t\tclear();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tattach();\r\n\t\tupdatePosition();\r\n\r\n\t\tupdateScroll();\r\n\t}\r\n\r\n\tfunction updateIfDisplayed(): void {\r\n\t\tif (containerDisplayed()) {\r\n\t\t\tupdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction resizeEventHandler(): void {\r\n\t\tupdateIfDisplayed();\r\n\t}\r\n\r\n\tfunction scrollEventHandler(e: Event): void {\r\n\t\tif (e.target !== container) {\r\n\t\t\tupdateIfDisplayed();\r\n\t\t} else {\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction keyupEventHandler(ev: KeyboardEvent): void {\r\n\t\tconst keyCode = ev.which || ev.keyCode || 0;\r\n\r\n\t\tconst ignore = [Keys.Up, Keys.Enter, Keys.Esc, Keys.Right, Keys.Left, Keys.Shift, Keys.Ctrl, Keys.Alt, Keys.CapsLock, Keys.WindowsKey, Keys.Tab];\r\n\t\tfor (const key of ignore) {\r\n\t\t\tif (keyCode === key) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (keyCode >= Keys.F1 && keyCode <= Keys.F12) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// the down key is used to open autocomplete\r\n\t\tif (keyCode === Keys.Down && containerDisplayed()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstartFetch(EventTrigger.Keyboard);\r\n\t}\r\n\r\n\t/**\r\n\t * Automatically move scroll bar if selected item is not visible\r\n\t */\r\n\tfunction updateScroll(): void {\r\n\t\tconst elements = container.getElementsByClassName(\"selected\");\r\n\t\tif (elements.length > 0) {\r\n\t\t\tlet element = elements[0] as HTMLDivElement;\r\n\r\n\t\t\t// make group visible\r\n\t\t\tconst previous = element.previousElementSibling as HTMLDivElement;\r\n\t\t\tif (previous && previous.className.indexOf(\"group\") !== -1 && !previous.previousElementSibling) {\r\n\t\t\t\telement = previous;\r\n\t\t\t}\r\n\r\n\t\t\tif (element.offsetTop < container.scrollTop) {\r\n\t\t\t\tcontainer.scrollTop = element.offsetTop;\r\n\t\t\t} else {\r\n\t\t\t\tconst selectBottom = element.offsetTop + element.offsetHeight;\r\n\t\t\t\tconst containerBottom = container.scrollTop + container.offsetHeight;\r\n\t\t\t\tif (selectBottom > containerBottom) {\r\n\t\t\t\t\tcontainer.scrollTop += selectBottom - containerBottom;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Select the previous item in suggestions\r\n\t */\r\n\tfunction selectPrev(): void {\r\n\t\tif (items.length < 1) {\r\n\t\t\tselected = undefined;\r\n\t\t} else if (!selected) {\r\n\t\t\tselected = items[items.length - 1];\r\n\t\t} else if (selected === items[0]) {\r\n\t\t\tselected = settings.disableAutoSelect ? undefined : items[items.length - 1];\r\n\t\t} else {\r\n\t\t\tfor (let i = items.length - 1; i > 0; i--) {\r\n\t\t\t\tif (selected === items[i] || i === 1) {\r\n\t\t\t\t\tselected = items[i - 1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Select the next item in suggestions\r\n\t */\r\n\tfunction selectNext(): void {\r\n\t\tif (items.length < 1) {\r\n\t\t\tselected = undefined;\r\n\t\t} else if (!selected) {\r\n\t\t\tselected = items[0];\r\n\t\t} else if (selected === items[items.length - 1]) {\r\n\t\t\tselected = settings.disableAutoSelect ? undefined : items[0];\r\n\t\t} else {\r\n\t\t\tfor (let i = 0; i < (items.length - 1); i++) {\r\n\t\t\t\tif (selected === items[i]) {\r\n\t\t\t\t\tselected = items[i + 1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction keydownEventHandler(ev: KeyboardEvent): void {\r\n\t\tconst keyCode = ev.which || ev.keyCode || 0;\r\n\r\n\t\tif (keyCode === Keys.Up || keyCode === Keys.Down || keyCode === Keys.Esc) {\r\n\t\t\tconst containerIsDisplayed = containerDisplayed();\r\n\r\n\t\t\tif (keyCode === Keys.Esc) {\r\n\t\t\t\tclear();\r\n\t\t\t} else {\r\n\t\t\t\tif (!containerDisplayed || items.length < 1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tkeyCode === Keys.Up\r\n\t\t\t\t\t? selectPrev()\r\n\t\t\t\t\t: selectNext();\r\n\t\t\t\tupdate();\r\n\t\t\t}\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tif (containerIsDisplayed) {\r\n\t\t\t\tev.stopPropagation();\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (keyCode === Keys.Enter) {\r\n\t\t\tif (selected) {\r\n\t\t\t\tsettings.onSelect(selected, input);\r\n\t\t\t\tclear();\r\n\t\t\t}\r\n\r\n\t\t\tif (preventSubmit) {\r\n\t\t\t\tev.preventDefault();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction focusEventHandler(): void {\r\n\t\tif (showOnFocus) {\r\n\t\t\tstartFetch(EventTrigger.Focus);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction startFetch(trigger: EventTrigger) {\r\n\t\t// if multiple keys were pressed, before we get update from server,\r\n\t\t// this may cause redrawing our autocomplete multiple times after the last key press.\r\n\t\t// to avoid this, the number of times keyboard was pressed will be\r\n\t\t// saved and checked before redraw our autocomplete box.\r\n\t\tconst savedKeypressCounter = ++keypressCounter;\r\n\r\n\t\tconst val = input.value.replace(/[<>]+/g, '');\r\n\t\tif (val.length >= minLen || trigger === EventTrigger.Focus) {\r\n\t\t\tclearDebounceTimer();\r\n\t\t\tdebounceTimer = window.setTimeout(function (): void {\r\n\t\t\t\tsettings.fetch(val, function (elements: T[] | false): void {\r\n\t\t\t\t\tif (keypressCounter === savedKeypressCounter && elements) {\r\n\t\t\t\t\t\titems = elements;\r\n\t\t\t\t\t\tinputValue = val;\r\n\t\t\t\t\t\tselected = (items.length < 1 || settings.disableAutoSelect) ? undefined : items[0];\r\n\t\t\t\t\t\tupdate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}, EventTrigger.Keyboard);\r\n\t\t\t}, trigger === EventTrigger.Keyboard ? debounceWaitMs : 0);\r\n\t\t} else {\r\n\t\t\tclear();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction blurEventHandler(): void {\r\n\t\t// we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (doc.activeElement !== input) {\r\n\t\t\t\tclear();\r\n\t\t\t}\r\n\t\t}, 200);\r\n\t}\r\n\r\n\t/**\r\n\t * Fixes #26: on long clicks focus will be lost and onSelect method will not be called\r\n\t */\r\n\tcontainer.addEventListener(\"mousedown\", function (evt: Event) {\r\n\t\tevt.stopPropagation();\r\n\t\tevt.preventDefault();\r\n\t});\r\n\r\n\t/**\r\n\t * Fixes #30: autocomplete closes when scrollbar is clicked in IE\r\n\t * See: https://stackoverflow.com/a/9210267/13172349\r\n\t */\r\n\tcontainer.addEventListener(\"focus\", () => input.focus());\r\n\r\n\t/**\r\n\t * This function will remove DOM elements and clear event handlers\r\n\t */\r\n\tfunction destroy(): void {\r\n\t\tinput.removeEventListener(\"focus\", focusEventHandler);\r\n\t\tinput.removeEventListener(\"keydown\", keydownEventHandler);\r\n\t\tinput.removeEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n\t\tinput.removeEventListener(\"blur\", blurEventHandler);\r\n\t\twindow.removeEventListener(\"resize\", resizeEventHandler);\r\n\t\tdoc.removeEventListener(\"scroll\", scrollEventHandler, true);\r\n\t\tclearDebounceTimer();\r\n\t\tclear();\r\n\t}\r\n\r\n\t// setup event handlers\r\n\tinput.addEventListener(\"keydown\", keydownEventHandler);\r\n\tinput.addEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n\tinput.addEventListener(\"blur\", blurEventHandler);\r\n\tinput.addEventListener(\"focus\", focusEventHandler);\r\n\twindow.addEventListener(\"resize\", resizeEventHandler);\r\n\tdoc.addEventListener(\"scroll\", scrollEventHandler, true);\r\n\r\n\treturn {\r\n\t\tdestroy\r\n\t};\r\n}\r\n\r\n","export interface IDisposable {\r\n\tdispose: () => void;\r\n\tadd?: (addDisposable: IDisposable) => void;\r\n\taddMany?: (addDisposables: IDisposable[]) => void;\r\n}\r\n\r\n/** Returns a composite disposable (disposing all child disposables) */\r\nexport function compositeDisposable(disposables: IDisposable[] | undefined): IDisposable {\r\n\t// TODO: This creates a closure, optimize?\r\n\tconst dispose = (): void => {\r\n\t\tif (composite) {\r\n\t\t\t// To avoid endless loops when calling dispose on the composite again, we first clear it.\r\n\t\t\tcomposite = null;\r\n\t\t\tif (disposables) disposables.forEach(d => d.dispose());\r\n\t\t}\r\n\t};\r\n\tconst addMany = (addDisposables: IDisposable[]): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(...addDisposables);\r\n\t};\r\n\tconst add = (addDisposable: IDisposable): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(addDisposable);\r\n\t};\r\n\tlet composite: IDisposable | null = { dispose, add, addMany };\r\n\treturn composite;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressRemoveClass,\r\n\texpressToggleClass, getParents,\r\n\tisElementVisible\r\n} from \"../common/html\";\r\nimport { IAutocompleteItem, autocomplete } from \"../external/autocomplete\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { postRequest } from \"../utils/fetch\";\r\nimport { stringToBase64 } from \"../utils/string\";\r\n\r\nexport interface IBaseFormInput {\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n\treadonly inputEl: HTMLInputElement | HTMLSelectElement;\r\n\treadonly clear: (clearValue?: boolean) => void;\r\n\treadonly setError: (error: string, clear?: boolean) => void;\r\n\treadonly hide: () => void;\r\n\treadonly show: () => void;\r\n}\r\n\r\nexport interface IFormInput extends IBaseFormInput {\r\n\treadonly inputEl: HTMLInputElement;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string | boolean;\r\n}\r\n\r\nexport interface ISelectBox extends IBaseFormInput {\r\n\treadonly inputEl: HTMLSelectElement;\r\n\treadonly dispose: () => void;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string;\r\n}\r\n\r\nexport interface IPasswordInput extends IFormInput {\r\n\treadonly validatePassword: () => Promise;\r\n}\r\n\r\nexport function createBaseFormInput(containerEl: HTMLElement, altSelector?: string): IBaseFormInput {\r\n\tconst inputEl = expressQuerySelector(containerEl, altSelector || \".a-form-input__input\", true);\r\n\tconst errorParagraphEl = expressQuerySelector(containerEl, '.a-form-input__error-text');\r\n\r\n\tconst toggleAttribute = (attr: string, force: boolean) => inputEl.toggleAttribute(attr, force);\r\n\r\n\tconst toggleEnable = (enable: boolean) => {\r\n\t\ttoggleAttribute('disabled', !enable);\r\n\t\texpressToggleClass(containerEl, 'a-form-input--disabled', !enable);\r\n\t};\r\n\r\n\tconst clear = (clearValue = false) => {\r\n\t\tclearValue && (inputEl.value = '');\r\n\t\tcontainerEl.classList.remove(\"a-form-input--validated\");\r\n\t\tcontainerEl.classList.remove(\"a-form-input--error\");\r\n\t};\r\n\r\n\tconst setError = (error: string, doClear = false) => {\r\n\t\tdoClear && clear();\r\n\t\tcontainerEl.classList.remove(\"a-form-input--validated\");\r\n\t\tcontainerEl.classList.add(\"a-form-input--error\");\r\n\r\n\t\terrorParagraphEl && (errorParagraphEl.innerHTML = error);\r\n\t};\r\n\r\n\tinputEl && inputEl.addEventListener('focusin', () => clear(false));\r\n\r\n\treturn {\r\n\t\tclear,\r\n\t\tsetError,\r\n\t\tenable: () => toggleEnable(true),\r\n\t\tdisable: () => toggleEnable(false),\r\n\t\tinputEl,\r\n\t\tshow: () => containerEl.classList.remove('u-hide'),\r\n\t\thide: () => containerEl.classList.add('u-hide')\r\n\t};\r\n}\r\n\r\nexport function createCheckBox(containerEl: HTMLElement, onChange?: (checked: boolean) => void, altSelector?: string) {\r\n\tconst input = createFormInput(containerEl, altSelector);\r\n\tlet event: IDisposable;\r\n\tonChange && (event = expressEventListener(input.inputEl, \"change\", () => onChange(!!input.getValue())));\r\n\r\n\treturn {\r\n\t\t...input,\r\n\t\tdispose: () => event && event.dispose\r\n\t};\r\n}\r\n\r\nexport function createSelectBox(containerEl: HTMLElement, onSelected?: (value?: string) => void) {\r\n\tconst baseComponent = createBaseFormInput(containerEl);\r\n\tconst selectEl = baseComponent.inputEl as HTMLSelectElement;\r\n\r\n\tconst setValue = (value: string) => (selectEl.value = value);\r\n\tconst onSelect = () => onSelected && onSelected(selectEl.value);\r\n\r\n\tconst disposableEvent = expressEventListener(selectEl, 'change', onSelect);\r\n\treturn {\r\n\t\t...baseComponent,\r\n\t\tdispose: disposableEvent.dispose,\r\n\t\tinputEl: selectEl,\r\n\t\tsetValue,\r\n\t\tgetValue: () => selectEl.value\r\n\t} as ISelectBox;\r\n}\r\n\r\nexport function createFormInput(containerEl: HTMLElement, altSelector?: string): IFormInput {\r\n\tconst baseComponent = createBaseFormInput(containerEl, altSelector);\r\n\tconst inputEl = baseComponent.inputEl as HTMLInputElement;\r\n\tconst isCheckBox = inputEl.type.toLowerCase() === 'checkbox';\r\n\r\n\tconst setValue = (value: string | boolean) =>\r\n\t\tisCheckBox\r\n\t\t\t? inputEl.checked = value.toString().toLowerCase() === \"true\"\r\n\t\t\t: (inputEl.value = value.toString());\r\n\r\n\tconst getValue = () =>\r\n\t\tisCheckBox\r\n\t\t\t? inputEl.checked\r\n\t\t\t: inputEl.value;\r\n\treturn {\r\n\t\tsetValue,\r\n\t\tgetValue,\r\n\t\t...baseComponent,\r\n\t\tinputEl\r\n\t};\r\n}\r\n\r\nexport function createPasswordFormInput(containerEl: HTMLElement): IPasswordInput {\r\n\tconst formInput = createFormInput(containerEl);\r\n\tconst iconEl = expressQuerySelector(containerEl, \".technical-password-unhide-icon\", false);\r\n\tlet disposableEvent: IDisposable | null;\r\n\r\n\tconst validatePassword = (): Promise => {\r\n\t\tconst value = formInput.inputEl.value;\r\n\r\n\t\tformInput.inputEl.dataset['lastvalidatedpassword'] = null;\r\n\t\tformInput.inputEl.dataset['lastvalidatedresult'] = null;\r\n\r\n\t\treturn !value || value.length < Number.parseInt(formInput.inputEl.dataset.minlength || '6', 10)\r\n\t\t\t? Promise.resolve(false)\r\n\t\t\t: postRequest<{ password: string }, boolean>('/ajaxxhr/Login/ValidatePassword',\r\n\t\t\t\t{\r\n\t\t\t\t\tpassword: stringToBase64(formInput.inputEl.value)\r\n\t\t\t\t},\r\n\t\t\t\t{ headers: { 'Content-type': 'application/json; charset=utf-8' } }).then(res => {\r\n\t\t\t\t\tformInput.inputEl.dataset['lastvalidatedpassword'] = value;\r\n\t\t\t\t\tformInput.inputEl.dataset['lastvalidatedresult'] = `${res}`;\r\n\t\t\t\t\treturn res;\r\n\t\t\t\t});\r\n\t};\r\n\r\n\tconst onPasswordShowHideIconClick = () => {\r\n\t\tswitch (formInput.inputEl.getAttribute(\"type\")) {\r\n\t\t\tcase \"password\":\r\n\t\t\t\tformInput.inputEl.setAttribute(\"type\", \"text\");\r\n\t\t\t\tif (iconEl) iconEl.classList.add(\"a-form-input__password-unhide-icon--hide\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"text\":\r\n\t\t\t\tformInput.inputEl.setAttribute(\"type\", \"password\");\r\n\t\t\t\tif (iconEl) iconEl.classList.remove(\"a-form-input__password-unhide-icon--hide\");\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\tformInput.disable();\r\n\t\tif (iconEl) {\r\n\t\t\ticonEl.style.cursor = 'not-allowed';\r\n\t\t\tdispose();\r\n\t\t}\r\n\t};\r\n\r\n\tconst enable = () => {\r\n\t\tformInput.enable();\r\n\t\tif (iconEl) {\r\n\t\t\ticonEl.style.cursor = 'pointer';\r\n\t\t\taddEvent();\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tif (disposableEvent) disposableEvent.dispose();\r\n\t};\r\n\tconst addEvent = () => (disposableEvent = iconEl ? expressEventListener(iconEl, 'click', onPasswordShowHideIconClick) : null);\r\n\r\n\tif (iconEl) addEvent();\r\n\r\n\treturn {\r\n\t\tvalidatePassword,\r\n\t\t...formInput,\r\n\t\tdisable,\r\n\t\tenable,\r\n\t};\r\n}\r\n\r\ninterface IAutoCompleteItem extends IAutocompleteItem {\r\n\treadonly value: string;\r\n\treadonly label: string;\r\n}\r\n\r\nexport interface ICreateTextInputWithAutoCompleteDependencies {\r\n\treadonly autoCompleteSearch: (searchTerm: string) => Promise<{ value: string, label: string }[]>;\r\n\treadonly onSelect?: (item: { value: string, label: string }) => void;\r\n\treadonly customize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n\treadonly onOpen?: () => void,\r\n\treadonly onClose?: () => void,\r\n\treadonly renderTextContent?: (item: { value: string, label: string }, currentSearchterm: string) => string;\r\n\treadonly debounceWaitMs?: number;\r\n\treadonly containerInsertPosition?: InsertPosition;\r\n\treadonly containerClass?: string;\r\n\treadonly disableAutoSelect?: boolean;\r\n\treadonly preventSubmit?: boolean;\r\n\treadonly minLength?: number;\r\n}\r\n\r\nexport function createTextInputWithAutoComplete(inputEl: HTMLInputElement, deps: ICreateTextInputWithAutoCompleteDependencies) {\r\n\tconst onCloseDisposable = compositeDisposable([]);\r\n\tinputEl.setAttribute('autocomplete', 'off');\r\n\t// defaults are for choice of delivery\r\n\tconst {\r\n\t\tautoCompleteSearch,\r\n\t\tonSelect,\r\n\t\tcustomize,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t\trenderTextContent,\r\n\t\tdebounceWaitMs = 250,\r\n\t\tcontainerInsertPosition = 'beforeend',\r\n\t\tcontainerClass = 'm-autocomplete a-form-input__autocomplete',\r\n\t\tdisableAutoSelect = true,\r\n\t\tpreventSubmit = false,\r\n\t\tminLength = 3\r\n\t} = deps;\r\n\r\n\tconst onMouseDownEvent = (ev: MouseEvent, container: HTMLDivElement) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (getParents(ev.target, \".technical-search-suggestions\").length < 1) onClose();\r\n\t\tcontainer.remove();\r\n\t\tonCloseDisposable.dispose();\r\n\t};\r\n\r\n\tconst autocompleteResult = autocomplete({\r\n\t\tminLength,\r\n\t\tinput: inputEl,\r\n\t\tdisableAutoSelect,\r\n\t\tpreventSubmit,\r\n\t\tonSelect: (item: IAutoCompleteItem, input) => {\r\n\t\t\tinput.value = item.label || item.value;\r\n\t\t\tonSelect && onSelect({ value: item.value, label: item.label });\r\n\t\t},\r\n\t\tfetch: (text: string, update: (items: IAutoCompleteItem[]) => void) => {\r\n\t\t\ttext = text.toLowerCase();\r\n\t\t\tautoCompleteSearch(text)\r\n\t\t\t\t.then(res => update(res as IAutoCompleteItem[]));\r\n\t\t},\r\n\t\trender: (item: IAutoCompleteItem, currentValue: string) => {\r\n\t\t\tconst itemEl = document.createElement(\"div\");\r\n\t\t\texpressAddClass(itemEl, 'm-autocomplete__item autocomplete-suggestion technical-search-suggestions');\r\n\t\t\titemEl.innerHTML = renderTextContent && renderTextContent(item, currentValue) || `${item.label} - ${item.value}`;\r\n\r\n\t\t\treturn itemEl;\r\n\t\t},\r\n\t\tcustomize: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number): void => {\r\n\t\t\tcustomize && customize(input, inputRect, container, maxHeight);\r\n\t\t\texpressRemoveClass(container, 'autocomplete');\r\n\t\t\texpressAddClass(container, containerClass);\r\n\t\t\tcontainer.removeAttribute('style');\r\n\t\t\tcontainer.style.display = \"block\";\r\n\t\t\tconst inputContainerEl = input.parentElement!;\r\n\t\t\tinputContainerEl.insertAdjacentElement(containerInsertPosition, container);\r\n\t\t\tonOpen && onOpen();\r\n\t\t\tif (onClose) {\r\n\t\t\t\tgetParents(container).forEach(el => {\r\n\t\t\t\t\tonCloseDisposable.add(expressEventListener(el, \"mousedown\", (ev) => { onMouseDownEvent(ev, container); }));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tdebounceWaitMs\r\n\t});\r\n\r\n\tconst disposable = onClose\r\n\t\t? compositeDisposable([expressEventListener(inputEl, 'input', _ => { if (inputEl.value && inputEl.value.length < minLength) onClose(); })])\r\n\t\t: null;\r\n\r\n\treturn {\r\n\t\tdispose: () => { disposable && disposable.dispose(); onCloseDisposable && onCloseDisposable.dispose; autocompleteResult.destroy(); },\r\n\t};\r\n}\r\n","import { deleteRequest, getHtmlRequest, postRequest } from \"../utils/fetch\";\r\nimport { stringToBase64 } from \"../utils/string\";\r\n\r\nexport interface IToggleSubscription {\r\n\tapplicationId: string;\r\n\tpersonId: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\temail: string;\r\n\tsource: string;\r\n\tnewsletter: boolean;\r\n\tpersonalMessage?: boolean;\r\n\tmailFrequency?: number;\r\n\tpostalMail?: boolean;\r\n\temarsysData?: string;\r\n}\r\n\r\nexport interface ISubscription {\r\n\tapplicationId: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\temail: string;\r\n\tsource: string;\r\n}\r\n\r\nexport interface IUnSubscription {\r\n\tapplicationId: string;\r\n\tpointOfSaleId: string;\r\n\tpersonId: string;\r\n\temarsysData?: string;\r\n}\r\n\r\nexport function subscribeAsync(email: string, appId: string, posId: string, lang: string, source?: string) {\r\n\tconst subscription: ISubscription = {\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tlanguage: lang,\r\n\t\temail,\r\n\t\tsource\r\n\t};\r\n\r\n\treturn postRequest(window.context.ecomApiUrl + \"/subscriptions/subscribe\", subscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport function toggleSubscribeAsync(personId: string, email: string, appId: string, posId: string, lang: string, source?: string, newsletter?: boolean, personalMessage?: boolean, mailFrequency?: number, postalMail?: boolean, emarsysData?: string) {\r\n\tconst toggleSubscription: IToggleSubscription = {\r\n\t\tpersonId,\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tlanguage: lang,\r\n\t\temail,\r\n\t\tsource,\r\n\t\tnewsletter,\r\n\t\tpersonalMessage,\r\n\t\tmailFrequency,\r\n\t\tpostalMail,\r\n\t\temarsysData\r\n\t};\r\n\r\n\treturn postRequest(window.context.ecomApiUrl + \"/subscriptions/togglesubscribe\", toggleSubscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport function unSubscribeAsync(personId: string, appId: string, posId: string, emarsysData?: string) {\r\n\tconst unSubscription: IUnSubscription = {\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tpersonId: personId,\r\n\t\temarsysData: emarsysData\r\n\t};\r\n\r\n\treturn deleteRequest(window.context.ecomApiUrl + \"/subscriptions/unsubscribe\", unSubscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport enum Gender {\r\n\tUndefined = 0,\r\n\tMale = 1,\r\n\tFemale = 2,\r\n\tNeutral = 3\r\n}\r\n\r\nexport interface IAccount {\r\n\tfirstName: string;\r\n\tlastName: string;\r\n\temail: string;\r\n\tgender: Gender;\r\n\tdateOfBirth: Date | null;\r\n\tmobileNumber: string;\r\n\tpersonalNumber?: string;\r\n}\r\n\r\nexport enum UpdateAccountResult {\r\n\tsuccess = 0,\r\n\tduplicateEmail = 1,\r\n\tduplicateEmailInOtherDomain = 2\r\n}\r\n\r\nexport function updateAccountAsync(pointOfSaleId: string, account: IAccount): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId,\r\n\t\taccount: account\r\n\t};\r\n\treturn postRequest<{ pointOfSaleId, account }, IUpdateAccountResponse>('/apicore/myaccountapi/updateaccount', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IMailInOtherDomainError {\r\n\treadonly urlWithLink: string,\r\n\treadonly accountEmail: string\r\n}\r\n\r\nexport interface ISetPasswordResponse {\r\n\treadonly status: ChangePasswordStatus,\r\n\treadonly label: string\r\n}\r\n\r\nexport interface IUpdateAccountResponse {\r\n\treadonly status: UpdateAccountResult,\r\n\treadonly label: string\r\n}\r\n\r\nexport function getDuplicateMailInOtherDomainError(accountEmail: string, pointOfSaleId: string): Promise {\r\n\tconst args = {\r\n\t\taccountEmail,\r\n\t\tpointOfSaleId\r\n\t};\r\n\r\n\treturn postRequest<{ accountEmail, pointOfSaleId }, IMailInOtherDomainError>('apicore/myaccount/getduplicatemailinotherdomainerror', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport enum ChangePasswordStatus {\r\n\tOK = 0,\r\n\tInvalidFormat,\r\n\tEqualToOld,\r\n\tInvalidOld,\r\n\tInvalidNew,\r\n\tWeakPassword,\r\n\tError\r\n}\r\nexport function setPasswordAsync(oldPassword: string, newPassword: string, pointOfSaleId: string): Promise {\r\n\tconst args = { oldPassword, newPassword, pointOfSaleId };\r\n\r\n\targs.oldPassword = stringToBase64(oldPassword);\r\n\targs.newPassword = stringToBase64(newPassword);\r\n\treturn postRequest('/apicore/myaccountapi/setpassword', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function getAddressTiles(currentpage: string): Promise {\r\n\treturn getHtmlRequest(`/apicore/myaccountapi/getaddresstiles?currentpage=${currentpage}`, { cache: \"no-cache\" });\r\n}\r\n\r\nexport enum OkResult {\r\n\tOK = 0\r\n}\r\n\r\nexport function setAccountPreferencesAsync(configKey: string, value: boolean): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tconfigKey,\r\n\t\tvalue: value.toString()\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/setaccountpreferences', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function saveProductPreferencesAsync(disableAutoRedEyeRemoval: boolean, enableToggleimageenhancement: boolean): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tdisableAutoRedEyeRemoval,\r\n\t\tenableToggleimageenhancement\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/saveproductpreferences', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function setImageEnhancementAsync(enable: boolean): Promise {\r\n\tconst args = {\r\n\t\tenable\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/toggleimageenhancement', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IGdprAccountResult {\r\n\tsuccess: boolean;\r\n\tinfo: string;\r\n}\r\n\r\nexport function actionByMethodOnAccountAsync(method: string, password: string): Promise {\r\n\tconst args = {\r\n\t\tpassword\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/' + method, args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IGdprDownload {\r\n\tgdprDownloadLink: string;\r\n}\r\n\r\nexport function canDownloadGdprDataAsync(): Promise {\r\n\tconst args = {};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/CanDownloadGdprData', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface ICheckAccountValidityResponse {\r\n\treadonly isValid: boolean;\r\n}\r\n\r\nexport function checkAccountValidityAsync(oldAccountId: string, newAccountId: string): Promise {\r\n\tconst args = {\r\n\t\toldAccountId,\r\n\t\tnewAccountId\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/CheckAccountValidity', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n","import { expressEventListener, expressQuerySelector, getParentWithClassName } from \"../common/html\";\r\nimport { createButton } from \"./button\";\r\nimport { createFormInput, createPasswordFormInput, createSelectBox, IFormInput, IPasswordInput, ISelectBox } from \"./form-input\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\n\r\n\r\nexport interface IInitFormDependencies {\r\n\treadonly alternativeButton?: HTMLButtonElement;\r\n\treadonly buttonSelector?: string;\r\n\treadonly onSubmitForm: (data: { [inputName: string]: string }) => Promise;\r\n\treadonly submitOnEnter?: boolean;\r\n\treadonly validatorOptions?: ICreateFromValidatorOptions;\r\n}\r\n\r\n// provide custom behaviour\r\nexport interface ICreateFromValidatorOptions {\r\n\treadonly classTo?: string; // class of the parent element where the error/success class is added\r\n\treadonly errorClass?: string;\r\n\treadonly successClass?: string;\r\n\treadonly errorTextParent?: string; // class of the parent element where error text element is appended\r\n\treadonly errorTextTag?: string; // type of element to create for the error text\r\n\treadonly errorTextClass?: string; // class of the error text element\r\n\treadonly onValidate?: () => void;\r\n}\r\n\r\nexport interface IFormValidator {\r\n\treadonly validate: () => boolean;\r\n\treadonly reset: () => void;\r\n}\r\n\r\nexport interface IForm {\r\n\treadonly dispose: () => void;\r\n\treadonly disableForm: (disable: boolean) => void;\r\n\treadonly disableInput: (name: string) => void;\r\n\treadonly validate: () => Promise;\r\n\treadonly setErrors: (clear?: boolean, ...errors: { name: string, error: string }[]) => void;\r\n\treadonly clearInputs: (clearValue?: boolean, ...names: string[]) => void;\r\n\treadonly clearAll: () => void;\r\n\treadonly setValues: (...values: { name: string, value: string }[]) => void;\r\n\treadonly hideInput: (name: string) => void;\r\n\treadonly inputs: { [p: string]: ISelectBox | IFormInput }\r\n}\r\n\r\nexport function initForm(formEl: HTMLFormElement, deps: IInitFormDependencies) {\r\n\tconst {\r\n\t\talternativeButton,\r\n\t\tonSubmitForm,\r\n\t\tbuttonSelector,\r\n\t\tsubmitOnEnter,\r\n\t\tvalidatorOptions,\r\n\t} = deps;\r\n\tconst submitButtonEl = alternativeButton || expressQuerySelector(formEl, buttonSelector || '.m-form__button-continue', true);\r\n\tconst validator = createFormValidator(formEl, validatorOptions);\r\n\tlet onKeyUpEvent: IDisposable;\r\n\tconst formElements = [].slice.call(formEl.elements);\r\n\tconst inputs: { [name: string]: ISelectBox | IFormInput; } = {};\r\n\r\n\tformElements\r\n\t\t.filter(el => !el.matches(\"button\"))\r\n\t\t.forEach(el => {\r\n\t\t\t// The element can be : INPUT (regular or password), TEXTAREA, SELECT,\r\n\t\t\tlet input: ISelectBox | IFormInput | null = null;\r\n\t\t\tconst email = el.attributes.getNamedItem(\"email\");\r\n\t\t\tif ((email && email.value === \"email\") || el.type === \"email\")\r\n\t\t\t\tel.maxLength = 100;\r\n\r\n\t\t\tif (el.classList.contains('a-form-input__select'))\r\n\t\t\t\tinput = createSelectBox(getParentWithClassName(el, 'a-form-input')!);\r\n\t\t\telse if (el.classList.contains('a-form-input__input'))\r\n\t\t\t\tinput = el.type === \"password\" ? createPasswordFormInput(getParentWithClassName(el, 'a-form-input')!) : createFormInput(getParentWithClassName(el, 'a-form-input')!);\r\n\r\n\t\t\t// If not those 3, it's something else -> leave it alone\r\n\t\t\tif (input)\r\n\t\t\t\tinputs[input.inputEl.id.toLowerCase()] = input;\r\n\t\t});\r\n\r\n\tconst getInputs = () => Object.keys(inputs).map(key => inputs[key]);\r\n\r\n\tconst clearAll = (clearValues = false) => {\r\n\t\tgetInputs()\r\n\t\t\t.map(input => {\r\n\t\t\t\tinput.clear(clearValues);\r\n\t\t\t\tinput.setError('', true);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst resetValidation = () => {\r\n\t\tclearAll();\r\n\t\tvalidator.reset();\r\n\t};\r\n\r\n\tconst validate = async (): Promise => {\r\n\t\tresetValidation();\r\n\r\n\t\t// Pristine validation cannot handle async api calls\r\n\t\t// Call the validation before the pristine call\r\n\t\t// So pristine can look at dataattributes to valiate\r\n\t\tconst validations = Object.keys(inputs)\r\n\t\t\t.map(name => !inputs[name]['validatePassword'] ? Promise.resolve(true) : (inputs[name] as IPasswordInput).validatePassword());\r\n\t\tawait Promise.all(validations);\r\n\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\tconst formData = () => {\r\n\t\tconst data: { [name: string]: string } = {};\r\n\t\tObject.keys(inputs).forEach(name => data[name] = inputs[name].getValue().toString() || \"\");\r\n\t\treturn data;\r\n\t};\r\n\r\n\tconst onSubmit = () => {\r\n\t\treturn validate().then(res => res ? onSubmitForm(formData()) : Promise.resolve());\r\n\t};\r\n\r\n\tconst submitButton = createButton(submitButtonEl, onSubmit);\r\n\r\n\tif (submitOnEnter && submitButtonEl && submitButtonEl.type.toLowerCase() !== \"submit\") {\r\n\t\tonKeyUpEvent = expressEventListener(\r\n\t\t\tformEl,\r\n\t\t\t'keypress',\r\n\t\t\t(ev: KeyboardEvent) => {\r\n\t\t\t\tif (ev.key === \"Enter\" || ev.keyCode === 13) {\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tonSubmit();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tconst getInputByName: (name: string) => ISelectBox | IFormInput | undefined =\r\n\t\t(name: string) => inputs[name.toLowerCase()];\r\n\r\n\tconst dispose = () => {\r\n\t\tclearAll(true);\r\n\t\tsubmitButton.dispose();\r\n\t\tonKeyUpEvent && onKeyUpEvent.dispose();\r\n\t};\r\n\r\n\tconst toggleSubmitButton = (enable: boolean) => enable ? submitButton.enable() : submitButton.disable();\r\n\r\n\tconst setError = (name: string, error: string, clear = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setError(error, clear);\r\n\t};\r\n\r\n\tconst setErrors = (clear = false, ...errors: { name: string, error: string }[]) => {\r\n\t\terrors.forEach(e => setError(e.name, e.error, clear));\r\n\t\tif (errors.length) {\r\n\t\t\tconst input = getInputByName(errors[0].name);\r\n\t\t\tif (input) input.inputEl.parentElement!.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n\t\t}\r\n\t};\r\n\r\n\tconst clearInput = (name: string, clearValue = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.clear(clearValue);\r\n\t};\r\n\r\n\tconst clearInputs = (clearValue = false, ...names: string[]) => names.forEach(name => clearInput(name, clearValue));\r\n\r\n\tconst disableForm = (disable: boolean) => {\r\n\t\tgetInputs().map(i => disable ? i.disable() : i.enable());\r\n\t\tresetValidation();\r\n\t\ttoggleSubmitButton(!disable);\r\n\t};\r\n\r\n\tconst disableInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.disable();\r\n\t};\r\n\r\n\tconst setValue = (name: string, value: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setValue(value);\r\n\t};\r\n\r\n\tconst setValues = (...values: { name: string, value: string }[]) =>\r\n\t\tvalues.filter(v => getInputByName(v.name))\r\n\t\t\t.forEach(v => setValue(v.name, v.value));\r\n\r\n\tconst hideInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.hide();\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tdisableForm,\r\n\t\tdisableInput,\r\n\t\tvalidate,\r\n\t\tsetErrors,\r\n\t\tclearInputs,\r\n\t\tclearAll: () => clearAll(true),\r\n\t\tsetValues,\r\n\t\thideInput,\r\n\t\tinputs\r\n\t} as IForm;\r\n}\r\n\r\nexport function createFormValidator(form: HTMLFormElement, options: ICreateFromValidatorOptions = {}): IFormValidator {\r\n\r\n\tconst {\r\n\t\tclassTo = \"a-form-input\",\r\n\t\terrorClass = \"a-form-input--error\",\r\n\t\tsuccessClass = \"a-form-input--validated\",\r\n\t\terrorTextClass = \"a-form-input__error-text\",\r\n\t\terrorTextParent = \"a-form-input\",\r\n\t\terrorTextTag = \"p\",\r\n\t\tonValidate\r\n\t} = options;\r\n\r\n\tconst config: config = {\r\n\t\tclassTo: classTo,\r\n\t\terrorClass: errorClass,\r\n\t\tsuccessClass: successClass,\r\n\t\terrorTextClass: errorTextClass,\r\n\t\terrorTextParent: errorTextParent,\r\n\t\terrorTextTag: errorTextTag\r\n\t};\r\n\r\n\tconst validator = new Pristine(form, config, false);\r\n\tconst validate = () => {\r\n\t\tif (onValidate) onValidate();\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\treturn {\r\n\t\tvalidate,\r\n\t\treset: () => validator.reset()\r\n\t};\r\n}\r\n","export function getFullQuerystring(url?: string): string {\r\n\turl = url || window.location.href;\r\n\tconst pos = url.indexOf(\"?\");\r\n\tif (pos > -1) {\r\n\t\treturn url.substring(pos + 1);\r\n\t} else {\r\n\t\treturn url;\r\n\t}\r\n}\r\n\r\nexport function getParameters(url?: string): { [key: string]: string } {\r\n\tconst queryString = getFullQuerystring(url);\r\n\t// remove hash parameter and split querystring param\r\n\tconst pairs = queryString.split('#')[0].split(\"&\");\r\n\tconst params: { [key: string]: string } = {};\r\n\tfor (const pair of pairs) {\r\n\t\tconst [key, value] = pair.split(\"=\");\r\n\t\tparams[key.toLowerCase()] = value !== undefined ? value : \"true\"; // Providing just the key means key=true\r\n\t}\r\n\treturn params;\r\n}\r\n\r\nexport function getParameter(key: string, url?: string, required?: boolean): string;\r\nexport function getParameter(key: string, url?: string, required = false): string {\r\n\tconst queryStringParam = getParameters(url)[key ? key.toLowerCase() : key];\r\n\tif (required && !queryStringParam) throw new Error(`No queryStringParam for Required key: ${key}`);\r\n\treturn queryStringParam;\r\n}\r\n\r\nexport function updateParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\r\n\tlet newAdditionalURL = \"\";\r\n\tlet tempArray = url.split(\"#\");\r\n\tconst hash = tempArray[1] ? tempArray[1] : '';\r\n\tconst additionalURL = tempArray[0] ? tempArray[0].split(\"?\")[1] : '';\r\n\tconst baseURL = tempArray[0] ? tempArray[0].split(\"?\")[0] : '';\r\n\tlet temp = \"\";\r\n\tif (additionalURL) {\r\n\t\ttempArray = additionalURL.split(\"&\");\r\n\t\tfor (let i = 0; i < tempArray.length; i++) {\r\n\t\t\tif (tempArray[i].split('=')[0] !== key) {\r\n\t\t\t\tnewAdditionalURL += temp + tempArray[i];\r\n\t\t\t\ttemp = \"&\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet result = temp;\r\n\tif (value)\r\n\t\tresult += \"\" + key + \"=\" + value;\r\n\telse\r\n\t\tresult = result.substring(0, result.length - 1);\r\n\r\n\tif (!newAdditionalURL && !result)\r\n\t\treturn baseURL + (hash ? '#' + hash : '');\r\n\r\n\treturn baseURL + \"?\" + newAdditionalURL + result + (hash ? '#' + hash : '');\r\n}\r\n\r\nexport function addParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\tif (url.indexOf(key) > 0) return updateParameter(key, value, url);\r\n\tif (url.indexOf('?') > 0) {\r\n\t\turl += '&' + key + \"=\" + value;\r\n\t} else {\r\n\t\turl += '?' + key + \"=\" + value;\r\n\t}\r\n\treturn url;\r\n}\r\n\r\nexport function objectToQueryString(o: object): string {\r\n\treturn '?' + Object.keys(o).map(function (key) {\r\n\t\treturn key + '=' + o[key];\r\n\t}).join('&');\r\n}\r\n\r\nexport function queryRemoveKeys(queryKeys: string[]): string {\r\n\tlet url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\r\n\tqueryKeys.forEach(x => {\r\n\t\turl = updateParameter(x ? x.toLowerCase() : x, '', url);\r\n\t});\r\n\r\n\treturn url;\r\n}\r\n\r\nexport function queryRemove(): string {\r\n\tconst url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\tconst b = url.substring(a);\r\n\treturn url.replace(b, \"\");\r\n}\r\n","import {getCookie} from \"../utils/cookie\";\r\n\r\nconst trackEvent = (category: string, action: string, customParameters?: object) => {\r\n\tconst dataLayer = (window).dataLayer || [];\r\n\tdataLayer.push({\r\n\t\tevent: category,\r\n\t\taction: action,\r\n\t\t...customParameters\r\n\t});\r\n};\r\n\r\ninterface IOrderStatusParams {\r\n\torderNumber?: string;\r\n\torderStatus?: string;\r\n\tpaymentStatus?: string;\r\n\tpvc?: string;\r\n\trepro?: boolean;\r\n}\r\n\r\nexport function trackOrderStatusEvent(action: string, partialEventParams: IOrderStatusParams, nrOrdersInAccount = -1, nrItemsInOrder = -1) {\r\n\ttrackEvent('orderStatus', action, { accountId: getCookie('accid'), nrOrdersInAccount, nrItemsInOrder, ...partialEventParams });\r\n}\r\n\r\nexport function trackContactPageEvent(action: string) {\r\n\ttrackEvent('contactPage', action);\r\n}\r\n\r\nexport function trackSortingOnPop(action: string) {\r\n\ttrackEvent('sortingOnPOP', action);\r\n}\r\n\r\nexport function trackComponentEvent(action: string) {\r\n\ttrackEvent('component', action);\r\n}\r\n\r\nexport function trackAddressValidationEvent(action: string) {\r\n\ttrackEvent('addressValidation', action);\r\n}\r\n\r\nexport function trackFiltersEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('filters', action, eventParams);\r\n}\r\n\r\nexport function trackSliderEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('slider', action, eventParams);\r\n}\r\n\r\nexport function trackMgmEvent(action: string) {\r\n\ttrackEvent('MGMProgram', action);\r\n}\r\n\r\nexport function trackAccountPrefEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('accountPreferences', action, eventParams);\r\n}\r\n\r\nexport function ProductEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('productSelection', action, eventParams);\r\n}\r\n\r\nexport interface IRecommendationEventParams {\r\n\tpageType?: string;\r\n\tpageCode?: string;\r\n\tpvc?: string;\r\n}\r\nexport function trackRecommendationCartEvent(action: string, recommendationLabel?: IRecommendationEventParams) {\r\n\ttrackEvent('recommendations', action, recommendationLabel);\r\n}\r\n\r\nexport interface IShopInShopEventParams {\r\n\tpvc?: string;\r\n}\r\nexport function trackShopInShopEvent(action: string, eventParams?: IShopInShopEventParams) {\r\n\ttrackEvent('shopInShop', action, eventParams);\r\n}\r\n","export function isValidTextWithoutAngleBrackets(text: string) {\r\n\tif (!text) return false;\r\n\treturn new RegExp(\"^[^<>]+$\").test(text);\r\n}\r\n\r\nexport function isValidEmailAddress (email: string) {\r\n\tconst sValidEmail = '^((([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+(\\\\.([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+)*)|((\\\\x22)((((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(([\\\\x01-\\\\x08\\\\x0b\\\\x0c\\\\x0e-\\\\x1f\\\\x7f]|\\\\x21|[\\\\x23-\\\\x5b]|[\\\\x5d-\\\\x7e])|(([\\\\x01-\\\\x09\\\\x0b\\\\x0c\\\\x0d-\\\\x7f]))))*(((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(\\\\x22)))@((([a-zA-Z]|\\\\d)|(([a-zA-Z]|\\\\d)([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z]|\\\\d)))\\\\.)+(([a-zA-Z])|(([a-zA-Z])([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z])))$';\r\n\tconst reValidEmail = new RegExp(sValidEmail);\r\n\treturn reValidEmail.test(punycode.toUnicode(email));\r\n}\r\n\r\nexport function isValidWithoutNonAlphaNumericCharsAtEnd(text: string, el: HTMLElement) {\r\n\t// Our zipcode db contains values like 'ANTWERPEN (2000)' as city => these should be valid => if last == ) return true\r\n\tconst reg = new RegExp('^[\\\\p{L}\\\\p{N}]*$', 'u');\r\n\tconst elName = el.getAttribute(\"name\") || \"\";\r\n\t// Why trim? We allow spaces as we trim those in the backend code\r\n\tconst alsoAlsoAllowBracket = elName && elName.toLowerCase().indexOf('city') !== -1;\r\n\tconst last = text.trim().charAt(text.trim().length - 1);\r\n\treturn reg.test(last) || (alsoAlsoAllowBracket && last === ')') || last === '.';\r\n}\r\n\r\nexport function canNotContainOnlyNumerics(text: string) {\r\n\tconst reg = new RegExp('^[0-9]+$');\r\n\treturn !reg.test(text);\r\n}\r\n\r\nexport function isValidOrderNumber(orderNr: string) {\r\n\treturn onlyNumber(orderNr) && orderNr.length === 14;\r\n}\r\n\r\nexport function onlyNumber(input: string): boolean {\r\n\treturn Boolean(input.match(/^[0-9]*$/));\r\n}\r\n\r\nexport function isTempAccountEmail(email: string): boolean {\r\n\treturn email.indexOf('TEMP_ACCOUNT_') >= 0;\r\n}\r\n","import {\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressAddClass,\r\n\texpressRemoveClass,\r\n\thide,\r\n\tshow,\r\n\tisElementVisible\r\n} from \"../common/html\";\r\nimport { initForm } from \"./form\";\r\nimport { subscribeAsync, toggleSubscribeAsync } from \"../services/account-service\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\nimport {trackAccountPrefEvent} from \"../common/events\";\r\nimport {isTempAccountEmail} from \"../utils/validation\";\r\n\r\n\r\nexport function createNewsletterSubscribeAndUnsubscribe(customDocument: Element = null) {\r\n\tconst subscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-subscribe\");\r\n\tconst unSubscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-unsubscribe\");\r\n\r\n\tif (subscriptionForms && subscriptionForms.length > 0) {\r\n\t\tlet ioSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterSubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tsubscriptionForms.forEach(el => ioSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tsubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterSubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (unSubscriptionForms && unSubscriptionForms.length > 0) {\r\n\t\tlet ioUnSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioUnSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterUnsubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tunSubscriptionForms.forEach(el => ioUnSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tunSubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterUnsubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function createNewsletterSubscribe(containerEl: HTMLElement) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-subscribe-email', true);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || \"\";\r\n\tconst email = getCookie('LastUsedEmail');\r\n\r\n\temailEl.setAttribute('required', 'required');\r\n\temailEl.setAttribute('emailRFC822', 'true');\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tlet source = formEl.dataset.source || undefined;\r\n\t!source && (source = emailEl.dataset.sourceid);\r\n\r\n\tconst subscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\treturn subscribeAsync(emailEl.value, appId, posId, lang, source)\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\ttrackAccountPrefEvent( \"Subscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t\t\t\t\t\texpressAddClass(formEl, 'm-newsletter__form');\r\n\t\t\t\t\t\twriteCookieThatExpiresAtTheEndOfTheDay(\"subscribedInThisSession\", \"true\");\r\n\t\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-subscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: subscribeForm.dispose };\r\n\r\n}\r\n\r\nexport interface INewsLetterUnsubscribeOptions {\r\n\tonSuccess?: () => void;\r\n\tonError?: () => void;\r\n\tpreFillLastUsedEmail?: boolean;\r\n}\r\n\r\nexport function createNewsletterUnsubscribe(containerEl: HTMLElement, opts?: INewsLetterUnsubscribeOptions, emarsysData?: string) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst successMessageEl = expressQuerySelector(containerEl, '.technical-success-message', false);\r\n\tconst errorMessageEl = expressQuerySelector(containerEl, '.technical-error-message', false);\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-unsubscribe-mail', false);\r\n\tconst checkBoxEl = expressQuerySelector(formEl, '#newsletter', false);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || window.context.language;\r\n\tconst preFillLastUsedEmail = opts ? opts.preFillLastUsedEmail !== undefined ? opts.preFillLastUsedEmail : true : true;\r\n\tconst email = getParameter('email') || preFillLastUsedEmail ? getCookie('LastUsedEmail') : '';\r\n\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tconst showSuccessMessage = () => {\r\n\t\tsuccessMessageEl && expressRemoveClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressAddClass(errorMessageEl, \"u-hide\");\r\n\t\thide(formEl);\r\n\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t};\r\n\r\n\tconst showErrorMessage = () => {\r\n\t\tsuccessMessageEl && expressAddClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressRemoveClass(errorMessageEl, \"u-hide\");\r\n\t\tshow(formEl);\r\n\t};\r\n\r\n\temailEl && emailEl.setAttribute('required', 'required');\r\n\tif (checkBoxEl) checkBoxEl.setAttribute('required', 'required');\r\n\r\n\tconst unsubscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\tconst personIdFromQuery = getParameter(\"personid\");\r\n\t\t\t\treturn (emailEl && emailEl.value) || personIdFromQuery\r\n\t\t\t\t\t? toggleSubscribeAsync(personIdFromQuery, emailEl && emailEl.value, appId, posId, lang, 'NewsletterUnsubscribe', false, false, undefined, undefined, emarsysData)\r\n\t\t\t\t\t\t.then(_ => {\r\n\t\t\t\t\t\t\topts?.onSuccess ? opts.onSuccess() : showSuccessMessage();\r\n\t\t\t\t\t\t\ttrackAccountPrefEvent(\"Unsubscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(_ => opts?.onError ? opts.onError() : showErrorMessage())\r\n\t\t\t\t\t: Promise.resolve(opts?.onSuccess ? opts.onSuccess() : showSuccessMessage());\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-unsubscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: unsubscribeForm.dispose };\r\n}\r\n","export function isTouchDevice (): boolean {\r\n\tlet result = false;\r\n\tif (window.PointerEvent && ('maxTouchPoints' in navigator)) {\r\n\t\tif (navigator.maxTouchPoints > 0) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t} else {\r\n\t\tif (window.matchMedia && window.matchMedia(\"(any-pointer:coarse)\").matches) {\r\n\t\t\tresult = true;\r\n\t\t} else if (window.TouchEvent || ('ontouchstart' in window)) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nexport function isMobileDevice (): boolean {\r\n\treturn window.matchMedia(\"only screen and (max-width: 960px)\").matches;\r\n}\r\n","export function debounce void>(fn: F, delay: number) {\r\n\tlet timeoutID = 0;\r\n\r\n\tconst callable = (...args: any[]) => {\r\n\t\tclearTimeout(timeoutID);\r\n\t\ttimeoutID = window.setTimeout(() => fn.apply(args), delay);\r\n\t};\r\n\r\n\treturn callable;\r\n}\r\n\r\nexport function throttle void>(fn: F, delay: number, fnAlways?: F) {\r\n\tlet lastTimestamp = 0;\r\n\r\n\tconst callable = (...args: any[]) => {\r\n\t\tconst now = Date.now();\r\n\r\n\t\tfnAlways && fnAlways(...args);\r\n\t\tif (!lastTimestamp || now - lastTimestamp >= delay) {\r\n\t\t\tlastTimestamp = now;\r\n\t\t\tfn(...args);\r\n\t\t}\r\n\t};\r\n\r\n\treturn callable;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\tgetParentWithClassName,\r\n\thasClass,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass\r\n} from \"../common/html\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { isTouchDevice } from \"../common/device\";\r\nimport { debounce } from \"../utils/debounce\";\r\n\r\nexport interface ICreateNavigationDesktopDependencies {\r\n\treadonly loadDesktopMenuItemAsync: (firstLevel: number, secondLevel: number) => Promise;\r\n}\r\n\r\nexport function initNavigationDesktop(containerEl: HTMLElement, deps: ICreateNavigationDesktopDependencies) {\r\n\tconst firstLevelMenuEls = expressQuerySelectorAll(containerEl, \".technical-desktop-first-level-menu-item\");\r\n\tconst { loadDesktopMenuItemAsync } = deps;\r\n\tconst loadedMenuItemsKeys: number[][] = [];\r\n\tlet disposable: IDisposable;\r\n\tconst firstLevelActiveClass = \"o-menu-first-level__button--active\";\r\n\tconst secondLevelActiveClass = \"o-menu-second-level__list-item--active\";\r\n\r\n\tconst closeMenu = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tconst clickedItem = e.currentTarget as HTMLElement;\r\n\t\tif (getParentWithClassName(clickedItem, 'o-menu-second-level__list')) return;\r\n\t\tfirstLevelMenuEls.forEach(el => closeFirstLevelMenuItemAndResetChildMenus(el));\r\n\t};\r\n\r\n\tconst closeFirstLevelMenuItemAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst buttonEL = expressQuerySelector(menuItem, '.technical-level1-button', true);\r\n\t\texpressRemoveClass(buttonEL, firstLevelActiveClass);\r\n\t\tcloseAllSecondLevelMenuItemsAndResetChildMenus(menuItem);\r\n\t};\r\n\r\n\tconst closeAllSecondLevelMenuItemsAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst secondLevelMenuEls = expressQuerySelectorAll(menuItem, '.technical-desktop-menu-second');\r\n\t\tsecondLevelMenuEls.forEach(secondLevelMenuEl => {\r\n\t\t\texpressAddClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(secondLevelMenuEl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst closeAllThirdLevelMenuItemsAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst allThirdLevelMenuItems = expressQuerySelectorAll(menuItem, '.technical-desktop-second-level-menu-item');\r\n\t\tallThirdLevelMenuItems.forEach(el => {\r\n\t\t\tconst contentEl = expressQuerySelector(el, '.technical-desktop-second-level-content', false);\r\n\t\t\tcontentEl && expressAddClass(contentEl, 'u-hide');\r\n\t\t\texpressRemoveClass(el, secondLevelActiveClass);\r\n\t\t});\r\n\t};\r\n\r\n\tconst getOrLoadFirstLevelMenuItem = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (e.type.toLowerCase() === \"mouseenter\" && isTouchDevice()) return;\r\n\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\tconst secondLevelMenuEl = expressQuerySelector(menuItem, '.technical-desktop-menu-second', true);\r\n\t\tconst buttonEL = expressQuerySelector(menuItem, '.technical-level1-button', true);\r\n\r\n\t\tconst closeMenuOnMouseOut = (e: MouseEvent) => {\r\n\t\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\t\tcloseFirstLevelMenuItemAndResetChildMenus(menuItem);\r\n\t\t};\r\n\r\n\t\t// First hide all other items\r\n\t\tconst allSecondLevelMenuItems = expressQuerySelectorAll(containerEl, '.technical-desktop-menu-second');\r\n\t\tallSecondLevelMenuItems.forEach(el => closeAllSecondLevelMenuItemsAndResetChildMenus(el));\r\n\r\n\t\t// Set selected item and fetch content if needed\r\n\t\tif (expressQuerySelectorAll(secondLevelMenuEl, \".o-menu-second-level__list.skeleton-loading\").length === 1) {\r\n\t\t\tconst itemKey = parseInt(menuItem.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst alreadyLoaded = itemKey in loadedMenuItemsKeys;\r\n\t\t\tif (!alreadyLoaded) {\r\n\t\t\t\tloadedMenuItemsKeys[itemKey] = [];\r\n\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\tloadDesktopMenuItemAsync(itemKey, -1).then(res => {\r\n\t\t\t\t\tsecondLevelMenuEl.innerHTML = \"\"; // this removes the skeleton loading\r\n\t\t\t\t\tsecondLevelMenuEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\twindow.addEventListener('resize', () => {\r\n\t\t\t\t\t\tdebounce(() => {\r\n\t\t\t\t\t\t\tif (!secondLevelMenuEl) return;\r\n\t\t\t\t\t\t\tsecondLevelMenuEl.style.top = Math.floor(expressQuerySelector(document, '.technical-header', true).clientHeight) + 'px';\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tsecondLevelMenuEl.style.top = Math.floor(expressQuerySelector(document, '.technical-header', true).clientHeight) + 'px';\r\n\t\t\t\t\tconst buttonEls = expressQuerySelectorAll(secondLevelMenuEl, '.technical-third-link-item');\r\n\t\t\t\t\tif (buttonEls.length && buttonEls.every(x => x.nodeName.toLowerCase() === 'a')) {\r\n\t\t\t\t\t\tconst subMenuListEl = expressQuerySelector(secondLevelMenuEl, '.o-menu-second-level__list', true);\r\n\t\t\t\t\t\tsubMenuListEl.style.left = (menuItem.offsetLeft - containerEl.offsetLeft) + \"px\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tinitSecondLevelListeners();\r\n\t\t\t\t\t// To prevent opening the menu, when the visitor already moved to another menu item, we check the active class again\r\n\t\t\t\t\tif (hasClass(buttonEL, firstLevelActiveClass)) expressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t});\r\n\t\t\t\tdisposable.add(compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'mouseleave', closeMenuOnMouseOut))));\r\n\t\t\t\tdisposable.add(expressEventListener(secondLevelMenuEl, 'click', closeMenu));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (e.type.toLowerCase() === \"click\" && isTouchDevice()) {\r\n\t\t\t\tif (hasClass(buttonEL, firstLevelActiveClass)) {\r\n\t\t\t\t\texpressRemoveClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\t\texpressAddClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(secondLevelMenuEl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\t\texpressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\texpressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst initFirstLevelListeners = () => {\r\n\t\tdisposable = compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'mouseenter', getOrLoadFirstLevelMenuItem)));\r\n\t\tdisposable.add(compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'click', getOrLoadFirstLevelMenuItem))));\r\n\t};\r\n\r\n\tconst getOrLoadSecondLevelMenuItem = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (e.type.toLowerCase() === \"mouseenter\" && isTouchDevice()) return;\r\n\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\tif (hasClass(menuItem, secondLevelActiveClass)) return;\r\n\t\tconst parent = menuItem.closest(\".technical-desktop-first-level-menu-item\") as HTMLElement;\r\n\r\n\t\t// First hide all other items\r\n\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(parent);\r\n\r\n\t\t// Set selected item and fetch content if needed\r\n\t\texpressAddClass(menuItem, secondLevelActiveClass);\r\n\t\tconst contentEl = expressQuerySelector(menuItem, '.technical-desktop-second-level-content', false);\r\n\t\tcontentEl && expressRemoveClass(contentEl, 'u-hide');\r\n\r\n\t\tconst buttonEl = expressQuerySelector(menuItem, '.technical-third-link-item', true);\r\n\t\tif (buttonEl.nodeName.toLowerCase() === \"button\") {\r\n\t\t\tconst firstLevelIndex = parseInt(parent.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst secondLevelIndex = parseInt(menuItem.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst alreadyLoaded = loadedMenuItemsKeys[firstLevelIndex].includes(secondLevelIndex);\r\n\r\n\t\t\tif (!alreadyLoaded) {\r\n\t\t\t\tloadedMenuItemsKeys[firstLevelIndex].push(secondLevelIndex);\r\n\t\t\t\tloadDesktopMenuItemAsync(firstLevelIndex, secondLevelIndex).then(res => {\r\n\t\t\t\t\tmenuItem.querySelector(\".technical-desktop-second-level-content\").innerHTML = res;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst initSecondLevelListeners = () => {\r\n\t\tconst secondLevelMenuEls = expressQuerySelectorAll(containerEl, \".technical-desktop-second-level-menu-item\");\r\n\t\tdisposable.add(compositeDisposable(secondLevelMenuEls.map(el => expressEventListener(el, 'mouseenter', getOrLoadSecondLevelMenuItem))));\r\n\t\tdisposable.add(compositeDisposable(secondLevelMenuEls.map(el => expressEventListener(el, 'click', getOrLoadSecondLevelMenuItem))));\r\n\t};\r\n\r\n\t// init handlers on load\r\n\tinitFirstLevelListeners();\r\n\tconst disableHoverMenuItems = () => disposable && disposable.dispose();\r\n\r\n\treturn { dispose: disableHoverMenuItems };\r\n}\r\n","import {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener} from \"../common/html\";\r\n\r\nexport function initLanguageSelector(buttonEl: HTMLElement, containerEl: HTMLElement) {\r\n\tlet eventDisposables: IDisposable;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\r\n\tconst closeMenu = () => {\r\n\t\tcontainerEl.classList.add(\"u-hide\");\r\n\t\tdetachDocumentClick();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".technical-language-selector, .technical-language-selector-choices\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\t// we do don't want to load or attach handlers when the menu is closing\r\n\t\tif (containerEl.classList.contains(\"u-hide\"))\r\n\t\t\tattachOnDocumentClick();\r\n\t\tcontainerEl.classList.toggle(\"u-hide\");\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(\r\n\t\t\tonDocumentClickDisposable = compositeDisposable (\r\n\t\t\t\t[expressEventListener(document, 'click', onDocumentClick, true)]\r\n\t\t\t)\r\n\t\t);\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst init = () => {\r\n\t\teventDisposables = compositeDisposable (\r\n\t\t\t[\r\n\t\t\t\texpressEventListener(buttonEl, 'click', onButtonClick)\r\n\t\t\t]\r\n\t\t);\r\n\t};\r\n\r\n\tconst deInit = () => {\r\n\t\tdispose();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\t// remove all handlers\r\n\tconst dispose = () => {\r\n\t\tif (eventDisposables) eventDisposables.dispose();\r\n\t\tdetachDocumentClick();\r\n\t};\r\n\r\n\t// init component\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdeInit\r\n\t};\r\n}\r\n","import {getParents} from \"../common/html\";\r\n\r\nexport interface ICreateTooltipOptions {\r\n\treadonly buttonEl: HTMLElement;\r\n\treadonly containerEl: HTMLElement;\r\n\treadonly onOpen?: (containerEl: HTMLElement) => void;\r\n\treadonly onClose?: () => void;\r\n\treadonly iconCloseSelector?: string;\r\n\treadonly openClass?: string;\r\n\treadonly tooltipSelector?: string;\r\n\treadonly toggleIconSelector?: string;\r\n\treadonly useCapture?: boolean;\r\n}\r\n\r\nexport interface IToolTip {\r\n\treadonly dispose: () => void;\r\n\treadonly closeToolTip: () => void;\r\n}\r\nexport function initTooltip(options: ICreateTooltipOptions) {\r\n\tconst {\r\n\t\tbuttonEl,\r\n\t\tcontainerEl,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t\ticonCloseSelector,\r\n\t\topenClass,\r\n\t\ttooltipSelector,\r\n\t\ttoggleIconSelector,\r\n\t\tuseCapture = false\r\n\t} = options;\r\n\r\n\tconst closeIconEl = containerEl.querySelector(iconCloseSelector || \".icon-close\");\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseToolTip();\r\n\t};\r\n\r\n\tconst closeToolTip = () => {\r\n\t\tcontainerEl.classList.remove(openClass || \"is-tooltip-open\");\r\n\t\tif (onClose) onClose();\r\n\t\tdocument.removeEventListener(\"click\", onDocumentClick);\r\n\t};\r\n\r\n\tconst openToolTip = () => {\r\n\t\tcontainerEl.classList.add(openClass || \"is-tooltip-open\");\r\n\t\tif (onOpen) onOpen(containerEl);\r\n\t\tdocument.addEventListener(\"click\", onDocumentClick, { capture: useCapture });\r\n\t};\r\n\r\n\tconst onButtonClick = (e: MouseEvent) => {\r\n\t\tif (getParents(e.target as HTMLElement, (tooltipSelector || \".technical-price-tooltip\")).length < 1)\r\n\t\t{\r\n\t\t\tcontainerEl.classList.contains(openClass || \"is-tooltip-open\")\r\n\t\t\t\t? closeToolTip()\r\n\t\t\t\t: openToolTip();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tconst selector = (tooltipSelector || \".technical-price-tooltip\") + \", \" + (toggleIconSelector || \".technical-price-info-icon\");\r\n\t\tif (!(e.target as HTMLElement).closest(selector)) {\r\n\t\t\tcloseToolTip();\r\n\t\t}\r\n\t};\r\n\r\n\t//close tooltip\r\n\tif (closeIconEl) closeIconEl.addEventListener(\"click\", onCloseIconClick);\r\n\r\n\t//open tooltip + function\r\n\tbuttonEl.addEventListener(\"click\", onButtonClick);\r\n\r\n\tconst dispose = () => {\r\n\t\tbuttonEl.removeEventListener(\"click\", onButtonClick);\r\n\t\tdocument.removeEventListener(\"click\", onDocumentClick);\r\n\t\tif (closeIconEl) closeIconEl.removeEventListener(\"click\", onCloseIconClick);\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tcloseToolTip\r\n\t} as IToolTip;\r\n}\r\n","import {createTextInputWithAutoComplete} from \"./form-input\";\r\nimport {expressQuerySelector} from \"../common/html\";\r\nimport {isValidTextWithoutAngleBrackets} from \"../utils/validation\";\r\nimport {initTooltip} from \"./tooltip\";\r\n\r\nexport function initSearchBar(desktopSearchBarContainer: HTMLElement, mobileSearchBarContainer: HTMLElement, autoCompleteSearch: (searchTerm: string) => Promise, onOpen?: () => void, onClose?: () => void) {\r\n\tconst initAutoComplete = (buttonEl: HTMLElement, inputEl: HTMLInputElement) => {\r\n\t\tconst buttonDisabledClass = \"a-button--disabled\";\r\n\t\tconst form = inputEl.parentElement! as HTMLFormElement;\r\n\r\n\t\tif (buttonEl) buttonEl.classList.add(buttonDisabledClass);\r\n\r\n\t\tconst renderTextWithHighlights = (item: { value: string, label: string }, currentSearchterm: string) => {\r\n\t\t\tcurrentSearchterm = currentSearchterm.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n\t\t\tconst re = new RegExp(\"(\" + currentSearchterm.split(' ').join('|') + \")\", \"gi\");\r\n\t\t\treturn item.value.replace(re, \"$1\");\r\n\t\t};\r\n\r\n\t\tinputEl.onkeyup = function (ev: KeyboardEvent) {\r\n\t\t\tif (buttonEl) {\r\n\t\t\t\tif (inputEl && inputEl.value) buttonEl.classList.remove(buttonDisabledClass);\r\n\t\t\t\telse buttonEl.classList.add(buttonDisabledClass);\r\n\t\t\t}\r\n\t\t\tif (ev.keyCode === 13 || ev.key === 'Enter') {\r\n\t\t\t\tfixInputValue(inputEl);\r\n\t\t\t\tform.submit();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tform.onsubmit = function (e) {\r\n\t\t\tif (!inputEl || !inputEl.value || !validateInput(inputEl)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfixInputValue(inputEl);\r\n\t\t};\r\n\t\treturn createTextInputWithAutoComplete (\r\n\t\t\tinputEl,\r\n\t\t\t{\r\n\t\t\t\tonSelect: () => { onClose && onClose(); form.submit(); },\r\n\t\t\t\tautoCompleteSearch: (searchTerm) => {\r\n\t\t\t\t\tif (validateInput(inputEl, searchTerm))\r\n\t\t\t\t\t\treturn autoCompleteSearch(searchTerm).then(res => res.map(item => ({ value: item, label: item })));\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t},\r\n\t\t\t\tonOpen: onOpen,\r\n\t\t\t\tonClose: onClose,\r\n\t\t\t\trenderTextContent: renderTextWithHighlights,\r\n\t\t\t\tcontainerClass: 'm-autocomplete autocomplete-suggestions m-search-bar__autocomplete',\r\n\t\t\t\tcontainerInsertPosition: 'afterend',\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tconst fixInputValue = (inputEl: HTMLInputElement) => {\r\n\t\tinputEl.value = inputEl.value.replace(/[<>]+/g, '');\r\n\t};\r\n\r\n\tconst validateInput = (inputEl: HTMLInputElement, searchTerm?: string) => {\r\n\t\treturn isValidTextWithoutAngleBrackets(searchTerm ? searchTerm : inputEl.value);\r\n\t};\r\n\r\n\tconst initMobileSearchBar = (containerEl: HTMLElement) => {\r\n\t\tconst inputEl = expressQuerySelector(containerEl, \".m-search-bar__input\", true);\r\n\t\tconst buttonEl = expressQuerySelector(containerEl, \".icon-search_thin\", true);\r\n\t\tconst autoComplete = initAutoComplete(buttonEl, inputEl);\r\n\t\tconst onSearchTooltipOpen = () => inputEl.focus();\r\n\t\tconst form = inputEl.parentElement! as HTMLFormElement;\r\n\r\n\t\tform.onsubmit = function (e) {\r\n\t\t\tif (!inputEl || !inputEl.value || !validateInput(inputEl)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfixInputValue(inputEl);\r\n\t\t};\r\n\r\n\t\tconst overlayComponent = initTooltip({\r\n\t\t\tbuttonEl: containerEl.previousElementSibling as HTMLElement,\r\n\t\t\tcontainerEl: containerEl,\r\n\t\t\tonOpen: onSearchTooltipOpen,\r\n\t\t\topenClass: \"menu-is-open\",\r\n\t\t\ttooltipSelector: \".o-icon-navigation__search-bar\",\r\n\t\t\ttoggleIconSelector: \".icon-search_thin\"\r\n\t\t});\r\n\r\n\t\treturn {\r\n\t\t\tdipose: () => {\r\n\t\t\t\toverlayComponent.dispose();\r\n\t\t\t\tautoComplete.dispose();\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t// init desktop search autocomplete\r\n\tconst desktopSearchBar = initAutoComplete (\r\n\t\texpressQuerySelector (\r\n\t\t\tdesktopSearchBarContainer,\r\n\t\t\t'.icon-search_thin',\r\n\t\t\ttrue\r\n\t\t),\r\n\t\texpressQuerySelector (\r\n\t\t\tdesktopSearchBarContainer,\r\n\t\t\t'.m-search-bar__input',\r\n\t\t\ttrue\r\n\t\t)\r\n\t);\r\n\r\n\t// init mobile search\r\n\tconst mobileSearchBar = initMobileSearchBar(mobileSearchBarContainer);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\tmobileSearchBar.dipose();\r\n\t\t\tdesktopSearchBar.dispose();\r\n\t\t}\r\n\t};\r\n}\r\n","import {expressEventListener, hide, expressQuerySelector, expressQuerySelectorAll, remove, show} from \"../common/html\";\r\nimport {createClickableElement} from \"./button\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {trackOrderStatusEvent} from \"../common/events\";\r\n\r\nexport interface ICreateNotificationCenterDependencies {\r\n\treadonly getNotifications: () => Promise;\r\n\treadonly isMobile: () => boolean;\r\n\treadonly markNotificationsAsRead: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n}\r\n\r\nexport function createNotificationTile(containerEl: HTMLElement, markNotificationAsRead: (id: string) => Promise) {\r\n\tconst checkBoxEl = expressQuerySelector(containerEl, '.m-notification-tile__read-status', true);\r\n\tconst linkEl = expressQuerySelector(containerEl, '.m-notification-tile__title-with-link__link', false);\r\n\tconst onRemove = () => remove(containerEl);\r\n\r\n\tconst onTileClick = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\tconst cb = expressQuerySelector(checkBoxEl, '.a-form-input__input', true);\r\n\t\tcb.disabled = true;\r\n\t\tcheckBoxEl.removeEventListener('click', onTileClick);\r\n\t\tmarkNotificationAsRead(cb.value)\r\n\t\t\t.then(() => containerEl.classList.add(\"o-notifications-center__notification-tile--removed\"))\r\n\t\t\t.then(() => onRemove());\r\n\t};\r\n\r\n\tcheckBoxEl.addEventListener('click', onTileClick);\r\n\tlinkEl && linkEl.addEventListener('click', () => {\r\n\t\tconst orderNumber = linkEl.dataset.ordernumber || '';\r\n\t\tconst pvc = linkEl.dataset.sku || '';\r\n\t\tconst orderStatus = linkEl.dataset.orderstatus || '';\r\n\t\ttrackOrderStatusEvent(\"ClickOnOrderItemNotificationLink\", { orderNumber: orderNumber, pvc: pvc, orderStatus: orderStatus });\r\n\t});\r\n}\r\n\r\nexport function createNotificationCenter(containerEl: HTMLElement, deps: ICreateNotificationCenterDependencies) {\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tlet onMarkedAllAsReadDisposable: IDisposable;\r\n\tconst domParser = new DOMParser();\r\n\r\n\tlet loaded = false;\r\n\r\n\tconst { getNotifications, isMobile, markNotificationsAsRead, onClose, onOpen } = deps;\r\n\r\n\tconst buttonEl = expressQuerySelector(containerEl, '.o-icon-navigation__notifications-center__icon', true);\r\n\tconst notificationBellCountEl = expressQuerySelector(buttonEl, '.o-icon-navigation__count ', true);\r\n\tconst menuEl = expressQuerySelector(containerEl, '.o-icon-navigation__notifications-center-menu', true);\r\n\tconst overLayEl = expressQuerySelector(menuEl, '.technical-notification-center-overlay', true);\r\n\tconst contentEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__content', true);\r\n\tconst closeButtonEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__close-container', true);\r\n\tlet markAllAsReadButton: HTMLInputElement;\r\n\r\n\tconst setOverLayClass = () => {\r\n\t\tconst mobile = isMobile();\r\n\t\toverLayEl.classList.remove(...[\"m-navigation-overlay__mobile-view\", \"m-navigation-overlay__desktop-view\"]);\r\n\t\toverLayEl.classList.add(mobile ? \"m-navigation-overlay__mobile-view\" : \"m-navigation-overlay__desktop-view\");\r\n\t};\r\n\r\n\tconst setNotificationCount = (amount: number, markAllAsReadButton?: HTMLElement) => {\r\n\r\n\t\tif (amount > 0) {\r\n\t\t\tnotificationBellCountEl.innerHTML = amount.toString();\r\n\t\t\tif (markAllAsReadButton) markAllAsReadButton.innerHTML += `(${amount})`;\r\n\t\t\tshow(notificationBellCountEl);\r\n\r\n\t\t} else {\r\n\t\t\tnotificationBellCountEl.innerHTML = \"\";\r\n\t\t\thide(notificationBellCountEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst getTiles = () => expressQuerySelectorAll(contentEl, '.m-notification-tile');\r\n\r\n\tconst onMarkedAsReadSingle = (ids: string) => markNotificationsAsRead(ids.split(';'))\r\n\t\t.then(() => loadNotifications(true));\r\n\r\n\tconst onMarkedAllAsRead = () => {\r\n\t\tif (markAllAsReadButton) {\r\n\t\t\tmarkAllAsReadButton.disabled = true;\r\n\t\t\tmarkAllAsReadButton.classList.add(\"a-button--disabled\");\r\n\t\t}\r\n\t\tdetachMarkAllAsReadClick();\r\n\t\tconst ids = getTiles()\r\n\t\t\t.map(el => expressQuerySelector\r\n\t\t\t\t(el, '.a-form-input__input', true)\r\n\t\t\t\t\t.value.split(\";\")\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a.concat(b), []);\r\n\r\n\t\t// only execute if there are items to remove\r\n\t\tif (ids && ids.length > 0) {\r\n\t\t\treturn markNotificationsAsRead(ids)\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tif (res) loadNotifications(true);\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst loadNotifications = (reload = false) => {\r\n\r\n\t\tif (loaded && !reload) return Promise.resolve();\r\n\r\n\t\treturn getNotifications()\r\n\t\t\t.then(res => {\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tconst parsed = domParser.parseFromString(res, \"text/html\").documentElement;\r\n\t\t\t\t\tconst notificationCenterEl = expressQuerySelector(parsed, \".o-notifications-center__container\", true);\r\n\t\t\t\t\tcontentEl.innerHTML = \"\";\r\n\t\t\t\t\tcontentEl.insertAdjacentElement('beforeend', notificationCenterEl);\r\n\r\n\t\t\t\t\tmarkAllAsReadButton = expressQuerySelector(contentEl, '.o-notifications-center__mark-as-read', true);\r\n\r\n\t\t\t\t\tconst tiles = getTiles();\r\n\t\t\t\t\tif (tiles.length > 0) {\r\n\t\t\t\t\t\tmarkAllAsReadButton.classList.remove(\"a-button--disabled\");\r\n\r\n\t\t\t\t\t\ttiles.forEach(el => createNotificationTile(el, onMarkedAsReadSingle));\r\n\r\n\t\t\t\t\t\tattachMarkAllAsReadClick(markAllAsReadButton);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tiles.length === 0) {\r\n\t\t\t\t\t\tmarkAllAsReadButton.classList.add(\"a-button--disabled\");\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsetNotificationCount(tiles.length);\r\n\r\n\t\t\t\t\tloaded = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onNotificationCenterOpen = () => {\r\n\t\tsetOverLayClass();\r\n\t\treturn loadNotifications();\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tmenuEl.classList.remove(\"menu-is-open\");\r\n\t\tdetachDocumentClick();\r\n\t\tonClose && onClose();\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst openMenu = () => {\r\n\t\ttrackOrderStatusEvent(\"ClickOnNotificationIcon\", {});\r\n\t\treturn onNotificationCenterOpen()\r\n\t\t\t.then(() => {\r\n\t\t\t\tonOpen && onOpen();\r\n\t\t\t\tattachOnDocumentClick();\r\n\t\t\t\tmenuEl.classList.add(\"menu-is-open\");\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\treturn menuEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".o-icon-navigation__notifications-center-menu, .o-icon-navigation__notifications-center__icon\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(onDocumentClickDisposable = expressEventListener(document, 'click', onDocumentClick, true));\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst attachMarkAllAsReadClick = (buttonEl: HTMLElement) =>\r\n\t\t(onMarkedAllAsReadDisposable = expressEventListener(buttonEl, 'click', onMarkedAllAsRead));\r\n\r\n\tconst detachMarkAllAsReadClick = () => onMarkedAllAsReadDisposable && onMarkedAllAsReadDisposable.dispose();\r\n\r\n\t// init component\r\n\tconst button = createClickableElement(buttonEl, onButtonClick);\r\n\r\n\tconst eventDisposables = compositeDisposable (\r\n\t\t[\r\n\t\t\texpressEventListener(closeButtonEl, 'click', onCloseIconClick),\r\n\t\t\texpressEventListener(window, 'resize', setOverLayClass),\r\n\t\t]\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tbutton.dispose();\r\n\t\t\tdetachDocumentClick();\r\n\t\t\tdetachMarkAllAsReadClick();\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n}\r\n","export function calculateAndSetHeightOfMobileNavigationLevel(mobileNavigationLevel: HTMLElement) {\r\n\tmobileNavigationLevel.style.height = '100vh';\r\n\r\n\t// Calculate height of lvl menu (without browser bars)\r\n\tconst browserUiBars = mobileNavigationLevel.getBoundingClientRect().height - window.innerHeight;\r\n\tconst menuItemsLvlPositionTop = document.body.getBoundingClientRect().top - mobileNavigationLevel.getBoundingClientRect().top;\r\n\r\n\t// Set height of level menu items to correct size calculated\r\n\tmobileNavigationLevel.style.height = 'calc(100vh - ' + Math.abs(browserUiBars) + 'px + ' + menuItemsLvlPositionTop + 'px)';\r\n}\r\n","import { createClickableElement } from \"./button\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { IIconResult } from \"../utils/icons\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\n\r\nexport interface IInitMyAccountDependencies {\r\n\treadonly getIconsAsync: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n\treadonly isMobile: () => boolean;\r\n\treadonly loadAccountMenu: () => Promise;\r\n}\r\n\r\nexport function initMyAccount(mainNavigationEl: HTMLElement, deps: IInitMyAccountDependencies) {\r\n\r\n\tconst { getIconsAsync, onClose, onOpen, isMobile, loadAccountMenu } = deps;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tconst icons = {};\r\n\tlet loaded = false;\r\n\tconst buttonEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-icon', true);\r\n\tconst menuEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-menu', true);\r\n\tconst overLayEl = expressQuerySelector(menuEl, '.technical-navigation-overlay', true);\r\n\tconst contentEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__content', true);\r\n\tconst closeButtonEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__close-container', true);\r\n\r\n\tconst setOverLayClass = () => {\r\n\t\toverLayEl.classList.remove(...[\"m-navigation-overlay__mobile-view\", \"m-navigation-overlay__desktop-view\"]);\r\n\t\toverLayEl.classList.add(isMobile() ? \"m-navigation-overlay__mobile-view\" : \"m-navigation-overlay__desktop-view\");\r\n\t};\r\n\r\n\tconst onOpenMyAccount = () => {\r\n\t\tif (!loaded) {\r\n\t\t\treturn loadAccountMenu()\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tonOpen && onOpen();\r\n\t\t\t\t\tcontentEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\tconst buttonEls = expressQuerySelectorAll(contentEl, '.technical-hassvg')\r\n\t\t\t\t\t\t.filter(el => !!el.getAttribute('data-icon-svg'));\r\n\t\t\t\t\tconst urls = buttonEls\r\n\t\t\t\t\t\t.map(el => el.getAttribute('data-icon-svg')!)\r\n\t\t\t\t\t\t.filter((value, index, self) => self.indexOf(value) === index);\r\n\r\n\t\t\t\t\t// this can fire & forget\r\n\t\t\t\t\tgetIconsAsync(urls)\r\n\t\t\t\t\t\t.then(\r\n\t\t\t\t\t\t\tres => {\r\n\t\t\t\t\t\t\t\tres.forEach(icon => icons[icon.url] = icon.svg);\r\n\t\t\t\t\t\t\t\tbuttonEls.forEach(el => el.insertAdjacentHTML('beforeend', icons[el.getAttribute('data-icon-svg')!]));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\tloaded = true;\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\tonOpen && onOpen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tonClose && onClose();\r\n\t\tmenuEl.classList.remove(\"menu-is-open\");\r\n\t\tdetachDocumentClick();\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst openMenu = () => {\r\n\t\tsetOverLayClass();\r\n\t\treturn onOpenMyAccount()\r\n\t\t\t.then(() => {\r\n\t\t\t\tmenuEl.classList.add(\"menu-is-open\");\r\n\r\n\t\t\t\tif (isMobile()) {\r\n\t\t\t\t\tconst menuButtonList = expressQuerySelector(menuEl, '.o-my-account__list', true);\r\n\t\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuButtonList);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tattachOnDocumentClick();\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\treturn menuEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".o-icon-navigation__user-menu, .o-icon-navigation__user-icon\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst button = createClickableElement(buttonEl, onButtonClick);\r\n\tconst eventDisposables = compositeDisposable(\r\n\t\t[\r\n\r\n\t\t\texpressEventListener(closeButtonEl, 'click', onCloseIconClick),\r\n\t\t\texpressEventListener(window, 'resize', setOverLayClass)\r\n\t\t]\r\n\t);\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(onDocumentClickDisposable = expressEventListener(document, 'click', onDocumentClick, true));\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tdetachDocumentClick();\r\n\t\t\tbutton.dispose();\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n}\r\n","export interface IInitCountDownOptions {\r\n\treadonly showDays?: boolean;\r\n\treadonly onCountDownFinish?: () => void;\r\n\treadonly daysLabel?: string;\r\n\treadonly dayLabel?: string;\r\n}\r\n\r\nexport function initCountDown(containerEl: HTMLElement, el: HTMLElement, countDownToDate: string, opts: IInitCountDownOptions ) {\r\n\tconst {\r\n\t\tshowDays,\r\n\t\tonCountDownFinish,\r\n\t\tdaysLabel,\r\n\t\tdayLabel\r\n\t} = opts;\r\n\r\n\tconst toDate = (input: string): Date => {\r\n\t\tconst dateString = input.split(' ')[0];\r\n\t\tconst timeString = input.split(' ')[1];\r\n\t\tconst day = parseInt(dateString.split('/')[0], 10);\r\n\t\tconst month = parseInt(dateString.split('/')[1], 10) - 1;\r\n\t\tconst year = parseInt(dateString.split('/')[2], 10);\r\n\t\tconst hour = parseInt(timeString.split(':')[0], 10);\r\n\t\tconst minutes = parseInt(timeString.split(':')[1], 10);\r\n\t\tconst seconds = parseInt(timeString.split(':')[2], 10);\r\n\t\treturn new Date(year, month, day, hour, minutes, seconds, 0);\r\n\t};\r\n\r\n\tconst pad = (num: number, size: number) => {\r\n\t\tlet temp = num.toString();\r\n\t\twhile (temp.length < size) temp = \"0\" + temp;\r\n\t\treturn temp;\r\n\t};\r\n\r\n\tconst countDownTime = toDate(countDownToDate).getTime();\r\n\r\n\tconst countDown = () => {\r\n\t\tconst now = new Date().getTime();\r\n\t\tconst timeLeft = countDownTime - now;\r\n\t\tconst days = Math.floor(timeLeft / (1000 * 60 * 60 * 24));\r\n\t\tlet hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n\t\tconst minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60));\r\n\t\tconst seconds = Math.floor((timeLeft % (1000 * 60)) / 1000);\r\n\r\n\t\tif (timeLeft > 0) {\r\n\t\t\tif (!showDays || !daysLabel || !dayLabel) {\r\n\t\t\t\thours = hours + (days * 24);\r\n\t\t\t\tel.innerHTML = pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t} else {\r\n\t\t\t\tif (days > 1)\r\n\t\t\t\t\tel.innerHTML = days + ' ' + daysLabel + ' ' + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t\telse if (days === 1)\r\n\t\t\t\t\tel.innerHTML = days + ' ' + dayLabel + ' ' + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t\telse\r\n\t\t\t\t\tel.innerHTML = pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (onCountDownFinish) onCountDownFinish();\r\n\t\t\tclearInterval(interval);\r\n\t\t}\r\n\t};\r\n\r\n\tconst interval = setInterval(countDown, 1000);\r\n}\r\n","import { createClickableElement } from \"./button\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { IIconResult } from \"../utils/icons\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\n\r\nexport interface ICreateNavigationMobileDependencies {\r\n\treadonly getMobileMenu: (secondLevelIndex?: number, thirdLevelIndex?: number) => Promise;\r\n\treadonly getIconsAsync: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n}\r\n\r\nexport interface ICreateNavigationMobileOptions {\r\n\treadonly mobileMenuEl: HTMLElement;\r\n\treadonly containerEl: HTMLElement;\r\n\treadonly menuButtonEl: HTMLElement;\r\n\treadonly menuContainerEl: HTMLElement;\r\n\treadonly currentLanguage: string | undefined;\r\n}\r\n\r\nexport function initNavigationMobile(options: ICreateNavigationMobileOptions, deps: ICreateNavigationMobileDependencies) {\r\n\tlet firstLevelMenuSelected: HTMLElement | undefined;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tlet onCloseClickDisposable: IDisposable;\r\n\tlet onLanguageSelectorClickDisposable: IDisposable;\r\n\tlet userContainerEl: HTMLElement;\r\n\tlet closeContainerEl: HTMLElement;\r\n\tlet languageSelectorEl: HTMLElement | undefined;\r\n\tlet firstLevelMenuEls: HTMLElement[] = [];\r\n\tlet secondLevelMenuEls: HTMLElement[] = [];\r\n\tlet thirdLevelMenuEls: HTMLElement[] = [];\r\n\r\n\tlet loaded = false;\r\n\r\n\tconst {\r\n\t\tmobileMenuEl,\r\n\t\tcontainerEl,\r\n\t\tmenuButtonEl,\r\n\t\tmenuContainerEl,\r\n\t\tcurrentLanguage\r\n\t} = options;\r\n\r\n\tconst {\r\n\t\tgetMobileMenu,\r\n\t\tgetIconsAsync,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t} = deps;\r\n\r\n\tconst contentPreLoaded = mobileMenuEl.innerHTML.replace(/^\\s+|\\s+$/, '') !== \"\";\r\n\r\n\tconst closeMenu = () => {\r\n\t\tmenuButtonEl.classList.remove(\"menu-is-open\");\r\n\t\tmenuContainerEl.classList.remove(\"menu-is-open\");\r\n\r\n\t\t// reset to first level\r\n\t\tresetMenu();\r\n\r\n\t\tdetachDocumentClick();\r\n\t\tif (onClose) onClose();\r\n\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst onCloseMenuClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".technical-mobile-navigation-hamburger-menu-container, .technical-mobile-navigation-hamburger-menu-button\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t(\r\n\t\tonDocumentClickDisposable = compositeDisposable(\r\n\t\t\t[\r\n\t\t\t\texpressEventListener(document, 'click', onDocumentClick, true)\r\n\t\t\t]\r\n\t\t)\r\n\t);\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst loadIcons = (urls: string[]) => {\r\n\t\tconst icons = {};\r\n\t\tconst uniqueUrls = urls.filter((v, i) => urls.indexOf(v) === i);\r\n\t\treturn getIconsAsync(uniqueUrls)\r\n\t\t\t.then(res => {\r\n\t\t\t\tres.forEach(icon => (icons[icon.url] = icon.svg));\r\n\t\t\t\treturn icons;\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst initMenuItemsAndBehavior = () => {\r\n\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\tuserContainerEl = expressQuerySelector(mobileMenuEl, \".technical-mobile-navigation-user-container\", true);\r\n\t\tcloseContainerEl = expressQuerySelector(mobileMenuEl, \".technical-mobile-navigation-close-container\", true);\r\n\t\tlanguageSelectorEl = expressQuerySelector(mobileMenuEl, \".technical-language-selector\") || undefined;\r\n\t\tfirstLevelMenuEls = expressQuerySelectorAll(mobileMenuEl, \".technical-mobile-navigation-first-level-container\");\r\n\r\n\t\t// set language\r\n\t\tif (languageSelectorEl) {\r\n\t\t\tconst activeLanguageEl = expressQuerySelector(languageSelectorEl, \".a-language-selector__language-active\");\r\n\t\t\tif (activeLanguageEl && currentLanguage) {\r\n\t\t\t\tconst languageEl = expressQuerySelector(activeLanguageEl, \".a-language-selector__language\");\r\n\t\t\t\tif (languageEl) {\r\n\t\t\t\t\tlanguageEl.innerHTML = currentLanguage;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst iconButtonEls = expressQuerySelectorAll(firstLevelListEl, '.technical-icon-svg')\r\n\t\t\t.filter(el => !!el.getAttribute('data-icon-svg'));\r\n\r\n\t\tif (iconButtonEls.length > 0) {\r\n\t\t\tloadIcons(\r\n\t\t\t\ticonButtonEls.map(el => el.getAttribute('data-icon-svg')!)\r\n\t\t\t)\r\n\t\t\t\t.then(\r\n\t\t\t\t\tres =>\r\n\t\t\t\t\t\ticonButtonEls.forEach(el => {\r\n\t\t\t\t\t\t\tconst icon = res[el.getAttribute('data-icon-svg')!];\r\n\t\t\t\t\t\t\tif (icon) el.insertAdjacentHTML(\"beforeend\", icon);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (closeContainerEl) attachCloseMenuClick(closeContainerEl);\r\n\t\tif (languageSelectorEl) attachLanguageSelectorClick(languageSelectorEl);\r\n\t\tattachFirstMenuItemClick(firstLevelMenuEls);\r\n\t};\r\n\r\n\tconst loadMobileMenu = () => {\r\n\t\tif (!loaded) {\r\n\t\t\tif (!contentPreLoaded) {\r\n\t\t\t\treturn getMobileMenu()\r\n\t\t\t\t\t.then(res => {\r\n\t\t\t\t\t\tloaded = true;\r\n\t\t\t\t\t\tonOpen && onOpen();\r\n\t\t\t\t\t\tmobileMenuEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\t\tinitMenuItemsAndBehavior();\r\n\t\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tloaded = true;\r\n\t\t\t\tinitMenuItemsAndBehavior();\r\n\t\t\t\treturn Promise.resolve();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tonOpen && onOpen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onButtonClick = () =>\r\n\t\tmenuContainerEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\r\n\tconst openMenu = () => {\r\n\t\treturn loadMobileMenu()\r\n\t\t\t.then(() => {\r\n\t\t\t\tattachOnDocumentClick();\r\n\r\n\t\t\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(firstLevelListEl);\r\n\r\n\t\t\t\t// Save height for later use in data attribute 'elementHeight'\r\n\t\t\t\tfirstLevelListEl.dataset.elementHeight = firstLevelListEl.style.height || '';\r\n\r\n\t\t\t\t// only show mobile menu when whole thing is loaded / initialized\r\n\t\t\t\tmenuButtonEl.classList.add(\"menu-is-open\");\r\n\t\t\t\tmenuContainerEl.classList.add(\"menu-is-open\");\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst resetMenu = () => {\r\n\t\tcontainerEl.classList.remove(\"second-level-is-active\");\r\n\t\tcontainerEl.classList.remove(\"third-level-is-active\");\r\n\t\tuserContainerEl.classList.remove(\"u-hide\");\r\n\t\tcloseContainerEl.classList.remove(\"u-hide\");\r\n\r\n\t\t// Show first level\r\n\t\tfirstLevelMenuEls.forEach(firstLevelEl => {\r\n\t\t\tfirstLevelEl.classList.remove(\"u-hide\");\r\n\t\t\tconst firstLevelMenuButtons = expressQuerySelectorAll(firstLevelEl, \".o-navigation-mobile__first-level-navigation__button\");\r\n\t\t\tfirstLevelMenuButtons.forEach(el => el.classList.remove(\"u-hide\"));\r\n\t\t});\r\n\r\n\t\t//Hide second and third level\r\n\t\texpressQuerySelectorAll(containerEl, \".technical-mobile-navigation-second-level\").forEach(el => {\r\n\t\t\tif (!el.classList.contains(\"u-hide\")) el.classList.add(\"u-hide\");\r\n\t\t});\r\n\r\n\t\tsecondLevelMenuEls.forEach(secondLevelEl => {\r\n\t\t\tif (!secondLevelEl.classList.contains(\"u-hide\")) secondLevelEl.classList.add(\"u-hide\");\r\n\r\n\t\t\tconst menuSecondLevelContainerEls = expressQuerySelectorAll(secondLevelEl, \".technical-mobile-navigation-container\");\r\n\t\t\tmenuSecondLevelContainerEls.forEach(el => el.classList.remove(\"u-hide\"));\r\n\r\n\t\t\tconst thirdLevelEls = expressQuerySelectorAll(secondLevelEl, \".technical-mobile-navigation-third-level\");\r\n\t\t\tif (thirdLevelEls)\r\n\t\t\t\tthirdLevelEls.forEach(thirdLevelEl => {\r\n\t\t\t\t\tif (!thirdLevelEl.classList.contains(\"u-hide\")) thirdLevelEl.classList.add(\"u-hide\");\r\n\t\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\tconst hideOtherMenuItems = (elem: HTMLElement) => {\r\n\t\tif (elem.parentNode && elem.parentNode.hasChildNodes()) {\r\n\t\t\t[].slice.call(elem.parentNode.children)\r\n\t\t\t\t.forEach(el => {\r\n\t\t\t\t\tconst elm: HTMLElement = el;\r\n\t\t\t\t\tif (elem !== elm) {\r\n\t\t\t\t\t\telm.classList.toggle(\"u-hide\");\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst onFirstMenuItemClick = (e: Event) => {\r\n\t\tif (handleHeaderLink(e.target)) return;\r\n\t\tconst firstLevelEl = e.currentTarget as HTMLElement;\r\n\t\tconst secondLevelIndex = Number(firstLevelEl.dataset.index) ?? -1;\r\n\t\tconst secondLevelEl = expressQuerySelector(firstLevelEl, '.technical-mobile-navigation-second-level', false);\r\n\t\tif (!secondLevelEl) return; // no second level\r\n\r\n\t\tfirstLevelMenuSelected = expressQuerySelector(firstLevelEl, \".technical-mobile-navigation-second-level\") || undefined;\r\n\t\tconst prevClickedEl = expressQuerySelector(mobileMenuEl, \".technical-clicked\", false);\r\n\r\n\t\t// Values of first lvl menu (needs to be recalculated since the 'account' section isn't shown in 2nd lvl)\r\n\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\t// calculateAndSetHeightOfMobileNavigationLevel(firstLevelListEl);\r\n\r\n\t\t// Set height of first lvl again correct (get from data attribute elementHeight)\r\n\t\tfirstLevelListEl.style.height = '100vh';\r\n\r\n\t\t// Reset scroll position otherwise 2nd lvl can already be scrolled down:\r\n\t\tfirstLevelListEl.scrollTop = 0;\r\n\r\n\r\n\t\tif (firstLevelMenuSelected) {\r\n\t\t\t// Keep track of clicked element and its scrollTop\r\n\t\t\tif (!prevClickedEl) {\r\n\t\t\t\tfirstLevelEl.classList.add(\"technical-clicked\");\r\n\t\t\t\tfirstLevelEl.dataset.offset = firstLevelEl.offsetTop + \"\";\r\n\t\t\t\tconst parent = firstLevelEl.parentNode as HTMLElement;\r\n\t\t\t\tif (parent) parent.dataset.offset = parent.offsetTop + \"\";\r\n\t\t\t}\r\n\r\n\t\t\tcontainerEl.classList.add(\"second-level-is-active\");\r\n\t\t\tcontainerEl.classList.remove(\"third-level-is-active\");\r\n\t\t\tuserContainerEl.classList.toggle(\"u-hide\");\r\n\t\t\tcloseContainerEl.classList.toggle(\"u-hide\");\r\n\r\n\t\t\thideOtherMenuItems(firstLevelEl);\r\n\r\n\t\t\tfirstLevelMenuSelected.classList.toggle(\"u-hide\");\r\n\t\t\tconst firstLevelMenuButton = expressQuerySelector(firstLevelEl, \".o-navigation-mobile__first-level-navigation__button\");\r\n\t\t\tif (firstLevelMenuButton) firstLevelMenuButton.classList.toggle(\"u-hide\");\r\n\r\n\t\t\tconst secondLevelNavigationEl = expressQuerySelector(firstLevelMenuSelected, \".technical-second-level\");\r\n\t\t\tif (secondLevelNavigationEl) secondLevelNavigationEl.classList.remove(\"u-hide\");\r\n\r\n\t\t\tconst secondLevelContainerEl = expressQuerySelectorAll(firstLevelMenuSelected, \".technical-mobile-navigation-second-level-container\");\r\n\t\t\tsecondLevelContainerEl.forEach((el) => el.classList.remove(\"u-hide\"));\r\n\t\t}\r\n\r\n\t\t// In case we have a clicked element bring it into view\r\n\t\tif (prevClickedEl) {\r\n\t\t\tprevClickedEl.classList.remove(\"technical-clicked\");\r\n\t\t\tsetScrollTop(prevClickedEl);\r\n\t\t\tif (prevClickedEl.parentNode) {\r\n\t\t\t\tsetScrollTop(prevClickedEl.parentNode as HTMLElement);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst loadSecondLevelEl = expressQuerySelector(secondLevelEl, '.technical-replace-level-loaded', false);\r\n\t\tif (!loadSecondLevelEl || !loadSecondLevelEl.parentElement) {\r\n\t\t\t// Calculate height of second lvl menu (without browser bars)\r\n\t\t\tconst menuItemsSecondLvl = expressQuerySelector(firstLevelMenuSelected, '.o-navigation-mobile__second-level-navigation__button-list', false);\r\n\t\t\tif (menuItemsSecondLvl && menuItemsSecondLvl.clientHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsSecondLvl);\r\n\t\t\telse\r\n\t\t\t\tfirstLevelListEl.style.height = firstLevelListEl.dataset.elementHeight || '';\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// load second level\r\n\t\tgetMobileMenu(secondLevelIndex, -1).then(res => {\r\n\t\t\tconst frag = document.createRange().createContextualFragment(res);\r\n\t\t\tsecondLevelEl.replaceChild(frag, loadSecondLevelEl);\r\n\t\t\tconst secondLevelItems = expressQuerySelectorAll(firstLevelEl, \".technical-mobile-navigation-second-level-container\");\r\n\t\t\tsecondLevelMenuEls = secondLevelMenuEls.concat(secondLevelItems);\r\n\t\t\tattachSecondMenuItemClick(secondLevelItems);\r\n\r\n\t\t\t// Calculate height of second lvl menu (without browser bars)\r\n\t\t\tconst menuItemsSecondLvl = expressQuerySelector(firstLevelMenuSelected, '.o-navigation-mobile__second-level-navigation__button-list', false);\r\n\t\t\tif (menuItemsSecondLvl && menuItemsSecondLvl.clientHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsSecondLvl);\r\n\t\t\telse\r\n\t\t\t\tfirstLevelListEl.style.height = firstLevelListEl.dataset.elementHeight || '';\r\n\t\t});\r\n\t};\r\n\r\n\tconst setScrollTop = (el: HTMLElement) => {\r\n\t\tconst scrollPos = el.dataset.offset || \"\";\r\n\t\tif (scrollPos && el.parentNode) {\r\n\t\t\tconst parent = el.parentNode as HTMLElement;\r\n\t\t\tparent.scrollTop = parseInt(scrollPos, 10);\r\n\t\t\tel.dataset.offset = \"\";\r\n\t\t}\r\n\t};\r\n\r\n\tconst onSecondMenuItemClick = (e: Event) => {\r\n\t\tif (handleHeaderLink(e.target)) return;\r\n\t\te.stopPropagation();\r\n\t\tconst secondLevelEl = e.currentTarget as HTMLElement;\r\n\r\n\t\tconst thirdLevelDivEl = expressQuerySelector(secondLevelEl, '.technical-mobile-navigation-third-level', false);\r\n\t\tif (!thirdLevelDivEl) return; // no third level\r\n\r\n\t\t// 3th level\r\n\t\tconst thirdLevelEl = secondLevelEl.querySelector(\".technical-mobile-navigation-third-level\");\r\n\t\tif (thirdLevelEl) {\r\n\t\t\tcontainerEl.classList.toggle(\"third-level-is-active\");\r\n\t\t\tthirdLevelEl.classList.toggle(\"u-hide\");\r\n\r\n\t\t\thideOtherMenuItems(secondLevelEl);\r\n\r\n\t\t\tif (firstLevelMenuSelected) {\r\n\t\t\t\tconst secondeLevelNavigationEl = firstLevelMenuSelected.querySelector(\".technical-second-level\");\r\n\t\t\t\tif (secondeLevelNavigationEl) secondeLevelNavigationEl.classList.toggle(\"u-hide\");\r\n\t\t\t}\r\n\r\n\t\t\tconst thirdLevelContainerEl = secondLevelEl.querySelector(\".technical-mobile-navigation-container\");\r\n\t\t\tif (thirdLevelContainerEl) thirdLevelContainerEl.classList.toggle(\"u-hide\");\r\n\t\t}\r\n\r\n\t\tconst loadThridLevelEl = expressQuerySelector(thirdLevelDivEl, '.technical-replace-level-loaded', false);\r\n\t\tif (!loadThridLevelEl || !loadThridLevelEl.parentElement) {\r\n\t\t\tconst menuItemsThirdLvl = expressQuerySelector(secondLevelEl, '.o-navigation-mobile__third-level-navigation__button-list', false);\r\n\t\t\t// Calculate height of third lvl menu (without browser bars)\r\n\t\t\tif (menuItemsThirdLvl && menuItemsThirdLvl.offsetHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsThirdLvl);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// get from api\r\n\t\tconst secondLevelIndex = Number((secondLevelEl.closest('.technical-mobile-navigation-first-level-container') as HTMLElement).dataset.index) ?? -1;\r\n\t\tconst thirdLevelIndex = Number(secondLevelEl.dataset.index) ?? -1;\r\n\t\tgetMobileMenu(secondLevelIndex, thirdLevelIndex).then(res => {\r\n\t\t\tconst frag = document.createRange().createContextualFragment(res);\r\n\t\t\tthirdLevelDivEl.replaceChild(frag, loadThridLevelEl); // sub level of level\r\n\t\t\tconst thirdLevelItems = expressQuerySelectorAll(secondLevelEl, \".o-navigation-mobile__third-level-navigation__button-container\");\r\n\t\t\tthirdLevelMenuEls = thirdLevelMenuEls.concat(thirdLevelItems);\r\n\t\t\tattachThirdMenuItemClick(thirdLevelItems);\r\n\r\n\t\t\tconst menuItemsThirdLvl = expressQuerySelector(secondLevelEl, '.o-navigation-mobile__third-level-navigation__button-list', false);\r\n\t\t\t// Calculate height of third lvl menu (without browser bars)\r\n\t\t\tif (menuItemsThirdLvl && menuItemsThirdLvl.offsetHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsThirdLvl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst onThirdMenuItemClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t};\r\n\r\n\tconst handleHeaderLink = (evTarget: EventTarget | null): boolean => {\r\n\t\tif (evTarget) {\r\n\t\t\tconst target = evTarget as HTMLElement;\r\n\t\t\tif (target.nodeName.toLowerCase() === \"a\" || (target.parentNode && target.parentNode.nodeName.toLowerCase() === \"a\")) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tconst onLanguageSelectorClick = (e: Event) => {\r\n\t\tconst languageSelectorContainerEl = e.currentTarget as HTMLElement;\r\n\t\tconst languageCurrentEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__current\");\r\n\t\tconst languageChoicesContainerEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__choices\");\r\n\t\tconst languageSelectorDescrEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__description\");\r\n\t\tconst languageSelectorDescrOptionsEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__description-options\");\r\n\r\n\t\tif (languageCurrentEl)\r\n\t\t\tlanguageCurrentEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageChoicesContainerEl)\r\n\t\t\tlanguageChoicesContainerEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageSelectorDescrEl)\r\n\t\t\tlanguageSelectorDescrEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageSelectorDescrOptionsEl)\r\n\t\t\tlanguageSelectorDescrOptionsEl.classList.toggle(\"u-hide\");\r\n\t};\r\n\r\n\tconst attachCloseMenuClick = (closeContainerEl: HTMLElement) => {\r\n\r\n\t\tconst closeButtonEl = expressQuerySelector(closeContainerEl, \".m-navigation-overlay__close-icon\");\r\n\t\tif (closeButtonEl) {\r\n\t\t\tonCloseClickDisposable = compositeDisposable([expressEventListener(closeContainerEl, \"click\", onCloseMenuClick)]);\r\n\t\t}\r\n\t};\r\n\r\n\tconst detachCloseMenuClick = () => onCloseClickDisposable && onCloseClickDisposable.dispose();\r\n\r\n\tconst attachFirstMenuItemClick = (firstLevelMenuEls: HTMLElement[]) => {\r\n\t\tfirstLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onFirstMenuItemClick));\r\n\t};\r\n\r\n\tconst attachSecondMenuItemClick = (secondLevelMenuEls: HTMLElement[]) => {\r\n\t\tsecondLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onSecondMenuItemClick));\r\n\t};\r\n\r\n\tconst attachThirdMenuItemClick = (thirdLevelMenuEls: HTMLElement[]) => {\r\n\t\tthirdLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onThirdMenuItemClick));\r\n\t};\r\n\r\n\tconst attachLanguageSelectorClick = (languageSelectorEl: HTMLElement) => {\r\n\t\tonLanguageSelectorClickDisposable = compositeDisposable(\r\n\t\t\t[expressEventListener(languageSelectorEl, \"click\", onLanguageSelectorClick)]\r\n\t\t);\r\n\t};\r\n\r\n\tconst detachLanguageSelectorClick = () => onLanguageSelectorClickDisposable && onLanguageSelectorClickDisposable.dispose();\r\n\r\n\tconst menuButtonComponent = createClickableElement(menuButtonEl, onButtonClick);\r\n\r\n\tconst deInit = () => {\r\n\t\tdispose();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\t// remove all handlers\r\n\tconst dispose = () => {\r\n\t\tmenuButtonComponent.dispose();\r\n\t\tdetachLanguageSelectorClick();\r\n\t\tdetachCloseMenuClick();\r\n\t\tdetachDocumentClick();\r\n\r\n\t\tfirstLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onFirstMenuItemClick));\r\n\t\tsecondLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onSecondMenuItemClick));\r\n\t\tthirdLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onThirdMenuItemClick));\r\n\t};\r\n\r\n\treturn {\r\n\t\tdeInit\r\n\t};\r\n}\r\n","import { IIconResult } from \"../utils/icons\";\r\nimport {\r\n\tgetParentWithClassName,\r\n\thide,\r\n\tisMobileOnPageWithHeader,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll\r\n} from \"../common/html\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getHtmlRequest, getRequest, postRequest } from \"../utils/fetch\";\r\nimport { initNavigationDesktop } from \"./navigation-desktop\";\r\nimport { initLanguageSelector } from \"./language-selector\";\r\nimport { initSearchBar } from \"./search-bar\";\r\nimport { createNotificationCenter } from \"./notification-center\";\r\nimport { createClickableElement } from \"./button\";\r\nimport { initMyAccount } from \"./my-account\";\r\nimport { initCountDown } from \"./countdown\";\r\nimport { initNavigationMobile } from \"./navigation-mobile\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\n\r\nexport interface IMainNavigationDependencies {\r\n\treadonly getInlineSvgsAsync: (ids: string[]) => Promise;\r\n\treadonly openLeadTimesPopupAsync?: () => Promise;\r\n}\r\ninterface IEventAnimation {\r\n\ttoggleEventVisibility: (open: boolean) => void;\r\n}\r\n\r\nexport function createMainNavigation(containerEl: HTMLElement, deps: IMainNavigationDependencies) {\r\n\tconst mainNavigationEl = containerEl;\r\n\tconst mobileMenuEl = expressQuerySelector(mainNavigationEl, \"#technical-mobile-menu\", false);\r\n\tconst isMobile = () => isMobileOnPageWithHeader();\r\n\r\n\tconst initEventAnimation = (): IEventAnimation => {\r\n\t\tconst eventContainer = expressQuerySelector(containerEl, '.technical-event-container', false);\r\n\t\tif (!eventContainer || !window['lottie']) return {\r\n\t\t\ttoggleEventVisibility: () => { return; }\r\n\t\t};\r\n\t\tconst stickyNav = eventContainer.dataset.stickynav === 'true';\r\n\t\tconst mobile = isMobile();\r\n\t\tconst seen = getCookie('evSeen') && getCookie('evSeen') === '1';\r\n\t\tconst imageContainer = expressQuerySelector(containerEl, '.technical-animate-img', true);\r\n\t\tconst animation = lottie.loadAnimation({\r\n\t\t\tcontainer: imageContainer,\r\n\t\t\trenderer: 'svg', // Choose the renderer\r\n\t\t\tloop: false,\r\n\t\t\tautoplay: false,\r\n\t\t\tpath: window.context.cdn + imageContainer.dataset.catimage,\r\n\t\t\tinitialSegment: seen ? [255, 354] : [0, 354]\r\n\t\t});\r\n\r\n\t\tanimation.addEventListener('complete', () => {\r\n\t\t\t// Loop the last 4 seconds of the animation continuously\r\n\t\t\tanimation.playSegments([255, 354], true);\r\n\t\t});\r\n\r\n\t\tconst animate = expressQuerySelector(containerEl, `.technical-animate-img`, true);\r\n\t\tanimate.style.transition = \"opacity 0.5s\";\r\n\t\tanimate.style.opacity = \"1\";\r\n\r\n\t\tconst eventContainerInitialHeight = eventContainer.clientHeight;\r\n\t\tconst toggleEventVisibility = (visiblePx: number) => {\r\n\t\t\tif (!mobile) {\r\n\t\t\t\timageContainer.style.opacity = `${1 - ((100 / 70) * visiblePx) / 100}`;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\teventContainer.style.opacity = `${1 - ((100 / 70) * visiblePx) / 100}`; // Changes the opacity on scroll\r\n\t\t\teventContainer.style.height = `${eventContainerInitialHeight + 1 - ((100 / 70) * visiblePx) / 5}px`; // Slightly collapses the evenContainer for a nice effect (+1 is for the border)\r\n\t\t\tif (stickyNav) {\r\n\t\t\t\tconst mobileSearchBar = expressQuerySelector(containerEl, '.technical-mobile-searchbar', true);\r\n\t\t\t\tmobileSearchBar.style.top = `${130 - visiblePx}px`; // Lets the scrollbar go to its fixed place when scrolling\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (stickyNav)\r\n\t\t\tdocument.addEventListener('scroll', _ => !getScrollingElement().classList.contains('u-no-scroll-mobile') && toggleEventVisibility(mobile ? window.scrollY > eventContainerInitialHeight ? eventContainerInitialHeight : window.scrollY : 0));\r\n\r\n\t\tanimation.play();\r\n\t\tif (!seen) writeCookieThatExpiresAtTheEndOfTheDay('evSeen', '1');\r\n\r\n\t\treturn {\r\n\t\t\ttoggleEventVisibility: (hide: boolean) => toggleEventVisibility(hide ? eventContainerInitialHeight : 0)\r\n\t\t};\r\n\t};\r\n\r\n\tconst initComponents = () => {\r\n\t\tconst eventAnimation = initEventAnimation();\r\n\r\n\t\t// Mobile Menu\r\n\t\tconst onOpen = () => { eventAnimation.toggleEventVisibility(true); };\r\n\t\tconst onClose = () => { eventAnimation.toggleEventVisibility(false); };\r\n\t\tinitMobileMenu(onOpen, onClose);\r\n\t\tconst loadDesktopMenuItemAsync = (firstLevel = -1, secondLevel = -1) => {\r\n\t\t\tif (secondLevel < 0)\r\n\t\t\t\treturn getHtmlRequest(\"/apicore/header/desktopmenu?indexLevel1=\" + firstLevel).then(res => res as string);\r\n\t\t\telse\r\n\t\t\t\treturn getHtmlRequest(\"/apicore/header/desktopmenu?indexLevel1=\" + firstLevel + \"&indexLevel2=\" + secondLevel).then(res => res as string);\r\n\t\t};\r\n\t\t// Desktop Menu\r\n\t\tconst desktopLeftMenuEl = expressQuerySelector(mainNavigationEl, '.technical-desktop-left-menu', false);\r\n\t\tif (desktopLeftMenuEl) {\r\n\t\t\tinitNavigationDesktop(\r\n\t\t\t\tdesktopLeftMenuEl, { loadDesktopMenuItemAsync }\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Language Selector\r\n\t\tconst langButtonEl = expressQuerySelector(mainNavigationEl, \".technical-language-selector\", false);\r\n\t\tconst langContainerEl = expressQuerySelector(mainNavigationEl, \".technical-language-selector-choices\", false);\r\n\t\tif (langButtonEl && langContainerEl) {\r\n\t\t\tinitLanguageSelector(langButtonEl, langContainerEl);\r\n\t\t}\r\n\r\n\t\tconst searchBarEl = expressQuerySelector(mainNavigationEl, \".o-main-navigation__searchbar\", false);\r\n\t\tif (searchBarEl) {\r\n\t\t\tinitSearchBar(\r\n\t\t\t\tsearchBarEl,\r\n\t\t\t\texpressQuerySelector(mainNavigationEl, \".o-icon-navigation__search-bar\", true),\r\n\t\t\t\t(searchTerm: string) => getRequest(\"/apicore/searchapi/autocomplete?searchterm=\" + searchTerm).then((res: string[]) => res),\r\n\t\t\t\t() => { !isMobile() && eventAnimation.toggleEventVisibility(true); },\r\n\t\t\t\t() => { !isMobile() && eventAnimation.toggleEventVisibility(false); }\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Notification Center\r\n\t\tconst notificationCenterEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__notifications-center', false);\r\n\t\tif (notificationCenterEl) {\r\n\t\t\tcreateNotificationCenter(\r\n\t\t\t\tnotificationCenterEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetNotifications: () => getHtmlRequest(\"/apicore/Header/LoadNotificationTiles\", {\r\n\t\t\t\t\t\theaders: new Headers({\r\n\t\t\t\t\t\t\t'pragma': 'no-cache',\r\n\t\t\t\t\t\t\t'cache-control': 'no-cache'\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\t.then(res => res as string),\r\n\t\t\t\t\tisMobile: isMobile,\r\n\t\t\t\t\tmarkNotificationsAsRead: (notificationIds: string[]) => {\r\n\t\t\t\t\t\tconst data = new URLSearchParams();\r\n\t\t\t\t\t\tnotificationIds.forEach(el => {\r\n\t\t\t\t\t\t\tdata.append('notificationIds', el);\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\treturn postRequest(\"/apicore/Header/MarkNotificationAsRead\", data, { headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" } }, true)\r\n\t\t\t\t\t\t\t.then((res: boolean) => res);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tonOpen: () => { isMobile() && eventAnimation.toggleEventVisibility(true); toggleScroll(); },\r\n\t\t\t\t\tonClose: () => { eventAnimation.toggleEventVisibility(false); toggleScroll(); },\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// My-Account\r\n\t\tconst myAccountMenuEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-menu', false);\r\n\t\tif (myAccountMenuEl) {\r\n\t\t\tinitMyAccount(\r\n\t\t\t\tmainNavigationEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetIconsAsync: deps.getInlineSvgsAsync,\r\n\t\t\t\t\tisMobile: isMobile,\r\n\t\t\t\t\tonOpen: () => { isMobile() && eventAnimation.toggleEventVisibility(true); toggleScroll(); },\r\n\t\t\t\t\tonClose: () => { eventAnimation.toggleEventVisibility(false); toggleScroll(); },\r\n\t\t\t\t\tloadAccountMenu: () => getHtmlRequest(\"/apicore/Header/LoadMyAccount\").then((res: string) => res)\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tconst leadTimesBarEl = expressQuerySelector(mainNavigationEl, '.technical-leadtimes', false);\r\n\t\tif (leadTimesBarEl) {\r\n\t\t\tcreateClickableElement(\r\n\t\t\t\tleadTimesBarEl,\r\n\t\t\t\tdeps.openLeadTimesPopupAsync\r\n\t\t\t);\r\n\r\n\t\t\tgetParameter('leadtimes') === 'true' && leadTimesBarEl.click();\r\n\t\t}\r\n\r\n\t\t// init countdowns on value propositions\r\n\t\tconst topBarContainerEl = expressQuerySelector(mainNavigationEl, '.technical-top-bar-container', false);\r\n\t\tif (topBarContainerEl) {\r\n\t\t\tconst countDownEls = expressQuerySelectorAll(topBarContainerEl, \".technical-countdown\");\r\n\t\t\tcountDownEls.forEach(el => {\r\n\t\t\t\tconst countDownToDate = el.dataset.countdown || \"\";\r\n\t\t\t\tconst daysLabel = el.dataset.dayslabel || \"\";\r\n\t\t\t\tconst dayLabel = el.dataset.daylabel || \"\";\r\n\t\t\t\tif (countDownToDate !== \"\") {\r\n\t\t\t\t\tconst onCountDownFinish = () => {\r\n\t\t\t\t\t\tconst barEls = expressQuerySelectorAll(topBarContainerEl, \".technical-top-bar\");\r\n\t\t\t\t\t\tif (barEls.length === 1) {\r\n\t\t\t\t\t\t\t// Hide container\r\n\t\t\t\t\t\t\thide(topBarContainerEl);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// delete own top bar\r\n\t\t\t\t\t\t\tconst myTopBar = getParentWithClassName(el, \"technical-top-bar\");\r\n\t\t\t\t\t\t\tmyTopBar && myTopBar.remove();\r\n\r\n\t\t\t\t\t\t\t// switch container to single\r\n\t\t\t\t\t\t\ttopBarContainerEl.classList.remove(\"m-top-bar--combo\");\r\n\t\t\t\t\t\t\ttopBarContainerEl.classList.add(\"m-top-bar--single\");\r\n\r\n\t\t\t\t\t\t\t// remove div around other top bar\r\n\t\t\t\t\t\t\tconst otherTopBar = barEls.filter(el => el !== myTopBar)[0];\r\n\t\t\t\t\t\t\tif (otherTopBar)\r\n\t\t\t\t\t\t\t\totherTopBar.outerHTML = otherTopBar.innerHTML;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tinitCountDown(topBarContainerEl, el, countDownToDate, {\r\n\t\t\t\t\t\tshowDays: true,\r\n\t\t\t\t\t\tonCountDownFinish: onCountDownFinish,\r\n\t\t\t\t\t\tdaysLabel,\r\n\t\t\t\t\t\tdayLabel\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst initMobileMenu = (onOpen: () => void, onClose: () => void) => {\r\n\t\tif (mobileMenuEl) {\r\n\t\t\tconst path = '/apicore/header/mobilemenu';\r\n\t\t\tconst pageid = mobileMenuEl.getAttribute(\"data-page-id\");\r\n\t\t\tinitNavigationMobile(\r\n\t\t\t\t{\r\n\t\t\t\t\tmobileMenuEl: mobileMenuEl,\r\n\t\t\t\t\tcontainerEl: expressQuerySelector(document, \".technical-mobile-navigation\", true),\r\n\t\t\t\t\tmenuButtonEl: expressQuerySelector(document, \".technical-mobile-navigation-hamburger-menu-button\", true),\r\n\t\t\t\t\tmenuContainerEl: expressQuerySelector(document, \".technical-mobile-navigation-hamburger-menu-container\", true),\r\n\t\t\t\t\tcurrentLanguage: mobileMenuEl.getAttribute(\"data-current-language\") || undefined\r\n\t\t\t\t}, {\r\n\t\t\t\tgetMobileMenu: (indexLevel2: number, indexLevel3: number) =>\r\n\t\t\t\t\tgetHtmlRequest(path + `?indexLevel2=${indexLevel2 ?? -1}&indexLevel3=${indexLevel3 ?? -1}&pageId=${pageid}`, { headers: new Headers({ 'pragma': 'no-cache', 'cache-control': 'no-cache' }) }).then(res => res as string),\r\n\t\t\t\tgetIconsAsync: deps.getInlineSvgsAsync,\r\n\t\t\t\tonClose: () => { onClose(); toggleScroll(); },\r\n\t\t\t\tonOpen: () => { onOpen(); toggleScroll(); },\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleScroll = () => {\r\n\t\tconst scrollingElement = getScrollingElement();\r\n\r\n\t\tif (!scrollingElement.classList.contains('u-no-scroll-mobile')) {\r\n\t\t\tscrollingElement.dataset.scrollY = `${Math.round(window.scrollY)}`;\r\n\t\t\tscrollingElement.classList.add('u-no-scroll-mobile');\r\n\t\t} else {\r\n\t\t\tscrollingElement.classList.remove('u-no-scroll-mobile');\r\n\t\t\tconst scrollY = parseInt(scrollingElement.dataset.scrollY, 10) || window.scrollY;\r\n\t\t\tscrollingElement.dataset.scrollY = '';\r\n\t\t\twindow.scroll(0, scrollY);\r\n\t\t}\r\n};\r\n\r\nconst getScrollingElement = () => (document.scrollingElement || document.documentElement) as HTMLElement;\r\n\r\ninitComponents();\r\n}\r\n","export interface IIconResult {\r\n\treadonly url: string;\r\n\treadonly svg: string;\r\n}\r\n\r\nconst getInlineSvgAsync = (url: string): Promise => {\r\n\treturn fetch(url)\r\n\t\t.then(response => response.text())\r\n\t\t.then(data => new window.DOMParser().parseFromString(data, \"text/xml\"))\r\n\t\t.then(document => {\r\n\t\t\tif (document && document.documentElement.nodeName.toLowerCase() === 'svg') {\r\n\t\t\t\tconst svgString = new XMLSerializer().serializeToString(document);\r\n\t\t\t\treturn Promise.resolve(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\turl,\r\n\t\t\t\t\t\tsvg: svgString\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\treturn Promise.resolve(undefined);\r\n\t\t\t}\r\n\t\t});\r\n};\r\n\r\nexport function getInlineSvgsAsync(urls: string[]) {\r\n\treturn Promise.all(urls.map(u => getInlineSvgAsync(u)))\r\n\t\t.then(items => items.filter(item => !!item) as IIconResult[]);\r\n}","import {IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener, expressQuerySelector} from \"../common/html\";\r\n\r\nexport interface ICountrySelectionDependencies {\r\n readonly showCountrySelectionPopup: () => Promise;\r\n readonly close: () => void;\r\n}\r\n\r\nexport function createCountrySelection(deps: ICountrySelectionDependencies) {\r\n let onClickDisposable: IDisposable;\r\n\r\n const init = () => {\r\n deps.showCountrySelectionPopup().then(() => {\r\n const countrySelectionPopup = expressQuerySelector(document, '#country-selection');\r\n if (countrySelectionPopup) {\r\n const continueButton = expressQuerySelector(countrySelectionPopup, '.technical-countryselection');\r\n if (continueButton) {\r\n if (continueButton.dataset.countryselectionlink) {\r\n const navigateToLink = continueButton.dataset.countryselectionlink.toLowerCase();\r\n attachOnClick(continueButton, () => navigateTo(navigateToLink));\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const navigateTo = (navigateToLink: string | undefined) => {\r\n if (navigateToLink) document.location.href = navigateToLink;\r\n\r\n deps.close();\r\n };\r\n\r\n const attachOnClick = (button: HTMLElement, ev: any) =>\r\n (onClickDisposable = expressEventListener(button, 'click', ev));\r\n\r\n const detachClick = () => onClickDisposable && onClickDisposable.dispose();\r\n\r\n init();\r\n\r\n return {\r\n dispose: () => {\r\n detachClick();\r\n }\r\n };\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\tgetParents, hide,\r\n\thtmlToElement,\r\n\texpressQuerySelectorAll, expressRemoveClass, show\r\n} from \"../common/html\";\r\nimport {postHtmlRequest} from \"../utils/fetch\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface IPopup {\r\n\tpopup: HTMLElement | undefined;\r\n\topenAsync: () => Promise;\r\n\treplaceContent: (content: Node | string) => void;\r\n\tclose: () => void;\r\n}\r\n\r\nexport interface IPopupOptions {\r\n\treadonly closeOnClickOutsidePopup?: boolean;\r\n\treadonly onClose?: (popupEl?: HTMLElement) => void;\r\n\treadonly onBeforeOpen?: (popupEl?: HTMLElement) => void;\r\n\treadonly onBeforeClose?: (popupEl?: HTMLElement) => void;\r\n\treadonly onOpen?: (popupEl?: HTMLElement) => void;\r\n\treadonly dialogId: string;\r\n\treadonly cssClass?: string;\r\n\treadonly view: string;\r\n\treadonly forceRefresh?: boolean;\r\n\treadonly fromCache?: boolean;\r\n\treadonly data?: any;\r\n\treadonly closeOnEnter?: boolean;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nlet fetchingPopupContent = false;\r\n\r\nexport async function createPopup(options: IPopupOptions): Promise {\r\n\tlet isOpen = false;\r\n\tlet popupEl: HTMLElement;\r\n\tconst eventDisposables: IDisposable = compositeDisposable(undefined);\r\n\tconst html = expressQuerySelector(document, \"html\", true);\r\n\tconst body = expressQuerySelector(document, \"body\", true);\r\n\tlet currentY = window.scrollY;\r\n\tconst renderedDialogEl = expressQuerySelector(document, \".renderedDialogs\", true);\r\n\r\n\tconst {\r\n\t\tcloseOnClickOutsidePopup = true,\r\n\t\tonClose,\r\n\t\tonBeforeOpen,\r\n\t\tonBeforeClose,\r\n\t\tonOpen,\r\n\t\tdialogId,\r\n\t\tcssClass,\r\n\t\tview,\r\n\t\tforceRefresh,\r\n\t\tfromCache,\r\n\t\tdata,\r\n\t\tcloseOnEnter,\r\n\t\topenClass\r\n\t} = options;\r\n\r\n\tconst create = (): Promise => {\r\n\t\tlet popup: HTMLElement;\r\n\t\tif (dialogId) {\r\n\t\t\tpopup = expressQuerySelector(document, \"#\" + dialogId, false);\r\n\t\t\tif (popup) {\r\n\t\t\t\tif (forceRefresh) {\r\n\t\t\t\t\t// To keep the same position in the dom tree, so other popups with the same z-inder will remain above or under this popup\r\n\t\t\t\t\tconst tempEl = document.createElement(\"div\");\r\n\t\t\t\t\ttempEl.setAttribute(\"id\", \"temp-\"+dialogId);\r\n\t\t\t\t\tpopup.replaceWith(tempEl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn Promise.resolve(popup);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (fetchingPopupContent) return Promise.resolve(undefined);\r\n\t\tfetchingPopupContent = true;\r\n\r\n\t\t// Get the html from the server\r\n\t\tconst path = `/apicore/dialog/${view}`;\r\n\t\treturn postHtmlRequest(path.toLowerCase(), data, {headers: new Headers({'Content-type': 'application/json; charset=utf-8'})}).then(\r\n\t\t\tres => {\r\n\t\t\t\tif (!res) return Promise.resolve(undefined);\r\n\t\t\t\tconst temp = expressQuerySelector(document, \"#temp-\" + dialogId, false);\r\n\t\t\t\tif (forceRefresh && temp) {\r\n\t\t\t\t\t// To keep the same position in the dom tree, so other popups with the same z-inder will remain above or under this popup\r\n\t\t\t\t\tpopup = htmlToElement(res) as HTMLElement;\r\n\t\t\t\t\ttemp.replaceWith(popup);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpopup = renderedDialogEl.appendChild(htmlToElement(res)) as HTMLElement;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dialogId)\r\n\t\t\t\t\tpopup.setAttribute(\"id\", dialogId);\r\n\r\n\t\t\t\tif (cssClass)\r\n\t\t\t\t\texpressAddClass(popup, cssClass);\r\n\r\n\t\t\t\treturn Promise.resolve(popup);\r\n\t\t\t}).finally(() => { fetchingPopupContent = false; });\r\n\t};\r\n\tconst replaceContent = (content: Node | string) => {\r\n\t\teventDisposables.dispose();\r\n\t\tconst popupContentEl = expressQuerySelector(popupEl, '.m-popup__content', true);\r\n\t\tpopupContentEl.replaceWith(content);\r\n\t\taddOnClose();\r\n\t};\r\n\tconst close = () => {\r\n\t\tif (onBeforeClose) onBeforeClose(popupEl);\r\n\t\tif (openClass)\r\n\t\t\texpressRemoveClass(popupEl, openClass);\r\n\t\telse\r\n\t\t\thide(popupEl);\r\n\t\tisOpen = false;\r\n\t\t// Only do this if there are no other popups open\r\n\t\tconst popupEls = expressQuerySelectorAll(renderedDialogEl, \".m-popup\");\r\n\t\tconst otherOpenedPopups = popupEls.filter(p => p.id !== popupEl.id && (p.style.display === 'flex' || p.classList.contains('is-popup-open')));\r\n\t\tif (otherOpenedPopups.length === 0){\r\n\t\t\texpressRemoveClass(html, \"has-open-dialog u-no-scroll\");\r\n\t\t\texpressRemoveClass(body, \"u-no-scroll\");\r\n\t\t\tdocument.documentElement.style.marginTop = \"0px\";\r\n\t\t\twindow.scroll(0, currentY);\r\n\t\t}\r\n\t\teventDisposables.dispose();\r\n\t\tif (onClose) window.setTimeout(() => {\r\n\t\t\tif (!isOpen) onClose(popupEl);\r\n\t\t}, 200);\r\n\t};\r\n\r\n\tconst onMouseDownEvent = (ev) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (ev.target.id\r\n\t\t\t&& getParents(ev.target, \"#\" + popupEl.id).length < 1\r\n\t\t\t&& getParents(ev.target, \".m-popup\").length < 1 // support multiple popups\r\n\t\t\t&& isOpen) close();\r\n\t};\r\n\r\n\tconst onKeyDownEvent = (ev) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (ev.which === 13 || ev.keyCode === 13) if (isOpen) close();\r\n\t};\r\n\r\n\tconst onCloseEvent = () => {\r\n\t\tif (isOpen) close();\r\n\t};\r\n\r\n\tconst addOnClose = () => {\r\n\t\tconst closeButtons = expressQuerySelectorAll(popupEl, \".technical-popup-close\");\r\n\t\tcloseButtons.forEach(closeButton => {\r\n\t\t\teventDisposables.add(expressEventListener(closeButton, 'click', onCloseEvent));\r\n\t\t});\r\n\t\tif (closeOnClickOutsidePopup) {\r\n\t\t\tgetParents(popupEl).forEach(el => {\r\n\t\t\t\teventDisposables.add(expressEventListener(el, \"mousedown\", onMouseDownEvent));\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (closeOnEnter) eventDisposables.add(expressEventListener(document, \"keydown\", onKeyDownEvent));\r\n\t};\r\n\r\n\tconst openPopupAsync = (): Promise => {\r\n\t\tif (isOpen || !popupEl) return Promise.resolve();\r\n\t\tcurrentY = window.scrollY;\r\n\t\tif (onBeforeOpen) onBeforeOpen(popupEl);\r\n\t\tif (openClass)\r\n\t\t\texpressAddClass(popupEl, openClass);\r\n\t\telse\r\n\t\t\tshow(popupEl);\r\n\t\tisOpen = true;\r\n\t\taddOnClose();\r\n\t\tdocument.documentElement.style.marginTop = \"-\" + Math.round(currentY) + \"px\";\r\n\r\n\t\texpressAddClass(html, \"has-open-dialog u-no-scroll\");\r\n\t\texpressAddClass(body, \"u-no-scroll\");\r\n\r\n\t\tif (!openClass) popupEl.style.display = \"flex\";\r\n\t\tif (isOpen && onOpen) onOpen(popupEl);\r\n\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tif (!popupEl) popupEl = await create();\r\n\r\n\treturn Promise.resolve({\r\n\t\tpopup: popupEl,\r\n\t\topenAsync: openPopupAsync,\r\n\t\tclose: close,\r\n\t\treplaceContent\r\n\t} as IPopup);\r\n}\r\n","export function checkPersonalNumber(pin, regionCode): boolean {\r\n\tif (pin.trim() === \"\")\r\n\t\treturn true;\r\n\r\n\tswitch (regionCode) {\r\n\t\tcase \"SWE\":\r\n\t\t\treturn checksumSe(pin);\r\n\t\tcase \"NOR\":\r\n\t\t\treturn checksumNo(pin);\r\n\t\tcase \"DNK\":\r\n\t\t\treturn checksumDk(pin);\r\n\t\tcase \"FIN\":\r\n\t\t\treturn checksumFi(pin);\r\n\t\tdefault:\r\n\t\t\treturn true;\r\n\t}\r\n}\r\n\r\nconst checksumDk = (pin: string): boolean => {\r\n\tif (pin && pin.length === 11) {\r\n\t\tconst checkSumString = \"4327654321\";\r\n\t\tlet result1 = 0;\r\n\t\tconst temp = pin.toString().substring(0, 6) + pin.toString().substring(7, 10);\r\n\r\n\t\tfor (let i = 0; i < 9; i++) {\r\n\t\t\tresult1 += parseInt(checkSumString[i].toString(), 10) * parseInt(temp[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum = 11 - result1 % 11;\r\n\t\tif (checksum === 11)\r\n\t\t\tchecksum = 0;\r\n\r\n\t\tif (checksum.toString() === pin[10])\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumFi = (pin: string): boolean => {\r\n\tif (pin && pin.length === 11) {\r\n\t\tconst checkSumString = \"0123456789ABCDEFHJKLMNPRSTUVWXY\";\r\n\r\n\t\tconst temp = parseInt(pin.toString().substring(0, 6) + pin.toString().substring(7, 10), 10);\r\n\t\tconst result1 = temp % 31;\r\n\t\tconst checksum = checkSumString[result1];\r\n\r\n\t\tif (checksum === pin[10])\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumNo = (pin: string): boolean => {\r\n\tif (pin && pin.length === 12) {\r\n\t\tlet result1 = 0;\r\n\t\tlet result2 = 0;\r\n\t\tconst checkSumString1 = \"376189-452\";\r\n\t\tconst checkSumString2 = \"543276-5432\";\r\n\r\n\t\tfor (let i = 0; i < 10; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\t\t\tresult1 += parseInt(checkSumString1[i].toString(), 10) * parseInt(pin[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum1 = 11 - result1 % 11;\r\n\t\tif (checksum1 === 11)\r\n\t\t\tchecksum1 = 0;\r\n\r\n\t\tif (checksum1.toString() !== pin[10])\r\n\t\t\treturn false;\r\n\r\n\r\n\t\tfor (let i = 0; i < 11; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\t\t\tresult2 += parseInt(checkSumString2[i].toString(), 10) * parseInt(pin[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum2 = 11 - result2 % 11;\r\n\t\tif (checksum2 === 11)\r\n\t\t\tchecksum2 = 0;\r\n\r\n\t\tif (checksum2.toString() !== pin[11])\r\n\t\t\treturn false;\r\n\t\telse\r\n\t\t\treturn true;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumSe = (pin: string): boolean => {\r\n\tif (pin && (pin.length === 11 || pin.length === 13)) {\r\n\t\tlet result1 = 0;\r\n\t\tconst multiplier = \"212121-212\".split('').map(s => +s); // convert string to number using +\r\n\t\tlet temp = 0;\r\n\r\n\t\t// format must be 123456-1234\r\n\t\tif (pin.length === 13)\r\n\t\t\tpin = pin.toString().substring(2);\r\n\t\tconst pins = pin.split('').map(s => +s);\r\n\t\tfor (let i = 0; i < 10; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\ttemp = multiplier[i] * pins[i];\r\n\t\t\tif (temp > 9)\r\n\t\t\t\tresult1 += parseInt(temp.toString().split('')[0], 10) + parseInt(temp.toString().split('')[1], 10);\r\n\t\t\telse\r\n\t\t\t\tresult1 += temp;\r\n\t\t}\r\n\r\n\t\tconst lastDigit = parseInt(result1.toString().split('')[result1.toString().length - 1], 10);\r\n\r\n\t\tlet checksum;\r\n\t\tif (lastDigit === 0)\r\n\t\t\tchecksum = 0;\r\n\t\telse\r\n\t\t\tchecksum = 10 - lastDigit;\r\n\r\n\t\treturn checksum === pins[10];\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\n","import {expressQuerySelector, isElementVisible} from \"../common/html\";\r\nimport {debounce} from \"../utils/debounce\";\r\n\r\nexport function createScrollToTop()\r\n{\r\n\tconst scrollToTopEl = expressQuerySelector(document, \".technical-scroll-to-top\", false);\r\n\tconst init = () => {\r\n\t\tconst wobblerEl = expressQuerySelector(document, \".m-wobbler\", false);\r\n\t\tconst stickyCtaButtonEl = expressQuerySelector(document, \".technical-mobile-cta-button\", false);\r\n\t\tconst footerEl = expressQuerySelector(document, \"footer\", false);\r\n\t\tlet fade;\r\n\t\tlet displayNone;\r\n\t\tif (wobblerEl && stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\tscrollToTopEl!.classList.add('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t} else {\r\n\t\t\tif (wobblerEl) scrollToTopEl.classList.add('m-scroll-to-top--has-wobbler');\r\n\t\t\tif (stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) scrollToTopEl.classList.add(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t}\r\n\r\n\t\tconst isIOS = (): boolean => {\r\n\t\t\tconst iosQuirkPresent = () => {\r\n\t\t\t\tconst audio = new Audio();\r\n\t\t\t\taudio.volume = 0.5;\r\n\t\t\t\treturn audio.volume === 1; // volume cannot be changed from \"1\" on iOS 12 and below\r\n\t\t\t};\r\n\t\t\tconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n\t\t\tconst isAppleDevice = navigator.userAgent.indexOf('Macintosh') !== 0;\r\n\t\t\tconst isTouchScreen = navigator.maxTouchPoints >= 1; // true for iOS 13\r\n\t\t\treturn isIOS || (isAppleDevice && (isTouchScreen || iosQuirkPresent()));\r\n\t\t};\r\n\r\n\t\tconst setBottomStyle = () => {\r\n\t\t\tif (wobblerEl && stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = stickyCtaButtonEl.clientHeight + \"px\";\r\n\t\t\t\tif (stickyCtaButtonEl.clientHeight > 60) scrollToTopEl.style.bottom = \"125px\";\r\n\t\t\t\telse scrollToTopEl.style.bottom = \"110px\";\r\n\t\t\t} else if (stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = stickyCtaButtonEl.clientHeight + \"px\";\r\n\t\t\t\tif (stickyCtaButtonEl.clientHeight > 60) scrollToTopEl.style.bottom = \"105px\";\r\n\t\t\t\telse scrollToTopEl.style.bottom = \"90px\";\r\n\t\t\t} else {\r\n\t\t\t\tscrollToTopEl.style.bottom = \"\";\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = \"\";\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst showBtn = (num: number) => {\r\n\t\t\tif (document.documentElement.scrollTop >= num ) {\r\n\t\t\t\tclearTimeout(fade);\r\n\t\t\t\tfade = setTimeout( function() {\r\n\t\t\t\t\tclearTimeout(displayNone);\r\n\t\t\t\t\tscrollToTopEl!.classList.remove('u-hide');\r\n\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\tscrollToTopEl!.classList.remove('m-scroll-to-top--invisible');\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t}, 100);\r\n\t\t\t} else {\r\n\t\t\t\tclearTimeout(fade);\r\n\t\t\t\tfade = setTimeout( function() {\r\n\t\t\t\t\tscrollToTopEl!.classList.add('m-scroll-to-top--invisible');\r\n\t\t\t\t\tdisplayNone = setTimeout(function () {\r\n\t\t\t\t\t\tscrollToTopEl!.classList.add('u-hide');\r\n\t\t\t\t\t}, 500);\r\n\t\t\t\t}, 100);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onResize = () => {\r\n\t\t\tif (!stickyCtaButtonEl) return;\r\n\t\t\tif (isElementVisible(stickyCtaButtonEl))\r\n\t\t\t{\r\n\t\t\t\tif (wobblerEl) scrollToTopEl!.classList.add('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t\t\telse scrollToTopEl.classList.add(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t\t} else {\r\n\t\t\t\tif (wobblerEl) {\r\n\t\t\t\t\tscrollToTopEl!.classList.remove('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t\t\t\tscrollToTopEl.classList.add('m-scroll-to-top--has-wobbler');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscrollToTopEl.classList.remove(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsetBottomStyle();\r\n\t\t};\r\n\r\n\t\twindow.addEventListener('scroll', () => { showBtn(20); });\r\n\t\twindow.addEventListener('resize', () => { debounce(onResize, 100); });\r\n\r\n\t\tif (scrollToTopEl) {\r\n\t\t\tscrollToTopEl.addEventListener(\"click\", () => {\r\n\t\t\t\twindow.scrollTo({ top: 0, behavior: \"smooth\" });\r\n\t\t\t\tif (isIOS()) debounce(() => { window.scrollTo({ top: 0, behavior: \"smooth\" }); }, 100);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tsetBottomStyle();\r\n\t};\r\n\r\n\tscrollToTopEl && init();\r\n}\r\n","import { expressQuerySelector } from \"../common/html\";\r\nimport { createNewsletterSubscribe } from \"./newsletter\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport { getCookie } from \"../utils/cookie\";\r\n\r\nexport function initLeaveIntent() {\r\n\tconst toggleLeaveIntent = (enable: boolean) => { if (typeof window.enableLeaveIntent !== \"undefined\") window.enableLeaveIntent = enable; };\r\n\tconst isLeaveIntentEnabled = (): boolean => window.enableLeaveIntent && window.location.search.indexOf(\"embed\") < 0 && getCookie(\"subscribedInThisSession\") !== \"true\";\r\n\tconst triggerLeaveIntentPopup = () => {\r\n\t\tcreatePopup({\r\n\t\t\tdialogId: 'leave-intent-dialog',\r\n\t\t\tview: 'leaveintentdialog'\r\n\t\t}).then(popup => {\r\n\t\t\tif (!popup.popup) return;\r\n\t\t\tpopup.openAsync()\r\n\t\t\t\t.then(_ => createNewsletterSubscribe(expressQuerySelector(popup.popup, '.technical-newsletter-subscribe', true)));\r\n\t\t});\r\n\t};\r\n\tconst init = (forceEnable?: boolean) => {\r\n\t\tif (!isLeaveIntentEnabled() && !forceEnable) return;\r\n\r\n\t\ttry {\r\n\t\t\touibounce(false, {\r\n\t\t\t\tsensitivity: 20,\r\n\t\t\t\taggressive: false,\r\n\t\t\t\tsitewide: true,\r\n\t\t\t\ttimer: 1000,\r\n\t\t\t\tdelay: 100,\r\n\t\t\t\tcallback: triggerLeaveIntentPopup,\r\n\t\t\t\tcookieExpire: 1,\r\n\t\t\t\tcanFire: isLeaveIntentEnabled\r\n\t\t\t});\r\n\t\t} catch (exc) {\r\n\t\t\t// Adblocker probably blocked ouiBounce from loading.\r\n\t\t}\r\n\t};\r\n\r\n\tinit(false);\r\n\r\n\treturn {\r\n\t\tEnableLeaveIntentPopup: () => init(true),\r\n\t\tEnableLeaveIntent: () => toggleLeaveIntent(true),\r\n\t\tDisableLeaveIntent: () => toggleLeaveIntent(false)\r\n\t};\r\n}\r\n","import {createPopup, IPopup} from \"./popup-new\";\r\nexport interface IShowContentDialogDependencies {\r\n\treadonly dialogId: string;\r\n\treadonly label?: string;\r\n\treadonly title?: string;\r\n\treadonly cssClass?: string;\r\n\treadonly addTitleCssClass?: boolean;\r\n\treadonly extraPopupCss?: string;\r\n\treadonly openFunction?: (popupEl: HTMLElement) => void;\t\r\n\treadonly okButtonKey?: string;\r\n\treadonly onClose? : (popupEl?: HTMLElement) => void;\r\n}\r\n\r\nexport function ShowContentDialog(deps: IShowContentDialogDependencies): Promise {\r\n\tconst { label, title, dialogId, cssClass, openFunction, okButtonKey, onClose, addTitleCssClass, extraPopupCss } = deps;\r\n\tif (!dialogId) return;\r\n\r\n\treturn createPopup({\r\n\t\tdialogId: dialogId,\r\n\t\tview: 'GenericPopup',\r\n\t\tdata: {\r\n\t\t\tBodyLabel: label?.startsWith('Label.') ? label : `Label.${label}`,\r\n\t\t\tTitleLabel: title?.startsWith('Label.') ? title : `Label.${title}`,\r\n\t\t\tExtraPopupCss: extraPopupCss,\r\n\t\t\tTitleCssClass: addTitleCssClass ? 'a-typography__no-decoration technical-popup-title' : '',\r\n\t\t\tOkButtonLabel: okButtonKey\r\n\t\t},\r\n\t\tcssClass: cssClass,\r\n\t\tcloseOnClickOutsidePopup: true,\r\n\t\tforceRefresh: true,\r\n\t\tonClose\r\n\t}).then(popup => {\r\n\t\tif (!popup.popup) return;\r\n\t\tpopup.openAsync();\r\n\t\tif (openFunction)\r\n\t\t\topenFunction(popup.popup);\r\n\t\treturn popup;\r\n\t});\r\n}\r\n","import { expressQuerySelector, expressQuerySelectorAll, hasClass } from \"../common/html\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { toUrlHash } from \"../utils/string\";\r\n\r\nexport interface ITabDependencies {\r\n\treadonly onBeforeOpen?: (tabContentEl: HTMLElement) => Promise;\r\n\treadonly onTabSwitch?: (oldTabId: string, newTabId: string) => void;\r\n}\r\n\r\nexport interface ITabContentRequest {\r\n\tid: string;\r\n\tproductCategory: string;\r\n\ttheme: string;\r\n}\r\n\r\nexport function CreateTabs(container: HTMLElement, deps?: ITabDependencies) {\r\n\tlet tabsCollectionContainer;\r\n\tif (hasClass(container, 'm-tabs')) {\r\n\t\ttabsCollectionContainer = container;\r\n\t} else {\r\n\t\ttabsCollectionContainer = expressQuerySelector(container, '.m-tabs', true);\r\n\t}\r\n\tconst tabHideClass = tabsCollectionContainer.dataset.hideclass || 'u-hide';\r\n\tconst init = () => {\r\n\t\tconst tabEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__input');\r\n\t\tif (tabEls.length > 1) {\r\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\r\n\t\t\tconst activeTab = urlParams.get('activetab');\r\n\t\t\tif (tabEls.filter(el => el.dataset.url).length === 0) {\r\n\t\t\t\tfixDataAttributes(tabEls);\r\n\t\t\t}\r\n\t\t\tupdateTab(tabEls, tabHideClass, activeTab);\r\n\t\t\taddEventListenerToTabs(tabEls);\r\n\t\t}\r\n\t};\r\n\tconst addQueryStringParameter = (key: string, value: string) => {\r\n\t\tif ('URLSearchParams' in window) {\r\n\t\t\tconst searchParams = new URLSearchParams(window.location.search);\r\n\t\t\tsearchParams.set(key, value);\r\n\t\t\tconst newRelativePathQuery = window.location.pathname + '?' + searchParams.toString();\r\n\t\t\thistory.replaceState({}, document.title, newRelativePathQuery);\r\n\t\t}\r\n\t};\r\n\r\n\tconst fixDataAttributes = (tabEls: HTMLInputElement[]) => {\r\n\t\tconst tabContentEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__content');\r\n\t\tif (tabEls.filter(el => el.dataset.url).length === 0) {\r\n\t\t\tlet hash;\r\n\t\t\tfor (let i = 0; i < tabEls.length; i++) {\r\n\t\t\t\tif (tabEls[i].hasAttribute('id')) {\r\n\t\t\t\t\thash = toUrlHash(tabEls[i].getAttribute('id'));\r\n\t\t\t\t\ttabEls[i].dataset.url = hash;\r\n\t\t\t\t\ttabContentEls[i].dataset.url = hash;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thash = 'tab' + i + '';\r\n\t\t\t\t\ttabEls[i].dataset.url = hash;\r\n\t\t\t\t\ttabContentEls[i].dataset.url = hash;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst addEventListenerToTabs = (tabEls: HTMLInputElement[]) => {\r\n\t\t// make tabs click-able\r\n\t\tfor (let i = 0; i < tabEls.length; i++)\r\n\t\t\ttabEls[i].addEventListener('change', (e) => {\r\n\t\t\t\tupdateTab(tabEls, tabHideClass, (e.target as HTMLElement).dataset.url);\r\n\t\t\t});\r\n\t};\r\n\r\n\t// update tab content visibility\r\n\tconst updateTab = (tabEls: HTMLInputElement[], hideClass: string, hash: string | undefined, pushNewHash = true) => {\r\n\t\tconst tabToSelect = hash ? expressQuerySelector(tabsCollectionContainer, `input[data-url=\"${hash}\"]`, false) : undefined;\r\n\t\tconst tabToSelectContent = hash ? expressQuerySelector(tabsCollectionContainer, `div[data-url=\"${hash}\"]`, false) : undefined;\r\n\t\tconst tabContentEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__content');\r\n\r\n\t\tif (tabToSelectContent && deps?.onBeforeOpen && tabToSelect && (!tabToSelect.dataset.loaded || tabToSelect.dataset.loaded !== 'true')) {\r\n\t\t\tdeps.onBeforeOpen(tabToSelectContent).then(_ => { tabToSelect.dataset.loaded = 'true'; });\r\n\t\t}\r\n\r\n\t\tfor (let z = 0; z < tabEls.length; z++) {\r\n\t\t\t// set check if selected tab\r\n\t\t\ttabEls[z].checked = (tabEls[z] === tabToSelect || (!tabToSelect && z === 0));\r\n\r\n\t\t\t// hide/show content selected tab\r\n\t\t\ttabContentEls[z].classList.toggle(hideClass || 'u-hide', !tabEls[z].checked);\r\n\r\n\t\t\t// push new # to the url bar\r\n\t\t\tif (tabEls[z].checked && pushNewHash && tabToSelect) {\r\n\t\t\t\tdeps?.onTabSwitch && deps.onTabSwitch(getParameter('activetab'), hash);\r\n\t\t\t\taddQueryStringParameter(\"activetab\", `${hash}`);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tinit();\r\n}\r\n","import {expressEventListener, expressQuerySelector} from \"../common/html\";\r\nimport {ShowContentDialog} from \"./content-dialog\";\r\nimport {CreateTabs} from \"./tab\";\r\n\r\nexport function createPopupLauncher(el: HTMLElement) {\r\n\tconst dialogId = el.dataset.dialogid || '';\r\n\tconst contentKey = el.dataset.label || '';\r\n\tif (dialogId && contentKey) {\r\n\t\tconst initContentParts = (popupEl: HTMLElement) => {\r\n\t\t\tif (!popupEl) return;\r\n\t\t\tconst tabsEl = expressQuerySelector(popupEl, \".m-tabs\", false);\r\n\t\t\tif (tabsEl) CreateTabs(tabsEl);\r\n\t\t};\r\n\t\tconst onClick = (e:MouseEvent) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tShowContentDialog({dialogId: dialogId, label: contentKey, openFunction: initContentParts});\r\n\t\t}; \r\n\t\texpressEventListener(el, 'click', onClick);\r\n\t}\r\n}\r\n","import {getHtmlRequest} from \"../utils/fetch\";\r\nimport {addParameter, updateParameter} from \"../utils/querystring\";\r\nconst basePath = \"/apicore/componentapi/\";\r\n\r\nexport function getComponentContent(\r\n\tcomponent: string,\r\n\tcontentKey: string,\r\n\tepc = \"\",\r\n\tisProspect = false,\r\n\tthemeKey = '',\r\n\tpageTemplate = '',\r\n\tpageName = '',\r\n\tindex = \"0\",\r\n\thidepromotionvisualization = 'false'): Promise {\r\n\tlet path = basePath + component;\r\n\tif (contentKey) path = addParameter(\"contentKey\", contentKey, path);\r\n\tif (epc) path = addParameter(\"epc\", epc, path);\r\n\tpath = addParameter(\"isProspect\", isProspect+'', path);\r\n\tif (themeKey) path = addParameter(\"theme\", themeKey, path);\r\n\tif (pageTemplate) path = addParameter(\"pageTemplate\", pageTemplate, path);\r\n\tif (pageName) path = addParameter(\"pageName\", pageName, path);\r\n\tpath = addParameter(\"index\", index, path);\r\n\tpath = addParameter(\"hidepromotionvisualization\", hidepromotionvisualization, path);\r\n\treturn getHtmlRequest(\r\n\t\tpath,\r\n\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t.then() as Promise;\r\n}\r\n","export interface IDataLayerProduct {\r\n\tcurrency: string;\r\n\tdeliveryInfo: string;\r\n\tformatImageSrc: string;\r\n\tcategoryCode: string;\r\n\tcategoryName: string;\r\n\tprice: number;\r\n\tparentCategories: string;\r\n\tpvc: string;\r\n\tproductCode: string;\r\n\tpvcName: string;\r\n}\r\n\r\nexport function pushEecDetailEvent(newUrl: string, product: IDataLayerProduct) {\r\n\tif (window.dataLayer[0].datalayerVersion >= '2022-06') {\r\n\t\twindow.dataLayer = window.dataLayer || [];\r\n\t\twindow.dataLayer.push({\r\n\t\t\tevent: 'eec.detail',\r\n\t\t\tecommerce: {\r\n\t\t\t\tdetail: {\r\n\t\t\t\t\tactionField: {\r\n\t\t\t\t\t},\r\n\t\t\t\t\tproducts: [{\r\n\t\t\t\t\t\tvariant: product?.pvc,\r\n\t\t\t\t\t\tid: product?.productCode,\r\n\t\t\t\t\t\tname: product?.pvcName,\r\n\t\t\t\t\t\tcategory: product?.parentCategories,\r\n\t\t\t\t\t\tprice: product?.price,\r\n\t\t\t\t\t\tpriceWOVat: 0,\r\n\t\t\t\t\t\tcurrencyCode: product?.currency,\r\n\t\t\t\t\t\tisItemJustAddedToCart: false,\r\n\t\t\t\t\t\tproductCategoryName: product?.categoryName,\r\n\t\t\t\t\t\tproductCategoryCode: product?.categoryCode,\r\n\t\t\t\t\t\tproductCategoryUrl: newUrl,\r\n\t\t\t\t\t\tvariantFormatImageUrl: product?.formatImageSrc,\r\n\t\t\t\t\t\testDeliveryDate: product?.deliveryInfo,\r\n\t\t\t\t\t\tisVoucher: false // ?\r\n\t\t\t\t\t}]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport function pushComponentEvent(componentName: string) {\r\n\twindow.dataLayer = window.dataLayer || [];\r\n\twindow.dataLayer.push({\r\n\t\t'event': componentName +'.component.loaded'\r\n\t});\r\n}\r\n","import {\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\thasClass,\r\n\tisElementPartiallyVisibleInViewport,\r\n\tisMobileOnPageWithHeader\r\n} from \"../common/html\";\r\nimport {getComponentContent} from \"../services/component-service.\";\r\nimport {trackComponentEvent} from \"../common/events\";\r\nimport {pushComponentEvent} from \"./datalayer\";\r\nimport {isValidPartialViewResponse} from \"../utils/fetch\";\r\n\r\nexport interface IComponent {\r\n\treadonly name: string;\r\n\treadonly activate: () => void;\r\n\treadonly index: string;\r\n}\r\n\r\nexport function createComponentLoader() {\r\n\tconst componentEls = expressQuerySelectorAll(document, \"[data-component]\");\r\n\tconst components: IComponent[] = [];\r\n\t/*const loadedScripts: string[] = [];\r\n\tconst scriptBasePath = \"core/components/\";*/\r\n\tconst isMobile = () => isMobileOnPageWithHeader();\r\n\r\n\tconst observerOptions = {\r\n\t\trootMargin: \"200px 0px 200px 0px\",\r\n\t\tthreshold: [0, .5, 1]\r\n\t};\r\n\r\n\tconst initComponent = (el: HTMLElement) => {\r\n\t\tconst componentName =el.dataset.component || '';\r\n\t\tconst index = el.dataset.index || '';\r\n\t\tconst initialized = el.dataset.init === 'true' || false;\r\n\t\tif (!componentName || initialized) return;\r\n\t\tconst currentComponent = index\r\n\t\t\t? components.find(c => c.name === componentName && c.index === index)\r\n\t\t\t: components.find(c => c.name === componentName);\r\n\t\tif (!currentComponent) return;\r\n\t\tcurrentComponent.activate();\r\n\t};\r\n\r\n\tfunction callback(entries: IntersectionObserverEntry[], observer: IntersectionObserver) {\r\n\t\tentries.forEach(entry => {\r\n\t\t\tif (!entry.isIntersecting && entry.intersectionRatio <= 0) return;\r\n\t\t\tinitComponent(entry.target as HTMLElement);\r\n\t\t\tobserver.unobserve(entry.target);\r\n\t\t});\r\n\t}\r\n\r\n\tconst componentObserver = new IntersectionObserver(callback, observerOptions);\r\n\r\n\tconst createComponent = (componentEl: HTMLElement) => {\r\n\t\tconst name = componentEl.dataset.component || '';\r\n\t\tif (!name) return;\r\n\t\tconst callback = componentEl.dataset.componentCallback || '';\r\n\t\tconst passElInCallback = componentEl.dataset.componentPassElementInCallback === \"true\" || false;\r\n\t\tconst trackGaEvent = componentEl.dataset.componentGaEvent || '';\r\n\t\tconst trackHeight = componentEl.dataset.componentTrackHeight === \"true\" || false;\r\n\t\tconst pushDatalayerEvent = componentEl.dataset.componentPushDatalayerEvent === \"true\" || false;\r\n\t\tconst contentKey = componentEl.dataset.componentContentkey || '';\r\n\t\tconst epc = componentEl.dataset.componentEpc|| '';\r\n\t\tconst isProspect = componentEl.dataset.componentIsProspect === \"true\" || false;\r\n\t\tconst themeKey = componentEl.dataset.componentTheme || '';\r\n\t\tconst pageTemplate = componentEl.dataset.componentTemplate || '';\r\n\t\tconst replaceNode = componentEl.dataset.replaceNode || false;\r\n\t\tconst pageName = componentEl.dataset.componentPageName || '';\r\n\t\tconst hidepromotionvisualization = componentEl.dataset.hidepromotionvisualization || '';\r\n\r\n\t\t// Set an index in order for the observer to target the correct element\r\n\t\tlet index = \"0\";\r\n\t\tif (components.find(el => el.name === name)) {\r\n\t\t\tindex = components.filter(el => el.name === name).length+\"\";\r\n\t\t}\r\n\t\tcomponentEl.dataset.index = index;\r\n\r\n\t\tif (trackHeight) {\r\n\t\t\tconst height = sessionStorage.getItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\");\r\n\t\t\tif (height) {\r\n\t\t\t\tcomponentEl.style.minHeight = height + 'px';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst addComponentContent = (): Promise => {\r\n\t\t\treturn getComponentContent(name, contentKey, epc, isProspect, themeKey, pageTemplate, pageName, index, hidepromotionvisualization).then(r => {\r\n\t\t\t\tif (!r || !isValidPartialViewResponse(r)) return false;\r\n\t\t\t\tconst parent = componentEl.parentElement;\r\n\t\t\t\tif (parent && replaceNode) {\r\n\t\t\t\t\tconst elementHtml = document.createRange().createContextualFragment(r);\r\n\t\t\t\t\tparent.replaceChild(elementHtml, componentEl);\r\n\t\t\t\t\tcomponentEl = parent;\r\n\r\n\t\t\t\t\tif (trackGaEvent) trackComponentEvent(trackGaEvent);\r\n\t\t\t\t\tif (trackHeight) {\r\n\t\t\t\t\t\tconst height = componentEl.offsetHeight;\r\n\t\t\t\t\t\tsessionStorage.setItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\", height + '');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomponentEl.insertAdjacentHTML(\"afterbegin\", r);\r\n\r\n\t\t\t\t\tif (trackGaEvent) trackComponentEvent(trackGaEvent);\r\n\t\t\t\t\tif (trackHeight) {\r\n\t\t\t\t\t\tconst height = componentEl.offsetHeight;\r\n\t\t\t\t\t\tsessionStorage.setItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\", height + '');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (hasClass(componentEl, 'skeleton-loading')) {\r\n\t\t\t\t\t\texpressRemoveClass(componentEl, 'skeleton-loading');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (componentEl.getAttribute(\"style\")) {\r\n\t\t\t\t\t\tcomponentEl.removeAttribute(\"style\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (pushDatalayerEvent) {\r\n\t\t\t\t\tpushComponentEvent(name);\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst loadJavascriptAndRunMethod = () => {\r\n\t\t\tif (callback) {\r\n\t\t\t\t/* For now we disable the load of js on demand\r\n\t\t\t\tif (!loadedScripts.includes(name)) {\r\n\t\t\t\t\tconst scriptEl = document.createElement(\"script\");\r\n\t\r\n\t\t\t\t\tscriptEl.addEventListener(\"load\", () => {\r\n\t\t\t\t\t\tloadedScripts.push(name);\r\n\t\t\t\t\t\tif (passElInCallback) {\r\n\t\t\t\t\t\t\twindow[callback].call(this, componentEl);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\twindow[callback].call(this);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\r\n\t\t\t\t\tscriptEl.src = getCdnPathForJsFile(scriptBasePath + name + \".min.js\");\r\n\t\t\t\t\tdocument.body.appendChild(scriptEl);\r\n\t\t\t\t} else { */\r\n\t\t\t\t\tif (passElInCallback) {\r\n\t\t\t\t\t\twindow[callback].call(this, componentEl);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twindow[callback].call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t/*} */\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst activate = () => {\r\n\t\t\tcomponentEl.dataset.init = 'true';\r\n\t\t\taddComponentContent().then(r => {\r\n\t\t\t\tif (r) {\r\n\t\t\t\t\tif (callback) loadJavascriptAndRunMethod();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomponentEl.dataset.error = 'true';\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst component = {\r\n\t\t\tname,\r\n\t\t\tactivate,\r\n\t\t\tindex\r\n\t\t} as IComponent;\r\n\t\tcomponents.push(component);\r\n\t};\r\n\r\n\tconst init = (): Promise => {\r\n\t\tcomponentEls.forEach(el => createComponent(el));\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tinit().then(_ => {\r\n\t\tcomponentEls.forEach(el => {\r\n\t\t\tif (isElementPartiallyVisibleInViewport(el, 10)) {\r\n\t\t\t\tinitComponent(el);\r\n\t\t\t} else {\r\n\t\t\t\tcomponentObserver.observe(el);\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n","import { onlyLetters, onlyNumber } from \"./string\";\r\n\r\nexport function isValidVatNumber(input: string, countryCode: string) {\r\n\tif (vatNumberHasCorrectCountryCode(input, countryCode)) {\r\n\t\tif (countryCode.toLowerCase() !== 'bel') return true;\r\n\t\tconst vatNumber = input.match(/\\d/g);\r\n\t\tlet vatNumberString = '';\r\n\t\tif (vatNumber) vatNumberString = vatNumber.join('');\r\n\t\tconst part1 = parseInt(vatNumberString.substring(0, vatNumberString.length - 2), 10);\r\n\t\tconst part2 = parseInt(vatNumberString.substring(vatNumberString.length - 2), 10);\r\n\t\tconst temp = part1 - parseInt((part1 / 97) + \"\", 10) * 97;\r\n\t\treturn 97 - temp === part2;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nexport function vatNumberHasCorrectCountryCode(vatNumber: string, countryCode: string) {\r\n\tif (countryCode.toLowerCase() !== 'bel'\r\n\t\t&& countryCode.toLowerCase() !== 'ndl'\r\n\t\t&& countryCode.toLowerCase() !== 'che'\r\n\t\t&& countryCode.toLowerCase() !== 'swe') return true;\r\n\tlet testVal = '';\r\n\tswitch (countryCode.toLowerCase()) {\r\n\t\tcase 'bel':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'be');\r\n\t\t\tbreak;\r\n\t\tcase 'ndl':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'nl');\r\n\t\t\tbreak;\r\n\t\tcase 'che':\r\n\t\t\ttestVal = vatNumber.substring(0, 3);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'che');\r\n\t\t\tbreak;\r\n\t\tcase 'swe':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'se');\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n","// returns format YYYY-MM-DD (for html5 date input fields)\r\nexport function getFormattedDate(date: Date): string {\r\n\tlet year = date.getFullYear().toString();\r\n\tyear = year.length > 3 ? year\r\n\t\t: year.length > 2 ? '0' + year\r\n\t\t\t: year.length > 1 ? '00' + year\r\n\t\t\t\t: year.length > 0 ? '000' + year\r\n\t\t\t\t\t: '0000';\r\n\tlet month = (1 + date.getMonth()).toString();\r\n\tmonth = month.length > 1 ? month : '0' + month;\r\n\tlet day = date.getDate().toString();\r\n\tday = day.length > 1 ? day : '0' + day;\r\n\treturn year + '-' + month + '-' + day;\r\n}\r\n\r\nexport function getDate(dateString: string): Date {\r\n\tconst regex = new RegExp(/(^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4}$)|(^\\d{4}[-](0?[1-9]|1[012])[/-](0?[1-9]|[12][0-9]|3[01])$)/);\r\n\tif (!regex.test(dateString))\r\n\t\tthrow Error(\"invalid date format: \" + dateString + \". Expected either YYYY-MM-DD or DD-MM-YYYY\");\r\n\r\n\tlet date: Date;\r\n\tconst firstPart = dateString.substr(0, dateString.indexOf(\"-\"));\r\n\tif (firstPart.length === 4)\r\n\t\tdate = new Date(dateString);\r\n\telse {\r\n\t\tconst dateParts = dateString.split(\"-\").map(s => +s);\r\n\t\tdate = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]);\r\n\t}\r\n\r\n\treturn date;\r\n}\r\n\r\nexport function convertDateToUtcDate(date: Date): Date {\r\n\treturn new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));\r\n}\r\n\r\nexport function deserialiseDate(dateString: string | null): Date {\r\n\tconst MIN_DATE = new Date(\"0001-01-01\");\r\n\tif (!dateString) return MIN_DATE;\r\n\r\n\tconst timestamp = /Date\\(([^)]+)\\)/.exec(dateString)?.[1];\r\n\tif (!timestamp) return MIN_DATE;\r\n\r\n\treturn new Date(parseInt(timestamp));\r\n}\r\n","import { expressQuerySelector, pageVisibilityChange } from \"../common/html\";\r\n\r\nexport function createAbandonedVisitTitleSwapper() {\r\n\tconst origTitle = document.title;\r\n\tconst titleEl = expressQuerySelector(document, 'title', true);\r\n\tif (titleEl.dataset.abandonedvisitenabled && titleEl.dataset.abandonedvisitenabled.toLowerCase() === \"false\") return;\r\n\tlet blinkInterval: number | null;\r\n\tconst blinkTitle = () => {\r\n\t\tconst currentTitle = document.title;\r\n\t\tif (currentTitle === titleEl.dataset.abandonedvisittitle)\r\n\t\t\tdocument.title = titleEl.dataset.abandonedvisittitlealternate;\r\n\t\telse\r\n\t\t\tdocument.title = titleEl.dataset.abandonedvisittitle;\r\n\t};\r\n\r\n\tconst onVisible = () => {\r\n\t\tclearInterval(blinkInterval);\r\n\t\tblinkInterval = null;\r\n\t\tdocument.title = origTitle;\r\n\t};\r\n\tconst onHidden = () => {\r\n\t\tif (!blinkInterval) {\r\n\t\t\tconst interval = parseInt(titleEl.dataset.abandonedvisitspeed, 10) || 2000;\r\n\t\t\t// @ts-ignore\r\n\t\t\tblinkInterval = setInterval(blinkTitle, interval);\r\n\t\t}\r\n\t};\r\n\r\n\tpageVisibilityChange(onVisible, onHidden);\r\n}\r\n","// This component will be used on the pages typescript files and will execute the scripts tht should fire on every page e.g. footer, header, etc\r\nimport { logErrorEvent } from \"../services/logger-service\";\r\nimport { getCookie, writeCookie } from \"../utils/cookie\";\r\nimport {expressQuerySelector, expressQuerySelectorAll} from \"../common/html\";\r\nimport { createCollapsable } from \"./collapsable\";\r\nimport { createNewsletterSubscribeAndUnsubscribe } from \"./newsletter\";\r\nimport { createMainNavigation } from \"./main-navigation\";\r\nimport { getInlineSvgsAsync } from \"../utils/icons\";\r\nimport { createCountrySelection } from \"./country-selection\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport {\r\n\tcanNotContainOnlyNumerics,\r\n\tisValidEmailAddress,\r\n\tisValidOrderNumber,\r\n\tisValidTextWithoutAngleBrackets,\r\n\tisValidWithoutNonAlphaNumericCharsAtEnd\r\n} from \"../utils/validation\";\r\nimport { checkPersonalNumber } from \"../utils/personalNumbers\";\r\nimport { createScrollToTop } from \"./scroll-to-top\";\r\nimport { initLeaveIntent } from \"./leave-intent\";\r\nimport { createPopupLauncher } from \"./popup-launcher\";\r\nimport { createComponentLoader } from \"./component-loader\";\r\nimport { isValidVatNumber } from \"../utils/vat\";\r\nimport { getDate } from \"../utils/date\";\r\nimport {createAbandonedVisitTitleSwapper} from \"./abandoned-visit-title-swapper\";\r\nimport {isMobileDevice, isTouchDevice} from \"../common/device\";\r\n\r\nexport interface IGeneralPageComponents {\r\n\treadonly disableLeaveIntent: () => void;\r\n\treadonly enableLeaveIntent: () => void;\r\n}\r\n\r\nexport function createGeneralPageEventsAndComponents() {\r\n\t// Load GTMIframe\r\n\tconst gtmIFrame = expressQuerySelector(document, '.technical-loadGTMiframe', false);\r\n\tif (gtmIFrame)\r\n\t\tgtmIFrame.src = gtmIFrame.dataset.src;\r\n\r\n\tconst leaveIntent = initLeaveIntent();\r\n\r\n\t// Load dataLayerIframe\r\n\tconst dataLayerIframe = document.querySelector('#dataLayerIframe');\r\n\tif (!dataLayerIframe.getAttribute('data-cookieconsent')) {\r\n\t\tdataLayerIframe.setAttribute('data', dataLayerIframe.getAttribute('data-src'));\r\n\t}\r\n\twindow.addEventListener(\"CookiebotOnAccept\", function () {\r\n\t\tif (window.Cookiebot.consent.marketing) {\r\n\t\t\tconst dataLayerIframe = document.querySelector('#dataLayerIframe');\r\n\t\t\tdataLayerIframe.setAttribute('data', dataLayerIframe.getAttribute('data-src'));\r\n\r\n\t\t\tif ((typeof window.enableLeaveIntentConfigValue === \"undefined\" || window.enableLeaveIntentConfigValue)) {\r\n\t\t\t\tleaveIntent.EnableLeaveIntent();\r\n\t\t\t\tleaveIntent.EnableLeaveIntentPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t// Set global props for the form validation (if we have forms)\r\n\tconst forms = expressQuerySelectorAll(document, 'form');\r\n\tif (Pristine && forms && forms.length > 0) {\r\n\t\tconst isOptional = (el: HTMLInputElement) => {\r\n\t\t\treturn !el.hasAttribute('required') && !el.value;\r\n\t\t};\r\n\r\n\t\tPristine.addMessages((window as any).context.language, (window as any).validationMessages);\r\n\t\tPristine.setLocale((window as any).context.language);\r\n\t\tPristine.addValidator(\"min\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (this as HTMLInputElement).type === \"date\" || parseFloat(val) >= parseFloat(limit);\r\n\t\t}, window.validationMessages['min'], 1, true);\r\n\t\tPristine.addValidator(\"ordernumber\", function (val) {\r\n\t\t\treturn isValidOrderNumber(val);\r\n\t\t}, window.validationMessages['ordernumber'], 1, true);\r\n\t\tPristine.addValidator(\"max\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (this as HTMLInputElement).type === \"date\" || parseFloat(val) <= parseFloat(limit);\r\n\t\t}, window.validationMessages['max'], 1, true);\r\n\t\tPristine.addValidator(\"mindate\", function (val, limitValue) {\r\n\t\t\tconst date = new Date(val);\r\n\t\t\tconst limit = getDate(limitValue.replaceAll('/', '-').replaceAll('.', '-'));\r\n\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (date && limit && date >= limit);\r\n\t\t}, window.validationMessages['min'], 1, true);\r\n\t\tPristine.addValidator(\"maxdate\", function (val, limitValue) {\r\n\t\t\tconst date = new Date(val);\r\n\t\t\tconst limit = getDate(limitValue.replaceAll('/', '-').replaceAll('.', '-'));\r\n\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (date && limit && date <= limit);\r\n\t\t}, window.validationMessages['max'], 1, true);\r\n\t\tPristine.addValidator(\"maxlength\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || val && val.length <= limit;\r\n\t\t}, window.validationMessages['maxlength'], 1, true);\r\n\t\tPristine.addValidator(\"minlength\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || val && val.length >= limit;\r\n\t\t}, window.validationMessages['minlength'], 1, true);\r\n\t\tPristine.addValidator(\"vat\", function (value, vat) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidVatNumber(value, vat);\r\n\t\t}, window.validationMessages['vat'], 1, true);\r\n\t\tPristine.addValidator(\"regex\", function (value, regexp) {\r\n\t\t\t// get the regex yourself form the form input => the regexp of pristine is limited to 1119 chars\r\n\t\t\tconst regex = (this as HTMLElement).getAttribute('regex') || (this as HTMLElement).getAttribute('data-pristine-regex');\r\n\t\t\treturn isOptional(this as HTMLInputElement) || new RegExp(regex).test(value);\r\n\t\t}, window.validationMessages['regex'], 1, true);\r\n\t\tPristine.addValidator(\"phonenumber\", function (value, regexp) {\r\n\t\t\t// get the regex yourself form the form input => the regexp of pristine is limited to 1119 chars\r\n\t\t\tconst regex = (this as HTMLElement).getAttribute('phonenumber') || (this as HTMLElement).getAttribute('data-pristine-phonenumber');\r\n\t\t\treturn isOptional(this as HTMLInputElement) || new RegExp(regex).test(value);\r\n\t\t}, window.validationMessages['phonenumber'], 1, true);\r\n\t\tPristine.addValidator(\"urlsafe\", function (value) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidTextWithoutAngleBrackets(value);\r\n\t\t}, window.validationMessages['urlsafe'], 1, true);\r\n\t\tPristine.addValidator(\"blacklist\", function (value, blacklist) {\r\n\t\t\tif (!blacklist)\r\n\t\t\t\treturn true;\r\n\t\t\tconst list = blacklist.split(',');\r\n\t\t\tfor (let i = 0; i < list.length; i++)\r\n\t\t\t\tif (value.toLowerCase() === list[i])\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\treturn true;\r\n\t\t}, window.validationMessages['blacklist'], 1, true);\r\n\t\tPristine.addValidator(\"emailrfc822\", function (value) {\r\n\t\t\treturn isValidEmailAddress(value);\r\n\t\t}, null, 98, true); // validation will be fired after required validation a stop if it fails. If we don't do this the normal email validation is also fired and we get two equal error messages\r\n\t\tPristine.addValidator(\"personalnumber\", function (value) {\r\n\t\t\treturn checkPersonalNumber(value, this.dataset.regioncode || \"\");\r\n\t\t}, window.validationMessages['personalnumber'], 1, true);\r\n\t\tPristine.addValidator(\"usehousenumber\", function (value, useHouseNumber) {\r\n\t\t\tif (!useHouseNumber) return true;\r\n\t\t\tconst prefix = this.dataset.prefix || \"\";\r\n\t\t\tconst houseNumberEl = expressQuerySelector(this.form, \"input[name='\" + prefix + \"HouseNumber']\", false);\r\n\t\t\tif (!houseNumberEl || !houseNumberEl.value) return true;\r\n\t\t\tconst atStart = value.trim().substring(0, houseNumberEl.value.trim().length + 1) === houseNumberEl.value.trim() + ' ';\r\n\t\t\tconst atEnd = value.trim().substring(value.trim().length - (houseNumberEl.value.trim().length + 1), value.trim().length) === ' ' + houseNumberEl.value.trim();\r\n\t\t\treturn !atStart && !atEnd;\r\n\t\t}, window.validationMessages['usehousenumber'], 1, true);\r\n\t\tPristine.addValidator(\"passwordcheck\", function (value) {\r\n\t\t\tconst passwordEl = expressQuerySelector(this.form, \"input[name='password']\", false);\r\n\t\t\tif (!passwordEl) return true;\r\n\t\t\treturn value === passwordEl.value;\r\n\t\t}, window.validationMessages['passwordcheck'], 1, true);\r\n\t\tPristine.addValidator(\"strongpassword\",\r\n\t\t\t(value) => {\r\n\t\t\t\tconst passwordEl = expressQuerySelector(document, \"input[data-pristine-strongpassword='true']\", false);\r\n\t\t\t\tif (passwordEl.dataset['lastvalidatedpassword'] == value)\r\n\t\t\t\t\treturn passwordEl.dataset['lastvalidatedresult'] === \"true\";\r\n\t\t\t\telse\r\n\t\t\t\t\treturn true;\r\n\t\t\t}, window.validationMessages['strongpassword'], 0, true),\r\n\t\tPristine.addValidator(\"termsrequired\", function (value) {\r\n\t\t\tconst element = expressQuerySelector(this.form, '[data-pristine-termsrequired]', false);\r\n\t\t\treturn (element && element instanceof HTMLInputElement && element.checked);\r\n\t\t}, window.validationMessages['termsrequired'], 1, true);\r\n\t\tPristine.addValidator(\"invalidchars\", function (value) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidWithoutNonAlphaNumericCharsAtEnd(value, this as HTMLElement);\r\n\t\t}, window.validationMessages['invalidchars'], 1, true);\r\n\t\tPristine.addValidator(\"notonlynumbers\", function (value) {\r\n\t\t\treturn canNotContainOnlyNumerics(value);\r\n\t\t}, window.validationMessages['notonlynumbers'], 1, true);\r\n\t}\r\n\r\n\t// Add click event to buttons with a data-url attribute\r\n\tconst buttons = document.querySelectorAll('button[data-url]:not(.technical-disable-dataurl-onclick)');\r\n\tbuttons.forEach(el => {\r\n\t\tel.addEventListener('click', (ev) => {\r\n\t\t\tev.preventDefault();\r\n\t\t\twindow.location.href = el.getAttribute('data-url');\r\n\t\t});\r\n\t});\r\n\r\n\t// Set the isMobileDevice Cookie\r\n\tcheckMobileAndSetCookie();\r\n\r\n\t// Initialize the header\r\n\tconst openLeadTimesPopupAsync = () => {\r\n\t\tconst initCollapsingPanels = (popup: HTMLElement) => {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(popup, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => {\r\n\t\t\t\tcreateCollapsable(el, {\r\n\t\t\t\t\tscrollIntoViewAfterOpen: false,\r\n\t\t\t\t\ttitleElSelector: '.m-collapsable__title'\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\t\treturn createPopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"LeadTimesDialog\",\r\n\t\t\t\tdialogId: \"lead-times-dialog\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tonBeforeOpen: (popup) => initCollapsingPanels(popup)\r\n\t\t\t}\r\n\t\t)\r\n\t\t\t.then(popup => {\r\n\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\treturn popup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst header = expressQuerySelector(document, \".technical-header\", false);\r\n\theader && createMainNavigation(\r\n\t\theader,\r\n\t\t{\r\n\t\t\tgetInlineSvgsAsync: getInlineSvgsAsync,\r\n\t\t\topenLeadTimesPopupAsync: openLeadTimesPopupAsync\r\n\t\t}\r\n\t);\r\n\r\n\twindow.addEventListener('error', logErrorEvent);\r\n\r\n\t// Init the country selection popup\r\n\tconst bodyEl = expressQuerySelector(document, \"body\", true);\r\n\tconst showCountrySelectionPopup = bodyEl.dataset.showcountryselection === \"true\" || false;\r\n\tconst closeCountrySelectionPopup = () => {\r\n\t\twriteCookie(\"ShowCountrySelectionPopupAgainFrom\", new Date().toISOString().slice(0, 10), 365);\r\n\t};\r\n\r\n\tconst openCountrySelectionPopup = () => {\r\n\t\treturn createPopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"CountrySelectionDialog\",\r\n\t\t\t\tdialogId: \"country-selection\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tfromCache: false,\r\n\t\t\t\tonClose: closeCountrySelectionPopup,\r\n\t\t\t\tdata: { path: window.location.pathname }\r\n\t\t\t}\r\n\t\t)\r\n\t\t\t.then(popup => {\r\n\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\treturn popup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\r\n\tif (showCountrySelectionPopup) {\r\n\t\tcreateCountrySelection({\r\n\t\t\tshowCountrySelectionPopup: () => openCountrySelectionPopup(),\r\n\t\t\tclose: () => closeCountrySelectionPopup(),\r\n\t\t});\r\n\t}\r\n\r\n\t// Create scroll to top\r\n\tcreateScrollToTop();\r\n\r\n\t// create popup launchers (links from cms with a content dialog parser)\r\n\tconst popupLauncherEls = expressQuerySelectorAll(document, '.technical-popup-launcher');\r\n\tpopupLauncherEls.forEach(el => createPopupLauncher(el));\r\n\r\n\t// init the component loader if needed\r\n\tconst htmlElement = expressQuerySelector(document, 'html', true);\r\n\tconst isBot = htmlElement.dataset.isbot.toLowerCase() === 'true' || false;\r\n\tif (!isBot) createComponentLoader();\r\n\r\n\tcreateNewsletterSubscribeAndUnsubscribe();\r\n\r\n\t// Create global var for methods of dynamic components\r\n\twindow['initFooterComponent'] = function initFooterComponent() {\r\n\t\tconst footerCollapsibles = expressQuerySelectorAll(document, '.technical-footer-collapsable');\r\n\t\tfooterCollapsibles.forEach(el => createCollapsable(el, {\r\n\t\t\ttitleElSelector: '.technical-footer-collapsable-title',\r\n\t\t\tscrollIntoViewAfterOpen: false\r\n\t\t}));\r\n\r\n\t\tconst footerEl = expressQuerySelector(document, '.technical-footer', false);\r\n\t\tif (footerEl) createNewsletterSubscribeAndUnsubscribe(footerEl);\r\n\t};\r\n\r\n\t!isMobileDevice() && createAbandonedVisitTitleSwapper();\r\n\r\n\treturn {\r\n\t\tdisableLeaveIntent: leaveIntent.DisableLeaveIntent,\r\n\t\tenableLeaveIntent: leaveIntent.EnableLeaveIntent,\r\n\t} as IGeneralPageComponents;\r\n}\r\n\r\nconst checkMobileAndSetCookie = () => {\r\n\tif (isTouchDevice() && (window.innerWidth < 500 || window.innerHeight < 500)) {\r\n\t\tif (getCookie(\"IsMobileDevice\") !== \"true\")\r\n\t\t\twriteCookie(\"IsMobileDevice\", \"true\", 365);\r\n\t} else {\r\n\t\tif (getCookie(\"IsMobileDevice\") !== \"false\")\r\n\t\t\twriteCookie(\"IsMobileDevice\", \"false\", 365);\r\n\t}\r\n};\r\n","import {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 { expressQuerySelector, hasClass, expressRemoveClass } from \"../common/html\";\r\nexport declare class Truncate {\r\n\tconstructor(element: HTMLElement, options: ITruncateOptions)\r\n\tcollapse(): void;\r\n\texpand(): void;\r\n\tupdate(html: string): void;\r\n\tconfig(config: any): void;\r\n}\r\n\r\nexport interface ITruncate {\r\n\tdispose: () => void;\r\n\tupdateConfig: (opts: ITruncateOptions, overrideDefault?: boolean) => void;\r\n\tupdateContent: (html: string) => void;\r\n\tcollapse: () => void;\r\n}\r\n\r\nexport interface ITruncateOptions {\r\n\tlineHeight?: number;\r\n\tlines?: number;\r\n\tellipsis?: string;\r\n\tshowMore?: string;\r\n\tshowLess?: string;\r\n\tposition?: string;\r\n\tmaxHeight?: number;\r\n\teventTrackingMethod?: (action: string) => void;\r\n\tcloseEventAction?: string;\r\n\topenEventAction?: string;\r\n\tonInitEvent?: () => void;\r\n}\r\n\r\nexport function createTruncate(containerEl: HTMLElement, opts: ITruncateOptions) {\r\n\t// calculate the height yourself\r\n\t// => package does same calculations but with parseInt() so there is no support for float lineheights then visable lines -= 1\r\n\t// height of a element auto rounds to a round number do the same here\r\n\tconst lineHeight = Math.ceil(opts.lineHeight ? opts.lineHeight : parseFloat(window.getComputedStyle(containerEl).lineHeight || \"0\"));\r\n\tconst lines = Math.ceil(opts.lines ? opts.lines : 1);\r\n\tconst maxHeight = Math.ceil(opts.maxHeight ? opts.maxHeight : lineHeight * lines);\r\n\tconst shaveMoreOnContainer = expressQuerySelector(containerEl, '.technical-shave-more');\r\n\tconst shaveLessOnContainer = expressQuerySelector(containerEl, '.technical-shave-less');\r\n\r\n\tconst defaults: ITruncateOptions = {\r\n\t\tellipsis: '\\u2026 ',\r\n\t\tshowMore: opts.showMore || (shaveMoreOnContainer ? shaveMoreOnContainer.outerHTML : expressQuerySelector(document, '.technical-shave-more').outerHTML),\r\n\t\tshowLess: opts.showLess || (shaveLessOnContainer? shaveLessOnContainer.outerHTML : expressQuerySelector(document, '.technical-shave-less').outerHTML),\r\n\t\tlineHeight: lineHeight,\r\n\t\tlines: lines,\r\n\t\tmaxHeight: maxHeight < lineHeight ? lineHeight : maxHeight // a minimum of 1 line is visible (if max height > line height => no content is shown on the page)\r\n\t};\r\n\r\n\tif (hasClass(containerEl, \"truncate-loading-1-line\")) expressRemoveClass(containerEl, \"truncate-loading-1-line\");\r\n\tif (hasClass(containerEl, \"truncate-loading-2-lines\")) expressRemoveClass(containerEl, \"truncate-loading-2-lines\");\r\n\tif (hasClass(containerEl, \"truncate-loading-5-lines--pcp\")) expressRemoveClass(containerEl, \"truncate-loading-5-lines--pcp\");\r\n\r\n\tconst onClick = (ev: MouseEvent) => {\r\n\t\tconst currentEl = ev.target as HTMLElement;\r\n\t\tif (currentEl.classList.contains(\"technical-shave-more\")) {\r\n\t\t\tif (opts.eventTrackingMethod && opts.openEventAction) opts.eventTrackingMethod(opts.openEventAction);\r\n\t\t\ttruncate.expand();\r\n\t\t}\r\n\t\telse if (currentEl.classList.contains(\"technical-shave-less\")) {\r\n\t\t\tif (opts.eventTrackingMethod && opts.closeEventAction) opts.eventTrackingMethod(opts.closeEventAction);\r\n\t\t\ttruncate.collapse();\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateConfig = (newOpts: ITruncateOptions, overrideDefault?: boolean) => {\r\n\t\ttruncate.config(overrideDefault\r\n\t\t\t? {\r\n\t\t\t\tellipsis: defaults.ellipsis,\r\n\t\t\t\tshowMore: defaults.showMore,\r\n\t\t\t\tshowLess: defaults.showLess,\r\n\t\t\t\tlineHeight: defaults.lineHeight,\r\n\t\t\t\tlines: newOpts.lines,\r\n\t\t\t\tmaxHeight: newOpts.maxHeight\r\n\t\t\t}\r\n\t\t\t: { ...newOpts, ...defaults });\r\n\t\ttruncate.collapse();\r\n\t};\r\n\r\n\tconst updateContent = (html: string) => {\r\n\t\ttruncate.update(html);\r\n\t\ttruncate.collapse();\r\n\t};\r\n\r\n\tconst collapse = () => {\r\n\t\ttruncate.collapse();\r\n\t};\r\n\r\n\t// We need to find a nog jquery alternative to our truncate.js\r\n\tconst truncate = new Truncate(containerEl, { ...opts, ...defaults });\r\n\tif (opts.onInitEvent) opts.onInitEvent();\r\n\tcontainerEl.addEventListener('click', onClick);\r\n\r\n\treturn {\r\n\t\tdispose: () => containerEl.removeEventListener('click', onClick),\r\n\t\tupdateConfig,\r\n\t\tupdateContent,\r\n\t\tcollapse\r\n\t} as ITruncate;\r\n}\r\n","import {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","export class Guid {\r\n\t// normal guid cannot be used in query selector => prefix with s\r\n\tstatic newSliderGuid() {\r\n\t\treturn 'sxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\t\tconst r = Math.random() * 16 | 0,\r\n\t\t\t\tv = c === 'x' ? r : (r & 0x3 | 0x8);\r\n\t\t\treturn v.toString(16);\r\n\t\t});\r\n\t}\r\n\r\n\tstatic newGuid() {\r\n\t\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\t\tconst r = Math.random() * 16 | 0,\r\n\t\t\t\tv = c === 'x' ? r : (r & 0x3 | 0x8);\r\n\t\t\treturn v.toString(16);\r\n\t\t});\r\n\t}\r\n}\r\n","import { debounce, throttle } from \"../utils/debounce\";\r\nimport {\r\n\texpressAddClass,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\tgetHeightWithMargins,\r\n} from \"../common/html\";\r\nimport { Guid } from \"../utils/guid\";\r\nimport { trackSliderEvent } from \"../common/events\";\r\n\r\n\r\nexport interface ICustomPhotoSliderItem {\r\n\tid?: string;\r\n\ttemplate?: HTMLElement;\r\n}\r\n\r\nexport interface IButtonElement {\r\n\ttext?: string;\r\n\tcss?: string;\r\n\tcssWhenOnMax?: string;\r\n\tonClick(e: Event, draggedSliderEventTracking: boolean): void;\r\n}\r\n\r\nexport interface ISliderElementSettings {\r\n\textraSliderClass?: string;\r\n\tslideClicked?(e: Event, settings: ICustomPhotoSliderWithDivSettings): void;\r\n}\r\n\r\nexport interface ISliderElementContainerSettings {\r\n\textraSliderClass?: string;\r\n\telementsContainerSettings: ISliderElementSettings;\r\n\tcssWhenButtonsBothOnMax?: string;\r\n\tnextButton?: IButtonElement;\r\n\tpreviousButton?: IButtonElement;\r\n}\r\nexport enum EternalSlidingMode {\r\n\tInfinite,\r\n\tScrollToBegin\r\n}\r\n\r\nexport interface ICustomPhotoSliderWithDivSettings {\r\n\tenableKeyboardNavigation?: boolean;\r\n\tsliderElements: ICustomPhotoSliderItem[];\r\n\tsliderContainerSettings: ISliderElementContainerSettings;\r\n\tshowHalfSlides?: boolean;\r\n\treplaceWithElement?: boolean;\r\n\t// false if the slider should not continue when at end\r\n\tenableEternalSliding?: boolean;\r\n\t// Mode that is used once the enableEternalSliding param is enabled => by default Infinite if nothing is passed\r\n\teternalSlidingMode?: EternalSlidingMode;\r\n\ttranslateForMovement?: boolean;\r\n\tresize1SlideToFullWidth?: boolean;\r\n\t// don't wait on IntersectionObserver to render the slider\r\n\tforceRenderSlider?: boolean;\r\n\r\n\t// custom events\r\n\tSliderCreated?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider: HTMLElement | undefined) => void;\r\n\tInitializedEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tResizeEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tBeforeResizeEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tHeightScriptButtons?: (slider: HTMLElement, bottomTitleHeight: number, highestSlideEl: HTMLElement) => void;\r\n}\r\n\r\nexport interface ICustomSlider {\r\n\tRemoveSliderElement(sliderElement: ICustomPhotoSliderItem, indexToRemove?: number): void;\r\n\tRemoveSliderElementOnIndex(indexToRemove: number): void;\r\n\tAddSliderElement(sliderElement: ICustomPhotoSliderItem, indexToInsert: number): void;\r\n\tPrevious(): void;\r\n\tNext(): void;\r\n\tJumpIntoView(sliderElement: ICustomPhotoSliderItem, smoothSlide?: boolean, align?: string): void;\r\n\tSettings: ICustomPhotoSliderWithDivSettings;\r\n\tGetCurrentSlide(): ICustomPhotoSliderItem | undefined;\r\n\tGetAllSlides(): ICustomPhotoSliderItem[];\r\n\tGetSliderElement(): HTMLElement;\r\n\tShowButtons(): void;\r\n\tHideButtons(): void;\r\n\tDispose(): void;\r\n\tAddHandlers(): void;\r\n}\r\n\r\n\r\n// Gets the highest slide element in the slider elements\r\nconst getHighestSlideOfSlider = (slidesInSlider: HTMLElement[]): HTMLElement => {\r\n\tlet highestSlideEl: HTMLElement;\r\n\tlet maxTitleHeight = 0;\r\n\r\n\tfor (let i = slidesInSlider.length - 1; i >= 0; i--) {\r\n\t\tconst slideEl = slidesInSlider[i] as HTMLElement;\r\n\t\tconst sliderTitleEl = expressQuerySelector(slideEl, '.technical-slide-title', false);\r\n\t\tconst tileTitle = expressQuerySelector(slideEl, '.technical-tile-title', false);\r\n\t\tconst tileSubTitle = expressQuerySelector(slideEl, '.technical-tile-subtitle', false);\r\n\r\n\t\tconst titleHeight = tileTitle ? getHeightWithMargins(tileTitle) : 0;\r\n\t\tconst subTitleHeight = tileSubTitle ? getHeightWithMargins(tileSubTitle) : 0;\r\n\t\tconst titleheight = titleHeight + subTitleHeight;\r\n\r\n\t\t// reset height\r\n\t\tif (sliderTitleEl)\r\n\t\t\tsliderTitleEl.style.height = '';\r\n\r\n\t\tif (maxTitleHeight <= titleheight) {\r\n\t\t\tmaxTitleHeight = titleheight;\r\n\t\t\thighestSlideEl = slideEl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn highestSlideEl!;\r\n};\r\n\r\n// Gets the slide element with the highest link in the slider elements\r\nconst getHighestSlideLinkElOfSlider = (slidesInSlider: HTMLElement[]): HTMLElement => {\r\n\tlet highestSlideEl: HTMLElement;\r\n\tlet maxLinkHeight = 0;\r\n\r\n\tfor (let i = slidesInSlider.length - 1; i >= 0; i--) {\r\n\t\tconst slideEl = slidesInSlider[i] as HTMLElement;\r\n\t\tconst sliderLinkEl = expressQuerySelector(slideEl, '.technical-tile-link-text', false) || expressQuerySelector(slideEl, '.technical-info-content-items', false);\r\n\r\n\t\tconst linkHeight = sliderLinkEl ? getHeightWithMargins(sliderLinkEl) : 0;\r\n\r\n\t\tif (maxLinkHeight <= linkHeight) {\r\n\t\t\tmaxLinkHeight = linkHeight;\r\n\t\t\thighestSlideEl = slideEl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn highestSlideEl!;\r\n};\r\n\r\nexport const SetHeight = (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider?: HTMLElement) => {\r\n\tconst visibleSlides = expressQuerySelectorAll(slider, '.technical-slide') as HTMLElement[];\r\n\tconst highestSlideEl = getHighestSlideOfSlider(visibleSlides);\r\n\tconst highestSlideTitle = expressQuerySelector(highestSlideEl, '.technical-tile-title', false);\r\n\tconst highestSlideSubTitle = expressQuerySelector(highestSlideEl, '.technical-tile-subtitle', false);\r\n\r\n\tconst highestSlideLinkEl = getHighestSlideLinkElOfSlider(visibleSlides);\r\n\tconst highestSlideLinkText = expressQuerySelector(highestSlideLinkEl, '.technical-tile-link-text', false) || expressQuerySelector(highestSlideLinkEl, '.technical-info-content-items', false);\r\n\r\n\tconst highestSlideTitlepx = highestSlideTitle ? getHeightWithMargins(highestSlideTitle) : 0;\r\n\tconst highestSlideSubTitlepx = highestSlideSubTitle ? getHeightWithMargins(highestSlideSubTitle) : 0;\r\n\tconst highestSlideLinkTextpx = highestSlideLinkText ? getHeightWithMargins(highestSlideLinkText) : 0;\r\n\tconst highestSlideFullTitlepx = highestSlideTitlepx + highestSlideSubTitlepx;\r\n\r\n\tif (highestSlideFullTitlepx > 0) {\r\n\t\tfor (let i = 0, l = visibleSlides.length; i < l; i++) {\r\n\t\t\tconst slideFullTitleEl = expressQuerySelector(visibleSlides[i] as HTMLElement, '.technical-slide-title', false);\r\n\r\n\t\t\tif (slideFullTitleEl && highestSlideFullTitlepx > 0)\r\n\t\t\t\tslideFullTitleEl.style.height = `${highestSlideFullTitlepx}px`;\r\n\t\t}\r\n\t}\r\n\r\n\tsettings.HeightScriptButtons(slider, highestSlideLinkTextpx, highestSlideEl);\r\n};\r\n\r\nconst CustomPhotoSliderWithDivSettingsDefaults: ICustomPhotoSliderWithDivSettings = {\r\n\tsliderElements: [],\r\n\tsliderContainerSettings: {\r\n\t\telementsContainerSettings: {\r\n\t\t\textraSliderClass: '',\r\n\t\t\tslideClicked: () => { return; }\r\n\t\t},\r\n\t\tcssWhenButtonsBothOnMax: 'u-hide',\r\n\t\tnextButton: {\r\n\t\t\tcss: 'a-button a-button--slider-button m-product-slider__button--next icon-arrow-right technical-slider-button',\r\n\t\t\tcssWhenOnMax: 'a-button--disabled',\r\n\t\t\tonClick: (_: Event, draggedSlider: boolean) => {\r\n\t\t\t\ttrackSliderEvent(`nextbutton_${draggedSlider ? 'dragged' : 'clicked'}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t\tpreviousButton: {\r\n\t\t\tcss: 'a-button a-button--slider-button m-product-slider__button--prev icon-arrow-left technical-slider-button',\r\n\t\t\tcssWhenOnMax: 'a-button--disabled',\r\n\t\t\tonClick: (_: Event, draggedSlider: boolean) => {\r\n\t\t\t\ttrackSliderEvent(`prevbutton_${draggedSlider ? 'dragged' : 'clicked'}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tshowHalfSlides: false,\r\n\treplaceWithElement: true,\r\n\tenableEternalSliding: true,\r\n\teternalSlidingMode: EternalSlidingMode.Infinite,\r\n\ttranslateForMovement: true,\r\n\tforceRenderSlider: true, // selecting a format image on mobile then go to desktop => format image not there when false\r\n\r\n\r\n\t// height script buttons\r\n\tSliderCreated: (settings, slider, oldSlider) => {\r\n\t\tsetTimeout(() => {\r\n\t\t\tSetHeight(settings, slider, oldSlider);\r\n\t\t}, 0);\r\n\t},\r\n\tResizeEvent: (settings, slider) => {\r\n\t\tSetHeight(settings, slider);\r\n\t},\r\n\r\n\tHeightScriptButtons: (slider: HTMLElement, bottomTitleHeight: number, highestSlideEl: HTMLElement) => {\r\n\t\tconst sliderButtons = expressQuerySelectorAll(slider, '.technical-slider-button');\r\n\t\tconst hightestImage = expressQuerySelector(highestSlideEl, '.technical-slide-imageContainer', false);\r\n\t\tlet buttonCenterImage = 0;\r\n\t\tif (hightestImage) {\r\n\t\t\tconst btnHeight = sliderButtons[0].offsetHeight;\r\n\t\t\tbuttonCenterImage = (hightestImage.offsetHeight / 2) + bottomTitleHeight - (btnHeight / 2);\r\n\t\t}\r\n\r\n\t\tfor (let i = 0, l = sliderButtons.length; i < l; i++) {\r\n\t\t\t(sliderButtons[i] as HTMLElement).style.bottom = `${buttonCenterImage > 0 ? buttonCenterImage : (highestSlideEl.offsetHeight / 2)}px`;\r\n\t\t}\r\n\t},\r\n};\r\n\r\n\r\n\r\nexport function createCustomSlider(element: HTMLElement, settings: ICustomPhotoSliderWithDivSettings): ICustomSlider {\r\n\r\n\tsettings = {\r\n\t\t...CustomPhotoSliderWithDivSettingsDefaults, ...settings,\r\n\t\tsliderContainerSettings: {\r\n\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings, ...settings.sliderContainerSettings,\r\n\t\t\telementsContainerSettings: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.elementsContainerSettings, ...settings.sliderContainerSettings.elementsContainerSettings,\r\n\t\t\t},\r\n\t\t\tnextButton: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.nextButton, ...settings.sliderContainerSettings.nextButton,\r\n\t\t\t},\r\n\t\t\tpreviousButton: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.previousButton, ...settings.sliderContainerSettings.previousButton,\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n\r\n\t// prop to move div from left to right\r\n\tlet sliderPxX = 0;\r\n\tlet widthBeforeResize = 0;\r\n\t// slider elements\r\n\tlet sliderEl: HTMLElement;\r\n\tlet elementsEl: HTMLElement;\r\n\tlet firstVisibleElement: HTMLElement | undefined;\r\n\tlet prevButton: HTMLElement;\r\n\tlet nextButton: HTMLElement;\r\n\t// properties for sliding\r\n\tlet mouseDownOnSlider = false;\r\n\tlet startSliderDragX = 0;\r\n\tlet currentSliderDragX = 0;\r\n\tlet isDragged = false;\r\n\tlet disableSliderDragging = false;\r\n\tlet preventPageScrolling = false;\r\n\tlet preventSliderDragging = false;\r\n\tlet prevSliderWidth = 0;\r\n\r\n\t// private methods\r\n\tconst init = function (element: HTMLElement, replaceWithElement: boolean) {\r\n\t\tif (ioSlider && !settings.forceRenderSlider) {\r\n\t\t\tioSlider.observe(element);\r\n\t\t} else {\r\n\t\t\t// create slider template\r\n\t\t\tsliderEl = getSliderTemplate();\r\n\r\n\t\t\t// append slider to HTML\r\n\t\t\tif (replaceWithElement && element.parentElement)\r\n\t\t\t\telement.parentElement.replaceChild(sliderEl, element);\r\n\t\t\telse\r\n\t\t\t\telement.appendChild(sliderEl);\r\n\r\n\t\t\t// trigger initialized event\r\n\t\t\tif (settings.InitializedEvent) settings.InitializedEvent(settings, sliderEl);\r\n\r\n\t\t\t// to check if the buttons should be disabled or not\r\n\t\t\tcheckEdgesAndMove(0);\r\n\t\t\taddHandlers();\r\n\t\t\tresizeObserver.observe(elementsEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tprevButton && prevButton.removeEventListener('click', previousEvent);\r\n\t\tnextButton && nextButton.removeEventListener('click', nextEvent);\r\n\t\tif (sliderEl) {\r\n\t\t\tsliderEl.removeEventListener('mousedown', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tdragStart(e);\r\n\t\t\t});\r\n\t\t\tsliderEl.removeEventListener('touchstart', dragStart);\r\n\r\n\t\t\tif (isTouchDevice()) {\r\n\t\t\t\tsliderEl.removeEventListener('touchend', dragStop);\r\n\t\t\t\tsliderEl.removeEventListener('touchmove', dragging);\r\n\t\t\t\tsliderEl.removeEventListener('touchcancel', dragLeave);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tdocument.removeEventListener('keydown', onKeyDown);\r\n\t\t\tsliderEl.removeEventListener('mousemove', dragging);\r\n\t\t\tsliderEl.removeEventListener('mouseleave', dragLeave);\r\n\t\t\tsliderEl.removeEventListener('mouseup', dragStop);\r\n\r\n\t\t}\r\n\t\tif (window) {\r\n\t\t\twindow.removeEventListener('scroll', scrollStart);\r\n\t\t\t// window.removeEventListener('resize', resize);\r\n\t\t}\r\n\t};\r\n\r\n\tconst addHandlers = () => {\r\n\t\tprevButton && prevButton.addEventListener('mouseup', (e) => { disableSliderDragging = false; previousEvent(e); });\r\n\t\tprevButton && prevButton.addEventListener('mousedown', _ => disableSliderDragging = true);\r\n\t\tnextButton && nextButton.addEventListener('mouseup', (e) => { disableSliderDragging = false; nextEvent(e); });\r\n\t\tnextButton && nextButton.addEventListener('mousedown', _ => disableSliderDragging = true);\r\n\r\n\t\t// add event listeners of slider\r\n\t\taddSliderEventListeners();\r\n\r\n\t\t// add external events\r\n\t\t// externalEventListeners();\r\n\t};\r\n\r\n\tconst resizeObserver = new ResizeObserver((entries) => {\r\n\t\tfor (const entry of entries)\r\n\t\t\tif (entry.contentRect && entry.target)\r\n\t\t\t\tresize();\r\n\t});\r\n\r\n\t// #region SliderEvents\r\n\tconst isTouchDevice = () => ('ontouchstart' in window) || (navigator.maxTouchPoints > 0);\r\n\r\n\tconst addSliderEventListeners = () => {\r\n\t\t// add touch listeners when touch\r\n\t\tif (isTouchDevice())\r\n\t\t\tsliderTouchEventListeners();\r\n\t\telse if (settings.enableKeyboardNavigation)\r\n\t\t\taddSliderKeyboardEventListeners();\r\n\t\tsliderMouseEventListeners();\r\n\t};\r\n\tconst sliderMouseEventListeners = () => {\r\n\t\t// mouse events\r\n\t\tsliderEl.addEventListener('mousedown', (e) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tdragStart(e);\r\n\t\t});\r\n\t};\r\n\r\n\tconst onKeyDown = (ev: KeyboardEvent) => {\r\n\t\tswitch (ev.code)\r\n\t\t{\r\n\t\t\tcase \"ArrowLeft\":\r\n\t\t\t\tpreviousEvent(ev);\r\n\t\t\t\treturn;\r\n\t\t\tcase \"ArrowRight\":\r\n\t\t\t\tnextEvent(ev);\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t};\r\n\r\n\tconst addSliderKeyboardEventListeners = () => {\r\n\t\tdocument.addEventListener('keydown', onKeyDown);\r\n\t};\r\n\r\n\tconst sliderTouchEventListeners = () => {\r\n\t\t// touch events\r\n\t\t// passive => opt-in to better scroll performance by eliminating the need for scrolling to block on touch and wheel event listeners\r\n\t\tsliderEl.addEventListener('touchstart', dragStart, { passive: true });\r\n\t\twindow.addEventListener('scroll', scrollStart);\r\n\t};\r\n\tconst resize = () => {\r\n\t\t// Android/IOS triggers resize caused by scrolling (navigation bar goes away) => don't change anything when slider width is the same\r\n\t\tconst sliderWidth = getFullWidthElement(sliderEl);\r\n\t\tif (prevSliderWidth === sliderWidth) return;\r\n\r\n\t\tprevSliderWidth = sliderWidth;\r\n\r\n\t\tdebounce(reset, 250)();\r\n\t};\r\n\t/*const externalEventListeners = () => {\r\n\t\twindow && window.addEventListener('resize', resize);\r\n\t\tdocument && document.addEventListener('mouseup', _ => disableSliderDragging = false);\r\n\t};*/\r\n\tconst preventClick = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopImmediatePropagation();\r\n\t};\r\n\tconst scrollStart = () => {\r\n\t\tpreventSliderDragging = true;\r\n\t};\r\n\t// drag methods\r\n\tconst dragStart = (e: Event) => {\r\n\t\tisDragged = false;\r\n\t\tmouseDownOnSlider = true;\r\n\t\tstartSliderDragX = getPositionX(e);\r\n\t\tcurrentSliderDragX = startSliderDragX;\r\n\t\tpreventPageScrolling = false;\r\n\t\tpreventSliderDragging = disableSliderDragging || nextButton.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax) && prevButton.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\r\n\t\tif (isTouchDevice()) {\r\n\t\t\tsliderEl.addEventListener('touchend', dragStop, { passive: true });\r\n\t\t\tsliderEl.addEventListener('touchmove', throttle(dragging, 100), { passive: false });\r\n\t\t\tsliderEl.addEventListener('touchcancel', dragLeave, { passive: true });\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// mouse events\r\n\t\tsliderEl.addEventListener('mousemove', (e) => {\r\n\t\t\tif (!mouseDownOnSlider) return;\r\n\t\t\te.preventDefault();\r\n\t\t\tdragging(e);\r\n\t\t});\r\n\t\tsliderEl.addEventListener('mouseleave', dragLeave, { passive: true });\r\n\t\tsliderEl.addEventListener('mouseup', dragStop, { passive: true });\r\n\t};\r\n\tconst dragLeave = (e: Event) => {\r\n\t\tif (!mouseDownOnSlider) return;\r\n\t\tmouseDownOnSlider = false;\r\n\t\telementsEl.parentElement.style.scrollBehavior = \"smooth\";\r\n\r\n\t\t// Move the next/previous slider fully into view\r\n\t\tif (startSliderDragX < currentSliderDragX)\r\n\t\t\tpreviousEvent(e, false, true);\r\n\t\telse if (startSliderDragX > currentSliderDragX)\r\n\t\t\tnextEvent(e, false, true);\r\n\t};\r\n\tconst dragging = (e: Event) => {\r\n\t\tif (!mouseDownOnSlider || preventSliderDragging) return;\r\n\r\n\t\telementsEl.parentElement.style.scrollBehavior = 'auto';\r\n\r\n\t\tconst posX = getPositionX(e);\r\n\t\tsliderPxX += Math.round(posX - currentSliderDragX);\r\n\r\n\t\t// Stop page scrolling if your finger moves more than 10 pixels left or right\r\n\t\tconst movedSinceStart = posX - startSliderDragX;\r\n\t\tisDragged = Math.abs(movedSinceStart) > 10;\r\n\t\tif (Math.abs(movedSinceStart) > 10)\r\n\t\t\tpreventPageScrolling = true;\r\n\r\n\t\tif (preventPageScrolling)\r\n\t\t\te.preventDefault();\r\n\r\n\t\tif (settings.enableEternalSliding\r\n\t\t\t&& (settings.eternalSlidingMode || EternalSlidingMode.Infinite) === EternalSlidingMode.Infinite)\r\n\t\t\tdebounce(_ => {\r\n\t\t\t\tif (currentSliderDragX === posX || !mouseDownOnSlider) return; // mouseDownOnSlider == false => already moved by dragStop/dragLeave\r\n\r\n\t\t\t\tconst element = getFirstVisibleElement();\r\n\t\t\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\t\t\t\tconst visibleElements = Math.ceil(getFullWidthElement(sliderEl) / elementWidth);\r\n\t\t\t\tconst sliderxPassedTiles = -sliderPxX / elementWidth;\r\n\r\n\t\t\t\tconst direction = currentSliderDragX > posX ? 'left' : 'right';\r\n\r\n\t\t\t\tif (direction === 'right' && (sliderxPassedTiles + visibleElements >= settings.sliderElements.length)) {\r\n\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]); // add to right\r\n\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\tmoveSlider(true); // should not move slider\r\n\r\n\t\t\t\t} else if (direction === 'left' && (sliderxPassedTiles < 0.2)) {\r\n\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]); // add to left\r\n\t\t\t\t\tsliderPxX += -elementWidth;\r\n\t\t\t\t\tmoveSlider(true); // should not move slider\r\n\t\t\t\t}\r\n\t\t\t}, 250)();\r\n\r\n\t\t// set new location here\r\n\t\tcurrentSliderDragX = posX;\r\n\r\n\t\t// move without check => check when stopped\r\n\t\tmoveSlider(true);\r\n\t};\r\n\tconst dragStop = (e: Event) => {\r\n\t\tmouseDownOnSlider = false;\r\n\t\telementsEl.parentElement.style.scrollBehavior = \"smooth\";\r\n\r\n\t\t// enable/disable click event on slider-element when dragging\r\n\t\tif (!isDragged && e.target && !(e.target as HTMLElement).classList.contains('technical-slider-button'))\r\n\t\t\tsettings.sliderContainerSettings.elementsContainerSettings.slideClicked(e, settings);\r\n\r\n\t\tconst slideElements = expressQuerySelectorAll(elementsEl, '.technical-slider-element');\r\n\t\tconst elMethod = isDragged ? 'addEventListener' : 'removeEventListener';\r\n\t\tslideElements.forEach(el => el[elMethod]('click', preventClick));\r\n\r\n\t\t// Move the next/previous slider fully into view\r\n\t\tif (startSliderDragX < currentSliderDragX)\r\n\t\t\tpreviousEvent(e, false, true);\r\n\t\telse if (startSliderDragX > currentSliderDragX)\r\n\t\t\tnextEvent(e, false, true);\r\n\r\n\t\t// touch events\r\n\t\tif (isTouchDevice()) {\r\n\t\t\tsliderEl.removeEventListener('touchend', dragStop);\r\n\t\t\tsliderEl.removeEventListener('touchmove', dragging);\r\n\t\t\tsliderEl.removeEventListener('touchcancel', dragLeave);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// remove mouse events\r\n\t\tsliderEl.removeEventListener('mousemove', dragging);\r\n\t\tsliderEl.removeEventListener('mouseleave', dragLeave);\r\n\t\tsliderEl.removeEventListener('mouseup', dragStop);\r\n\r\n\t\tisDragged = false;\r\n\t};\r\n\tconst getPositionX = (e) => {\r\n\t\treturn e.type.includes('mouse') ? e.pageX : e.touches[0].pageX;\r\n\t};\r\n\t// #endregion SliderEvents\r\n\tconst getSliderTemplate = (): HTMLElement => {\r\n\t\tif (settings.sliderElements.length === 0) return document.createElement('span');\r\n\r\n\t\t// generate div to hold slider\r\n\t\tconst div = document.createElement('div');\r\n\t\tdiv.className += settings.sliderContainerSettings.extraSliderClass;\r\n\r\n\t\t// prev\r\n\t\tprevButton = document.createElement('a');\r\n\t\tprevButton.textContent = settings.sliderContainerSettings.previousButton.text ? settings.sliderContainerSettings.previousButton.text : '';\r\n\t\tprevButton.title = \"previous\";\r\n\r\n\t\t// prev.style\r\n\t\tprevButton.className += settings.sliderContainerSettings.previousButton.css;\r\n\t\tprevButton.classList.add(settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\t\tdiv.appendChild(prevButton);\r\n\r\n\t\t// images\r\n\t\telementsEl = document.createElement('div');\r\n\t\telementsEl.className += settings.sliderContainerSettings.elementsContainerSettings.extraSliderClass;\r\n\t\telementsEl.classList.add('technical-slider-elements');\r\n\r\n\t\tfor (let i = 0, l = settings.sliderElements.length; i < l; i++) {\r\n\t\t\tconst customPhotoSliderItem = settings.sliderElements[i];\r\n\t\t\tconst sliderElementDiv = createSliderElement(customPhotoSliderItem);\r\n\t\t\telementsEl.appendChild(sliderElementDiv);\r\n\t\t}\r\n\r\n\t\t// append to elementsDiv\r\n\t\tdiv.appendChild(elementsEl);\r\n\r\n\t\t// next\r\n\t\tnextButton = document.createElement('a');\r\n\t\tnextButton.textContent = settings.sliderContainerSettings.nextButton.text ? settings.sliderContainerSettings.nextButton.text : '';\r\n\t\tprevButton.title = \"next\";\r\n\r\n\t\t// next.style\r\n\t\tnextButton.className += settings.sliderContainerSettings.nextButton.css;\r\n\t\tdiv.appendChild(nextButton);\r\n\r\n\r\n\t\tsettings.SliderCreated && settings.SliderCreated(settings, div, sliderEl);\r\n\t\t// return div element\r\n\t\treturn div;\r\n\t};\r\n\tconst getCurrentElement = (): ICustomPhotoSliderItem | undefined => {\r\n\t\tconst elementEl = getFirstVisibleElement();\r\n\t\tif (!elementEl) return; // if no element visible return\r\n\t\tconst elementElWidth = getFullWidthElement(elementEl, true);\r\n\t\tconst currentElementIndex = elementElWidth <= 0 ? 0 : Math.round(Math.abs(sliderPxX) / elementElWidth);\r\n\t\tconst index = currentElementIndex % elementsEl.children.length;\r\n\t\treturn settings.sliderElements.find(x => elementsEl.children[index].id === x.id);\r\n\t};\r\n\tconst getAllElements = (): ICustomPhotoSliderItem[] => {\r\n\t\tconst slides = Array.from(elementsEl.children);\r\n\t\treturn [...settings.sliderElements].sort((a, b) => {\r\n\t\t\tconst elementA = slides.find(e => e.id === a.id);\r\n\t\t\tconst elementB = slides.find(e => e.id === b.id);\r\n\t\t\treturn slides.indexOf(elementA) - slides.indexOf(elementB);\r\n\t\t}); //sort a copy of the list\r\n\t};\r\n\tconst resizeSliderElementsToFullWidth = () => {\r\n\t\tconst element = getFirstVisibleElement();\r\n\t\tif (!element || !element.parentElement || element.clientWidth <= 0)\r\n\t\t\treturn;\r\n\r\n\t\tconst widthAfterResize = getFullWidthElement(element.parentElement!);\r\n\r\n\t\tif (widthBeforeResize === widthAfterResize)\r\n\t\t\treturn;\r\n\r\n\t\tfor (let i = 0; i < elementsEl.children.length; i++) {\r\n\t\t\tconst slide = elementsEl.children[i] as HTMLElement;\r\n\t\t\tslide.style.width = `${widthAfterResize}px`;\r\n\t\t\tslide.style.minWidth = `${widthAfterResize}px`;\r\n\t\t\tslide.style.maxWidth = `${widthAfterResize}px`;\r\n\t\t}\r\n\r\n\t\t// Realign the slider with the first visible element\r\n\t\t// sliderPxX = the amount the slider was moved to the left, usually a multiple of widthBeforeResize\r\n\t\t// We need to realign it, so we divide sliderPxX by the widthBeforeResize, so we know how many slides we need to move it\r\n\t\tif (widthBeforeResize > 0) {\r\n\t\t\tconst amountOfSlides = Math.abs(Math.ceil(sliderPxX / widthBeforeResize));\r\n\t\t\tsliderPxX = sliderPxX - ((widthAfterResize - widthBeforeResize) * amountOfSlides);\r\n\t\t}\r\n\r\n\t\twidthBeforeResize = widthAfterResize;\r\n\t};\r\n\tconst checkEdgesAndMove = (movePx: number, draggedSlider?: boolean, jumpIntoView = false) => {\r\n\t\t// if beginning or end stop\r\n\t\tsliderPxX += movePx;\r\n\t\tlet prevButtonClasslistMethod = 'add';\r\n\t\tlet nextButtonClasslistMethod = 'add';\r\n\t\tconst element = getFirstVisibleElement();\r\n\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\t\tlet moveToOtherside = false;\r\n\r\n\t\t// we calculate the total width of the elements because of the gap property on the slider\r\n\t\t// without gap => every slider the same width => is the same as elementsEl.scrollWidth\r\n\t\t// with gap => we come 1 gap to short at the end to have the same width\r\n\t\tconst endOfSlider = () => getFullWidthElement(sliderEl) - (elementWidth * settings.sliderElements.length);\r\n\t\tconst widthRightSidePx = () => (elementWidth * settings.sliderElements.length) - Math.abs(sliderPxX);\r\n\r\n\t\tif (sliderPxX >= 0) { // test negative scroll\r\n\t\t\tnextButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding) prevButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding && !jumpIntoView && sliderPxX > 0) {\r\n\t\t\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\t\t\tmoveToOtherside = true;\r\n\t\t\t\t\t\tsliderPxX = endOfSlider();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]);\r\n\t\t\t\t\t\tmoveSlider(true, false, -sliderPxX); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\tsliderPxX = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else sliderPxX = 0;\r\n\t\t} else if (widthRightSidePx() <= getFullWidthElement(sliderEl)) { // test positive scroll\r\n\t\t\tprevButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding) nextButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding && !jumpIntoView && widthRightSidePx() < getFullWidthElement(sliderEl)) {\r\n\t\t\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\t\t\tmoveToOtherside = true;\r\n\t\t\t\t\t\tsliderPxX = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif (elementWidth <= 0) break; // if you element is not visiable don't do anything\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]);\r\n\t\t\t\t\t\t\tmoveSlider(true, false, sliderPxX + Math.abs(movePx) + elementWidth); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\t\t} while (widthRightSidePx() < getFullWidthElement(sliderEl));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else sliderPxX = endOfSlider();\r\n\t\t} else { // the sroll is not over positive or over negative\r\n\t\t\tprevButtonClasslistMethod = 'remove';\r\n\t\t\tnextButtonClasslistMethod = 'remove';\r\n\t\t}\r\n\r\n\t\t// check if images div is greater then px width\r\n\t\tif (getFullWidthElementWithoutRounding(sliderEl) >= (elementsEl.scrollWidth - 20)) { // +20? The right margin of the item on the right can be invisible\r\n\t\t\tnextButtonClasslistMethod = 'add';\r\n\t\t\tprevButtonClasslistMethod = 'add';\r\n\t\t}\r\n\r\n\t\tif (settings.sliderContainerSettings.cssWhenButtonsBothOnMax) {\r\n\t\t\tif (prevButton) prevButton.classList.toggle(settings.sliderContainerSettings.cssWhenButtonsBothOnMax, nextButtonClasslistMethod === 'add' && prevButtonClasslistMethod === 'add');\r\n\t\t\tif (nextButton) nextButton.classList.toggle(settings.sliderContainerSettings.cssWhenButtonsBothOnMax, nextButtonClasslistMethod === 'add' && prevButtonClasslistMethod === 'add');\r\n\t\t}\r\n\r\n\t\t// add or remove class from classlist depending on ifs\r\n\t\tif (prevButton) prevButton.classList[prevButtonClasslistMethod](settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\t\tif (nextButton) nextButton.classList[nextButtonClasslistMethod](settings.sliderContainerSettings.nextButton.cssWhenOnMax);\r\n\r\n\t\tif (prevButton || nextButton)\r\n\t\t\tmoveSlider(draggedSlider, moveToOtherside);\r\n\t};\r\n\tconst moveSlider = (draggedSlider?: boolean, moveToOtherside = false, sliderPxXOverride?: number) => {\r\n\t\tconst ms = moveToOtherside ? elementsEl.children.length * 250 : 200;\r\n\t\telementsEl.style.transition = draggedSlider ? 'none' : `all ${ms}ms ease-in-out 0s`;\r\n\r\n\t\tconst pixelX = sliderPxXOverride || sliderPxXOverride >= 0 ? sliderPxXOverride : sliderPxX;\r\n\t\tif (settings.translateForMovement) {\r\n\t\t\telementsEl.style.transform = `translateX(${pixelX}px)`;\r\n\t\t} else {\r\n\t\t\telementsEl.parentElement && elementsEl.parentElement.scroll({\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: -pixelX,\r\n\t\t\t\t// @ts-ignore https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll => instant is a behavior that is supported\r\n\t\t\t\tbehavior: draggedSlider ? 'instant' : 'smooth'\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\tconst createSliderElement = (customPhotoSliderItem: ICustomPhotoSliderItem): HTMLElement => {\r\n\t\tif (!customPhotoSliderItem.id)\r\n\t\t\tcustomPhotoSliderItem.id = Guid.newSliderGuid();\r\n\r\n\t\t// elements\r\n\t\tconst sliderElement = customPhotoSliderItem.template ? customPhotoSliderItem.template.cloneNode(true) as HTMLElement : document.createElement('div');\r\n\t\tsliderElement.id = customPhotoSliderItem.id;\r\n\t\tsliderElement.classList.add('technical-slider-element');\r\n\r\n\t\t//return div\r\n\t\treturn sliderElement;\r\n\t};\r\n\tconst removeImageFromArray = (indexToRemove: number) => {\r\n\t\tif (!settings.sliderElements || indexToRemove > settings.sliderElements.length - 1 || indexToRemove < 0 || !settings.sliderElements[indexToRemove])\r\n\t\t\tthrow Error('Something is wrong with your current parameters');\r\n\t\telse {\r\n\t\t\tlet tempArray = settings.sliderElements.slice(0, indexToRemove);\r\n\r\n\t\t\t// if last item remove this is faster\r\n\t\t\tif (tempArray.length === settings.sliderElements.length - 1) {\r\n\t\t\t\tsettings.sliderElements = tempArray;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttempArray = tempArray.concat(settings.sliderElements.slice(indexToRemove + 1));\r\n\t\t\tsettings.sliderElements = tempArray;\r\n\t\t}\r\n\t};\r\n\tconst insertIntoSliderElements = (sliderElement: ICustomPhotoSliderItem, indexToInsert: number) => {\r\n\t\t// if images.length => just push\r\n\t\tif (indexToInsert === settings.sliderElements.length) {\r\n\t\t\tsettings.sliderElements.push(sliderElement);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// if 0 add to new array copy old array into new array => change array\r\n\t\tif (indexToInsert === 0) {\r\n\t\t\tconst tempArray: ICustomPhotoSliderItem[] = [sliderElement];\r\n\t\t\tsettings.sliderElements = tempArray.concat(settings.sliderElements);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// insert in between\r\n\t\tlet tempArray = settings.sliderElements.slice(0, indexToInsert);\r\n\t\ttempArray.push(sliderElement);\r\n\t\ttempArray = tempArray.concat(settings.sliderElements.slice(indexToInsert));\r\n\r\n\t\tsettings.sliderElements = tempArray;\r\n\t};\r\n\tconst calculateNextMove = function (positiveMove: boolean): number {\r\n\t\tconst elementEl = getFirstVisibleElement();\r\n\r\n\t\t// if no slider just skip\r\n\t\tif (settings.sliderElements.length <= 1 || !elementEl)\r\n\t\t\treturn 0;\r\n\r\n\t\t// !!! WARNING !!! solution for all same width elements !!!\r\n\t\tconst elementElWidth = getFullWidthElement(elementEl, true);\r\n\r\n\t\tif (Math.ceil(getFullWidthElement(elementsEl)) / elementElWidth < 1)\r\n\t\t\treturn elementElWidth * (positiveMove ? -0.5 : 0.5); // default 0.50 % of slide move\r\n\r\n\t\t// calculate sliderElement.width / width elements => get % of visible slide on each side\r\n\t\tconst pxRight = (elementElWidth * settings.sliderElements.length) - (Math.ceil(getFullWidthElement(sliderEl)) + Math.abs(sliderPxX));\r\n\t\tconst maxPossibleSliderItemsRightPx = pxRight / elementElWidth;\r\n\t\tconst maxPossibleSliderItemsLeftpx = Math.abs(sliderPxX) / elementElWidth;\r\n\r\n\t\tlet percentage = positiveMove\r\n\t\t\t? (settings.eternalSlidingMode || EternalSlidingMode.Infinite) == EternalSlidingMode.Infinite ? (maxPossibleSliderItemsLeftpx - Math.floor(maxPossibleSliderItemsLeftpx)) - 1 : - (maxPossibleSliderItemsRightPx - Math.floor(maxPossibleSliderItemsRightPx))\r\n\t\t\t: maxPossibleSliderItemsLeftpx - Math.floor(maxPossibleSliderItemsLeftpx);\r\n\r\n\t\t// Floating point arithmetic is not always 100% accurate\r\n\t\tconst rounding = 10000000000;\r\n\t\tpercentage = parseInt(`${percentage * rounding}`) / rounding;\r\n\r\n\t\t// for the case that the slide is exactly on the page\r\n\t\t// or slider the slide is already almost fully visitable and you want to go to the next slide\r\n\t\tif (percentage === 0 || Math.abs(percentage) <= 0.08)\r\n\t\t\tpercentage += positiveMove ? -1 : 1;\r\n\r\n\t\t// if half slides have to be shown\r\n\t\tif (settings.showHalfSlides)\r\n\t\t\tpercentage *= 1.5;\r\n\r\n\t\t// calculate how much % the slide needs to be completely shown\r\n\t\treturn elementElWidth * percentage;\r\n\t};\r\n\tconst jumpIntoView = (sliderElement: ICustomPhotoSliderItem, smoothSlideIntoView = true, align: 'start' | 'end' = 'start') => {\r\n\t\tconst elements = getAllElements();\r\n\t\tlet indexOfElement = elements.indexOf(sliderElement);\r\n\t\tif (indexOfElement < 0)\r\n\t\t\treturn;\r\n\r\n\t\tconst visibleEl = getFirstVisibleElement(); // this slide is already visible => no width of 0\r\n\t\tconst element = expressQuerySelector(elementsEl, `#${visibleEl.id}`, true);\r\n\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\r\n\t\tlet moveToLocation: number;\r\n\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\tmoveToLocation = (elementWidth * indexOfElement) - (align == 'start' ? 0 : (elementWidth * ((getFullWidthElement(sliderEl) / elementWidth) - 1))); // -1 because this is a count, not an index\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\tdefault: {\r\n\t\t\t\tconst currentSlide = getCurrentElement();\r\n\t\t\t\tconst currentSlideIndex = elements.indexOf(currentSlide);\r\n\t\t\t\tconst visibleElements = Math.ceil(getFullWidthElement(sliderEl) / elementWidth);\r\n\r\n\t\t\t\tswitch (align) {\r\n\t\t\t\t\tcase 'start':\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (currentSlideIndex > indexOfElement || visibleElements == 1) break;\r\n\t\t\t\t\t\t\tconst elementsToMoveToFront = [...elements].splice(currentSlideIndex + visibleElements);\r\n\r\n\t\t\t\t\t\t\telementsToMoveToFront.forEach((_, i) => {\r\n\t\t\t\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]);\r\n\t\t\t\t\t\t\t\tsliderPxX -= elementWidth;\r\n\t\t\t\t\t\t\t\tmoveSlider(true, false); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tcase 'end':\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (currentSlideIndex < indexOfElement) break;\r\n\t\t\t\t\t\t\tconst elementsToMoveToBack = [...elements].splice(currentSlideIndex);\r\n\r\n\t\t\t\t\t\t\telementsToMoveToBack.forEach((_, i) => {\r\n\t\t\t\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]);\r\n\t\t\t\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\t\t\t\tmoveSlider(true, false); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tindexOfElement = getAllElements().indexOf(sliderElement); // recalculate index after move\r\n\t\t\t\tmoveToLocation = (elementWidth * indexOfElement) - (align == 'start' ? 0 : (elementWidth * ((getFullWidthElement(sliderEl) / elementWidth) - 1))); // -1 because this is a count, not an index\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// update item\r\n\t\tconst movePx = moveToLocation > Math.abs(sliderPxX) ? -moveToLocation - sliderPxX : Math.abs(sliderPxX) - moveToLocation;\r\n\t\tcheckEdgesAndMove(movePx, !smoothSlideIntoView, true);\r\n\t};\r\n\tconst getFirstVisibleElement = (): HTMLElement | undefined => {\r\n\t\tif (!elementsEl) return;\r\n\t\tif (firstVisibleElement) return firstVisibleElement;\r\n\t\tfor (let i = 0; i < elementsEl.children.length; i++) {\r\n\t\t\tconst element = elementsEl.children[i];\r\n\t\t\tif (element && element.id) {\r\n\t\t\t\tconst htmlElement = expressQuerySelector(elementsEl, `#${element.id}`, true);\r\n\r\n\t\t\t\tif (getFullWidthElement(htmlElement) > 0 && htmlElement.clientWidth > 0) {\r\n\t\t\t\t\tfirstVisibleElement = htmlElement;\r\n\t\t\t\t\treturn htmlElement;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// return default\r\n\t\treturn undefined;\r\n\t};\r\n\r\n\t// Math.ceil to get a rounded number => Firefox, Edge don't work with decimals\r\n\tconst getFullWidthElement = (element: HTMLElement | undefined, isSliderElement: boolean = false): number => Math.ceil(getFullWidthElementWithoutRounding(element, isSliderElement));\r\n\tconst getFullWidthElementWithoutRounding = (element: HTMLElement | undefined, isSliderElement: boolean = false): number => {\r\n\t\tif (!element) return 0;\r\n\t\tconst style = window.getComputedStyle(element),\r\n\t\t\twidth = style.width ? parseFloat(style.width) : element.clientWidth, // style.width already had the border in the calculation\r\n\t\t\tmargin = parseFloat(style.marginLeft ? style.marginLeft : '0') + parseFloat(style.marginRight ? style.marginRight : '0'),\r\n\t\t\tpadding = parseFloat(style.paddingLeft ? style.paddingLeft : '0') + parseFloat(style.paddingRight ? style.paddingRight : '0');\r\n\r\n\t\treturn width + (margin ? margin : 0) + (padding ? padding : 0) + (isSliderElement ? parseFloat(window.getComputedStyle(elementsEl).gap || '0') || 0 : 0);\r\n\t};\r\n\t// public methods\r\n\tconst removeSliderElement = (sliderElement: ICustomPhotoSliderItem, indexToRemove?: number) => {\r\n\t\t// check params\r\n\t\tif ((!indexToRemove && settings.sliderElements.filter(x => x.id === sliderElement).length < 0) || (indexToRemove && (indexToRemove < 0 || indexToRemove > settings.sliderElements.length - 1)))\r\n\t\t\tthrow Error('Index to remove not found');\r\n\r\n\t\t// remove image\r\n\t\tremoveImageFromArray(indexToRemove ? indexToRemove : settings.sliderElements.indexOf(sliderElement));\r\n\r\n\t\t// reset firstVisibleElement\r\n\t\tfirstVisibleElement = undefined;\r\n\r\n\t\t// Manipulate dom\r\n\t\tif (!sliderElement.id)\r\n\t\t\tthrow Error('invalid image id');\r\n\r\n\t\t// search image el to delete\r\n\t\tconst deleteImageEl = expressQuerySelector(elementsEl, `#${sliderElement.id}`, true);\r\n\t\telementsEl.removeChild(deleteImageEl);\r\n\r\n\t\t// check edges over invalid sliderPxX\r\n\t\tcheckEdgesAndMove(0);\r\n\t};\r\n\tconst removeSliderElementOnIndex = (indexToRemove: number) => {\r\n\t\t// check params\r\n\t\tif ((indexToRemove < 0 || indexToRemove > settings.sliderElements.length - 1)) throw Error('Index to remove not found');\r\n\r\n\t\t// remove image\r\n\t\tconst deletedElement = settings.sliderElements[indexToRemove];\r\n\t\tremoveSliderElement(deletedElement, indexToRemove);\r\n\t};\r\n\tconst addSliderElement = (sliderElement: ICustomPhotoSliderItem, indexToInsert: number = settings.sliderElements.length) => {\r\n\t\t// id check for UI\r\n\t\t// if id already found generate new one => no bugs in dots this way\r\n\t\tif (!sliderElement.id || settings.sliderElements.find(x => x.id === sliderElement.id))\r\n\t\t\tsliderElement.id = Guid.newSliderGuid();\r\n\r\n\t\t// insert element in slider on index\r\n\t\tconst element = indexToInsert === settings.sliderElements.length\r\n\t\t\t? settings.sliderElements[settings.sliderElements.length - 1]\r\n\t\t\t: settings.sliderElements[indexToInsert];\r\n\r\n\t\tinsertIntoSliderElements(sliderElement, indexToInsert);\r\n\t\tconst prevElement = expressQuerySelector(elementsEl, `#${element.id}`, true);\r\n\t\tconst newSlideElement = createSliderElement(sliderElement);\r\n\r\n\t\tindexToInsert === settings.sliderElements.length\r\n\t\t\t? elementsEl.insertAdjacentElement(\"afterend\", newSlideElement)\r\n\t\t\t: elementsEl.insertBefore(newSlideElement, prevElement);\r\n\r\n\t\tjumpIntoView(sliderElement);\r\n\t};\r\n\tconst reset = () => {\r\n\t\tif (settings.resize1SlideToFullWidth)\r\n\t\t\tresizeSliderElementsToFullWidth();\r\n\t\tsettings.BeforeResizeEvent && settings.BeforeResizeEvent(settings, sliderEl);\r\n\t\tcheckEdgesAndMove(0);\r\n\t\tsettings.ResizeEvent && settings.ResizeEvent(settings, sliderEl);\r\n\t};\r\n\tconst previousEvent = (e?: Event, draggedSlider = false, draggedSliderEventTracking = false) => {\r\n\t\tif (!settings.enableEternalSliding) checkEdgesAndMove(0);\r\n\t\tif (prevButton.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax)) return;\r\n\r\n\t\t// calculate next move\r\n\t\tconst nextMove = calculateNextMove(false);\r\n\t\t// update item\r\n\t\tcheckEdgesAndMove(nextMove, draggedSlider);\r\n\r\n\t\t// on click event of settings\r\n\t\tsettings.sliderContainerSettings.previousButton.onClick(e, draggedSliderEventTracking);\r\n\t};\r\n\tconst nextEvent = (e?: Event, draggedSlider = false, draggedSliderEventTracking = false) => {\r\n\t\tif (!settings.enableEternalSliding) checkEdgesAndMove(0);\r\n\t\tif (nextButton.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax)) return;\r\n\r\n\t\t// calculate next move\r\n\t\tconst nextMove = calculateNextMove(true);\r\n\t\t// update item\r\n\t\tcheckEdgesAndMove(nextMove, draggedSlider);\r\n\r\n\t\t// on click event of settings\r\n\t\tsettings.sliderContainerSettings.nextButton.onClick(e, draggedSliderEventTracking);\r\n\t};\r\n\tconst createIntersectionObserver = () => {\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\treturn new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting && entry.target.classList.contains(element.classList[0])) {\r\n\t\t\t\t\t\tioSlider = undefined;\r\n\t\t\t\t\t\t// init slider when in parent element in view\r\n\t\t\t\t\t\tinit(element, settings.replaceWithElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tconst showButtons = () => {\r\n\t\tnextButton && expressRemoveClass(nextButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t\tprevButton && expressRemoveClass(prevButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t};\r\n\r\n\tconst hideButtons = () => {\r\n\t\tnextButton && expressAddClass(nextButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t\tprevButton && expressAddClass(prevButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t};\r\n\r\n\tlet ioSlider: IntersectionObserver | undefined = createIntersectionObserver();\r\n\r\n\t// init slider\r\n\tinit(element, settings.replaceWithElement);\r\n\r\n\t// return\r\n\treturn {\r\n\t\tRemoveSliderElement: removeSliderElement,\r\n\t\tRemoveSliderElementOnIndex: removeSliderElementOnIndex,\r\n\t\tAddSliderElement: addSliderElement,\r\n\t\tPrevious: previousEvent,\r\n\t\tNext: nextEvent,\r\n\t\tJumpIntoView: jumpIntoView,\r\n\t\tSettings: settings,\r\n\t\tGetCurrentSlide: getCurrentElement,\r\n\t\tGetAllSlides: getAllElements,\r\n\t\tGetSliderElement: () => sliderEl,\r\n\t\tShowButtons: showButtons,\r\n\t\tHideButtons: hideButtons,\r\n\t\tDispose: dispose,\r\n\t\tAddHandlers: addHandlers\r\n\t};\r\n}\r\n","import { 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\tEternalSlidingMode,\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.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.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 {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass, getParentWithClassName,\r\n\thasClass,\r\n\thide,\r\n\tisElementVisible,\r\n\tshow\r\n} from \"../common/html\";\r\nimport {getParameter, updateParameter} from \"../utils/querystring\";\r\nimport {createCollapsable} from \"./collapsable\";\r\nimport {createPopup} from \"./popup-new\";\r\nimport {ICustomPhotoSliderWithDivSettings} from \"./customslider\";\r\nimport {initTooltip} from \"./tooltip\";\r\nimport { getPrice } from \"../services/order-service\";\r\nimport { getCookie } from \"../utils/cookie\";\r\nimport {IDataLayerProduct, pushEecDetailEvent} from \"./datalayer\";\r\nimport {throttle} from \"../utils/debounce\";\r\nimport { CarrouselItemType, createCarrousel, ICarrousel } from \"../molecules/carrousel\";\r\nimport { ProductEvent } from \"../common/events\";\r\n\r\nexport interface IStepsComponent {\r\n\tinitFormatImage: (sliderSettings: ICustomPhotoSliderWithDivSettings) => void;\r\n\tctaButton: ICtaButton;\r\n\tmobileCtaButton: ICtaButton;\r\n}\r\n\r\ninterface IStep {\r\n\tindex: number;\r\n\tisLast: boolean;\r\n\tcontentEl: HTMLElement;\r\n\tcontents: IStepContent[];\r\n\tactivate: (optionDescription: string) => void;\r\n\thideContent: () => void;\r\n\topen: () => void;\r\n\tclose: () => void;\r\n\tloadNextStep: (description: string, priceText?: string, strikedPriceText?: string, pricePerPieceText?: string, showFrom?: boolean, url?: string, attributeValueMa?: string, pvc?: string, uniqueSkuWithDesign?: string) => boolean;\r\n\thideError: () => void;\r\n\tsetAndShowError: (message?: string) => void;\r\n\tselectedAttributeMaValue?: string;\r\n\treset: () => void;\r\n\thideLoading: () => void,\r\n\tshowLoading: () => void\r\n}\r\n\r\ninterface IStepContent {\r\n\tid: string;\r\n\tvisible: boolean;\r\n\toptions?: IStepOption[];\r\n\treset: () => void;\r\n\tselect?: IDropDown;\r\n\tattributeValueMa: string;\r\n\tshow: () => void;\r\n\thide: () => void;\r\n\topenNextStepIfPossible: () => boolean;\r\n\tsetId: (attributeValueMa: string) => void;\r\n\tgetAttributeValueMaFromSelected: () => string;\r\n}\r\n\r\nexport interface IStepOption {\r\n\turl?: string;\r\n\tformatImg?: string;\r\n\tselect: () => void;\r\n\tdeselect: () => void;\r\n\tcustomClick: () => void;\r\n\tdisabled: boolean;\r\n\tshowInfoIcon: boolean;\r\n}\r\n\r\ninterface ICtaButton {\r\n\tdisable: () => void;\r\n\tenable: (url: string) => void;\r\n\tsetText: (buttonText: string, buttonTooltipText?: string) => void;\r\n\tresetText: () => void;\r\n\tisEnabled: () => boolean;\r\n\r\n\tbuttonEl: HTMLButtonElement;\r\n}\r\n\r\ninterface IDeliveryInformationUsp {\r\n\tsetDeliveryDate: (dateMsg: string) => void;\r\n\tsetDeliveryPrice: (priceMsg: string) => void;\r\n\tresetDeliveryDate: () => void;\r\n\tresetDeliveryPrice: () => void;\r\n\tdisable: () => void;\r\n\tenable;\r\n}\r\n\r\ninterface IPrice {\r\n\tsetPrice: (price: string, strikedPrice: string, pricePerPiece: string, showFrom: boolean) => void;\r\n}\r\n\r\nexport interface IPriceDetails {\r\n\tselectPvc: (pvc: string) => void;\r\n}\r\n\r\ninterface IDropDown {\r\n\tselectFirst: () => void;\r\n\treset: () => void;\r\n\tselectedOption: HTMLOptionElement;\r\n\thasOnlyOneOption: () => boolean;\r\n}\r\n\r\ninterface IVolumeRelatedPrices {\r\n\tupdate: (pvc: string, option: string, qtyPriceBreak: string) => void;\r\n\tshowIcon: () => void;\r\n\thideIcon: () => void;\r\n}\r\n\r\nexport interface ICreateStepDependencies {\r\n\treadonly getStepContentAsync: (selectedAttributeValueMa: string[], stepIndex: number, optionGroup?: string, targetDeliveryDate?: string, purpose?: string, occasion?: string, preselectOccasion?: string, theme?: string) => Promise;\r\n\treadonly carrouselContainer?: HTMLElement;\r\n\treadonly priceDetails: IPriceDetails;\r\n}\r\n\r\nlet steps: IStep[] | undefined = undefined;\r\nlet ctaButton: ICtaButton;\r\nlet mobileCtaButton: ICtaButton;\r\nlet prices: IPrice[];\r\nlet deliveryInformationUsp: IDeliveryInformationUsp;\r\nlet formatImageSet: boolean;\r\nlet isLoading: boolean;\r\n\r\nlet volumeRelatedPrices: IVolumeRelatedPrices[];\r\nlet currentItem: IDataLayerProduct;\r\n\r\nexport function createSteps(containerEl: HTMLElement, dependencies: ICreateStepDependencies) {\r\n\tif (steps) return;\r\n\tsteps = [];\r\n\tconst { getStepContentAsync, carrouselContainer, priceDetails } = dependencies;\r\n\tconst stepEls = expressQuerySelectorAll(containerEl, \".technical-step\");\r\n\tconst ctaButtonEl = expressQuerySelector(containerEl, \".technical-cta-component .a-button\", true);\r\n\tconst mobileCtaButtonEl = expressQuerySelector(containerEl, \".technical-mobile-cta-button\", true);\r\n\tconst ctaTooltipButtonEl = expressQuerySelector(containerEl, \".technical-cta-component .m-tooltip__text\", false);\r\n\tconst showMoreButtonEl = expressQuerySelector(containerEl, '.technical-showmore', false);\r\n\tconst collapsibleEl = expressQuerySelector(document, '.technical-collapsables', false);\r\n\tconst loadingMsg = containerEl.dataset.loadingmsg || '';\r\n\tconst defaultPvc = containerEl.dataset.defaultpvc || '';\r\n\tconst defaultProductCode = containerEl.dataset.defaultproductcode || '';\r\n\tconst defaultProductName = containerEl.dataset.defaultproductname || '';\r\n\tconst defaultFormatImage = containerEl.dataset.defaultformatimage || '';\r\n\tconst defaultDeliveryDate = containerEl.dataset.defaultdeliverydate || '';\r\n\tconst defaultPrice = parseFloat(containerEl.dataset.defaultprice || '0.0');\r\n\tconst defaultOption = containerEl.dataset.defaultoption || '';\r\n\tconst defaultQtyPriceBreak = containerEl.dataset.defaultquantitypricebreak || '-1';\r\n\tconst priceContainerEls = expressQuerySelectorAll(document, '.technical-header-price-container'); // document because html duplication for mobile\r\n\tconst theme = containerEl.dataset.theme || '';\r\n\tprices = [];\r\n\tvolumeRelatedPrices = [];\r\n\tformatImageSet = false;\r\n\tisLoading = false;\r\n\tlet carrousel: ICarrousel | undefined = undefined;\r\n\r\n\tconst buildSelectedAttributeValueMa = (): string[] => {\r\n\t\tconst toReturn = [];\r\n\t\tsteps.forEach(step => {\r\n\t\t\tif (step.selectedAttributeMaValue) toReturn.push(step.selectedAttributeMaValue);\r\n\t\t});\r\n\t\treturn toReturn;\r\n\t};\r\n\r\n\tconst createDataLayerProduct = (pvc: string, price: number, productCode: string, deliveryInfo: string, formatImg: string, pvcName: string): IDataLayerProduct => {\r\n\t\tlet categoryCode = containerEl.dataset.pc || '';\r\n\t\tif (categoryCode.indexOf('ProductCategory') >= 0)\r\n\t\t\tcategoryCode = categoryCode.replace('ProductCategory.', '');\r\n\t\treturn {\r\n\t\t\tcurrency: window.context.currency,\r\n\t\t\tcategoryCode: categoryCode,\r\n\t\t\tcategoryName: containerEl.dataset.pcname || '',\r\n\t\t\tpvc: pvc,\r\n\t\t\tprice: price,\r\n\t\t\tproductCode: productCode,\r\n\t\t\tdeliveryInfo: deliveryInfo,\r\n\t\t\tparentCategories: containerEl.dataset.parentcategories || '',\r\n\t\t\tformatImageSrc: formatImg,\r\n\t\t\tpvcName: pvcName\r\n\t\t} as IDataLayerProduct;\r\n\r\n\t};\r\n\tconst resetSteps = (stepIndex: number) => {\r\n\t\tsteps.forEach(step => {\r\n\t\t\tif (step.index > stepIndex) step.reset();\r\n\t\t\tif (step.index > stepIndex + 1) step.close();\r\n\t\t});\r\n\t};\r\n\r\n\tconst addFormatImages = (formatImg: string) => {\r\n\t\tif (carrousel)\r\n\t\t\tformatImageSet = carrousel.addAndSelectElement(formatImg);\r\n\t};\r\n\r\n\tconst initFormatImage = () => {\r\n\t\tif (steps.length === 0) return;\r\n\t\tlet formatImage = '';\r\n\t\tconst selectedPvc = getParameter('pvc', document.location.href, false);\r\n\t\tif (steps[steps.length - 1].contents && steps[steps.length - 1].contents.length > 0) {\r\n\t\t\tconst visibleContent = steps[steps.length - 1].contents.find(c => c.visible);\r\n\t\t\tif (visibleContent && selectedPvc) {\r\n\t\t\t\tif (visibleContent.options && visibleContent.options.length > 0) {\r\n\t\t\t\t\tconst selectedOption = visibleContent.options.find(o => o.url && o.url.indexOf(selectedPvc) > 0);\r\n\t\t\t\t\tif (selectedOption) formatImage = selectedOption.formatImg;\r\n\t\t\t\t}\r\n\t\t\t\tif (visibleContent.select && visibleContent.select.selectedOption) formatImage = visibleContent.select.selectedOption.dataset.formatimage || '';\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (formatImage) addFormatImages(formatImage);\r\n\t};\r\n\r\n\tconst removeFormatImage = () => {\r\n\t\tif (formatImageSet && carrousel) {\r\n\t\t\tcarrousel.removeFirstElementAndSelect(CarrouselItemType.FormatImage);\r\n\t\t\tformatImageSet = false;\r\n\t\t}\r\n\t};\r\n\r\n\tconst removePackShotImage = () => {\r\n\t\tif (carrousel) carrousel.removeFirstElementAndSelect(CarrouselItemType.PackShot);\r\n\t};\r\n\r\n\tconst preSelectStep = (stepContent: IStepContent, step: IStep, attributeValueMa: string, formatImg: string) => {\r\n\t\tstepContent.visible = true;\r\n\t\tstepContent.attributeValueMa = step.index === 0 ? \"\" : steps[step.index - 1].selectedAttributeMaValue;\r\n\t\tstepContent.setId(stepContent.attributeValueMa);\r\n\t\tstep.selectedAttributeMaValue = step.isLast ? \"\" : attributeValueMa;\r\n\t\tif (formatImg) formatImageSet = true;\r\n\t};\r\n\r\n\tconst initStep = (stepEl: HTMLElement, totalSteps) => {\r\n\t\tconst index = parseInt(stepEl.dataset.index, 10) || 0;\r\n\t\tconst collapsable = createCollapsable(stepEl, {\r\n\t\t\tcontentSelector: '.technical-step-content',\r\n\t\t\ttitleElSelector: \".technical-collapse-title\",\r\n\t\t\tscrollIntoViewAfterOpen: true,\r\n\t\t\topenClass: \"is-step-open\"\r\n\t\t});\r\n\r\n\t\t// optional step => only has collapsable\r\n\t\tif (stepEl.classList.contains('m-step--optional')) return;\r\n\t\t// Sometimes we hit the code but the step is already initialised\r\n\t\tif (steps.length === totalSteps && steps.find(s => s.index === index)) return;\r\n\r\n\t\tconst stepContentContainerEl = expressQuerySelector(stepEl, \".technical-step-content\", true);\r\n\t\tconst errorEl = expressQuerySelector(stepContentContainerEl, \".technical-error-log\", false);\r\n\t\tconst loadingEl = expressQuerySelector(stepContentContainerEl, \".technical-loading\", false);\r\n\t\tconst defaultError = errorEl && errorEl.innerText || '';\r\n\t\tconst stepContentEl = expressQuerySelector(stepEl, \".technical-step-content-element\", false);\r\n\t\tconst indicatorEl = expressQuerySelector(stepEl, \".technical-step-indicator\", true);\r\n\t\tconst subTitleEl = expressQuerySelector(stepEl, \".technical-step-subtitle\", true);\r\n\t\tconst activate = (optionDescription: string) => {\r\n\t\t\tif (hasClass(indicatorEl, \"o-steps__step-container__indicator--active\")) {\r\n\t\t\t\texpressRemoveClass(indicatorEl, \"o-steps__step-container__indicator--active\");\r\n\t\t\t\texpressAddClass(indicatorEl, \"m-step__title-container__indicator--succes\");\r\n\t\t\t\tindicatorEl.innerText = \"\";\r\n\t\t\t}\r\n\t\t\tconst formattedDescription = formatDescription(optionDescription);\r\n\t\t\tif (formattedDescription)\r\n\t\t\t\tsubTitleEl.innerText = \"(\" + formatDescription(optionDescription) + \")\";\r\n\t\t\telse\r\n\t\t\t\tsubTitleEl.innerText = '';\r\n\t\t};\r\n\r\n\t\tconst formatDescription = (description: string): string => {\r\n\t\t\tif (description.indexOf(\" (\") !== -1)\r\n\t\t\t\tdescription = description.substring(0, description.indexOf(\" (\")).trim();\r\n\t\t\treturn description.trim();\r\n\t\t};\r\n\r\n\t\tconst deactivate = () => {\r\n\t\t\tif (hasClass(indicatorEl, \"o-steps__step-container__indicator--active\"))\r\n\t\t\t\texpressRemoveClass(indicatorEl, \"o-steps__step-container__indicator--active\");\r\n\t\t\tif (hasClass(indicatorEl, \"m-step__title-container__indicator--succes\"))\r\n\t\t\t\texpressRemoveClass(indicatorEl, \"m-step__title-container__indicator--succes\");\r\n\t\t\tsubTitleEl.innerText = '';\r\n\t\t\tindicatorEl.innerText = (step.index + 1) + '';\r\n\t\t};\r\n\r\n\t\tconst hideContent = () => step.contents.forEach(c => c.hide());\r\n\r\n\t\tconst resetContent = () => step.contents.forEach(c => c.reset());\r\n\r\n\t\tconst open = () => {\r\n\t\t\tcollapsable.open(false);\r\n\t\t\texpressAddClass(indicatorEl, \"o-steps__step-container__indicator--active\");\r\n\t\t};\r\n\r\n\t\tconst close = () => {\r\n\t\t\tcollapsable.close();\r\n\t\t\texpressRemoveClass(indicatorEl, \"o-steps__step-container__indicator--active\");\r\n\t\t};\r\n\r\n\t\tconst hideError = () => errorEl && hide(errorEl);\r\n\r\n\t\tconst setAndShowError = (message?: string) => {\r\n\t\t\tif (errorEl) {\r\n\t\t\t\terrorEl.innerText = message ? message : defaultError;\r\n\t\t\t\tshow(errorEl);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst hideLoading = () => loadingEl && hide(loadingEl);\r\n\r\n\t\tconst showLoading = () => {\r\n\t\t\tif (loadingEl) {\r\n\t\t\t\tloadingEl.innerText = loadingMsg;\r\n\t\t\t\tshow(loadingEl);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst createId = (attributeValueMa: string): string => {\r\n\t\t\tlet id = '';\r\n\t\t\tif (step.index === 0) return attributeValueMa;\r\n\t\t\tsteps.forEach(s => {\r\n\t\t\t\tif (s.index < step.index) id += s.selectedAttributeMaValue + '_';\r\n\t\t\t});\r\n\t\t\tid += attributeValueMa;\r\n\t\t\treturn id;\r\n\t\t};\r\n\r\n\t\tconst loadNextStep = (description: string, priceText?: string, strikedPriceText?: string, pricePerPieceText?: string, showFrom?: boolean, url?: string, attributeValueMa?: string, pvc?: string, uniqueSkuWithDesign?: string) => {\r\n\t\t\tisLoading = true;\r\n\t\t\tlet nextStepHasSelection = false;\r\n\t\t\tif (step.isLast) {\r\n\t\t\t\tProductEvent(\"productSelection\", { viewedUniqueSkuWithDesign: uniqueSkuWithDesign });\r\n\t\t\t\tif (priceText) {\r\n\t\t\t\t\tif (!showFrom) showFrom = false;\r\n\t\t\t\t\tprices.forEach(price => price.setPrice(priceText, strikedPriceText, pricePerPieceText, showFrom));\r\n\t\t\t\t}\r\n\t\t\t\tif (url) {\r\n\t\t\t\t\tctaButton.enable(url);\r\n\t\t\t\t\tmobileCtaButton.enable(url);\r\n\t\t\t\t}\r\n\t\t\t\tdeliveryInformationUsp && deliveryInformationUsp.enable();\r\n\t\t\t\tstep.activate(description);\r\n\t\t\t\tif (pvc && priceDetails && priceDetails.selectPvc) priceDetails.selectPvc(pvc);\r\n\t\t\t\tisLoading = false;\r\n\t\t\t} else {\r\n\t\t\t\tdeliveryInformationUsp && deliveryInformationUsp.disable();\r\n\t\t\t\tctaButton.resetText();\r\n\t\t\t\tctaButton.disable();\r\n\t\t\t\tmobileCtaButton.resetText();\r\n\t\t\t\tmobileCtaButton.disable();\r\n\t\t\t\tstep.activate(description);\r\n\t\t\t\tif (priceText) {\r\n\t\t\t\t\tif (!showFrom) showFrom = false;\r\n\t\t\t\t\tprices.forEach(price => price.setPrice(priceText, strikedPriceText, pricePerPieceText, showFrom));\r\n\t\t\t\t}\r\n\t\t\t\tresetSteps(step.index);\r\n\t\t\t\tconst nextStep = steps[step.index + 1];\r\n\t\t\t\tif (nextStep) {\r\n\t\t\t\t\tnextStep.hideContent();\r\n\t\t\t\t\tnextStep.hideError();\r\n\t\t\t\t\tlet content = nextStep.contents.find(c => c.id === createId(attributeValueMa));\r\n\t\t\t\t\tstep.selectedAttributeMaValue = attributeValueMa;\r\n\t\t\t\t\tif (content) {\r\n\t\t\t\t\t\tcontent.show();\r\n\t\t\t\t\t\tisLoading = false;\r\n\t\t\t\t\t\tnextStepHasSelection = content.openNextStepIfPossible();\r\n\t\t\t\t\t} else if (attributeValueMa) {\r\n\t\t\t\t\t\tconst selectedAttributeValuesMa = buildSelectedAttributeValueMa();\r\n\t\t\t\t\t\tnextStep.open();\r\n\t\t\t\t\t\tnextStep.showLoading();\r\n\t\t\t\t\t\tgetStepContentAsync(selectedAttributeValuesMa, nextStep.index, getParameter(\"optiongroup\", window.location.href), getParameter(\"tdd\", window.location.href), getParameter(\"purpose\", window.location.href), getParameter(\"occ\", window.location.href), getParameter(\"preocc\", window.location.href), theme).then(res => {\r\n\t\t\t\t\t\t\tif (res) {\r\n\t\t\t\t\t\t\t\tnextStep.contentEl.insertAdjacentHTML(\"afterbegin\", res);\r\n\t\t\t\t\t\t\t\tconst newContentEl = expressQuerySelector(nextStep.contentEl, \".technical-step-content-element\", true);\r\n\t\t\t\t\t\t\t\tconst stepOptions = expressQuerySelectorAll(newContentEl, \".technical-image-option\");\r\n\t\t\t\t\t\t\t\tconst stepDropDownEl = expressQuerySelector(newContentEl, \".technical-dropdown\", false);\r\n\t\t\t\t\t\t\t\tcontent = initStepContent(nextStep, newContentEl, stepOptions, stepDropDownEl, attributeValueMa);\r\n\t\t\t\t\t\t\t\tnextStep.hideLoading();\r\n\t\t\t\t\t\t\t\tcontent.show();\r\n\t\t\t\t\t\t\t\tnextStep.contents.push(content);\r\n\t\t\t\t\t\t\t\tisLoading = false;\r\n\t\t\t\t\t\t\t\tnextStepHasSelection = content.openNextStepIfPossible();\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t// Something went wrong => refresh page with error message\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tisLoading = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn nextStepHasSelection;\r\n\t\t};\r\n\r\n\t\tconst reset = () => {\r\n\t\t\tstep.selectedAttributeMaValue = '';\r\n\t\t\thideContent();\r\n\t\t\tresetContent();\r\n\t\t\tsetAndShowError(defaultError);\r\n\t\t\tdeactivate();\r\n\t\t};\r\n\r\n\t\tconst step: IStep = {\r\n\t\t\tindex: index,\r\n\t\t\tisLast: index + 1 == totalSteps,\r\n\t\t\tcontentEl: stepContentContainerEl,\r\n\t\t\tcontents: [],\r\n\t\t\tactivate: (optionDescription) => activate(optionDescription),\r\n\t\t\thideContent,\r\n\t\t\topen,\r\n\t\t\tclose,\r\n\t\t\tloadNextStep: (description: string, priceText?: string, strikedPriceText?: string, pricePerPieceText?: string, showFrom?: boolean, url?: string, attributeValueMa?: string, pvc?: string, uniqueSkuWithDesign?: string) => loadNextStep(description, priceText, strikedPriceText, pricePerPieceText, showFrom, url, attributeValueMa, pvc, uniqueSkuWithDesign),\r\n\t\t\thideError,\r\n\t\t\tsetAndShowError: (message?: string) => setAndShowError(message),\r\n\t\t\treset,\r\n\t\t\thideLoading,\r\n\t\t\tshowLoading\r\n\t\t};\r\n\r\n\t\tif (stepContentEl) {\r\n\t\t\tconst stepOptions = expressQuerySelectorAll(stepContentEl, \".technical-image-option\");\r\n\t\t\tconst stepDropDownEl = expressQuerySelector(stepContentEl, \".technical-dropdown\", false);\r\n\t\t\tstep.contents.push(initStepContent(step, stepContentEl, stepOptions, stepDropDownEl));\r\n\t\t}\r\n\t\tsteps.push(step);\r\n\t};\r\n\r\n\tconst initStepContent = (step: IStep, stepContentEl: HTMLElement, stepOptions?: HTMLElement[], stepDropDownEl?: HTMLSelectElement, attributeValueMa?: string): IStepContent => {\r\n\t\tconst hideStepContent = () => {\r\n\t\t\tstepContent.visible = false;\r\n\t\t\thide(stepContentEl);\r\n\t\t};\r\n\r\n\t\tconst showStepContent = () => {\r\n\t\t\tstepContent.visible = true;\r\n\t\t\tshow(stepContentEl);\r\n\t\t\tstep.open();\r\n\t\t};\r\n\r\n\t\tconst reset = () => {\r\n\t\t\tif (stepContent.options && stepContent.options.length > 0)\r\n\t\t\t\tstepContent.options.forEach(option => option.deselect());\r\n\t\t\tif (stepContent.select) stepContent.select.reset();\r\n\t\t};\r\n\r\n\t\tconst openNextStepIfPossible = (): boolean => {\r\n\t\t\tif (stepContent.options) {\r\n\t\t\t\tconst enabledOptions = stepContent.options.filter(o => !o.disabled);\r\n\t\t\t\tif (enabledOptions.length === 1) {\r\n\t\t\t\t\tenabledOptions[0].customClick();\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (stepContent.select && stepContent.select.hasOnlyOneOption()) {\r\n\t\t\t\tstepContent.select.selectFirst();\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\tconst createId = (inputAttributeValueMa?: string): string => {\r\n\t\t\tlet id = '';\r\n\t\t\tif (step.index === 0) return id;\r\n\t\t\tconst previousStep = steps[step.index - 1].contents.find(c => c.visible);\r\n\t\t\tid += previousStep.id;\r\n\t\t\tif (id)\r\n\t\t\t\tid += '_';\r\n\t\t\tid += inputAttributeValueMa && inputAttributeValueMa !== ''\r\n\t\t\t\t? inputAttributeValueMa\r\n\t\t\t\t: attributeValueMa && attributeValueMa !== ''\r\n\t\t\t\t\t? attributeValueMa\r\n\t\t\t\t\t: previousStep.getAttributeValueMaFromSelected();\r\n\t\t\treturn id;\r\n\t\t};\r\n\r\n\t\tconst getAttributeValueMaFromSelected = (): string => {\r\n\t\t\tif (stepOptions && stepOptions.length > 0) {\r\n\t\t\t\tconst selectedOption = stepOptions.find(o => hasClass(o, 'm-option-is-selected'));\r\n\t\t\t\tif (selectedOption) return selectedOption.dataset.attrvalma || '';\r\n\t\t\t}\r\n\t\t\tif (stepDropDownEl)\r\n\t\t\t\treturn stepContent.select.selectedOption.value || '';\r\n\t\t\treturn '';\r\n\t\t};\r\n\r\n\t\tconst setId = (attributeValueMa: string) => stepContent.id = createId(attributeValueMa);\r\n\r\n\t\tconst stepContent: IStepContent = {\r\n\t\t\tid: createId(),\r\n\t\t\tvisible: isElementVisible(stepContentEl),\r\n\t\t\toptions: stepOptions && stepOptions.length > 0 ? [] : null,\r\n\t\t\treset,\r\n\t\t\tattributeValueMa: attributeValueMa || '',\r\n\t\t\tshow: showStepContent,\r\n\t\t\thide: hideStepContent,\r\n\t\t\topenNextStepIfPossible,\r\n\t\t\tsetId,\r\n\t\t\tgetAttributeValueMaFromSelected\r\n\t\t};\r\n\r\n\t\tif (stepOptions && stepOptions.length > 0) stepContent.options = initStepOptions(stepContent, stepOptions, step);\r\n\t\tif (stepDropDownEl) stepContent.select = initDropDown(stepContent, stepDropDownEl, step);\r\n\r\n\t\treturn stepContent;\r\n\t};\r\n\r\n\tconst initStepOptions = (stepContent: IStepContent, optionEls: HTMLElement[], step: IStep): IStepOption[] => {\r\n\t\tconst options = [];\r\n\t\toptionEls.forEach(el => options.push(initStepOption(stepContent, el, step)));\r\n\t\treturn options;\r\n\t};\r\n\r\n\tconst initStepOption = (stepContent: IStepContent, optionEl: HTMLElement, step: IStep): IStepOption => {\r\n\t\tconst url = optionEl.dataset.url || '';\r\n\t\tconst attributeValueMa = optionEl.dataset.attrvalma || '';\r\n\t\tconst myPrice = parseFloat(optionEl.dataset.price || '0.0');\r\n\t\tconst myPriceLabel = optionEl.dataset.pricelabel || '';\r\n\t\tconst myStrikedPrice = parseFloat(optionEl.dataset.strikedprice || '0.0');\r\n\t\tconst myStrikedPriceLabel = optionEl.dataset.strikedpricelabel || '';\r\n\t\tconst myPricePerPiece = optionEl.dataset.priceperpiece || '';\r\n\t\tconst showFrom = optionEl.dataset.showfrom === 'true' || false;\r\n\t\tconst formatImg = optionEl.dataset.formatimage || '';\r\n\t\tconst deliveryDateJs = optionEl.dataset.deliverydatejs || '';\r\n\t\tconst deliveryDate = optionEl.dataset.deliverydate || '';\r\n\t\tconst deliveryPrice = optionEl.dataset.deliveryprice || '';\r\n\t\tconst buttonText = optionEl.dataset.buttontext || '';\r\n\t\tconst mobileButtonText = optionEl.dataset.mobilebuttontext || '';\r\n\t\tconst buttonTooltipText = optionEl.dataset.buttontooltiptext || '';\r\n\t\tconst pagePrice = optionEl.dataset.pageprice || '';\r\n\t\tconst pageMaxAmount = optionEl.dataset.pagemaxamount || '';\r\n\t\tconst pageBaseAmount = optionEl.dataset.pagebaseamount || '';\r\n\t\tconst pvc = optionEl.dataset.pvc || '';\r\n\t\tconst uniqueSkuWithDesign = optionEl.dataset.uniqueskuwithdesign || '';\r\n\t\tconst productCode = optionEl.dataset.productcode || '';\r\n\t\tconst productName = optionEl.dataset.productname || '';\r\n\t\tconst showInfoIcon = optionEl.dataset.showinfoicon === 'true' || false;\r\n\t\tconst cheapestPvc = optionEl.dataset.cheapestpvc || '';\r\n\t\tconst cheapestOption = optionEl.dataset.cheapestoption || '';\r\n\t\tconst cheapestQtyPriceBreak = optionEl.dataset.cheapestquantitypricebreak || '-1';\r\n\t\tconst defaultOptionUsp = optionEl.dataset.defaultoptionusp || '';\r\n\t\tconst cheapestQtyPriceBreakNumber = parseInt(cheapestQtyPriceBreak, 10);\r\n\t\tconst imgDescription = expressQuerySelector(optionEl, \".technical-image-description\", true);\r\n\t\tconst tempUnavailableEl = expressQuerySelector(optionEl, \".technical-temporary-unavailable\", false);\r\n\t\tconst disabled = hasClass(optionEl, \"m-option--is-disabled\") || tempUnavailableEl;\r\n\t\tconst selected = hasClass(optionEl, \"m-option-is-selected\");\r\n\r\n\t\tif (step.isLast && selected)\r\n\t\t\tProductEvent(\"productSelection\", { viewedUniqueSkuWithDesign: uniqueSkuWithDesign });\r\n\r\n\t\tconst deSelect = () => expressRemoveClass(optionEl, \"m-option-is-selected\");\r\n\r\n\t\tconst select = () => expressAddClass(optionEl, \"m-option-is-selected\");\r\n\r\n\t\tconst onClick = () => {\r\n\t\t\tif (isLoading) return;\r\n\t\t\tif (stepContent.options) stepContent.reset();\r\n\r\n\t\t\tstep.isLast && removePackShotImage();\r\n\r\n\t\t\tif (formatImg) {\r\n\t\t\t\tremoveFormatImage();\r\n\t\t\t\taddFormatImages(formatImg);\r\n\t\t\t}\r\n\r\n\t\t\tconst nextStepHasSelection = step.loadNextStep(imgDescription.innerText, myPriceLabel, myStrikedPrice > 0 ? myStrikedPriceLabel : '', myPricePerPiece, showFrom || cheapestQtyPriceBreakNumber > 1, url, attributeValueMa, pvc, uniqueSkuWithDesign);\r\n\t\t\toption.select();\r\n\t\t\t// We need to check if a last step is selected. If that is the case we shouldn't reset the delivery times, prices, etc\r\n\t\t\tif (nextStepHasSelection) return;\r\n\t\t\tif (deliveryDate)\r\n\t\t\t\tdeliveryInformationUsp.setDeliveryDate(deliveryDate);\r\n\t\t\telse\r\n\t\t\t\tdeliveryInformationUsp.resetDeliveryDate();\r\n\t\t\tif (step.isLast) {\r\n\t\t\t\tif (deliveryPrice) {\r\n\t\t\t\t\tdeliveryInformationUsp.setDeliveryPrice(deliveryPrice);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdeliveryInformationUsp.setDeliveryPrice(null);\r\n\t\t\t\t}\r\n\t\t\t\tupdateDefaultOptionUsp(defaultOptionUsp);\r\n\t\t\t} else {\r\n\t\t\t\tdeliveryInformationUsp.resetDeliveryPrice();\r\n\t\t\t}\r\n\t\t\tif (buttonText) ctaButton.setText(buttonText, buttonTooltipText ? buttonTooltipText : '');\r\n\t\t\telse ctaButton.resetText();\r\n\r\n\t\t\tif (mobileButtonText) mobileCtaButton.setText(mobileButtonText);\r\n\t\t\telse mobileCtaButton.resetText();\r\n\r\n\t\t\tupdatePageDetails(pagePrice, pageMaxAmount, pageBaseAmount);\r\n\t\t\tif (showInfoIcon) {\r\n\t\t\t\tvolumeRelatedPrices.forEach(el => {\r\n\t\t\t\t\tel.update(cheapestPvc, cheapestOption, cheapestQtyPriceBreak);\r\n\t\t\t\t\tel.showIcon();\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tvolumeRelatedPrices.forEach(el => el.hideIcon());\r\n\t\t\t}\r\n\t\t\tif (step.isLast) currentItem = createDataLayerProduct(pvc, myPrice, productCode, deliveryDateJs, formatImg, productName);\r\n\t\t};\r\n\r\n\t\tif (selected) {\r\n\t\t\tpreSelectStep(stepContent, step, attributeValueMa, formatImg);\r\n\t\t\tif (step.isLast) currentItem = createDataLayerProduct(pvc, myPrice, productCode, deliveryDateJs, formatImg, productName);\r\n\t\t}\r\n\r\n\t\tconst option = {\r\n\t\t\turl: step.isLast ? url : null,\r\n\t\t\tformatImg: formatImg,\r\n\t\t\tselect,\r\n\t\t\tdeselect: deSelect,\r\n\t\t\tcustomClick: onClick,\r\n\t\t\tdisabled: disabled || false,\r\n\t\t\tshowInfoIcon: showInfoIcon || false\r\n\t\t} as IStepOption;\r\n\t\t!disabled && expressEventListener(optionEl, \"click\", onClick);\r\n\r\n\t\treturn option;\r\n\t};\r\n\tconst initCtaButtonEl = (buttonEl: HTMLButtonElement, tooltip?: HTMLElement): ICtaButton => {\r\n\t\tconst completeStepsMsg = buttonEl.dataset.completestepsmsg || buttonEl.innerText;\r\n\t\tconst defaultToolTipText = tooltip ? tooltip.innerText : '';\r\n\t\tconst onClick = () => {\r\n\t\t\tlet href = buttonEl.getAttribute(\"href\");\r\n\t\t\tif (!href || href === '') return;\r\n\r\n\t\t\t// Add the theme is it is not in the href but is in the page request url\r\n\t\t\tif (theme) {\r\n\t\t\t\tif (href.indexOf('theme', 0) < 0) {\r\n\t\t\t\t\thref += (href.indexOf('?', 0) < 0) ? '?theme=' + theme : '&theme=' + theme;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tupdateParameter('theme', theme, href);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlet newUrl = document.location.href;\r\n\t\t\tconst pvc = getParameter('pvc', href, false);\r\n\t\t\tif (pvc) {\r\n\t\t\t\tnewUrl = updateParameter(\"pvc\", pvc);\r\n\t\t\t\tif (document.location.href !== newUrl)\r\n\t\t\t\t\thistory.replaceState({}, '', newUrl);\r\n\t\t\t}\r\n\r\n\t\t\tconst url = new URL(newUrl);\r\n\t\t\tconst relativePath = url.pathname + url.search;\r\n\r\n\t\t\tpushEecDetailEvent(relativePath, currentItem);\r\n\t\t\tdocument.location.href = href;\r\n\t\t};\r\n\r\n\t\texpressEventListener(buttonEl, \"click\", throttle(onClick, 1000, (e: Event) => { e.preventDefault(); }));\r\n\t\tconst enable = (url: string) => {\r\n\t\t\tif (url) {\r\n\t\t\t\tbuttonEl.setAttribute(\"href\", url);\r\n\t\t\t\texpressRemoveClass(buttonEl, \"a-button--disabled\");\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst disable = () => {\r\n\t\t\tbuttonEl.setAttribute(\"href\", '');\r\n\t\t\texpressAddClass(buttonEl, \"a-button--disabled\");\r\n\t\t};\r\n\r\n\t\tconst isEnabled = (): boolean => {\r\n\t\t\treturn buttonEl.getAttribute(\"href\") && !hasClass(buttonEl, \"a-button--disabled\") && !buttonEl.hasAttribute(\"disabled\");\r\n\t\t};\r\n\r\n\t\tconst setText = (text: string, toolTipText?: string) => {\r\n\t\t\tif (text) buttonEl.innerText = text;\r\n\t\t\tif (tooltip && toolTipText) {\r\n\t\t\t\tbuttonEl.title = toolTipText;\r\n\t\t\t\ttooltip.innerText = toolTipText;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst resetText = () => {\r\n\t\t\tbuttonEl.innerText = completeStepsMsg;\r\n\t\t\tif (tooltip) tooltip.innerText = defaultToolTipText;\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\tenable: (url) => enable(url),\r\n\t\t\tdisable,\r\n\t\t\tsetText,\r\n\t\t\tresetText,\r\n\t\t\tisEnabled,\r\n\t\t\tbuttonEl\r\n\t\t} as ICtaButton;\r\n\t};\r\n\r\n\tconst initDeliveryInformationUsp = (): IDeliveryInformationUsp => {\r\n\t\tconst deliveryInformationEl = expressQuerySelector(containerEl, '.technical-delivery-usp', false);\r\n\t\tif (deliveryInformationEl) {\r\n\t\t\tconst linkEl = expressQuerySelector(deliveryInformationEl, '.technical-delivery-times-link', false);\r\n\t\t\tconst headerLinkEls = expressQuerySelectorAll(document, 'a.m-header__price-excl');\r\n\t\t\tconst deliveryDateEl = expressQuerySelector(deliveryInformationEl, '.technical-delivery-information', false);\r\n\t\t\tconst deliveryPriceEl = expressQuerySelector(deliveryInformationEl, '.technical-delivery-price', false);\r\n\t\t\tconst defaultDeliveryDate = deliveryInformationEl.dataset.defaultdeliverydate || '';\r\n\t\t\tconst defaultDeliveryPrice = deliveryInformationEl.dataset.defaultdeliveryprice || '';\r\n\r\n\t\t\tconst onClick = (e: Event) => {\r\n\t\t\t\tconst link = e.currentTarget as HTMLElement;\r\n\t\t\t\tif (!link || link && link.classList.contains('a-link--disabled')) return; // disabled link not clickable\r\n\t\t\t\tconst ctaButtonUrl = ctaButtonEl.getAttribute('href') ?? mobileCtaButtonEl.getAttribute('href');\r\n\t\t\t\tlet pvc = ctaButtonUrl && getParameter('pvc', ctaButtonUrl, false);\r\n\t\t\t\tif (!pvc) pvc = defaultPvc;\r\n\r\n\t\t\t\tconst toggleShowMore = (showmoreEl: HTMLElement, reset?: boolean) => {\r\n\t\t\t\t\tconst arrow = expressQuerySelector(showmoreEl, '.technical-showmore-arrow', true);\r\n\t\t\t\t\tarrow.style.transform = `rotate(${reset || arrow.style.transform.indexOf('-180') >= 0 ? 0 : -180}deg)`;\r\n\t\t\t\t\tshowmoreEl.nextElementSibling.classList.toggle('u-hide', reset ? true : undefined);\r\n\t\t\t\t};\r\n\t\t\t\tconst toggleShowMoreEvent = (ev: Event, reset?: boolean) => toggleShowMore((ev.target as HTMLElement).closest('.technical-delivery-collapsibles'), reset);\r\n\t\t\t\tconst onBeforeOpen = (popupEl: HTMLElement) => {\r\n\t\t\t\t\tconst collapsibles = expressQuerySelectorAll(popupEl, '.technical-delivery-collapsibles');\r\n\t\t\t\t\t// can't do this with collapsibles component => open close class on itself\r\n\t\t\t\t\tcollapsibles.forEach(x => {\r\n\t\t\t\t\t\ttoggleShowMore(x, true); // reset dropdowns to closed\r\n\t\t\t\t\t\tx.addEventListener('click', toggleShowMoreEvent);\r\n\t\t\t\t\t});\r\n\t\t\t\t};\r\n\t\t\t\tconst onClose = (popupEl: HTMLElement) => {\r\n\t\t\t\t\tif (link === linkEl)\r\n\t\t\t\t\t\tenable();\r\n\r\n\t\t\t\t\tconst collapsibles = expressQuerySelectorAll(popupEl, '.technical-delivery-collapsibles');\r\n\t\t\t\t\t// can't do this with collapsibles component => open close class on itself\r\n\t\t\t\t\tcollapsibles.forEach(x => x.removeEventListener('click', toggleShowMoreEvent));\r\n\t\t\t\t};\r\n\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdialogId: 'deliverytimes' + pvc.replace(\"~\", \"\"),\r\n\t\t\t\t\tview: 'DeliveryTimesDialog',\r\n\t\t\t\t\tdata: { pvc: pvc },\r\n\t\t\t\t\tonBeforeOpen: onBeforeOpen,\r\n\t\t\t\t\tonClose: onClose,\r\n\t\t\t\t\tonOpen: () => link === linkEl ? disable() : void 0\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});\r\n\t\t\t};\r\n\t\t\tconst enable = () => linkEl && linkEl.classList.toggle('a-link--disabled', false);\r\n\t\t\tconst disable = () => linkEl && linkEl.classList.toggle('a-link--disabled', true);\r\n\t\t\tconst setDeliveryDate = (dateMsg: string) => {\r\n\t\t\t\tif (deliveryDateEl) deliveryDateEl.innerText = dateMsg;\r\n\t\t\t};\r\n\t\t\tconst setDeliveryPrice = (dateMsg: string) => {\r\n\t\t\t\tif (deliveryPriceEl) {\r\n\t\t\t\t\tdeliveryPriceEl.classList.toggle(\"u-hide\", !dateMsg);\r\n\t\t\t\t\tdeliveryPriceEl.innerText = dateMsg;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tconst resetDeliveryDate = () => {\r\n\t\t\t\tsetDeliveryDate(defaultDeliveryDate);\r\n\t\t\t};\r\n\t\t\tconst resetDeliveryPrice = () => {\r\n\t\t\t\tsetDeliveryPrice(defaultDeliveryPrice);\r\n\t\t\t};\r\n\t\t\tconst disableLink = (el: HTMLElement) => {\r\n\t\t\t\tconst ctaButtonUrl = ctaButtonEl.getAttribute('href') ?? mobileCtaButtonEl.getAttribute('href');\r\n\t\t\t\tconst pvc = ctaButtonUrl && getParameter('pvc', ctaButtonUrl, false);\r\n\t\t\t\tif (!pvc && !defaultPvc) el.classList.add('a-link--disabled');\r\n\t\t\t};\r\n\t\t\tif (linkEl) {\r\n\t\t\t\tdisableLink(linkEl);\r\n\t\t\t\texpressEventListener(linkEl, \"click\", onClick);\r\n\t\t\t}\r\n\r\n\t\t\tif (headerLinkEls)\r\n\t\t\t\theaderLinkEls.forEach(el => {\r\n\t\t\t\t\tdisableLink(el);\r\n\t\t\t\t\texpressEventListener(el, \"click\", onClick);\r\n\t\t\t\t});\r\n\r\n\t\t\treturn {\r\n\t\t\t\tsetDeliveryDate: (dateMsg: string) => setDeliveryDate(dateMsg),\r\n\t\t\t\tsetDeliveryPrice: (priceMsg: string) => setDeliveryPrice(priceMsg),\r\n\t\t\t\tresetDeliveryDate,\r\n\t\t\t\tresetDeliveryPrice,\r\n\t\t\t\tenable,\r\n\t\t\t\tdisable\r\n\t\t\t} as IDeliveryInformationUsp;\r\n\t\t}\r\n\t};\r\n\r\n\tconst initPrice = (containerEl: HTMLElement): IPrice => {\r\n\t\tconst fromEl = expressQuerySelector(containerEl, \".technical-from-tag\", false);\r\n\t\tconst priceEl = expressQuerySelector(containerEl, \".technical-price-tag\", true);\r\n\t\tconst strikedPriceEl = expressQuerySelector(containerEl, \".technical-strikedprice-tag\", true);\r\n\t\tconst pricePerPieceEl = expressQuerySelector(containerEl, \".technical-unitprice-tag\", true);\r\n\t\tconst infoIconEl = expressQuerySelector(containerEl, '.technical-price-info-icon', false);\r\n\r\n\t\tif (infoIconEl) {\r\n\t\t\tconst volumeRelatedPrice = initShowVolumeRelatedPrices(infoIconEl);\r\n\t\t\tvolumeRelatedPrices.push(volumeRelatedPrice);\r\n\t\t}\r\n\r\n\t\tconst setPrice = (price: string, strikedPrice: string, pricePerPiece: string, showFrom: boolean) => {\r\n\t\t\tif (!priceEl)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tif (fromEl) {\r\n\t\t\t\tshowFrom ? show(fromEl) : hide(fromEl);\r\n\t\t\t}\r\n\t\t\tpriceEl.innerHTML = price.indexOf(\"-1\") > -1 ? \"\" : price;\r\n\t\t\tif (pricePerPiece) {\r\n\t\t\t\tpricePerPieceEl.innerText = ' ' + pricePerPiece;\r\n\t\t\t\tpricePerPieceEl.classList.remove('u-hide');\r\n\t\t\t} else {\r\n\t\t\t\tpricePerPieceEl.classList.add('u-hide');\r\n\t\t\t}\r\n\t\t\tif (strikedPrice) {\r\n\t\t\t\tstrikedPriceEl.innerText = ' ' + strikedPrice;\r\n\t\t\t\tstrikedPriceEl.classList.remove('u-hide');\r\n\t\t\t\tcontainerEl.parentElement.classList.add('m-header--promotion');\r\n\t\t\t\tpriceEl.setAttribute('class', priceEl.getAttribute('class').replace(' technical-u-color', ' u-color'));\r\n\t\t\t} else {\r\n\t\t\t\tstrikedPriceEl.classList.add('u-hide');\r\n\t\t\t\tcontainerEl.parentElement.classList.remove('m-header--promotion');\r\n\t\t\t\tpriceEl.setAttribute('class', priceEl.getAttribute('class').replace(' u-color', ' technical-u-color'));\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn { setPrice: (price, strikedPrice, pricePerPiece, showFrom) => setPrice(price, strikedPrice, pricePerPiece, showFrom) } as IPrice;\r\n\t};\r\n\r\n\tconst initDropDown = (stepContent: IStepContent, selectEl: HTMLSelectElement, step: IStep): IDropDown => {\r\n\t\tlet selectedOption = selectEl.options[selectEl.selectedIndex];\r\n\t\tconst selected = selectEl.selectedIndex > 0;\r\n\t\tconst options = [...selectEl.options];\r\n\r\n\t\t// the selected option is sometimes wrong when pushing the back button\r\n\t\tif (selectedOption.index === 0) {\r\n\t\t\tconst optionWithSelectAttribute = options.find(o => o.hasAttribute('selected'));\r\n\t\t\tif (optionWithSelectAttribute && optionWithSelectAttribute.index !== selectEl.selectedIndex) {\r\n\t\t\t\tselectEl.selectedIndex = optionWithSelectAttribute.index;\r\n\t\t\t\tselectedOption = optionWithSelectAttribute;\r\n\t\t\t}\r\n\t\t}\r\n\t\tlet attributeValueMa = selectedOption.value || '';\r\n\t\tlet formatImg = selectedOption.dataset.formatimage || '';\r\n\t\tlet pvc = selectedOption.dataset.pvc || '';\r\n\t\tconst uniqueSkuWithDesign = selectedOption.dataset.uniqueskuwithdesign || '';\r\n\t\tlet myPrice = parseFloat(selectedOption.dataset.price || '0.0');\r\n\t\tlet myStrikedPrice = parseFloat(selectedOption.dataset.strikedprice || '0.0');\r\n\t\tlet productCode = selectedOption.dataset.productcode || '';\r\n\t\tlet productName = selectedOption.dataset.productname || '';\r\n\t\tlet deliveryDateJs = selectedOption.dataset.deliverydatejs || '';\r\n\t\tlet defaultOptionUsp = selectedOption.dataset.defaultoptionusp || '';\r\n\t\tconst onSelect = () => {\r\n\t\t\tif (isLoading) return;\r\n\t\t\tselectedOption = selectEl.options[selectEl.selectedIndex];\r\n\t\t\tattributeValueMa = selectedOption.value || '';\r\n\t\t\tconst url = selectedOption.dataset.url || '';\r\n\t\t\tmyPrice = parseFloat(selectedOption.dataset.price || '0.0');\r\n\t\t\tconst myPriceLabel = selectedOption.dataset.pricelabel || '';\r\n\t\t\tmyStrikedPrice = parseFloat(selectedOption.dataset.strikedprice || '0.0');\r\n\t\t\tconst myStrikedPriceLabel = selectedOption.dataset.strikedpricelabel || '';\r\n\t\t\tconst myPricePerPiece = selectedOption.dataset.priceperpiece || '';\r\n\t\t\tconst showFrom = selectedOption.dataset.showfrom === 'true' || false;\r\n\t\t\tconst description = selectedOption.dataset.description || '';\r\n\t\t\tdeliveryDateJs = selectedOption.dataset.deliverydatejs || '';\r\n\t\t\tconst deliveryDate = selectedOption.dataset.deliverydate || '';\r\n\t\t\tconst deliveryPrice = selectedOption.dataset.deliveryprice || '';\r\n\t\t\tconst buttonText = selectedOption.dataset.buttontext || '';\r\n\t\t\tconst mobileButtonText = selectedOption.dataset.mobilebuttontext || '';\r\n\t\t\tconst buttonToolTipText = selectedOption.dataset.buttontooltiptext || '';\r\n\t\t\tconst pagePrice = selectedOption.dataset.pageprice || '';\r\n\t\t\tconst pageMaxAmount = selectedOption.dataset.pagemaxamount || '';\r\n\t\t\tconst pageBaseAmount = selectedOption.dataset.pagebaseamount || '';\r\n\t\t\tpvc = selectedOption.dataset.pvc || '';\r\n\t\t\tconst uniqueSkuWithDesign = selectedOption.dataset.uniqueskuwithdesign || '';\r\n\t\t\tproductCode = selectedOption.dataset.productcode || '';\r\n\t\t\tproductName = selectedOption.dataset.productname || '';\r\n\t\t\tformatImg = selectedOption.dataset.formatimage || '';\r\n\t\t\tdefaultOptionUsp = selectedOption.dataset.defaultoptionusp || '';\r\n\t\t\tconst showInfoIcon = selectedOption.dataset.showinfoicon === 'true' || false;\r\n\t\t\tconst cheapestPvc = selectedOption.dataset.cheapestpvc || '';\r\n\t\t\tconst cheapestOption = selectedOption.dataset.cheapestoption || '';\r\n\t\t\tconst cheapestQtyPriceBreak = selectedOption.dataset.cheapestquantitypricebreak || '-1';\r\n\t\t\tconst cheapestQtyPriceBreakNumber = parseInt(cheapestQtyPriceBreak, 10);\r\n\t\t\tstep.isLast && removePackShotImage();\r\n\t\t\tremoveFormatImage();\r\n\t\t\tif (formatImg) addFormatImages(formatImg);\r\n\t\t\tif (deliveryDate)\r\n\t\t\t\tdeliveryInformationUsp.setDeliveryDate(deliveryDate);\r\n\t\t\telse\r\n\t\t\t\tdeliveryInformationUsp.resetDeliveryDate();\r\n\t\t\tif (step.isLast) {\r\n\t\t\t\tif (deliveryPrice)\r\n\t\t\t\t\tdeliveryInformationUsp.setDeliveryPrice(deliveryPrice);\r\n\t\t\t\telse\r\n\t\t\t\t\tdeliveryInformationUsp.resetDeliveryPrice();\r\n\t\t\t\tupdateDefaultOptionUsp(defaultOptionUsp);\r\n\t\t\t} else {\r\n\t\t\t\tdeliveryInformationUsp.resetDeliveryPrice();\r\n\t\t\t}\r\n\t\t\tif (buttonText) ctaButton.setText(buttonText, buttonToolTipText);\r\n\t\t\telse ctaButton.resetText;\r\n\t\t\tif (mobileButtonText) mobileCtaButton.setText(mobileButtonText);\r\n\t\t\telse mobileCtaButton.resetText();\r\n\t\t\tstep.loadNextStep(description, myPriceLabel, myStrikedPrice > 0 ? myStrikedPriceLabel : '', myPricePerPiece, showFrom || cheapestQtyPriceBreakNumber > 1, url, attributeValueMa, pvc, uniqueSkuWithDesign);\r\n\t\t\tupdatePageDetails(pagePrice, pageMaxAmount, pageBaseAmount);\r\n\t\t\tif (showInfoIcon) {\r\n\t\t\t\tvolumeRelatedPrices.forEach(el => {\r\n\t\t\t\t\tel.update(cheapestPvc, cheapestOption, cheapestQtyPriceBreak);\r\n\t\t\t\t\tel.showIcon();\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tvolumeRelatedPrices.forEach(el => el.hideIcon());\r\n\t\t\t}\r\n\t\t\tif (step.isLast) {\r\n\t\t\t\tcurrentItem = createDataLayerProduct(pvc, myPrice, productCode, deliveryDateJs, formatImg, productName);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst selectFirst = () => {\r\n\t\t\tif (selectEl.options.length === 1 || selectEl.options.length === 2) {\r\n\t\t\t\tconst optionsWithValue = options.filter(o => o.value !== '');\r\n\t\t\t\tif (optionsWithValue.length === 1) {\r\n\t\t\t\t\tconst optionToSelect = options.find(o => o.value !== '');\r\n\t\t\t\t\tselectEl.selectedIndex = optionToSelect.index;\r\n\t\t\t\t\tonSelect();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst reset = () => selectEl.value = '';\r\n\r\n\t\texpressEventListener(selectEl, \"change\", onSelect);\r\n\r\n\t\tif (selected) {\r\n\t\t\tpreSelectStep(stepContent, step, attributeValueMa, formatImg);\r\n\t\t\tif (step.isLast) {\r\n\t\t\t\tcurrentItem = createDataLayerProduct(pvc, myPrice, productCode, deliveryDateJs, formatImg, productName);\r\n\t\t\t\tProductEvent(\"productSelection\", { viewedUniqueSkuWithDesign: uniqueSkuWithDesign });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst hasOnlyOneOption = (): boolean => {\r\n\t\t\tif (selectEl.options.length === 1 || selectEl.options.length === 2) {\r\n\t\t\t\tconst options = [...selectEl.options];\r\n\t\t\t\tconst optionsWithValue = options.filter(o => o.value !== '');\r\n\t\t\t\treturn optionsWithValue.length === 1;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\tselectFirst,\r\n\t\t\treset,\r\n\t\t\tselectedOption,\r\n\t\t\thasOnlyOneOption\r\n\t\t} as IDropDown;\r\n\t};\r\n\r\n\tconst updatePageDetails = (pagePrice: string, pageMaxAmount: string, pageBaseAmount: string) => {\r\n\t\tconst variableUl = expressQuerySelector(containerEl, \".technical-usps-variable-price\", false);\r\n\t\tif (!pagePrice) {\r\n\t\t\t// Hide the section\r\n\t\t\tif (variableUl)\r\n\t\t\t\tvariableUl.classList.add(\"u-hide\");\r\n\t\t} else {\r\n\t\t\tif (variableUl)\r\n\t\t\t\tvariableUl.classList.remove(\"u-hide\");\r\n\r\n\t\t\tconst basePageTagEl = expressQuerySelector(containerEl, '.technical-basepages-tag', false);\r\n\t\t\tconst maxPagesTagEl = expressQuerySelector(containerEl, '.technical-maxpages-tag', false);\r\n\t\t\tconst pagePriceTagEl = expressQuerySelector(containerEl, '.technical-unitprice-perpage-tag', false);\r\n\t\t\tconst fromPagePriceTagEl = expressQuerySelector(containerEl, '.technical-from-unitprice-perpage-tag', false);\r\n\t\t\tif (basePageTagEl && pageBaseAmount) basePageTagEl.innerText = pageBaseAmount;\r\n\t\t\tif (maxPagesTagEl && pageMaxAmount) maxPagesTagEl.innerText = pageMaxAmount;\r\n\t\t\tpagePriceTagEl && fromPagePriceTagEl && fromPagePriceTagEl.classList.add('u-hide');// update price => hide from label\r\n\t\t\tif (pagePriceTagEl) pagePriceTagEl.innerText = pagePrice;\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateDefaultOptionUsp = (usp: string) => {\r\n\t\tconst defaultOptionEl = expressQuerySelector(document, 'ul.technical-defaultoption', true);\r\n\t\tconst defaultOptionListEl = expressQuerySelector(document, 'ul.technical-defaultoption > li', true);\r\n\t\tif (!usp)\r\n\t\t\texpressAddClass(defaultOptionEl, 'u-hide');\r\n\t\telse\r\n\t\t\texpressRemoveClass(defaultOptionEl, 'u-hide');\r\n\t\tdefaultOptionListEl.innerText = usp;\r\n\t};\r\n\r\n\tconst initShowVolumeRelatedPrices = (infoIconEl: HTMLElement): IVolumeRelatedPrices => {\r\n\t\tif (!steps.length) currentItem = createDataLayerProduct(defaultPvc, defaultPrice, defaultProductCode, defaultDeliveryDate, defaultFormatImage, defaultProductName);\r\n\r\n\t\tconst initialContent = !steps || !steps[0] || !steps[0].contents || !steps[0].contents[0] ? undefined : steps[0].contents[0];\r\n\t\tconst infoTooltipEl = expressQuerySelector(infoIconEl.parentElement, '.technical-price-tooltip', true);\r\n\r\n\t\tconst update = (pvc: string, option: string, qtyPriceBreak: string) => {\r\n\t\t\tinfoTooltipEl.dataset.pvc = pvc;\r\n\t\t\tinfoTooltipEl.dataset.quantitypricebreak = qtyPriceBreak;\r\n\t\t\tinfoTooltipEl.dataset.option = option;\r\n\t\t};\r\n\r\n\t\tconst showIcon = () => {\r\n\t\t\tshow(infoIconEl);\r\n\t\t};\r\n\t\tconst hideIcon = () => {\r\n\t\t\thide(infoIconEl);\r\n\t\t};\r\n\r\n\t\tif (initialContent) {\r\n\t\t\tif (initialContent.options && initialContent.options.length > 0) {\r\n\t\t\t\tconst optionsWithShowInfoIcon = initialContent.options.filter(o => !o.disabled && o.showInfoIcon && o.showInfoIcon === true);\r\n\t\t\t\tif (optionsWithShowInfoIcon.length === initialContent.options.filter(o => !o.disabled).length) {\r\n\t\t\t\t\tupdate(defaultPvc, defaultOption, defaultQtyPriceBreak);\r\n\t\t\t\t\tshowIcon();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (defaultPvc && defaultQtyPriceBreak && defaultQtyPriceBreak > \"1\") {\r\n\t\t\tupdate(defaultPvc, defaultOption, defaultQtyPriceBreak);\r\n\t\t\tshowIcon();\r\n\t\t}\r\n\r\n\t\tconst onToolTipOpen = (infoTooltipEl) => {\r\n\t\t\tconst forceQuantityBreak = infoTooltipEl.dataset.quantitypricebreak || '-1';\r\n\t\t\tconst templateEl = expressQuerySelectorAll(infoTooltipEl, '.technical-price-template')[0];\r\n\t\t\tconst containerEl = expressQuerySelector(infoTooltipEl, '.technical-price-container', true);\r\n\t\t\tconst pvc = infoTooltipEl.dataset.pvc || '';\r\n\t\t\tconst options = infoTooltipEl.dataset.option || undefined;\r\n\t\t\tconst promoCode = getCookie(\"promo\");\r\n\t\t\tlet forceQuantityBreakInt: number;\r\n\t\t\tif (forceQuantityBreak)\r\n\t\t\t\tforceQuantityBreakInt = parseInt(forceQuantityBreak, 10);\r\n\t\t\tif (forceQuantityBreakInt <= 0)\r\n\t\t\t\tforceQuantityBreakInt = 1;\r\n\t\t\tcontainerEl.innerHTML = '';\r\n\t\t\tgetPrice(pvc, forceQuantityBreakInt, 0, options ? options.split(',') : undefined, promoCode).then(res => {\r\n\t\t\t\tif (res.PriceItems)\r\n\t\t\t\t\tres.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});\r\n\t\t};\r\n\r\n\t\tinitTooltip({\r\n\t\t\tbuttonEl: infoIconEl,\r\n\t\t\tcontainerEl: infoTooltipEl,\r\n\t\t\topenClass: \"is-tooltip-open\",\r\n\t\t\tonOpen: onToolTipOpen\r\n\t\t});\r\n\r\n\t\treturn { update, showIcon, hideIcon } as IVolumeRelatedPrices;\r\n\t};\r\n\r\n\tif (showMoreButtonEl && collapsibleEl) expressEventListener(showMoreButtonEl, 'click', () => {\r\n\t\tcollapsibleEl.scrollIntoView({\r\n\t\t\tbehavior: 'smooth'\r\n\t\t});\r\n\t});\r\n\r\n\tstepEls.forEach(el => initStep(el, stepEls.filter(x => !x.classList.contains('m-step--optional')).length));\r\n\tif (stepEls.filter(x => !x.classList.contains('m-step--optional')).length === 0) {\r\n\t\tconst uniqueSkuWithDesign = containerEl.dataset.uniqueskuwithdesign;\r\n\t\tuniqueSkuWithDesign && ProductEvent(\"productSelection\", { viewedUniqueSkuWithDesign: uniqueSkuWithDesign });\r\n\t}\r\n\tdeliveryInformationUsp = initDeliveryInformationUsp();\r\n\tctaButton = initCtaButtonEl(ctaButtonEl, ctaTooltipButtonEl);\r\n\tmobileCtaButton = initCtaButtonEl(mobileCtaButtonEl);\r\n\tif (mobileCtaButtonEl) {\r\n\t\tconst wobblerEl = expressQuerySelector(document, '.technical-wobbler-link', false);\r\n\t\tconst mobileCtaButtonParentEl = getParentWithClassName(mobileCtaButtonEl, 'o-steps__button-continue--wobbler');\r\n\t\tif (!wobblerEl && mobileCtaButtonParentEl)\r\n\t\t{\r\n\t\t\texpressRemoveClass(mobileCtaButtonParentEl as HTMLElement, 'o-steps__button-continue--wobbler');\r\n\t\t}\r\n\t}\r\n\tpriceContainerEls.forEach(priceEl => prices.push(initPrice(priceEl)));\r\n\r\n\tcarrousel = createCarrousel(carrouselContainer, { initFormatImage });\r\n\r\n\treturn {\r\n\t\tctaButton: ctaButton,\r\n\t\tmobileCtaButton: mobileCtaButton\r\n\t} as IStepsComponent;\r\n}\r\n","import { expressQuerySelector } from \"../common/html\";\r\n\r\nexport function createFlipBook(flipbookElement: HTMLElement) {\r\n\tconst pages = Array.from(flipbookElement.querySelectorAll('.technical-flipbook-leaf'));\r\n\tconst maxZIndex = pages && pages.length ? pages[0].style.zIndex : 0; // always shown on page first => max z-index\r\n\tconst prevButton = expressQuerySelector(flipbookElement, '.technical-flipbook-previous', true);\r\n\tconst nextButton = expressQuerySelector(flipbookElement, '.technical-flipbook-next', true);\r\n\r\n\tconst flipbookPage = (next: boolean) => {\r\n\t\tconst filterdList = next ? pages.filter(x => !x.classList.contains('m-flip-book__leaf--flipped')) : pages.filter(x => x.classList.contains('m-flip-book__leaf--flipped')).reverse();\r\n\t\tconst pageToTurn = filterdList[0];\r\n\t\tif (!pageToTurn) return;\r\n\r\n\t\tpageToTurn.classList.toggle('m-flip-book__leaf--flipped', next);\r\n\r\n\t\tconst nextPage = next ? filterdList[1] : pageToTurn.nextElementSibling as HTMLElement;\r\n\t\tif (nextPage) nextPage.style.zIndex = `${next ? maxZIndex : nextPage.dataset.originalindex}`;\r\n\r\n\t\tnextButton.classList.toggle('a-button--disabled', next && filterdList.length <= 1);\r\n\t\tprevButton.classList.toggle('a-button--disabled', !next && filterdList.length <= 1);\r\n\t};\r\n\r\n\tnextButton.addEventListener('click', () => !nextButton.classList.contains('a-button--disabled') && flipbookPage(true));\r\n\tprevButton.addEventListener('click', () => !prevButton.classList.contains('a-button--disabled') && flipbookPage(false));\r\n\r\n\treturn {\r\n\t\tnext: () => flipbookPage(true),\r\n\t\tprevious: () => flipbookPage(false)\r\n\t};\r\n}\r\n","import { createCollapsable } from \"../components/collapsable\";\r\nimport { initCountDown } from \"./countdown\";\r\nimport { expressQuerySelectorAll } from \"../common/html\";\r\n\r\nexport function createPromotionBar(containerEl: HTMLElement) {\r\n\r\n\tcreateCollapsable(containerEl, {\r\n\t\ttitleElSelector: '.technical-promotion-bar-header',\r\n\t\tscrollIntoViewAfterOpen: false\r\n\t});\r\n\r\n\tconst countDownEls = expressQuerySelectorAll(containerEl, \".technical-countdown\");\r\n\tcountDownEls.forEach(el => {\r\n\t\tconst countDownToDate = el.dataset.countdown || \"\";\r\n\t\tconst daysLabel = el.dataset.dayslabel || \"\";\r\n\t\tconst dayLabel = el.dataset.daylabel || \"\";\r\n\r\n\t\tif (countDownToDate !== \"\") {\r\n\t\t\tconst onCountDownFinish = () => {\r\n\t\t\t\tconst parent = containerEl.parentElement;\r\n\t\t\t\tif (parent)\r\n\t\t\t\t\tparent.removeChild(containerEl);\r\n\t\t\t};\r\n\r\n\t\t\tinitCountDown(containerEl, el, countDownToDate, {\r\n\t\t\t\tshowDays: true,\r\n\t\t\t\tonCountDownFinish: onCountDownFinish,\r\n\t\t\t\tdaysLabel,\r\n\t\t\t\tdayLabel\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n}\r\n","import {getRequest} from \"../utils/fetch\";\r\nimport {objectToQueryString} from \"../utils/querystring\";\r\nimport {IProductCategoryReviewsRequest, IProductCategoryReviewsResult} from \"./content-service\";\r\n\r\nconst basePath = \"/apicore/reviewsapi/\";\r\n\r\nexport function GetProductCategoryReviews (productCategoryId: string, page: number, stars?: number, reviewLanguage?: string, theme?: string): Promise {\r\n\tconst request: IProductCategoryReviewsRequest = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tlanguage: window.context.language,\r\n\t\tproductCategoryId: productCategoryId,\r\n\t\tpage: page,\r\n\t\tstars: stars || 0,\r\n\t\treviewLanguage: reviewLanguage || '',\r\n\t\ttheme: theme || ''\r\n\t};\r\n\treturn getRequest(\r\n\t\tbasePath + \"getproductcategoryreviews\" + 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","import {postHtmlRequest} from \"../utils/fetch\";\r\nimport {IBaseStepContentRequest} from \"./content-service\";\r\nconst basePath = \"/apicore/stepsapi/\";\r\nexport function getStepContent(productCategory: string, selectedAttributeValueMa: string[], stepIndex: number, optionGroup?: string, targetDeliveryDate?: string, purpose?: string, occasion?: string, preselectedOccasion?:string, theme?: string) : Promise{\r\n\tconst body = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tlanguage: window.context.language,\r\n\t\tproductCategory: productCategory,\r\n\t\tselectedAttributeValueMa: selectedAttributeValueMa,\r\n\t\tstepIndex: stepIndex\r\n\t} as IBaseStepContentRequest;\r\n\tif (optionGroup && optionGroup !== 'undefined')\r\n\t\tbody.optionGroup = optionGroup;\r\n\tif (targetDeliveryDate)\r\n\t\tbody.targetDeliveryDate = targetDeliveryDate;\r\n\tif (purpose)\r\n\t\tbody.purpose = purpose;\r\n\tif (occasion)\r\n\t\tbody.occasion = occasion;\r\n\tif (preselectedOccasion)\r\n\t\tbody.preselectedOccasion = preselectedOccasion;\r\n\tif (theme)\r\n\t\tbody.theme = theme;\r\n\r\n\treturn postHtmlRequest(\r\n\t\tbasePath + \"getstepcontent\",\r\n\t\tbody,\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","import {expressQuerySelector, expressQuerySelectorAll, remove, show} from \"../common/html\";\r\nimport {IProductCategoryReview} from \"../services/content-service\";\r\nimport {createCollapsable} from \"../components/collapsable\";\r\n\r\n\r\ninterface ICreateReviewBlocksOptions {\r\n\treadonly productReviewsNameLabel: string;\r\n\treadonly productReviewsAnonymousLabel: string;\r\n}\r\n\r\nexport function createReviewBlocks(containerEl: HTMLElement, options: Partial) {\r\n\r\n\tconst {productReviewsNameLabel, productReviewsAnonymousLabel = \"Anonymous\"} = options;\r\n\tconst reviewTemplateEl = expressQuerySelector(containerEl, '.m-review-block.template', true);\r\n\tremove(reviewTemplateEl);\r\n\tconst collapsableCommentEls = expressQuerySelectorAll(containerEl, '.technical-review-answer-collapsable');\r\n\r\n\tcollapsableCommentEls.forEach(el => createCollapsable(el, null, { swapTitleDataAttribute : \"data-hidelabel\" }));\r\n\r\n\tconst createUserReview = (review: IProductCategoryReview): HTMLElement => {\r\n\r\n\t\tconst reviewTemplateCloneEl: HTMLElement = reviewTemplateEl.cloneNode(true) as HTMLElement;\r\n\r\n\t\t// stars block\r\n\t\tconst reviewStarsEl = expressQuerySelector(reviewTemplateCloneEl, \".m-review-blocks__stars\", true);\r\n\t\tconst fullStarsEl = expressQuerySelector(reviewStarsEl, \".a-review-stars__full\", true);\r\n\t\tfullStarsEl.style.width = `${review.score * 100 / 5}%`; // TODO : get max score\r\n\t\tconst reviewsStarsAtomEl = expressQuerySelector(reviewStarsEl, \".a-review-stars\", true);\r\n\t\tif (review.trustPilotDesignClass)\r\n\t\t\treviewsStarsAtomEl.classList.add(...review.trustPilotDesignClass.split(\" \"));\r\n\r\n\t\t// review\r\n\t\tif (review.comment)\r\n\t\t\texpressQuerySelector(reviewTemplateCloneEl, \".m-review-blocks__review\", true)\r\n\t\t\t\t.insertAdjacentText('beforeend', review.comment);\r\n\r\n\t\t// user info\r\n\t\tconst reviewerBlockEL = expressQuerySelector(reviewTemplateCloneEl, \".m-review-blocks__reviewer\", true);\r\n\r\n\t\t// if no label provided -> don't show names at all\r\n\t\tif (productReviewsNameLabel) {\r\n\t\t\tconst name = `${review.reviewerFirstname || \"\"} ${review.reviewerLastname || \"\"}`;\r\n\t\t\texpressQuerySelector(reviewerBlockEL, \".m-review-blocks__reviewer-name\", true)\r\n\t\t\t\t.insertAdjacentText('beforeend', `${productReviewsNameLabel.replace('{0}', name.trim() || productReviewsAnonymousLabel)}`);\r\n\t\t} else {\r\n\t\t\texpressQuerySelector(reviewerBlockEL, \".m-review-blocks__reviewer-name\", true).style.display = 'none';\r\n\t\t}\r\n\r\n\t\tif (review.formattedReviewDate)\r\n\t\t\texpressQuerySelector(reviewerBlockEL, \".m-review-blocks__review-date\", true)\r\n\t\t\t\t.insertAdjacentText('beforeend', review.formattedReviewDate);\r\n\r\n\t\t// comment collapsable\r\n\t\tconst collapsableEl = expressQuerySelector(reviewTemplateCloneEl, \".technical-review-answer-collapsable\", true);\r\n\t\tconst commentBlockEl = expressQuerySelector(collapsableEl, \".m-review-answer\", true);\r\n\t\tif (review.feedback && review.formattedFeedbackDate) {\r\n\t\t\texpressQuerySelector(commentBlockEl, \".m-review-answer__answer-date\", true)\r\n\t\t\t\t.insertAdjacentText('beforeend', review.formattedFeedbackDate);\r\n\t\t\texpressQuerySelector(commentBlockEl, \".m-review-answer__answer\", true)\r\n\t\t\t\t.insertAdjacentHTML(\"beforeend\", `${review.feedback}`);\r\n\t\t\tcreateCollapsable(collapsableEl, null, { swapTitleDataAttribute : \"data-hidelabel\"});\r\n\t\t} else {\r\n\t\t\tremove(collapsableEl);\r\n\t\t}\r\n\r\n\t\tshow(reviewTemplateCloneEl);\r\n\r\n\t\treturn reviewTemplateCloneEl;\r\n\t};\r\n\r\n\tconst addReviews = (productCategoryReviews: IProductCategoryReview[], replace = false) => {\r\n\t\tconst reviewEls = productCategoryReviews.map(r => createUserReview(r));\r\n\t\tif (replace) clear();\r\n\t\tcontainerEl.append(...reviewEls);\r\n\t};\r\n\r\n\tconst clear = () => containerEl.innerHTML = '';\r\n\r\n\treturn {\r\n\t\taddReviews,\r\n\t\tclear,\r\n\t};\r\n}\r\n","import {expressQuerySelector, hide, expressQuerySelectorAll, remove, show} from \"../common/html\";\r\n\r\nexport interface ICreateShowMoreButtonOptions {\r\n\t\tonClick: () => void;\r\n\t}\r\n\r\n\texport function createShowMoreButton(containerEl: HTMLElement, options: ICreateShowMoreButtonOptions) {\r\n\r\n\t\tconst onClick = () => options.onClick();\r\n\r\n\t\tconst enable = () => {\r\n\t\t\tconst buttonEl = expressQuerySelector(containerEl, \".a-button\");\r\n\r\n\t\t\tcontainerEl.removeEventListener(\"click\", onClick);\r\n\t\t\tcontainerEl.addEventListener(\"click\", onClick);\r\n\r\n\t\t\tif (buttonEl) buttonEl.classList.add(\"a-button--active\");\r\n\t\t};\r\n\r\n\t\tconst disable = () => {\r\n\t\t\tcontainerEl.removeEventListener(\"click\", onClick);\r\n\t\t};\r\n\r\n\t\tconst show = () => {\r\n\t\t\tcontainerEl.style.display = '';\r\n\t\t};\r\n\r\n\t\tconst hide = () => {\r\n\t\t\tcontainerEl.style.display = 'none';\r\n\t\t};\r\n\r\n\t\tconst dispose = () => {\r\n\t\t\tdisable();\r\n\t\t};\r\n\r\n\t\tenable();\r\n\r\n\t\treturn {\r\n\t\t\tshow,\r\n\t\t\thide,\r\n\t\t\tenable,\r\n\t\t\tdisable,\r\n\t\t\tdispose,\r\n\t\t};\r\n\t}\r\n\r\n\texport interface ICreatePaginationControlOptions {\r\n\t\tonClick: (page: number) => void;\r\n\t\treadonly numberOfPages: number;\r\n\t}\r\n\r\n\texport function createPaginationControl(containerEl: HTMLElement, options: ICreatePaginationControlOptions) {\r\n\t\tconst buttonTemplateEl = containerEl.querySelector(\".m-review-blocks-controls__button\")!;\r\n\r\n\t\tconst leftControlEL = buttonTemplateEl.cloneNode(true) as HTMLElement;\r\n\t\texpressQuerySelector(leftControlEL, 'button', true)\r\n\t\t\t.className += \" icon-arrow-left m-review-blocks-controls__pagination-button\";\r\n\t\tconst leftButton = leftControlEL.querySelector(\"button\");\r\n\t\tif (leftButton) leftButton.title = \"previous\";\r\n\t\thide(leftControlEL);\r\n\r\n\t\tconst rightControlEL = buttonTemplateEl.cloneNode(true) as HTMLElement;\r\n\t\texpressQuerySelector(rightControlEL, 'button', true)\r\n\t\t\t.className += \" icon-arrow-right m-review-blocks-controls__pagination-button\";\r\n\t\tconst rightButton = rightControlEL.querySelector(\"button\");\r\n\t\tif (rightButton) rightButton.title = \"next\";\r\n\t\thide(rightControlEL);\r\n\r\n\t\tconst reviewBlocksControlEl = document.getElementsByClassName('m-review-blocks-controls');\r\n\r\n\t\treviewBlocksControlEl[1].insertAdjacentElement('afterbegin', leftControlEL);\r\n\t\treviewBlocksControlEl[1].insertAdjacentElement('beforeend', rightControlEL);\r\n\r\n\t\tremove(buttonTemplateEl);\r\n\r\n\t\tlet numberedButtonEls: HTMLElement[] = [];\r\n\r\n\t\tconst amountOfPagesToShow = parseInt(containerEl.getAttribute('data-amount-of-pages')!, 10) || 5;\r\n\t\tlet { numberOfPages } = options;\r\n\t\tlet indexOffset = 0;\r\n\r\n\t\tlet selectedPage: number;\r\n\r\n\t\tconst onNumberedButtonClicked = (e: Event) => {\r\n\t\t\tconst buttonEl = e.currentTarget as HTMLElement;\r\n\t\t\toptions.onClick(\r\n\t\t\t\tparseInt(\r\n\t\t\t\t\tbuttonEl.textContent!,\r\n\t\t\t\t\t10)\r\n\t\t\t);\r\n\t\t};\r\n\r\n\t\tconst showArrowControl = (showIt: boolean, el: HTMLElement) => {\r\n\t\t\tif (showIt) {\r\n\t\t\t\tshow(el);\r\n\t\t\t\tel.removeEventListener(\"click\", onClickArrowControl);\r\n\t\t\t\tel.addEventListener(\"click\", onClickArrowControl);\r\n\t\t\t} else {\r\n\t\t\t\thide(el);\r\n\t\t\t\tel.removeEventListener(\"click\", onClickArrowControl);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst updatePaginations = (pages?: number, pageNumber?: number) => {\r\n\t\t\tif (pageNumber) {\r\n\t\t\t\tif (pageNumber === 1) indexOffset = 0;\r\n\t\t\t\tselectedPage = pageNumber;\r\n\t\t\t}\r\n\r\n\t\t\tif (pages) numberOfPages = pages;\r\n\r\n\t\t\tnumberedButtonEls = [];\r\n\r\n\t\t\texpressQuerySelectorAll(containerEl, \".m-review-blocks-controls__button.numbered-control\")\r\n\t\t\t\t.forEach(remove);\r\n\r\n\t\t\tconst indexCondition = Math.min(\r\n\t\t\t\t(numberOfPages + 1),\r\n\t\t\t\t(amountOfPagesToShow + 1 + indexOffset)\r\n\t\t\t);\r\n\r\n\t\t\tfor (let index = 1 + indexOffset; index < indexCondition; index++) {\r\n\t\t\t\tconst buttonCloneEl = buttonTemplateEl.cloneNode(true) as HTMLElement;\r\n\t\t\t\tbuttonCloneEl.classList.add('numbered-control');\r\n\t\t\t\tif (selectedPage === index) {\r\n\t\t\t\t\tconst activeButtonEl = expressQuerySelector(buttonCloneEl, \".a-button\");\r\n\t\t\t\t\tif (activeButtonEl) activeButtonEl.classList.add(\"a-button--active\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbuttonCloneEl.addEventListener(\"click\", onNumberedButtonClicked);\r\n\t\t\t\t}\r\n\t\t\t\texpressQuerySelector(buttonCloneEl, '.a-button--review', true)\r\n\t\t\t\t\t.insertAdjacentText('beforeend', index.toString());\r\n\t\t\t\tconst pageButton = buttonCloneEl.querySelector(\"button\");\r\n\t\t\t\tif (pageButton) pageButton.title = \"page \" + index.toString();\r\n\t\t\t\tnumberedButtonEls.push(buttonCloneEl);\r\n\t\t\t}\r\n\r\n\t\t\tconst docFrag = document.createDocumentFragment();\r\n\t\t\tdocFrag.append(...numberedButtonEls);\r\n\t\t\trightControlEL.parentNode!.insertBefore(\r\n\t\t\t\tdocFrag,\r\n\t\t\t\trightControlEL\r\n\t\t\t);\r\n\r\n\t\t\ttoggleArrowControls();\r\n\t\t};\r\n\r\n\t\tconst toggleArrowControls = () => {\r\n\r\n\t\t\tshowArrowControl(\r\n\t\t\t\t(amountOfPagesToShow + indexOffset) < numberOfPages,\r\n\t\t\t\trightControlEL\r\n\t\t\t);\r\n\r\n\t\t\tshowArrowControl(\r\n\t\t\t\t(indexOffset - amountOfPagesToShow) >= 0,\r\n\t\t\t\tleftControlEL\r\n\t\t\t);\r\n\t\t};\r\n\r\n\t\tconst onClickArrowControl = (e: Event) => {\r\n\r\n\t\t\tconst controlEl = e.currentTarget as HTMLElement;\r\n\t\t\tconst isLeft = controlEl.querySelector('.icon-arrow-left');\r\n\r\n\t\t\tif (isLeft) indexOffset -= amountOfPagesToShow;\r\n\t\t\telse indexOffset += amountOfPagesToShow;\r\n\r\n\t\t\tupdatePaginations();\r\n\t\t};\r\n\r\n\t\t// init pagination controls\r\n\t\tupdatePaginations(numberOfPages, 1);\r\n\r\n\t\treturn {\r\n\t\t\tupdatePaginations,\r\n\t\t\tdispose: () => {\r\n\t\t\t\tleftControlEL.removeEventListener(\"click\", onClickArrowControl);\r\n\t\t\t\trightControlEL.removeEventListener(\"click\", onClickArrowControl);\r\n\t\t\t\tnumberedButtonEls.forEach(e => e.removeEventListener(\"click\", onNumberedButtonClicked));\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n","import {expressQuerySelector} from \"../common/html\";\r\n\r\nexport interface ICreateReviewBarDependencies {\r\n readonly onClick: (stars: number) => void;\r\n readonly clearActiveBar: () => void;\r\n}\r\n\r\nexport function createReviewBar(containerEl: HTMLElement, dependencies: ICreateReviewBarDependencies) {\r\n const {onClick, clearActiveBar} = dependencies;\r\n const barEl = expressQuerySelector(containerEl, \".m-review-bars__review-bar\", true);\r\n const quantityEl = expressQuerySelector(containerEl, \".m-review-bars__reviews-quantity\", true);\r\n const enabledClass = \"m-review-bars__review-link\";\r\n const disabledClass = \"m-review-bars__review-no-link\";\r\n const activeClass = \"m-review-bars__review-link--active\";\r\n let startValue = 0;\r\n\r\n const isEnabled = () => containerEl.classList.contains(enabledClass);\r\n\r\n const isDisabled = () => containerEl.classList.contains(disabledClass);\r\n\r\n function getStartValue(): number {\r\n return +(containerEl.getAttribute('data-star-value') || 0);\r\n }\r\n\r\n const onClickEvent = () => {\r\n clearActiveBar();\r\n containerEl.classList.add(activeClass);\r\n onClick(startValue);\r\n };\r\n\r\n const enable = () => {\r\n if (isDisabled()) containerEl.classList.remove(disabledClass);\r\n containerEl.classList.add(enabledClass);\r\n containerEl.addEventListener(\"click\", onClickEvent);\r\n };\r\n\r\n const updateBarPercentage = (totalNumberOfReviews: number, starAmount: number) => {\r\n const barActiveEl = expressQuerySelector(barEl, \".m-review-bars__review-bar-active\", true);\r\n const percentage = totalNumberOfReviews > 0 ? starAmount * 100 / totalNumberOfReviews : 0;\r\n barActiveEl.style.width = percentage + \"%\";\r\n };\r\n\r\n const disable = () => {\r\n if (isEnabled()) containerEl.classList.remove(enabledClass);\r\n containerEl.classList.add(disabledClass);\r\n containerEl.removeEventListener(\"click\", onClickEvent);\r\n };\r\n\r\n const update = (totalNumberOfReviews: number, amount: number) => {\r\n quantityEl.innerHTML = amount + \"\";\r\n updateBarPercentage(totalNumberOfReviews, amount);\r\n if (amount > 0 && isDisabled()) enable();\r\n if (amount === 0 && isEnabled()) disable();\r\n };\r\n\r\n const init = () => {\r\n deInit();\r\n startValue = getStartValue();\r\n if (isEnabled()) containerEl.addEventListener(\"click\", onClickEvent);\r\n };\r\n\r\n const deInit = () => {\r\n if (isEnabled()) containerEl.removeEventListener(\"click\", onClickEvent);\r\n };\r\n\r\n const dispose = () => {\r\n deInit();\r\n };\r\n\r\n init();\r\n\r\n return {\r\n dispose,\r\n update,\r\n startValue\r\n };\r\n}\r\n","import {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener, expressQuerySelector, expressQuerySelectorAll, expressRemoveClass} from \"../common/html\";\r\nimport {createReviewBar} from \"../components/review-bar\";\r\n\r\n\r\nexport interface ICreateReviewBarsDependencies {\r\n readonly onClick: (stars: number) => void;\r\n}\r\n\r\nexport function createReviewBars(containerEl: HTMLElement, dependencies: ICreateReviewBarsDependencies) {\r\n\r\n let eventDisposable: IDisposable;\r\n const {onClick} = dependencies;\r\n\r\n const reviewBarEls = expressQuerySelectorAll(containerEl, '.m-review-bars__review-link, .m-review-bars__review-no-link');\r\n const reviewBarComponents: { dispose: () => void; update: (totalNumberOfReviews: number, amount: number) => void; startValue: number }[] = [];\r\n const reviewBarsTotalLinkEl = expressQuerySelector(containerEl, '.m-review-bars__reviews-link', true);\r\n\r\n const clearActiveBar = () => reviewBarEls.forEach(el => expressRemoveClass(el, 'm-review-bars__review-link--active'));\r\n\r\n const deinit = () => eventDisposable && eventDisposable.dispose();\r\n\r\n const updateAmounts = (totalReviews: number, starAmounts: { key: number, value: number }[], resetActiveBar = false) => {\r\n const replaceAmountBetweenParentheses = (text: string, amount: string): string => {\r\n return text.replace(/ \\([0-9]*?\\)/g, ' (' + amount + ')');\r\n };\r\n\r\n if (resetActiveBar) clearActiveBar();\r\n\r\n reviewBarComponents.forEach(barcomponent => {\r\n const reviewStar = starAmounts.find(x => x.key === barcomponent.startValue);\r\n barcomponent.update(totalReviews, !reviewStar ? 0 : reviewStar.value); // no reviews for star ? => reset\r\n });\r\n\r\n const innerTextEl = expressQuerySelector(reviewBarsTotalLinkEl, 'span', true);\r\n innerTextEl.innerText = replaceAmountBetweenParentheses(innerTextEl.innerText, totalReviews + \"\");\r\n };\r\n\r\n const init = () => {\r\n deinit();\r\n\r\n reviewBarEls.forEach(el => {\r\n reviewBarComponents.push(createReviewBar(el, {onClick, clearActiveBar}));\r\n });\r\n\r\n eventDisposable = compositeDisposable(\r\n [\r\n expressEventListener(reviewBarsTotalLinkEl, \"click\", () => {\r\n onClick(0);\r\n clearActiveBar();\r\n }),\r\n ]\r\n );\r\n };\r\n const dispose = () => {\r\n deinit();\r\n };\r\n\r\n init();\r\n\r\n return {\r\n dispose,\r\n updateAmounts\r\n };\r\n}\r\n","import {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener, expressQuerySelector} from \"../common/html\";\r\n\r\nexport interface ICreateReviewLanguageSelectDependencies {\r\n readonly onSelect: (language: string) => void;\r\n}\r\n\r\nexport function createReviewLanguageSelect(containerEl: HTMLElement, dependencies: ICreateReviewLanguageSelectDependencies) {\r\n let eventDisposable: IDisposable;\r\n const {onSelect} = dependencies;\r\n const languageSelectEl = expressQuerySelector(containerEl, \".technical-review-language-selector\", true);\r\n const deInit = () => eventDisposable && eventDisposable.dispose();\r\n\r\n const init = () => {\r\n deInit();\r\n eventDisposable = compositeDisposable(\r\n [\r\n expressEventListener(languageSelectEl, \"change\", () => {\r\n onSelect(languageSelectEl.value);\r\n }),\r\n ]\r\n );\r\n };\r\n\r\n const dispose = () => {\r\n deInit();\r\n };\r\n\r\n function selectedLanguage(): string {\r\n return languageSelectEl.value;\r\n }\r\n\r\n const updateAmounts = (reviewAmounts: { key: string, value: number }[]) => {\r\n let totalReviews = 0;\r\n let languagesCount = 0;\r\n\r\n const replaceAmountBetweenParentheses = (text: string, amount: string): string => {\r\n return text.replace(/ \\([0-9]*?\\)/g, ' (' + amount + ')');\r\n };\r\n\r\n [].slice.call(languageSelectEl.options).forEach(o => {\r\n const option = o as HTMLOptionElement;\r\n if (option.value === \"all\") {\r\n totalReviews = reviewAmounts.filter(r => r.key === option.value)[0].value;\r\n option.text = replaceAmountBetweenParentheses(option.text, totalReviews + \"\");\r\n } else if (option.value !== \"other\" && option.value !== \"all\") {\r\n const languageCount = reviewAmounts.filter(r => r.key === option.value)[0].value;\r\n languagesCount += languageCount;\r\n option.text = replaceAmountBetweenParentheses(option.text, languageCount + \"\");\r\n } else if (option.value === \"other\") {\r\n option.text = replaceAmountBetweenParentheses(option.text, (totalReviews - languagesCount) + \"\");\r\n }\r\n });\r\n };\r\n\r\n init();\r\n\r\n return {\r\n dispose,\r\n updateAmounts,\r\n selectedLanguage\r\n };\r\n}\r\n","import {expressQuerySelector, isElementVisible} from \"../common/html\";\r\nimport {IProductCategoryReviewsResult} from \"../services/content-service\";\r\nimport {createReviewBlocks} from \"../molecules/review-blocks\";\r\nimport {createPaginationControl, createShowMoreButton} from \"../molecules/review-blocks-controls\";\r\nimport {createReviewBars} from \"../molecules/review-bars\";\r\nimport {createReviewLanguageSelect} from \"../components/review-language-select\";\r\n\r\ninterface ICreateUserReviewsDependencies {\r\n readonly getReviewsAsync: (page: number, filter?: number, language?: string) => Promise;\r\n readonly totalAmountOfReviews: number;\r\n}\r\n\r\ninterface ICreateUserReviewsOptions {\r\n readonly numberOfReviewsToShow: number;\r\n readonly isMobile: boolean;\r\n readonly showLoadMoreButton: boolean;\r\n readonly startPageOffset: number;\r\n readonly productReviewsNameLabel: string;\r\n readonly productReviewsAnonymousLabel: string;\r\n}\r\n\r\nexport function createUserReviews(\r\n containerEl: HTMLElement,\r\n deps: ICreateUserReviewsDependencies,\r\n options: Partial,\r\n) {\r\n\r\n const {getReviewsAsync} = deps;\r\n let {totalAmountOfReviews} = deps; // change when results are loaded\r\n\r\n const {numberOfReviewsToShow = 5, startPageOffset = 0} = options;\r\n let {showLoadMoreButton = true} = options;\r\n const {productReviewsNameLabel, productReviewsAnonymousLabel} = options;\r\n\r\n let pageNumber = startPageOffset;\r\n let activeFilter: number | undefined = undefined;\r\n let activeLanguage: string | undefined = undefined;\r\n let reviewLanguageSelect;\r\n\r\n\r\n // review-blocks\r\n const reviewBlocksComponent = createReviewBlocks(\r\n expressQuerySelector(containerEl, '.m-review-blocks', true),\r\n {\r\n productReviewsNameLabel,\r\n productReviewsAnonymousLabel\r\n }\r\n );\r\n\r\n // show-more control\r\n const mobileControlEl = expressQuerySelector(\r\n containerEl,\r\n '.m-review-blocks-controls.u-hide-on-desktop-full',\r\n true\r\n );\r\n\r\n // pagination control\r\n const desktopControlEl = expressQuerySelector(\r\n containerEl,\r\n '.m-review-blocks-controls.u-hide-on-mobile-full',\r\n true\r\n );\r\n\r\n // amount of page to show\r\n const numberOfPages = Math.ceil(totalAmountOfReviews / numberOfReviewsToShow);\r\n\r\n const loadNextPage = (page?: number, filter?: number, language?: string, reset = false, scrollToTop = false) => {\r\n pageNumber++;\r\n let activeLanguageChanged = false;\r\n if (reset) {\r\n pageNumber = 1;\r\n showLoadMoreButton = true;\r\n loadMoreButtonComponent.show();\r\n loadMoreButtonComponent.enable();\r\n }\r\n\r\n if (page) pageNumber = page;\r\n\r\n if (filter !== undefined)\r\n activeFilter = filter;\r\n\r\n if (language !== undefined) {\r\n // if we change language we reset the star filter\r\n activeLanguageChanged = activeLanguage !== language;\r\n if (activeLanguageChanged) activeFilter = undefined;\r\n activeLanguage = language;\r\n } else {\r\n // if we click on something in the bars component we need to fetch the initial language (set with the backend code)\r\n if (reviewLanguageSelect && reviewLanguageSelect.selectedLanguage()) {\r\n activeLanguage = reviewLanguageSelect.selectedLanguage();\r\n }\r\n }\r\n\r\n loadMoreButtonComponent.disable();\r\n getReviewsAsync(pageNumber, activeFilter, activeLanguage)\r\n .then(res => {\r\n const reviews = res.productCategoryReviews;\r\n reviewBlocksComponent.addReviews(reviews, reset);\r\n totalAmountOfReviews = res.totalAmountOfReviews;\r\n\r\n showLoadMoreButton = totalAmountOfReviews >= pageNumber * numberOfReviewsToShow;\r\n\r\n if (reviewBarsComponent && res.starAmounts) {\r\n reviewBarsComponent.updateAmounts(res.totalAmountOfReviews, res.starAmounts, activeLanguageChanged);\r\n // for the page component we need to pass the total of the filtered star amounts\r\n if (activeFilter) {\r\n const filteredAmount = res.starAmounts.filter(a => a.key === activeFilter)[0];\r\n if (filteredAmount) {\r\n totalAmountOfReviews = filteredAmount.value;\r\n showLoadMoreButton = totalAmountOfReviews >= pageNumber * numberOfReviewsToShow;\r\n }\r\n }\r\n }\r\n\r\n })\r\n .then(() => {\r\n\r\n // TODO: function to update ui for components\r\n if (!showLoadMoreButton) {\r\n loadMoreButtonComponent.hide();\r\n loadMoreButtonComponent.disable();\r\n } else\r\n loadMoreButtonComponent.enable();\r\n\r\n // update pagination controls\r\n paginationControlComponent.updatePaginations(\r\n Math.ceil(totalAmountOfReviews / numberOfReviewsToShow),\r\n pageNumber,\r\n );\r\n\r\n if (scrollToTop) {\r\n containerEl.scrollIntoView( { behavior: \"smooth\", block: \"start\" });\r\n }\r\n });\r\n };\r\n\r\n // pagination desktop-control\r\n const paginationControlComponent = createPaginationControl(\r\n desktopControlEl,\r\n {\r\n numberOfPages,\r\n onClick: page => loadNextPage(page, undefined, undefined, true, true),\r\n }\r\n );\r\n\r\n // show-more control\r\n const loadMoreButtonComponent = createShowMoreButton(\r\n mobileControlEl,\r\n {\r\n onClick: loadNextPage,\r\n }\r\n );\r\n\r\n // review-bars-links\r\n const reviewBarsComponent = createReviewBars(\r\n expressQuerySelector(containerEl, '.m-review-bars', true),\r\n {\r\n onClick: filter => loadNextPage(undefined, filter, undefined, true)\r\n },\r\n );\r\n\r\n // review-language-select (Is not always visible => if there is only one language, there's no need to show a language filter)\r\n const languageSelectorContainerEl = expressQuerySelector(containerEl, '.technical-review-language-selector-container', false);\r\n if (languageSelectorContainerEl)\r\n reviewLanguageSelect = createReviewLanguageSelect(\r\n languageSelectorContainerEl,\r\n {\r\n onSelect: lang => loadNextPage(undefined, undefined, lang, true)\r\n }\r\n );\r\n\r\n // don't show control if all reviews are already loaded\r\n if (!showLoadMoreButton) {\r\n loadMoreButtonComponent.hide();\r\n }\r\n\r\n const isMobileControl = () => !isElementVisible(desktopControlEl);\r\n\r\n let isMobile = isMobileControl();\r\n\r\n const onWindowResize = () => {\r\n // if changed -> reset\r\n const isMobileOnResize = isMobileControl();\r\n if (isMobile !== isMobileOnResize) {\r\n loadNextPage(1, activeFilter, activeLanguage, true);\r\n isMobile = isMobileOnResize;\r\n }\r\n };\r\n\r\n window.addEventListener('resize', onWindowResize);\r\n\r\n return {\r\n dispose: () => window.removeEventListener('resize', onWindowResize),\r\n };\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 (price.Currency.DisplayLeftToPrice)\r\n\t\tformattedPrice += price.Currency.CurrencySymbol + ' ' + replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator);\r\n\telse\r\n\t\tformattedPrice += replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator) + ' ' + price.Currency.CurrencySymbol;\r\n\treturn formattedPrice;\r\n}\r\n\r\n","import { createGeneralPageEventsAndComponents } from \"../components/page-general\";\r\nimport {\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\tgetParentWithClassName,\r\n\thasClass,\r\n\thide,\r\n\tshow\r\n} from \"../common/html\";\r\n\r\nimport { getCollapsibleContent, getTabContent } from \"../services/content-service\";\r\nimport { createTruncate } from \"../components/truncate\";\r\nimport { createSteps, IPriceDetails, IStepsComponent } from \"../components/steps\";\r\nimport { createPopup, IPopup } from \"../components/popup-new\";\r\nimport { createFlipBook } from \"../components/my-namebook\";\r\nimport { CreateTabs, ITabContentRequest } from \"../components/tab\";\r\nimport { createCollapsable, ICollapsibleContentRequest, ICreateCollapsableDependencies } from \"../components/collapsable\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { createPromotionBar } from \"../components/promotion-bar\";\r\nimport { createPopupLauncher } from \"../components/popup-launcher\";\r\nimport { GetProductCategoryReviews } from \"../services/reviews-service\";\r\nimport { getStepContent } from \"../services/steps-service\";\r\nimport { createCarrousel } from \"../molecules/carrousel\";\r\nimport {\r\n\tcreateCustomSlider,\r\n\tICustomPhotoSliderItem,\r\n\tICustomPhotoSliderWithDivSettings\r\n} from \"../components/customslider\";\r\nimport { createUserReviews } from \"../organisms/user-reviews\";\r\nimport { initTooltip, IToolTip } from \"../components/tooltip\";\r\nimport { getPrice, IProductPriceDetails } from \"../services/order-service\";\r\nimport { getCookie } from \"../utils/cookie\";\r\nimport { formatPrice } from \"../utils/price\";\r\n\r\nwindow.addEventListener('DOMContentLoaded', () => {\r\n\r\n\t// Promotion bar\r\n\tconst promotionBar = expressQuerySelector(document, '.technical-promotion-bar', false);\r\n\tif (promotionBar)\r\n\t\tcreatePromotionBar(promotionBar);\r\n\r\n\tcreateGeneralPageEventsAndComponents();\r\n\r\n\tlet stepsComponent: IStepsComponent;\r\n\tlet optionPricePopups: { id: string, popup: IPopup }[];\r\n\tlet priceDetails: IPriceDetails;\r\n\tlet productCategory = '';\r\n\tlet stepsTheme = '';\r\n\r\n\tconst init = () => {\r\n\t\tconst carrouselContainer = expressQuerySelector(document, '.m-carrousel', false);\r\n\t\tconst productDescriptionEls = expressQuerySelectorAll(document, '.technical-product-description');\r\n\t\tconst stepsEl = expressQuerySelector(document, '#stepsContainer');\r\n\t\tconst tabContainerEls = expressQuerySelectorAll(document, '.technical-product-tabs');\r\n\t\tstepsTheme = stepsEl.dataset.theme || '';\r\n\t\tconst collapsableDeps = {\r\n\t\t\tcontentSelector: '.m-collapsable__content',\r\n\t\t\ttitleElSelector: '.m-collapsable__title',\r\n\t\t\tscrollIntoViewAfterOpen: false\r\n\t\t} as ICreateCollapsableDependencies;\r\n\r\n\t\tif (stepsEl) {\r\n\t\t\tstepsComponent = createSteps(stepsEl, {\r\n\t\t\t\tgetStepContentAsync,\r\n\t\t\t\tcarrouselContainer,\r\n\t\t\t\tpriceDetails\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tcarrouselContainer && createCarrousel(carrouselContainer);\r\n\t\t}\r\n\t\tproductDescriptionEls && productDescriptionEls.forEach(el => initTruncate(el));\r\n\t\tloadProductCategoryReviews();\r\n\t\tproductCategory = stepsEl.dataset.pc || '';\r\n\t\toptionPricePopups = [];\r\n\r\n\t\tconst getPvcFromStepsComponent = () => {\r\n\t\t\tconst ctaButtonUrl = stepsComponent.ctaButton.buttonEl.getAttribute('href') ?? stepsComponent.mobileCtaButton.buttonEl.getAttribute('href');\r\n\t\t\treturn ctaButtonUrl && getParameter('pvc', ctaButtonUrl, false) || '';\r\n\t\t};\r\n\r\n\t\t// Tabs\r\n\t\tif (tabContainerEls && tabContainerEls.length > 0) {\r\n\t\t\ttabContainerEls.forEach(tabContainerEl => {\r\n\t\t\t\tconst tabEl = expressQuerySelector(tabContainerEl, '.m-tabs', false);\r\n\t\t\t\tif (tabEl) {\r\n\t\t\t\t\tconst initCollapsables = (tabContentEl: HTMLElement) => {\r\n\t\t\t\t\t\tconst collapsableEls = expressQuerySelectorAll(tabContentEl, '.m-collapsable');\r\n\t\t\t\t\t\tif (collapsableEls && collapsableEls.length > 0)\r\n\t\t\t\t\t\t\tcollapsableEls.forEach(el => createCollapsable(el, collapsableDeps));\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst onBeforeOpen = (tabContentEl: HTMLElement): Promise => {\r\n\t\t\t\t\t\tif (!tabContentEl) return Promise.resolve();\r\n\t\t\t\t\t\tif (tabContentEl.innerHTML.trim() !== '') {\r\n\t\t\t\t\t\t\tinitCollapsables(tabContentEl);\r\n\t\t\t\t\t\t\treturn Promise.resolve();\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif (!tabContentEl.dataset.url) return Promise.resolve();\r\n\t\t\t\t\t\t\treturn getTabContent({ id: tabContentEl.dataset.url, productCategory: productCategory, theme: stepsTheme } as ITabContentRequest).then(res => {\r\n\t\t\t\t\t\t\t\ttabContentEl.insertAdjacentHTML(\"afterbegin\", res);\r\n\t\t\t\t\t\t\t\tinitCollapsables(tabContentEl);\r\n\t\t\t\t\t\t\t\t// Init popup launchers\r\n\t\t\t\t\t\t\t\tconst popupLauncherEls = expressQuerySelectorAll(tabContentEl, '.technical-popup-launcher');\r\n\t\t\t\t\t\t\t\tpopupLauncherEls.forEach(el => createPopupLauncher(el));\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\tCreateTabs(tabContainerEl, { onBeforeOpen });\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Collapsable elements\r\n\t\tconst collapsableContainerEl = expressQuerySelector(document, \".technical-collapsables\", false);\r\n\t\tif (collapsableContainerEl) {\r\n\t\t\tconst collapsableEls = expressQuerySelectorAll(collapsableContainerEl, \".m-collapsable\");\r\n\t\t\tcollapsableEls.forEach(el => {\r\n\t\t\t\tconst type = el.dataset.type || '';\r\n\t\t\t\tconst contentEl = expressQuerySelector(el, '.technical-collapse-content', false);\r\n\r\n\t\t\t\tconst initPriceDetails = (selectEl: HTMLSelectElement, listEls: HTMLElement[]): IPriceDetails => {\r\n\t\t\t\t\tconst onSelect = () => {\r\n\t\t\t\t\t\tlistEls.forEach(el => hide(el));\r\n\t\t\t\t\t\tlistEls.forEach(el => {\r\n\t\t\t\t\t\t\tconst index = el.dataset.index || -1;\r\n\t\t\t\t\t\t\tif (index === selectEl.value) show(el);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst selectPvc = (pvc: string) => {\r\n\t\t\t\t\t\tconst options = Array.from(selectEl.options);\r\n\t\t\t\t\t\tconst optionToSelect = options.find(item => item.dataset.pvc.toLowerCase() === pvc.toLowerCase());\r\n\t\t\t\t\t\tif (optionToSelect) optionToSelect.selected = true;\r\n\t\t\t\t\t\tonSelect();\r\n\t\t\t\t\t};\r\n\t\t\t\t\texpressEventListener(selectEl, 'change', onSelect);\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tselectPvc: (pvc: string) => selectPvc(pvc)\r\n\t\t\t\t\t} as IPriceDetails;\r\n\t\t\t\t};\r\n\t\t\t\tconst getCollapseContent = (): Promise => {\r\n\t\t\t\t\tif (contentEl.innerHTML.trim()) return Promise.resolve();\r\n\r\n\t\t\t\t\treturn getCollapsibleContent({ type: type, theme: stepsTheme, productCategory: productCategory, selectedPvc: getPvcFromStepsComponent() } as ICollapsibleContentRequest).then(res => {\r\n\t\t\t\t\t\tif (res) {\r\n\t\t\t\t\t\t\tcontentEl.insertAdjacentHTML(\"afterbegin\", res);\r\n\r\n\t\t\t\t\t\t\t// Info links in the options collapse\r\n\t\t\t\t\t\t\tconst moreInfoLinkEls = expressQuerySelectorAll(contentEl, '.technical-option-price-more-info-link');\r\n\t\t\t\t\t\t\tif (moreInfoLinkEls && moreInfoLinkEls.length > 0) {\r\n\t\t\t\t\t\t\t\tconst initOptionPricesMoreInfoLink = (moreInfoLinkEl: HTMLElement) => {\r\n\t\t\t\t\t\t\t\t\tconst init = (popupEl: HTMLElement) => {\r\n\t\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\t\tconst quantityBreakListItemContainer = expressQuerySelector(popupEl, \".p-option-price-details__body-container\", true);\r\n\t\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\t\tconst noOptionsDiv = expressQuerySelector(popupEl, \"#noOptionsDiv\", true);\r\n\t\t\t\t\t\t\t\t\t\tconst onChange = () => pvcSelectChange();\r\n\t\t\t\t\t\t\t\t\t\tconst pvcSelectChange = (selectedValue?: string) => {\r\n\t\t\t\t\t\t\t\t\t\t\tlet visibleItems = 0;\r\n\t\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\t\telse {\r\n\t\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\t\tconst selectedOption = options.find(o => o.value.toLowerCase() === selectedValue.toLowerCase());\r\n\t\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\t}\r\n\t\t\t\t\t\t\t\t\t\t\tquantityBreakListItems.forEach(item => {\r\n\t\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\t\tif (itemPvc.toLowerCase() == selectedValue.toLowerCase()) {\r\n\t\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\t\tvisibleItems++;\r\n\t\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\t\thide(item);\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});\r\n\t\t\t\t\t\t\t\t\t\t\tif (visibleItems > 0) {\r\n\t\t\t\t\t\t\t\t\t\t\t\thide(noOptionsDiv);\r\n\t\t\t\t\t\t\t\t\t\t\t\tshow(quantityBreakListItemContainer);\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\tshow(noOptionsDiv);\r\n\t\t\t\t\t\t\t\t\t\t\t\thide(quantityBreakListItemContainer);\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 (quantityBreakListItemContainer && quantityBreakListItems && noOptionsDiv) {\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\tif (!pvcSelect) return;\r\n\t\t\t\t\t\t\t\t\t\t\tconst currentPvc = getPvcFromStepsComponent();\r\n\t\t\t\t\t\t\t\t\t\t\tif (currentPvc) pvcSelectChange(currentPvc);\r\n\t\t\t\t\t\t\t\t\t\t\telse pvcSelectChange();\r\n\t\t\t\t\t\t\t\t\t\t\texpressEventListener(pvcSelect, 'change', onChange);\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\tconst showOptionPricePopup = () => {\r\n\r\n\t\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\t\tif (contentKey) {\r\n\t\t\t\t\t\t\t\t\t\t\tlet uniqueId = contentKey;\r\n\t\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\t\tif (optionPricePopups.filter(p => p.id === uniqueId).length <= 0) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tcreatePopup({\r\n\t\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\t\tview: 'OptionPriceDetailsDialog',\r\n\t\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\t\tproductCategoryOptionContentKey: contentKey,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tpvc: getPvcFromStepsComponent()\r\n\t\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\tonBeforeOpen: popupEl => init(popupEl)\r\n\t\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\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\t\toptionPricePopups.push({ \"id\": uniqueId, \"popup\": popup });\r\n\t\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\t});\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\tconst popup = optionPricePopups.filter(p => p.id === uniqueId);\r\n\t\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\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\tconst onClick = (e: Event) => {\r\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\r\n\t\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\t\tshowOptionPricePopup();\r\n\t\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t\tif (moreInfoLinkEl) expressEventListener(moreInfoLinkEl, 'click', onClick);\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\tmoreInfoLinkEls.forEach(el => initOptionPricesMoreInfoLink(el));\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// PriceDetails collapse\r\n\t\t\t\t\t\t\tconst priceDetailsSelectEl = expressQuerySelector(contentEl, '.technical-price-break-select', false);\r\n\t\t\t\t\t\t\tconst priceDetailsListEls = expressQuerySelectorAll(contentEl, '.technical-price-break-list');\r\n\t\t\t\t\t\t\tif (priceDetailsSelectEl && priceDetailsListEls) {\r\n\t\t\t\t\t\t\t\tpriceDetails = initPriceDetails(priceDetailsSelectEl, priceDetailsListEls);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// If the content has collapsable element => init them\r\n\t\t\t\t\t\t\tconst collapsableEls = expressQuerySelectorAll(contentEl, '.m-collapsable');\r\n\t\t\t\t\t\t\tif (collapsableEls && collapsableEls.length > 0)\r\n\t\t\t\t\t\t\t\tcollapsableEls.forEach(el => createCollapsable(el, collapsableDeps));\r\n\r\n\t\t\t\t\t\t\t// Init popup launchers\r\n\t\t\t\t\t\t\tconst popupLauncherEls = expressQuerySelectorAll(contentEl, '.technical-popup-launcher');\r\n\t\t\t\t\t\t\tpopupLauncherEls.forEach(el => createPopupLauncher(el));\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\tif (contentEl && type) {\r\n\t\t\t\t\tcollapsableDeps.onBeforeOpen = getCollapseContent;\r\n\t\t\t\t}\r\n\t\t\t\tcreateCollapsable(el, collapsableDeps);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Product preview button?\r\n\t\tconst productPreviews = expressQuerySelectorAll(document, '.technical-product-preview');\r\n\t\tproductPreviews.forEach((productPreview) => {\r\n\t\t\tproductPreview.addEventListener('click', () => {\r\n\t\t\t\tcreatePopup({\r\n\t\t\t\t\tdata: {\r\n\t\t\t\t\t\tProductCategory: productPreview.dataset['category']\r\n\t\t\t\t\t},\r\n\t\t\t\t\tdialogId: 'productPreview',\r\n\t\t\t\t\tview: 'ProductPreviewDialog'\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().then(() => {\r\n\t\t\t\t\t\tcreateFlipBook(expressQuerySelector(popup.popup, '.technical-flipbook-viewer'));\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\t// User generated content slider\r\n\t\tconst ucgSliders = expressQuerySelectorAll(document, '.technical-slider');\r\n\t\tucgSliders.forEach(x => initGeneratedContentSlider(x));\r\n\t};\r\n\r\n\tconst getStepContentAsync = (selectedAttributeValueMa: string[], stepIndex: number, optionGroup?: string, targetDeliveryDate?: string, purpose?: string, occasion?: string, preselectedOccasion?: string, theme?: string) => {\r\n\t\tif (productCategory && selectedAttributeValueMa && stepIndex)\r\n\t\t\treturn getStepContent(productCategory, selectedAttributeValueMa, stepIndex, optionGroup, targetDeliveryDate, purpose, occasion, preselectedOccasion, theme ?? stepsTheme);\r\n\t\telse\r\n\t\t\treturn Promise.resolve(\"\");\r\n\t};\r\n\r\n\tconst initTruncate = (productDescriptionEl: HTMLElement) => {\r\n\t\tconst truncateEl = expressQuerySelector(productDescriptionEl, '.technical-shave', false);\r\n\t\tif (!truncateEl) return;\r\n\t\tcreateTruncate(truncateEl, {\r\n\t\t\tlines: parseInt(truncateEl.dataset.lines, 10) || 0\r\n\t\t});\r\n\t};\r\n\r\n\tconst loadProductCategoryReviews = () => {\r\n\t\tconst userReviewsSectionEl = expressQuerySelector(document, \".o-user-reviews\", false);\r\n\t\tconst productCategoryId = userReviewsSectionEl && userReviewsSectionEl.getAttribute('data-prod-cat-id');\r\n\t\tconst theme = userReviewsSectionEl && userReviewsSectionEl.getAttribute('data-theme') || stepsTheme;\r\n\t\tconst nameLabel = userReviewsSectionEl && userReviewsSectionEl.getAttribute('data-namelabel') || '';\r\n\t\tconst anonymousLabel = userReviewsSectionEl && userReviewsSectionEl.getAttribute('data-anonymouslabel') || '';\r\n\r\n\t\tif (productCategoryId && userReviewsSectionEl) {\r\n\t\t\tconst reviewsContainerEl = expressQuerySelector(userReviewsSectionEl, '.m-review-blocks', true);\r\n\r\n\t\t\tconst numberOfReviewsToShow = parseInt(reviewsContainerEl.getAttribute('data-amount-review-to-show')!, 10);\r\n\t\t\tconst totalAmountOfReviews = parseInt(expressQuerySelector(userReviewsSectionEl, '.m-review-bars__total-reviews', true)\r\n\t\t\t\t.getAttribute('data-total-reviews')!, 10);\r\n\r\n\t\t\tconst showLoadMoreButton = numberOfReviewsToShow < totalAmountOfReviews;\r\n\r\n\t\t\tconst getReviewsAsync = (page: number, filter?: number, lang?: string) => {\r\n\t\t\t\treturn GetProductCategoryReviews(productCategoryId, page, filter, lang, theme);\r\n\t\t\t};\r\n\r\n\t\t\tcreateUserReviews(\r\n\t\t\t\tuserReviewsSectionEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetReviewsAsync,\r\n\t\t\t\t\ttotalAmountOfReviews,\r\n\t\t\t\t},\r\n\t\t\t\t{\r\n\t\t\t\t\tnumberOfReviewsToShow,\r\n\t\t\t\t\tshowLoadMoreButton,\r\n\t\t\t\t\tstartPageOffset: 1,\r\n\t\t\t\t\tproductReviewsNameLabel: nameLabel,\r\n\t\t\t\t\tproductReviewsAnonymousLabel: anonymousLabel,\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tconst getAndSetPrice = async (toolTipcontainerEl: HTMLElement, pvc: string, options: string[], quantity: number) => {\r\n\t\tconst priceResult = await getPrice(pvc, quantity, 0, options, getCookie(\"promo\"));\r\n\t\tconst priceEls = expressQuerySelectorAll(toolTipcontainerEl, '.technical-price-tag');\r\n\t\tconst templateEl = expressQuerySelectorAll(toolTipcontainerEl, '.technical-price-template')[0];\r\n\t\tconst containerEl = expressQuerySelector(toolTipcontainerEl, '.technical-price-container', true);\r\n\r\n\t\tcontainerEl.innerHTML = '';\r\n\t\tpriceResult.Price && priceEls.forEach(el => el.innerHTML = formatPrice(priceResult.Price));\r\n\t\tpriceResult.PriceItems && priceResult.PriceItems.forEach(item => {\r\n\t\t\t// no item properties to set => skip\r\n\t\t\tif (!item.Description && !item.CalculationDescription && !item.ItemTotal)\r\n\t\t\t\treturn;\r\n\r\n\t\t\tconst newEl = templateEl.cloneNode(true) as HTMLElement;\r\n\t\t\tconst description = expressQuerySelector(newEl, '.technical-price-tooltip-description', true);\r\n\t\t\titem.Description ? description.innerHTML = item.Description : description.remove();\r\n\r\n\t\t\tconst calculation = expressQuerySelector(newEl, '.technical-price-tooltip-calculation', true);\r\n\t\t\titem.CalculationDescription ? calculation.innerHTML = item.CalculationDescription : calculation.remove();\r\n\r\n\t\t\tconst result = expressQuerySelector(newEl, '.technical-price-tooltip-result', true);\r\n\t\t\titem.ItemTotal ? result.innerHTML = item.ItemTotal : result.remove();\r\n\r\n\t\t\tcontainerEl.insertAdjacentElement('beforeend', newEl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst initGeneratedContentSlider = (ucgSlider: HTMLElement) => {\r\n\t\t// convert so slider elements\r\n\t\tconst sliderElements: ICustomPhotoSliderItem[] = [];\r\n\t\tfor (let z = 0, l = ucgSlider.children.length; z < l; z++)\r\n\t\t\tsliderElements.push({ template: ucgSlider.children[z] as HTMLElement });\r\n\r\n\t\t// settings for slider\r\n\t\tconst settings: ICustomPhotoSliderWithDivSettings = {\r\n\t\t\tsliderElements: sliderElements,\r\n\t\t\tsliderContainerSettings: {\r\n\t\t\t\textraSliderClass: 'm-product-slider__slider-container',\r\n\t\t\t\telementsContainerSettings: {\r\n\t\t\t\t\textraSliderClass: 'm-product-slider__slider-content',\r\n\t\t\t\t\tslideClicked: (e: Event, settings: ICustomPhotoSliderWithDivSettings) => {\r\n\t\t\t\t\t\tconst selectedSlide = ((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\tif (!selectedSlide) return;\r\n\r\n\t\t\t\t\t\tconst selectedSlideSrc = selectedSlide instanceof HTMLVideoElement ? expressQuerySelector(selectedSlide, 'source')?.src : selectedSlide.src;\r\n\t\t\t\t\t\tconst sliderElementIndex = settings.sliderElements.findIndex(x => {\r\n\t\t\t\t\t\t\tif (!x.template) return;\r\n\t\t\t\t\t\t\tconst sliderItemTemplate = expressQuerySelector(x.template, 'img') || expressQuerySelector(x.template, 'picture') || expressQuerySelector(x.template, 'video > source');\r\n\t\t\t\t\t\t\treturn sliderItemTemplate && (sliderItemTemplate.dataset.src || sliderItemTemplate.src) === selectedSlideSrc;\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tconst slider = getParentWithClassName(selectedSlide, 'technical-ugc-slider');\r\n\t\t\t\t\t\tlet tooltipComponent: IToolTip;\r\n\t\t\t\t\t\tcreatePopup({\r\n\t\t\t\t\t\t\tdialogId: `UGC_${sliderElementIndex}`,\r\n\t\t\t\t\t\t\tview: 'UserGeneratedContent',\r\n\t\t\t\t\t\t\tdata: {\r\n\t\t\t\t\t\t\t\tUserGeneratedContentContentkey: slider && slider.dataset.ugccontentkey,\r\n\t\t\t\t\t\t\t\tProductCategoryContentKey: slider && slider.dataset.productcategorycontentkey,\r\n\t\t\t\t\t\t\t\tSelectedIndex: sliderElementIndex\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tonOpen: (popupEl: HTMLElement) => {\r\n\t\t\t\t\t\t\t\ttooltipComponent && tooltipComponent.dispose();\r\n\r\n\t\t\t\t\t\t\t\tconst priceContainer = expressQuerySelector(popupEl, '.technical-header-price-container', false);\r\n\t\t\t\t\t\t\t\tif (priceContainer) {\r\n\t\t\t\t\t\t\t\t\tconst button = expressQuerySelector(popupEl, '.technical-continue-button', true);\r\n\t\t\t\t\t\t\t\t\tconst tooltip = expressQuerySelector(popupEl, '.technical-price-tooltip', true);\r\n\t\t\t\t\t\t\t\t\tconst pvc = getParameter('pvc', button.getAttribute('href'));\r\n\t\t\t\t\t\t\t\t\tconst options = getParameter('options', button.getAttribute('href'))?.split(',');\r\n\t\t\t\t\t\t\t\t\tconst quantity = parseInt(button.dataset.quantity, 10) || 1;\r\n\r\n\t\t\t\t\t\t\t\t\ttooltipComponent = initTooltip({\r\n\t\t\t\t\t\t\t\t\t\topenClass: 'is-tooltip-open',\r\n\t\t\t\t\t\t\t\t\t\tcontainerEl: tooltip,\r\n\t\t\t\t\t\t\t\t\t\tbuttonEl: expressQuerySelector(priceContainer, '.technical-price-info-icon', true),\r\n\t\t\t\t\t\t\t\t\t\tonOpen: () => getAndSetPrice(priceContainer, pvc, options, quantity)\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tconst buttons = popupEl.querySelectorAll('button[href]');\r\n\t\t\t\t\t\t\t\tbuttons.forEach(el => {\r\n\t\t\t\t\t\t\t\t\tel.addEventListener('click', (ev) => {\r\n\t\t\t\t\t\t\t\t\t\tev.preventDefault();\r\n\r\n\t\t\t\t\t\t\t\t\t\tconst externalLink = el.getAttribute('data-external');\r\n\t\t\t\t\t\t\t\t\t\tconst link = el.getAttribute('href');\r\n\t\t\t\t\t\t\t\t\t\tif (externalLink) {\r\n\t\t\t\t\t\t\t\t\t\t\twindow.open(link, '_blank').focus();\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\twindow.location.href = link;\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},\r\n\t\t\t\t\t\t\tonClose: () => { tooltipComponent && tooltipComponent.dispose(); }\r\n\t\t\t\t\t\t}).then(res => res.openAsync());\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\ttranslateForMovement: false,\r\n\t\t};\r\n\r\n\t\t// create slider\r\n\t\tif (ucgSlider.parentElement) createCustomSlider(ucgSlider.parentElement, settings);\r\n\t};\r\n\r\n\tinit();\r\n});\r\n"],"names":["escapeForJavascript","str","replace","onlyLetters","input","Boolean","match","onlyNumber","toUrlHash","toLowerCase","stringToBase64","inputString","bytes","TextEncoder","encode","binString","Array","from","byte","String","fromCodePoint","join","window","btoa","redirectTo500","location","pathname","indexOf","redirectToLogin","logError","errorLog","__awaiter","postRequest","headers","Headers","http","path","config","keepCase","finalPath","request","Request","fetch","then","res","ok","json","catch","HandleError","status","statusText","_","Promise","reject","error","httpText","response","getHttpResponse","text","context","apiFailMsg","startsWith","ecomApiUrl","line","message","process","url","getRequest","init","method","body","traditionalBody","Object","assign","URLSearchParams","JSON","stringify","getHtmlRequest","postHtmlRequest","isValidPartialViewResponse","logErrorEvent","event","errorEv","filename","lineno","colno","msg","col","lastLoggedError","totalLoggedErrors","urlString","errorString","isArray","errorLogStrings","length","i","toString","val","key","stack","exc","getCookie","cName","allCookies","document","cookie","cStart","cEnd","unescape","substring","writeCookie","cValue","extraDays","d","Date","setTime","getTime","expires","toUTCString","encodeURIComponent","writeCookieThatExpiresAtTheEndOfTheDay","getFullYear","getMonth","getDate","expressQuerySelector","el","selectors","isRequired","resultEl","querySelector","Error","hasClass","element","cssClass","regex","RegExp","className","expressEventListener","type","listener","useCapture","disposable","dispose","handler","removeEventListener","ev","addEventListener","expressQuerySelectorAll","slice","call","querySelectorAll","expressAddClass","expressToggleClass","expressRemoveClass","on","source","show","offsetParent","style","display","getComputedStyle","hide","getHeightWithMargins","getBoundingClientRect","height","parseInt","marginTop","marginBottom","getParentWithClassName","parentElement","classList","contains","getParents","elem","selector","Element","prototype","matches","webkitMatchesSelector","s","this","ownerDocument","item","parentNode","parents","push","htmlToElement","html","template","createElement","trim","innerHTML","content","firstChild","isMobileOnPageWithHeader","isElementVisible","offsetWidth","offsetHeight","width","isElementVisibleInViewPort","rect","top","left","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isElementPartiallyVisibleInViewport","percentVisible","windowHeight","Math","floor","remove","removeChild","pageVisibilityChange","onVisible","onHidden","hidden","visibilityState","visibilityChange","mozHidden","msHidden","webkitHidden","setTimeout","createClickableElement","onClick","options","clickEvent","enable","disable","onClicked","e","preventDefault","stopPropagation","addClickEvent","createButton","buttonEl","removeAttribute","setAttribute","createCollapsable","container","deps","opts","singleOpen","swapTitleDataAttribute","onInit","onBeforeOpen","onBeforeClose","titleElSelector","scrollIntoViewAfterOpen","contentSelector","openClass","OPEN_CLASS","titleEl","contentEl","origTitle","collapseTitle","innerText","getAttribute","closeWithBefore","close","resolve","openWithBefore","scrollIntoView","open","shouldScrollIntoView","forEach","add","behavior","block","button","autocomplete","settings","doc","containerStyle","userAgent","navigator","mobileFirefox","debounceWaitMs","preventSubmit","keyUpEventName","items","inputValue","minLen","showOnFocus","selected","debounceTimer","keypressCounter","undefined","minLength","clearDebounceTimer","clearTimeout","containerDisplayed","clear","detach","parent","update","render","currentValue","itemElement","textContent","label","renderGroup","groupName","groupDiv","fragment","createDocumentFragment","prevGroup","group","appendChild","div","onSelect","emptyMsg","empty","attach","updatePosition","inputRect","maxHeight","calc","docEl","clientTop","clientLeft","scrollTop","pageYOffset","scrollLeft","pageXOffset","customize","updateScroll","elements","getElementsByClassName","previous","previousElementSibling","offsetTop","selectBottom","containerBottom","updateIfDisplayed","resizeEventHandler","scrollEventHandler","target","keyupEventHandler","keyCode","which","ignore","startFetch","keydownEventHandler","containerIsDisplayed","selectPrev","disableAutoSelect","selectNext","focusEventHandler","trigger","savedKeypressCounter","value","blurEventHandler","activeElement","position","evt","focus","destroy","compositeDisposable","disposables","composite","addDisposable","addMany","addDisposables","createBaseFormInput","containerEl","altSelector","inputEl","errorParagraphEl","toggleEnable","attr","force","toggleAttribute","clearValue","setError","doClear","createSelectBox","onSelected","baseComponent","selectEl","disposableEvent","setValue","getValue","createFormInput","isCheckBox","checked","createPasswordFormInput","formInput","iconEl","onPasswordShowHideIconClick","addEvent","validatePassword","dataset","Number","minlength","password","cursor","createTextInputWithAutoComplete","onCloseDisposable","autoCompleteSearch","onOpen","onClose","renderTextContent","containerInsertPosition","containerClass","autocompleteResult","itemEl","insertAdjacentElement","onMouseDownEvent","Gender","UpdateAccountResult","ChangePasswordStatus","OkResult","initForm","formEl","alternativeButton","onSubmitForm","buttonSelector","submitOnEnter","validatorOptions","submitButtonEl","validator","createFormValidator","onKeyUpEvent","formElements","inputs","filter","email","attributes","getNamedItem","maxLength","id","getInputs","keys","map","clearAll","clearValues","resetValidation","reset","validate","validations","name","all","onSubmit","data","formData","submitButton","getInputByName","disableForm","disableInput","setErrors","errors","clearInputs","names","clearInput","setValues","values","v","hideInput","form","classTo","errorClass","successClass","errorTextClass","errorTextParent","errorTextTag","onValidate","Pristine","subscribeAsync","appId","posId","lang","subscription","applicationId","pointOfSaleId","language","toggleSubscribeAsync","personId","newsletter","personalMessage","mailFrequency","postalMail","emarsysData","toggleSubscription","getFullQuerystring","pos","href","getParameters","pairs","split","params","pair","getParameter","required","queryStringParam","updateParameter","newAdditionalURL","tempArray","hash","additionalURL","baseURL","temp","result","addParameter","objectToQueryString","o","trackEvent","category","action","customParameters","dataLayer","trackOrderStatusEvent","partialEventParams","nrOrdersInAccount","nrItemsInOrder","accountId","trackComponentEvent","trackSliderEvent","eventParams","trackAccountPrefEvent","ProductEvent","isValidTextWithoutAngleBrackets","test","isValidEmailAddress","punycode","toUnicode","isValidWithoutNonAlphaNumericCharsAtEnd","reg","elName","alsoAlsoAllowBracket","last","charAt","canNotContainOnlyNumerics","isValidOrderNumber","orderNr","isTempAccountEmail","createNewsletterSubscribeAndUnsubscribe","customDocument","subscriptionForms","unSubscriptionForms","ioSubscribe","IntersectionObserverEntry","IntersectionObserver","entries","observer","entry","isIntersecting","createNewsletterSubscribe","unobserve","rootMargin","observe","formEL","ioUnSubscribe","createNewsletterUnsubscribe","emailEl","emptyGuid","appid","posid","sourceid","finally","page","pageName","successMessageEl","errorMessageEl","checkBoxEl","preFillLastUsedEmail","showSuccessMessage","personIdFromQuery","onSuccess","onError","isTouchDevice","PointerEvent","maxTouchPoints","matchMedia","TouchEvent","isMobileDevice","debounce","fn","delay","timeoutID","args","apply","throttle","fnAlways","lastTimestamp","now","initNavigationDesktop","firstLevelMenuEls","loadDesktopMenuItemAsync","loadedMenuItemsKeys","firstLevelActiveClass","closeMenu","currentTarget","closeFirstLevelMenuItemAndResetChildMenus","menuItem","closeAllSecondLevelMenuItemsAndResetChildMenus","secondLevelMenuEl","closeAllThirdLevelMenuItemsAndResetChildMenus","getOrLoadFirstLevelMenuItem","buttonEL","closeMenuOnMouseOut","itemKey","insertAdjacentHTML","buttonEls","every","x","nodeName","offsetLeft","initSecondLevelListeners","getOrLoadSecondLevelMenuItem","closest","firstLevelIndex","secondLevelIndex","includes","secondLevelMenuEls","initLanguageSelector","eventDisposables","onDocumentClickDisposable","detachDocumentClick","onDocumentClick","onButtonClick","attachOnDocumentClick","toggle","deInit","initTooltip","iconCloseSelector","tooltipSelector","toggleIconSelector","closeIconEl","onCloseIconClick","closeToolTip","capture","initSearchBar","desktopSearchBarContainer","mobileSearchBarContainer","initAutoComplete","onkeyup","fixInputValue","submit","onsubmit","validateInput","searchTerm","currentSearchterm","re","desktopSearchBar","mobileSearchBar","autoComplete","overlayComponent","dipose","initMobileSearchBar","createNotificationTile","markNotificationAsRead","linkEl","onTileClick","cb","disabled","orderNumber","ordernumber","pvc","sku","orderStatus","orderstatus","createNotificationCenter","onMarkedAllAsReadDisposable","domParser","DOMParser","loaded","getNotifications","isMobile","markNotificationsAsRead","notificationBellCountEl","menuEl","overLayEl","closeButtonEl","markAllAsReadButton","setOverLayClass","mobile","getTiles","onMarkedAsReadSingle","ids","loadNotifications","onMarkedAllAsRead","detachMarkAllAsReadClick","reduce","a","b","concat","reload","notificationCenterEl","parseFromString","tiles","attachMarkAllAsReadClick","amount","setNotificationCount","openMenu","calculateAndSetHeightOfMobileNavigationLevel","mobileNavigationLevel","browserUiBars","menuItemsLvlPositionTop","abs","initMyAccount","mainNavigationEl","getIconsAsync","loadAccountMenu","icons","urls","index","self","icon","svg","initCountDown","countDownToDate","showDays","onCountDownFinish","daysLabel","dayLabel","pad","num","size","countDownTime","dateString","timeString","day","month","year","hour","minutes","seconds","toDate","interval","setInterval","timeLeft","days","hours","clearInterval","initNavigationMobile","firstLevelMenuSelected","onCloseClickDisposable","onLanguageSelectorClickDisposable","userContainerEl","closeContainerEl","languageSelectorEl","thirdLevelMenuEls","mobileMenuEl","menuButtonEl","menuContainerEl","currentLanguage","getMobileMenu","contentPreLoaded","resetMenu","onCloseMenuClick","initMenuItemsAndBehavior","firstLevelListEl","activeLanguageEl","languageEl","iconButtonEls","uniqueUrls","loadIcons","attachCloseMenuClick","attachLanguageSelectorClick","attachFirstMenuItemClick","elementHeight","firstLevelEl","secondLevelEl","thirdLevelEls","thirdLevelEl","hideOtherMenuItems","hasChildNodes","children","onFirstMenuItemClick","handleHeaderLink","_a","prevClickedEl","offset","firstLevelMenuButton","secondLevelNavigationEl","setScrollTop","loadSecondLevelEl","frag","createRange","createContextualFragment","replaceChild","secondLevelItems","attachSecondMenuItemClick","menuItemsSecondLvl","scrollPos","onSecondMenuItemClick","thirdLevelDivEl","secondeLevelNavigationEl","thirdLevelContainerEl","loadThridLevelEl","menuItemsThirdLvl","thirdLevelIndex","_b","thirdLevelItems","attachThirdMenuItemClick","onThirdMenuItemClick","evTarget","onLanguageSelectorClick","languageSelectorContainerEl","languageCurrentEl","languageChoicesContainerEl","languageSelectorDescrEl","languageSelectorDescrOptionsEl","menuButtonComponent","createMainNavigation","initMobileMenu","pageid","indexLevel2","indexLevel3","pragma","getInlineSvgsAsync","toggleScroll","scrollingElement","getScrollingElement","scrollY","scroll","round","eventAnimation","eventContainer","toggleEventVisibility","stickyNav","stickynav","seen","imageContainer","animation","lottie","loadAnimation","renderer","loop","autoplay","cdn","catimage","initialSegment","playSegments","animate","transition","opacity","eventContainerInitialHeight","visiblePx","play","initEventAnimation","firstLevel","secondLevel","desktopLeftMenuEl","langButtonEl","langContainerEl","searchBarEl","notificationIds","append","leadTimesBarEl","openLeadTimesPopupAsync","click","topBarContainerEl","countdown","dayslabel","daylabel","barEls","myTopBar","otherTopBar","outerHTML","initComponents","getInlineSvgAsync","svgString","XMLSerializer","serializeToString","u","createCountrySelection","onClickDisposable","navigateTo","navigateToLink","attachOnClick","showCountrySelectionPopup","countrySelectionPopup","continueButton","countryselectionlink","fetchingPopupContent","createPopup","popupEl","isOpen","currentY","renderedDialogEl","closeOnClickOutsidePopup","dialogId","view","forceRefresh","fromCache","closeOnEnter","p","onKeyDownEvent","onCloseEvent","addOnClose","closeButton","popup","tempEl","replaceWith","create","openAsync","replaceContent","checkPersonalNumber","pin","regionCode","checksumSe","checksumNo","checksumDk","checksumFi","checkSumString","result1","checksum","result2","checkSumString1","checkSumString2","checksum1","checksum2","multiplier","pins","lastDigit","createScrollToTop","scrollToTopEl","wobblerEl","stickyCtaButtonEl","footerEl","fade","displayNone","scrollTo","isIOS","isAppleDevice","isTouchScreen","audio","Audio","volume","iosQuirkPresent","initLeaveIntent","toggleLeaveIntent","enableLeaveIntent","isLeaveIntentEnabled","search","triggerLeaveIntentPopup","forceEnable","ouibounce","sensitivity","aggressive","sitewide","timer","callback","cookieExpire","canFire","EnableLeaveIntentPopup","EnableLeaveIntent","DisableLeaveIntent","ShowContentDialog","title","openFunction","okButtonKey","addTitleCssClass","extraPopupCss","BodyLabel","TitleLabel","ExtraPopupCss","TitleCssClass","OkButtonLabel","CreateTabs","tabsCollectionContainer","tabHideClass","hideclass","addQueryStringParameter","searchParams","set","newRelativePathQuery","history","replaceState","fixDataAttributes","tabEls","tabContentEls","hasAttribute","addEventListenerToTabs","updateTab","hideClass","pushNewHash","tabToSelect","tabToSelectContent","z","onTabSwitch","activeTab","get","createPopupLauncher","dialogid","contentKey","initContentParts","tabsEl","basePath","getComponentContent","component","epc","isProspect","themeKey","pageTemplate","hidepromotionvisualization","pushEecDetailEvent","newUrl","product","datalayerVersion","ecommerce","detail","actionField","products","variant","productCode","pvcName","parentCategories","price","priceWOVat","currencyCode","currency","isItemJustAddedToCart","productCategoryName","categoryName","productCategoryCode","categoryCode","productCategoryUrl","variantFormatImageUrl","formatImageSrc","estDeliveryDate","deliveryInfo","isVoucher","pushComponentEvent","componentName","createComponentLoader","componentEls","components","initComponent","initialized","currentComponent","find","c","activate","componentObserver","intersectionRatio","threshold","createComponent","componentEl","componentCallback","passElInCallback","componentPassElementInCallback","trackGaEvent","componentGaEvent","trackHeight","componentTrackHeight","pushDatalayerEvent","componentPushDatalayerEvent","componentContentkey","componentEpc","componentIsProspect","componentTheme","componentTemplate","replaceNode","componentPageName","sessionStorage","getItem","minHeight","loadJavascriptAndRunMethod","r","elementHtml","setItem","isValidVatNumber","countryCode","vatNumberHasCorrectCountryCode","vatNumber","vatNumberString","part1","part2","testVal","date","substr","dateParts","createAbandonedVisitTitleSwapper","abandonedvisitenabled","blinkInterval","blinkTitle","abandonedvisittitle","abandonedvisittitlealternate","abandonedvisitspeed","createGeneralPageEventsAndComponents","gtmIFrame","src","leaveIntent","dataLayerIframe","Cookiebot","consent","marketing","enableLeaveIntentConfigValue","forms","isOptional","addMessages","validationMessages","setLocale","addValidator","limit","parseFloat","limitValue","replaceAll","vat","regexp","blacklist","list","regioncode","useHouseNumber","prefix","houseNumberEl","atStart","atEnd","passwordEl","HTMLInputElement","checkMobileAndSetCookie","header","initCollapsingPanels","showcountryselection","closeCountrySelectionPopup","toISOString","isbot","initFooterComponent","disableLeaveIntent","getCollapsibleContent","getTabContent","createTruncate","lineHeight","ceil","lines","shaveMoreOnContainer","shaveLessOnContainer","defaults","ellipsis","showMore","showLess","currentEl","eventTrackingMethod","openEventAction","truncate","expand","closeEventAction","collapse","Truncate","onInitEvent","updateConfig","newOpts","overrideDefault","updateContent","getPrice","quantity","variableAmount","promoCode","forceQuantityBreak","GetPriceResult","Guid","newSliderGuid","random","newGuid","EternalSlidingMode","getHighestSlideOfSlider","slidesInSlider","highestSlideEl","maxTitleHeight","slideEl","sliderTitleEl","tileTitle","tileSubTitle","titleheight","getHighestSlideLinkElOfSlider","maxLinkHeight","sliderLinkEl","linkHeight","SetHeight","slider","oldSlider","visibleSlides","highestSlideTitle","highestSlideSubTitle","highestSlideLinkEl","highestSlideLinkText","highestSlideTitlepx","highestSlideSubTitlepx","highestSlideLinkTextpx","highestSlideFullTitlepx","l","slideFullTitleEl","HeightScriptButtons","CustomPhotoSliderWithDivSettingsDefaults","sliderElements","sliderContainerSettings","elementsContainerSettings","extraSliderClass","slideClicked","cssWhenButtonsBothOnMax","nextButton","css","cssWhenOnMax","draggedSlider","previousButton","showHalfSlides","replaceWithElement","enableEternalSliding","eternalSlidingMode","Infinite","translateForMovement","forceRenderSlider","SliderCreated","ResizeEvent","bottomTitleHeight","sliderButtons","hightestImage","buttonCenterImage","btnHeight","createCustomSlider","sliderEl","elementsEl","firstVisibleElement","prevButton","sliderPxX","widthBeforeResize","mouseDownOnSlider","startSliderDragX","currentSliderDragX","isDragged","disableSliderDragging","preventPageScrolling","preventSliderDragging","prevSliderWidth","ioSlider","getSliderTemplate","InitializedEvent","checkEdgesAndMove","addHandlers","resizeObserver","previousEvent","nextEvent","addSliderEventListeners","ResizeObserver","contentRect","resize","sliderTouchEventListeners","enableKeyboardNavigation","addSliderKeyboardEventListeners","sliderMouseEventListeners","dragStart","onKeyDown","code","passive","scrollStart","sliderWidth","getFullWidthElement","preventClick","stopImmediatePropagation","getPositionX","dragStop","dragging","dragLeave","scrollBehavior","posX","movedSinceStart","getFirstVisibleElement","elementWidth","visibleElements","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","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","findIndex","initFormatImage","firstEl","moveBottomSliderToSelectedItem","topSlider","topSliderSelectedItem","bottomSliderToSelectEl","reInit","reStart","slideEls","addAndSelectElement","imgSrc","reverse","formatImageContainerTemplate","extension","lastIndexOf","isPreviewSlider","some","videoContainer","preload","crossOrigin","playsInline","videoContainerSource","sourceEl","srcset","endsWith","elementStyle","sliderSettings","removeFirstElementAndSelect","itemType","FormatImage","currentSelected","PackShot","sliderIndex","visiblePhotoEl","goToSlide","steps","ctaButton","mobileCtaButton","prices","deliveryInformationUsp","formatImageSet","isLoading","volumeRelatedPrices","currentItem","createSteps","dependencies","getStepContentAsync","carrouselContainer","priceDetails","stepEls","ctaButtonEl","mobileCtaButtonEl","ctaTooltipButtonEl","showMoreButtonEl","collapsibleEl","loadingMsg","loadingmsg","defaultPvc","defaultpvc","defaultProductCode","defaultproductcode","defaultProductName","defaultproductname","defaultFormatImage","defaultformatimage","defaultDeliveryDate","defaultdeliverydate","defaultPrice","defaultprice","defaultOption","defaultoption","defaultQtyPriceBreak","defaultquantitypricebreak","priceContainerEls","theme","carrousel","createDataLayerProduct","formatImg","pc","pcname","parentcategories","addFormatImages","removeFormatImage","removePackShotImage","preSelectStep","stepContent","step","attributeValueMa","visible","selectedAttributeMaValue","setId","isLast","initStep","stepEl","totalSteps","collapsable","stepContentContainerEl","errorEl","loadingEl","defaultError","stepContentEl","indicatorEl","subTitleEl","formatDescription","description","hideContent","contents","setAndShowError","loadNextStep","priceText","strikedPriceText","pricePerPieceText","showFrom","uniqueSkuWithDesign","nextStepHasSelection","viewedUniqueSkuWithDesign","setPrice","selectPvc","resetText","stepIndex","nextStep","hideError","createId","openNextStepIfPossible","selectedAttributeValuesMa","toReturn","buildSelectedAttributeValueMa","showLoading","newContentEl","stepOptions","stepDropDownEl","initStepContent","hideLoading","optionDescription","formattedDescription","inputAttributeValueMa","previousStep","getAttributeValueMaFromSelected","deselect","select","enabledOptions","customClick","hasOnlyOneOption","selectFirst","selectedOption","attrvalma","initStepOptions","initDropDown","optionEls","initStepOption","optionEl","myPrice","myPriceLabel","pricelabel","myStrikedPrice","strikedprice","myStrikedPriceLabel","strikedpricelabel","myPricePerPiece","priceperpiece","showfrom","formatimage","deliveryDateJs","deliverydatejs","deliveryDate","deliverydate","deliveryPrice","deliveryprice","buttonText","buttontext","mobileButtonText","mobilebuttontext","buttonTooltipText","buttontooltiptext","pagePrice","pageprice","pageMaxAmount","pagemaxamount","pageBaseAmount","pagebaseamount","uniqueskuwithdesign","productcode","productName","productname","showInfoIcon","showinfoicon","cheapestPvc","cheapestpvc","cheapestOption","cheapestoption","cheapestQtyPriceBreak","cheapestquantitypricebreak","defaultOptionUsp","defaultoptionusp","cheapestQtyPriceBreakNumber","imgDescription","tempUnavailableEl","setDeliveryDate","resetDeliveryDate","setDeliveryPrice","updateDefaultOptionUsp","resetDeliveryPrice","setText","updatePageDetails","showIcon","hideIcon","initCtaButtonEl","tooltip","completeStepsMsg","completestepsmsg","defaultToolTipText","URL","toolTipText","isEnabled","initPrice","fromEl","priceEl","strikedPriceEl","pricePerPieceEl","infoIconEl","volumeRelatedPrice","initShowVolumeRelatedPrices","strikedPrice","pricePerPiece","selectedIndex","optionWithSelectAttribute","buttonToolTipText","optionToSelect","variableUl","basePageTagEl","maxPagesTagEl","pagePriceTagEl","fromPagePriceTagEl","usp","defaultOptionEl","defaultOptionListEl","initialContent","infoTooltipEl","qtyPriceBreak","quantitypricebreak","templateEl","forceQuantityBreakInt","PriceItems","Description","CalculationDescription","ItemTotal","newEl","calculation","deliveryInformationEl","headerLinkEls","deliveryDateEl","deliveryPriceEl","defaultDeliveryPrice","defaultdeliveryprice","link","ctaButtonUrl","toggleShowMore","showmoreEl","arrow","toggleShowMoreEvent","dateMsg","disableLink","priceMsg","initDeliveryInformationUsp","mobileCtaButtonParentEl","formatImage","selectedPvc","visibleContent","createFlipBook","flipbookElement","pages","maxZIndex","zIndex","flipbookPage","next","filterdList","pageToTurn","nextPage","originalindex","createPromotionBar","GetProductCategoryReviews","productCategoryId","stars","reviewLanguage","getStepContent","productCategory","selectedAttributeValueMa","optionGroup","targetDeliveryDate","purpose","occasion","preselectedOccasion","createReviewBlocks","productReviewsNameLabel","productReviewsAnonymousLabel","reviewTemplateEl","addReviews","productCategoryReviews","reviewEls","review","reviewTemplateCloneEl","reviewStarsEl","score","reviewsStarsAtomEl","trustPilotDesignClass","comment","insertAdjacentText","reviewerBlockEL","reviewerFirstname","reviewerLastname","formattedReviewDate","collapsableEl","commentBlockEl","feedback","formattedFeedbackDate","createUserReview","createShowMoreButton","createPaginationControl","buttonTemplateEl","leftControlEL","leftButton","rightControlEL","rightButton","reviewBlocksControlEl","numberedButtonEls","amountOfPagesToShow","selectedPage","numberOfPages","indexOffset","onNumberedButtonClicked","showArrowControl","showIt","onClickArrowControl","updatePaginations","pageNumber","indexCondition","min","buttonCloneEl","activeButtonEl","pageButton","docFrag","toggleArrowControls","createReviewBar","clearActiveBar","barEl","quantityEl","enabledClass","disabledClass","startValue","isDisabled","onClickEvent","getStartValue","totalNumberOfReviews","starAmount","updateBarPercentage","createReviewBars","eventDisposable","reviewBarEls","reviewBarComponents","reviewBarsTotalLinkEl","deinit","updateAmounts","totalReviews","starAmounts","resetActiveBar","barcomponent","reviewStar","innerTextEl","createReviewLanguageSelect","languageSelectEl","reviewAmounts","languagesCount","replaceAmountBetweenParentheses","languageCount","selectedLanguage","createUserReviews","getReviewsAsync","totalAmountOfReviews","numberOfReviewsToShow","startPageOffset","showLoadMoreButton","activeFilter","activeLanguage","reviewLanguageSelect","reviewBlocksComponent","mobileControlEl","desktopControlEl","loadNextPage","scrollToTop","activeLanguageChanged","loadMoreButtonComponent","reviews","reviewBarsComponent","filteredAmount","paginationControlComponent","isMobileControl","onWindowResize","isMobileOnResize","formatPrice","formattedPrice","replaceDecimalSeparatorInPrice","decimalSeparator","toFixed","Currency","DisplayLeftToPrice","CurrencySymbol","Amount","DecimalSeparator","promotionBar","stepsComponent","optionPricePopups","stepsTheme","initTruncate","productDescriptionEl","truncateEl","loadProductCategoryReviews","userReviewsSectionEl","nameLabel","anonymousLabel","reviewsContainerEl","initGeneratedContentSlider","ucgSlider","selectedSlide","selectedSlideSrc","sliderElementIndex","tooltipComponent","UserGeneratedContentContentkey","ugccontentkey","ProductCategoryContentKey","productcategorycontentkey","SelectedIndex","priceContainer","toolTipcontainerEl","priceResult","priceEls","Price","getAndSetPrice","externalLink","productDescriptionEls","stepsEl","tabContainerEls","collapsableDeps","getPvcFromStepsComponent","tabContainerEl","initCollapsables","tabContentEl","collapsableEls","collapsableContainerEl","initPriceDetails","listEls","getCollapseContent","moreInfoLinkEls","initOptionPricesMoreInfoLink","moreInfoLinkEl","showOptionPricePopup","contentkey","uniqueId","productCategoryOptionContentKey","pvcSelect","quantityBreakListItemContainer","quantityBreakListItems","noOptionsDiv","onChange","pvcSelectChange","selectedValue","visibleItems","currentPvc","priceDetailsSelectEl","priceDetailsListEls","productPreview","ProductCategory"],"mappings":"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"}