{"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/utils/debounce.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form-input.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/account-service.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/form.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/querystring.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/events.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/validation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/newsletter.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/common/device.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/navigation-desktop.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/language-selector.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/tooltip.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/search-bar.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/notification-center.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/mobile-menu.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/my-account.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/countdown.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/navigation-mobile.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/main-navigation.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/icons.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/country-selection.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/popup-new.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/personalNumbers.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/scroll-to-top.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/leave-intent.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/content-dialog.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/tab.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/popup-launcher.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/services/component-service..ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/datalayer.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/component-loader.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/vat.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/utils/date.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/abandoned-visit-title-swapper.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/components/page-general.ts","../../../../eXpress.Web.UI.Website.Core/wwwroot/ts/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\tconst el = expressQuerySelector(document, '.o-main-navigation__hamburger-button', false);\r\n\treturn el && isElementVisible(el);\r\n}\r\n\r\nexport function isElementVisible(el: HTMLElement) {\r\n\treturn el && !(el.offsetWidth\r\n\t\t+ el.offsetHeight\r\n\t\t+ el.getBoundingClientRect().height\r\n\t\t+ el.getBoundingClientRect().width === 0);\r\n}\r\n\r\nexport function isElementVisibleInViewPort(el: HTMLElement): boolean {\r\n\tif (!el) return false; // return default\r\n\tconst rect = el.getBoundingClientRect();\r\n\r\n\treturn rect.top >= 0\r\n\t\t&& rect.left >= 0\r\n\t\t&& rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)\r\n\t\t&& rect.right <= (window.innerWidth || document.documentElement.clientWidth);\r\n}\r\n\r\nexport function isElementPartiallyVisibleInViewport(el, percentVisible) {\r\n\tif (!el) return false;\r\n\tconst rect = el.getBoundingClientRect();\r\n\tconst windowHeight = (window.innerHeight || document.documentElement.clientHeight);\r\n\r\n\treturn !(\r\n\t\tMath.floor(100 - (((rect.top >= 0 ? 0 : rect.top) / +-rect.height) * 100)) < percentVisible ||\r\n\t\tMath.floor(100 - ((rect.bottom - windowHeight) / rect.height) * 100) < percentVisible\r\n\t);\r\n}\r\n\r\nexport function remove(el: Element) {\r\n\tif (el.parentElement) el.parentElement.removeChild(el);\r\n}\r\n\r\nlet inViewArray: { element: HTMLElement; callBack: IInViewCallback; }[];\r\n\r\ninterface IInViewCallback {\r\n\t(element: HTMLElement): void;\r\n}\r\n\r\n// Can be replaced with a intersection observer with threshold = 1\r\nexport function inViewTrigger(element: HTMLElement, callBack: IInViewCallback) {\r\n\tconst inViewScrollHandler = () => {\r\n\t\t// What does in view mean? We assume people are scrolling down, so if BOTTOM of the element is in view -> the element has been in view!\r\n\t\tfor (let i = inViewArray.length - 1; i >= 0; i--) {\r\n\t\t\tconst { element, callBack } = inViewArray[i];\r\n\r\n\t\t\tconst windowHeight = window.innerHeight;\r\n\t\t\tconst scrollY = window.scrollY || window.pageYOffset;\r\n\t\t\tconst scrollPosition = scrollY + windowHeight;\r\n\r\n\t\t\tconst elementHeight = element.clientHeight;\r\n\t\t\tconst elementPosition = element.getBoundingClientRect().top + scrollY + elementHeight;\r\n\r\n\t\t\tif (scrollPosition > elementPosition) {\r\n\t\t\t\tcallBack(element);\r\n\t\t\t\tinViewArray.splice(i, 1);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (inViewArray.length === 0) {\r\n\t\t\t// I no longer need myself! Cleanup....\r\n\t\t\tdocument.removeEventListener('scroll', inViewScrollHandler);\r\n\t\t}\r\n\t};\r\n\r\n\t// We should only have 1 scroll event listener that checks all elements that want to use this feature.\r\n\tif (!inViewArray || inViewArray.length === 0) {\r\n\t\tinViewArray = [];\r\n\t\tdocument.addEventListener('scroll', inViewScrollHandler);\r\n\t}\r\n\r\n\tinViewArray.push({ element, callBack });\r\n\r\n\t// Do 1 check without scrolling -> items might already be completely in view\r\n\tinViewScrollHandler();\r\n}\r\n\r\nexport function disableUserEvents(): IDisposable {\r\n\tconst eventsToBlock = [\"click\", \"keydown\", \"keyup\", \"mouseenter\", \"mouseleave\", \"focus\"];\r\n\r\n\tconst disposable = {\r\n\t\tblockingEvents: eventsToBlock.map((event) => expressEventListener(window, event, (e) => blockEvent(e), true)),\r\n\t\tdispose: (): void => {\r\n\t\t\tif (disposable.blockingEvents) {\r\n\t\t\t\tdisposable.blockingEvents.forEach((blockedEvent) => blockedEvent.dispose());\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\treturn disposable;\r\n}\r\n\r\nconst blockEvent = (event: Event): void => {\r\n\tevent.preventDefault();\r\n\tevent.stopPropagation();\r\n};\r\n\r\nexport const pageVisibilityChange = (onVisible?: () => void | undefined, onHidden?: () => void | undefined) => {\r\n\tif (!onVisible && !onHidden)\r\n\t\treturn;\r\n\r\n\tlet hidden: string, visibilityState: string, visibilityChange: string;\r\n\r\n\tif (typeof document.hidden !== \"undefined\") {\r\n\t\thidden = \"hidden\"; visibilityChange = \"visibilitychange\"; visibilityState = \"visibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.mozHidden !== \"undefined\") {\r\n\t\thidden = \"mozHidden\"; visibilityChange = \"mozvisibilitychange\"; visibilityState = \"mozVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.msHidden !== \"undefined\") {\r\n\t\thidden = \"msHidden\"; visibilityChange = \"msvisibilitychange\"; visibilityState = \"msVisibilityState\";\r\n\t}\r\n\t// @ts-ignore\r\n\telse if (typeof document.webkitHidden !== \"undefined\") {\r\n\t\thidden = \"webkitHidden\"; visibilityChange = \"webkitvisibilitychange\"; visibilityState = \"webkitVisibilityState\";\r\n\t}\r\n\r\n\tif (typeof document.addEventListener === \"undefined\" || typeof hidden === \"undefined\") {\r\n\t\t// not supported\r\n\t} else {\r\n\t\texpressEventListener(document, visibilityChange, () => {\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tswitch (document[visibilityState]) {\r\n\t\t\t\t\tcase \"visible\":\r\n\t\t\t\t\t\tonVisible && onVisible();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"hidden\":\r\n\t\t\t\t\t\tonHidden && onHidden();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}, 0);\r\n\t\t}, false);\r\n\t}\r\n};\r\n","import {expressEventListener, expressRemoveClass, expressAddClass} from '../common/html';\r\nimport {IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface ICreateClickableOptions {\r\n\treadonly enable?: () => void;\r\n\treadonly disable?: () => void;\r\n}\r\n\r\nexport interface IButton {\r\n\treadonly dispose: () => void;\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n}\r\n\r\nexport function createClickableElement(el: HTMLElement, onClick?: () => Promise, options: ICreateClickableOptions = {}) {\r\n\tlet clickEvent: IDisposable;\r\n\tconst {enable, disable} = options;\r\n\r\n\tconst onClicked = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopPropagation();\r\n\t\tif (onClick) {\r\n\t\t\tdispose();\r\n\t\t\tdisable && disable();\r\n\t\t\tonClick()\r\n\t\t\t\t.then(() => {\r\n\t\t\t\t\tenable && enable();\r\n\t\t\t\t\taddClickEvent();\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst addClickEvent = () => {\r\n\t\tclickEvent = expressEventListener(el, 'click', onClicked);\r\n\t};\r\n\r\n\tconst dispose = () => clickEvent.dispose();\r\n\r\n\taddClickEvent();\r\n\r\n\treturn {\r\n\t\taddClickEvent,\r\n\t\tdispose\r\n\t};\r\n}\r\n\r\nexport function createButton(buttonEl: HTMLButtonElement, onClick?: () => Promise): IButton {\r\n\tconst enable = () => { // add component specific classes\r\n\t\texpressRemoveClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.removeAttribute(\"disabled\");\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\texpressAddClass(buttonEl, \"a-button--disabled\");\r\n\t\tbuttonEl.setAttribute(\"disabled\", \"disabled\");\r\n\t};\r\n\r\n\tconst button = createClickableElement(\r\n\t\tbuttonEl,\r\n\t\tonClick,\r\n\t\t{\r\n\t\t\tenable,\r\n\t\t\tdisable\r\n\t\t}\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tenable,\r\n\t\tdisable\r\n\t};\r\n}\r\n","import {expressQuerySelector, expressQuerySelectorAll, hasClass, isElementVisibleInViewPort} from '../common/html';\r\nimport { createClickableElement } from './button';\r\n\r\nexport interface ICreateCollapsableOptions {\r\n\treadonly singleOpen?: boolean;\r\n\treadonly swapTitleDataAttribute?: string;\r\n}\r\n\r\nexport interface ICreateCollapsableDependencies {\r\n\tonInit?: (container: HTMLElement) => Promise;\r\n\tonBeforeOpen?: (container: HTMLElement) => Promise;\r\n\treadonly onBeforeClose?: (container: HTMLElement) => Promise;\r\n\treadonly titleElSelector?: string;\r\n\treadonly scrollIntoViewAfterOpen: boolean;\r\n\treadonly contentSelector?: string;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nexport interface ICollapsibleContentRequest {\r\n\treadonly type: string;\r\n\treadonly theme: string;\r\n}\r\n\r\nexport interface ICollapsable {\r\n\tdispose(): void;\r\n\tshow(): void;\r\n\tclose(): void;\r\n\thide(): void;\r\n\topen(scrollIntoView?: boolean): void;\r\n\telement: HTMLElement;\r\n}\r\n\r\nexport function createCollapsable(container: HTMLElement, deps?: ICreateCollapsableDependencies, opts?: ICreateCollapsableOptions): ICollapsable {\r\n\tconst { singleOpen, swapTitleDataAttribute } = opts || {};\r\n\tconst { onInit, onBeforeOpen, onBeforeClose, titleElSelector, scrollIntoViewAfterOpen, contentSelector, openClass } = deps || {};\r\n\tconst OPEN_CLASS = openClass ? openClass : \"is-collapse-open\";\r\n\tconst titleEl = expressQuerySelector(container, titleElSelector ? titleElSelector : '.technical-collapsable-title', true);\r\n\tconst contentEl = expressQuerySelector(container, contentSelector ? contentSelector : '.technical-collapse-content', false);\r\n\tlet origTitle: string;\r\n\tlet collapseTitle: string;\r\n\tif (swapTitleDataAttribute) {\r\n\t\torigTitle = titleEl.innerText;\r\n\t\tcollapseTitle = swapTitleDataAttribute ? container.getAttribute(swapTitleDataAttribute) : null;\r\n\t}\r\n\tconst closeWithBefore = async () => {\r\n\t\tif (!onBeforeClose) {\r\n\t\t\tclose();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeClose(container);\r\n\t\treturn close();\r\n\t};\r\n\r\n\tconst openWithBefore = async (scrollIntoView = false) => {\r\n\t\tif (!onBeforeOpen) {\r\n\t\t\topen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t\tawait onBeforeOpen(container);\r\n\t\treturn open(scrollIntoView);\r\n\t};\r\n\r\n\tconst close = () => {\r\n\t\tif (swapTitleDataAttribute && origTitle && titleEl.innerText !== origTitle) {\r\n\t\t\ttitleEl.innerText = origTitle;\r\n\t\t}\r\n\t\tcontainer.classList.remove(OPEN_CLASS);\r\n\t};\r\n\tconst open = (shouldScrollIntoView?: boolean) => {\r\n\t\tif (singleOpen) {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(container.parentElement, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => el.classList.remove(OPEN_CLASS));\r\n\t\t}\r\n\t\tif (swapTitleDataAttribute && titleEl.innerText !== collapseTitle) {\r\n\t\t\ttitleEl.innerText = collapseTitle;\r\n\t\t}\r\n\t\tcontainer.classList.add(OPEN_CLASS);\r\n\t\tif ((scrollIntoViewAfterOpen && !isElementVisibleInViewPort(contentEl)) || shouldScrollIntoView)\r\n\t\t\ttitleEl.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n\t};\r\n\r\n\tconst isOpen = () => hasClass(container, OPEN_CLASS);\r\n\r\n\tconst onClick = () => !isOpen() ? openWithBefore() : closeWithBefore();\r\n\r\n\tconst button = createClickableElement(titleEl, onClick);\r\n\r\n\tonInit && onInit(container);\r\n\r\n\treturn {\r\n\t\tdispose: button.dispose,\r\n\t\tshow: () => container.classList.remove('u-hide'),\r\n\t\thide: () => container.classList.add('u-hide'),\r\n\t\tclose,\r\n\t\topen: (scrollIntoView?: boolean) => openWithBefore(scrollIntoView),\r\n\t\telement: container\r\n\t} as ICollapsable;\r\n}\r\n","/*\r\n * https://github.com/kraaden/autocomplete\r\n * Copyright (c) 2016 Denys Krasnoshchok\r\n * MIT License\r\n *\r\n * this commit is used : https://github.com/kraaden/autocomplete/pull/40\r\n *\r\n */\r\n\r\nexport const enum EventTrigger {\r\n\tKeyboard = 0,\r\n\tFocus = 1\r\n}\r\n\r\nexport interface IAutocompleteItem {\r\n\tlabel?: string;\r\n\tgroup?: string;\r\n}\r\n\r\nexport interface IAutocompleteSettings {\r\n\tinput: HTMLInputElement;\r\n\trender?: (item: T, currentValue: string) => HTMLDivElement | undefined;\r\n\trenderGroup?: (name: string, currentValue: string) => HTMLDivElement | undefined;\r\n\tclassName?: string;\r\n\tminLength?: number;\r\n\temptyMsg?: string;\r\n\tonSelect: (item: T, input: HTMLInputElement) => void;\r\n\t/**\r\n\t * Show autocomplete on focus event. Focus event will ignore the `minLength` property and will always call `fetch`.\r\n\t */\r\n\tshowOnFocus?: boolean;\r\n\tfetch: (text: string, update: (items: T[] | false) => void, trigger: EventTrigger) => void;\r\n\tdebounceWaitMs?: number;\r\n\t/**\r\n\t * Callback for additional autocomplete customization\r\n\t * @param {HTMLInputElement} input - input box associated with autocomplete\r\n\t * @param {ClientRect | DOMRect} inputRect - size of the input box and its position relative to the viewport\r\n\t * @param {HTMLDivElement} container - container with suggestions\r\n\t * @param {number} maxHeight - max height that can be used by autocomplete\r\n\t */\r\n\tcustomize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n\t/**\r\n\t * Prevents automatic form submit when ENTER is pressed\r\n\t */\r\n\tpreventSubmit?: boolean;\r\n\t/**\r\n\t * Prevents automatic selection of first entry when ENTER is pressed\r\n\t */\r\n\tdisableAutoSelect?: boolean;\r\n}\r\n\r\nexport interface IAutocompleteResult {\r\n\tdestroy: () => void;\r\n}\r\n\r\nconst enum Keys {\r\n\tEnter = 13,\r\n\tEsc = 27,\r\n\tUp = 38,\r\n\tDown = 40,\r\n\tLeft = 37,\r\n\tRight = 39,\r\n\tShift = 16,\r\n\tCtrl = 17,\r\n\tAlt = 18,\r\n\tCapsLock = 20,\r\n\tWindowsKey = 91,\r\n\tTab = 9,\r\n\tF1 = 112,\r\n\tF12 = 123\r\n}\r\n\r\nexport function autocomplete(settings: IAutocompleteSettings): IAutocompleteResult {\r\n\r\n\t// just an alias to minimize JS file size\r\n\tconst doc = document;\r\n\r\n\tconst container: HTMLDivElement = doc.createElement(\"div\");\r\n\tconst containerStyle = container.style;\r\n\tconst userAgent = navigator.userAgent;\r\n\tconst mobileFirefox = userAgent.indexOf(\"Firefox\") !== -1 && userAgent.indexOf(\"Mobile\") !== -1;\r\n\tconst debounceWaitMs = settings.debounceWaitMs || 0;\r\n\tconst preventSubmit = settings.preventSubmit || false;\r\n\r\n\t// 'keyup' event will not be fired on Mobile Firefox, so we have to use 'input' event instead\r\n\tconst keyUpEventName = mobileFirefox ? \"input\" : \"keyup\";\r\n\r\n\tlet items: T[] = [];\r\n\tlet inputValue = \"\";\r\n\tlet minLen = 2;\r\n\tconst showOnFocus = settings.showOnFocus;\r\n\tlet selected: T | undefined;\r\n\tlet keypressCounter = 0;\r\n\tlet debounceTimer: number | undefined;\r\n\r\n\tif (settings.minLength !== undefined) {\r\n\t\tminLen = settings.minLength;\r\n\t}\r\n\r\n\tif (!settings.input) {\r\n\t\tthrow new Error(\"input undefined\");\r\n\t}\r\n\r\n\tconst input: HTMLInputElement = settings.input;\r\n\r\n\tcontainer.className = \"autocomplete \" + (settings.className || \"\");\r\n\r\n\t// IOS implementation for fixed positioning has many bugs, so we will use absolute positioning\r\n\tcontainerStyle.position = \"absolute\";\r\n\r\n\t/**\r\n\t * Detach the container from DOM\r\n\t */\r\n\tfunction detach(): void {\r\n\t\tconst parent = container.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.removeChild(container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Clear debouncing timer if assigned\r\n\t */\r\n\tfunction clearDebounceTimer(): void {\r\n\t\tif (debounceTimer) {\r\n\t\t\twindow.clearTimeout(debounceTimer);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Attach the container to DOM\r\n\t */\r\n\tfunction attach(): void {\r\n\t\tif (!container.parentNode) {\r\n\t\t\tdoc.body.appendChild(container);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Check if container for autocomplete is displayed\r\n\t */\r\n\tfunction containerDisplayed(): boolean {\r\n\t\treturn !!container.parentNode;\r\n\t}\r\n\r\n\t/**\r\n\t * Clear autocomplete state and hide container\r\n\t */\r\n\tfunction clear(): void {\r\n\t\t// prevent the update call if there are pending AJAX requests\r\n\t\tkeypressCounter++;\r\n\r\n\t\titems = [];\r\n\t\tinputValue = \"\";\r\n\t\tselected = undefined;\r\n\t\tdetach();\r\n\t}\r\n\r\n\t/**\r\n\t * Update autocomplete position\r\n\t */\r\n\tfunction updatePosition(): void {\r\n\t\tif (!containerDisplayed()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcontainerStyle.height = \"auto\";\r\n\t\tcontainerStyle.width = input.offsetWidth + \"px\";\r\n\r\n\t\tlet maxHeight = 0;\r\n\t\tlet inputRect: ClientRect | DOMRect | undefined;\r\n\r\n\t\tfunction calc() {\r\n\t\t\tconst docEl = doc.documentElement as HTMLElement;\r\n\t\t\tconst clientTop = docEl.clientTop || doc.body.clientTop || 0;\r\n\t\t\tconst clientLeft = docEl.clientLeft || doc.body.clientLeft || 0;\r\n\t\t\tconst scrollTop = window.pageYOffset || docEl.scrollTop;\r\n\t\t\tconst scrollLeft = window.pageXOffset || docEl.scrollLeft;\r\n\r\n\t\t\tinputRect = input.getBoundingClientRect();\r\n\r\n\t\t\tconst top = inputRect.top + input.offsetHeight + scrollTop - clientTop;\r\n\t\t\tconst left = inputRect.left + scrollLeft - clientLeft;\r\n\r\n\t\t\tcontainerStyle.top = top + \"px\";\r\n\t\t\tcontainerStyle.left = left + \"px\";\r\n\r\n\t\t\tmaxHeight = window.innerHeight - (inputRect.top + input.offsetHeight);\r\n\r\n\t\t\tif (maxHeight < 0) {\r\n\t\t\t\tmaxHeight = 0;\r\n\t\t\t}\r\n\r\n\t\t\tcontainerStyle.top = top + \"px\";\r\n\t\t\tcontainerStyle.bottom = \"\";\r\n\t\t\tcontainerStyle.left = left + \"px\";\r\n\t\t\tcontainerStyle.maxHeight = maxHeight + \"px\";\r\n\t\t}\r\n\r\n\t\t// the calc method must be called twice, otherwise the calculation may be wrong on resize event (chrome browser)\r\n\t\tcalc();\r\n\t\tcalc();\r\n\r\n\t\tif (settings.customize && inputRect) {\r\n\t\t\tsettings.customize(input, inputRect, container, maxHeight);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Redraw the autocomplete div element with suggestions\r\n\t */\r\n\tfunction update(): void {\r\n\r\n\t\t// delete all children from autocomplete DOM container\r\n\t\twhile (container.firstChild) {\r\n\t\t\tcontainer.removeChild(container.firstChild);\r\n\t\t}\r\n\r\n\t\t// function for rendering autocomplete suggestions\r\n\t\tlet render = function (item: T, currentValue: string): HTMLDivElement | undefined {\r\n\t\t\tconst itemElement = doc.createElement(\"div\");\r\n\t\t\titemElement.textContent = item.label || \"\";\r\n\t\t\treturn itemElement;\r\n\t\t};\r\n\t\tif (settings.render) {\r\n\t\t\trender = settings.render;\r\n\t\t}\r\n\r\n\t\t// function to render autocomplete groups\r\n\t\tlet renderGroup = function (groupName: string, currentValue: string): HTMLDivElement | undefined {\r\n\t\t\tconst groupDiv = doc.createElement(\"div\");\r\n\t\t\tgroupDiv.textContent = groupName;\r\n\t\t\treturn groupDiv;\r\n\t\t};\r\n\t\tif (settings.renderGroup) {\r\n\t\t\trenderGroup = settings.renderGroup;\r\n\t\t}\r\n\r\n\t\tconst fragment = doc.createDocumentFragment();\r\n\t\tlet prevGroup = \"#9?$\";\r\n\r\n\t\titems.forEach(function (item: T): void {\r\n\t\t\tif (item.group && item.group !== prevGroup) {\r\n\t\t\t\tprevGroup = item.group;\r\n\t\t\t\tconst groupDiv = renderGroup(item.group, inputValue);\r\n\t\t\t\tif (groupDiv) {\r\n\t\t\t\t\tgroupDiv.className += \" group\";\r\n\t\t\t\t\tfragment.appendChild(groupDiv);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tconst div = render(item, inputValue);\r\n\t\t\tif (div) {\r\n\t\t\t\tdiv.addEventListener(\"click\", function (ev: MouseEvent): void {\r\n\t\t\t\t\tsettings.onSelect(item, input);\r\n\t\t\t\t\tclear();\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tev.stopPropagation();\r\n\t\t\t\t});\r\n\t\t\t\tif (item === selected) {\r\n\t\t\t\t\tdiv.className += \" selected\";\r\n\t\t\t\t}\r\n\t\t\t\tfragment.appendChild(div);\r\n\t\t\t}\r\n\t\t});\r\n\t\tcontainer.appendChild(fragment);\r\n\t\tif (items.length < 1) {\r\n\t\t\tif (settings.emptyMsg) {\r\n\t\t\t\tconst empty = doc.createElement(\"div\");\r\n\t\t\t\tempty.className = \"empty\";\r\n\t\t\t\tempty.textContent = settings.emptyMsg;\r\n\t\t\t\tcontainer.appendChild(empty);\r\n\t\t\t} else {\r\n\t\t\t\tclear();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tattach();\r\n\t\tupdatePosition();\r\n\r\n\t\tupdateScroll();\r\n\t}\r\n\r\n\tfunction updateIfDisplayed(): void {\r\n\t\tif (containerDisplayed()) {\r\n\t\t\tupdate();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction resizeEventHandler(): void {\r\n\t\tupdateIfDisplayed();\r\n\t}\r\n\r\n\tfunction scrollEventHandler(e: Event): void {\r\n\t\tif (e.target !== container) {\r\n\t\t\tupdateIfDisplayed();\r\n\t\t} else {\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction keyupEventHandler(ev: KeyboardEvent): void {\r\n\t\tconst keyCode = ev.which || ev.keyCode || 0;\r\n\r\n\t\tconst ignore = [Keys.Up, Keys.Enter, Keys.Esc, Keys.Right, Keys.Left, Keys.Shift, Keys.Ctrl, Keys.Alt, Keys.CapsLock, Keys.WindowsKey, Keys.Tab];\r\n\t\tfor (const key of ignore) {\r\n\t\t\tif (keyCode === key) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (keyCode >= Keys.F1 && keyCode <= Keys.F12) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// the down key is used to open autocomplete\r\n\t\tif (keyCode === Keys.Down && containerDisplayed()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tstartFetch(EventTrigger.Keyboard);\r\n\t}\r\n\r\n\t/**\r\n\t * Automatically move scroll bar if selected item is not visible\r\n\t */\r\n\tfunction updateScroll(): void {\r\n\t\tconst elements = container.getElementsByClassName(\"selected\");\r\n\t\tif (elements.length > 0) {\r\n\t\t\tlet element = elements[0] as HTMLDivElement;\r\n\r\n\t\t\t// make group visible\r\n\t\t\tconst previous = element.previousElementSibling as HTMLDivElement;\r\n\t\t\tif (previous && previous.className.indexOf(\"group\") !== -1 && !previous.previousElementSibling) {\r\n\t\t\t\telement = previous;\r\n\t\t\t}\r\n\r\n\t\t\tif (element.offsetTop < container.scrollTop) {\r\n\t\t\t\tcontainer.scrollTop = element.offsetTop;\r\n\t\t\t} else {\r\n\t\t\t\tconst selectBottom = element.offsetTop + element.offsetHeight;\r\n\t\t\t\tconst containerBottom = container.scrollTop + container.offsetHeight;\r\n\t\t\t\tif (selectBottom > containerBottom) {\r\n\t\t\t\t\tcontainer.scrollTop += selectBottom - containerBottom;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Select the previous item in suggestions\r\n\t */\r\n\tfunction selectPrev(): void {\r\n\t\tif (items.length < 1) {\r\n\t\t\tselected = undefined;\r\n\t\t} else if (!selected) {\r\n\t\t\tselected = items[items.length - 1];\r\n\t\t} else if (selected === items[0]) {\r\n\t\t\tselected = settings.disableAutoSelect ? undefined : items[items.length - 1];\r\n\t\t} else {\r\n\t\t\tfor (let i = items.length - 1; i > 0; i--) {\r\n\t\t\t\tif (selected === items[i] || i === 1) {\r\n\t\t\t\t\tselected = items[i - 1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Select the next item in suggestions\r\n\t */\r\n\tfunction selectNext(): void {\r\n\t\tif (items.length < 1) {\r\n\t\t\tselected = undefined;\r\n\t\t} else if (!selected) {\r\n\t\t\tselected = items[0];\r\n\t\t} else if (selected === items[items.length - 1]) {\r\n\t\t\tselected = settings.disableAutoSelect ? undefined : items[0];\r\n\t\t} else {\r\n\t\t\tfor (let i = 0; i < (items.length - 1); i++) {\r\n\t\t\t\tif (selected === items[i]) {\r\n\t\t\t\t\tselected = items[i + 1];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction keydownEventHandler(ev: KeyboardEvent): void {\r\n\t\tconst keyCode = ev.which || ev.keyCode || 0;\r\n\r\n\t\tif (keyCode === Keys.Up || keyCode === Keys.Down || keyCode === Keys.Esc) {\r\n\t\t\tconst containerIsDisplayed = containerDisplayed();\r\n\r\n\t\t\tif (keyCode === Keys.Esc) {\r\n\t\t\t\tclear();\r\n\t\t\t} else {\r\n\t\t\t\tif (!containerDisplayed || items.length < 1) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tkeyCode === Keys.Up\r\n\t\t\t\t\t? selectPrev()\r\n\t\t\t\t\t: selectNext();\r\n\t\t\t\tupdate();\r\n\t\t\t}\r\n\r\n\t\t\tev.preventDefault();\r\n\t\t\tif (containerIsDisplayed) {\r\n\t\t\t\tev.stopPropagation();\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (keyCode === Keys.Enter) {\r\n\t\t\tif (selected) {\r\n\t\t\t\tsettings.onSelect(selected, input);\r\n\t\t\t\tclear();\r\n\t\t\t}\r\n\r\n\t\t\tif (preventSubmit) {\r\n\t\t\t\tev.preventDefault();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction focusEventHandler(): void {\r\n\t\tif (showOnFocus) {\r\n\t\t\tstartFetch(EventTrigger.Focus);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction startFetch(trigger: EventTrigger) {\r\n\t\t// if multiple keys were pressed, before we get update from server,\r\n\t\t// this may cause redrawing our autocomplete multiple times after the last key press.\r\n\t\t// to avoid this, the number of times keyboard was pressed will be\r\n\t\t// saved and checked before redraw our autocomplete box.\r\n\t\tconst savedKeypressCounter = ++keypressCounter;\r\n\r\n\t\tconst val = input.value.replace(/[<>]+/g, '');\r\n\t\tif (val.length >= minLen || trigger === EventTrigger.Focus) {\r\n\t\t\tclearDebounceTimer();\r\n\t\t\tdebounceTimer = window.setTimeout(function (): void {\r\n\t\t\t\tsettings.fetch(val, function (elements: T[] | false): void {\r\n\t\t\t\t\tif (keypressCounter === savedKeypressCounter && elements) {\r\n\t\t\t\t\t\titems = elements;\r\n\t\t\t\t\t\tinputValue = val;\r\n\t\t\t\t\t\tselected = (items.length < 1 || settings.disableAutoSelect) ? undefined : items[0];\r\n\t\t\t\t\t\tupdate();\r\n\t\t\t\t\t}\r\n\t\t\t\t}, EventTrigger.Keyboard);\r\n\t\t\t}, trigger === EventTrigger.Keyboard ? debounceWaitMs : 0);\r\n\t\t} else {\r\n\t\t\tclear();\r\n\t\t}\r\n\t}\r\n\r\n\tfunction blurEventHandler(): void {\r\n\t\t// we need to delay clear, because when we click on an item, blur will be called before click and remove items from DOM\r\n\t\tsetTimeout(() => {\r\n\t\t\tif (doc.activeElement !== input) {\r\n\t\t\t\tclear();\r\n\t\t\t}\r\n\t\t}, 200);\r\n\t}\r\n\r\n\t/**\r\n\t * Fixes #26: on long clicks focus will be lost and onSelect method will not be called\r\n\t */\r\n\tcontainer.addEventListener(\"mousedown\", function (evt: Event) {\r\n\t\tevt.stopPropagation();\r\n\t\tevt.preventDefault();\r\n\t});\r\n\r\n\t/**\r\n\t * Fixes #30: autocomplete closes when scrollbar is clicked in IE\r\n\t * See: https://stackoverflow.com/a/9210267/13172349\r\n\t */\r\n\tcontainer.addEventListener(\"focus\", () => input.focus());\r\n\r\n\t/**\r\n\t * This function will remove DOM elements and clear event handlers\r\n\t */\r\n\tfunction destroy(): void {\r\n\t\tinput.removeEventListener(\"focus\", focusEventHandler);\r\n\t\tinput.removeEventListener(\"keydown\", keydownEventHandler);\r\n\t\tinput.removeEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n\t\tinput.removeEventListener(\"blur\", blurEventHandler);\r\n\t\twindow.removeEventListener(\"resize\", resizeEventHandler);\r\n\t\tdoc.removeEventListener(\"scroll\", scrollEventHandler, true);\r\n\t\tclearDebounceTimer();\r\n\t\tclear();\r\n\t}\r\n\r\n\t// setup event handlers\r\n\tinput.addEventListener(\"keydown\", keydownEventHandler);\r\n\tinput.addEventListener(keyUpEventName, keyupEventHandler as EventListenerOrEventListenerObject);\r\n\tinput.addEventListener(\"blur\", blurEventHandler);\r\n\tinput.addEventListener(\"focus\", focusEventHandler);\r\n\twindow.addEventListener(\"resize\", resizeEventHandler);\r\n\tdoc.addEventListener(\"scroll\", scrollEventHandler, true);\r\n\r\n\treturn {\r\n\t\tdestroy\r\n\t};\r\n}\r\n\r\n","export interface IDisposable {\r\n\tdispose: () => void;\r\n\tadd?: (addDisposable: IDisposable) => void;\r\n\taddMany?: (addDisposables: IDisposable[]) => void;\r\n}\r\n\r\n/** Returns a composite disposable (disposing all child disposables) */\r\nexport function compositeDisposable(disposables: IDisposable[] | undefined): IDisposable {\r\n\t// TODO: This creates a closure, optimize?\r\n\tconst dispose = (): void => {\r\n\t\tif (composite) {\r\n\t\t\t// To avoid endless loops when calling dispose on the composite again, we first clear it.\r\n\t\t\tcomposite = null;\r\n\t\t\tif (disposables) disposables.forEach(d => d.dispose());\r\n\t\t}\r\n\t};\r\n\tconst addMany = (addDisposables: IDisposable[]): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(...addDisposables);\r\n\t};\r\n\tconst add = (addDisposable: IDisposable): void => {\r\n\t\tif (!disposables)\r\n\t\t\tdisposables = [];\r\n\t\tdisposables.push(addDisposable);\r\n\t};\r\n\tlet composite: IDisposable | null = { dispose, add, addMany };\r\n\treturn composite;\r\n}\r\n","export function debounce void>(fn: F, delay: number) {\r\n\tlet timeoutID = 0;\r\n\r\n\tconst callable = (...args: any[]) => {\r\n\t\tclearTimeout(timeoutID);\r\n\t\ttimeoutID = window.setTimeout(() => fn.apply(this, args), delay);\r\n\t};\r\n\r\n\treturn callable;\r\n}\r\n\r\nexport function throttle void>(fn: F, delay: number, fnAlways?: F) {\r\n\tlet lastTimestamp = 0;\r\n\r\n\tconst callable = (...args: any[]) => {\r\n\t\tconst now = Date.now();\r\n\r\n\t\tfnAlways && fnAlways(...args);\r\n\t\tif (!lastTimestamp || now - lastTimestamp >= delay) {\r\n\t\t\tlastTimestamp = now;\r\n\t\t\tfn(...args);\r\n\t\t}\r\n\t};\r\n\r\n\treturn callable;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\texpressToggleClass,\r\n\tgetParents\r\n} from \"../common/html\";\r\nimport {autocomplete, IAutocompleteItem} from \"../external/autocomplete\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {postRequest} from \"../utils/fetch\";\r\nimport {stringToBase64} from \"../utils/string\";\r\nimport {debounce} from \"../utils/debounce\";\r\n\r\nexport interface IBaseFormInput {\r\n\treadonly enable: () => void;\r\n\treadonly disable: () => void;\r\n\treadonly inputEl: HTMLInputElement | HTMLSelectElement;\r\n\treadonly clear: (clearValue?: boolean) => void;\r\n\treadonly setError: (error: string, clear?: boolean) => void;\r\n\treadonly hide: () => void;\r\n\treadonly show: () => void;\r\n}\r\n\r\nexport interface IFormInput extends IBaseFormInput {\r\n\treadonly inputEl: HTMLInputElement;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string | boolean;\r\n}\r\n\r\nexport interface ISelectBox extends IBaseFormInput {\r\n\treadonly inputEl: HTMLSelectElement;\r\n\treadonly dispose: () => void;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string;\r\n}\r\n\r\nexport interface IPasswordInput extends IFormInput {\r\n\treadonly validatePassword: () => Promise;\r\n}\r\n\r\nexport interface ISlider extends IBaseFormInput {\r\n\treadonly dispose: () => void;\r\n\treadonly setValue: (value: string) => void;\r\n\treadonly getValue: () => string;\r\n}\r\n\r\nexport function createBaseFormInput(containerEl: HTMLElement, altSelector?: string): IBaseFormInput {\r\n\tconst inputEl = expressQuerySelector(containerEl, altSelector || \".a-form-input__input\", true);\r\n\tconst errorParagraphEl = expressQuerySelector(containerEl, '.a-form-input__error-text');\r\n\r\n\tconst toggleAttribute = (attr: string, force: boolean) => inputEl.toggleAttribute(attr, force);\r\n\r\n\tconst toggleEnable = (enable: boolean) => {\r\n\t\ttoggleAttribute('disabled', !enable);\r\n\t\texpressToggleClass(containerEl, 'a-form-input--disabled', !enable);\r\n\t};\r\n\r\n\tconst clear = (clearValue = false) => {\r\n\t\tclearValue && (inputEl.value = '');\r\n\t\tcontainerEl.classList.remove(\"a-form-input--validated\");\r\n\t\tcontainerEl.classList.remove(\"a-form-input--error\");\r\n\t};\r\n\r\n\tconst setError = (error: string, doClear = false) => {\r\n\t\tdoClear && clear();\r\n\t\tcontainerEl.classList.remove(\"a-form-input--validated\");\r\n\t\tcontainerEl.classList.add(\"a-form-input--error\");\r\n\r\n\t\terrorParagraphEl && (errorParagraphEl.innerHTML = error);\r\n\t};\r\n\r\n\tinputEl && inputEl.addEventListener('focusin', () => clear(false));\r\n\r\n\treturn {\r\n\t\tclear,\r\n\t\tsetError,\r\n\t\tenable: () => toggleEnable(true),\r\n\t\tdisable: () => toggleEnable(false),\r\n\t\tinputEl,\r\n\t\tshow: () => containerEl.classList.remove('u-hide'),\r\n\t\thide: () => containerEl.classList.add('u-hide')\r\n\t};\r\n}\r\n\r\nexport function createCheckBox(containerEl: HTMLElement, onChange?: (checked: boolean) => void, altSelector?: string) {\r\n\tconst input = createFormInput(containerEl, altSelector);\r\n\tlet event: IDisposable;\r\n\tonChange && (event = expressEventListener(input.inputEl, \"change\", () => onChange(!!input.getValue())));\r\n\r\n\treturn {\r\n\t\t...input,\r\n\t\tdispose: () => event && event.dispose\r\n\t};\r\n}\r\n\r\nexport function createSelectBox(containerEl: HTMLElement, onSelected?: (value?: string) => void) {\r\n\tconst baseComponent = createBaseFormInput(containerEl);\r\n\tconst selectEl = baseComponent.inputEl as HTMLSelectElement;\r\n\r\n\tconst setValue = (value: string) => (selectEl.value = value);\r\n\tconst onSelect = () => onSelected && onSelected(selectEl.value);\r\n\r\n\tconst disposableEvent = expressEventListener(selectEl, 'change', onSelect);\r\n\treturn {\r\n\t\t...baseComponent,\r\n\t\tdispose: disposableEvent.dispose,\r\n\t\tinputEl: selectEl,\r\n\t\tsetValue,\r\n\t\tgetValue: () => selectEl.value\r\n\t} as ISelectBox;\r\n}\r\n\r\nexport function createFormInput(containerEl: HTMLElement, altSelector?: string): IFormInput {\r\n\tconst baseComponent = createBaseFormInput(containerEl, altSelector);\r\n\tconst inputEl = baseComponent.inputEl as HTMLInputElement;\r\n\tconst isCheckBox = inputEl.type.toLowerCase() === 'checkbox';\r\n\r\n\tconst setValue = (value: string | boolean) =>\r\n\t\tisCheckBox\r\n\t\t\t? inputEl.checked = value.toString().toLowerCase() === \"true\"\r\n\t\t\t: (inputEl.value = value.toString());\r\n\r\n\tconst getValue = () =>\r\n\t\tisCheckBox\r\n\t\t\t? inputEl.checked\r\n\t\t\t: inputEl.value;\r\n\treturn {\r\n\t\tsetValue,\r\n\t\tgetValue,\r\n\t\t...baseComponent,\r\n\t\tinputEl\r\n\t};\r\n}\r\n\r\nexport function createPasswordFormInput(containerEl: HTMLElement): IPasswordInput {\r\n\tconst formInput = createFormInput(containerEl);\r\n\tconst iconEl = expressQuerySelector(containerEl, \".technical-password-unhide-icon\", false);\r\n\tlet disposableEvent: IDisposable | null;\r\n\r\n\tconst validatePassword = (): Promise => {\r\n\t\tconst value = formInput.inputEl.value;\r\n\r\n\t\tformInput.inputEl.dataset['lastvalidatedpassword'] = null;\r\n\t\tformInput.inputEl.dataset['lastvalidatedresult'] = null;\r\n\r\n\t\treturn !value || value.length < Number.parseInt(formInput.inputEl.dataset.minlength || '6', 10)\r\n\t\t\t? Promise.resolve(false)\r\n\t\t\t: postRequest<{ password: string }, boolean>('/ajaxxhr/Login/ValidatePassword',\r\n\t\t\t\t{\r\n\t\t\t\t\tpassword: stringToBase64(formInput.inputEl.value)\r\n\t\t\t\t},\r\n\t\t\t\t{ headers: { 'Content-type': 'application/json; charset=utf-8' } }).then(res => {\r\n\t\t\t\t\tformInput.inputEl.dataset['lastvalidatedpassword'] = value;\r\n\t\t\t\t\tformInput.inputEl.dataset['lastvalidatedresult'] = `${res}`;\r\n\t\t\t\t\treturn res;\r\n\t\t\t\t});\r\n\t};\r\n\r\n\tconst onPasswordShowHideIconClick = () => {\r\n\t\tswitch (formInput.inputEl.getAttribute(\"type\")) {\r\n\t\t\tcase \"password\":\r\n\t\t\t\tformInput.inputEl.setAttribute(\"type\", \"text\");\r\n\t\t\t\tif (iconEl) iconEl.classList.add(\"a-form-input__password-unhide-icon--hide\");\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"text\":\r\n\t\t\t\tformInput.inputEl.setAttribute(\"type\", \"password\");\r\n\t\t\t\tif (iconEl) iconEl.classList.remove(\"a-form-input__password-unhide-icon--hide\");\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\r\n\tconst disable = () => {\r\n\t\tformInput.disable();\r\n\t\tif (iconEl) {\r\n\t\t\ticonEl.style.cursor = 'not-allowed';\r\n\t\t\tdispose();\r\n\t\t}\r\n\t};\r\n\r\n\tconst enable = () => {\r\n\t\tformInput.enable();\r\n\t\tif (iconEl) {\r\n\t\t\ticonEl.style.cursor = 'pointer';\r\n\t\t\taddEvent();\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tif (disposableEvent) disposableEvent.dispose();\r\n\t};\r\n\tconst addEvent = () => (disposableEvent = iconEl ? expressEventListener(iconEl, 'click', onPasswordShowHideIconClick) : null);\r\n\r\n\tif (iconEl) addEvent();\r\n\r\n\treturn {\r\n\t\tvalidatePassword,\r\n\t\t...formInput,\r\n\t\tdisable,\r\n\t\tenable,\r\n\t};\r\n}\r\n\r\nexport function createSingleSlider(containerEl: HTMLElement, sendPartialUpdateForInput?: (input: HTMLInputElement | HTMLTextAreaElement) => Promise) : ISlider {\r\n\tconst baseComponent = createBaseFormInput(containerEl, '.technical-slider-max-range');\r\n\tconst sliderMaxRangeEl = expressQuerySelector(containerEl, \".technical-slider-max-range\", true);\r\n\tconst sliderLabelEls = expressQuerySelectorAll(containerEl, '.technical-slider-label');\r\n\tconst sliderPostBarEl = expressQuerySelector(containerEl, \".technical-slider-post-bar\", true);\r\n\tlet currentValue = '';\r\n\tinterface ISnapData {\r\n\t\tsnappingPos: number,\r\n\t\tsnappingValue: number\r\n\t}\r\n\r\n\tconst snappingArray: ISnapData[] = [];\r\n\r\n\tconst onSliderInput = () => {\r\n\t\tcurrentValue = sliderMaxRangeEl.value;\r\n\t};\r\n\r\n\tconst disposableEvents = compositeDisposable(\r\n\t\t[\r\n\t\t\texpressEventListener(sliderMaxRangeEl, 'input', onSliderInput)\r\n\t\t]\r\n\t);\r\n\r\n\tconst setValue = (value: string) => {\r\n\t\tsliderMaxRangeEl.value = value;\r\n\t};\r\n\r\n\tconst getValue = () => {\r\n\t\treturn currentValue;\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tif (disposableEvents) disposableEvents.dispose();\r\n\t};\r\n\r\n\tconst orderLabels = () => {\r\n\t\tconst handleWidth = 17;\r\n\t\tconst sliderRect = sliderMaxRangeEl.getBoundingClientRect();\r\n\t\tconst sliderWidth = sliderRect.width;\r\n\t\tconst labelCount = sliderLabelEls.length;\r\n\t\tconst singleValueToTheLeft = (sliderWidth - handleWidth) / (labelCount - 1);\r\n\t\tsliderLabelEls.forEach((labelEl, index) => {\r\n\t\t\tconst valueToTheLeft = (singleValueToTheLeft * index) + (handleWidth / 2);\r\n\t\t\tlabelEl.style.left = `calc(${valueToTheLeft}px - ${labelEl.offsetWidth/2}px)`;\r\n\t\t\tsnappingArray.push({snappingPos: valueToTheLeft-labelEl.offsetWidth/2, snappingValue : index-1} as ISnapData);\r\n\t\t});\r\n\t};\r\n\r\n\tif (sliderLabelEls && sliderLabelEls.length) {\r\n\t\torderLabels();\r\n\t\tconst onLabelClick = (ev: MouseEvent) => {\r\n\t\t\tconst currentLabelEl = ev.currentTarget as HTMLSpanElement;\r\n\t\t\tsliderMaxRangeEl.value = currentLabelEl.innerText;\r\n\t\t\tsendPartialUpdateForInput && sendPartialUpdateForInput(sliderMaxRangeEl);\r\n\t\t};\r\n\t\tdisposableEvents.add(expressEventListener(window, 'resize', debounce(orderLabels, 250)));\r\n\t\tsliderLabelEls.forEach((labelEl, index) => {\r\n\t\t\tdisposableEvents.add(expressEventListener(labelEl, 'click', onLabelClick));\r\n\t\t});\r\n\t}\r\n\r\n\treturn {\r\n\t\t...baseComponent,\r\n\t\tdispose,\r\n\t\tsetValue,\r\n\t\tgetValue\r\n\t};\r\n}\r\n\r\ninterface IAutoCompleteItem extends IAutocompleteItem {\r\n\treadonly value: string;\r\n\treadonly label: string;\r\n}\r\n\r\nexport interface ICreateTextInputWithAutoCompleteDependencies {\r\n\treadonly autoCompleteSearch: (searchTerm: string) => Promise<{ value: string, label: string }[]>;\r\n\treadonly onSelect?: (item: { value: string, label: string }) => void;\r\n\treadonly customize?: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number) => void;\r\n\treadonly onOpen?: () => void,\r\n\treadonly onClose?: () => void,\r\n\treadonly renderTextContent?: (item: { value: string, label: string }, currentSearchterm: string) => string;\r\n\treadonly debounceWaitMs?: number;\r\n\treadonly containerInsertPosition?: InsertPosition;\r\n\treadonly containerClass?: string;\r\n\treadonly disableAutoSelect?: boolean;\r\n\treadonly preventSubmit?: boolean;\r\n\treadonly minLength?: number;\r\n}\r\n\r\nexport function createTextInputWithAutoComplete(inputEl: HTMLInputElement, deps: ICreateTextInputWithAutoCompleteDependencies) {\r\n\tconst onCloseDisposable = compositeDisposable([]);\r\n\tinputEl.setAttribute('autocomplete', 'off');\r\n\t// defaults are for choice of delivery\r\n\tconst {\r\n\t\tautoCompleteSearch,\r\n\t\tonSelect,\r\n\t\tcustomize,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t\trenderTextContent,\r\n\t\tdebounceWaitMs = 250,\r\n\t\tcontainerInsertPosition = 'beforeend',\r\n\t\tcontainerClass = 'm-autocomplete a-form-input__autocomplete',\r\n\t\tdisableAutoSelect = true,\r\n\t\tpreventSubmit = false,\r\n\t\tminLength = 3\r\n\t} = deps;\r\n\r\n\tconst onMouseDownEvent = (ev: MouseEvent, container: HTMLDivElement) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (getParents(ev.target, \".technical-search-suggestions\").length < 1) onClose();\r\n\t\tcontainer.remove();\r\n\t\tonCloseDisposable.dispose();\r\n\t};\r\n\r\n\tconst autocompleteResult = autocomplete({\r\n\t\tminLength,\r\n\t\tinput: inputEl,\r\n\t\tdisableAutoSelect,\r\n\t\tpreventSubmit,\r\n\t\tonSelect: (item: IAutoCompleteItem, input) => {\r\n\t\t\tinput.value = item.label || item.value;\r\n\t\t\tonSelect && onSelect({ value: item.value, label: item.label });\r\n\t\t},\r\n\t\tfetch: (text: string, update: (items: IAutoCompleteItem[]) => void) => {\r\n\t\t\ttext = text.toLowerCase();\r\n\t\t\tautoCompleteSearch(text)\r\n\t\t\t\t.then(res => update(res as IAutoCompleteItem[]));\r\n\t\t},\r\n\t\trender: (item: IAutoCompleteItem, currentValue: string) => {\r\n\t\t\tconst itemEl = document.createElement(\"div\");\r\n\t\t\texpressAddClass(itemEl, 'm-autocomplete__item autocomplete-suggestion technical-search-suggestions');\r\n\t\t\titemEl.innerHTML = renderTextContent && renderTextContent(item, currentValue) || `${item.label} - ${item.value}`;\r\n\r\n\t\t\treturn itemEl;\r\n\t\t},\r\n\t\tcustomize: (input: HTMLInputElement, inputRect: ClientRect | DOMRect, container: HTMLDivElement, maxHeight: number): void => {\r\n\t\t\tcustomize && customize(input, inputRect, container, maxHeight);\r\n\t\t\texpressRemoveClass(container, 'autocomplete');\r\n\t\t\texpressAddClass(container, containerClass);\r\n\t\t\tcontainer.removeAttribute('style');\r\n\t\t\tcontainer.style.display = \"block\";\r\n\t\t\tconst inputContainerEl = input.parentElement!;\r\n\t\t\tinputContainerEl.insertAdjacentElement(containerInsertPosition, container);\r\n\t\t\tonOpen && onOpen();\r\n\t\t\tif (onClose) {\r\n\t\t\t\tgetParents(container).forEach(el => {\r\n\t\t\t\t\tonCloseDisposable.add(expressEventListener(el, \"mousedown\", (ev) => { onMouseDownEvent(ev, container); }));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\t\tdebounceWaitMs\r\n\t});\r\n\r\n\tconst disposable = onClose\r\n\t\t? compositeDisposable([expressEventListener(inputEl, 'input', _ => { if (inputEl.value && inputEl.value.length < minLength) onClose(); })])\r\n\t\t: null;\r\n\r\n\treturn {\r\n\t\tdispose: () => { disposable && disposable.dispose(); onCloseDisposable && onCloseDisposable.dispose; autocompleteResult.destroy(); },\r\n\t};\r\n}\r\n","import { deleteRequest, getHtmlRequest, postRequest } from \"../utils/fetch\";\r\nimport { stringToBase64 } from \"../utils/string\";\r\n\r\nexport interface IToggleSubscription {\r\n\tapplicationId: string;\r\n\tpersonId: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\temail: string;\r\n\tsource: string;\r\n\tnewsletter: boolean;\r\n\tpersonalMessage?: boolean;\r\n\tmailFrequency?: number;\r\n\tpostalMail?: boolean;\r\n\temarsysData?: string;\r\n}\r\n\r\nexport interface ISubscription {\r\n\tapplicationId: string;\r\n\tpointOfSaleId: string;\r\n\tlanguage: string;\r\n\temail: string;\r\n\tsource: string;\r\n}\r\n\r\nexport interface IUnSubscription {\r\n\tapplicationId: string;\r\n\tpointOfSaleId: string;\r\n\tpersonId: string;\r\n\temarsysData?: string;\r\n}\r\n\r\nexport function subscribeAsync(email: string, appId: string, posId: string, lang: string, source?: string) {\r\n\tconst subscription: ISubscription = {\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tlanguage: lang,\r\n\t\temail,\r\n\t\tsource\r\n\t};\r\n\r\n\treturn postRequest(window.context.ecomApiUrl + \"/subscriptions/subscribe\", subscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport function toggleSubscribeAsync(personId: string, email: string, appId: string, posId: string, lang: string, source?: string, newsletter?: boolean, personalMessage?: boolean, mailFrequency?: number, postalMail?: boolean, emarsysData?: string) {\r\n\tconst toggleSubscription: IToggleSubscription = {\r\n\t\tpersonId,\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tlanguage: lang,\r\n\t\temail,\r\n\t\tsource,\r\n\t\tnewsletter,\r\n\t\tpersonalMessage,\r\n\t\tmailFrequency,\r\n\t\tpostalMail,\r\n\t\temarsysData\r\n\t};\r\n\r\n\treturn postRequest(window.context.ecomApiUrl + \"/subscriptions/togglesubscribe\", toggleSubscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport function unSubscribeAsync(personId: string, appId: string, posId: string, emarsysData?: string) {\r\n\tconst unSubscription: IUnSubscription = {\r\n\t\tapplicationId: appId,\r\n\t\tpointOfSaleId: posId,\r\n\t\tpersonId: personId,\r\n\t\temarsysData: emarsysData\r\n\t};\r\n\r\n\treturn deleteRequest(window.context.ecomApiUrl + \"/subscriptions/unsubscribe\", unSubscription, { headers: new Headers({ 'Content-type': 'application/json; charset=utf-8' }) });\r\n}\r\n\r\nexport enum Gender {\r\n\tUndefined = 0,\r\n\tMale = 1,\r\n\tFemale = 2,\r\n\tNeutral = 3\r\n}\r\n\r\nexport interface IAccount {\r\n\tfirstName: string;\r\n\tlastName: string;\r\n\temail: string;\r\n\tgender: Gender;\r\n\tdateOfBirth: Date | null;\r\n\tmobileNumber: string;\r\n\tpersonalNumber?: string;\r\n}\r\n\r\nexport enum UpdateAccountResult {\r\n\tsuccess = 0,\r\n\tduplicateEmail = 1,\r\n\tduplicateEmailInOtherDomain = 2\r\n}\r\n\r\nexport function updateAccountAsync(pointOfSaleId: string, account: IAccount): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId,\r\n\t\taccount: account\r\n\t};\r\n\treturn postRequest<{ pointOfSaleId, account }, IUpdateAccountResponse>('/apicore/myaccountapi/updateaccount', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IMailInOtherDomainError {\r\n\treadonly urlWithLink: string,\r\n\treadonly accountEmail: string\r\n}\r\n\r\nexport interface ISetPasswordResponse {\r\n\treadonly status: ChangePasswordStatus,\r\n\treadonly label: string\r\n}\r\n\r\nexport interface IUpdateAccountResponse {\r\n\treadonly status: UpdateAccountResult,\r\n\treadonly label: string\r\n}\r\n\r\nexport function getDuplicateMailInOtherDomainError(accountEmail: string, pointOfSaleId: string): Promise {\r\n\tconst args = {\r\n\t\taccountEmail,\r\n\t\tpointOfSaleId\r\n\t};\r\n\r\n\treturn postRequest<{ accountEmail, pointOfSaleId }, IMailInOtherDomainError>('/apicore/myaccountapi/getduplicatemailinotherdomainerror', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport enum ChangePasswordStatus {\r\n\tOK = 0,\r\n\tInvalidFormat,\r\n\tEqualToOld,\r\n\tInvalidOld,\r\n\tInvalidNew,\r\n\tWeakPassword,\r\n\tError\r\n}\r\nexport function setPasswordAsync(oldPassword: string, newPassword: string, pointOfSaleId: string): Promise {\r\n\tconst args = { oldPassword, newPassword, pointOfSaleId };\r\n\r\n\targs.oldPassword = stringToBase64(oldPassword);\r\n\targs.newPassword = stringToBase64(newPassword);\r\n\treturn postRequest('/apicore/myaccountapi/setpassword', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function getAddressTiles(currentpage: string): Promise {\r\n\treturn getHtmlRequest(`/apicore/myaccountapi/getaddresstiles?currentpage=${currentpage}`, { cache: \"no-cache\" });\r\n}\r\n\r\nexport enum OkResult {\r\n\tOK = 0\r\n}\r\n\r\nexport function setAccountPreferencesAsync(configKey: string, value: boolean): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tconfigKey,\r\n\t\tvalue: value.toString()\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/setaccountpreferences', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function saveProductPreferencesAsync(disableAutoRedEyeRemoval: boolean, enableToggleimageenhancement: boolean): Promise {\r\n\tconst args = {\r\n\t\tpointOfSaleId: window.context.pointOfSaleId,\r\n\t\tdisableAutoRedEyeRemoval,\r\n\t\tenableToggleimageenhancement\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/saveproductpreferences', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport function setImageEnhancementAsync(enable: boolean): Promise {\r\n\tconst args = {\r\n\t\tenable\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/toggleimageenhancement', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IGdprAccountResult {\r\n\tsuccess: boolean;\r\n\tinfo: string;\r\n}\r\n\r\nexport function actionByMethodOnAccountAsync(method: string, password: string): Promise {\r\n\tconst args = {\r\n\t\tpassword\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/' + method, args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface IGdprDownload {\r\n\tgdprDownloadLink: string;\r\n}\r\n\r\nexport function canDownloadGdprDataAsync(): Promise {\r\n\tconst args = {};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/CanDownloadGdprData', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n\r\nexport interface ICheckAccountValidityResponse {\r\n\treadonly isValid: boolean;\r\n}\r\n\r\nexport function checkAccountValidityAsync(oldAccountId: string, newAccountId: string): Promise {\r\n\tconst args = {\r\n\t\toldAccountId,\r\n\t\tnewAccountId\r\n\t};\r\n\r\n\treturn postRequest('/apicore/myaccountapi/CheckAccountValidity', args, { headers: { 'Content-type': 'application/json; charset=utf-8' } });\r\n}\r\n","import {\r\n\texpressEventListener,\r\n\texpressQuerySelector, expressQuerySelectorAll,\r\n\tgetParentWithClassName, getSelfOrParentWithClassName\r\n} from \"../common/html\";\r\nimport { createButton } from \"./button\";\r\nimport {\r\n\tcreateFormInput,\r\n\tcreatePasswordFormInput,\r\n\tcreateSelectBox,\r\n\tcreateSingleSlider,\r\n\tIFormInput,\r\n\tIPasswordInput,\r\n\tISelectBox, ISlider\r\n} from \"./form-input\";\r\nimport { IDisposable } from \"../utils/disposable\";\r\nimport {debounce} from \"../utils/debounce\";\r\n\r\nexport interface IInitFormDependencies {\r\n\treadonly alternativeButton?: HTMLButtonElement;\r\n\treadonly buttonSelector?: string;\r\n\treadonly onSubmitForm: (data: { [inputName: string]: string }) => Promise;\r\n\treadonly submitOnEnter?: boolean;\r\n\treadonly validatorOptions?: ICreateFromValidatorOptions;\r\n\treadonly showFirstErrorOnValidate?: boolean;\r\n\treadonly enablePartialSubmit?: boolean;\r\n\treadonly partialSubmit?: (ev: Event) => Promise;\r\n\treadonly sendPartialUpdateForInput?: (input: HTMLInputElement | HTMLTextAreaElement) => Promise;\r\n}\r\n\r\n// provide custom behaviour\r\nexport interface ICreateFromValidatorOptions {\r\n\treadonly classTo?: string; // class of the parent element where the error/success class is added\r\n\treadonly errorClass?: string;\r\n\treadonly successClass?: string;\r\n\treadonly errorTextParent?: string; // class of the parent element where error text element is appended\r\n\treadonly errorTextTag?: string; // type of element to create for the error text\r\n\treadonly errorTextClass?: string; // class of the error text element\r\n\treadonly onValidate?: () => void;\r\n}\r\n\r\nexport interface IFormValidator {\r\n\treadonly validate: () => boolean;\r\n\treadonly reset: () => void;\r\n}\r\n\r\nexport interface IForm {\r\n\treadonly dispose: () => void;\r\n\treadonly disableForm: (disable: boolean) => void;\r\n\treadonly disableInput: (name: string) => void;\r\n\treadonly validate: () => Promise;\r\n\treadonly setErrors: (clear?: boolean, ...errors: { name: string, error: string }[]) => void;\r\n\treadonly clearInputs: (clearValue?: boolean, ...names: string[]) => void;\r\n\treadonly clearAll: () => void;\r\n\treadonly setValues: (...values: { name: string, value: string }[]) => void;\r\n\treadonly hideInput: (name: string) => void;\r\n\treadonly inputs: { [p: string]: ISelectBox | IFormInput }\r\n\treadonly getAllVisibleInputs: () => (ISelectBox | IFormInput | ISlider)[]\r\n}\r\n\r\nexport function initForm(formEl: HTMLFormElement, deps: IInitFormDependencies) {\r\n\tconst {\r\n\t\talternativeButton,\r\n\t\tonSubmitForm,\r\n\t\tbuttonSelector,\r\n\t\tsubmitOnEnter,\r\n\t\tvalidatorOptions,\r\n\t\tshowFirstErrorOnValidate,\r\n\t\tenablePartialSubmit,\r\n\t\tpartialSubmit,\r\n\t\tsendPartialUpdateForInput\r\n\t} = deps;\r\n\tconst submitButtonEl = alternativeButton || expressQuerySelector(formEl, buttonSelector || '.m-form__button-continue', true);\r\n\tconst validator = createFormValidator(formEl, validatorOptions);\r\n\tlet onKeyUpEvent: IDisposable;\r\n\tconst formElements = [].slice.call(formEl.elements);\r\n\tconst inputs: { [name: string]: ISelectBox | IFormInput | ISlider; } = {};\r\n\tlet invalidFormFields: HTMLElement[];\r\n\tlet isValid: boolean;\r\n\r\n\tformElements\r\n\t\t.filter(el => !el.matches(\"button\"))\r\n\t\t.forEach(el => {\r\n\t\t\t// The element can be : INPUT (regular or password), TEXTAREA, SELECT,\r\n\t\t\tlet input: ISelectBox | IFormInput | ISlider | null = null;\r\n\t\t\tconst email = el.attributes.getNamedItem(\"email\");\r\n\t\t\tif ((email && email.value === \"email\") || el.type === \"email\")\r\n\t\t\t\tel.maxLength = 100;\r\n\r\n\t\t\tif (el.classList.contains(\"a-form-input__slider-range\"))\r\n\t\t\t\tinput = createSingleSlider(getParentWithClassName(el, 'a-form-input')!, sendPartialUpdateForInput);\r\n\t\t\telse if (el.classList.contains('a-form-input__select'))\r\n\t\t\t\tinput = createSelectBox(getParentWithClassName(el, 'a-form-input')!);\r\n\t\t\telse if (el.classList.contains('a-form-input__input'))\r\n\t\t\t\tinput = el.type === \"password\" ? createPasswordFormInput(getParentWithClassName(el, 'a-form-input')!) : createFormInput(getParentWithClassName(el, 'a-form-input')!);\r\n\r\n\t\t\t// If not those 3, it's something else -> leave it alone\r\n\t\t\tif (input)\r\n\t\t\t\tinputs[input.inputEl.id.toLowerCase()] = input;\r\n\t\t});\r\n\r\n\tconst getInputs = () => Object.keys(inputs).map(key => inputs[key]);\r\n\r\n\tconst clearAll = (clearValues = false) => {\r\n\t\tgetInputs()\r\n\t\t\t.map(input => {\r\n\t\t\t\tinput.clear(clearValues);\r\n\t\t\t\tinput.setError('', true);\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst getAllVisibleInputs = () => {\r\n\t\tconst visibleInputs: (ISelectBox | IFormInput | ISlider)[] = [];\r\n\t\tgetInputs().forEach(input => {\r\n\t\t\tif (!getSelfOrParentWithClassName(input.inputEl, 'u-hide')) {\r\n\t\t\t\tvisibleInputs.push(input);\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn visibleInputs;\r\n\t};\r\n\r\n\tconst resetValidation = () => {\r\n\t\tclearAll();\r\n\t\tvalidator.reset();\r\n\t};\r\n\r\n\tconst validate = async (): Promise => {\r\n\t\tresetValidation();\r\n\t\tinvalidFormFields = [];\r\n\t\tisValid = false;\r\n\r\n\t\t// Pristine validation cannot handle async api calls\r\n\t\t// Call the validation before the pristine call\r\n\t\t// So pristine can look at dataattributes to valiate\r\n\t\tconst validations = Object.keys(inputs)\r\n\t\t\t.map(name => !inputs[name]['validatePassword'] ? Promise.resolve(true) : (inputs[name] as IPasswordInput).validatePassword());\r\n\t\tawait Promise.all(validations);\r\n\r\n\t\tisValid = validator.validate();\r\n\t\tif (!isValid && showFirstErrorOnValidate) {\r\n\t\t\tinvalidFormFields = expressQuerySelectorAll(formEl, \".a-form-input--error\");\r\n\t\t\tif (invalidFormFields[0]) {\r\n\t\t\t\tinvalidFormFields[0].scrollIntoView({ behavior: \"smooth\" });\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn isValid;\r\n\t};\r\n\r\n\tconst formData = () => {\r\n\t\tconst data: { [name: string]: string } = {};\r\n\t\tObject.keys(inputs).forEach(name => data[name] = inputs[name].getValue().toString() || \"\");\r\n\t\treturn data;\r\n\t};\r\n\r\n\tconst onSubmit = () => {\r\n\t\treturn validate().then(res => res ? onSubmitForm(formData()) : Promise.resolve());\r\n\t};\r\n\r\n\tconst submitButton = createButton(submitButtonEl, onSubmit);\r\n\r\n\tif (submitOnEnter && submitButtonEl && submitButtonEl.type.toLowerCase() !== \"submit\") {\r\n\t\tonKeyUpEvent = expressEventListener(\r\n\t\t\tformEl,\r\n\t\t\t'keypress',\r\n\t\t\t(ev: KeyboardEvent) => {\r\n\t\t\t\tif (ev.key === \"Enter\" || ev.keyCode === 13) {\r\n\t\t\t\t\tev.preventDefault();\r\n\t\t\t\t\tonSubmit();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n\tif (enablePartialSubmit && partialSubmit) {\r\n\t\tconst onFormInput = async (ev: Event) => {\r\n\t\t\tawait partialSubmit(ev);\r\n\t\t};\r\n\r\n\t\tconst debounceOnFormInput = debounce(onFormInput, 600);\r\n\t\tformEl.addEventListener('input', (ev) => debounceOnFormInput(ev), false);\r\n\t}\r\n\r\n\tconst getInputByName: (name: string) => ISelectBox | IFormInput | ISlider | undefined =\r\n\t\t(name: string) => inputs[name.toLowerCase()];\r\n\r\n\tconst dispose = () => {\r\n\t\tclearAll(true);\r\n\t\tsubmitButton.dispose();\r\n\t\tonKeyUpEvent && onKeyUpEvent.dispose();\r\n\t};\r\n\r\n\tconst toggleSubmitButton = (enable: boolean) => enable ? submitButton.enable() : submitButton.disable();\r\n\r\n\tconst setError = (name: string, error: string, clear = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setError(error, clear);\r\n\t};\r\n\r\n\tconst setErrors = (clear = false, ...errors: { name: string, error: string }[]) => {\r\n\t\terrors.forEach(e => setError(e.name, e.error, clear));\r\n\t\tif (errors.length) {\r\n\t\t\tconst input = getInputByName(errors[0].name);\r\n\t\t\tif (input) input.inputEl.parentElement!.scrollIntoView({ behavior: \"smooth\", block: \"center\" });\r\n\t\t}\r\n\t};\r\n\r\n\tconst clearInput = (name: string, clearValue = false) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.clear(clearValue);\r\n\t};\r\n\r\n\tconst clearInputs = (clearValue = false, ...names: string[]) => names.forEach(name => clearInput(name, clearValue));\r\n\r\n\tconst disableForm = (disable: boolean) => {\r\n\t\tgetInputs().map(i => disable ? i.disable() : i.enable());\r\n\t\tresetValidation();\r\n\t\ttoggleSubmitButton(!disable);\r\n\t};\r\n\r\n\tconst disableInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.disable();\r\n\t};\r\n\r\n\tconst setValue = (name: string, value: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.setValue(value);\r\n\t};\r\n\r\n\tconst setValues = (...values: { name: string, value: string }[]) =>\r\n\t\tvalues.filter(v => getInputByName(v.name))\r\n\t\t\t.forEach(v => setValue(v.name, v.value));\r\n\r\n\tconst hideInput = (name: string) => {\r\n\t\tconst input = getInputByName(name);\r\n\t\tif (input) input.hide();\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tdisableForm,\r\n\t\tdisableInput,\r\n\t\tvalidate,\r\n\t\tsetErrors,\r\n\t\tclearInputs,\r\n\t\tclearAll: () => clearAll(true),\r\n\t\tsetValues,\r\n\t\thideInput,\r\n\t\tinputs,\r\n\t\tgetAllVisibleInputs\r\n\t} as IForm;\r\n}\r\n\r\nexport function createFormValidator(form: HTMLFormElement, options: ICreateFromValidatorOptions = {}): IFormValidator {\r\n\r\n\tconst {\r\n\t\tclassTo = \"a-form-input\",\r\n\t\terrorClass = \"a-form-input--error\",\r\n\t\tsuccessClass = \"a-form-input--validated\",\r\n\t\terrorTextClass = \"a-form-input__error-text\",\r\n\t\terrorTextParent = \"a-form-input\",\r\n\t\terrorTextTag = \"p\",\r\n\t\tonValidate\r\n\t} = options;\r\n\r\n\tconst config: config = {\r\n\t\tclassTo: classTo,\r\n\t\terrorClass: errorClass,\r\n\t\tsuccessClass: successClass,\r\n\t\terrorTextClass: errorTextClass,\r\n\t\terrorTextParent: errorTextParent,\r\n\t\terrorTextTag: errorTextTag\r\n\t};\r\n\r\n\tconst validator = new Pristine(form, config, false);\r\n\tconst validate = () => {\r\n\t\tif (onValidate) onValidate();\r\n\t\treturn validator.validate();\r\n\t};\r\n\r\n\treturn {\r\n\t\tvalidate,\r\n\t\treset: () => validator.reset()\r\n\t};\r\n}\r\n","export function getFullQuerystring(url?: string): string {\r\n\turl = url || window.location.href;\r\n\tconst pos = url.indexOf(\"?\");\r\n\tif (pos > -1) {\r\n\t\treturn url.substring(pos + 1);\r\n\t} else {\r\n\t\treturn url;\r\n\t}\r\n}\r\n\r\nexport function getParameters(url?: string): { [key: string]: string } {\r\n\tconst queryString = getFullQuerystring(url);\r\n\t// remove hash parameter and split querystring param\r\n\tconst pairs = queryString.split('#')[0].split(\"&\");\r\n\tconst params: { [key: string]: string } = {};\r\n\tfor (const pair of pairs) {\r\n\t\tconst [key, value] = pair.split(\"=\");\r\n\t\tparams[key.toLowerCase()] = value !== undefined ? value : \"true\"; // Providing just the key means key=true\r\n\t}\r\n\treturn params;\r\n}\r\n\r\nexport function getParameter(key: string, url?: string, required?: boolean): string;\r\nexport function getParameter(key: string, url?: string, required = false): string {\r\n\tconst queryStringParam = getParameters(url)[key ? key.toLowerCase() : key];\r\n\tif (required && !queryStringParam) throw new Error(`No queryStringParam for Required key: ${key}`);\r\n\treturn queryStringParam;\r\n}\r\n\r\nexport function updateParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\r\n\tlet newAdditionalURL = \"\";\r\n\tlet tempArray = url.split(\"#\");\r\n\tconst hash = tempArray[1] ? tempArray[1] : '';\r\n\tconst additionalURL = tempArray[0] ? tempArray[0].split(\"?\")[1] : '';\r\n\tconst baseURL = tempArray[0] ? tempArray[0].split(\"?\")[0] : '';\r\n\tlet temp = \"\";\r\n\tif (additionalURL) {\r\n\t\ttempArray = additionalURL.split(\"&\");\r\n\t\tfor (let i = 0; i < tempArray.length; i++) {\r\n\t\t\tif (tempArray[i].split('=')[0] !== key) {\r\n\t\t\t\tnewAdditionalURL += temp + tempArray[i];\r\n\t\t\t\ttemp = \"&\";\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet result = temp;\r\n\tif (value)\r\n\t\tresult += \"\" + key + \"=\" + value;\r\n\telse\r\n\t\tresult = result.substring(0, result.length - 1);\r\n\r\n\tif (!newAdditionalURL && !result)\r\n\t\treturn baseURL + (hash ? '#' + hash : '');\r\n\r\n\treturn baseURL + \"?\" + newAdditionalURL + result + (hash ? '#' + hash : '');\r\n}\r\n\r\nexport function addParameter(key: string, value: string, url?: string): string {\r\n\turl = url || window.location.href;\r\n\tif (url.indexOf(key) > 0) return updateParameter(key, value, url);\r\n\tif (url.indexOf('?') > 0) {\r\n\t\turl += '&' + key + \"=\" + value;\r\n\t} else {\r\n\t\turl += '?' + key + \"=\" + value;\r\n\t}\r\n\treturn url;\r\n}\r\n\r\nexport function objectToQueryString(o: object): string {\r\n\treturn '?' + Object.keys(o).map(function (key) {\r\n\t\treturn key + '=' + o[key];\r\n\t}).join('&');\r\n}\r\n\r\nexport function queryRemoveKeys(queryKeys: string[]): string {\r\n\tlet url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\r\n\tqueryKeys.forEach(x => {\r\n\t\turl = updateParameter(x ? x.toLowerCase() : x, '', url);\r\n\t});\r\n\r\n\treturn url;\r\n}\r\n\r\nexport function queryRemove(): string {\r\n\tconst url = window.location.href;\r\n\tconst a = url.indexOf(\"?\");\r\n\tif (a < 0) return url; // case when no query parameters\r\n\tconst b = url.substring(a);\r\n\treturn url.replace(b, \"\");\r\n}\r\n","import {getCookie} from \"../utils/cookie\";\r\n\r\nconst trackEvent = (category: string, action: string, customParameters?: object) => {\r\n\tconst dataLayer = (window).dataLayer || [];\r\n\tdataLayer.push({\r\n\t\tevent: category,\r\n\t\taction: action,\r\n\t\t...customParameters\r\n\t});\r\n};\r\n\r\ninterface IOrderStatusParams {\r\n\torderNumber?: string;\r\n\torderStatus?: string;\r\n\tpaymentStatus?: string;\r\n\tpvc?: string;\r\n\trepro?: boolean;\r\n}\r\n\r\nexport function trackOrderStatusEvent(action: string, partialEventParams: IOrderStatusParams, nrOrdersInAccount = -1, nrItemsInOrder = -1) {\r\n\ttrackEvent('orderStatus', action, { accountId: getCookie('accid'), nrOrdersInAccount, nrItemsInOrder, ...partialEventParams });\r\n}\r\n\r\nexport function trackContactPageEvent(action: string) {\r\n\ttrackEvent('contactPage', action);\r\n}\r\n\r\nexport function trackSortingOnPop(action: string) {\r\n\ttrackEvent('sortingOnPOP', action);\r\n}\r\n\r\nexport function trackComponentEvent(action: string) {\r\n\ttrackEvent('component', action);\r\n}\r\n\r\nexport function trackAddressValidationEvent(action: string) {\r\n\ttrackEvent('addressValidation', action);\r\n}\r\n\r\nexport function trackFiltersEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('filters', action, eventParams);\r\n}\r\n\r\nexport function trackSliderEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('slider', action, eventParams);\r\n}\r\n\r\nexport function trackMgmEvent(action: string) {\r\n\ttrackEvent('MGMProgram', action);\r\n}\r\n\r\nexport function trackAccountPrefEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('accountPreferences', action, eventParams);\r\n}\r\n\r\nexport function ProductEvent(action: string, eventParams?: object) {\r\n\ttrackEvent('productSelection', action, eventParams);\r\n}\r\n\r\nexport interface IRecommendationEventParams {\r\n\tpageType?: string;\r\n\tpageCode?: string;\r\n\tpvc?: string;\r\n}\r\nexport function trackRecommendationCartEvent(action: string, recommendationLabel?: IRecommendationEventParams) {\r\n\ttrackEvent('recommendations', action, recommendationLabel);\r\n}\r\n\r\nexport interface IShopInShopEventParams {\r\n\tpvc?: string;\r\n}\r\nexport function trackShopInShopEvent(action: string, eventParams?: IShopInShopEventParams) {\r\n\ttrackEvent('shopInShop', action, eventParams);\r\n}\r\n","export function isValidTextWithoutAngleBrackets(text: string) {\r\n\tif (!text) return false;\r\n\treturn new RegExp(\"^[^<>]+$\").test(text);\r\n}\r\n\r\nexport function isValidEmailAddress (email: string) {\r\n\tconst sValidEmail = '^((([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+(\\\\.([a-zA-Z]|\\\\d|!|#|\\\\$|\\\\[|\\\\]|%|&|\\'|\\\\\\\\|\\\\/|\\\\+|\\\\-|=|\\\\?|\\\\^|\\\\*|_|{|}|`|\\\\||~)+)*)|((\\\\x22)((((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(([\\\\x01-\\\\x08\\\\x0b\\\\x0c\\\\x0e-\\\\x1f\\\\x7f]|\\\\x21|[\\\\x23-\\\\x5b]|[\\\\x5d-\\\\x7e])|(([\\\\x01-\\\\x09\\\\x0b\\\\x0c\\\\x0d-\\\\x7f]))))*(((\\\\x20|\\\\x09)*(\\\\x0d\\\\x0a))?(\\\\x20|\\\\x09)+)?(\\\\x22)))@((([a-zA-Z]|\\\\d)|(([a-zA-Z]|\\\\d)([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z]|\\\\d)))\\\\.)+(([a-zA-Z])|(([a-zA-Z])([a-zA-Z]|\\\\d|-|\\\\.|_|~)*([a-zA-Z])))$';\r\n\tconst reValidEmail = new RegExp(sValidEmail);\r\n\treturn reValidEmail.test(punycode.toUnicode(email));\r\n}\r\n\r\nexport function isValidWithoutNonAlphaNumericCharsAtEnd(text: string, el: HTMLElement) {\r\n\t// Our zipcode db contains values like 'ANTWERPEN (2000)' as city => these should be valid => if last == ) return true\r\n\tconst reg = new RegExp('^[\\\\p{L}\\\\p{N}]*$', 'u');\r\n\tconst elName = el.getAttribute(\"name\") || \"\";\r\n\t// Why trim? We allow spaces as we trim those in the backend code\r\n\tconst alsoAlsoAllowBracket = elName && elName.toLowerCase().indexOf('city') !== -1;\r\n\tconst last = text.trim().charAt(text.trim().length - 1);\r\n\treturn reg.test(last) || (alsoAlsoAllowBracket && last === ')') || last === '.';\r\n}\r\n\r\nexport function canNotContainOnlyNumerics(text: string) {\r\n\tconst reg = new RegExp('^[0-9]+$');\r\n\treturn !reg.test(text);\r\n}\r\n\r\nexport function isValidOrderNumber(orderNr: string) {\r\n\treturn onlyNumber(orderNr) && orderNr.length === 14;\r\n}\r\n\r\nexport function onlyNumber(input: string): boolean {\r\n\treturn Boolean(input.match(/^[0-9]*$/));\r\n}\r\n\r\nexport function isTempAccountEmail(email: string): boolean {\r\n\treturn email.indexOf('TEMP_ACCOUNT_') >= 0;\r\n}\r\n","import {\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressAddClass,\r\n\texpressRemoveClass,\r\n\thide,\r\n\tshow,\r\n\tisElementVisible\r\n} from \"../common/html\";\r\nimport { initForm } from \"./form\";\r\nimport { subscribeAsync, toggleSubscribeAsync } from \"../services/account-service\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\nimport {trackAccountPrefEvent} from \"../common/events\";\r\nimport {isTempAccountEmail} from \"../utils/validation\";\r\n\r\n\r\nexport function createNewsletterSubscribeAndUnsubscribe(customDocument: Element = null) {\r\n\tconst subscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-subscribe\");\r\n\tconst unSubscriptionForms = expressQuerySelectorAll(customDocument ? customDocument : document, \".technical-newsletter-unsubscribe\");\r\n\r\n\tif (subscriptionForms && subscriptionForms.length > 0) {\r\n\t\tlet ioSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterSubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tsubscriptionForms.forEach(el => ioSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tsubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterSubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (unSubscriptionForms && unSubscriptionForms.length > 0) {\r\n\t\tlet ioUnSubscribe: IntersectionObserver;\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\tioUnSubscribe = new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting) {\r\n\t\t\t\t\t\tcreateNewsletterUnsubscribe(entry.target as HTMLElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t\tunSubscriptionForms.forEach(el => ioUnSubscribe.observe(el));\r\n\t\t} else {\r\n\t\t\tunSubscriptionForms.forEach(formEL => {\r\n\t\t\t\tcreateNewsletterUnsubscribe(formEL);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport function createNewsletterSubscribe(containerEl: HTMLElement) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-subscribe-email', true);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || \"\";\r\n\tconst email = getCookie('LastUsedEmail');\r\n\r\n\temailEl.setAttribute('required', 'required');\r\n\temailEl.setAttribute('emailRFC822', 'true');\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tlet source = formEl.dataset.source || undefined;\r\n\t!source && (source = emailEl.dataset.sourceid);\r\n\r\n\tconst subscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\treturn subscribeAsync(emailEl.value, appId, posId, lang, source)\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\ttrackAccountPrefEvent( \"Subscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t\t\t\t\t\texpressAddClass(formEl, 'm-newsletter__form');\r\n\t\t\t\t\t\twriteCookieThatExpiresAtTheEndOfTheDay(\"subscribedInThisSession\", \"true\");\r\n\t\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-subscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: subscribeForm.dispose };\r\n\r\n}\r\n\r\nexport interface INewsLetterUnsubscribeOptions {\r\n\tonSuccess?: () => void;\r\n\tonError?: () => void;\r\n\tpreFillLastUsedEmail?: boolean;\r\n}\r\n\r\nexport function createNewsletterUnsubscribe(containerEl: HTMLElement, opts?: INewsLetterUnsubscribeOptions, emarsysData?: string) {\r\n\tconst formEl = expressQuerySelector(containerEl, 'form', true);\r\n\tif (!isElementVisible(formEl)) return;\r\n\tconst successMessageEl = expressQuerySelector(containerEl, '.technical-success-message', false);\r\n\tconst errorMessageEl = expressQuerySelector(containerEl, '.technical-error-message', false);\r\n\tconst emailEl = expressQuerySelector(formEl, '.technical-unsubscribe-mail', false);\r\n\tconst checkBoxEl = expressQuerySelector(formEl, '#newsletter', false);\r\n\tconst emptyGuid = '00000000-0000-0000-0000-000000000000';\r\n\tconst appId = containerEl.dataset.appid || emptyGuid;\r\n\tconst posId = containerEl.dataset.posid || emptyGuid;\r\n\tconst lang = containerEl.dataset.lang || window.context.language;\r\n\tconst preFillLastUsedEmail = opts ? opts.preFillLastUsedEmail !== undefined ? opts.preFillLastUsedEmail : true : true;\r\n\tconst email = getParameter('email') || preFillLastUsedEmail ? getCookie('LastUsedEmail') : '';\r\n\r\n\t// we prefill the email client side because of the html caching\r\n\tif (email && !isTempAccountEmail(email)) emailEl.value = email;\r\n\r\n\tconst showSuccessMessage = () => {\r\n\t\tsuccessMessageEl && expressRemoveClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressAddClass(errorMessageEl, \"u-hide\");\r\n\t\thide(formEl);\r\n\t\texpressAddClass(containerEl, \"m-newsletter--success\");\r\n\t};\r\n\r\n\tconst showErrorMessage = () => {\r\n\t\tsuccessMessageEl && expressAddClass(successMessageEl, \"u-hide\");\r\n\t\terrorMessageEl && expressRemoveClass(errorMessageEl, \"u-hide\");\r\n\t\tshow(formEl);\r\n\t};\r\n\r\n\temailEl && emailEl.setAttribute('required', 'required');\r\n\tif (checkBoxEl) checkBoxEl.setAttribute('required', 'required');\r\n\r\n\tconst unsubscribeForm = initForm(\r\n\t\tformEl,\r\n\t\t{\r\n\t\t\tonSubmitForm: () => {\r\n\t\t\t\tconst personIdFromQuery = getParameter(\"personid\");\r\n\t\t\t\treturn (emailEl && emailEl.value) || personIdFromQuery\r\n\t\t\t\t\t? toggleSubscribeAsync(personIdFromQuery, emailEl && emailEl.value, appId, posId, lang, 'NewsletterUnsubscribe', false, false, undefined, undefined, emarsysData)\r\n\t\t\t\t\t\t.then(_ => {\r\n\t\t\t\t\t\t\topts?.onSuccess ? opts.onSuccess() : showSuccessMessage();\r\n\t\t\t\t\t\t\ttrackAccountPrefEvent(\"Unsubscribe to newsletter\", { page: window.context.pageName });\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(_ => opts?.onError ? opts.onError() : showErrorMessage())\r\n\t\t\t\t\t: Promise.resolve(opts?.onSuccess ? opts.onSuccess() : showSuccessMessage());\r\n\t\t\t},\r\n\t\t\tbuttonSelector: \".technical-unsubscribe-button\",\r\n\t\t\tsubmitOnEnter: true\r\n\t\t}\r\n\t);\r\n\r\n\treturn { dispose: unsubscribeForm.dispose };\r\n}\r\n","export function isTouchDevice (): boolean {\r\n\tlet result = false;\r\n\tif (window.PointerEvent && ('maxTouchPoints' in navigator)) {\r\n\t\tif (navigator.maxTouchPoints > 0) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t} else {\r\n\t\tif (window.matchMedia && window.matchMedia(\"(any-pointer:coarse)\").matches) {\r\n\t\t\tresult = true;\r\n\t\t} else if (window.TouchEvent || ('ontouchstart' in window)) {\r\n\t\t\tresult = true;\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nexport function isMobileDevice (): boolean {\r\n\treturn window.matchMedia(\"only screen and (max-width: 960px)\").matches;\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\tgetParentWithClassName,\r\n\thasClass,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass\r\n} from \"../common/html\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { isTouchDevice } from \"../common/device\";\r\nimport { debounce } from \"../utils/debounce\";\r\n\r\nexport interface ICreateNavigationDesktopDependencies {\r\n\treadonly loadDesktopMenuItemAsync: (firstLevel: number, secondLevel: number) => Promise;\r\n}\r\n\r\nexport function initNavigationDesktop(containerEl: HTMLElement, deps: ICreateNavigationDesktopDependencies) {\r\n\tconst firstLevelMenuEls = expressQuerySelectorAll(containerEl, \".technical-desktop-first-level-menu-item\");\r\n\tconst { loadDesktopMenuItemAsync } = deps;\r\n\tconst loadedMenuItemsKeys: number[][] = [];\r\n\tlet disposable: IDisposable;\r\n\tconst firstLevelActiveClass = \"o-menu-first-level__button--active\";\r\n\tconst secondLevelActiveClass = \"o-menu-second-level__list-item--active\";\r\n\r\n\tconst closeMenu = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tconst clickedItem = e.currentTarget as HTMLElement;\r\n\t\tif (getParentWithClassName(clickedItem, 'o-menu-second-level__list')) return;\r\n\t\tfirstLevelMenuEls.forEach(el => closeFirstLevelMenuItemAndResetChildMenus(el));\r\n\t};\r\n\r\n\tconst closeFirstLevelMenuItemAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst buttonEL = expressQuerySelector(menuItem, '.technical-level1-button', true);\r\n\t\texpressRemoveClass(buttonEL, firstLevelActiveClass);\r\n\t\tcloseAllSecondLevelMenuItemsAndResetChildMenus(menuItem);\r\n\t};\r\n\r\n\tconst closeAllSecondLevelMenuItemsAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst secondLevelMenuEls = expressQuerySelectorAll(menuItem, '.technical-desktop-menu-second');\r\n\t\tsecondLevelMenuEls.forEach(secondLevelMenuEl => {\r\n\t\t\texpressAddClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(secondLevelMenuEl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst closeAllThirdLevelMenuItemsAndResetChildMenus = (menuItem: HTMLElement) => {\r\n\t\tconst allThirdLevelMenuItems = expressQuerySelectorAll(menuItem, '.technical-desktop-second-level-menu-item');\r\n\t\tallThirdLevelMenuItems.forEach(el => {\r\n\t\t\tconst contentEl = expressQuerySelector(el, '.technical-desktop-second-level-content', false);\r\n\t\t\tcontentEl && expressAddClass(contentEl, 'u-hide');\r\n\t\t\texpressRemoveClass(el, secondLevelActiveClass);\r\n\t\t});\r\n\t};\r\n\r\n\tconst getOrLoadFirstLevelMenuItem = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (e.type.toLowerCase() === \"mouseenter\" && isTouchDevice()) return;\r\n\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\tconst secondLevelMenuEl = expressQuerySelector(menuItem, '.technical-desktop-menu-second', true);\r\n\t\tconst buttonEL = expressQuerySelector(menuItem, '.technical-level1-button', true);\r\n\r\n\t\tconst closeMenuOnMouseOut = (e: MouseEvent) => {\r\n\t\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\t\tcloseFirstLevelMenuItemAndResetChildMenus(menuItem);\r\n\t\t};\r\n\r\n\t\t// First hide all other items\r\n\t\tconst allSecondLevelMenuItems = expressQuerySelectorAll(containerEl, '.technical-desktop-menu-second');\r\n\t\tallSecondLevelMenuItems.forEach(el => closeAllSecondLevelMenuItemsAndResetChildMenus(el));\r\n\r\n\t\t// Set selected item and fetch content if needed\r\n\t\tif (expressQuerySelectorAll(secondLevelMenuEl, \".o-menu-second-level__list.skeleton-loading\").length === 1) {\r\n\t\t\tconst itemKey = parseInt(menuItem.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst alreadyLoaded = itemKey in loadedMenuItemsKeys;\r\n\t\t\tif (!alreadyLoaded) {\r\n\t\t\t\tloadedMenuItemsKeys[itemKey] = [];\r\n\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\tloadDesktopMenuItemAsync(itemKey, -1).then(res => {\r\n\t\t\t\t\tsecondLevelMenuEl.innerHTML = \"\"; // this removes the skeleton loading\r\n\t\t\t\t\tsecondLevelMenuEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\twindow.addEventListener('resize', () => {\r\n\t\t\t\t\t\tdebounce(() => {\r\n\t\t\t\t\t\t\tif (!secondLevelMenuEl) return;\r\n\t\t\t\t\t\t\tsecondLevelMenuEl.style.top = Math.floor(expressQuerySelector(document, '.technical-header', true).clientHeight) + 'px';\r\n\t\t\t\t\t\t}, 250);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tsecondLevelMenuEl.style.top = Math.floor(expressQuerySelector(document, '.technical-header', true).clientHeight) + 'px';\r\n\t\t\t\t\tconst buttonEls = expressQuerySelectorAll(secondLevelMenuEl, '.technical-third-link-item');\r\n\t\t\t\t\tif (buttonEls.length && buttonEls.every(x => x.nodeName.toLowerCase() === 'a')) {\r\n\t\t\t\t\t\tconst subMenuListEl = expressQuerySelector(secondLevelMenuEl, '.o-menu-second-level__list', true);\r\n\t\t\t\t\t\tsubMenuListEl.style.left = (menuItem.offsetLeft - containerEl.offsetLeft) + \"px\";\r\n\t\t\t\t\t}\r\n\t\t\t\t\tinitSecondLevelListeners();\r\n\t\t\t\t\t// To prevent opening the menu, when the visitor already moved to another menu item, we check the active class again\r\n\t\t\t\t\tif (hasClass(buttonEL, firstLevelActiveClass)) expressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t});\r\n\t\t\t\tdisposable.add(compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'mouseleave', closeMenuOnMouseOut))));\r\n\t\t\t\tdisposable.add(expressEventListener(secondLevelMenuEl, 'click', closeMenu));\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (e.type.toLowerCase() === \"click\" && isTouchDevice()) {\r\n\t\t\t\tif (hasClass(buttonEL, firstLevelActiveClass)) {\r\n\t\t\t\t\texpressRemoveClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\t\texpressAddClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(secondLevelMenuEl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\t\texpressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\texpressAddClass(buttonEL, firstLevelActiveClass);\r\n\t\t\t\texpressRemoveClass(secondLevelMenuEl, 'u-hide');\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst initFirstLevelListeners = () => {\r\n\t\tdisposable = compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'mouseenter', getOrLoadFirstLevelMenuItem)));\r\n\t\tdisposable.add(compositeDisposable(firstLevelMenuEls.map(el => expressEventListener(el, 'click', getOrLoadFirstLevelMenuItem))));\r\n\t};\r\n\r\n\tconst getOrLoadSecondLevelMenuItem = (e: MouseEvent) => {\r\n\t\te.stopPropagation();\r\n\t\tif (e.type.toLowerCase() === \"mouseenter\" && isTouchDevice()) return;\r\n\t\tconst menuItem = e.currentTarget as HTMLElement;\r\n\t\tif (hasClass(menuItem, secondLevelActiveClass)) return;\r\n\t\tconst parent = menuItem.closest(\".technical-desktop-first-level-menu-item\") as HTMLElement;\r\n\r\n\t\t// First hide all other items\r\n\t\tcloseAllThirdLevelMenuItemsAndResetChildMenus(parent);\r\n\r\n\t\t// Set selected item and fetch content if needed\r\n\t\texpressAddClass(menuItem, secondLevelActiveClass);\r\n\t\tconst contentEl = expressQuerySelector(menuItem, '.technical-desktop-second-level-content', false);\r\n\t\tcontentEl && expressRemoveClass(contentEl, 'u-hide');\r\n\r\n\t\tconst buttonEl = expressQuerySelector(menuItem, '.technical-third-link-item', true);\r\n\t\tif (buttonEl.nodeName.toLowerCase() === \"button\") {\r\n\t\t\tconst firstLevelIndex = parseInt(parent.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst secondLevelIndex = parseInt(menuItem.getAttribute(\"data-menu-item\") || \"\", 10);\r\n\t\t\tconst alreadyLoaded = loadedMenuItemsKeys[firstLevelIndex] && loadedMenuItemsKeys[firstLevelIndex].includes(secondLevelIndex);\r\n\r\n\t\t\tif (!alreadyLoaded) {\r\n\t\t\t\tloadedMenuItemsKeys[firstLevelIndex].push(secondLevelIndex);\r\n\t\t\t\tloadDesktopMenuItemAsync(firstLevelIndex, secondLevelIndex).then(res => {\r\n\t\t\t\t\tmenuItem.querySelector(\".technical-desktop-second-level-content\").innerHTML = res;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst initSecondLevelListeners = () => {\r\n\t\tconst secondLevelMenuEls = expressQuerySelectorAll(containerEl, \".technical-desktop-second-level-menu-item\");\r\n\t\tdisposable.add(compositeDisposable(secondLevelMenuEls.map(el => expressEventListener(el, 'mouseenter', getOrLoadSecondLevelMenuItem))));\r\n\t\tdisposable.add(compositeDisposable(secondLevelMenuEls.map(el => expressEventListener(el, 'click', getOrLoadSecondLevelMenuItem))));\r\n\t};\r\n\r\n\t// init handlers on load\r\n\tinitFirstLevelListeners();\r\n\tconst disableHoverMenuItems = () => disposable && disposable.dispose();\r\n\r\n\treturn { dispose: disableHoverMenuItems };\r\n}\r\n","import {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener} from \"../common/html\";\r\n\r\nexport function initLanguageSelector(buttonEl: HTMLElement, containerEl: HTMLElement) {\r\n\tlet eventDisposables: IDisposable;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\r\n\tconst closeMenu = () => {\r\n\t\tcontainerEl.classList.add(\"u-hide\");\r\n\t\tdetachDocumentClick();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".technical-language-selector, .technical-language-selector-choices\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\t// we do don't want to load or attach handlers when the menu is closing\r\n\t\tif (containerEl.classList.contains(\"u-hide\"))\r\n\t\t\tattachOnDocumentClick();\r\n\t\tcontainerEl.classList.toggle(\"u-hide\");\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(\r\n\t\t\tonDocumentClickDisposable = compositeDisposable (\r\n\t\t\t\t[expressEventListener(document, 'click', onDocumentClick, true)]\r\n\t\t\t)\r\n\t\t);\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst init = () => {\r\n\t\teventDisposables = compositeDisposable (\r\n\t\t\t[\r\n\t\t\t\texpressEventListener(buttonEl, 'click', onButtonClick)\r\n\t\t\t]\r\n\t\t);\r\n\t};\r\n\r\n\tconst deInit = () => {\r\n\t\tdispose();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\t// remove all handlers\r\n\tconst dispose = () => {\r\n\t\tif (eventDisposables) eventDisposables.dispose();\r\n\t\tdetachDocumentClick();\r\n\t};\r\n\r\n\t// init component\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdeInit\r\n\t};\r\n}\r\n","import {getParents} from \"../common/html\";\r\n\r\nexport interface ICreateTooltipOptions {\r\n\treadonly buttonEl: HTMLElement;\r\n\treadonly containerEl: HTMLElement;\r\n\treadonly onOpen?: (containerEl: HTMLElement) => void;\r\n\treadonly onClose?: () => void;\r\n\treadonly iconCloseSelector?: string;\r\n\treadonly openClass?: string;\r\n\treadonly tooltipSelector?: string;\r\n\treadonly toggleIconSelector?: string;\r\n\treadonly useCapture?: boolean;\r\n}\r\n\r\nexport interface IToolTip {\r\n\treadonly dispose: () => void;\r\n\treadonly closeToolTip: () => void;\r\n}\r\nexport function initTooltip(options: ICreateTooltipOptions) {\r\n\tconst {\r\n\t\tbuttonEl,\r\n\t\tcontainerEl,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t\ticonCloseSelector,\r\n\t\topenClass,\r\n\t\ttooltipSelector,\r\n\t\ttoggleIconSelector,\r\n\t\tuseCapture = false\r\n\t} = options;\r\n\r\n\tconst closeIconEl = containerEl.querySelector(iconCloseSelector || \".icon-close\");\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseToolTip();\r\n\t};\r\n\r\n\tconst closeToolTip = () => {\r\n\t\tcontainerEl.classList.remove(openClass || \"is-tooltip-open\");\r\n\t\tif (onClose) onClose();\r\n\t\tdocument.removeEventListener(\"click\", onDocumentClick);\r\n\t};\r\n\r\n\tconst openToolTip = () => {\r\n\t\tcontainerEl.classList.add(openClass || \"is-tooltip-open\");\r\n\t\tif (onOpen) onOpen(containerEl);\r\n\t\tdocument.addEventListener(\"click\", onDocumentClick, { capture: useCapture });\r\n\t};\r\n\r\n\tconst onButtonClick = (e: MouseEvent) => {\r\n\t\tif (getParents(e.target as HTMLElement, (tooltipSelector || \".technical-price-tooltip\")).length < 1)\r\n\t\t{\r\n\t\t\tcontainerEl.classList.contains(openClass || \"is-tooltip-open\")\r\n\t\t\t\t? closeToolTip()\r\n\t\t\t\t: openToolTip();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tconst selector = (tooltipSelector || \".technical-price-tooltip\") + \", \" + (toggleIconSelector || \".technical-price-info-icon\");\r\n\t\tif (!(e.target as HTMLElement).closest(selector)) {\r\n\t\t\tcloseToolTip();\r\n\t\t}\r\n\t};\r\n\r\n\t//close tooltip\r\n\tif (closeIconEl) closeIconEl.addEventListener(\"click\", onCloseIconClick);\r\n\r\n\t//open tooltip + function\r\n\tbuttonEl.addEventListener(\"click\", onButtonClick);\r\n\r\n\tconst dispose = () => {\r\n\t\tbuttonEl.removeEventListener(\"click\", onButtonClick);\r\n\t\tdocument.removeEventListener(\"click\", onDocumentClick);\r\n\t\tif (closeIconEl) closeIconEl.removeEventListener(\"click\", onCloseIconClick);\r\n\t};\r\n\r\n\treturn {\r\n\t\tdispose,\r\n\t\tcloseToolTip\r\n\t} as IToolTip;\r\n}\r\n","import {createTextInputWithAutoComplete} from \"./form-input\";\r\nimport {expressQuerySelector} from \"../common/html\";\r\nimport {isValidTextWithoutAngleBrackets} from \"../utils/validation\";\r\nimport {initTooltip} from \"./tooltip\";\r\n\r\nexport function initSearchBar(desktopSearchBarContainer: HTMLElement, mobileSearchBarContainer: HTMLElement, autoCompleteSearch: (searchTerm: string) => Promise, onOpen?: () => void, onClose?: () => void) {\r\n\tconst initAutoComplete = (buttonEl: HTMLElement, inputEl: HTMLInputElement) => {\r\n\t\tconst buttonDisabledClass = \"a-button--disabled\";\r\n\t\tconst form = inputEl.parentElement! as HTMLFormElement;\r\n\r\n\t\tif (buttonEl) buttonEl.classList.add(buttonDisabledClass);\r\n\r\n\t\tconst renderTextWithHighlights = (item: { value: string, label: string }, currentSearchterm: string) => {\r\n\t\t\tcurrentSearchterm = currentSearchterm.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\r\n\t\t\tconst re = new RegExp(\"(\" + currentSearchterm.split(' ').join('|') + \")\", \"gi\");\r\n\t\t\treturn item.value.replace(re, \"$1\");\r\n\t\t};\r\n\r\n\t\tinputEl.onkeyup = function (ev: KeyboardEvent) {\r\n\t\t\tif (buttonEl) {\r\n\t\t\t\tif (inputEl && inputEl.value) buttonEl.classList.remove(buttonDisabledClass);\r\n\t\t\t\telse buttonEl.classList.add(buttonDisabledClass);\r\n\t\t\t}\r\n\t\t\tif (ev.keyCode === 13 || ev.key === 'Enter') {\r\n\t\t\t\tfixInputValue(inputEl);\r\n\t\t\t\tform.submit();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tform.onsubmit = function (e) {\r\n\t\t\tif (!inputEl || !inputEl.value || !validateInput(inputEl)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfixInputValue(inputEl);\r\n\t\t};\r\n\t\treturn createTextInputWithAutoComplete (\r\n\t\t\tinputEl,\r\n\t\t\t{\r\n\t\t\t\tonSelect: () => { onClose && onClose(); form.submit(); },\r\n\t\t\t\tautoCompleteSearch: (searchTerm) => {\r\n\t\t\t\t\tif (validateInput(inputEl, searchTerm))\r\n\t\t\t\t\t\treturn autoCompleteSearch(searchTerm).then(res => res.map(item => ({ value: item, label: item })));\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t},\r\n\t\t\t\tonOpen: onOpen,\r\n\t\t\t\tonClose: onClose,\r\n\t\t\t\trenderTextContent: renderTextWithHighlights,\r\n\t\t\t\tcontainerClass: 'm-autocomplete autocomplete-suggestions m-search-bar__autocomplete',\r\n\t\t\t\tcontainerInsertPosition: 'afterend',\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tconst fixInputValue = (inputEl: HTMLInputElement) => {\r\n\t\tinputEl.value = inputEl.value.replace(/[<>]+/g, '');\r\n\t};\r\n\r\n\tconst validateInput = (inputEl: HTMLInputElement, searchTerm?: string) => {\r\n\t\treturn isValidTextWithoutAngleBrackets(searchTerm ? searchTerm : inputEl.value);\r\n\t};\r\n\r\n\tconst initMobileSearchBar = (containerEl: HTMLElement) => {\r\n\t\tconst inputEl = expressQuerySelector(containerEl, \".m-search-bar__input\", true);\r\n\t\tconst buttonEl = expressQuerySelector(containerEl, \".icon-search_thin\", true);\r\n\t\tconst autoComplete = initAutoComplete(buttonEl, inputEl);\r\n\t\tconst onSearchTooltipOpen = () => inputEl.focus();\r\n\t\tconst form = inputEl.parentElement! as HTMLFormElement;\r\n\r\n\t\tform.onsubmit = function (e) {\r\n\t\t\tif (!inputEl || !inputEl.value || !validateInput(inputEl)) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tfixInputValue(inputEl);\r\n\t\t};\r\n\r\n\t\tconst overlayComponent = initTooltip({\r\n\t\t\tbuttonEl: containerEl.previousElementSibling as HTMLElement,\r\n\t\t\tcontainerEl: containerEl,\r\n\t\t\tonOpen: onSearchTooltipOpen,\r\n\t\t\topenClass: \"menu-is-open\",\r\n\t\t\ttooltipSelector: \".o-icon-navigation__search-bar\",\r\n\t\t\ttoggleIconSelector: \".icon-search_thin\"\r\n\t\t});\r\n\r\n\t\treturn {\r\n\t\t\tdipose: () => {\r\n\t\t\t\toverlayComponent.dispose();\r\n\t\t\t\tautoComplete.dispose();\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t// init desktop search autocomplete\r\n\tconst desktopSearchBar = initAutoComplete (\r\n\t\texpressQuerySelector (\r\n\t\t\tdesktopSearchBarContainer,\r\n\t\t\t'.icon-search_thin',\r\n\t\t\ttrue\r\n\t\t),\r\n\t\texpressQuerySelector (\r\n\t\t\tdesktopSearchBarContainer,\r\n\t\t\t'.m-search-bar__input',\r\n\t\t\ttrue\r\n\t\t)\r\n\t);\r\n\r\n\t// init mobile search\r\n\tconst mobileSearchBar = initMobileSearchBar(mobileSearchBarContainer);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\tmobileSearchBar.dipose();\r\n\t\t\tdesktopSearchBar.dispose();\r\n\t\t}\r\n\t};\r\n}\r\n","import {expressEventListener, hide, expressQuerySelector, expressQuerySelectorAll, remove, show} from \"../common/html\";\r\nimport {createClickableElement} from \"./button\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\nimport {trackOrderStatusEvent} from \"../common/events\";\r\n\r\nexport interface ICreateNotificationCenterDependencies {\r\n\treadonly getNotifications: () => Promise;\r\n\treadonly isMobile: () => boolean;\r\n\treadonly markNotificationsAsRead: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n}\r\n\r\nexport function createNotificationTile(containerEl: HTMLElement, markNotificationAsRead: (id: string) => Promise) {\r\n\tconst checkBoxEl = expressQuerySelector(containerEl, '.m-notification-tile__read-status', true);\r\n\tconst linkEl = expressQuerySelector(containerEl, '.m-notification-tile__title-with-link__link', false);\r\n\tconst onRemove = () => remove(containerEl);\r\n\r\n\tconst onTileClick = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\tconst cb = expressQuerySelector(checkBoxEl, '.a-form-input__input', true);\r\n\t\tcb.disabled = true;\r\n\t\tcheckBoxEl.removeEventListener('click', onTileClick);\r\n\t\tmarkNotificationAsRead(cb.value)\r\n\t\t\t.then(() => containerEl.classList.add(\"o-notifications-center__notification-tile--removed\"))\r\n\t\t\t.then(() => onRemove());\r\n\t};\r\n\r\n\tcheckBoxEl.addEventListener('click', onTileClick);\r\n\tlinkEl && linkEl.addEventListener('click', () => {\r\n\t\tconst orderNumber = linkEl.dataset.ordernumber || '';\r\n\t\tconst pvc = linkEl.dataset.sku || '';\r\n\t\tconst orderStatus = linkEl.dataset.orderstatus || '';\r\n\t\ttrackOrderStatusEvent(\"ClickOnOrderItemNotificationLink\", { orderNumber: orderNumber, pvc: pvc, orderStatus: orderStatus });\r\n\t});\r\n}\r\n\r\nexport function createNotificationCenter(containerEl: HTMLElement, deps: ICreateNotificationCenterDependencies) {\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tlet onMarkedAllAsReadDisposable: IDisposable;\r\n\tconst domParser = new DOMParser();\r\n\r\n\tlet loaded = false;\r\n\r\n\tconst { getNotifications, isMobile, markNotificationsAsRead, onClose, onOpen } = deps;\r\n\r\n\tconst buttonEl = expressQuerySelector(containerEl, '.o-icon-navigation__notifications-center__icon', true);\r\n\tconst notificationBellCountEl = expressQuerySelector(buttonEl, '.o-icon-navigation__count ', true);\r\n\tconst menuEl = expressQuerySelector(containerEl, '.o-icon-navigation__notifications-center-menu', true);\r\n\tconst overLayEl = expressQuerySelector(menuEl, '.technical-notification-center-overlay', true);\r\n\tconst contentEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__content', true);\r\n\tconst closeButtonEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__close-container', true);\r\n\tlet markAllAsReadButton: HTMLInputElement;\r\n\r\n\tconst setOverLayClass = () => {\r\n\t\tconst mobile = isMobile();\r\n\t\toverLayEl.classList.remove(...[\"m-navigation-overlay__mobile-view\", \"m-navigation-overlay__desktop-view\"]);\r\n\t\toverLayEl.classList.add(mobile ? \"m-navigation-overlay__mobile-view\" : \"m-navigation-overlay__desktop-view\");\r\n\t};\r\n\r\n\tconst setNotificationCount = (amount: number, markAllAsReadButton?: HTMLElement) => {\r\n\r\n\t\tif (amount > 0) {\r\n\t\t\tnotificationBellCountEl.innerHTML = amount.toString();\r\n\t\t\tif (markAllAsReadButton) markAllAsReadButton.innerHTML += `(${amount})`;\r\n\t\t\tshow(notificationBellCountEl);\r\n\r\n\t\t} else {\r\n\t\t\tnotificationBellCountEl.innerHTML = \"\";\r\n\t\t\thide(notificationBellCountEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst getTiles = () => expressQuerySelectorAll(contentEl, '.m-notification-tile');\r\n\r\n\tconst onMarkedAsReadSingle = (ids: string) => markNotificationsAsRead(ids.split(';'))\r\n\t\t.then(() => loadNotifications(true));\r\n\r\n\tconst onMarkedAllAsRead = () => {\r\n\t\tif (markAllAsReadButton) {\r\n\t\t\tmarkAllAsReadButton.disabled = true;\r\n\t\t\tmarkAllAsReadButton.classList.add(\"a-button--disabled\");\r\n\t\t}\r\n\t\tdetachMarkAllAsReadClick();\r\n\t\tconst ids = getTiles()\r\n\t\t\t.map(el => expressQuerySelector\r\n\t\t\t\t(el, '.a-form-input__input', true)\r\n\t\t\t\t\t.value.split(\";\")\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a.concat(b), []);\r\n\r\n\t\t// only execute if there are items to remove\r\n\t\tif (ids && ids.length > 0) {\r\n\t\t\treturn markNotificationsAsRead(ids)\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tif (res) loadNotifications(true);\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst loadNotifications = (reload = false) => {\r\n\r\n\t\tif (loaded && !reload) return Promise.resolve();\r\n\r\n\t\treturn getNotifications()\r\n\t\t\t.then(res => {\r\n\t\t\t\tif (res) {\r\n\t\t\t\t\tconst parsed = domParser.parseFromString(res, \"text/html\").documentElement;\r\n\t\t\t\t\tconst notificationCenterEl = expressQuerySelector(parsed, \".o-notifications-center__container\", true);\r\n\t\t\t\t\tcontentEl.innerHTML = \"\";\r\n\t\t\t\t\tcontentEl.insertAdjacentElement('beforeend', notificationCenterEl);\r\n\r\n\t\t\t\t\tmarkAllAsReadButton = expressQuerySelector(contentEl, '.o-notifications-center__mark-as-read', true);\r\n\r\n\t\t\t\t\tconst tiles = getTiles();\r\n\t\t\t\t\tif (tiles.length > 0) {\r\n\t\t\t\t\t\tmarkAllAsReadButton.classList.remove(\"a-button--disabled\");\r\n\r\n\t\t\t\t\t\ttiles.forEach(el => createNotificationTile(el, onMarkedAsReadSingle));\r\n\r\n\t\t\t\t\t\tattachMarkAllAsReadClick(markAllAsReadButton);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (tiles.length === 0) {\r\n\t\t\t\t\t\tmarkAllAsReadButton.classList.add(\"a-button--disabled\");\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsetNotificationCount(tiles.length);\r\n\r\n\t\t\t\t\tloaded = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onNotificationCenterOpen = () => {\r\n\t\tsetOverLayClass();\r\n\t\treturn loadNotifications();\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tmenuEl.classList.remove(\"menu-is-open\");\r\n\t\tdetachDocumentClick();\r\n\t\tonClose && onClose();\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst openMenu = () => {\r\n\t\ttrackOrderStatusEvent(\"ClickOnNotificationIcon\", {});\r\n\t\treturn onNotificationCenterOpen()\r\n\t\t\t.then(() => {\r\n\t\t\t\tonOpen && onOpen();\r\n\t\t\t\tattachOnDocumentClick();\r\n\t\t\t\tmenuEl.classList.add(\"menu-is-open\");\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\treturn menuEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".o-icon-navigation__notifications-center-menu, .o-icon-navigation__notifications-center__icon\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(onDocumentClickDisposable = expressEventListener(document, 'click', onDocumentClick, true));\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst attachMarkAllAsReadClick = (buttonEl: HTMLElement) =>\r\n\t\t(onMarkedAllAsReadDisposable = expressEventListener(buttonEl, 'click', onMarkedAllAsRead));\r\n\r\n\tconst detachMarkAllAsReadClick = () => onMarkedAllAsReadDisposable && onMarkedAllAsReadDisposable.dispose();\r\n\r\n\t// init component\r\n\tconst button = createClickableElement(buttonEl, onButtonClick);\r\n\r\n\tconst eventDisposables = compositeDisposable (\r\n\t\t[\r\n\t\t\texpressEventListener(closeButtonEl, 'click', onCloseIconClick),\r\n\t\t\texpressEventListener(window, 'resize', setOverLayClass),\r\n\t\t]\r\n\t);\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tbutton.dispose();\r\n\t\t\tdetachDocumentClick();\r\n\t\t\tdetachMarkAllAsReadClick();\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n}\r\n","export function calculateAndSetHeightOfMobileNavigationLevel(mobileNavigationLevel: HTMLElement) {\r\n\tmobileNavigationLevel.style.height = '100vh';\r\n\r\n\t// Calculate height of lvl menu (without browser bars)\r\n\tconst browserUiBars = mobileNavigationLevel.getBoundingClientRect().height - window.innerHeight;\r\n\tconst menuItemsLvlPositionTop = document.body.getBoundingClientRect().top - mobileNavigationLevel.getBoundingClientRect().top;\r\n\r\n\t// Set height of level menu items to correct size calculated\r\n\tmobileNavigationLevel.style.height = 'calc(100vh - ' + Math.abs(browserUiBars) + 'px + ' + menuItemsLvlPositionTop + 'px)';\r\n}\r\n","import { createClickableElement } from \"./button\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { IIconResult } from \"../utils/icons\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\n\r\nexport interface IInitMyAccountDependencies {\r\n\treadonly getIconsAsync: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n\treadonly isMobile: () => boolean;\r\n\treadonly loadAccountMenu: () => Promise;\r\n}\r\n\r\nexport function initMyAccount(mainNavigationEl: HTMLElement, deps: IInitMyAccountDependencies) {\r\n\r\n\tconst { getIconsAsync, onClose, onOpen, isMobile, loadAccountMenu } = deps;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tconst icons = {};\r\n\tlet loaded = false;\r\n\tconst buttonEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-icon', true);\r\n\tconst menuEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-menu', true);\r\n\tconst overLayEl = expressQuerySelector(menuEl, '.technical-navigation-overlay', true);\r\n\tconst contentEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__content', true);\r\n\tconst closeButtonEl = expressQuerySelector(overLayEl, '.m-navigation-overlay__close-container', true);\r\n\r\n\tconst setOverLayClass = () => {\r\n\t\toverLayEl.classList.remove(...[\"m-navigation-overlay__mobile-view\", \"m-navigation-overlay__desktop-view\"]);\r\n\t\toverLayEl.classList.add(isMobile() ? \"m-navigation-overlay__mobile-view\" : \"m-navigation-overlay__desktop-view\");\r\n\t};\r\n\r\n\tconst onOpenMyAccount = () => {\r\n\t\tif (!loaded) {\r\n\t\t\treturn loadAccountMenu()\r\n\t\t\t\t.then(res => {\r\n\t\t\t\t\tonOpen && onOpen();\r\n\t\t\t\t\tcontentEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\tconst buttonEls = expressQuerySelectorAll(contentEl, '.technical-hassvg')\r\n\t\t\t\t\t\t.filter(el => !!el.getAttribute('data-icon-svg'));\r\n\t\t\t\t\tconst urls = buttonEls\r\n\t\t\t\t\t\t.map(el => el.getAttribute('data-icon-svg')!)\r\n\t\t\t\t\t\t.filter((value, index, self) => self.indexOf(value) === index);\r\n\r\n\t\t\t\t\t// this can fire & forget\r\n\t\t\t\t\tgetIconsAsync(urls)\r\n\t\t\t\t\t\t.then(\r\n\t\t\t\t\t\t\tres => {\r\n\t\t\t\t\t\t\t\tres.forEach(icon => icons[icon.url] = icon.svg);\r\n\t\t\t\t\t\t\t\tbuttonEls.forEach(el => el.insertAdjacentHTML('beforeend', icons[el.getAttribute('data-icon-svg')!]));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\tloaded = true;\r\n\t\t\t\t});\r\n\t\t} else {\r\n\t\t\tonOpen && onOpen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t};\r\n\r\n\tconst closeMenu = () => {\r\n\t\tonClose && onClose();\r\n\t\tmenuEl.classList.remove(\"menu-is-open\");\r\n\t\tdetachDocumentClick();\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst openMenu = () => {\r\n\t\tsetOverLayClass();\r\n\t\treturn onOpenMyAccount()\r\n\t\t\t.then(() => {\r\n\t\t\t\tmenuEl.classList.add(\"menu-is-open\");\r\n\r\n\t\t\t\tif (isMobile()) {\r\n\t\t\t\t\tconst menuButtonList = expressQuerySelector(menuEl, '.o-my-account__list', true);\r\n\t\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuButtonList);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tattachOnDocumentClick();\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst onCloseIconClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onButtonClick = () => {\r\n\t\treturn menuEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".o-icon-navigation__user-menu, .o-icon-navigation__user-icon\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst button = createClickableElement(buttonEl, onButtonClick);\r\n\tconst eventDisposables = compositeDisposable(\r\n\t\t[\r\n\r\n\t\t\texpressEventListener(closeButtonEl, 'click', onCloseIconClick),\r\n\t\t\texpressEventListener(window, 'resize', setOverLayClass)\r\n\t\t]\r\n\t);\r\n\tconst attachOnDocumentClick = () =>\r\n\t\t(onDocumentClickDisposable = expressEventListener(document, 'click', onDocumentClick, true));\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\treturn {\r\n\t\tdispose: () => {\r\n\t\t\teventDisposables.dispose();\r\n\t\t\tdetachDocumentClick();\r\n\t\t\tbutton.dispose();\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n}\r\n","export interface IInitCountDownOptions {\r\n\treadonly showDays?: boolean;\r\n\treadonly onCountDownFinish?: () => void;\r\n\treadonly daysLabel?: string;\r\n\treadonly dayLabel?: string;\r\n}\r\n\r\nexport function initCountDown(containerEl: HTMLElement, el: HTMLElement, countDownToDate: string, opts: IInitCountDownOptions ) {\r\n\tconst {\r\n\t\tshowDays,\r\n\t\tonCountDownFinish,\r\n\t\tdaysLabel,\r\n\t\tdayLabel\r\n\t} = opts;\r\n\r\n\tconst toDate = (input: string): Date => {\r\n\t\tconst dateString = input.split(' ')[0];\r\n\t\tconst timeString = input.split(' ')[1];\r\n\t\tconst day = parseInt(dateString.split('/')[0], 10);\r\n\t\tconst month = parseInt(dateString.split('/')[1], 10) - 1;\r\n\t\tconst year = parseInt(dateString.split('/')[2], 10);\r\n\t\tconst hour = parseInt(timeString.split(':')[0], 10);\r\n\t\tconst minutes = parseInt(timeString.split(':')[1], 10);\r\n\t\tconst seconds = parseInt(timeString.split(':')[2], 10);\r\n\t\treturn new Date(year, month, day, hour, minutes, seconds, 0);\r\n\t};\r\n\r\n\tconst pad = (num: number, size: number) => {\r\n\t\tlet temp = num.toString();\r\n\t\twhile (temp.length < size) temp = \"0\" + temp;\r\n\t\treturn temp;\r\n\t};\r\n\r\n\tconst countDownTime = toDate(countDownToDate).getTime();\r\n\r\n\tconst countDown = () => {\r\n\t\tconst now = new Date().getTime();\r\n\t\tconst timeLeft = countDownTime - now;\r\n\t\tconst days = Math.floor(timeLeft / (1000 * 60 * 60 * 24));\r\n\t\tlet hours = Math.floor((timeLeft % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));\r\n\t\tconst minutes = Math.floor((timeLeft % (1000 * 60 * 60)) / (1000 * 60));\r\n\t\tconst seconds = Math.floor((timeLeft % (1000 * 60)) / 1000);\r\n\r\n\t\tif (timeLeft > 0) {\r\n\t\t\tif (!showDays || !daysLabel || !dayLabel) {\r\n\t\t\t\thours = hours + (days * 24);\r\n\t\t\t\tel.innerHTML = pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t} else {\r\n\t\t\t\tif (days > 1)\r\n\t\t\t\t\tel.innerHTML = days + ' ' + daysLabel + ' ' + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t\telse if (days === 1)\r\n\t\t\t\t\tel.innerHTML = days + ' ' + dayLabel + ' ' + pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t\telse\r\n\t\t\t\t\tel.innerHTML = pad(hours, 2) + \":\" + pad(minutes, 2) + \":\" + pad(seconds, 2);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (onCountDownFinish) onCountDownFinish();\r\n\t\t\tclearInterval(interval);\r\n\t\t}\r\n\t};\r\n\r\n\tconst interval = setInterval(countDown, 1000);\r\n}\r\n","import { createClickableElement } from \"./button\";\r\nimport { expressEventListener, expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { compositeDisposable, IDisposable } from \"../utils/disposable\";\r\nimport { IIconResult } from \"../utils/icons\";\r\nimport { calculateAndSetHeightOfMobileNavigationLevel } from \"../utils/mobile-menu\";\r\n\r\nexport interface ICreateNavigationMobileDependencies {\r\n\treadonly getMobileMenu: (secondLevelIndex?: number, thirdLevelIndex?: number) => Promise;\r\n\treadonly getIconsAsync: (ids: string[]) => Promise;\r\n\treadonly onOpen?: () => void;\r\n\treadonly onClose?: () => void;\r\n}\r\n\r\nexport interface ICreateNavigationMobileOptions {\r\n\treadonly mobileMenuEl: HTMLElement;\r\n\treadonly containerEl: HTMLElement;\r\n\treadonly menuButtonEl: HTMLElement;\r\n\treadonly menuContainerEl: HTMLElement;\r\n\treadonly currentLanguage: string | undefined;\r\n}\r\n\r\nexport function initNavigationMobile(options: ICreateNavigationMobileOptions, deps: ICreateNavigationMobileDependencies) {\r\n\tlet firstLevelMenuSelected: HTMLElement | undefined;\r\n\tlet onDocumentClickDisposable: IDisposable;\r\n\tlet onCloseClickDisposable: IDisposable;\r\n\tlet onLanguageSelectorClickDisposable: IDisposable;\r\n\tlet userContainerEl: HTMLElement;\r\n\tlet closeContainerEl: HTMLElement;\r\n\tlet languageSelectorEl: HTMLElement | undefined;\r\n\tlet firstLevelMenuEls: HTMLElement[] = [];\r\n\tlet secondLevelMenuEls: HTMLElement[] = [];\r\n\tlet thirdLevelMenuEls: HTMLElement[] = [];\r\n\r\n\tlet loaded = false;\r\n\r\n\tconst {\r\n\t\tmobileMenuEl,\r\n\t\tcontainerEl,\r\n\t\tmenuButtonEl,\r\n\t\tmenuContainerEl,\r\n\t\tcurrentLanguage\r\n\t} = options;\r\n\r\n\tconst {\r\n\t\tgetMobileMenu,\r\n\t\tgetIconsAsync,\r\n\t\tonOpen,\r\n\t\tonClose,\r\n\t} = deps;\r\n\r\n\tconst contentPreLoaded = mobileMenuEl.innerHTML.replace(/^\\s+|\\s+$/, '') !== \"\";\r\n\r\n\tconst closeMenu = () => {\r\n\t\tmenuButtonEl.classList.remove(\"menu-is-open\");\r\n\t\tmenuContainerEl.classList.remove(\"menu-is-open\");\r\n\r\n\t\t// reset to first level\r\n\t\tresetMenu();\r\n\r\n\t\tdetachDocumentClick();\r\n\t\tif (onClose) onClose();\r\n\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tconst onCloseMenuClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\tconst onDocumentClick = (e: MouseEvent) => {\r\n\t\tif (!(e.target as HTMLElement).closest(\".technical-mobile-navigation-hamburger-menu-container, .technical-mobile-navigation-hamburger-menu-button\")) {\r\n\t\t\tcloseMenu();\r\n\t\t}\r\n\t};\r\n\r\n\tconst attachOnDocumentClick = () =>\r\n\t(\r\n\t\tonDocumentClickDisposable = compositeDisposable(\r\n\t\t\t[\r\n\t\t\t\texpressEventListener(document, 'click', onDocumentClick, true)\r\n\t\t\t]\r\n\t\t)\r\n\t);\r\n\r\n\tconst detachDocumentClick = () => onDocumentClickDisposable && onDocumentClickDisposable.dispose();\r\n\r\n\tconst loadIcons = (urls: string[]) => {\r\n\t\tconst icons = {};\r\n\t\tconst uniqueUrls = urls.filter((v, i) => urls.indexOf(v) === i);\r\n\t\treturn getIconsAsync(uniqueUrls)\r\n\t\t\t.then(res => {\r\n\t\t\t\tres.forEach(icon => (icons[icon.url] = icon.svg));\r\n\t\t\t\treturn icons;\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst initMenuItemsAndBehavior = () => {\r\n\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\tuserContainerEl = expressQuerySelector(mobileMenuEl, \".technical-mobile-navigation-user-container\", true);\r\n\t\tcloseContainerEl = expressQuerySelector(mobileMenuEl, \".technical-mobile-navigation-close-container\", true);\r\n\t\tlanguageSelectorEl = expressQuerySelector(mobileMenuEl, \".technical-language-selector\") || undefined;\r\n\t\tfirstLevelMenuEls = expressQuerySelectorAll(mobileMenuEl, \".technical-mobile-navigation-first-level-container\");\r\n\r\n\t\t// set language\r\n\t\tif (languageSelectorEl) {\r\n\t\t\tconst activeLanguageEl = expressQuerySelector(languageSelectorEl, \".a-language-selector__language-active\");\r\n\t\t\tif (activeLanguageEl && currentLanguage) {\r\n\t\t\t\tconst languageEl = expressQuerySelector(activeLanguageEl, \".a-language-selector__language\");\r\n\t\t\t\tif (languageEl) {\r\n\t\t\t\t\tlanguageEl.innerHTML = currentLanguage;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst iconButtonEls = expressQuerySelectorAll(firstLevelListEl, '.technical-icon-svg')\r\n\t\t\t.filter(el => !!el.getAttribute('data-icon-svg'));\r\n\r\n\t\tif (iconButtonEls.length > 0) {\r\n\t\t\tloadIcons(\r\n\t\t\t\ticonButtonEls.map(el => el.getAttribute('data-icon-svg')!)\r\n\t\t\t)\r\n\t\t\t\t.then(\r\n\t\t\t\t\tres =>\r\n\t\t\t\t\t\ticonButtonEls.forEach(el => {\r\n\t\t\t\t\t\t\tconst icon = res[el.getAttribute('data-icon-svg')!];\r\n\t\t\t\t\t\t\tif (icon) el.insertAdjacentHTML(\"beforeend\", icon);\r\n\t\t\t\t\t\t})\r\n\t\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (closeContainerEl) attachCloseMenuClick(closeContainerEl);\r\n\t\tif (languageSelectorEl) attachLanguageSelectorClick(languageSelectorEl);\r\n\t\tattachFirstMenuItemClick(firstLevelMenuEls);\r\n\t};\r\n\r\n\tconst loadMobileMenu = () => {\r\n\t\tif (!loaded) {\r\n\t\t\tif (!contentPreLoaded) {\r\n\t\t\t\treturn getMobileMenu()\r\n\t\t\t\t\t.then(res => {\r\n\t\t\t\t\t\tloaded = true;\r\n\t\t\t\t\t\tonOpen && onOpen();\r\n\t\t\t\t\t\tmobileMenuEl.insertAdjacentHTML('beforeend', res);\r\n\t\t\t\t\t\tinitMenuItemsAndBehavior();\r\n\t\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tloaded = true;\r\n\t\t\t\tinitMenuItemsAndBehavior();\r\n\t\t\t\treturn Promise.resolve();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tonOpen && onOpen();\r\n\t\t\treturn Promise.resolve();\r\n\t\t}\r\n\t};\r\n\r\n\tconst onButtonClick = () =>\r\n\t\tmenuContainerEl.classList.contains(\"menu-is-open\")\r\n\t\t\t? closeMenu()\r\n\t\t\t: openMenu();\r\n\r\n\tconst openMenu = () => {\r\n\t\treturn loadMobileMenu()\r\n\t\t\t.then(() => {\r\n\t\t\t\t// show mobile menu (add display block so height can be correctly calculated first)\r\n\t\t\t\tmenuButtonEl.classList.add(\"menu-is-open\");\r\n\t\t\t\tmenuContainerEl.classList.add(\"menu-is-open\");\r\n\r\n\t\t\t\tattachOnDocumentClick();\r\n\r\n\t\t\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(firstLevelListEl);\r\n\r\n\t\t\t\t// Save height for later use in data attribute 'elementHeight'\r\n\t\t\t\tfirstLevelListEl.dataset.elementHeight = firstLevelListEl.style.height || '';\r\n\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst resetMenu = () => {\r\n\t\tcontainerEl.classList.remove(\"second-level-is-active\");\r\n\t\tcontainerEl.classList.remove(\"third-level-is-active\");\r\n\t\tuserContainerEl.classList.remove(\"u-hide\");\r\n\t\tcloseContainerEl.classList.remove(\"u-hide\");\r\n\r\n\t\t// Show first level\r\n\t\tfirstLevelMenuEls.forEach(firstLevelEl => {\r\n\t\t\tfirstLevelEl.classList.remove(\"u-hide\");\r\n\t\t\tconst firstLevelMenuButtons = expressQuerySelectorAll(firstLevelEl, \".o-navigation-mobile__first-level-navigation__button\");\r\n\t\t\tfirstLevelMenuButtons.forEach(el => el.classList.remove(\"u-hide\"));\r\n\t\t});\r\n\r\n\t\t//Hide second and third level\r\n\t\texpressQuerySelectorAll(containerEl, \".technical-mobile-navigation-second-level\").forEach(el => {\r\n\t\t\tif (!el.classList.contains(\"u-hide\")) el.classList.add(\"u-hide\");\r\n\t\t});\r\n\r\n\t\tsecondLevelMenuEls.forEach(secondLevelEl => {\r\n\t\t\tif (!secondLevelEl.classList.contains(\"u-hide\")) secondLevelEl.classList.add(\"u-hide\");\r\n\r\n\t\t\tconst menuSecondLevelContainerEls = expressQuerySelectorAll(secondLevelEl, \".technical-mobile-navigation-container\");\r\n\t\t\tmenuSecondLevelContainerEls.forEach(el => el.classList.remove(\"u-hide\"));\r\n\r\n\t\t\tconst thirdLevelEls = expressQuerySelectorAll(secondLevelEl, \".technical-mobile-navigation-third-level\");\r\n\t\t\tif (thirdLevelEls)\r\n\t\t\t\tthirdLevelEls.forEach(thirdLevelEl => {\r\n\t\t\t\t\tif (!thirdLevelEl.classList.contains(\"u-hide\")) thirdLevelEl.classList.add(\"u-hide\");\r\n\t\t\t\t});\r\n\t\t});\r\n\t};\r\n\r\n\tconst hideOtherMenuItems = (elem: HTMLElement) => {\r\n\t\tif (elem.parentNode && elem.parentNode.hasChildNodes()) {\r\n\t\t\t[].slice.call(elem.parentNode.children)\r\n\t\t\t\t.forEach(el => {\r\n\t\t\t\t\tconst elm: HTMLElement = el;\r\n\t\t\t\t\tif (elem !== elm) {\r\n\t\t\t\t\t\telm.classList.toggle(\"u-hide\");\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst onFirstMenuItemClick = (e: Event) => {\r\n\t\tif (handleHeaderLink(e.target)) return;\r\n\t\tconst firstLevelEl = e.currentTarget as HTMLElement;\r\n\t\tconst secondLevelIndex = Number(firstLevelEl.dataset.index) ?? -1;\r\n\t\tconst secondLevelEl = expressQuerySelector(firstLevelEl, '.technical-mobile-navigation-second-level', false);\r\n\t\tif (!secondLevelEl) return; // no second level\r\n\r\n\t\tfirstLevelMenuSelected = expressQuerySelector(firstLevelEl, \".technical-mobile-navigation-second-level\") || undefined;\r\n\t\tconst prevClickedEl = expressQuerySelector(mobileMenuEl, \".technical-clicked\", false);\r\n\r\n\t\t// Values of first lvl menu (needs to be recalculated since the 'account' section isn't shown in 2nd lvl)\r\n\t\tconst firstLevelListEl = expressQuerySelector(mobileMenuEl, \".o-navigation-mobile__first-level-navigation__button-list\", true);\r\n\t\t// calculateAndSetHeightOfMobileNavigationLevel(firstLevelListEl);\r\n\r\n\t\t// Set height of first lvl again correct (get from data attribute elementHeight)\r\n\t\tfirstLevelListEl.style.height = '100vh';\r\n\r\n\t\t// Reset scroll position otherwise 2nd lvl can already be scrolled down:\r\n\t\tfirstLevelListEl.scrollTop = 0;\r\n\r\n\r\n\t\tif (firstLevelMenuSelected) {\r\n\t\t\t// Keep track of clicked element and its scrollTop\r\n\t\t\tif (!prevClickedEl) {\r\n\t\t\t\tfirstLevelEl.classList.add(\"technical-clicked\");\r\n\t\t\t\tfirstLevelEl.dataset.offset = firstLevelEl.offsetTop + \"\";\r\n\t\t\t\tconst parent = firstLevelEl.parentNode as HTMLElement;\r\n\t\t\t\tif (parent) parent.dataset.offset = parent.offsetTop + \"\";\r\n\t\t\t}\r\n\r\n\t\t\tcontainerEl.classList.add(\"second-level-is-active\");\r\n\t\t\tcontainerEl.classList.remove(\"third-level-is-active\");\r\n\t\t\tuserContainerEl.classList.toggle(\"u-hide\");\r\n\t\t\tcloseContainerEl.classList.toggle(\"u-hide\");\r\n\r\n\t\t\thideOtherMenuItems(firstLevelEl);\r\n\r\n\t\t\tfirstLevelMenuSelected.classList.toggle(\"u-hide\");\r\n\t\t\tconst firstLevelMenuButton = expressQuerySelector(firstLevelEl, \".o-navigation-mobile__first-level-navigation__button\");\r\n\t\t\tif (firstLevelMenuButton) firstLevelMenuButton.classList.toggle(\"u-hide\");\r\n\r\n\t\t\tconst secondLevelNavigationEl = expressQuerySelector(firstLevelMenuSelected, \".technical-second-level\");\r\n\t\t\tif (secondLevelNavigationEl) secondLevelNavigationEl.classList.remove(\"u-hide\");\r\n\r\n\t\t\tconst secondLevelContainerEl = expressQuerySelectorAll(firstLevelMenuSelected, \".technical-mobile-navigation-second-level-container\");\r\n\t\t\tsecondLevelContainerEl.forEach((el) => el.classList.remove(\"u-hide\"));\r\n\t\t}\r\n\r\n\t\t// In case we have a clicked element bring it into view\r\n\t\tif (prevClickedEl) {\r\n\t\t\tprevClickedEl.classList.remove(\"technical-clicked\");\r\n\t\t\tsetScrollTop(prevClickedEl);\r\n\t\t\tif (prevClickedEl.parentNode) {\r\n\t\t\t\tsetScrollTop(prevClickedEl.parentNode as HTMLElement);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst loadSecondLevelEl = expressQuerySelector(secondLevelEl, '.technical-replace-level-loaded', false);\r\n\t\tif (!loadSecondLevelEl || !loadSecondLevelEl.parentElement) {\r\n\t\t\t// Calculate height of second lvl menu (without browser bars)\r\n\t\t\tconst menuItemsSecondLvl = expressQuerySelector(firstLevelMenuSelected, '.o-navigation-mobile__second-level-navigation__button-list', false);\r\n\t\t\tif (menuItemsSecondLvl && menuItemsSecondLvl.clientHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsSecondLvl);\r\n\t\t\telse\r\n\t\t\t\tfirstLevelListEl.style.height = firstLevelListEl.dataset.elementHeight || '';\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// load second level\r\n\t\tgetMobileMenu(secondLevelIndex, -1).then(res => {\r\n\t\t\tconst frag = document.createRange().createContextualFragment(res);\r\n\t\t\tsecondLevelEl.replaceChild(frag, loadSecondLevelEl);\r\n\t\t\tconst secondLevelItems = expressQuerySelectorAll(firstLevelEl, \".technical-mobile-navigation-second-level-container\");\r\n\t\t\tsecondLevelMenuEls = secondLevelMenuEls.concat(secondLevelItems);\r\n\t\t\tattachSecondMenuItemClick(secondLevelItems);\r\n\r\n\t\t\t// Calculate height of second lvl menu (without browser bars)\r\n\t\t\tconst menuItemsSecondLvl = expressQuerySelector(firstLevelMenuSelected, '.o-navigation-mobile__second-level-navigation__button-list', false);\r\n\t\t\tif (menuItemsSecondLvl && menuItemsSecondLvl.clientHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsSecondLvl);\r\n\t\t\telse\r\n\t\t\t\tfirstLevelListEl.style.height = firstLevelListEl.dataset.elementHeight || '';\r\n\t\t});\r\n\t};\r\n\r\n\tconst setScrollTop = (el: HTMLElement) => {\r\n\t\tconst scrollPos = el.dataset.offset || \"\";\r\n\t\tif (scrollPos && el.parentNode) {\r\n\t\t\tconst parent = el.parentNode as HTMLElement;\r\n\t\t\tparent.scrollTop = parseInt(scrollPos, 10);\r\n\t\t\tel.dataset.offset = \"\";\r\n\t\t}\r\n\t};\r\n\r\n\tconst onSecondMenuItemClick = (e: Event) => {\r\n\t\tif (handleHeaderLink(e.target)) return;\r\n\t\te.stopPropagation();\r\n\t\tconst secondLevelEl = e.currentTarget as HTMLElement;\r\n\r\n\t\tconst thirdLevelDivEl = expressQuerySelector(secondLevelEl, '.technical-mobile-navigation-third-level', false);\r\n\t\tif (!thirdLevelDivEl) return; // no third level\r\n\r\n\t\t// 3th level\r\n\t\tconst thirdLevelEl = secondLevelEl.querySelector(\".technical-mobile-navigation-third-level\");\r\n\t\tif (thirdLevelEl) {\r\n\t\t\tcontainerEl.classList.toggle(\"third-level-is-active\");\r\n\t\t\tthirdLevelEl.classList.toggle(\"u-hide\");\r\n\r\n\t\t\thideOtherMenuItems(secondLevelEl);\r\n\r\n\t\t\tif (firstLevelMenuSelected) {\r\n\t\t\t\tconst secondeLevelNavigationEl = firstLevelMenuSelected.querySelector(\".technical-second-level\");\r\n\t\t\t\tif (secondeLevelNavigationEl) secondeLevelNavigationEl.classList.toggle(\"u-hide\");\r\n\t\t\t}\r\n\r\n\t\t\tconst thirdLevelContainerEl = secondLevelEl.querySelector(\".technical-mobile-navigation-container\");\r\n\t\t\tif (thirdLevelContainerEl) thirdLevelContainerEl.classList.toggle(\"u-hide\");\r\n\t\t}\r\n\r\n\t\tconst loadThridLevelEl = expressQuerySelector(thirdLevelDivEl, '.technical-replace-level-loaded', false);\r\n\t\tif (!loadThridLevelEl || !loadThridLevelEl.parentElement) {\r\n\t\t\tconst menuItemsThirdLvl = expressQuerySelector(secondLevelEl, '.o-navigation-mobile__third-level-navigation__button-list', false);\r\n\t\t\t// Calculate height of third lvl menu (without browser bars)\r\n\t\t\tif (menuItemsThirdLvl && menuItemsThirdLvl.offsetHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsThirdLvl);\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// get from api\r\n\t\tconst secondLevelIndex = Number((secondLevelEl.closest('.technical-mobile-navigation-first-level-container') as HTMLElement).dataset.index) ?? -1;\r\n\t\tconst thirdLevelIndex = Number(secondLevelEl.dataset.index) ?? -1;\r\n\t\tgetMobileMenu(secondLevelIndex, thirdLevelIndex).then(res => {\r\n\t\t\tconst frag = document.createRange().createContextualFragment(res);\r\n\t\t\tthirdLevelDivEl.replaceChild(frag, loadThridLevelEl); // sub level of level\r\n\t\t\tconst thirdLevelItems = expressQuerySelectorAll(secondLevelEl, \".o-navigation-mobile__third-level-navigation__button-container\");\r\n\t\t\tthirdLevelMenuEls = thirdLevelMenuEls.concat(thirdLevelItems);\r\n\t\t\tattachThirdMenuItemClick(thirdLevelItems);\r\n\r\n\t\t\tconst menuItemsThirdLvl = expressQuerySelector(secondLevelEl, '.o-navigation-mobile__third-level-navigation__button-list', false);\r\n\t\t\t// Calculate height of third lvl menu (without browser bars)\r\n\t\t\tif (menuItemsThirdLvl && menuItemsThirdLvl.offsetHeight > 0)\r\n\t\t\t\tcalculateAndSetHeightOfMobileNavigationLevel(menuItemsThirdLvl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst onThirdMenuItemClick = (e: Event) => {\r\n\t\te.stopPropagation();\r\n\t};\r\n\r\n\tconst handleHeaderLink = (evTarget: EventTarget | null): boolean => {\r\n\t\tif (evTarget) {\r\n\t\t\tconst target = evTarget as HTMLElement;\r\n\t\t\tif (target.nodeName.toLowerCase() === \"a\" || (target.parentNode && target.parentNode.nodeName.toLowerCase() === \"a\")) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t};\r\n\r\n\tconst onLanguageSelectorClick = (e: Event) => {\r\n\t\tconst languageSelectorContainerEl = e.currentTarget as HTMLElement;\r\n\t\tconst languageCurrentEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__current\");\r\n\t\tconst languageChoicesContainerEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__choices\");\r\n\t\tconst languageSelectorDescrEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__description\");\r\n\t\tconst languageSelectorDescrOptionsEl = expressQuerySelector(languageSelectorContainerEl, \".a-language-selector__description-options\");\r\n\r\n\t\tif (languageCurrentEl)\r\n\t\t\tlanguageCurrentEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageChoicesContainerEl)\r\n\t\t\tlanguageChoicesContainerEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageSelectorDescrEl)\r\n\t\t\tlanguageSelectorDescrEl.classList.toggle(\"u-hide\");\r\n\t\tif (languageSelectorDescrOptionsEl)\r\n\t\t\tlanguageSelectorDescrOptionsEl.classList.toggle(\"u-hide\");\r\n\t};\r\n\r\n\tconst attachCloseMenuClick = (closeContainerEl: HTMLElement) => {\r\n\r\n\t\tconst closeButtonEl = expressQuerySelector(closeContainerEl, \".m-navigation-overlay__close-icon\");\r\n\t\tif (closeButtonEl) {\r\n\t\t\tonCloseClickDisposable = compositeDisposable([expressEventListener(closeContainerEl, \"click\", onCloseMenuClick)]);\r\n\t\t}\r\n\t};\r\n\r\n\tconst detachCloseMenuClick = () => onCloseClickDisposable && onCloseClickDisposable.dispose();\r\n\r\n\tconst attachFirstMenuItemClick = (firstLevelMenuEls: HTMLElement[]) => {\r\n\t\tfirstLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onFirstMenuItemClick));\r\n\t};\r\n\r\n\tconst attachSecondMenuItemClick = (secondLevelMenuEls: HTMLElement[]) => {\r\n\t\tsecondLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onSecondMenuItemClick));\r\n\t};\r\n\r\n\tconst attachThirdMenuItemClick = (thirdLevelMenuEls: HTMLElement[]) => {\r\n\t\tthirdLevelMenuEls.forEach(e => expressEventListener(e, \"click\", onThirdMenuItemClick));\r\n\t};\r\n\r\n\tconst attachLanguageSelectorClick = (languageSelectorEl: HTMLElement) => {\r\n\t\tonLanguageSelectorClickDisposable = compositeDisposable(\r\n\t\t\t[expressEventListener(languageSelectorEl, \"click\", onLanguageSelectorClick)]\r\n\t\t);\r\n\t};\r\n\r\n\tconst detachLanguageSelectorClick = () => onLanguageSelectorClickDisposable && onLanguageSelectorClickDisposable.dispose();\r\n\r\n\tconst menuButtonComponent = createClickableElement(menuButtonEl, onButtonClick);\r\n\r\n\tconst deInit = () => {\r\n\t\tdispose();\r\n\t\tcloseMenu();\r\n\t};\r\n\r\n\t// remove all handlers\r\n\tconst dispose = () => {\r\n\t\tmenuButtonComponent.dispose();\r\n\t\tdetachLanguageSelectorClick();\r\n\t\tdetachCloseMenuClick();\r\n\t\tdetachDocumentClick();\r\n\r\n\t\tfirstLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onFirstMenuItemClick));\r\n\t\tsecondLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onSecondMenuItemClick));\r\n\t\tthirdLevelMenuEls.forEach(e => e.removeEventListener(\"click\", onThirdMenuItemClick));\r\n\t};\r\n\r\n\treturn {\r\n\t\tdeInit\r\n\t};\r\n}\r\n","import { IIconResult } from \"../utils/icons\";\r\nimport {\r\n\tgetParentWithClassName,\r\n\thide,\r\n\tisMobileOnPageWithHeader,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll\r\n} from \"../common/html\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { getHtmlRequest, getRequest, postRequest } from \"../utils/fetch\";\r\nimport { initNavigationDesktop } from \"./navigation-desktop\";\r\nimport { initLanguageSelector } from \"./language-selector\";\r\nimport { initSearchBar } from \"./search-bar\";\r\nimport { createNotificationCenter } from \"./notification-center\";\r\nimport { createClickableElement } from \"./button\";\r\nimport { initMyAccount } from \"./my-account\";\r\nimport { initCountDown } from \"./countdown\";\r\nimport { initNavigationMobile } from \"./navigation-mobile\";\r\nimport { getCookie, writeCookieThatExpiresAtTheEndOfTheDay } from \"../utils/cookie\";\r\n\r\nexport interface IMainNavigationDependencies {\r\n\treadonly getInlineSvgsAsync: (ids: string[]) => Promise;\r\n\treadonly openLeadTimesPopupAsync?: () => Promise;\r\n}\r\ninterface IEventAnimation {\r\n\ttoggleEventVisibility: (open: boolean) => void;\r\n}\r\n\r\nexport function createMainNavigation(containerEl: HTMLElement, deps: IMainNavigationDependencies) {\r\n\tconst mainNavigationEl = containerEl;\r\n\tconst mobileMenuEl = expressQuerySelector(mainNavigationEl, \"#technical-mobile-menu\", false);\r\n\tconst isMobile = () => isMobileOnPageWithHeader();\r\n\r\n\tconst initEventAnimation = (): IEventAnimation => {\r\n\t\tconst eventContainer = expressQuerySelector(containerEl, '.technical-event-container', false);\r\n\t\tif (!eventContainer || !window['lottie']) return {\r\n\t\t\ttoggleEventVisibility: () => { return; }\r\n\t\t};\r\n\t\tconst stickyNav = eventContainer.dataset.stickynav === 'true';\r\n\t\tconst mobile = isMobile();\r\n\t\tconst seen = getCookie('evSeen') && getCookie('evSeen') === '1';\r\n\t\tconst imageContainer = expressQuerySelector(containerEl, '.technical-animate-img', true);\r\n\t\tconst animation = lottie.loadAnimation({\r\n\t\t\tcontainer: imageContainer,\r\n\t\t\trenderer: 'svg', // Choose the renderer\r\n\t\t\tloop: false,\r\n\t\t\tautoplay: false,\r\n\t\t\tpath: window.context.cdn + imageContainer.dataset.catimage,\r\n\t\t\tinitialSegment: seen ? [255, 354] : [0, 354]\r\n\t\t});\r\n\r\n\t\tanimation.addEventListener('complete', () => {\r\n\t\t\t// Loop the last 4 seconds of the animation continuously\r\n\t\t\tanimation.playSegments([255, 354], true);\r\n\t\t});\r\n\r\n\t\tconst animate = expressQuerySelector(containerEl, `.technical-animate-img`, true);\r\n\t\tanimate.style.transition = \"opacity 0.5s\";\r\n\t\tanimate.style.opacity = \"1\";\r\n\r\n\t\tconst eventContainerInitialHeight = eventContainer.clientHeight;\r\n\t\tconst toggleEventVisibility = (visiblePx: number) => {\r\n\t\t\tif (!mobile) {\r\n\t\t\t\timageContainer.style.opacity = `${1 - ((100 / 70) * visiblePx) / 100}`;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\teventContainer.style.opacity = `${1 - ((100 / 70) * visiblePx) / 100}`; // Changes the opacity on scroll\r\n\t\t\teventContainer.style.height = `${eventContainerInitialHeight + 1 - ((100 / 70) * visiblePx) / 5}px`; // Slightly collapses the evenContainer for a nice effect (+1 is for the border)\r\n\t\t\tif (stickyNav) {\r\n\t\t\t\tconst mobileSearchBar = expressQuerySelector(containerEl, '.technical-mobile-searchbar', true);\r\n\t\t\t\tmobileSearchBar.style.top = `${130 - visiblePx}px`; // Lets the scrollbar go to its fixed place when scrolling\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (stickyNav)\r\n\t\t\tdocument.addEventListener('scroll', _ => !getScrollingElement().classList.contains('u-no-scroll-mobile') && toggleEventVisibility(mobile ? window.scrollY > eventContainerInitialHeight ? eventContainerInitialHeight : window.scrollY : 0));\r\n\r\n\t\tanimation.play();\r\n\t\tif (!seen) writeCookieThatExpiresAtTheEndOfTheDay('evSeen', '1');\r\n\r\n\t\treturn {\r\n\t\t\ttoggleEventVisibility: (hide: boolean) => toggleEventVisibility(hide ? eventContainerInitialHeight : 0)\r\n\t\t};\r\n\t};\r\n\r\n\tconst initComponents = () => {\r\n\t\tconst eventAnimation = initEventAnimation();\r\n\r\n\t\t// Mobile Menu\r\n\t\tconst onOpen = () => { eventAnimation.toggleEventVisibility(true); };\r\n\t\tconst onClose = () => { eventAnimation.toggleEventVisibility(false); };\r\n\t\tinitMobileMenu(onOpen, onClose);\r\n\t\tconst loadDesktopMenuItemAsync = (firstLevel = -1, secondLevel = -1) => {\r\n\t\t\tif (secondLevel < 0)\r\n\t\t\t\treturn getHtmlRequest(\"/apicore/header/desktopmenu?indexLevel1=\" + firstLevel).then(res => res as string);\r\n\t\t\telse\r\n\t\t\t\treturn getHtmlRequest(\"/apicore/header/desktopmenu?indexLevel1=\" + firstLevel + \"&indexLevel2=\" + secondLevel).then(res => res as string);\r\n\t\t};\r\n\t\t// Desktop Menu\r\n\t\tconst desktopLeftMenuEl = expressQuerySelector(mainNavigationEl, '.technical-desktop-left-menu', false);\r\n\t\tif (desktopLeftMenuEl) {\r\n\t\t\tinitNavigationDesktop(\r\n\t\t\t\tdesktopLeftMenuEl, { loadDesktopMenuItemAsync }\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Language Selector\r\n\t\tconst langButtonEl = expressQuerySelector(mainNavigationEl, \".technical-language-selector\", false);\r\n\t\tconst langContainerEl = expressQuerySelector(mainNavigationEl, \".technical-language-selector-choices\", false);\r\n\t\tif (langButtonEl && langContainerEl) {\r\n\t\t\tinitLanguageSelector(langButtonEl, langContainerEl);\r\n\t\t}\r\n\r\n\t\tconst searchBarEl = expressQuerySelector(mainNavigationEl, \".o-main-navigation__searchbar\", false);\r\n\t\tif (searchBarEl) {\r\n\t\t\tinitSearchBar(\r\n\t\t\t\tsearchBarEl,\r\n\t\t\t\texpressQuerySelector(mainNavigationEl, \".o-icon-navigation__search-bar\", true),\r\n\t\t\t\t(searchTerm: string) => getRequest(\"/apicore/searchapi/autocomplete?searchterm=\" + searchTerm).then((res: string[]) => res),\r\n\t\t\t\t() => { !isMobile() && eventAnimation.toggleEventVisibility(true); },\r\n\t\t\t\t() => { !isMobile() && eventAnimation.toggleEventVisibility(false); }\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Notification Center\r\n\t\tconst notificationCenterEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__notifications-center', false);\r\n\t\tif (notificationCenterEl) {\r\n\t\t\tcreateNotificationCenter(\r\n\t\t\t\tnotificationCenterEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetNotifications: () => getHtmlRequest(\"/apicore/Header/LoadNotificationTiles\", {\r\n\t\t\t\t\t\theaders: new Headers({\r\n\t\t\t\t\t\t\t'pragma': 'no-cache',\r\n\t\t\t\t\t\t\t'cache-control': 'no-cache'\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t})\r\n\t\t\t\t\t\t.then(res => res as string),\r\n\t\t\t\t\tisMobile: isMobile,\r\n\t\t\t\t\tmarkNotificationsAsRead: (notificationIds: string[]) => {\r\n\t\t\t\t\t\tconst data = new URLSearchParams();\r\n\t\t\t\t\t\tnotificationIds.forEach(el => {\r\n\t\t\t\t\t\t\tdata.append('notificationIds', el);\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\treturn postRequest(\"/apicore/Header/MarkNotificationAsRead\", data, { headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" } }, true)\r\n\t\t\t\t\t\t\t.then((res: boolean) => res);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tonOpen: () => { isMobile() && eventAnimation.toggleEventVisibility(true); toggleScroll(); },\r\n\t\t\t\t\tonClose: () => { eventAnimation.toggleEventVisibility(false); toggleScroll(); },\r\n\t\t\t\t},\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// My-Account\r\n\t\tconst myAccountMenuEl = expressQuerySelector(mainNavigationEl, '.o-icon-navigation__user-menu', false);\r\n\t\tif (myAccountMenuEl) {\r\n\t\t\tinitMyAccount(\r\n\t\t\t\tmainNavigationEl,\r\n\t\t\t\t{\r\n\t\t\t\t\tgetIconsAsync: deps.getInlineSvgsAsync,\r\n\t\t\t\t\tisMobile: isMobile,\r\n\t\t\t\t\tonOpen: () => { isMobile() && eventAnimation.toggleEventVisibility(true); toggleScroll(); },\r\n\t\t\t\t\tonClose: () => { eventAnimation.toggleEventVisibility(false); toggleScroll(); },\r\n\t\t\t\t\tloadAccountMenu: () => getHtmlRequest(\"/apicore/Header/LoadMyAccount\").then((res: string) => res)\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tconst leadTimesBarEl = expressQuerySelector(mainNavigationEl, '.technical-leadtimes', false);\r\n\t\tif (leadTimesBarEl) {\r\n\t\t\tcreateClickableElement(\r\n\t\t\t\tleadTimesBarEl,\r\n\t\t\t\tdeps.openLeadTimesPopupAsync\r\n\t\t\t);\r\n\r\n\t\t\tgetParameter('leadtimes') === 'true' && leadTimesBarEl.click();\r\n\t\t}\r\n\r\n\t\t// init countdowns on value propositions\r\n\t\tconst topBarContainerEl = expressQuerySelector(mainNavigationEl, '.technical-top-bar-container', false);\r\n\t\tif (topBarContainerEl) {\r\n\t\t\tconst countDownEls = expressQuerySelectorAll(topBarContainerEl, \".technical-countdown\");\r\n\t\t\tcountDownEls.forEach(el => {\r\n\t\t\t\tconst countDownToDate = el.dataset.countdown || \"\";\r\n\t\t\t\tconst daysLabel = el.dataset.dayslabel || \"\";\r\n\t\t\t\tconst dayLabel = el.dataset.daylabel || \"\";\r\n\t\t\t\tif (countDownToDate !== \"\") {\r\n\t\t\t\t\tconst onCountDownFinish = () => {\r\n\t\t\t\t\t\tconst barEls = expressQuerySelectorAll(topBarContainerEl, \".technical-top-bar\");\r\n\t\t\t\t\t\tif (barEls.length === 1) {\r\n\t\t\t\t\t\t\t// Hide container\r\n\t\t\t\t\t\t\thide(topBarContainerEl);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// delete own top bar\r\n\t\t\t\t\t\t\tconst myTopBar = getParentWithClassName(el, \"technical-top-bar\");\r\n\t\t\t\t\t\t\tmyTopBar && myTopBar.remove();\r\n\r\n\t\t\t\t\t\t\t// switch container to single\r\n\t\t\t\t\t\t\ttopBarContainerEl.classList.remove(\"m-top-bar--combo\");\r\n\t\t\t\t\t\t\ttopBarContainerEl.classList.add(\"m-top-bar--single\");\r\n\r\n\t\t\t\t\t\t\t// remove div around other top bar\r\n\t\t\t\t\t\t\tconst otherTopBar = barEls.filter(el => el !== myTopBar)[0];\r\n\t\t\t\t\t\t\tif (otherTopBar)\r\n\t\t\t\t\t\t\t\totherTopBar.outerHTML = otherTopBar.innerHTML;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tinitCountDown(topBarContainerEl, el, countDownToDate, {\r\n\t\t\t\t\t\tshowDays: true,\r\n\t\t\t\t\t\tonCountDownFinish: onCountDownFinish,\r\n\t\t\t\t\t\tdaysLabel,\r\n\t\t\t\t\t\tdayLabel\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst initMobileMenu = (onOpen: () => void, onClose: () => void) => {\r\n\t\tif (mobileMenuEl) {\r\n\t\t\tconst path = '/apicore/header/mobilemenu';\r\n\t\t\tconst pageid = mobileMenuEl.getAttribute(\"data-page-id\");\r\n\t\t\tinitNavigationMobile(\r\n\t\t\t\t{\r\n\t\t\t\t\tmobileMenuEl: mobileMenuEl,\r\n\t\t\t\t\tcontainerEl: expressQuerySelector(document, \".technical-mobile-navigation\", true),\r\n\t\t\t\t\tmenuButtonEl: expressQuerySelector(document, \".technical-mobile-navigation-hamburger-menu-button\", true),\r\n\t\t\t\t\tmenuContainerEl: expressQuerySelector(document, \".technical-mobile-navigation-hamburger-menu-container\", true),\r\n\t\t\t\t\tcurrentLanguage: mobileMenuEl.getAttribute(\"data-current-language\") || undefined\r\n\t\t\t\t}, {\r\n\t\t\t\tgetMobileMenu: (indexLevel2: number, indexLevel3: number) =>\r\n\t\t\t\t\tgetHtmlRequest(path + `?indexLevel2=${indexLevel2 ?? -1}&indexLevel3=${indexLevel3 ?? -1}&pageId=${pageid}`, { headers: new Headers({ 'pragma': 'no-cache', 'cache-control': 'no-cache' }) }).then(res => res as string),\r\n\t\t\t\tgetIconsAsync: deps.getInlineSvgsAsync,\r\n\t\t\t\tonClose: () => { onClose(); toggleScroll(); },\r\n\t\t\t\tonOpen: () => { onOpen(); toggleScroll(); },\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\tconst toggleScroll = () => {\r\n\t\tconst scrollingElement = getScrollingElement();\r\n\r\n\t\tif (!scrollingElement.classList.contains('u-no-scroll-mobile')) {\r\n\t\t\tscrollingElement.dataset.scrollY = `${Math.round(window.scrollY)}`;\r\n\t\t\tscrollingElement.classList.add('u-no-scroll-mobile');\r\n\t\t} else {\r\n\t\t\tscrollingElement.classList.remove('u-no-scroll-mobile');\r\n\t\t\tconst scrollY = parseInt(scrollingElement.dataset.scrollY, 10) || window.scrollY;\r\n\t\t\tscrollingElement.dataset.scrollY = '';\r\n\t\t\twindow.scroll(0, scrollY);\r\n\t\t}\r\n};\r\n\r\nconst getScrollingElement = () => (document.scrollingElement || document.documentElement) as HTMLElement;\r\n\r\ninitComponents();\r\n}\r\n","export interface IIconResult {\r\n\treadonly url: string;\r\n\treadonly svg: string;\r\n}\r\n\r\nconst getInlineSvgAsync = (url: string): Promise => {\r\n\treturn fetch(url)\r\n\t\t.then(response => response.text())\r\n\t\t.then(data => new window.DOMParser().parseFromString(data, \"text/xml\"))\r\n\t\t.then(document => {\r\n\t\t\tif (document && document.documentElement.nodeName.toLowerCase() === 'svg') {\r\n\t\t\t\tconst svgString = new XMLSerializer().serializeToString(document);\r\n\t\t\t\treturn Promise.resolve(\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\turl,\r\n\t\t\t\t\t\tsvg: svgString\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\treturn Promise.resolve(undefined);\r\n\t\t\t}\r\n\t\t});\r\n};\r\n\r\nexport function getInlineSvgsAsync(urls: string[]) {\r\n\treturn Promise.all(urls.map(u => getInlineSvgAsync(u)))\r\n\t\t.then(items => items.filter(item => !!item) as IIconResult[]);\r\n}","import {IDisposable} from \"../utils/disposable\";\r\nimport {expressEventListener, expressQuerySelector} from \"../common/html\";\r\n\r\nexport interface ICountrySelectionDependencies {\r\n readonly showCountrySelectionPopup: () => Promise;\r\n readonly close: () => void;\r\n}\r\n\r\nexport function createCountrySelection(deps: ICountrySelectionDependencies) {\r\n let onClickDisposable: IDisposable;\r\n\r\n const init = () => {\r\n deps.showCountrySelectionPopup().then(() => {\r\n const countrySelectionPopup = expressQuerySelector(document, '#country-selection');\r\n if (countrySelectionPopup) {\r\n const continueButton = expressQuerySelector(countrySelectionPopup, '.technical-countryselection');\r\n if (continueButton) {\r\n if (continueButton.dataset.countryselectionlink) {\r\n const navigateToLink = continueButton.dataset.countryselectionlink.toLowerCase();\r\n attachOnClick(continueButton, () => navigateTo(navigateToLink));\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n const navigateTo = (navigateToLink: string | undefined) => {\r\n if (navigateToLink) document.location.href = navigateToLink;\r\n\r\n deps.close();\r\n };\r\n\r\n const attachOnClick = (button: HTMLElement, ev: any) =>\r\n (onClickDisposable = expressEventListener(button, 'click', ev));\r\n\r\n const detachClick = () => onClickDisposable && onClickDisposable.dispose();\r\n\r\n init();\r\n\r\n return {\r\n dispose: () => {\r\n detachClick();\r\n }\r\n };\r\n}\r\n","import {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\tgetParents, hide,\r\n\thtmlToElement,\r\n\texpressQuerySelectorAll, expressRemoveClass, show\r\n} from \"../common/html\";\r\nimport {postHtmlRequest} from \"../utils/fetch\";\r\nimport {compositeDisposable, IDisposable} from \"../utils/disposable\";\r\n\r\nexport interface IPopup {\r\n\tpopup: HTMLElement | undefined;\r\n\topenAsync: () => Promise;\r\n\treplaceContent: (content: Node | string) => void;\r\n\tclose: () => void;\r\n}\r\n\r\nexport interface IPopupOptions {\r\n\treadonly closeOnClickOutsidePopup?: boolean;\r\n\treadonly onClose?: (popupEl?: HTMLElement) => void;\r\n\treadonly onBeforeOpen?: (popupEl?: HTMLElement) => void;\r\n\treadonly onBeforeClose?: (popupEl?: HTMLElement) => void;\r\n\treadonly onOpen?: (popupEl?: HTMLElement) => void;\r\n\treadonly dialogId: string;\r\n\treadonly cssClass?: string;\r\n\treadonly view: string;\r\n\treadonly forceRefresh?: boolean;\r\n\treadonly fromCache?: boolean;\r\n\treadonly data?: any;\r\n\treadonly closeOnEnter?: boolean;\r\n\treadonly openClass?: string;\r\n}\r\n\r\nlet fetchingPopupContent = false;\r\n\r\nexport async function createPopup(options: IPopupOptions): Promise {\r\n\tlet isOpen = false;\r\n\tlet popupEl: HTMLElement;\r\n\tconst eventDisposables: IDisposable = compositeDisposable(undefined);\r\n\tconst html = expressQuerySelector(document, \"html\", true);\r\n\tconst body = expressQuerySelector(document, \"body\", true);\r\n\tlet currentY = window.scrollY;\r\n\tconst renderedDialogEl = expressQuerySelector(document, \".renderedDialogs\", true);\r\n\r\n\tconst {\r\n\t\tcloseOnClickOutsidePopup = true,\r\n\t\tonClose,\r\n\t\tonBeforeOpen,\r\n\t\tonBeforeClose,\r\n\t\tonOpen,\r\n\t\tdialogId,\r\n\t\tcssClass,\r\n\t\tview,\r\n\t\tforceRefresh,\r\n\t\tfromCache,\r\n\t\tdata,\r\n\t\tcloseOnEnter,\r\n\t\topenClass\r\n\t} = options;\r\n\r\n\tconst create = (): Promise => {\r\n\t\tlet popup: HTMLElement;\r\n\t\tif (dialogId) {\r\n\t\t\tpopup = expressQuerySelector(document, \"#\" + dialogId, false);\r\n\t\t\tif (popup) {\r\n\t\t\t\tif (forceRefresh) {\r\n\t\t\t\t\t// To keep the same position in the dom tree, so other popups with the same z-inder will remain above or under this popup\r\n\t\t\t\t\tconst tempEl = document.createElement(\"div\");\r\n\t\t\t\t\ttempEl.setAttribute(\"id\", \"temp-\"+dialogId);\r\n\t\t\t\t\tpopup.replaceWith(tempEl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn Promise.resolve(popup);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (fetchingPopupContent) return Promise.resolve(undefined);\r\n\t\tfetchingPopupContent = true;\r\n\r\n\t\t// Get the html from the server\r\n\t\tconst path = `/apicore/dialog/${view}`;\r\n\t\treturn postHtmlRequest(path.toLowerCase(), data, {headers: new Headers({'Content-type': 'application/json; charset=utf-8'})}).then(\r\n\t\t\tres => {\r\n\t\t\t\tif (!res) return Promise.resolve(undefined);\r\n\t\t\t\tconst temp = expressQuerySelector(document, \"#temp-\" + dialogId, false);\r\n\t\t\t\tif (forceRefresh && temp) {\r\n\t\t\t\t\t// To keep the same position in the dom tree, so other popups with the same z-inder will remain above or under this popup\r\n\t\t\t\t\tpopup = htmlToElement(res) as HTMLElement;\r\n\t\t\t\t\ttemp.replaceWith(popup);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpopup = renderedDialogEl.appendChild(htmlToElement(res)) as HTMLElement;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dialogId)\r\n\t\t\t\t\tpopup.setAttribute(\"id\", dialogId);\r\n\r\n\t\t\t\tif (cssClass)\r\n\t\t\t\t\texpressAddClass(popup, cssClass);\r\n\r\n\t\t\t\treturn Promise.resolve(popup);\r\n\t\t\t}).finally(() => { fetchingPopupContent = false; });\r\n\t};\r\n\tconst replaceContent = (content: Node | string) => {\r\n\t\teventDisposables.dispose();\r\n\t\tconst popupContentEl = expressQuerySelector(popupEl, '.m-popup__content', true);\r\n\t\tpopupContentEl.replaceWith(content);\r\n\t\taddOnClose();\r\n\t};\r\n\tconst close = () => {\r\n\t\tif (onBeforeClose) onBeforeClose(popupEl);\r\n\t\tif (openClass)\r\n\t\t\texpressRemoveClass(popupEl, openClass);\r\n\t\telse\r\n\t\t\thide(popupEl);\r\n\t\tisOpen = false;\r\n\t\t// Only do this if there are no other popups open\r\n\t\tconst popupEls = expressQuerySelectorAll(renderedDialogEl, \".m-popup\");\r\n\t\tconst otherOpenedPopups = popupEls.filter(p => p.id !== popupEl.id && (p.style.display === 'flex' || p.classList.contains('is-popup-open')));\r\n\t\tif (otherOpenedPopups.length === 0){\r\n\t\t\texpressRemoveClass(html, \"has-open-dialog u-no-scroll\");\r\n\t\t\texpressRemoveClass(body, \"u-no-scroll\");\r\n\t\t\tdocument.documentElement.style.marginTop = \"0px\";\r\n\t\t\twindow.scroll(0, currentY);\r\n\t\t}\r\n\t\teventDisposables.dispose();\r\n\t\tif (onClose) window.setTimeout(() => {\r\n\t\t\tif (!isOpen) onClose(popupEl);\r\n\t\t}, 200);\r\n\t};\r\n\r\n\tconst onMouseDownEvent = (ev) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (ev.target.id\r\n\t\t\t&& getParents(ev.target, \"#\" + popupEl.id).length < 1\r\n\t\t\t&& getParents(ev.target, \".m-popup\").length < 1 // support multiple popups\r\n\t\t\t&& isOpen) close();\r\n\t};\r\n\r\n\tconst onKeyDownEvent = (ev) => {\r\n\t\tev.stopPropagation();\r\n\t\tif (ev.which === 13 || ev.keyCode === 13) if (isOpen) close();\r\n\t};\r\n\r\n\tconst onCloseEvent = () => {\r\n\t\tif (isOpen) close();\r\n\t};\r\n\r\n\tconst addOnClose = () => {\r\n\t\tconst closeButtons = expressQuerySelectorAll(popupEl, \".technical-popup-close\");\r\n\t\tcloseButtons.forEach(closeButton => {\r\n\t\t\teventDisposables.add(expressEventListener(closeButton, 'click', onCloseEvent));\r\n\t\t});\r\n\t\tif (closeOnClickOutsidePopup) {\r\n\t\t\tgetParents(popupEl).forEach(el => {\r\n\t\t\t\teventDisposables.add(expressEventListener(el, \"mousedown\", onMouseDownEvent));\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (closeOnEnter) eventDisposables.add(expressEventListener(document, \"keydown\", onKeyDownEvent));\r\n\t};\r\n\r\n\tconst openPopupAsync = (): Promise => {\r\n\t\tif (isOpen || !popupEl) return Promise.resolve();\r\n\t\tcurrentY = window.scrollY;\r\n\t\tif (onBeforeOpen) onBeforeOpen(popupEl);\r\n\t\tif (openClass)\r\n\t\t\texpressAddClass(popupEl, openClass);\r\n\t\telse\r\n\t\t\tshow(popupEl);\r\n\t\tisOpen = true;\r\n\t\taddOnClose();\r\n\t\tdocument.documentElement.style.marginTop = \"-\" + Math.round(currentY) + \"px\";\r\n\r\n\t\texpressAddClass(html, \"has-open-dialog u-no-scroll\");\r\n\t\texpressAddClass(body, \"u-no-scroll\");\r\n\r\n\t\tif (!openClass) popupEl.style.display = \"flex\";\r\n\t\tif (isOpen && onOpen) onOpen(popupEl);\r\n\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tif (!popupEl) popupEl = await create();\r\n\r\n\treturn Promise.resolve({\r\n\t\tpopup: popupEl,\r\n\t\topenAsync: openPopupAsync,\r\n\t\tclose: close,\r\n\t\treplaceContent\r\n\t} as IPopup);\r\n}\r\n","export function checkPersonalNumber(pin, regionCode): boolean {\r\n\tif (pin.trim() === \"\")\r\n\t\treturn true;\r\n\r\n\tswitch (regionCode) {\r\n\t\tcase \"SWE\":\r\n\t\t\treturn checksumSe(pin);\r\n\t\tcase \"NOR\":\r\n\t\t\treturn checksumNo(pin);\r\n\t\tcase \"DNK\":\r\n\t\t\treturn checksumDk(pin);\r\n\t\tcase \"FIN\":\r\n\t\t\treturn checksumFi(pin);\r\n\t\tdefault:\r\n\t\t\treturn true;\r\n\t}\r\n}\r\n\r\nconst checksumDk = (pin: string): boolean => {\r\n\tif (pin && pin.length === 11) {\r\n\t\tconst checkSumString = \"4327654321\";\r\n\t\tlet result1 = 0;\r\n\t\tconst temp = pin.toString().substring(0, 6) + pin.toString().substring(7, 10);\r\n\r\n\t\tfor (let i = 0; i < 9; i++) {\r\n\t\t\tresult1 += parseInt(checkSumString[i].toString(), 10) * parseInt(temp[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum = 11 - result1 % 11;\r\n\t\tif (checksum === 11)\r\n\t\t\tchecksum = 0;\r\n\r\n\t\tif (checksum.toString() === pin[10])\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumFi = (pin: string): boolean => {\r\n\tif (pin && pin.length === 11) {\r\n\t\tconst checkSumString = \"0123456789ABCDEFHJKLMNPRSTUVWXY\";\r\n\r\n\t\tconst temp = parseInt(pin.toString().substring(0, 6) + pin.toString().substring(7, 10), 10);\r\n\t\tconst result1 = temp % 31;\r\n\t\tconst checksum = checkSumString[result1];\r\n\r\n\t\tif (checksum === pin[10])\r\n\t\t\treturn true;\r\n\t\telse\r\n\t\t\treturn false;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumNo = (pin: string): boolean => {\r\n\tif (pin && pin.length === 12) {\r\n\t\tlet result1 = 0;\r\n\t\tlet result2 = 0;\r\n\t\tconst checkSumString1 = \"376189-452\";\r\n\t\tconst checkSumString2 = \"543276-5432\";\r\n\r\n\t\tfor (let i = 0; i < 10; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\t\t\tresult1 += parseInt(checkSumString1[i].toString(), 10) * parseInt(pin[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum1 = 11 - result1 % 11;\r\n\t\tif (checksum1 === 11)\r\n\t\t\tchecksum1 = 0;\r\n\r\n\t\tif (checksum1.toString() !== pin[10])\r\n\t\t\treturn false;\r\n\r\n\r\n\t\tfor (let i = 0; i < 11; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\t\t\tresult2 += parseInt(checkSumString2[i].toString(), 10) * parseInt(pin[i].toString(), 10);\r\n\t\t}\r\n\r\n\t\tlet checksum2 = 11 - result2 % 11;\r\n\t\tif (checksum2 === 11)\r\n\t\t\tchecksum2 = 0;\r\n\r\n\t\tif (checksum2.toString() !== pin[11])\r\n\t\t\treturn false;\r\n\t\telse\r\n\t\t\treturn true;\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nconst checksumSe = (pin: string): boolean => {\r\n\tif (pin && (pin.length === 11 || pin.length === 13)) {\r\n\t\tlet result1 = 0;\r\n\t\tconst multiplier = \"212121-212\".split('').map(s => +s); // convert string to number using +\r\n\t\tlet temp = 0;\r\n\r\n\t\t// format must be 123456-1234\r\n\t\tif (pin.length === 13)\r\n\t\t\tpin = pin.toString().substring(2);\r\n\t\tconst pins = pin.split('').map(s => +s);\r\n\t\tfor (let i = 0; i < 10; i++) {\r\n\t\t\tif (i === 6)\r\n\t\t\t\tcontinue;\r\n\r\n\t\t\ttemp = multiplier[i] * pins[i];\r\n\t\t\tif (temp > 9)\r\n\t\t\t\tresult1 += parseInt(temp.toString().split('')[0], 10) + parseInt(temp.toString().split('')[1], 10);\r\n\t\t\telse\r\n\t\t\t\tresult1 += temp;\r\n\t\t}\r\n\r\n\t\tconst lastDigit = parseInt(result1.toString().split('')[result1.toString().length - 1], 10);\r\n\r\n\t\tlet checksum;\r\n\t\tif (lastDigit === 0)\r\n\t\t\tchecksum = 0;\r\n\t\telse\r\n\t\t\tchecksum = 10 - lastDigit;\r\n\r\n\t\treturn checksum === pins[10];\r\n\t} else {\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\n","import {expressQuerySelector, isElementVisible} from \"../common/html\";\r\nimport {debounce} from \"../utils/debounce\";\r\n\r\nexport function createScrollToTop()\r\n{\r\n\tconst scrollToTopEl = expressQuerySelector(document, \".technical-scroll-to-top\", false);\r\n\tconst init = () => {\r\n\t\tconst wobblerEl = expressQuerySelector(document, \".m-wobbler\", false);\r\n\t\tconst stickyCtaButtonEl = expressQuerySelector(document, \".technical-mobile-cta-button\", false);\r\n\t\tconst footerEl = expressQuerySelector(document, \"footer\", false);\r\n\t\tlet fade;\r\n\t\tlet displayNone;\r\n\t\tif (wobblerEl && stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\tscrollToTopEl!.classList.add('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t} else {\r\n\t\t\tif (wobblerEl) scrollToTopEl.classList.add('m-scroll-to-top--has-wobbler');\r\n\t\t\tif (stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) scrollToTopEl.classList.add(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t}\r\n\r\n\t\tconst isIOS = (): boolean => {\r\n\t\t\tconst iosQuirkPresent = () => {\r\n\t\t\t\tconst audio = new Audio();\r\n\t\t\t\taudio.volume = 0.5;\r\n\t\t\t\treturn audio.volume === 1; // volume cannot be changed from \"1\" on iOS 12 and below\r\n\t\t\t};\r\n\t\t\tconst isIOS = /iPad|iPhone|iPod/.test(navigator.userAgent);\r\n\t\t\tconst isAppleDevice = navigator.userAgent.indexOf('Macintosh') !== 0;\r\n\t\t\tconst isTouchScreen = navigator.maxTouchPoints >= 1; // true for iOS 13\r\n\t\t\treturn isIOS || (isAppleDevice && (isTouchScreen || iosQuirkPresent()));\r\n\t\t};\r\n\r\n\t\tconst setBottomStyle = () => {\r\n\t\t\tif (wobblerEl && stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = stickyCtaButtonEl.clientHeight + \"px\";\r\n\t\t\t\tif (stickyCtaButtonEl.clientHeight > 60) scrollToTopEl.style.bottom = \"125px\";\r\n\t\t\t\telse scrollToTopEl.style.bottom = \"110px\";\r\n\t\t\t} else if (stickyCtaButtonEl && isElementVisible(stickyCtaButtonEl)) {\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = stickyCtaButtonEl.clientHeight + \"px\";\r\n\t\t\t\tif (stickyCtaButtonEl.clientHeight > 60) scrollToTopEl.style.bottom = \"105px\";\r\n\t\t\t\telse scrollToTopEl.style.bottom = \"90px\";\r\n\t\t\t} else {\r\n\t\t\t\tscrollToTopEl.style.bottom = \"\";\r\n\t\t\t\tif (footerEl) footerEl.style.marginBottom = \"\";\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst showBtn = (num: number) => {\r\n\t\t\tif (document.documentElement.scrollTop >= num ) {\r\n\t\t\t\tclearTimeout(fade);\r\n\t\t\t\tfade = setTimeout( function() {\r\n\t\t\t\t\tclearTimeout(displayNone);\r\n\t\t\t\t\tscrollToTopEl!.classList.remove('u-hide');\r\n\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\tscrollToTopEl!.classList.remove('m-scroll-to-top--invisible');\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t}, 100);\r\n\t\t\t} else {\r\n\t\t\t\tclearTimeout(fade);\r\n\t\t\t\tfade = setTimeout( function() {\r\n\t\t\t\t\tscrollToTopEl!.classList.add('m-scroll-to-top--invisible');\r\n\t\t\t\t\tdisplayNone = setTimeout(function () {\r\n\t\t\t\t\t\tscrollToTopEl!.classList.add('u-hide');\r\n\t\t\t\t\t}, 500);\r\n\t\t\t\t}, 100);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst onResize = () => {\r\n\t\t\tif (!stickyCtaButtonEl) return;\r\n\t\t\tif (isElementVisible(stickyCtaButtonEl))\r\n\t\t\t{\r\n\t\t\t\tif (wobblerEl) scrollToTopEl!.classList.add('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t\t\telse scrollToTopEl.classList.add(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t\t} else {\r\n\t\t\t\tif (wobblerEl) {\r\n\t\t\t\t\tscrollToTopEl!.classList.remove('m-scroll-to-top--has-wobbler--has-sticky-button');\r\n\t\t\t\t\tscrollToTopEl.classList.add('m-scroll-to-top--has-wobbler');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscrollToTopEl.classList.remove(\"m-scroll-to-top--has-sticky-button\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tsetBottomStyle();\r\n\t\t};\r\n\r\n\t\twindow.addEventListener('scroll', () => { showBtn(20); });\r\n\t\twindow.addEventListener('resize', () => { debounce(onResize, 100); });\r\n\r\n\t\tif (scrollToTopEl) {\r\n\t\t\tscrollToTopEl.addEventListener(\"click\", () => {\r\n\t\t\t\twindow.scrollTo({ top: 0, behavior: \"smooth\" });\r\n\t\t\t\tif (isIOS()) debounce(() => { window.scrollTo({ top: 0, behavior: \"smooth\" }); }, 100);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tsetBottomStyle();\r\n\t};\r\n\r\n\tscrollToTopEl && init();\r\n}\r\n","import { expressQuerySelector } from \"../common/html\";\r\nimport { createNewsletterSubscribe } from \"./newsletter\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport { getCookie } from \"../utils/cookie\";\r\n\r\nexport function initLeaveIntent() {\r\n\tconst toggleLeaveIntent = (enable: boolean) => { if (typeof window.enableLeaveIntent !== \"undefined\") window.enableLeaveIntent = enable; };\r\n\tconst isLeaveIntentEnabled = (): boolean => window.enableLeaveIntent && window.location.search.indexOf(\"embed\") < 0 && getCookie(\"subscribedInThisSession\") !== \"true\";\r\n\tconst triggerLeaveIntentPopup = () => {\r\n\t\tcreatePopup({\r\n\t\t\tdialogId: 'leave-intent-dialog',\r\n\t\t\tview: 'leaveintentdialog'\r\n\t\t}).then(popup => {\r\n\t\t\tif (!popup.popup) return;\r\n\t\t\tpopup.openAsync()\r\n\t\t\t\t.then(_ => createNewsletterSubscribe(expressQuerySelector(popup.popup, '.technical-newsletter-subscribe', true)));\r\n\t\t});\r\n\t};\r\n\tconst init = (forceEnable?: boolean) => {\r\n\t\tif (!isLeaveIntentEnabled() && !forceEnable) return;\r\n\r\n\t\ttry {\r\n\t\t\touibounce(false, {\r\n\t\t\t\tsensitivity: 20,\r\n\t\t\t\taggressive: false,\r\n\t\t\t\tsitewide: true,\r\n\t\t\t\ttimer: 1000,\r\n\t\t\t\tdelay: 100,\r\n\t\t\t\tcallback: triggerLeaveIntentPopup,\r\n\t\t\t\tcookieExpire: 1,\r\n\t\t\t\tcanFire: isLeaveIntentEnabled\r\n\t\t\t});\r\n\t\t} catch (exc) {\r\n\t\t\t// Adblocker probably blocked ouiBounce from loading.\r\n\t\t}\r\n\t};\r\n\r\n\tinit(false);\r\n\r\n\treturn {\r\n\t\tEnableLeaveIntentPopup: () => init(true),\r\n\t\tEnableLeaveIntent: () => toggleLeaveIntent(true),\r\n\t\tDisableLeaveIntent: () => toggleLeaveIntent(false)\r\n\t};\r\n}\r\n","import {createPopup, IPopup} from \"./popup-new\";\r\nexport interface IShowContentDialogDependencies {\r\n\treadonly dialogId: string;\r\n\treadonly label?: string;\r\n\treadonly title?: string;\r\n\treadonly cssClass?: string;\r\n\treadonly addTitleCssClass?: boolean;\r\n\treadonly extraPopupCss?: string;\r\n\treadonly openFunction?: (popupEl: HTMLElement) => void;\t\r\n\treadonly okButtonKey?: string;\r\n\treadonly onClose? : (popupEl?: HTMLElement) => void;\r\n}\r\n\r\nexport function ShowContentDialog(deps: IShowContentDialogDependencies): Promise {\r\n\tconst { label, title, dialogId, cssClass, openFunction, okButtonKey, onClose, addTitleCssClass, extraPopupCss } = deps;\r\n\tif (!dialogId) return;\r\n\r\n\treturn createPopup({\r\n\t\tdialogId: dialogId,\r\n\t\tview: 'GenericPopup',\r\n\t\tdata: {\r\n\t\t\tBodyLabel: label?.startsWith('Label.') ? label : `Label.${label}`,\r\n\t\t\tTitleLabel: title?.startsWith('Label.') ? title : `Label.${title}`,\r\n\t\t\tExtraPopupCss: extraPopupCss,\r\n\t\t\tTitleCssClass: addTitleCssClass ? 'a-typography__no-decoration technical-popup-title' : '',\r\n\t\t\tOkButtonLabel: okButtonKey\r\n\t\t},\r\n\t\tcssClass: cssClass,\r\n\t\tcloseOnClickOutsidePopup: true,\r\n\t\tforceRefresh: true,\r\n\t\tonClose\r\n\t}).then(popup => {\r\n\t\tif (!popup.popup) return;\r\n\t\tpopup.openAsync();\r\n\t\tif (openFunction)\r\n\t\t\topenFunction(popup.popup);\r\n\t\treturn popup;\r\n\t});\r\n}\r\n","import { expressQuerySelector, expressQuerySelectorAll, hasClass } from \"../common/html\";\r\nimport { getParameter } from \"../utils/querystring\";\r\nimport { toUrlHash } from \"../utils/string\";\r\n\r\nexport interface ITabDependencies {\r\n\treadonly onBeforeOpen?: (tabContentEl: HTMLElement) => Promise;\r\n\treadonly onTabSwitch?: (oldTabId: string, newTabId: string) => void;\r\n}\r\n\r\nexport interface ITabContentRequest {\r\n\tid: string;\r\n\tproductCategory: string;\r\n\ttheme: string;\r\n}\r\n\r\nexport function CreateTabs(container: HTMLElement, deps?: ITabDependencies) {\r\n\tlet tabsCollectionContainer;\r\n\tif (hasClass(container, 'm-tabs')) {\r\n\t\ttabsCollectionContainer = container;\r\n\t} else {\r\n\t\ttabsCollectionContainer = expressQuerySelector(container, '.m-tabs', true);\r\n\t}\r\n\tconst tabHideClass = tabsCollectionContainer.dataset.hideclass || 'u-hide';\r\n\tconst init = () => {\r\n\t\tconst tabEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__input');\r\n\t\tif (tabEls.length > 1) {\r\n\t\t\tconst urlParams = new URLSearchParams(window.location.search);\r\n\t\t\tconst activeTab = urlParams.get('activetab');\r\n\t\t\tif (tabEls.filter(el => el.dataset.url).length === 0) {\r\n\t\t\t\tfixDataAttributes(tabEls);\r\n\t\t\t}\r\n\t\t\tupdateTab(tabEls, tabHideClass, activeTab);\r\n\t\t\taddEventListenerToTabs(tabEls);\r\n\t\t}\r\n\t};\r\n\tconst addQueryStringParameter = (key: string, value: string) => {\r\n\t\tif ('URLSearchParams' in window) {\r\n\t\t\tconst searchParams = new URLSearchParams(window.location.search);\r\n\t\t\tsearchParams.set(key, value);\r\n\t\t\tconst newRelativePathQuery = window.location.pathname + '?' + searchParams.toString();\r\n\t\t\thistory.replaceState({}, document.title, newRelativePathQuery);\r\n\t\t}\r\n\t};\r\n\r\n\tconst fixDataAttributes = (tabEls: HTMLInputElement[]) => {\r\n\t\tconst tabContentEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__content');\r\n\t\tif (tabEls.filter(el => el.dataset.url).length === 0) {\r\n\t\t\tlet hash;\r\n\t\t\tfor (let i = 0; i < tabEls.length; i++) {\r\n\t\t\t\tif (tabEls[i].hasAttribute('id')) {\r\n\t\t\t\t\thash = toUrlHash(tabEls[i].getAttribute('id'));\r\n\t\t\t\t\ttabEls[i].dataset.url = hash;\r\n\t\t\t\t\ttabContentEls[i].dataset.url = hash;\r\n\t\t\t\t} else {\r\n\t\t\t\t\thash = 'tab' + i + '';\r\n\t\t\t\t\ttabEls[i].dataset.url = hash;\r\n\t\t\t\t\ttabContentEls[i].dataset.url = hash;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst addEventListenerToTabs = (tabEls: HTMLInputElement[]) => {\r\n\t\t// make tabs click-able\r\n\t\tfor (let i = 0; i < tabEls.length; i++)\r\n\t\t\ttabEls[i].addEventListener('change', (e) => {\r\n\t\t\t\tupdateTab(tabEls, tabHideClass, (e.target as HTMLElement).dataset.url);\r\n\t\t\t});\r\n\t};\r\n\r\n\t// update tab content visibility\r\n\tconst updateTab = (tabEls: HTMLInputElement[], hideClass: string, hash: string | undefined, pushNewHash = true) => {\r\n\t\tconst tabToSelect = hash ? expressQuerySelector(tabsCollectionContainer, `input[data-url=\"${hash}\"]`, false) : undefined;\r\n\t\tconst tabToSelectContent = hash ? expressQuerySelector(tabsCollectionContainer, `div[data-url=\"${hash}\"]`, false) : undefined;\r\n\t\tconst tabContentEls = expressQuerySelectorAll(tabsCollectionContainer, '.m-tabs__content');\r\n\r\n\t\tif (tabToSelectContent && deps?.onBeforeOpen && tabToSelect && (!tabToSelect.dataset.loaded || tabToSelect.dataset.loaded !== 'true')) {\r\n\t\t\tdeps.onBeforeOpen(tabToSelectContent).then(_ => { tabToSelect.dataset.loaded = 'true'; });\r\n\t\t}\r\n\r\n\t\tfor (let z = 0; z < tabEls.length; z++) {\r\n\t\t\t// set check if selected tab\r\n\t\t\ttabEls[z].checked = (tabEls[z] === tabToSelect || (!tabToSelect && z === 0));\r\n\r\n\t\t\t// hide/show content selected tab\r\n\t\t\ttabContentEls[z].classList.toggle(hideClass || 'u-hide', !tabEls[z].checked);\r\n\r\n\t\t\t// push new # to the url bar\r\n\t\t\tif (tabEls[z].checked && pushNewHash && tabToSelect) {\r\n\t\t\t\tdeps?.onTabSwitch && deps.onTabSwitch(getParameter('activetab'), hash);\r\n\t\t\t\taddQueryStringParameter(\"activetab\", `${hash}`);\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tinit();\r\n}\r\n","import {expressEventListener, expressQuerySelector} from \"../common/html\";\r\nimport {ShowContentDialog} from \"./content-dialog\";\r\nimport {CreateTabs} from \"./tab\";\r\n\r\nexport function createPopupLauncher(el: HTMLElement) {\r\n\tconst dialogId = el.dataset.dialogid || '';\r\n\tconst contentKey = el.dataset.label || '';\r\n\tif (dialogId && contentKey) {\r\n\t\tconst initContentParts = (popupEl: HTMLElement) => {\r\n\t\t\tif (!popupEl) return;\r\n\t\t\tconst tabsEl = expressQuerySelector(popupEl, \".m-tabs\", false);\r\n\t\t\tif (tabsEl) CreateTabs(tabsEl);\r\n\t\t};\r\n\t\tconst onClick = (e:MouseEvent) => {\r\n\t\t\te.preventDefault();\r\n\t\t\tShowContentDialog({dialogId: dialogId, label: contentKey, openFunction: initContentParts});\r\n\t\t}; \r\n\t\texpressEventListener(el, 'click', onClick);\r\n\t}\r\n}\r\n","import {getHtmlRequest} from \"../utils/fetch\";\r\nimport {addParameter, updateParameter} from \"../utils/querystring\";\r\nconst basePath = \"/apicore/componentapi/\";\r\n\r\nexport function getComponentContent(\r\n\tcomponent: string,\r\n\tcontentKey: string,\r\n\tepc = \"\",\r\n\tisProspect = false,\r\n\tthemeKey = '',\r\n\tpageTemplate = '',\r\n\tpageName = '',\r\n\tindex = \"0\",\r\n\thidepromotionvisualization = 'false'): Promise {\r\n\tlet path = basePath + component;\r\n\tif (contentKey) path = addParameter(\"contentKey\", contentKey, path);\r\n\tif (epc) path = addParameter(\"epc\", epc, path);\r\n\tpath = addParameter(\"isProspect\", isProspect+'', path);\r\n\tif (themeKey) path = addParameter(\"theme\", themeKey, path);\r\n\tif (pageTemplate) path = addParameter(\"pageTemplate\", pageTemplate, path);\r\n\tif (pageName) path = addParameter(\"pageName\", pageName, path);\r\n\tpath = addParameter(\"index\", index, path);\r\n\tpath = addParameter(\"hidepromotionvisualization\", hidepromotionvisualization, path);\r\n\treturn getHtmlRequest(\r\n\t\tpath,\r\n\t\t{ headers: new Headers({'Content-type': 'application/json; charset=utf-8'}) })\r\n\t\t.then() as Promise;\r\n}\r\n","export interface IDataLayerProduct {\r\n\tcurrency: string;\r\n\tdeliveryInfo: string;\r\n\tformatImageSrc: string;\r\n\tcategoryCode: string;\r\n\tcategoryName: string;\r\n\tprice: number;\r\n\tparentCategories: string;\r\n\tpvc: string;\r\n\tproductCode: string;\r\n\tpvcName: string;\r\n}\r\n\r\nexport function pushEecDetailEvent(newUrl: string, product: IDataLayerProduct) {\r\n\tif (window.dataLayer[0].datalayerVersion >= '2022-06') {\r\n\t\twindow.dataLayer = window.dataLayer || [];\r\n\t\twindow.dataLayer.push({\r\n\t\t\tevent: 'eec.detail',\r\n\t\t\tecommerce: {\r\n\t\t\t\tdetail: {\r\n\t\t\t\t\tactionField: {\r\n\t\t\t\t\t},\r\n\t\t\t\t\tproducts: [{\r\n\t\t\t\t\t\tvariant: product?.pvc,\r\n\t\t\t\t\t\tid: product?.productCode,\r\n\t\t\t\t\t\tname: product?.pvcName,\r\n\t\t\t\t\t\tcategory: product?.parentCategories,\r\n\t\t\t\t\t\tprice: product?.price,\r\n\t\t\t\t\t\tpriceWOVat: 0,\r\n\t\t\t\t\t\tcurrencyCode: product?.currency,\r\n\t\t\t\t\t\tisItemJustAddedToCart: false,\r\n\t\t\t\t\t\tproductCategoryName: product?.categoryName,\r\n\t\t\t\t\t\tproductCategoryCode: product?.categoryCode,\r\n\t\t\t\t\t\tproductCategoryUrl: newUrl,\r\n\t\t\t\t\t\tvariantFormatImageUrl: product?.formatImageSrc,\r\n\t\t\t\t\t\testDeliveryDate: product?.deliveryInfo,\r\n\t\t\t\t\t\tisVoucher: false // ?\r\n\t\t\t\t\t}]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n\r\nexport function pushComponentEvent(componentName: string) {\r\n\twindow.dataLayer = window.dataLayer || [];\r\n\twindow.dataLayer.push({\r\n\t\t'event': componentName +'.component.loaded'\r\n\t});\r\n}\r\n","import {\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\thasClass,\r\n\tisElementPartiallyVisibleInViewport,\r\n\tisMobileOnPageWithHeader\r\n} from \"../common/html\";\r\nimport {getComponentContent} from \"../services/component-service.\";\r\nimport {trackComponentEvent} from \"../common/events\";\r\nimport {pushComponentEvent} from \"./datalayer\";\r\nimport {isValidPartialViewResponse} from \"../utils/fetch\";\r\n\r\nexport interface IComponent {\r\n\treadonly name: string;\r\n\treadonly activate: () => void;\r\n\treadonly index: string;\r\n}\r\n\r\nexport function createComponentLoader() {\r\n\tconst componentEls = expressQuerySelectorAll(document, \"[data-component]\");\r\n\tconst components: IComponent[] = [];\r\n\t/*const loadedScripts: string[] = [];\r\n\tconst scriptBasePath = \"core/components/\";*/\r\n\tconst isMobile = () => isMobileOnPageWithHeader();\r\n\r\n\tconst observerOptions = {\r\n\t\trootMargin: \"200px 0px 200px 0px\",\r\n\t\tthreshold: [0, .5, 1]\r\n\t};\r\n\r\n\tconst initComponent = (el: HTMLElement) => {\r\n\t\tconst componentName =el.dataset.component || '';\r\n\t\tconst index = el.dataset.index || '';\r\n\t\tconst initialized = el.dataset.init === 'true' || false;\r\n\t\tif (!componentName || initialized) return;\r\n\t\tconst currentComponent = index\r\n\t\t\t? components.find(c => c.name === componentName && c.index === index)\r\n\t\t\t: components.find(c => c.name === componentName);\r\n\t\tif (!currentComponent) return;\r\n\t\tcurrentComponent.activate();\r\n\t};\r\n\r\n\tfunction callback(entries: IntersectionObserverEntry[], observer: IntersectionObserver) {\r\n\t\tentries.forEach(entry => {\r\n\t\t\tif (!entry.isIntersecting && entry.intersectionRatio <= 0) return;\r\n\t\t\tinitComponent(entry.target as HTMLElement);\r\n\t\t\tobserver.unobserve(entry.target);\r\n\t\t});\r\n\t}\r\n\r\n\tconst componentObserver = new IntersectionObserver(callback, observerOptions);\r\n\r\n\tconst createComponent = (componentEl: HTMLElement) => {\r\n\t\tconst name = componentEl.dataset.component || '';\r\n\t\tif (!name) return;\r\n\t\tconst callback = componentEl.dataset.componentCallback || '';\r\n\t\tconst passElInCallback = componentEl.dataset.componentPassElementInCallback === \"true\" || false;\r\n\t\tconst trackGaEvent = componentEl.dataset.componentGaEvent || '';\r\n\t\tconst trackHeight = componentEl.dataset.componentTrackHeight === \"true\" || false;\r\n\t\tconst pushDatalayerEvent = componentEl.dataset.componentPushDatalayerEvent === \"true\" || false;\r\n\t\tconst contentKey = componentEl.dataset.componentContentkey || '';\r\n\t\tconst epc = componentEl.dataset.componentEpc|| '';\r\n\t\tconst isProspect = componentEl.dataset.componentIsProspect === \"true\" || false;\r\n\t\tconst themeKey = componentEl.dataset.componentTheme || '';\r\n\t\tconst pageTemplate = componentEl.dataset.componentTemplate || '';\r\n\t\tconst replaceNode = componentEl.dataset.replaceNode || false;\r\n\t\tconst pageName = componentEl.dataset.componentPageName || '';\r\n\t\tconst hidepromotionvisualization = componentEl.dataset.hidepromotionvisualization || '';\r\n\r\n\t\t// Set an index in order for the observer to target the correct element\r\n\t\tlet index = \"0\";\r\n\t\tif (components.find(el => el.name === name)) {\r\n\t\t\tindex = components.filter(el => el.name === name).length+\"\";\r\n\t\t}\r\n\t\tcomponentEl.dataset.index = index;\r\n\r\n\t\tif (trackHeight) {\r\n\t\t\tconst height = sessionStorage.getItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\");\r\n\t\t\tif (height) {\r\n\t\t\t\tcomponentEl.style.minHeight = height + 'px';\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst addComponentContent = (): Promise => {\r\n\t\t\treturn getComponentContent(name, contentKey, epc, isProspect, themeKey, pageTemplate, pageName, index, hidepromotionvisualization).then(r => {\r\n\t\t\t\tif (!r || !isValidPartialViewResponse(r)) return false;\r\n\t\t\t\tconst parent = componentEl.parentElement;\r\n\t\t\t\tif (parent && replaceNode) {\r\n\t\t\t\t\tconst elementHtml = document.createRange().createContextualFragment(r);\r\n\t\t\t\t\tparent.replaceChild(elementHtml, componentEl);\r\n\t\t\t\t\tcomponentEl = parent;\r\n\r\n\t\t\t\t\tif (trackGaEvent) trackComponentEvent(trackGaEvent);\r\n\t\t\t\t\tif (trackHeight) {\r\n\t\t\t\t\t\tconst height = componentEl.offsetHeight;\r\n\t\t\t\t\t\tsessionStorage.setItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\", height + '');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomponentEl.insertAdjacentHTML(\"afterbegin\", r);\r\n\r\n\t\t\t\t\tif (trackGaEvent) trackComponentEvent(trackGaEvent);\r\n\t\t\t\t\tif (trackHeight) {\r\n\t\t\t\t\t\tconst height = componentEl.offsetHeight;\r\n\t\t\t\t\t\tsessionStorage.setItem(name + (isMobile ? \"Mobile\" : \"Desktop\") + \"Height\", height + '');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (hasClass(componentEl, 'skeleton-loading')) {\r\n\t\t\t\t\t\texpressRemoveClass(componentEl, 'skeleton-loading');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (componentEl.getAttribute(\"style\")) {\r\n\t\t\t\t\t\tcomponentEl.removeAttribute(\"style\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (pushDatalayerEvent) {\r\n\t\t\t\t\tpushComponentEvent(name);\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst loadJavascriptAndRunMethod = () => {\r\n\t\t\tif (callback) {\r\n\t\t\t\t/* For now we disable the load of js on demand\r\n\t\t\t\tif (!loadedScripts.includes(name)) {\r\n\t\t\t\t\tconst scriptEl = document.createElement(\"script\");\r\n\t\r\n\t\t\t\t\tscriptEl.addEventListener(\"load\", () => {\r\n\t\t\t\t\t\tloadedScripts.push(name);\r\n\t\t\t\t\t\tif (passElInCallback) {\r\n\t\t\t\t\t\t\twindow[callback].call(this, componentEl);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\twindow[callback].call(this);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\r\n\t\t\t\t\tscriptEl.src = getCdnPathForJsFile(scriptBasePath + name + \".min.js\");\r\n\t\t\t\t\tdocument.body.appendChild(scriptEl);\r\n\t\t\t\t} else { */\r\n\t\t\t\t\tif (passElInCallback) {\r\n\t\t\t\t\t\twindow[callback].call(this, componentEl);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twindow[callback].call(this);\r\n\t\t\t\t\t}\r\n\t\t\t\t/*} */\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tconst activate = () => {\r\n\t\t\tcomponentEl.dataset.init = 'true';\r\n\t\t\taddComponentContent().then(r => {\r\n\t\t\t\tif (r) {\r\n\t\t\t\t\tif (callback) loadJavascriptAndRunMethod();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomponentEl.dataset.error = 'true';\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tconst component = {\r\n\t\t\tname,\r\n\t\t\tactivate,\r\n\t\t\tindex\r\n\t\t} as IComponent;\r\n\t\tcomponents.push(component);\r\n\t};\r\n\r\n\tconst init = (): Promise => {\r\n\t\tcomponentEls.forEach(el => createComponent(el));\r\n\t\treturn Promise.resolve();\r\n\t};\r\n\r\n\tinit().then(_ => {\r\n\t\tcomponentEls.forEach(el => {\r\n\t\t\tif (isElementPartiallyVisibleInViewport(el, 10)) {\r\n\t\t\t\tinitComponent(el);\r\n\t\t\t} else {\r\n\t\t\t\tcomponentObserver.observe(el);\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n","import { onlyLetters, onlyNumber } from \"./string\";\r\n\r\nexport function isValidVatNumber(input: string, countryCode: string) {\r\n\tif (vatNumberHasCorrectCountryCode(input, countryCode)) {\r\n\t\tif (countryCode.toLowerCase() !== 'bel') return true;\r\n\t\tconst vatNumber = input.match(/\\d/g);\r\n\t\tlet vatNumberString = '';\r\n\t\tif (vatNumber) vatNumberString = vatNumber.join('');\r\n\t\tconst part1 = parseInt(vatNumberString.substring(0, vatNumberString.length - 2), 10);\r\n\t\tconst part2 = parseInt(vatNumberString.substring(vatNumberString.length - 2), 10);\r\n\t\tconst temp = part1 - parseInt((part1 / 97) + \"\", 10) * 97;\r\n\t\treturn 97 - temp === part2;\r\n\t}\r\n\treturn false;\r\n}\r\n\r\nexport function vatNumberHasCorrectCountryCode(vatNumber: string, countryCode: string) {\r\n\tif (countryCode.toLowerCase() !== 'bel'\r\n\t\t&& countryCode.toLowerCase() !== 'ndl'\r\n\t\t&& countryCode.toLowerCase() !== 'che'\r\n\t\t&& countryCode.toLowerCase() !== 'swe') return true;\r\n\tlet testVal = '';\r\n\tswitch (countryCode.toLowerCase()) {\r\n\t\tcase 'bel':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'be');\r\n\t\t\tbreak;\r\n\t\tcase 'ndl':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'nl');\r\n\t\t\tbreak;\r\n\t\tcase 'che':\r\n\t\t\ttestVal = vatNumber.substring(0, 3);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'che');\r\n\t\t\tbreak;\r\n\t\tcase 'swe':\r\n\t\t\ttestVal = vatNumber.substring(0, 2);\r\n\t\t\tif (onlyNumber(testVal)) return true;\r\n\t\t\treturn (onlyLetters(testVal) && testVal.toLowerCase() === 'se');\r\n\t\t\tbreak;\r\n\t}\r\n}\r\n","// returns format YYYY-MM-DD (for html5 date input fields)\r\nexport function getFormattedDate(date: Date): string {\r\n\tlet year = date.getFullYear().toString();\r\n\tyear = year.length > 3 ? year\r\n\t\t: year.length > 2 ? '0' + year\r\n\t\t\t: year.length > 1 ? '00' + year\r\n\t\t\t\t: year.length > 0 ? '000' + year\r\n\t\t\t\t\t: '0000';\r\n\tlet month = (1 + date.getMonth()).toString();\r\n\tmonth = month.length > 1 ? month : '0' + month;\r\n\tlet day = date.getDate().toString();\r\n\tday = day.length > 1 ? day : '0' + day;\r\n\treturn year + '-' + month + '-' + day;\r\n}\r\n\r\nexport function getDate(dateString: string): Date {\r\n\tconst regex = new RegExp(/(^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]\\d{4}$)|(^\\d{4}[-](0?[1-9]|1[012])[/-](0?[1-9]|[12][0-9]|3[01])$)/);\r\n\tif (!regex.test(dateString))\r\n\t\tthrow Error(\"invalid date format: \" + dateString + \". Expected either YYYY-MM-DD or DD-MM-YYYY\");\r\n\r\n\tlet date: Date;\r\n\tconst firstPart = dateString.substr(0, dateString.indexOf(\"-\"));\r\n\tif (firstPart.length === 4)\r\n\t\tdate = new Date(dateString);\r\n\telse {\r\n\t\tconst dateParts = dateString.split(\"-\").map(s => +s);\r\n\t\tdate = new Date(dateParts[2], dateParts[1] - 1, dateParts[0]);\r\n\t}\r\n\r\n\treturn date;\r\n}\r\n\r\nexport function convertDateToUtcDate(date: Date): Date {\r\n\treturn new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()));\r\n}\r\n\r\nexport function deserialiseDate(dateString: string | null): Date {\r\n\tconst MIN_DATE = new Date(\"0001-01-01\");\r\n\tif (!dateString) return MIN_DATE;\r\n\r\n\tconst timestamp = /Date\\(([^)]+)\\)/.exec(dateString)?.[1];\r\n\tif (!timestamp) return MIN_DATE;\r\n\r\n\treturn new Date(parseInt(timestamp));\r\n}\r\n","import { expressQuerySelector, pageVisibilityChange } from \"../common/html\";\r\n\r\nexport function createAbandonedVisitTitleSwapper() {\r\n\tconst origTitle = document.title;\r\n\tconst titleEl = expressQuerySelector(document, 'title', true);\r\n\tif (titleEl.dataset.abandonedvisitenabled && titleEl.dataset.abandonedvisitenabled.toLowerCase() === \"false\") return;\r\n\tlet blinkInterval: number | null;\r\n\tconst blinkTitle = () => {\r\n\t\tconst currentTitle = document.title;\r\n\t\tif (currentTitle === titleEl.dataset.abandonedvisittitle)\r\n\t\t\tdocument.title = titleEl.dataset.abandonedvisittitlealternate;\r\n\t\telse\r\n\t\t\tdocument.title = titleEl.dataset.abandonedvisittitle;\r\n\t\t// history.replaceState({}, origTitle, window.location.href);\r\n\t};\r\n\r\n\tconst onVisible = () => {\r\n\t\tclearInterval(blinkInterval);\r\n\t\tblinkInterval = null;\r\n\t\tdocument.title = origTitle;\r\n\t};\r\n\tconst onHidden = () => {\r\n\t\tif (!blinkInterval) {\r\n\t\t\tconst interval = parseInt(titleEl.dataset.abandonedvisitspeed, 10) || 2000;\r\n\t\t\t// @ts-ignore\r\n\t\t\tblinkInterval = setInterval(blinkTitle, interval);\r\n\t\t}\r\n\t};\r\n\r\n\twindow.addEventListener('beforeunload', () => {\r\n\t\tdocument.title = origTitle;\r\n\t});\r\n\r\n\tpageVisibilityChange(onVisible, onHidden);\r\n}\r\n","// This component will be used on the pages typescript files and will execute the scripts tht should fire on every page e.g. footer, header, etc\r\nimport { logErrorEvent } from \"../services/logger-service\";\r\nimport { getCookie, writeCookie } from \"../utils/cookie\";\r\nimport {expressQuerySelector, expressQuerySelectorAll, isElementVisible} from \"../common/html\";\r\nimport { createCollapsable } from \"./collapsable\";\r\nimport { createNewsletterSubscribeAndUnsubscribe } from \"./newsletter\";\r\nimport { createMainNavigation } from \"./main-navigation\";\r\nimport { getInlineSvgsAsync } from \"../utils/icons\";\r\nimport { createCountrySelection } from \"./country-selection\";\r\nimport { createPopup } from \"./popup-new\";\r\nimport {\r\n\tcanNotContainOnlyNumerics,\r\n\tisValidEmailAddress,\r\n\tisValidOrderNumber,\r\n\tisValidTextWithoutAngleBrackets,\r\n\tisValidWithoutNonAlphaNumericCharsAtEnd\r\n} from \"../utils/validation\";\r\nimport { checkPersonalNumber } from \"../utils/personalNumbers\";\r\nimport { createScrollToTop } from \"./scroll-to-top\";\r\nimport { initLeaveIntent } from \"./leave-intent\";\r\nimport { createPopupLauncher } from \"./popup-launcher\";\r\nimport { createComponentLoader } from \"./component-loader\";\r\nimport { isValidVatNumber } from \"../utils/vat\";\r\nimport { getDate } from \"../utils/date\";\r\nimport {createAbandonedVisitTitleSwapper} from \"./abandoned-visit-title-swapper\";\r\nimport {isMobileDevice, isTouchDevice} from \"../common/device\";\r\n\r\nexport interface IGeneralPageComponents {\r\n\treadonly disableLeaveIntent: () => void;\r\n\treadonly enableLeaveIntent: () => void;\r\n}\r\n\r\nexport function createGeneralPageEventsAndComponents() {\r\n\t// Load GTMIframe\r\n\tconst gtmIFrame = expressQuerySelector(document, '.technical-loadGTMiframe', false);\r\n\tif (gtmIFrame)\r\n\t\tgtmIFrame.src = gtmIFrame.dataset.src;\r\n\r\n\tconst leaveIntent = initLeaveIntent();\r\n\r\n\t// Load dataLayerIframe\r\n\tconst dataLayerIframe = document.querySelector('#dataLayerIframe');\r\n\tif (!dataLayerIframe.getAttribute('data-cookieconsent')) {\r\n\t\tdataLayerIframe.setAttribute('data', dataLayerIframe.getAttribute('data-src'));\r\n\t}\r\n\twindow.addEventListener(\"CookiebotOnAccept\", function () {\r\n\t\tif (window.Cookiebot.consent.marketing) {\r\n\t\t\tconst dataLayerIframe = document.querySelector('#dataLayerIframe');\r\n\t\t\tdataLayerIframe.setAttribute('data', dataLayerIframe.getAttribute('data-src'));\r\n\r\n\t\t\tif ((typeof window.enableLeaveIntentConfigValue === \"undefined\" || window.enableLeaveIntentConfigValue)) {\r\n\t\t\t\tleaveIntent.EnableLeaveIntent();\r\n\t\t\t\tleaveIntent.EnableLeaveIntentPopup();\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t// Set global props for the form validation (if we have forms)\r\n\tconst forms = expressQuerySelectorAll(document, 'form');\r\n\tif (Pristine && forms && forms.length > 0) {\r\n\t\tconst isOptional = (el: HTMLInputElement) => {\r\n\t\t\treturn !el.hasAttribute('required') && !el.value;\r\n\t\t};\r\n\r\n\t\tPristine.addMessages((window as any).context.language, (window as any).validationMessages);\r\n\t\tPristine.setLocale((window as any).context.language);\r\n\t\tPristine.addValidator(\"min\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (this as HTMLInputElement).type === \"date\" || parseFloat(val) >= parseFloat(limit);\r\n\t\t}, window.validationMessages['min'], 1, true);\r\n\t\tPristine.addValidator(\"ordernumber\", function (val) {\r\n\t\t\treturn isValidOrderNumber(val);\r\n\t\t}, window.validationMessages['ordernumber'], 1, true);\r\n\t\tPristine.addValidator(\"max\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (this as HTMLInputElement).type === \"date\" || parseFloat(val) <= parseFloat(limit);\r\n\t\t}, window.validationMessages['max'], 1, true);\r\n\t\tPristine.addValidator(\"mindate\", function (val, limitValue) {\r\n\t\t\tconst date = new Date(val);\r\n\t\t\tconst limit = getDate(limitValue.replaceAll('/', '-').replaceAll('.', '-'));\r\n\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (date && limit && date >= limit);\r\n\t\t}, window.validationMessages['min'], 1, true);\r\n\t\tPristine.addValidator(\"maxdate\", function (val, limitValue) {\r\n\t\t\tconst date = new Date(val);\r\n\t\t\tconst limit = getDate(limitValue.replaceAll('/', '-').replaceAll('.', '-'));\r\n\r\n\t\t\treturn isOptional(this as HTMLInputElement) || (date && limit && date <= limit);\r\n\t\t}, window.validationMessages['max'], 1, true);\r\n\t\tPristine.addValidator(\"maxlength\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || val && val.length <= limit;\r\n\t\t}, window.validationMessages['maxlength'], 1, true);\r\n\t\tPristine.addValidator(\"minlength\", function (val, limit) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || val && val.length >= limit;\r\n\t\t}, window.validationMessages['minlength'], 1, true);\r\n\t\tPristine.addValidator(\"vat\", function (value, vat) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidVatNumber(value, vat);\r\n\t\t}, window.validationMessages['vat'], 1, true);\r\n\t\tPristine.addValidator(\"regex\", function (value, regexp) {\r\n\t\t\t// get the regex yourself form the form input => the regexp of pristine is limited to 1119 chars\r\n\t\t\tconst regex = (this as HTMLElement).getAttribute('regex') || (this as HTMLElement).getAttribute('data-pristine-regex');\r\n\t\t\treturn isOptional(this as HTMLInputElement) || new RegExp(regex).test(value);\r\n\t\t}, window.validationMessages['regex'], 1, true);\r\n\t\tPristine.addValidator(\"phonenumber\", function (value, regexp) {\r\n\t\t\t// get the regex yourself form the form input => the regexp of pristine is limited to 1119 chars\r\n\t\t\tconst regex = (this as HTMLElement).getAttribute('phonenumber') || (this as HTMLElement).getAttribute('data-pristine-phonenumber');\r\n\t\t\treturn isOptional(this as HTMLInputElement) || new RegExp(regex).test(value);\r\n\t\t}, window.validationMessages['phonenumber'], 1, true);\r\n\t\tPristine.addValidator(\"urlsafe\", function (value) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidTextWithoutAngleBrackets(value);\r\n\t\t}, window.validationMessages['urlsafe'], 1, true);\r\n\t\tPristine.addValidator(\"blacklist\", function (value, blacklist) {\r\n\t\t\tif (!blacklist)\r\n\t\t\t\treturn true;\r\n\t\t\tconst list = blacklist.split(',');\r\n\t\t\tfor (let i = 0; i < list.length; i++)\r\n\t\t\t\tif (value.toLowerCase() === list[i])\r\n\t\t\t\t\treturn false;\r\n\r\n\t\t\treturn true;\r\n\t\t}, window.validationMessages['blacklist'], 1, true);\r\n\t\tPristine.addValidator(\"emailrfc822\", function (value) {\r\n\t\t\treturn isValidEmailAddress(value);\r\n\t\t}, null, 98, true); // validation will be fired after required validation a stop if it fails. If we don't do this the normal email validation is also fired and we get two equal error messages\r\n\t\tPristine.addValidator(\"personalnumber\", function (value) {\r\n\t\t\treturn checkPersonalNumber(value, this.dataset.regioncode || \"\");\r\n\t\t}, window.validationMessages['personalnumber'], 1, true);\r\n\t\tPristine.addValidator(\"usehousenumber\", function (value, useHouseNumber) {\r\n\t\t\tif (!useHouseNumber) return true;\r\n\t\t\tconst prefix = this.dataset.prefix || \"\";\r\n\t\t\tconst houseNumberEl = expressQuerySelector(this.form, \"input[name='\" + prefix + \"HouseNumber']\", false);\r\n\t\t\tif (!houseNumberEl || !houseNumberEl.value) return true;\r\n\t\t\tconst atStart = value.trim().substring(0, houseNumberEl.value.trim().length + 1) === houseNumberEl.value.trim() + ' ';\r\n\t\t\tconst atEnd = value.trim().substring(value.trim().length - (houseNumberEl.value.trim().length + 1), value.trim().length) === ' ' + houseNumberEl.value.trim();\r\n\t\t\treturn !atStart && !atEnd;\r\n\t\t}, window.validationMessages['usehousenumber'], 1, true);\r\n\t\tPristine.addValidator(\"passwordcheck\", function (value) {\r\n\t\t\tconst passwordEl = expressQuerySelector(this.form, \"input[name='password']\", false);\r\n\t\t\tif (!passwordEl) return true;\r\n\t\t\treturn value === passwordEl.value;\r\n\t\t}, window.validationMessages['passwordcheck'], 1, true);\r\n\t\tPristine.addValidator(\"strongpassword\",\r\n\t\t\t(value) => {\r\n\t\t\t\tconst passwordEl = expressQuerySelector(document, \"input[data-pristine-strongpassword='true']\", false);\r\n\t\t\t\tif (passwordEl.dataset['lastvalidatedpassword'] == value)\r\n\t\t\t\t\treturn passwordEl.dataset['lastvalidatedresult'] === \"true\";\r\n\t\t\t\telse\r\n\t\t\t\t\treturn true;\r\n\t\t\t}, window.validationMessages['strongpassword'], 0, true),\r\n\t\tPristine.addValidator(\"termsrequired\", function (value) {\r\n\t\t\tconst element = expressQuerySelector(this.form, '[data-pristine-termsrequired]', false);\r\n\t\t\treturn (element && element instanceof HTMLInputElement && element.checked);\r\n\t\t}, window.validationMessages['termsrequired'], 1, true);\r\n\t\tPristine.addValidator(\"invalidchars\", function (value) {\r\n\t\t\treturn isOptional(this as HTMLInputElement) || isValidWithoutNonAlphaNumericCharsAtEnd(value, this as HTMLElement);\r\n\t\t}, window.validationMessages['invalidchars'], 1, true);\r\n\t\tPristine.addValidator(\"notonlynumbers\", function (value) {\r\n\t\t\treturn canNotContainOnlyNumerics(value);\r\n\t\t}, window.validationMessages['notonlynumbers'], 1, true);\r\n\t\tPristine.addValidator(\"npssliderwithcheckbox\", function (value, min, max, sliderId, checkboxId) {\r\n\t\t\tconst sliderEl = expressQuerySelector(this.form, '#'+sliderId, false);\r\n\t\t\tif (isElementVisible(sliderEl)) {\r\n\t\t\t\treturn parseInt(sliderEl.value) >= parseInt(min) && parseInt(sliderEl.value) <= parseInt(max);\r\n\t\t\t} else {\r\n\t\t\t\tconst idk = expressQuerySelector(this.form, '#'+checkboxId, false);\r\n\t\t\t\treturn idk.checked;\r\n\t\t\t}\r\n\t\t}, window.validationMessages['npsslider'], 1, true);\r\n\t}\r\n\r\n\t// Add click event to buttons with a data-url attribute\r\n\tconst buttons = document.querySelectorAll('button[data-url]:not(.technical-disable-dataurl-onclick)');\r\n\tbuttons.forEach(el => {\r\n\t\tel.addEventListener('click', (ev) => {\r\n\t\t\tev.preventDefault();\r\n\t\t\twindow.location.href = el.getAttribute('data-url');\r\n\t\t});\r\n\t});\r\n\r\n\t// Set the isMobileDevice Cookie\r\n\tcheckMobileAndSetCookie();\r\n\r\n\t// Initialize the header\r\n\tconst openLeadTimesPopupAsync = () => {\r\n\t\tconst initCollapsingPanels = (popup: HTMLElement) => {\r\n\t\t\tconst collapsibleEls = expressQuerySelectorAll(popup, '.m-collapsable');\r\n\t\t\tcollapsibleEls.forEach(el => {\r\n\t\t\t\tcreateCollapsable(el, {\r\n\t\t\t\t\tscrollIntoViewAfterOpen: false,\r\n\t\t\t\t\ttitleElSelector: '.m-collapsable__title'\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\t\treturn createPopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"LeadTimesDialog\",\r\n\t\t\t\tdialogId: \"lead-times-dialog\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tonBeforeOpen: (popup) => initCollapsingPanels(popup)\r\n\t\t\t}\r\n\t\t)\r\n\t\t\t.then(popup => {\r\n\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\treturn popup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\r\n\tconst header = expressQuerySelector(document, \".technical-header\", false);\r\n\theader && createMainNavigation(\r\n\t\theader,\r\n\t\t{\r\n\t\t\tgetInlineSvgsAsync: getInlineSvgsAsync,\r\n\t\t\topenLeadTimesPopupAsync: openLeadTimesPopupAsync\r\n\t\t}\r\n\t);\r\n\r\n\twindow.addEventListener('error', logErrorEvent);\r\n\r\n\t// Init the country selection popup\r\n\tconst bodyEl = expressQuerySelector(document, \"body\", true);\r\n\tconst showCountrySelectionPopup = bodyEl.dataset.showcountryselection === \"true\" || false;\r\n\tconst closeCountrySelectionPopup = () => {\r\n\t\twriteCookie(\"ShowCountrySelectionPopupAgainFrom\", new Date().toISOString().slice(0, 10), 365);\r\n\t};\r\n\r\n\tconst openCountrySelectionPopup = () => {\r\n\t\treturn createPopup(\r\n\t\t\t{\r\n\t\t\t\tview: \"CountrySelectionDialog\",\r\n\t\t\t\tdialogId: \"country-selection\",\r\n\t\t\t\tforceRefresh: true,\r\n\t\t\t\tfromCache: false,\r\n\t\t\t\tonClose: closeCountrySelectionPopup,\r\n\t\t\t\tdata: { path: window.location.pathname }\r\n\t\t\t}\r\n\t\t)\r\n\t\t\t.then(popup => {\r\n\t\t\t\tif (!popup.popup) return;\r\n\t\t\t\treturn popup.openAsync();\r\n\t\t\t});\r\n\t};\r\n\r\n\tif (showCountrySelectionPopup) {\r\n\t\tcreateCountrySelection({\r\n\t\t\tshowCountrySelectionPopup: () => openCountrySelectionPopup(),\r\n\t\t\tclose: () => closeCountrySelectionPopup(),\r\n\t\t});\r\n\t}\r\n\r\n\t// Create scroll to top\r\n\tcreateScrollToTop();\r\n\r\n\t// create popup launchers (links from cms with a content dialog parser)\r\n\tconst popupLauncherEls = expressQuerySelectorAll(document, '.technical-popup-launcher');\r\n\tpopupLauncherEls.forEach(el => createPopupLauncher(el));\r\n\r\n\t// init the component loader if needed\r\n\tconst htmlElement = expressQuerySelector(document, 'html', true);\r\n\tconst isBot = htmlElement.dataset.isbot.toLowerCase() === 'true' || false;\r\n\tif (!isBot) createComponentLoader();\r\n\r\n\tcreateNewsletterSubscribeAndUnsubscribe();\r\n\r\n\t// Create global var for methods of dynamic components\r\n\twindow['initFooterComponent'] = function initFooterComponent() {\r\n\t\tconst footerCollapsibles = expressQuerySelectorAll(document, '.technical-footer-collapsable');\r\n\t\tfooterCollapsibles.forEach(el => createCollapsable(el, {\r\n\t\t\ttitleElSelector: '.technical-footer-collapsable-title',\r\n\t\t\tscrollIntoViewAfterOpen: false\r\n\t\t}));\r\n\r\n\t\tconst footerEl = expressQuerySelector(document, '.technical-footer', false);\r\n\t\tif (footerEl) createNewsletterSubscribeAndUnsubscribe(footerEl);\r\n\t};\r\n\r\n\t!isMobileDevice() && createAbandonedVisitTitleSwapper();\r\n\r\n\treturn {\r\n\t\tdisableLeaveIntent: leaveIntent.DisableLeaveIntent,\r\n\t\tenableLeaveIntent: leaveIntent.EnableLeaveIntent,\r\n\t} as IGeneralPageComponents;\r\n}\r\n\r\nconst checkMobileAndSetCookie = () => {\r\n\tif (isTouchDevice() && (window.innerWidth < 500 || window.innerHeight < 500)) {\r\n\t\tif (getCookie(\"IsMobileDevice\") !== \"true\")\r\n\t\t\twriteCookie(\"IsMobileDevice\", \"true\", 365);\r\n\t} else {\r\n\t\tif (getCookie(\"IsMobileDevice\") !== \"false\")\r\n\t\t\twriteCookie(\"IsMobileDevice\", \"false\", 365);\r\n\t}\r\n};\r\n","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 {\r\n\tdebounce,\r\n\tthrottle\r\n} from \"../utils/debounce\";\r\nimport {\r\n\texpressAddClass,\r\n\texpressEventListener,\r\n\texpressQuerySelector,\r\n\texpressQuerySelectorAll,\r\n\texpressRemoveClass,\r\n\tgetHeightWithMargins,\r\n} from \"../common/html\";\r\nimport { Guid } from \"../utils/guid\";\r\nimport { trackSliderEvent } from \"../common/events\";\r\nimport {\r\n\tcompositeDisposable,\r\n\tIDisposable\r\n} from \"../utils/disposable\";\r\n\r\n\r\nexport interface ICustomPhotoSliderItem {\r\n\tid?: string;\r\n\ttemplate?: HTMLElement;\r\n}\r\n\r\nexport interface IButtonElement {\r\n\ttext?: string;\r\n\tcss?: string;\r\n\tcssWhenOnMax?: string;\r\n\tonClick(e: Event, draggedSliderEventTracking: boolean): void;\r\n}\r\n\r\nexport interface ISliderElementSettings {\r\n\textraSliderClass?: string;\r\n\tslideClicked?(e: Event, settings: ICustomPhotoSliderWithDivSettings): void;\r\n}\r\n\r\nexport interface ISliderElementContainerSettings {\r\n\textraSliderClass?: string;\r\n\telementsContainerSettings: ISliderElementSettings;\r\n\tcssWhenButtonsBothOnMax?: string;\r\n\tnextButton?: IButtonElement;\r\n\tpreviousButton?: IButtonElement;\r\n}\r\nexport enum EternalSlidingMode {\r\n\tInfinite,\r\n\tScrollToBegin\r\n}\r\n\r\nexport interface ICustomPhotoSliderWithDivSettings {\r\n\tenableKeyboardNavigation?: boolean;\r\n\tsliderElements: ICustomPhotoSliderItem[];\r\n\tsliderContainerSettings: ISliderElementContainerSettings;\r\n\tshowHalfSlides?: boolean;\r\n\treplaceWithElement?: boolean;\r\n\t// false if the slider should not continue when at end\r\n\tenableEternalSliding?: boolean;\r\n\t// Mode that is used once the enableEternalSliding param is enabled => by default Infinite if nothing is passed\r\n\teternalSlidingMode?: EternalSlidingMode;\r\n\ttranslateForMovement?: boolean;\r\n\tresize1SlideToFullWidth?: boolean;\r\n\t// don't wait on IntersectionObserver to render the slider\r\n\tforceRenderSlider?: boolean;\r\n\r\n\t// custom events\r\n\tSliderCreated?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider: HTMLElement | undefined) => void;\r\n\tInitializedEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tResizeEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tBeforeResizeEvent?: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement) => void;\r\n\tHeightScriptButtons?: (slider: HTMLElement, bottomTitleHeight: number, highestSlideEl: HTMLElement) => void;\r\n}\r\n\r\nexport interface ICustomSlider {\r\n\tRemoveSliderElement(sliderElement: ICustomPhotoSliderItem, indexToRemove?: number): void;\r\n\tRemoveSliderElementOnIndex(indexToRemove: number): void;\r\n\tAddSliderElement(sliderElement: ICustomPhotoSliderItem, indexToInsert: number): void;\r\n\tPrevious(): void;\r\n\tNext(): void;\r\n\tJumpIntoView(sliderElement: ICustomPhotoSliderItem, smoothSlide?: boolean, align?: string): void;\r\n\tSettings: ICustomPhotoSliderWithDivSettings;\r\n\tGetCurrentSlide(): ICustomPhotoSliderItem | undefined;\r\n\tGetAllSlides(): ICustomPhotoSliderItem[];\r\n\tGetSliderElement(): HTMLElement;\r\n\tShowButtons(): void;\r\n\tHideButtons(): void;\r\n\tDispose(): void;\r\n\tAddHandlers(): void;\r\n}\r\n\r\n\r\n// Gets the highest slide element in the slider elements\r\nconst getHighestSlideOfSlider = (slidesInSlider: HTMLElement[]): HTMLElement => {\r\n\tlet highestSlideEl: HTMLElement;\r\n\tlet maxTitleHeight = 0;\r\n\r\n\tfor (let i = slidesInSlider.length - 1; i >= 0; i--) {\r\n\t\tconst slideEl = slidesInSlider[i] as HTMLElement;\r\n\t\tconst sliderTitleEl = expressQuerySelector(slideEl, '.technical-slide-title', false);\r\n\t\tconst tileTitle = expressQuerySelector(slideEl, '.technical-tile-title', false);\r\n\t\tconst tileSubTitle = expressQuerySelector(slideEl, '.technical-tile-subtitle', false);\r\n\r\n\t\tconst titleHeight = tileTitle ? getHeightWithMargins(tileTitle) : 0;\r\n\t\tconst subTitleHeight = tileSubTitle ? getHeightWithMargins(tileSubTitle) : 0;\r\n\t\tconst titleheight = titleHeight + subTitleHeight;\r\n\r\n\t\t// reset height\r\n\t\tif (sliderTitleEl)\r\n\t\t\tsliderTitleEl.style.height = '';\r\n\r\n\t\tif (maxTitleHeight <= titleheight) {\r\n\t\t\tmaxTitleHeight = titleheight;\r\n\t\t\thighestSlideEl = slideEl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn highestSlideEl!;\r\n};\r\n\r\n// Gets the slide element with the highest link in the slider elements\r\nconst getHighestSlideLinkElOfSlider = (slidesInSlider: HTMLElement[]): HTMLElement => {\r\n\tlet highestSlideEl: HTMLElement;\r\n\tlet maxLinkHeight = 0;\r\n\r\n\tfor (let i = slidesInSlider.length - 1; i >= 0; i--) {\r\n\t\tconst slideEl = slidesInSlider[i] as HTMLElement;\r\n\t\tconst sliderLinkEl = expressQuerySelector(slideEl, '.technical-tile-link-text', false) || expressQuerySelector(slideEl, '.technical-info-content-items', false);\r\n\r\n\t\tconst linkHeight = sliderLinkEl ? getHeightWithMargins(sliderLinkEl) : 0;\r\n\r\n\t\tif (maxLinkHeight <= linkHeight) {\r\n\t\t\tmaxLinkHeight = linkHeight;\r\n\t\t\thighestSlideEl = slideEl;\r\n\t\t}\r\n\t}\r\n\r\n\treturn highestSlideEl!;\r\n};\r\n\r\nexport const SetHeight = (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider?: HTMLElement) => {\r\n\tconst visibleSlides = expressQuerySelectorAll(slider, '.technical-slide') as HTMLElement[];\r\n\tconst highestSlideEl = getHighestSlideOfSlider(visibleSlides);\r\n\tconst highestSlideTitle = expressQuerySelector(highestSlideEl, '.technical-tile-title', false);\r\n\tconst highestSlideSubTitle = expressQuerySelector(highestSlideEl, '.technical-tile-subtitle', false);\r\n\r\n\tconst highestSlideLinkEl = getHighestSlideLinkElOfSlider(visibleSlides);\r\n\tconst highestSlideLinkText = expressQuerySelector(highestSlideLinkEl, '.technical-tile-link-text', false) || expressQuerySelector(highestSlideLinkEl, '.technical-info-content-items', false);\r\n\r\n\tconst highestSlideTitlepx = highestSlideTitle ? getHeightWithMargins(highestSlideTitle) : 0;\r\n\tconst highestSlideSubTitlepx = highestSlideSubTitle ? getHeightWithMargins(highestSlideSubTitle) : 0;\r\n\tconst highestSlideLinkTextpx = highestSlideLinkText ? getHeightWithMargins(highestSlideLinkText) : 0;\r\n\tconst highestSlideFullTitlepx = highestSlideTitlepx + highestSlideSubTitlepx;\r\n\r\n\tif (highestSlideFullTitlepx > 0) {\r\n\t\tfor (let i = 0, l = visibleSlides.length; i < l; i++) {\r\n\t\t\tconst slideFullTitleEl = expressQuerySelector(visibleSlides[i] as HTMLElement, '.technical-slide-title', false);\r\n\r\n\t\t\tif (slideFullTitleEl && highestSlideFullTitlepx > 0)\r\n\t\t\t\tslideFullTitleEl.style.height = `${highestSlideFullTitlepx}px`;\r\n\t\t}\r\n\t}\r\n\r\n\tsettings.HeightScriptButtons(slider, highestSlideLinkTextpx, highestSlideEl);\r\n};\r\n\r\nconst CustomPhotoSliderWithDivSettingsDefaults: ICustomPhotoSliderWithDivSettings = {\r\n\tsliderElements: [],\r\n\tsliderContainerSettings: {\r\n\t\telementsContainerSettings: {\r\n\t\t\textraSliderClass: '',\r\n\t\t\tslideClicked: () => { return; }\r\n\t\t},\r\n\t\tcssWhenButtonsBothOnMax: 'u-hide',\r\n\t\tnextButton: {\r\n\t\t\tcss: 'a-button a-button--slider-button m-product-slider__button--next icon-arrow-right technical-slider-button',\r\n\t\t\tcssWhenOnMax: 'a-button--disabled',\r\n\t\t\tonClick: (_: Event, draggedSlider: boolean) => {\r\n\t\t\t\ttrackSliderEvent(`nextbutton_${draggedSlider ? 'dragged' : 'clicked'}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t\tpreviousButton: {\r\n\t\t\tcss: 'a-button a-button--slider-button m-product-slider__button--prev icon-arrow-left technical-slider-button',\r\n\t\t\tcssWhenOnMax: 'a-button--disabled',\r\n\t\t\tonClick: (_: Event, draggedSlider: boolean) => {\r\n\t\t\t\ttrackSliderEvent(`prevbutton_${draggedSlider ? 'dragged' : 'clicked'}`);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t},\r\n\t},\r\n\tshowHalfSlides: false,\r\n\treplaceWithElement: true,\r\n\tenableEternalSliding: true,\r\n\teternalSlidingMode: EternalSlidingMode.Infinite,\r\n\ttranslateForMovement: true,\r\n\tforceRenderSlider: true, // selecting a format image on mobile then go to desktop => format image not there when false\r\n\r\n\r\n\t// height script buttons\r\n\tSliderCreated: (settings, slider, oldSlider) => {\r\n\t\tsetTimeout(() => {\r\n\t\t\tSetHeight(settings, slider, oldSlider);\r\n\t\t}, 0);\r\n\t},\r\n\tResizeEvent: (settings, slider) => {\r\n\t\tSetHeight(settings, slider);\r\n\t},\r\n\r\n\tHeightScriptButtons: (slider: HTMLElement, bottomTitleHeight: number, highestSlideEl: HTMLElement) => {\r\n\t\tconst sliderButtons = expressQuerySelectorAll(slider, '.technical-slider-button');\r\n\t\tconst hightestImage = expressQuerySelector(highestSlideEl, '.technical-slide-imageContainer', false);\r\n\t\tlet buttonCenterImage = 0;\r\n\t\tif (hightestImage) {\r\n\t\t\tconst btnHeight = sliderButtons[0].offsetHeight;\r\n\t\t\tbuttonCenterImage = (hightestImage.offsetHeight / 2) + bottomTitleHeight - (btnHeight / 2);\r\n\t\t}\r\n\r\n\t\tfor (let i = 0, l = sliderButtons.length; i < l; i++) {\r\n\t\t\t(sliderButtons[i] as HTMLElement).style.bottom = `${buttonCenterImage > 0 ? buttonCenterImage : (highestSlideEl.offsetHeight / 2)}px`;\r\n\t\t}\r\n\t},\r\n};\r\n\r\n\r\n\r\nexport function createCustomSlider(element: HTMLElement, settings: ICustomPhotoSliderWithDivSettings): ICustomSlider {\r\n\r\n\tsettings = {\r\n\t\t...CustomPhotoSliderWithDivSettingsDefaults, ...settings,\r\n\t\tsliderContainerSettings: {\r\n\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings, ...settings.sliderContainerSettings,\r\n\t\t\telementsContainerSettings: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.elementsContainerSettings, ...settings.sliderContainerSettings.elementsContainerSettings,\r\n\t\t\t},\r\n\t\t\tnextButton: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.nextButton, ...settings.sliderContainerSettings.nextButton,\r\n\t\t\t},\r\n\t\t\tpreviousButton: {\r\n\t\t\t\t...CustomPhotoSliderWithDivSettingsDefaults.sliderContainerSettings.previousButton, ...settings.sliderContainerSettings.previousButton,\r\n\t\t\t},\r\n\t\t},\r\n\t};\r\n\r\n\t// prop to move div from left to right\r\n\tlet sliderPxX = 0;\r\n\tlet widthBeforeResize = 0;\r\n\t// slider elements\r\n\tlet sliderEl: HTMLElement;\r\n\tlet elementsEl: HTMLElement;\r\n\tlet firstVisibleElement: HTMLElement | undefined;\r\n\tlet prevButton: HTMLElement;\r\n\tlet nextButton: HTMLElement;\r\n\t// properties for sliding\r\n\tlet mouseDownOnSlider = false;\r\n\tlet startSliderDragX = 0;\r\n\tlet currentSliderDragX = 0;\r\n\tlet isDragged = false;\r\n\tlet disableSliderDragging = false;\r\n\tlet preventPageScrolling = false;\r\n\tlet preventSliderDragging = false;\r\n\tlet prevSliderWidth = 0;\r\n\tlet disposableEvents: IDisposable;\r\n\tlet disposableDragTouchEvents: IDisposable;\r\n\tlet disposableDragMouseEvents: IDisposable;\r\n\r\n\t// private methods\r\n\tconst init = function (element: HTMLElement, replaceWithElement: boolean) {\r\n\t\tdisposableEvents = compositeDisposable([]);\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\r\n\t\tif (ioSlider && !settings.forceRenderSlider) {\r\n\t\t\tioSlider.observe(element);\r\n\t\t} else {\r\n\t\t\t// create slider template\r\n\t\t\tsliderEl = getSliderTemplate();\r\n\r\n\t\t\t// append slider to HTML\r\n\t\t\tif (replaceWithElement && element.parentElement)\r\n\t\t\t\telement.parentElement.replaceChild(sliderEl, element);\r\n\t\t\telse\r\n\t\t\t\telement.appendChild(sliderEl);\r\n\r\n\t\t\t// trigger initialized event\r\n\t\t\tif (settings.InitializedEvent) settings.InitializedEvent(settings, sliderEl);\r\n\r\n\t\t\t// to check if the buttons should be disabled or not\r\n\t\t\tcheckEdgesAndMove(0);\r\n\t\t\taddDefaultEventListeners();\r\n\t\t\tresizeObserver.observe(elementsEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tdisposableEvents.dispose();\r\n\t\tdisposableEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragTouchEvents.dispose();\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragMouseEvents.dispose();\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\t};\r\n\r\n\tconst addDefaultEventListeners = () => {\r\n\t\t// add touch listeners when touch\r\n\t\tif (isTouchDevice()) {\r\n\t\t\tif (sliderEl) {\r\n\t\t\t\tdisposableEvents.add(expressEventListener(sliderEl, 'touchstart', dragStart));\r\n\t\t\t}\r\n\t\t}\r\n\t\t// keyboard events\r\n\t\telse if (settings.enableKeyboardNavigation) {\r\n\t\t\tdisposableEvents.add(expressEventListener(document, 'keydown', onKeyDown));\r\n\t\t}\r\n\r\n\t\tif (window) {\r\n\t\t\tdisposableEvents.add(expressEventListener(window, 'scroll', scrollStart));\r\n\t\t}\r\n\r\n\t\t// slider mouse events\r\n\t\tif (sliderEl) {\r\n\t\t\tdisposableEvents.add(expressEventListener(sliderEl, 'mousedown', (e) => {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\tdragStart(e);\r\n\t\t\t}));\r\n\t\t}\r\n\r\n\t\taddPrevNextBtnEventListeners();\r\n\t};\r\n\r\n\tconst addPrevNextBtnEventListeners = () => {\r\n\t\t//button mouse events\r\n\t\tif (prevButton) {\r\n\t\t\tdisposableEvents.add(expressEventListener(prevButton, 'mouseup', (e) => { disableSliderDragging = false; previousEvent(e); }));\r\n\t\t\tdisposableEvents.add(expressEventListener(prevButton, 'mousedown', _ => disableSliderDragging = true));\r\n\t\t}\r\n\t\tif (nextButton) {\r\n\t\t\tdisposableEvents.add(expressEventListener(nextButton, 'mouseup', (e) => { disableSliderDragging = false; nextEvent(e); }));\r\n\t\t\tdisposableEvents.add(expressEventListener(nextButton, 'mousedown', _ => disableSliderDragging = true));\r\n\t\t}\r\n\t};\r\n\r\n\tconst addDragTouchEventListeners = () => {\r\n\t\tif (!sliderEl)\r\n\t\t\treturn;\r\n\r\n\t\t// remove exisiting events to prevent double triggering\r\n\t\tdisposableDragTouchEvents.dispose();\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragTouchEvents.add(expressEventListener(sliderEl, 'touchend', dragStop));\r\n\t\tdisposableDragTouchEvents.add(expressEventListener(sliderEl, 'touchmove', throttle(dragging, 100)));\r\n\t\tdisposableDragTouchEvents.add(expressEventListener(sliderEl, 'touchcancel', dragLeave));\r\n\t};\r\n\r\n\tconst addMouseDragEventListeners = () => {\r\n\t\tif (!sliderEl)\r\n\t\t\treturn;\r\n\r\n\t\t// remove exisiting events to prevent double triggering\r\n\t\tdisposableDragMouseEvents.dispose();\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragMouseEvents.add(expressEventListener(sliderEl, 'mousemove', (e) => {\r\n\t\t\tif (!mouseDownOnSlider) return;\r\n\t\t\te.preventDefault();\r\n\t\t\tdragging(e);\r\n\t\t}));\r\n\t\tdisposableDragMouseEvents.add(expressEventListener(sliderEl, 'mouseleave', dragLeave));\r\n\r\n\t\tdisposableDragMouseEvents.add(expressEventListener(sliderEl, 'mouseup', dragStop));\r\n\t};\r\n\r\n\tconst resizeObserver = new ResizeObserver((entries) => {\r\n\t\tfor (const entry of entries)\r\n\t\t\tif (entry.contentRect && entry.target)\r\n\t\t\t\tresize();\r\n\t});\r\n\r\n\t// #region SliderEvents\r\n\tconst isTouchDevice = () => ('ontouchstart' in window) || (navigator.maxTouchPoints > 0);\r\n\r\n\tconst onKeyDown = (ev: KeyboardEvent) => {\r\n\t\tswitch (ev.code) {\r\n\t\t\tcase \"ArrowLeft\":\r\n\t\t\t\tpreviousEvent(ev);\r\n\t\t\t\treturn;\r\n\t\t\tcase \"ArrowRight\":\r\n\t\t\t\tnextEvent(ev);\r\n\t\t\t\treturn;\r\n\t\t}\r\n\t};\r\n\r\n\tconst resize = () => {\r\n\t\t// Android/IOS triggers resize caused by scrolling (navigation bar goes away) => don't change anything when slider width is the same\r\n\t\tconst sliderWidth = getFullWidthElement(sliderEl);\r\n\t\tif (prevSliderWidth === sliderWidth) return;\r\n\r\n\t\tprevSliderWidth = sliderWidth;\r\n\r\n\t\tdebounce(reset, 250)();\r\n\t};\r\n\tconst preventClick = (e: Event) => {\r\n\t\te.preventDefault();\r\n\t\te.stopImmediatePropagation();\r\n\t};\r\n\tconst scrollStart = () => {\r\n\t\tpreventSliderDragging = true;\r\n\t};\r\n\r\n\t// drag methods\r\n\tconst dragStart = (e: Event) => {\r\n\t\tisDragged = false;\r\n\t\tmouseDownOnSlider = true;\r\n\t\tstartSliderDragX = getPositionX(e);\r\n\t\tcurrentSliderDragX = startSliderDragX;\r\n\t\tpreventPageScrolling = false;\r\n\t\tpreventSliderDragging = disableSliderDragging || nextButton.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax) && prevButton.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\r\n\t\tisTouchDevice() ? addDragTouchEventListeners() : addMouseDragEventListeners();\r\n\t};\r\n\tconst dragLeave = (e: Event) => {\r\n\t\tif (!mouseDownOnSlider) return;\r\n\t\tmouseDownOnSlider = false;\r\n\t\telementsEl.parentElement.style.scrollBehavior = \"smooth\";\r\n\r\n\t\t// Move the next/previous slider fully into view\r\n\t\tif (startSliderDragX < currentSliderDragX)\r\n\t\t\tpreviousEvent(e, false, true);\r\n\t\telse if (startSliderDragX > currentSliderDragX)\r\n\t\t\tnextEvent(e, false, true);\r\n\t};\r\n\tconst dragging = (e: Event) => {\r\n\t\tif (!mouseDownOnSlider || preventSliderDragging) return;\r\n\r\n\t\telementsEl.parentElement.style.scrollBehavior = 'auto';\r\n\r\n\t\tconst posX = getPositionX(e);\r\n\t\tsliderPxX += Math.round(posX - currentSliderDragX);\r\n\r\n\t\t// Stop page scrolling if your finger moves more than 10 pixels left or right\r\n\t\tconst movedSinceStart = posX - startSliderDragX;\r\n\t\tisDragged = Math.abs(movedSinceStart) > 10;\r\n\t\tif (Math.abs(movedSinceStart) > 10)\r\n\t\t\tpreventPageScrolling = true;\r\n\r\n\t\tif (preventPageScrolling)\r\n\t\t\te.preventDefault();\r\n\r\n\t\tif (settings.enableEternalSliding\r\n\t\t\t&& (settings.eternalSlidingMode || EternalSlidingMode.Infinite) === EternalSlidingMode.Infinite)\r\n\t\t\tdebounce(_ => {\r\n\t\t\t\tif (currentSliderDragX === posX || !mouseDownOnSlider) return; // mouseDownOnSlider == false => already moved by dragStop/dragLeave\r\n\r\n\t\t\t\tconst element = getFirstVisibleElement();\r\n\t\t\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\t\t\t\tconst visibleElements = Math.ceil(getFullWidthElement(sliderEl) / elementWidth);\r\n\t\t\t\tconst sliderxPassedTiles = -sliderPxX / elementWidth;\r\n\r\n\t\t\t\tconst direction = currentSliderDragX > posX ? 'left' : 'right';\r\n\r\n\t\t\t\tif (direction === 'right' && (sliderxPassedTiles + visibleElements >= settings.sliderElements.length)) {\r\n\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]); // add to right\r\n\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\tmoveSlider(true); // should not move slider\r\n\r\n\t\t\t\t} else if (direction === 'left' && (sliderxPassedTiles < 0.2)) {\r\n\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]); // add to left\r\n\t\t\t\t\tsliderPxX += -elementWidth;\r\n\t\t\t\t\tmoveSlider(true); // should not move slider\r\n\t\t\t\t}\r\n\t\t\t}, 250)();\r\n\r\n\t\t// set new location here\r\n\t\tcurrentSliderDragX = posX;\r\n\r\n\t\t// move without check => check when stopped\r\n\t\tmoveSlider(true);\r\n\t};\r\n\tconst dragStop = (e: Event) => {\r\n\t\tmouseDownOnSlider = false;\r\n\t\telementsEl.parentElement.style.scrollBehavior = \"smooth\";\r\n\r\n\t\t// enable/disable click event on slider-element when dragging\r\n\t\tif (!isDragged && e.target && !(e.target as HTMLElement).classList.contains('technical-slider-button'))\r\n\t\t\tsettings.sliderContainerSettings.elementsContainerSettings.slideClicked(e, settings);\r\n\r\n\t\tconst slideElements = expressQuerySelectorAll(elementsEl, '.technical-slider-element');\r\n\t\tconst elMethod = isDragged ? 'addEventListener' : 'removeEventListener';\r\n\t\tslideElements.forEach(el => el[elMethod]('click', preventClick));\r\n\r\n\t\t// Move the next/previous slider fully into view\r\n\t\tif (startSliderDragX < currentSliderDragX)\r\n\t\t\tpreviousEvent(e, false, true);\r\n\t\telse if (startSliderDragX > currentSliderDragX)\r\n\t\t\tnextEvent(e, false, true);\r\n\r\n\t\t// remove events\r\n\t\tdisposableDragTouchEvents.dispose();\r\n\t\tdisposableDragTouchEvents = compositeDisposable([]);\r\n\r\n\t\tdisposableDragMouseEvents.dispose();\r\n\t\tdisposableDragMouseEvents = compositeDisposable([]);\r\n\r\n\t\tisDragged = false;\r\n\t};\r\n\tconst getPositionX = (e: Event): number => {\r\n\t\tif (!e || !e.type) return 0;\r\n\t\tif (e.type.includes('mouse')) {\r\n\t\t\tconst mouseEvent = e as MouseEvent;\r\n\t\t\treturn mouseEvent.pageX;\r\n\t\t}\r\n\t\tif (e.type.includes('touch')) {\r\n\t\t\tconst touchEvent = e as TouchEvent;\r\n\t\t\treturn touchEvent.touches[0].pageX;\r\n\t\t}\r\n\t\treturn 0;\r\n\t};\r\n\t// #endregion SliderEvents\r\n\tconst getSliderTemplate = (): HTMLElement => {\r\n\t\tif (settings.sliderElements.length === 0) return document.createElement('span');\r\n\r\n\t\t// generate div to hold slider\r\n\t\tconst div = document.createElement('div');\r\n\t\tdiv.className += settings.sliderContainerSettings.extraSliderClass;\r\n\r\n\t\t// prev\r\n\t\tprevButton = document.createElement('a');\r\n\t\tprevButton.textContent = settings.sliderContainerSettings.previousButton.text ? settings.sliderContainerSettings.previousButton.text : '';\r\n\t\tprevButton.title = \"previous\";\r\n\r\n\t\t// prev.style\r\n\t\tprevButton.className += settings.sliderContainerSettings.previousButton.css;\r\n\t\tprevButton.classList.add(settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\t\tdiv.appendChild(prevButton);\r\n\r\n\t\t// images\r\n\t\telementsEl = document.createElement('div');\r\n\t\telementsEl.className += settings.sliderContainerSettings.elementsContainerSettings.extraSliderClass;\r\n\t\telementsEl.classList.add('technical-slider-elements');\r\n\r\n\t\tfor (let i = 0, l = settings.sliderElements.length; i < l; i++) {\r\n\t\t\tconst customPhotoSliderItem = settings.sliderElements[i];\r\n\t\t\tconst sliderElementDiv = createSliderElement(customPhotoSliderItem);\r\n\t\t\telementsEl.appendChild(sliderElementDiv);\r\n\t\t}\r\n\r\n\t\t// append to elementsDiv\r\n\t\tdiv.appendChild(elementsEl);\r\n\r\n\t\t// next\r\n\t\tnextButton = document.createElement('a');\r\n\t\tnextButton.textContent = settings.sliderContainerSettings.nextButton.text ? settings.sliderContainerSettings.nextButton.text : '';\r\n\t\tprevButton.title = \"next\";\r\n\r\n\t\t// next.style\r\n\t\tnextButton.className += settings.sliderContainerSettings.nextButton.css;\r\n\t\tdiv.appendChild(nextButton);\r\n\r\n\r\n\t\tsettings.SliderCreated && settings.SliderCreated(settings, div, sliderEl);\r\n\t\t// return div element\r\n\t\treturn div;\r\n\t};\r\n\tconst getCurrentElement = (): ICustomPhotoSliderItem | undefined => {\r\n\t\tconst elementEl = getFirstVisibleElement();\r\n\t\tif (!elementEl) return; // if no element visible return\r\n\t\tconst elementElWidth = getFullWidthElement(elementEl, true);\r\n\t\tconst currentElementIndex = elementElWidth <= 0 ? 0 : Math.round(Math.abs(sliderPxX) / elementElWidth);\r\n\t\tconst index = currentElementIndex % elementsEl.children.length;\r\n\t\treturn settings.sliderElements.find(x => elementsEl.children[index].id === x.id);\r\n\t};\r\n\tconst getAllElements = (): ICustomPhotoSliderItem[] => {\r\n\t\tconst slides = Array.from(elementsEl.children);\r\n\t\treturn [...settings.sliderElements].sort((a, b) => {\r\n\t\t\tconst elementA = slides.find(e => e.id === a.id);\r\n\t\t\tconst elementB = slides.find(e => e.id === b.id);\r\n\t\t\treturn slides.indexOf(elementA) - slides.indexOf(elementB);\r\n\t\t}); //sort a copy of the list\r\n\t};\r\n\tconst resizeSliderElementsToFullWidth = () => {\r\n\t\tconst element = getFirstVisibleElement();\r\n\t\tif (!element || !element.parentElement || element.clientWidth <= 0)\r\n\t\t\treturn;\r\n\r\n\t\tconst widthAfterResize = getFullWidthElement(element.parentElement!);\r\n\r\n\t\tif (widthBeforeResize === widthAfterResize)\r\n\t\t\treturn;\r\n\r\n\t\tfor (let i = 0; i < elementsEl.children.length; i++) {\r\n\t\t\tconst slide = elementsEl.children[i] as HTMLElement;\r\n\t\t\tslide.style.width = `${widthAfterResize}px`;\r\n\t\t\tslide.style.minWidth = `${widthAfterResize}px`;\r\n\t\t\tslide.style.maxWidth = `${widthAfterResize}px`;\r\n\t\t}\r\n\r\n\t\t// Realign the slider with the first visible element\r\n\t\t// sliderPxX = the amount the slider was moved to the left, usually a multiple of widthBeforeResize\r\n\t\t// We need to realign it, so we divide sliderPxX by the widthBeforeResize, so we know how many slides we need to move it\r\n\t\tif (widthBeforeResize > 0) {\r\n\t\t\tconst amountOfSlides = Math.abs(Math.ceil(sliderPxX / widthBeforeResize));\r\n\t\t\tsliderPxX = sliderPxX - ((widthAfterResize - widthBeforeResize) * amountOfSlides);\r\n\t\t}\r\n\r\n\t\twidthBeforeResize = widthAfterResize;\r\n\t};\r\n\tconst checkEdgesAndMove = (movePx: number, draggedSlider?: boolean, jumpIntoView = false) => {\r\n\t\t// if beginning or end stop\r\n\t\tsliderPxX += movePx;\r\n\t\tlet prevButtonClasslistMethod = 'add';\r\n\t\tlet nextButtonClasslistMethod = 'add';\r\n\t\tconst element = getFirstVisibleElement();\r\n\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\t\tlet moveToOtherside = false;\r\n\r\n\t\t// we calculate the total width of the elements because of the gap property on the slider\r\n\t\t// without gap => every slider the same width => is the same as elementsEl.scrollWidth\r\n\t\t// with gap => we come 1 gap to short at the end to have the same width\r\n\t\tconst endOfSlider = () => getFullWidthElement(sliderEl) - (elementWidth * settings.sliderElements.length);\r\n\t\tconst widthRightSidePx = () => (elementWidth * settings.sliderElements.length) - Math.abs(sliderPxX);\r\n\r\n\t\tif (sliderPxX >= 0) { // test negative scroll\r\n\t\t\tnextButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding) prevButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding && !jumpIntoView && sliderPxX > 0) {\r\n\t\t\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\t\t\tmoveToOtherside = true;\r\n\t\t\t\t\t\tsliderPxX = endOfSlider();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]);\r\n\t\t\t\t\t\tmoveSlider(true, false, -sliderPxX); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\tsliderPxX = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else sliderPxX = 0;\r\n\t\t} else if (widthRightSidePx() <= getFullWidthElement(sliderEl)) { // test positive scroll\r\n\t\t\tprevButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding) nextButtonClasslistMethod = 'remove';\r\n\t\t\tif (settings.enableEternalSliding && !jumpIntoView && widthRightSidePx() < getFullWidthElement(sliderEl)) {\r\n\t\t\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\t\t\tmoveToOtherside = true;\r\n\t\t\t\t\t\tsliderPxX = 0;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tif (elementWidth <= 0) break; // if you element is not visiable don't do anything\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]);\r\n\t\t\t\t\t\t\tmoveSlider(true, false, sliderPxX + Math.abs(movePx) + elementWidth); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\t\t} while (widthRightSidePx() < getFullWidthElement(sliderEl));\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t} else sliderPxX = endOfSlider();\r\n\t\t} else { // the sroll is not over positive or over negative\r\n\t\t\tprevButtonClasslistMethod = 'remove';\r\n\t\t\tnextButtonClasslistMethod = 'remove';\r\n\t\t}\r\n\r\n\t\t// check if images div is greater then px width\r\n\t\tif (getFullWidthElementWithoutRounding(sliderEl) >= (elementsEl.scrollWidth - 20)) { // +20? The right margin of the item on the right can be invisible\r\n\t\t\tnextButtonClasslistMethod = 'add';\r\n\t\t\tprevButtonClasslistMethod = 'add';\r\n\t\t}\r\n\r\n\t\tif (settings.sliderContainerSettings.cssWhenButtonsBothOnMax) {\r\n\t\t\tif (prevButton) prevButton.classList.toggle(settings.sliderContainerSettings.cssWhenButtonsBothOnMax, nextButtonClasslistMethod === 'add' && prevButtonClasslistMethod === 'add');\r\n\t\t\tif (nextButton) nextButton.classList.toggle(settings.sliderContainerSettings.cssWhenButtonsBothOnMax, nextButtonClasslistMethod === 'add' && prevButtonClasslistMethod === 'add');\r\n\t\t}\r\n\r\n\t\t// add or remove class from classlist depending on ifs\r\n\t\tif (prevButton) prevButton.classList[prevButtonClasslistMethod](settings.sliderContainerSettings.previousButton.cssWhenOnMax);\r\n\t\tif (nextButton) nextButton.classList[nextButtonClasslistMethod](settings.sliderContainerSettings.nextButton.cssWhenOnMax);\r\n\r\n\t\tif (prevButton || nextButton)\r\n\t\t\tmoveSlider(draggedSlider, moveToOtherside);\r\n\t};\r\n\tconst moveSlider = (draggedSlider?: boolean, moveToOtherside = false, sliderPxXOverride?: number) => {\r\n\t\tconst ms = moveToOtherside ? elementsEl.children.length * 250 : 200;\r\n\t\telementsEl.style.transition = draggedSlider ? 'none' : `all ${ms}ms ease-in-out 0s`;\r\n\r\n\t\tconst pixelX = sliderPxXOverride || sliderPxXOverride >= 0 ? sliderPxXOverride : sliderPxX;\r\n\t\tif (settings.translateForMovement) {\r\n\t\t\telementsEl.style.transform = `translateX(${pixelX}px)`;\r\n\t\t} else {\r\n\t\t\telementsEl.parentElement && elementsEl.parentElement.scroll({\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: -pixelX,\r\n\t\t\t\t// @ts-ignore https://developer.mozilla.org/en-US/docs/Web/API/Window/scroll => instant is a behavior that is supported\r\n\t\t\t\tbehavior: draggedSlider ? 'instant' : 'smooth'\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\tconst createSliderElement = (customPhotoSliderItem: ICustomPhotoSliderItem): HTMLElement => {\r\n\t\tif (!customPhotoSliderItem.id)\r\n\t\t\tcustomPhotoSliderItem.id = Guid.newSliderGuid();\r\n\r\n\t\t// elements\r\n\t\tconst sliderElement = customPhotoSliderItem.template ? customPhotoSliderItem.template.cloneNode(true) as HTMLElement : document.createElement('div');\r\n\t\tsliderElement.id = customPhotoSliderItem.id;\r\n\t\tsliderElement.classList.add('technical-slider-element');\r\n\r\n\t\t//return div\r\n\t\treturn sliderElement;\r\n\t};\r\n\tconst removeImageFromArray = (indexToRemove: number) => {\r\n\t\tif (!settings.sliderElements || indexToRemove > settings.sliderElements.length - 1 || indexToRemove < 0 || !settings.sliderElements[indexToRemove])\r\n\t\t\tthrow Error('Something is wrong with your current parameters');\r\n\t\telse {\r\n\t\t\tlet tempArray = settings.sliderElements.slice(0, indexToRemove);\r\n\r\n\t\t\t// if last item remove this is faster\r\n\t\t\tif (tempArray.length === settings.sliderElements.length - 1) {\r\n\t\t\t\tsettings.sliderElements = tempArray;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\ttempArray = tempArray.concat(settings.sliderElements.slice(indexToRemove + 1));\r\n\t\t\tsettings.sliderElements = tempArray;\r\n\t\t}\r\n\t};\r\n\tconst insertIntoSliderElements = (sliderElement: ICustomPhotoSliderItem, indexToInsert: number) => {\r\n\t\t// if images.length => just push\r\n\t\tif (indexToInsert === settings.sliderElements.length) {\r\n\t\t\tsettings.sliderElements.push(sliderElement);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// if 0 add to new array copy old array into new array => change array\r\n\t\tif (indexToInsert === 0) {\r\n\t\t\tconst tempArray: ICustomPhotoSliderItem[] = [sliderElement];\r\n\t\t\tsettings.sliderElements = tempArray.concat(settings.sliderElements);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// insert in between\r\n\t\tlet tempArray = settings.sliderElements.slice(0, indexToInsert);\r\n\t\ttempArray.push(sliderElement);\r\n\t\ttempArray = tempArray.concat(settings.sliderElements.slice(indexToInsert));\r\n\r\n\t\tsettings.sliderElements = tempArray;\r\n\t};\r\n\tconst calculateNextMove = function (positiveMove: boolean): number {\r\n\t\tconst elementEl = getFirstVisibleElement();\r\n\r\n\t\t// if no slider just skip\r\n\t\tif (settings.sliderElements.length <= 1 || !elementEl)\r\n\t\t\treturn 0;\r\n\r\n\t\t// !!! WARNING !!! solution for all same width elements !!!\r\n\t\tconst elementElWidth = getFullWidthElement(elementEl, true);\r\n\r\n\t\tif (Math.ceil(getFullWidthElement(elementsEl)) / elementElWidth < 1)\r\n\t\t\treturn elementElWidth * (positiveMove ? -0.5 : 0.5); // default 0.50 % of slide move\r\n\r\n\t\t// calculate sliderElement.width / width elements => get % of visible slide on each side\r\n\t\tconst pxRight = (elementElWidth * settings.sliderElements.length) - (Math.ceil(getFullWidthElement(sliderEl)) + Math.abs(sliderPxX));\r\n\t\tconst maxPossibleSliderItemsRightPx = pxRight / elementElWidth;\r\n\t\tconst maxPossibleSliderItemsLeftpx = Math.abs(sliderPxX) / elementElWidth;\r\n\r\n\t\tlet percentage = positiveMove\r\n\t\t\t? (settings.eternalSlidingMode || EternalSlidingMode.Infinite) == EternalSlidingMode.Infinite ? (maxPossibleSliderItemsLeftpx - Math.floor(maxPossibleSliderItemsLeftpx)) - 1 : - (maxPossibleSliderItemsRightPx - Math.floor(maxPossibleSliderItemsRightPx))\r\n\t\t\t: maxPossibleSliderItemsLeftpx - Math.floor(maxPossibleSliderItemsLeftpx);\r\n\r\n\t\t// Floating point arithmetic is not always 100% accurate\r\n\t\tconst rounding = 10000000000;\r\n\t\tpercentage = parseInt(`${percentage * rounding}`) / rounding;\r\n\r\n\t\t// for the case that the slide is exactly on the page\r\n\t\t// or slider the slide is already almost fully visitable and you want to go to the next slide\r\n\t\tif (percentage === 0 || Math.abs(percentage) <= 0.08)\r\n\t\t\tpercentage += positiveMove ? -1 : 1;\r\n\r\n\t\t// if half slides have to be shown\r\n\t\tif (settings.showHalfSlides)\r\n\t\t\tpercentage *= 1.5;\r\n\r\n\t\t// calculate how much % the slide needs to be completely shown\r\n\t\treturn elementElWidth * percentage;\r\n\t};\r\n\tconst jumpIntoView = (sliderElement: ICustomPhotoSliderItem, smoothSlideIntoView = true, align: 'start' | 'end' = 'start') => {\r\n\t\tconst elements = getAllElements();\r\n\t\tlet indexOfElement = elements.indexOf(sliderElement);\r\n\t\tif (indexOfElement < 0)\r\n\t\t\treturn;\r\n\r\n\t\tconst visibleEl = getFirstVisibleElement(); // this slide is already visible => no width of 0\r\n\t\tconst element = expressQuerySelector(elementsEl, `#${visibleEl.id}`, true);\r\n\t\tconst elementWidth = getFullWidthElement(element, true);\r\n\r\n\t\tlet moveToLocation: number;\r\n\t\tswitch (settings.eternalSlidingMode) {\r\n\t\t\tcase EternalSlidingMode.ScrollToBegin:\r\n\t\t\t\tmoveToLocation = (elementWidth * indexOfElement) - (align == 'start' ? 0 : (elementWidth * ((getFullWidthElement(sliderEl) / elementWidth) - 1))); // -1 because this is a count, not an index\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tcase EternalSlidingMode.Infinite:\r\n\t\t\tdefault: {\r\n\t\t\t\tconst currentSlide = getCurrentElement();\r\n\t\t\t\tconst currentSlideIndex = elements.indexOf(currentSlide);\r\n\t\t\t\tconst visibleElements = Math.ceil(getFullWidthElement(sliderEl) / elementWidth);\r\n\r\n\t\t\t\tswitch (align) {\r\n\t\t\t\t\tcase 'start':\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (currentSlideIndex > indexOfElement || visibleElements == 1) break;\r\n\t\t\t\t\t\t\tconst elementsToMoveToFront = [...elements].splice(currentSlideIndex + visibleElements);\r\n\r\n\t\t\t\t\t\t\telementsToMoveToFront.forEach((_, i) => {\r\n\t\t\t\t\t\t\t\telementsEl.prepend(elementsEl.children[elementsEl.children.length - 1]);\r\n\t\t\t\t\t\t\t\tsliderPxX -= elementWidth;\r\n\t\t\t\t\t\t\t\tmoveSlider(true, false); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\tcase 'end':\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\tif (currentSlideIndex < indexOfElement) break;\r\n\t\t\t\t\t\t\tconst elementsToMoveToBack = [...elements].splice(currentSlideIndex);\r\n\r\n\t\t\t\t\t\t\telementsToMoveToBack.forEach((_, i) => {\r\n\t\t\t\t\t\t\t\telementsEl.appendChild(elementsEl.children[0]);\r\n\t\t\t\t\t\t\t\tsliderPxX += elementWidth;\r\n\t\t\t\t\t\t\t\tmoveSlider(true, false); // update HTML with current pxX after move => should not move visually\r\n\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tindexOfElement = getAllElements().indexOf(sliderElement); // recalculate index after move\r\n\t\t\t\tmoveToLocation = (elementWidth * indexOfElement) - (align == 'start' ? 0 : (elementWidth * ((getFullWidthElement(sliderEl) / elementWidth) - 1))); // -1 because this is a count, not an index\r\n\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// update item\r\n\t\tconst movePx = moveToLocation > Math.abs(sliderPxX) ? -moveToLocation - sliderPxX : Math.abs(sliderPxX) - moveToLocation;\r\n\t\tcheckEdgesAndMove(movePx, !smoothSlideIntoView, true);\r\n\t};\r\n\tconst getFirstVisibleElement = (): HTMLElement | undefined => {\r\n\t\tif (!elementsEl) return;\r\n\t\tif (firstVisibleElement) return firstVisibleElement;\r\n\t\tfor (let i = 0; i < elementsEl.children.length; i++) {\r\n\t\t\tconst element = elementsEl.children[i];\r\n\t\t\tif (element && element.id) {\r\n\t\t\t\tconst htmlElement = expressQuerySelector(elementsEl, `#${element.id}`, true);\r\n\r\n\t\t\t\tif (getFullWidthElement(htmlElement) > 0 && htmlElement.clientWidth > 0) {\r\n\t\t\t\t\tfirstVisibleElement = htmlElement;\r\n\t\t\t\t\treturn htmlElement;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// return default\r\n\t\treturn undefined;\r\n\t};\r\n\r\n\t// Math.ceil to get a rounded number => Firefox, Edge don't work with decimals\r\n\tconst getFullWidthElement = (element: HTMLElement | undefined, isSliderElement: boolean = false): number => Math.ceil(getFullWidthElementWithoutRounding(element, isSliderElement));\r\n\tconst getFullWidthElementWithoutRounding = (element: HTMLElement | undefined, isSliderElement: boolean = false): number => {\r\n\t\tif (!element) return 0;\r\n\t\tconst style = window.getComputedStyle(element),\r\n\t\t\twidth = style.width ? parseFloat(style.width) : element.clientWidth, // style.width already had the border in the calculation\r\n\t\t\tmargin = parseFloat(style.marginLeft ? style.marginLeft : '0') + parseFloat(style.marginRight ? style.marginRight : '0'),\r\n\t\t\tpadding = parseFloat(style.paddingLeft ? style.paddingLeft : '0') + parseFloat(style.paddingRight ? style.paddingRight : '0');\r\n\r\n\t\treturn width + (margin ? margin : 0) + (padding ? padding : 0) + (isSliderElement ? parseFloat(window.getComputedStyle(elementsEl).gap || '0') || 0 : 0);\r\n\t};\r\n\t// public methods\r\n\tconst removeSliderElement = (sliderElement: ICustomPhotoSliderItem, indexToRemove?: number) => {\r\n\t\t// check params\r\n\t\tif ((!indexToRemove && settings.sliderElements.filter(x => x.id === sliderElement).length < 0) || (indexToRemove && (indexToRemove < 0 || indexToRemove > settings.sliderElements.length - 1)))\r\n\t\t\tthrow Error('Index to remove not found');\r\n\r\n\t\t// remove image\r\n\t\tremoveImageFromArray(indexToRemove ? indexToRemove : settings.sliderElements.indexOf(sliderElement));\r\n\r\n\t\t// reset firstVisibleElement\r\n\t\tfirstVisibleElement = undefined;\r\n\r\n\t\t// Manipulate dom\r\n\t\tif (!sliderElement.id)\r\n\t\t\tthrow Error('invalid image id');\r\n\r\n\t\t// search image el to delete\r\n\t\tconst deleteImageEl = expressQuerySelector(elementsEl, `#${sliderElement.id}`, true);\r\n\t\telementsEl.removeChild(deleteImageEl);\r\n\r\n\t\t// check edges over invalid sliderPxX\r\n\t\tcheckEdgesAndMove(0);\r\n\t};\r\n\tconst removeSliderElementOnIndex = (indexToRemove: number) => {\r\n\t\t// check params\r\n\t\tif ((indexToRemove < 0 || indexToRemove > settings.sliderElements.length - 1)) throw Error('Index to remove not found');\r\n\r\n\t\t// remove image\r\n\t\tconst deletedElement = settings.sliderElements[indexToRemove];\r\n\t\tremoveSliderElement(deletedElement, indexToRemove);\r\n\t};\r\n\tconst addSliderElement = (sliderElement: ICustomPhotoSliderItem, indexToInsert: number = settings.sliderElements.length) => {\r\n\t\t// id check for UI\r\n\t\t// if id already found generate new one => no bugs in dots this way\r\n\t\tif (!sliderElement.id || settings.sliderElements.find(x => x.id === sliderElement.id))\r\n\t\t\tsliderElement.id = Guid.newSliderGuid();\r\n\r\n\t\t// insert element in slider on index\r\n\t\tconst element = indexToInsert === settings.sliderElements.length\r\n\t\t\t? settings.sliderElements[settings.sliderElements.length - 1]\r\n\t\t\t: settings.sliderElements[indexToInsert];\r\n\r\n\t\tinsertIntoSliderElements(sliderElement, indexToInsert);\r\n\t\tconst prevElement = expressQuerySelector(elementsEl, `#${element.id}`, true);\r\n\t\tconst newSlideElement = createSliderElement(sliderElement);\r\n\r\n\t\tindexToInsert === settings.sliderElements.length\r\n\t\t\t? elementsEl.insertAdjacentElement(\"afterend\", newSlideElement)\r\n\t\t\t: elementsEl.insertBefore(newSlideElement, prevElement);\r\n\r\n\t\tjumpIntoView(sliderElement);\r\n\t};\r\n\tconst reset = () => {\r\n\t\tif (settings.resize1SlideToFullWidth)\r\n\t\t\tresizeSliderElementsToFullWidth();\r\n\t\tsettings.BeforeResizeEvent && settings.BeforeResizeEvent(settings, sliderEl);\r\n\t\tcheckEdgesAndMove(0);\r\n\t\tsettings.ResizeEvent && settings.ResizeEvent(settings, sliderEl);\r\n\t};\r\n\tconst previousEvent = (e?: Event, draggedSlider = false, draggedSliderEventTracking = false) => {\r\n\t\tif (!settings.enableEternalSliding) checkEdgesAndMove(0);\r\n\t\tif (prevButton.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax)) return;\r\n\r\n\t\t// calculate next move\r\n\t\tconst nextMove = calculateNextMove(false);\r\n\t\t// update item\r\n\t\tcheckEdgesAndMove(nextMove, draggedSlider);\r\n\r\n\t\t// on click event of settings\r\n\t\tsettings.sliderContainerSettings.previousButton.onClick(e, draggedSliderEventTracking);\r\n\t};\r\n\tconst nextEvent = (e?: Event, draggedSlider = false, draggedSliderEventTracking = false) => {\r\n\t\tif (!settings.enableEternalSliding) checkEdgesAndMove(0);\r\n\t\tif (nextButton.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax)) return;\r\n\r\n\t\t// calculate next move\r\n\t\tconst nextMove = calculateNextMove(true);\r\n\t\t// update item\r\n\t\tcheckEdgesAndMove(nextMove, draggedSlider);\r\n\r\n\t\t// on click event of settings\r\n\t\tsettings.sliderContainerSettings.nextButton.onClick(e, draggedSliderEventTracking);\r\n\t};\r\n\tconst createIntersectionObserver = () => {\r\n\t\tif (('InterSectionObserver' in window || 'IntersectionObserverEntry' in window && 'intersectionRatio' in (window as any).IntersectionObserverEntry.prototype)) {\r\n\t\t\treturn new IntersectionObserver((entries, observer) => {\r\n\t\t\t\tentries.forEach(entry => {\r\n\t\t\t\t\tif (entry.isIntersecting && entry.target.classList.contains(element.classList[0])) {\r\n\t\t\t\t\t\tioSlider = undefined;\r\n\t\t\t\t\t\t// init slider when in parent element in view\r\n\t\t\t\t\t\tinit(element, settings.replaceWithElement);\r\n\t\t\t\t\t\tobserver.unobserve(entry.target);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\t\t{ rootMargin: \"0px 0px 0px 0px\" }\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n\r\n\tconst showButtons = () => {\r\n\t\tnextButton && expressRemoveClass(nextButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t\tprevButton && expressRemoveClass(prevButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t};\r\n\r\n\tconst hideButtons = () => {\r\n\t\tnextButton && expressAddClass(nextButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t\tprevButton && expressAddClass(prevButton, settings.sliderContainerSettings.cssWhenButtonsBothOnMax);\r\n\t};\r\n\r\n\tlet ioSlider: IntersectionObserver | undefined = createIntersectionObserver();\r\n\r\n\t// init slider\r\n\tinit(element, settings.replaceWithElement);\r\n\r\n\t// return\r\n\treturn {\r\n\t\tRemoveSliderElement: removeSliderElement,\r\n\t\tRemoveSliderElementOnIndex: removeSliderElementOnIndex,\r\n\t\tAddSliderElement: addSliderElement,\r\n\t\tPrevious: previousEvent,\r\n\t\tNext: nextEvent,\r\n\t\tJumpIntoView: jumpIntoView,\r\n\t\tSettings: settings,\r\n\t\tGetCurrentSlide: getCurrentElement,\r\n\t\tGetAllSlides: getAllElements,\r\n\t\tGetSliderElement: () => sliderEl,\r\n\t\tShowButtons: showButtons,\r\n\t\tHideButtons: hideButtons,\r\n\t\tDispose: dispose,\r\n\t\tAddHandlers: addDefaultEventListeners\r\n\t};\r\n}\r\n","import { expressEventListener, expressQuerySelector } from \"../common/html\";\r\n\r\nexport function initVideoPlayer(videoContainerEl: HTMLElement, autoplayOnClick = true) {\r\n\tconst playerEl = expressQuerySelector(videoContainerEl, '.technical-video-frame', true);\r\n\tconst overlayEl = expressQuerySelector(videoContainerEl, '.technical-video-overlay', false);\r\n\tlet overlayButtonEl: HTMLElement;\r\n\tif (overlayEl) {\r\n\t\toverlayButtonEl = expressQuerySelector(overlayEl, '.q-video-cover-overlay__button', false);\r\n\t}\r\n\tlet vimeoVideoPlayer;\r\n\tlet scriptAlreadyLoaded = false;\r\n\r\n\tconst onOverlayClick = (ev: Event) => {\r\n\t\tev.preventDefault();\r\n\t\tev.stopPropagation();\r\n\t\tplayPauseYoutubeVideo('play');\r\n\t};\r\n\r\n\tconst playPauseYoutubeVideo = (action: \"play\" | \"pause\") => {\r\n\t\ttoggleOverLay(action == 'play');\r\n\r\n\t\tconst isVimeoVideo = playerEl.src.toLowerCase().indexOf('vimeo') > -1;\r\n\r\n\t\tif (isVimeoVideo && !scriptAlreadyLoaded) {\r\n\t\t\tconst scriptEl = document.createElement(\"script\");\r\n\t\t\tscriptEl.onload = () => {\r\n\t\t\t\tvimeoVideoPlayer = new Vimeo.Player(playerEl, {\r\n\t\t\t\t\tautoplay: 1,\r\n\t\t\t\t\tmuted: false,\r\n\t\t\t\t});\r\n\t\t\t\tvimeoVideoPlayer[action]();\r\n\t\t\t\treturn;\r\n\t\t\t};\r\n\t\t\tscriptEl.src = 'https://player.vimeo.com/api/player.js';\r\n\t\t\tdocument.body.appendChild(scriptEl);\r\n\t\t\tscriptAlreadyLoaded = true;\r\n\t\t\treturn;\r\n\t\t} else if (isVimeoVideo && vimeoVideoPlayer && vimeoVideoPlayer[action]) {\r\n\t\t\tvimeoVideoPlayer[action]();\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tpostMessageToPlayer(\r\n\t\t\t{\r\n\t\t\t\t\"event\": \"command\",\r\n\t\t\t\t\"func\": action === 'play' ? 'playVideo' : 'pauseVideo',\r\n\t\t\t}\r\n\t\t);\r\n\t};\r\n\r\n\tconst toggleOverLay = (hideOverlay?: boolean) => {\r\n\t\tif (!overlayEl) return;\r\n\t\toverlayEl.classList.toggle('u-hide', hideOverlay);\r\n\t};\r\n\r\n\tconst postMessageToPlayer = (command) => {\r\n\t\tif (playerEl && playerEl.contentWindow) {\r\n\t\t\tplayerEl.contentWindow.postMessage(JSON.stringify(command), \"*\");\r\n\t\t}\r\n\t};\r\n\r\n\tconst init = () => {\r\n\t\tif (overlayEl && autoplayOnClick) expressEventListener(overlayEl, 'click', onOverlayClick);\r\n\t\tif (overlayButtonEl && autoplayOnClick) expressEventListener(overlayButtonEl, 'click', onOverlayClick);\r\n\t};\r\n\r\n\tinit();\r\n\r\n\treturn {\r\n\t\tdispose: () => { if (overlayEl) expressEventListener(overlayEl, 'click', onOverlayClick); },\r\n\t\tplayPauseYoutubeVideo: (action: \"play\" | \"pause\") => playPauseYoutubeVideo(action),\r\n\t\tshowOverlay: () => toggleOverLay(false),\r\n\t\tisOverlayVisible: () => {\r\n\t\t\treturn overlayEl && !overlayEl.classList.contains(\"u-hide\");\r\n\t\t}\r\n\t};\r\n}\r\n","import {\r\n\tcreateCustomSlider,\r\n\tICustomPhotoSliderItem,\r\n\tICustomPhotoSliderWithDivSettings,\r\n\tICustomSlider,\r\n} from \"../components/customslider\";\r\nimport { expressQuerySelector, expressQuerySelectorAll } from \"../common/html\";\r\nimport { initVideoPlayer } from \"../components/video-player\";\r\nimport { getParameter, updateParameter } from \"../utils/querystring\";\r\n\r\nexport enum CarrouselItemType {\r\n\tFormatImage = 0,\r\n\tPackShot = 1\r\n}\r\n\r\nexport interface ICarrousel {\r\n\treadonly reInit: () => void;\r\n\treadonly reStart: () => void;\r\n\treadonly resize: () => void;\r\n\treadonly addAndSelectElement: (imgSrc: string) => boolean;\r\n\treadonly removeFirstElementAndSelect: (itemType: CarrouselItemType) => void;\r\n\treadonly getCurrentElement: (sliderIndex: number) => ICustomPhotoSliderItem;\r\n\treadonly getAllElements: (sliderIndex: number) => ICustomPhotoSliderItem[];\r\n\treadonly removeSliderElement: (sliderIndex: number, visiblePhotoEl: ICustomPhotoSliderItem) => void;\r\n\treadonly goToSlide: (currentSlide: ICustomPhotoSliderItem) => void;\r\n\treadonly dispose: () => void;\r\n}\r\nexport interface ICarrouselOptions {\r\n\treadonly initFormatImage?: (sliderElement: any) => void;\r\n\treadonly enableKeyboardNavigation?: boolean;\r\n}\r\n\r\nenum SideButtonOption {\r\n\tPrev,\r\n\tNext\r\n}\r\n\r\nexport function createCarrousel(containerEl: HTMLElement, opts?: ICarrouselOptions) {\r\n\tconst sliderComponents: ICustomSlider[] = [];\r\n\tlet currentlySelectedEl: Element;\r\n\tconst VIDEO_EXTENSIONS = ['mp4', 'webm'];\r\n\tlet youtubePlayer: {\r\n\t\tdispose: () => void,\r\n\t\tplayPauseYoutubeVideo: (action: \"play\" | \"pause\") => void,\r\n\t\tshowOverlay: () => void,\r\n\t\tisOverlayVisible: () => boolean | null\r\n\t} | undefined;\r\n\r\n\tconst GetHtmlElementWidthWithMargins = (element: HTMLElement): number => {\r\n\t\tif (!element) return 0;\r\n\t\tconst style = window.getComputedStyle(element),\r\n\t\t\twidth = style.width ? parseFloat(style!.width) : element.clientWidth, // use this instead of client width to handle the rounding of the elements => worse case 1 px of the image is not shown\r\n\t\t\tmargin = parseFloat(style.marginLeft ? style.marginLeft : '0') + parseFloat(style.marginRight ? style.marginRight : '0'),\r\n\t\t\tpadding = parseFloat(style.paddingLeft ? style.paddingLeft : '0') + parseFloat(style.paddingRight ? style.paddingRight : '0');\r\n\t\treturn (width + (margin ? margin : 0) + (padding ? padding : 0));\r\n\t};\r\n\r\n\tconst resizeSliderElements = (settings: ICustomPhotoSliderWithDivSettings, sliderWidth: number, slider: HTMLElement, sliderChildren?: HTMLElement[]) => {\r\n\t\tif (sliderWidth <= 0 || (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-preview-container') === -1)) return;\r\n\r\n\t\t// set all slider elements to the width of there slide element so only 1 slide is visible at a time\r\n\t\tconst slidesInSlider = sliderChildren ? sliderChildren : expressQuerySelectorAll(slider, '.technical-slider-element');\r\n\t\tfor (let i = 0; i < slidesInSlider.length; i++) {\r\n\t\t\tconst slide = slidesInSlider[i];\r\n\t\t\tslide.style.minWidth = sliderWidth + 'px';\r\n\t\t\tslide.style.width = sliderWidth + 'px';\r\n\t\t\tslide.style.maxWidth = sliderWidth + 'px';\r\n\t\t}\r\n\r\n\t\t// block iframe too on width\r\n\t\tconst iframesInSlider = expressQuerySelectorAll(slider, 'iframe');\r\n\t\tconst sliderWidthForIframe = sliderWidth - 1; // iframe always .2 or more => 1 more px on page\r\n\t\tfor (let z = 0; z < iframesInSlider.length; z++) {\r\n\t\t\tconst iframe = iframesInSlider[z];\r\n\t\t\tiframe.width = sliderWidthForIframe.toString();\r\n\t\t\tiframe.style.minWidth = sliderWidthForIframe + 'px';\r\n\t\t\tiframe.style.width = sliderWidthForIframe + 'px';\r\n\t\t\tiframe.style.maxWidth = sliderWidthForIframe + 'px';\r\n\t\t}\r\n\t};\r\n\r\n\tconst playPauseVideo = () => {\r\n\t\tif (!youtubePlayer || youtubePlayer.isOverlayVisible()) return;\r\n\t\tyoutubePlayer.playPauseYoutubeVideo('pause');\r\n\t};\r\n\r\n\tconst isElementVisibleInContainer = (element, container) => {\r\n\t\tconst rect = element.getBoundingClientRect();\r\n\t\tconst containerRect = container.getBoundingClientRect();\r\n\t\treturn rect.left >= containerRect.left && rect.right <= containerRect.right;\r\n\t};\r\n\r\n\tconst onSideButtonClicked = (e: Event, eyeCatcher: Element[], option: SideButtonOption) => {\r\n\t\tplayPauseVideo();\r\n\t\teyeCatcher.forEach(x => x.classList.toggle('u-hide', (youtubePlayer && !youtubePlayer.isOverlayVisible()) || false));\r\n\t\tconst target = e.currentTarget as HTMLElement;\r\n\t\tif (!target || !target.classList || target.classList.contains('technical-thumb-container') || target.parentElement.classList.contains('technical-thumb-container')) return;\r\n\r\n\t\tupdateImageCount(sliderComponents[0], eyeCatcher);\r\n\r\n\t\tif (currentlySelectedEl) {\r\n\t\t\tconst element = option === SideButtonOption.Prev\r\n\t\t\t\t? currentlySelectedEl.previousElementSibling || currentlySelectedEl.parentElement.lastElementChild\r\n\t\t\t\t: currentlySelectedEl.nextElementSibling || currentlySelectedEl.parentElement.firstElementChild;\r\n\t\t\tif (element) {\r\n\t\t\t\tchangeSelectedElement(element);\r\n\t\t\t\tconst bottomSlider = sliderComponents[1];\r\n\t\t\t\tif (bottomSlider) {\r\n\t\t\t\t\tconst isFullyVisible = isElementVisibleInContainer(element, bottomSlider.GetSliderElement());\r\n\t\t\t\t\tif (isFullyVisible) return;\r\n\t\t\t\t\tconst sliderElement = bottomSlider.Settings.sliderElements.find(x => x.id === element.id);\r\n\t\t\t\t\tbottomSlider.JumpIntoView(sliderElement, undefined, option === SideButtonOption.Prev ? 'start' : 'end');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tconst updateImageCount = (sliderComponent: ICustomSlider, eyeCatcher?: Element[]) => {\r\n\t\tif (!sliderComponent) return;\r\n\r\n\t\tconst imageCountEl = (eyeCatcher || expressQuerySelectorAll(sliderComponent.GetSliderElement(), '.technical-carrousel-eyecatcher')).find(x => x.classList.contains('technical-image-eyecatcher'));\r\n\t\tif (!imageCountEl) return;\r\n\t\timageCountEl.innerHTML = `${sliderComponent.Settings.sliderElements.indexOf(sliderComponent.GetCurrentSlide()) + 1}/${sliderComponent.Settings.sliderElements.length}`;\r\n\t};\r\n\r\n\tconst changeSelectedElement = (newElement: Element) => {\r\n\t\tcurrentlySelectedEl?.classList.toggle('m-carrousel__thumb--active', false);\r\n\t\tnewElement.classList.toggle('m-carrousel__thumb--active', true);\r\n\t\tcurrentlySelectedEl = newElement;\r\n\t};\r\n\r\n\tconst init = () => {\r\n\t\tif (!sliderComponents || sliderComponents.length === 0) {\r\n\t\t\t// both sliders in m-carrousel\r\n\t\t\tconst sliders = expressQuerySelectorAll(containerEl, '.technical-slider');\r\n\r\n\t\t\tfor (let i = 0; i < sliders.length; i++) {\r\n\t\t\t\tconst sliderEl = sliders[i];\r\n\r\n\t\t\t\t// convert so slider elements\r\n\t\t\t\tconst sliderElements: ICustomPhotoSliderItem[] = [];\r\n\r\n\t\t\t\tfor (let z = 0, l = sliderEl.children.length; z < l; z++)\r\n\t\t\t\t\tsliderElements.push({ template: sliderEl.children[z] as HTMLElement });\r\n\r\n\t\t\t\t// settings for slider\r\n\t\t\t\tconst eyeCatcher = expressQuerySelectorAll(sliderEl.parentElement, '.technical-carrousel-eyecatcher');\r\n\t\t\t\tconst settings = {\r\n\t\t\t\t\tenableKeyboardNavigation: opts && opts.enableKeyboardNavigation,\r\n\t\t\t\t\tsliderElements: sliderElements,\r\n\t\t\t\t\tsliderContainerSettings: {\r\n\t\t\t\t\t\textraSliderClass: 'm-carrousel__slider ' + (i === 0 ? 'technical-preview-container ' : 'technical-thumb-container '),\r\n\t\t\t\t\t\telementsContainerSettings: {\r\n\t\t\t\t\t\t\textraSliderClass: 'm-carrousel__slider-elements',\r\n\t\t\t\t\t\t\tslideClicked: (e: Event, settings: ICustomPhotoSliderWithDivSettings) => {\r\n\t\t\t\t\t\t\t\t// play youtube video from first slider\r\n\t\t\t\t\t\t\t\tconst target = (e.target as HTMLElement).closest('.technical-slider-element') as HTMLElement;\r\n\t\t\t\t\t\t\t\tif (target && target.classList.contains('technical-video-container') && youtubePlayer && (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-preview-container') !== -1))\r\n\t\t\t\t\t\t\t\t\tyoutubePlayer.playPauseYoutubeVideo(youtubePlayer.isOverlayVisible() ? 'play' : 'pause');\r\n\t\t\t\t\t\t\t\telse if (youtubePlayer && !youtubePlayer.isOverlayVisible() && (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-thumb-container') !== -1))\r\n\t\t\t\t\t\t\t\t\tyoutubePlayer.playPauseYoutubeVideo('pause');\r\n\r\n\t\t\t\t\t\t\t\teyeCatcher.forEach(x => x.classList.toggle('u-hide', (youtubePlayer && !youtubePlayer.isOverlayVisible()) || false));\r\n\r\n\t\t\t\t\t\t\t\t// update sliders\r\n\t\t\t\t\t\t\t\tif (!e.target || (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-preview-container') >= 0)) return;\r\n\t\t\t\t\t\t\t\tlet clickedItemTemplate = ((e.target as HTMLElement).closest('.q-video-cover-overlay__button') || (e.target as HTMLElement).closest('img') || (e.target as HTMLElement).closest('picture') || (e.target as HTMLElement).closest('video')) as HTMLImageElement;\r\n\t\t\t\t\t\t\t\tif ((!clickedItemTemplate && (e.target as HTMLElement).classList.contains(\"m-carrousel__cover-container\"))\r\n\t\t\t\t\t\t\t\t\t|| (clickedItemTemplate && clickedItemTemplate.classList.contains(\"q-video-cover-overlay__button\"))) {\r\n\t\t\t\t\t\t\t\t\tconst el = (e.target as HTMLElement).closest('.technical-slider-element');\r\n\t\t\t\t\t\t\t\t\tconst imgs = (el.getElementsByTagName('img') || el.getElementsByTagName('picture') || el.getElementsByTagName('video')) as HTMLCollectionOf;\r\n\t\t\t\t\t\t\t\t\tif (imgs.length) clickedItemTemplate = imgs[0];\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (!clickedItemTemplate) return;\r\n\r\n\t\t\t\t\t\t\t\tconst clickedItemTemplateSrc = clickedItemTemplate instanceof HTMLVideoElement ? expressQuerySelector(clickedItemTemplate, 'source')?.src : clickedItemTemplate.src;\r\n\r\n\t\t\t\t\t\t\t\t// get all sliders of the page except own slider\r\n\t\t\t\t\t\t\t\tfor (let i = 0; i < sliderComponents.length; i++) {\r\n\t\t\t\t\t\t\t\t\tconst sliderComponent = sliderComponents[i];\r\n\t\t\t\t\t\t\t\t\tconst sliderEl = sliderComponent.GetSliderElement();\r\n\t\t\t\t\t\t\t\t\tconst sliderElement = sliderComponent.Settings.sliderElements.filter(x => {\r\n\t\t\t\t\t\t\t\t\t\tif (!x.template) return;\r\n\t\t\t\t\t\t\t\t\t\tconst sliderItemTemplate = expressQuerySelector(x.template, 'img')\r\n\t\t\t\t\t\t\t\t\t\t\t|| expressQuerySelector(x.template, 'iframe')\r\n\t\t\t\t\t\t\t\t\t\t\t|| expressQuerySelector(x.template, 'picture')\r\n\t\t\t\t\t\t\t\t\t\t\t|| expressQuerySelector(x.template, 'video > source');\r\n\t\t\t\t\t\t\t\t\t\treturn sliderItemTemplate instanceof HTMLIFrameElement\r\n\t\t\t\t\t\t\t\t\t\t\t? sliderItemTemplate && sliderItemTemplate.parentElement && sliderItemTemplate.parentElement.classList.contains('technical-video-container') && clickedItemTemplate.classList.contains('m-carrousel__thumb-video-img')\r\n\t\t\t\t\t\t\t\t\t\t\t: sliderItemTemplate && (sliderItemTemplate.dataset.src || sliderItemTemplate.src) === clickedItemTemplateSrc;\r\n\t\t\t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\t\t\t\t// show eye catcher if the video is not playing\r\n\t\t\t\t\t\t\t\t\tconst sliderEyeCatchers = expressQuerySelectorAll(sliderEl, '.technical-carrousel-eyecatcher');\r\n\t\t\t\t\t\t\t\t\tsliderEyeCatchers.forEach(x => x.classList.toggle('u-hide', (youtubePlayer && !youtubePlayer.isOverlayVisible()) || false));\r\n\r\n\t\t\t\t\t\t\t\t\t// slider has not the same element\r\n\t\t\t\t\t\t\t\t\tif (sliderElement.length <= 0)\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t\t\tconst element = sliderElement[0];\r\n\r\n\t\t\t\t\t\t\t\t\tif (element.template.classList.contains('m-carrousel__thumb')) {\r\n\t\t\t\t\t\t\t\t\t\tconst clickedEl = expressQuerySelector(sliderEl, `#${element.id}`);\r\n\t\t\t\t\t\t\t\t\t\tchangeSelectedElement(clickedEl);\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// don't jump into view if thumbs are all shown already\r\n\t\t\t\t\t\t\t\t\tconst sliderButtonRight = expressQuerySelector(sliderEl, '.m-carrousel__button--right', true);\r\n\t\t\t\t\t\t\t\t\tconst sliderButtonLeft = expressQuerySelector(sliderEl, '.m-carrousel__button--left', true);\r\n\t\t\t\t\t\t\t\t\tif (settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-thumb-container') !== -1\r\n\t\t\t\t\t\t\t\t\t\t&& sliderButtonRight.classList.contains(settings.sliderContainerSettings.nextButton.cssWhenOnMax)\r\n\t\t\t\t\t\t\t\t\t\t&& sliderButtonLeft.classList.contains(settings.sliderContainerSettings.previousButton.cssWhenOnMax))\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\r\n\t\t\t\t\t\t\t\t\t// slider has the same element jump into view\r\n\t\t\t\t\t\t\t\t\tsliderComponent.JumpIntoView(element);\r\n\r\n\t\t\t\t\t\t\t\t\t// update image count\r\n\t\t\t\t\t\t\t\t\tupdateImageCount(sliderComponent, sliderEyeCatchers);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tnextButton: {\r\n\t\t\t\t\t\t\tcss: `a-button a-button--slider-button m-carrousel__button--right ${i === 0 ? 'm-carrousel__button--large' : ''} icon-arrow-right technical-slider-button ${sliderElements.length <= 1 ? 'u-hide' : ''}`,\r\n\t\t\t\t\t\t\tonClick: (e: Event) => {\r\n\t\t\t\t\t\t\t\tonSideButtonClicked(e, eyeCatcher, SideButtonOption.Next);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tpreviousButton: {\r\n\t\t\t\t\t\t\tcss: `a-button a-button--slider-button m-carrousel__button--left ${i === 0 ? 'm-carrousel__button--large' : ''} icon-arrow-left technical-slider-button ${sliderElements.length <= 1 ? 'u-hide' : ''}`,\r\n\t\t\t\t\t\t\tonClick: (e: Event) => {\r\n\t\t\t\t\t\t\t\tonSideButtonClicked(e, eyeCatcher, SideButtonOption.Prev);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t},\r\n\t\t\t\t\ttranslateForMovement: i == 0,\r\n\t\t\t\t\tSliderCreated: (settings: ICustomPhotoSliderWithDivSettings, slider: HTMLElement, oldSlider: HTMLElement | undefined) => {\r\n\t\t\t\t\t\tconst sliderWidth = Math.ceil(GetHtmlElementWidthWithMargins(oldSlider ? oldSlider : sliderEl));\r\n\t\t\t\t\t\tresizeSliderElements(settings, sliderWidth, slider, expressQuerySelectorAll(slider, '.technical-slider-element'));\r\n\r\n\t\t\t\t\t\t// only for thumb slider\r\n\t\t\t\t\t\tif ((settings.sliderContainerSettings.extraSliderClass && settings.sliderContainerSettings.extraSliderClass.indexOf('technical-thumb-container') !== -1)) {\r\n\t\t\t\t\t\t\t// add extra div for styling of the thumbs\r\n\t\t\t\t\t\t\tconst sliderElementsEl = expressQuerySelector(slider, '.technical-slider-elements', true);\r\n\t\t\t\t\t\t\tconst extraDivForStyling = document.createElement('div');\r\n\t\t\t\t\t\t\textraDivForStyling.classList.add('m-carrousel__slider-elements-container');\r\n\t\t\t\t\t\t\textraDivForStyling.appendChild(sliderElementsEl);\r\n\t\t\t\t\t\t\tslider.appendChild(extraDivForStyling);\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// init video players\r\n\t\t\t\t\t\tconst videoPlayers = expressQuerySelectorAll(slider, '.technical-video-container');\r\n\t\t\t\t\t\tfor (let i = 0; i < videoPlayers.length; i++) {\r\n\t\t\t\t\t\t\tconst videoPlayerContainer = videoPlayers[i];\r\n\r\n\t\t\t\t\t\t\t// create video player\r\n\t\t\t\t\t\t\tyoutubePlayer = initVideoPlayer(videoPlayerContainer, false);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\t\t\t\t\tResizeEvent: (settings, slider) => {\r\n\t\t\t\t\t\tslider = sliderComponent.GetSliderElement();\r\n\t\t\t\t\t\t// get current slide to reset to that slide after resize\r\n\t\t\t\t\t\t// get the current selected from thumb => after resize the slides get other widths => calculation for the current selected slide could be wrong then\r\n\t\t\t\t\t\tconst currentSlide = i === 0 && sliderComponents.length > 1 && currentlySelectedEl\r\n\t\t\t\t\t\t\t? sliderComponents[0].Settings.sliderElements[sliderComponents[1].Settings.sliderElements.findIndex(x => x.id === currentlySelectedEl.id)]\r\n\t\t\t\t\t\t\t: sliderComponent.GetCurrentSlide();\r\n\t\t\t\t\t\tif (!currentSlide) return;\r\n\r\n\t\t\t\t\t\tconst sliderWidth = Math.ceil(GetHtmlElementWidthWithMargins(slider));\r\n\t\t\t\t\t\tresizeSliderElements(settings, sliderWidth, slider);\r\n\t\t\t\t\t\tsliderComponent.JumpIntoView(currentSlide, false);\r\n\t\t\t\t\t\tupdateImageCount(sliderComponent);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tInitializedEvent: (settings, slider: HTMLElement) => {\r\n\t\t\t\t\t\teyeCatcher.forEach(x => {\r\n\t\t\t\t\t\t\tslider.prepend(x);\r\n\t\t\t\t\t\t\tx.classList.remove('u-hide');\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\tslider.classList.add(\"m-carrousel__slider--initialized\");\r\n\t\t\t\t\t\tif (settings && opts && opts.initFormatImage)\r\n\t\t\t\t\t\t\topts.initFormatImage(settings);\r\n\t\t\t\t\t}\r\n\t\t\t\t} as ICustomPhotoSliderWithDivSettings;\r\n\r\n\t\t\t\tconst sliderComponent = createCustomSlider(sliderEl, settings);\r\n\t\t\t\tsliderComponents.push(sliderComponent);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tsliderComponents.forEach(slider => slider.AddHandlers());\r\n\t\t}\r\n\r\n\t\tconst bottomSlider = sliderComponents[1];\r\n\t\tif (bottomSlider) {\r\n\t\t\tconst firstEl = bottomSlider.GetSliderElement() && expressQuerySelector(bottomSlider.GetSliderElement(), `#${bottomSlider.Settings.sliderElements[0].id}`);\r\n\t\t\tfirstEl && changeSelectedElement(firstEl);\r\n\t\t}\r\n\t};\r\n\r\n\tconst reStart = () => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tconst slideEls = slider.Settings.sliderElements;\r\n\t\t\tif (slideEls.length > 1) {\r\n\t\t\t\tif (slideEls[0]) {\r\n\t\t\t\t\tslider.JumpIntoView(slideEls[0], false);\r\n\t\t\t\t\tupdateImageCount(slider);\r\n\t\t\t\t}\r\n\t\t\t\tslider.ShowButtons();\r\n\t\t\t} else {\r\n\t\t\t\tslider.HideButtons();\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\tconst moveBottomSliderToSelectedItem = () => {\r\n\t\tconst topSlider = sliderComponents[0];\r\n\t\tconst bottomSlider = sliderComponents[1];\r\n\r\n\t\tif (!bottomSlider) return;\r\n\r\n\t\tconst topSliderSelectedItem = topSlider\r\n\t\t\t? topSlider.Settings.sliderElements.indexOf(topSlider.GetCurrentSlide())\r\n\t\t\t: -1;\r\n\r\n\t\t// top and bottom should have the same elements on the same index\r\n\t\tconst bottomSliderToSelectEl = bottomSlider.GetSliderElement && expressQuerySelector(bottomSlider.GetSliderElement(), `#${bottomSlider.Settings.sliderElements[topSliderSelectedItem > -1 ? topSliderSelectedItem : 0].id}`);\r\n\t\tbottomSliderToSelectEl && changeSelectedElement(bottomSliderToSelectEl);\r\n\r\n\t};\r\n\r\n\tconst removeFirstElementAndSelect = (itemType: CarrouselItemType) => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tconst isPreviewSlider = slider.Settings.sliderContainerSettings.extraSliderClass && slider.Settings.sliderContainerSettings.extraSliderClass.includes('technical-preview-container');\r\n\r\n\t\t\tswitch (itemType) {\r\n\t\t\t\tcase CarrouselItemType.FormatImage:\r\n\t\t\t\t\tif (slider.Settings && slider.Settings.sliderElements && slider.Settings.sliderElements.length > 0) {\r\n\t\t\t\t\t\tconst currentSlide = slider.GetCurrentSlide();\r\n\t\t\t\t\t\tconst currentSelected = currentSlide.id == slider.Settings.sliderElements[0].id\r\n\t\t\t\t\t\t\t? slider.Settings.sliderElements[1]\r\n\t\t\t\t\t\t\t: currentSlide;\r\n\r\n\t\t\t\t\t\tslider.RemoveSliderElementOnIndex(0);\r\n\t\t\t\t\t\t!isPreviewSlider && slider.JumpIntoView(currentSelected, false);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tupdateImageCount(slider);\r\n\t\t\t\t\tmoveBottomSliderToSelectedItem();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CarrouselItemType.PackShot:\r\n\t\t\t\t\tif (slider.Settings && slider.Settings.sliderElements && slider.Settings.sliderElements.length > 0 && slider.Settings.sliderElements[0].template.classList.contains(\"technical-packshot\")) {\r\n\t\t\t\t\t\tconst currentSlide = slider.GetCurrentSlide();\r\n\t\t\t\t\t\tconst currentSelected = currentSlide.id == slider.Settings.sliderElements[0].id\r\n\t\t\t\t\t\t\t? slider.Settings.sliderElements[1]\r\n\t\t\t\t\t\t\t: currentSlide;\r\n\r\n\t\t\t\t\t\tslider.RemoveSliderElementOnIndex(0);\r\n\t\t\t\t\t\t!isPreviewSlider && slider.JumpIntoView(currentSelected, false);\r\n\t\t\t\t\t\tupdateImageCount(slider);\r\n\t\t\t\t\t\tmoveBottomSliderToSelectedItem();\r\n\r\n\t\t\t\t\t\tlet newUrl = document.location.href;\r\n\t\t\t\t\t\tconst design = getParameter('design', newUrl, false);\r\n\t\t\t\t\t\tif (design) {\r\n\t\t\t\t\t\t\tnewUrl = updateParameter(\"design\", \"\");\r\n\t\t\t\t\t\t\tif (document.location.href !== newUrl)\r\n\t\t\t\t\t\t\t\thistory.replaceState({}, '', newUrl);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t};\r\n\r\n\tconst addAndSelectElement = (imgSrc: string): boolean => {\r\n\t\tif (!imgSrc) return false;\r\n\t\t[...sliderComponents].reverse().forEach(slider => {\r\n\t\t\t// do a deep clone of a non video element so there is no reference to the current slide template anymore => else the thumb click does nothing anymore\r\n\t\t\tconst formatImageContainerTemplate = slider.GetAllSlides().find(x => x.template.querySelector('img') && !x.template.querySelector('.technical-overlay')).template.cloneNode(true) as HTMLElement;\r\n\t\t\tconst extension = imgSrc.substring(imgSrc.lastIndexOf('.') + 1, imgSrc.length);\r\n\t\t\tconst isPreviewSlider = slider.Settings.sliderContainerSettings.extraSliderClass && slider.Settings.sliderContainerSettings.extraSliderClass.includes('technical-preview-container');\r\n\r\n\t\t\tif (VIDEO_EXTENSIONS.some(x => x === extension)) {\r\n\t\t\t\tformatImageContainerTemplate.classList.remove('m-carrousel__preview-image-container');\r\n\r\n\t\t\t\tformatImageContainerTemplate.classList.toggle('m-carrousel__preview-video-container', isPreviewSlider);\r\n\r\n\t\t\t\tconst videoContainer = document.createElement('video');\r\n\t\t\t\tvideoContainer.classList.add(isPreviewSlider ? 'm-carrousel__preview-local-video' : 'm-carrousel__thumb-local-video');\r\n\t\t\t\tvideoContainer.loop = true;\r\n\t\t\t\tvideoContainer.muted = true;\r\n\t\t\t\tvideoContainer.preload = 'metadata';\r\n\t\t\t\tvideoContainer['disableRemotePlayback'] = true;\r\n\t\t\t\tvideoContainer.crossOrigin = 'anonymous';\r\n\t\t\t\tvideoContainer.playsInline = true;\r\n\t\t\t\tvideoContainer.autoplay = true;\r\n\r\n\t\t\t\tconst videoContainerSource = document.createElement('source');\r\n\t\t\t\tvideoContainerSource.src = imgSrc;\r\n\t\t\t\tvideoContainerSource.type = `video/${extension}`;\r\n\r\n\t\t\t\tformatImageContainerTemplate.innerHTML = ''; // remove all\r\n\r\n\t\t\t\tvideoContainer.appendChild(videoContainerSource);\r\n\t\t\t\tformatImageContainerTemplate.appendChild(videoContainer);\r\n\t\t\t} else {\r\n\t\t\t\tconst imgEl = expressQuerySelector(formatImageContainerTemplate, \"img\", true);\r\n\t\t\t\timgEl.src = imgSrc;\r\n\t\t\t\tconst sourceEl = expressQuerySelector(formatImageContainerTemplate, \"source\", false);\r\n\t\t\t\tif (sourceEl) {\r\n\t\t\t\t\tsourceEl.srcset = imgSrc.endsWith('.jpg') ? imgSrc + '.webp' : imgSrc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// add correct dimentions\r\n\t\t\tconst sliderEl = slider.GetSliderElement();\r\n\t\t\tconst element = isPreviewSlider\r\n\t\t\t\t? sliderEl\r\n\t\t\t\t: expressQuerySelector(sliderEl, `#${slider.Settings.sliderElements[0].id}`);\r\n\r\n\t\t\tconst elementStyle = window.getComputedStyle(element),\r\n\t\t\t\telementWidth = elementStyle.width ? parseFloat(elementStyle!.width) : element.clientWidth; // use this instead of client width to handle the rounding of the elements => worse case 1 px of the image is not shown\r\n\r\n\t\t\tformatImageContainerTemplate.style.width = `${elementWidth}px`;\r\n\t\t\tformatImageContainerTemplate.style.minWidth = `${elementWidth}px`;\r\n\t\t\tformatImageContainerTemplate.style.maxWidth = `${elementWidth}px`;\r\n\r\n\t\t\tslider.AddSliderElement({ template: formatImageContainerTemplate }, 0);\r\n\t\t\tupdateImageCount(slider);\r\n\r\n\t\t\t// update bottom slider\r\n\t\t\tif (!isPreviewSlider) {\r\n\t\t\t\tconst firstEl = slider.GetSliderElement && expressQuerySelector(slider.GetSliderElement(), `#${slider.Settings.sliderElements[0].id}`);\r\n\t\t\t\tfirstEl && changeSelectedElement(firstEl);\r\n\t\t\t}\r\n\r\n\t\t\t// trigger resize for container to be the same width as other elements\r\n\t\t\tconst sliderSettings = slider.Settings;\r\n\t\t\tif (sliderSettings.ResizeEvent) sliderSettings.ResizeEvent(sliderSettings, sliderEl);\r\n\t\t});\r\n\r\n\t\treturn true;\r\n\t};\r\n\r\n\tconst getCurrentElement = (sliderIndex: number): ICustomPhotoSliderItem => {\r\n\t\treturn sliderComponents[sliderIndex].GetCurrentSlide();\r\n\t};\r\n\r\n\tconst getAllElements = (sliderIndex: number): ICustomPhotoSliderItem[] => {\r\n\t\treturn sliderComponents[sliderIndex].GetAllSlides();\r\n\t};\r\n\r\n\tconst resize = () => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tconst sliderEl = slider.GetSliderElement();\r\n\t\t\tconst sliderWidth = Math.ceil(GetHtmlElementWidthWithMargins(sliderEl));\r\n\t\t\tresizeSliderElements(slider.Settings, sliderWidth, sliderEl);\r\n\t\t});\r\n\t};\r\n\r\n\tconst removeSliderElement = (sliderIndex: number, visiblePhotoEl: ICustomPhotoSliderItem) => {\r\n\t\tsliderComponents[sliderIndex].RemoveSliderElement(visiblePhotoEl);\r\n\t};\r\n\r\n\tconst dispose = () => {\r\n\t\tsliderComponents.forEach(slider => {\r\n\t\t\tslider.Dispose();\r\n\t\t});\r\n\t};\r\n\r\n\tinit();\r\n\r\n\tconst reInit = () => {\r\n\t\tinit();\r\n\t};\r\n\r\n\treturn {\r\n\t\treInit,\r\n\t\treStart,\r\n\t\tresize,\r\n\t\taddAndSelectElement,\r\n\t\tremoveFirstElementAndSelect,\r\n\t\tgetCurrentElement,\r\n\t\tgetAllElements,\r\n\t\tremoveSliderElement,\r\n\t\tgoToSlide: (currentSlide: ICustomPhotoSliderItem) => sliderComponents.forEach(slider => {\r\n\t\t\tslider.JumpIntoView(currentSlide, false);\r\n\t\t\tupdateImageCount(slider);\r\n\t\t}),\r\n\t\tdispose\r\n\t} as ICarrousel;\r\n}\r\n","import {\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: {\r\n\t\t\t\t\t\tpvc: pvc,\r\n\t\t\t\t\t\tremoveCurrencySymbolFormUpperFunnelPages: window.context.removeCurrencySymbolFormUpperFunnelPages === \"true\"\r\n\t\t\t\t\t},\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 = selectedOption.selected && !selectedOption.disabled;\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 (window.context.removeCurrencySymbolFormUpperFunnelPages === \"true\") {\r\n\t\tformattedPrice += replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator);\r\n\t} else {\r\n\t\tif (price.Currency.DisplayLeftToPrice)\r\n\t\t\tformattedPrice += price.Currency.CurrencySymbol + ' ' + replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator);\r\n\t\telse\r\n\t\t\tformattedPrice += replaceDecimalSeparatorInPrice(price.Amount, price.Currency.DecimalSeparator) + ' ' + price.Currency.CurrencySymbol;\r\n\t}\r\n\r\n\treturn formattedPrice;\r\n}\r\n\r\n","import { 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","getSelfOrParentWithClassName","getParents","elem","selector","Element","prototype","matches","webkitMatchesSelector","s","this","ownerDocument","item","parentNode","parents","push","htmlToElement","html","template","createElement","trim","innerHTML","content","firstChild","isMobileOnPageWithHeader","isElementVisible","offsetWidth","offsetHeight","width","isElementVisibleInViewPort","rect","top","left","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","isElementPartiallyVisibleInViewport","percentVisible","windowHeight","Math","floor","remove","removeChild","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","debounce","fn","delay","timeoutID","args","apply","throttle","fnAlways","lastTimestamp","now","createBaseFormInput","containerEl","altSelector","inputEl","errorParagraphEl","toggleEnable","attr","force","toggleAttribute","clearValue","setError","doClear","createSelectBox","onSelected","baseComponent","selectEl","disposableEvent","setValue","getValue","createFormInput","isCheckBox","checked","createPasswordFormInput","formInput","iconEl","onPasswordShowHideIconClick","addEvent","validatePassword","dataset","Number","minlength","password","cursor","createSingleSlider","sendPartialUpdateForInput","sliderMaxRangeEl","sliderLabelEls","snappingArray","disposableEvents","orderLabels","singleValueToTheLeft","labelEl","index","valueToTheLeft","snappingPos","snappingValue","onLabelClick","currentLabelEl","currentTarget","createTextInputWithAutoComplete","onCloseDisposable","autoCompleteSearch","onOpen","onClose","renderTextContent","containerInsertPosition","containerClass","autocompleteResult","itemEl","insertAdjacentElement","onMouseDownEvent","Gender","UpdateAccountResult","ChangePasswordStatus","OkResult","initForm","formEl","alternativeButton","onSubmitForm","buttonSelector","submitOnEnter","validatorOptions","showFirstErrorOnValidate","enablePartialSubmit","partialSubmit","submitButtonEl","validator","createFormValidator","onKeyUpEvent","formElements","inputs","invalidFormFields","isValid","filter","email","attributes","getNamedItem","maxLength","id","getInputs","keys","map","clearAll","clearValues","resetValidation","reset","validate","validations","name","all","onSubmit","data","formData","submitButton","debounceOnFormInput","getInputByName","disableForm","disableInput","setErrors","errors","clearInputs","names","clearInput","setValues","values","v","hideInput","getAllVisibleInputs","visibleInputs","form","classTo","errorClass","successClass","errorTextClass","errorTextParent","errorTextTag","onValidate","Pristine","subscribeAsync","appId","posId","lang","subscription","applicationId","pointOfSaleId","language","toggleSubscribeAsync","personId","newsletter","personalMessage","mailFrequency","postalMail","emarsysData","toggleSubscription","getFullQuerystring","pos","href","getParameters","pairs","split","params","pair","getParameter","required","queryStringParam","updateParameter","newAdditionalURL","tempArray","hash","additionalURL","baseURL","temp","result","addParameter","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","initNavigationDesktop","firstLevelMenuEls","loadDesktopMenuItemAsync","loadedMenuItemsKeys","firstLevelActiveClass","closeMenu","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","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","min","max","sliderId","checkboxId","sliderEl","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","elementsEl","firstVisibleElement","prevButton","disposableDragTouchEvents","disposableDragMouseEvents","sliderPxX","widthBeforeResize","mouseDownOnSlider","startSliderDragX","currentSliderDragX","isDragged","disableSliderDragging","preventPageScrolling","preventSliderDragging","prevSliderWidth","ioSlider","getSliderTemplate","InitializedEvent","checkEdgesAndMove","addDefaultEventListeners","resizeObserver","dragStart","enableKeyboardNavigation","onKeyDown","scrollStart","addPrevNextBtnEventListeners","previousEvent","nextEvent","ResizeObserver","contentRect","resize","code","sliderWidth","getFullWidthElement","preventClick","stopImmediatePropagation","getPositionX","dragStop","dragging","dragLeave","scrollBehavior","posX","movedSinceStart","getFirstVisibleElement","elementWidth","visibleElements","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","removeCurrencySymbolFormUpperFunnelPages","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","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","Amount","Currency","DecimalSeparator","DisplayLeftToPrice","CurrencySymbol","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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"}