{"version":3,"file":"alpacaExtensions.js?7842025","mappings":"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","sources":["webpack:///webpack/runtime/load script","webpack:///./alpaca-extensions/modules/PhotoTinMipMapLevel.ts","webpack:///./helpers/helperFunctions.ts","webpack:///./ClassWithTracking/helpers.ts","webpack:///./alpaca-extensions/modules/PhotoTinMipMap.ts","webpack:///./alpaca-extensions/modules/ sync ^\\.\\/.*\\.ts$","webpack:///./alpaca-extensions/modules/PhotoTin.ts","webpack:///./alpaca-extensions/modules/AlpacaExtension.ts","webpack:///./helpers/DOMHelpers.ts","webpack:///webpack/bootstrap","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/ensure chunk","webpack:///webpack/runtime/get javascript chunk filename","webpack:///webpack/runtime/get mini-css chunk filename","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///webpack/runtime/make namespace object","webpack:///webpack/runtime/publicPath","webpack:///webpack/runtime/jsonp chunk loading","webpack:///./alpaca-extensions/index.ts"],"sourcesContent":["var inProgress = {};\n// data-webpack is not used as build has no uniqueName\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","export default class PhotoTinMipMapLevel {\r\n width: number;\r\n height: number;\r\n canvas: HTMLCanvasElement;\r\n\r\n constructor(width: number, height: number, canvas: HTMLCanvasElement) {\r\n this.width = width;\r\n this.height = height;\r\n this.canvas = canvas;\r\n }\r\n}\r\n","import { deepmerge } from 'deepmerge-ts';\r\nimport { getSibling, addClass, addClasses, removeClass, removeClasses } from './DOMHelpers';\r\n\r\nexport function copyObject(options) {\r\n return JSON.parse(JSON.stringify(options));\r\n}\r\n\r\n/**\r\n * Copies current URL query parameters to passed URL.\r\n * This is needed for instance for a layer.\r\n * Parameter will not be copied if the parameter name is already included in the URL or if the parameter name is included as an element in parametersToOmit.\r\n */\r\nexport function copyQueryParametersToUrl(url: string, parametersToOmit: string[] = []) {\r\n const parameters = window.location.search.substring(1);\r\n if (!parameters) return url;\r\n const parametersToCopy = decodeURIComponent(parameters)\r\n .split(\"&\")\r\n .filter(parameter => {\r\n const parameterKey = parameter.split(\"=\")[0];\r\n return url.indexOf(`${parameterKey}=`) < 0 && !parametersToOmit.includes(parameterKey);\r\n })\r\n .join(\"&\");\r\n if (!parametersToCopy) return url;\r\n return url.indexOf(\"?\") <= 0\r\n ? `${url}?${parametersToCopy}`\r\n : `${url}&${parametersToCopy}`;\r\n}\r\n\r\nexport function getOptions(element: HTMLElement, defOptions: any = {}): any {\r\n let optionsStringFromData = element.dataset.options,\r\n optionsFromData;\r\n \r\n if (optionsStringFromData) {\r\n try {\r\n optionsFromData = JSON.parse(optionsStringFromData);\r\n } catch (e) {\r\n console.warn(\"Bad data-options for: \" + element + \" \" + element.dataset.options);\r\n }\r\n }\r\n\r\n return typeof optionsFromData === 'object'\r\n ? deepmerge(defOptions, optionsFromData)\r\n : defOptions;\r\n}\r\n\r\nexport function loadParamsFromURL(url?: string) {\r\n const historyParameter = url || location.search;\r\n let state = {};\r\n if (historyParameter !== '' && historyParameter !== undefined) {\r\n const searchParameters = new URLSearchParams(historyParameter) as any;\r\n state = Object.fromEntries(searchParameters);\r\n }\r\n\r\n return state;\r\n}\r\n\r\n// Filter helper functions\r\nexport function toggleSelection(input: HTMLInputElement, select: boolean = true): void {\r\n input.checked = select;\r\n}\r\n\r\nexport function getNamesOfInputs(inputs: FilterCheckBox[]): string[] {\r\n return inputs.sort(compareTimeStamp).map(getFilterName);\r\n}\r\n\r\nexport function compareTimeStamp(a: FilterCheckBox, b: FilterCheckBox): number {\r\n return a.timeStamp > b.timeStamp ? 1 : -1;\r\n}\r\n\r\nexport function getFilterName(element: HTMLElement): string {\r\n const node = element.nextElementSibling;\r\n return node ? node.textContent.trim() : '';\r\n}\r\n\r\nexport function getCateforyName(nameNodeSelector: string, element: HTMLElement): string {\r\n const nameNode = getSibling(element, nameNodeSelector);\r\n return nameNode ? nameNode.textContent : '';\r\n}\r\n\r\nexport function getPageScrollTop(): number {\r\n return document.documentElement.scrollTop || document.body.scrollTop;\r\n}\r\n\r\nexport const getScrollTopPosition = (scrollTop: number): number => document.documentElement.scrollHeight * scrollTop;\r\n\r\nexport const isViewPortInPosition = (scrollTop: number): boolean => getPageScrollTop() + document.documentElement.offsetHeight >= getScrollTopPosition(scrollTop);\r\n\r\nexport function setPageScrollTop(value: number): void {\r\n document.documentElement.scrollTop = document.body.scrollTop = value;\r\n}\r\n\r\n\r\n\r\n// horizontalScrolling\r\nexport function horizontalScrolling(element: HTMLElement) {\r\n let x: number,\r\n left: number,\r\n leftUp: number,\r\n down: boolean;\r\n\r\n function onMouseDown(event: MouseEvent): void {\r\n event.preventDefault();\r\n down = true;\r\n x = event.pageX;\r\n left = element.scrollLeft;\r\n\r\n document.body.addEventListener('mousemove', onBodyMouseMove);\r\n document.body.addEventListener('mouseup', onBodyMouseUp);\r\n }\r\n\r\n function onBodyMouseMove(event: MouseEvent): void {\r\n if (down) {\r\n const newX = event.pageX;\r\n element.scrollLeft = left - newX + x;\r\n }\r\n }\r\n\r\n function onBodyMouseUp(): void {\r\n document.body.removeEventListener('mousemove', onBodyMouseMove);\r\n document.body.removeEventListener('mouseup', onBodyMouseUp);\r\n down = false;\r\n leftUp = element.scrollLeft;\r\n\r\n if (left !== leftUp) window.addEventListener('click', captureClick, false);\r\n }\r\n\r\n function captureClick(event: MouseEvent): void {\r\n event.stopPropagation();\r\n event.stopImmediatePropagation();\r\n event.preventDefault();\r\n // console.log(event.type, event.target)\r\n window.removeEventListener('click', captureClick, false);\r\n }\r\n\r\n element.addEventListener('mousedown', onMouseDown);\r\n}\r\n\r\n// Cookie methods\r\nexport function setCookie(cname: string, cvalue: string, exdays?: number) {\r\n var d = new Date();\r\n d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));\r\n var expires = exdays ? 'expires=' + d.toUTCString() : '';\r\n\r\n document.cookie = cname + '=' + cvalue + '; ' + expires + ';path=/';\r\n}\r\n\r\nexport function deleteCookie(name: string) {\r\n document.cookie = name + '=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';\r\n}\r\n\r\nexport function getCookie(cname: string): string {\r\n var name = cname + '=',\r\n ca = document.cookie.split(';');\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) === ' ') {\r\n c = c.substring(1);\r\n }\r\n if (c.indexOf(name) !== -1) {\r\n return c.substring(name.length, c.length);\r\n }\r\n }\r\n return '';\r\n}\r\n\r\n// for Cookies\r\nconst getCookiesArray = () => document.cookie.split('; ');\r\n\r\nexport function getCookieValue(name: string): string {\r\n const cookies = getCookiesArray();\r\n\r\n return cookies\r\n .filter(c => c.startsWith(name))\r\n .map(c => c.split('=')[1])\r\n [0];\r\n};\r\n\r\nexport function checkCookie(name: string, checkFunc: CheckFunc = a => true) {\r\n const cookieValue = getCookie(name);\r\n return checkFunc(cookieValue);\r\n};\r\n\r\n// IOS prevent scrolling\r\nexport class IOSScroll {\r\n static prevent(visual: boolean = false, preventClass: string = 'nx-u-prevent-scroll'): void {\r\n if (!isIOS()) {\r\n document.body['preventLevel'] = document.body['preventLevel'] + 1 || 1;\r\n addClass(document.body, 'nx-u-lock-screen');\r\n return;\r\n }\r\n\r\n const scrollTop = getPageScrollTop();\r\n\r\n IOSScroll.scrollTop.unshift(IOSScroll.scrollTop.length ? IOSScroll.scrollTop[0] : scrollTop);\r\n document.body.classList.add(preventClass);\r\n setTimeout(() =>\r\n IOSScroll.setNegativeMarginTop(\r\n visual ? IOSScroll.scrollTop[0] : null\r\n ), IOSScroll.scrollTop.length > 1 ? 500 : 0);\r\n }\r\n\r\n static allow(visual: boolean = false, preventClass: string = 'nx-u-prevent-scroll'): void {\r\n if (!isIOS()) {\r\n document.body['preventLevel'] = Math.max(document.body['preventLevel'] - 1, 0);\r\n document.body['preventLevel'] === 0 && removeClass(document.body, 'nx-u-lock-screen');\r\n return;\r\n }\r\n\r\n const firstScrollTop = IOSScroll.scrollTop.shift();\r\n IOSScroll.setNegativeMarginTop(IOSScroll.scrollTop[0] || null);\r\n\r\n if (IOSScroll.scrollTop.length === 0) {\r\n document.body.classList.remove(preventClass);\r\n\r\n const hash: string = window.location.hash.substring(1);\r\n if (hash && hash.indexOf('layer') === -1 && document.getElementById(`${hash}`)) {\r\n document.getElementById(`${hash}`).scrollIntoView();\r\n } else {\r\n setPageScrollTop(firstScrollTop)\r\n }\r\n }\r\n }\r\n\r\n private static setNegativeMarginTop(value: number): void {\r\n document.body.style.marginTop = value && `-${value}px`;\r\n }\r\n\r\n static scrollTop: number[] = [];\r\n}\r\n\r\nexport function isIOS(): boolean {\r\n return /iPad|iPhone|iPod/.test(navigator.userAgent) && !window['MSStream'];\r\n}\r\n\r\nexport function isIE11(): boolean {\r\n return !!navigator.userAgent.match(/Trident.*rv\\:11\\./);\r\n}\r\n\r\nexport function isPageEditor(): boolean{\r\n return window.location.search.includes('view=page-editor') || window.location.search.includes('view=content-editor') \r\n ||window.location.search.includes('mode=edit');\r\n}\r\n\r\n\r\nexport function focusInput(input: HTMLInputElement): HTMLInputElement {\r\n let position = input.value.length;\r\n\r\n if (isIE11() && position) {\r\n input.setSelectionRange(position, position);\r\n }\r\n\r\n input.focus();\r\n\r\n return input;\r\n}\r\n\r\nexport function parseJSONSafe(json: string): any {\r\n let result = null;\r\n\r\n if (json) {\r\n try {\r\n result = JSON.parse(json);\r\n } catch (e) {\r\n console.warn(e.message, json);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nexport function cleanString(str: string): string {\r\n return str.replace(/[^\\w\\W\\s\\u00C0-\\u00FF]/gi, '');\r\n}\r\n\r\nexport function removeFromArray(arr: any[], element: any) {\r\n arr.splice(arr.indexOf(element), 1);\r\n};\r\n\r\nexport function requestNextAnimationFrame(func: () => any): number {\r\n return requestAnimationFrame(requestAnimationFrame.bind(null, func));\r\n}\r\n\r\nexport function requestAnimationFrameTimer(func: () => any, time: number = 0): void {\r\n requestAnimationFrame(\r\n () => setTimeout(\r\n () => func(),\r\n time)\r\n );\r\n}\r\n\r\nexport function limitCall(func, delay: number) {\r\n let timerId;\r\n\r\n return function (...args) {\r\n if (timerId) return;\r\n timerId = setTimeout(() => timerId = null, delay);\r\n func.apply(this, args);\r\n }\r\n}\r\n\r\nexport function getLastItemInArray(arr: any[]): any {\r\n const length = arr.length;\r\n return length > 0 ? arr[arr.length - 1] : arr[0];\r\n}\r\n\r\nexport const isBoolean = (value: any): boolean => typeof value === 'boolean';\r\nexport const isNumber = (value: any): boolean => typeof value === 'number';\r\nexport const isString = (value: any): boolean => typeof value === 'string';\r\n\r\nexport function getURLParamsArray(): string[] {\r\n return window.location.search.substring(1).split('&');\r\n}\r\n\r\nexport const getMillisecondsOfSeconds = (seconds: number = 0): number => seconds * 1000;\r\n\r\nexport const getMillisecondsOfMinutes = (minutes: number = 0): number => getMillisecondsOfSeconds(minutes * 60);\r\n\r\nexport const getMillisecondsOfHours = (hours: number = 0): number => getMillisecondsOfMinutes(hours * 60);\r\n\r\nexport const getMillisecondsOfDays = (days: number = 0): number => getMillisecondsOfHours(days * 24);\r\n\r\nexport const isNotUndefined = (...values) => values.every(v => v != undefined);\r\n\r\nexport function replaceQueryParam(param, newval, search, remove = '&') {\r\n var regex = new RegExp(\"([?;&])\" + param + \"[^&;]*[;&]?\");\r\n var query = search.replace(regex, \"$1\").replace(/&$/, '');\r\n\r\n return (query.length > 2 ? query + remove : \"?\") + (newval ? param + \"=\" + newval : '');\r\n}\r\n\r\nexport function removeQueryParam(key, sourceURL) {\r\n var rtn = sourceURL.split(\"?\")[0],\r\n param,\r\n params_arr = [],\r\n queryString = (sourceURL.indexOf(\"?\") !== -1) ? sourceURL.split(\"?\")[1] : \"\";\r\n if (queryString !== \"\") {\r\n params_arr = queryString.split(\"&\");\r\n for (var i = params_arr.length - 1; i >= 0; i -= 1) {\r\n param = params_arr[i].split(\"=\")[0];\r\n if (param === key) {\r\n params_arr.splice(i, 1);\r\n }\r\n }\r\n if (params_arr.length) rtn = rtn + \"?\" + params_arr.join(\"&\");\r\n }\r\n return rtn;\r\n}\r\n\r\nexport const isObjectEmpty = obj => Object.entries(obj).length === 0 && obj.constructor === Object;\r\n\r\nexport const isArrayEmpty = arr => Array.isArray(arr) && arr.length > 0;\r\n\r\nexport const getCurrentPageInfo = (): string => `${document.title} - ${location.origin}${location.pathname}`;\r\n\r\nexport const getAjaxURLs = (): AjaxURLs => {\r\n const configNode = document.querySelector('[data-ajax-urls]');\r\n const ajaxUrls: AjaxURLs = configNode && JSON.parse(configNode.innerHTML) || {};\r\n return ajaxUrls;\r\n}\r\n\r\nexport const checkAndInitShop = async () => {\r\n const {\r\n Context = '',\r\n FeatureAjaxUrls: {\r\n Shop: shopUrls,\r\n },\r\n } = getAjaxURLs();\r\n\r\n if (shopUrls) {\r\n const module = await import(/* webpackChunkName: \"ShopInitializer\" */'../ShopInitializer');\r\n const initShop = module.default;\r\n initShop(Context, shopUrls);\r\n };\r\n}\r\n\r\nexport const getServiceLayerUrl = (hash?: string) => {\r\n const layerName = location.hash.split('=')[1] || hash.split('=')[1];\r\n const currentUrl = encodeURIComponent(window.location.href.split(\"#\")[0]);\r\n const contextItem = window.location.href.split('~').pop();\r\n const {\r\n FeatureAjaxUrls: {\r\n Layer: ResolveLayer,\r\n },\r\n } = getAjaxURLs();\r\n\r\n let url = ResolveLayer.ResolveLayerUrl;\r\n url = url.replace(/{layerName}/gi, layerName);\r\n url = url.replace(/{currentUrl}/gi, currentUrl);\r\n if (contextItem) url.replace(/{contextItem}/gi, contextItem);\r\n\r\n return {\r\n Url: url,\r\n PostUrl: ResolveLayer.ResolveLayerPostUrl\r\n };\r\n}\r\n\r\nexport const getCartOverviewLayerUrl = () => {\r\n const {\r\n FeatureAjaxUrls: {\r\n Shop: Shop,\r\n },\r\n } = getAjaxURLs();\r\n\r\n return Shop.CartOverviewPage;\r\n}\r\n\r\nexport const constructServiceLayerRequest = (url?: string) => {\r\n const layerName = location.hash.split('=')[1];\r\n const currentUrl = window.location.href.split(\"#\")[0];\r\n\r\n let parameters = loadParamsFromURL(url);\r\n\r\n return {\r\n Layer: layerName,\r\n CurrentUrl: currentUrl,\r\n CurrentPage: parameters[\"currentpage\"]\r\n }\r\n}\r\n\r\nexport function getSizes(element: HTMLElement): ClientRect {\r\n const clientRect = (): ClientRect => element.getBoundingClientRect();\r\n\r\n return {\r\n get height(): number {\r\n return clientRect().height;\r\n },\r\n\r\n get width(): number {\r\n return clientRect().width;\r\n },\r\n\r\n get top(): number {\r\n return clientRect().top;\r\n },\r\n\r\n get bottom(): number {\r\n return clientRect().bottom;\r\n },\r\n\r\n get left(): number {\r\n return clientRect().left;\r\n },\r\n\r\n get right(): number {\r\n return clientRect().right;\r\n },\r\n\r\n get x(): number {\r\n return clientRect().x;\r\n },\r\n\r\n get y(): number {\r\n return clientRect().y;\r\n },\r\n\r\n toJSON(): any {\r\n return {\r\n height: this.height,\r\n width: this.width,\r\n top: this.top,\r\n bottom: this.bottom,\r\n left: this.left,\r\n right: this.right,\r\n x: this.x,\r\n y: this.y\r\n };\r\n }\r\n };\r\n}\r\n\r\nexport function debounce(func, wait: number) {\r\n let timerId;\r\n\r\n return function (...args) {\r\n if (timerId) {\r\n clearTimeout(timerId);\r\n timerId = null;\r\n }\r\n\r\n timerId = setTimeout(() => {\r\n func.apply(this, args);\r\n timerId = null;\r\n }, wait);\r\n }\r\n}\r\n\r\nexport function floatNumberFromString(element: any) {\r\n const regExpForFloatNumbers = /\\d+(?:.\\d+)?/;\r\n return element.match(regExpForFloatNumbers).join('');\r\n}\r\n\r\n// object = {main1:{inner11:value11, inner21:value21}, main2{inner21:value21, inner22:value22, inner32:value32}}\r\n// parseObjectByPath(object, 'main1.inner11') // value11\r\n// parseObjectByPath(object, 'main2.inner22') // value22\r\nexport function parseObjectByPath(object: object, path: string) {\r\n return path.split('.').reduce((oldValue, newValue) => {\r\n return oldValue ? oldValue[newValue] : null\r\n }, object || self)\r\n}\r\n\r\nexport function isSelectorValid(selector) {\r\n const queryCheck = s => document.createDocumentFragment().querySelector(s)\r\n try { queryCheck(selector) } catch { return false }\r\n return true\r\n}\r\n\r\nexport function startSpinner() {\r\n const item: HTMLElement = document.body.querySelector('main'),\r\n extraClass: string = 'nx-u-spinner--fixed';\r\n\r\n addClasses(item, 'nx-u-spinner', 'nx-u-spinner--medium', extraClass);\r\n}\r\n\r\nexport function stopSpinner() {\r\n const item: HTMLElement = document.body.querySelector('main'),\r\n extraClass: string = 'nx-u-spinner--fixed';\r\n\r\n removeClasses(item, 'nx-u-spinner', 'nx-u-spinner--medium', extraClass);\r\n}\r\n\r\nexport function checkMobileOrDesktop() {\r\n return window.innerWidth < 768;\r\n}\r\n\r\nexport function checkMobileTabletOrDesktop() {\r\n return window.innerWidth < 1024;\r\n}\r\n\r\nexport function getYouTubeVideoIdFromUrl(url) {\r\n var regExp = /^.*(youtu\\.be\\/|v\\/|u\\/\\w\\/|shorts\\/|embed\\/|watch\\?v=|\\&v=)([^#\\&\\?]*).*/;\r\n var match = url.match(regExp);\r\n return (match && match[2].length >= 11) ? match[2] : '';\r\n}","/// \r\n\r\nexport async function trackPurchase(cartState: any, orderId: string) {\r\n cartState = JSON.parse(cartState);\r\n const countryCode = dataLayer[0].pageCountry;\r\n const { AmountToPayDecimal, DeliveryCostDecimal, TotalTaxDecimal, CurrencyCode } = cartState.Summary;\r\n const coupon: string = cartState.Promotions.length > 0 ? cartState.Promotions.map(a => `${Object.values(a).join(', ')}`).join(', ') : '';\r\n const brand: string = dataLayer[0].hasOwnProperty('brand') ? dataLayer[0].brand : 'Nivea';\r\n\r\n const products = cartState.Items.map((item) => {\r\n const coupon: string = item.Promotions.length > 0 ? item.Promotions.join(', ') : '';\r\n const category: string = !!item.Category ? item.Category : '';\r\n\r\n let cartItemTrackObj = {\r\n 'name': item.ProductName,\r\n 'id': item.ProductId,\r\n 'price': getPriceValue(item.ProductPrice),\r\n 'brand': brand,\r\n 'category': category,\r\n 'variant': item.ProductSize,\r\n 'quantity': item.Quantity,\r\n 'coupon': coupon,\r\n }\r\n\r\n return cartItemTrackObj;\r\n });\r\n\r\n dataLayer.push({\r\n event: 'purchase',\r\n currencyCode: CurrencyCode,\r\n ecommerce: {\r\n purchase: {\r\n actionField: {\r\n id: orderId,\r\n affiliation: 'eShop ' + countryCode,\r\n revenue: AmountToPayDecimal,\r\n tax: TotalTaxDecimal,\r\n shipping: DeliveryCostDecimal,\r\n coupon: coupon,\r\n },\r\n products,\r\n }\r\n }\r\n });\r\n}\r\n\r\nexport function trackPhototinUpload() {\r\n dataLayer.push({\r\n event: 'ga_event',\r\n eventCategory: 'Make It Yours',\r\n eventAction: 'Photo Upload'\r\n });\r\n}\r\n\r\nexport function trackPhototinAddMessage(message) {\r\n dataLayer.push({\r\n event: 'ga_event',\r\n eventCategory: 'Make It Yours',\r\n eventAction: 'Message Selection',\r\n eventLabel: message\r\n });\r\n}\r\n\r\nexport function trackPhototinAddToCart() {\r\n const currencyCode = dataLayer[0].hasOwnProperty('currencyCode') ? dataLayer[0].currencyCode : '',\r\n productNameNode: HTMLElement = document.querySelector('h1.nx-product-stage__headline'),\r\n productName: string = productNameNode !== null ? productNameNode.innerText : '',\r\n addToCartNode: HTMLElement = document.querySelector('.nx-add-to-cart') as HTMLElement,\r\n id: string = addToCartNode.dataset.productId,\r\n productCategory: string = dataLayer[0].hasOwnProperty('category') ? dataLayer[0].category : '',\r\n productVariantNode: HTMLElement = document.querySelector('.nx-product-stage .nx-pas__product-attribute:last-child'),\r\n productVariant: string = productVariantNode !== null ? productVariantNode.innerHTML : '',\r\n price: string = addToCartNode.querySelector('.nx-price').innerHTML,\r\n quantity: string = document.querySelector('.nx-range-dropdown__label-value').textContent;\r\n\r\n dataLayer.push({\r\n event: 'addToCart',\r\n ecommerce: {\r\n currencyCode: currencyCode,\r\n add: {\r\n buttonType: 'AddToCartButton',\r\n products: [{\r\n 'name': productName,\r\n 'id': id,\r\n 'price': getPriceValue(price),\r\n 'brand': 'Nivea',\r\n 'category': productCategory,\r\n 'variant': productVariant,\r\n 'quantity': quantity,\r\n }]\r\n }\r\n }\r\n });\r\n}\r\n\r\nexport function trackAlpacaFormsError(form: any) {\r\n let serverSideErrorArray = Array.from(form.querySelectorAll('.server-side-error'));\r\n if (serverSideErrorArray && serverSideErrorArray.length < 1) return;\r\n\r\n let formName: string = form.dataset.name;\r\n let id: string = form.id;\r\n let serverSideErrorMessages = [];\r\n serverSideErrorArray.forEach((element: HTMLElement) => serverSideErrorMessages.push(element.innerHTML));\r\n\r\n dataLayer.push({\r\n event: 'ga_event',\r\n eventCategory: 'Form Error',\r\n eventAction: `${formName} - ${id}`,\r\n eventLabel: serverSideErrorMessages.join()\r\n });\r\n\r\n}\r\n\r\nexport function trackEvent(eventCategory: string, eventAction: string, eventLabel: string, event?: Event): any {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: eventCategory,\r\n eventAction: eventAction,\r\n eventLabel: eventLabel,\r\n eventNonInteraction: false\r\n });\r\n}\r\n\r\nexport function addLayer(options: DataLayerG4Options): any {\r\n if (typeof window.dataLayer == 'undefined' || !window.dataLayer) {\r\n console.warn(\"dataLayer is not defined or not loaded\");\r\n return;\r\n }\r\n\r\n if (window.dataLayer) window.dataLayer.push(options);\r\n}\r\n\r\nexport function getClickedElementIndex(itemList: NodeListOf, item: HTMLElement): number {\r\n let index: number = Array.from(itemList).indexOf(item);\r\n return index + 1;\r\n}\r\n\r\nexport function getLinkElementHref(event: MouseEvent, selector: string, property: string = 'href') {\r\n let target: HTMLElement = event.target,\r\n element: HTMLAnchorElement = target.closest(selector),\r\n isBlank = (element['target'] == \"_blank\") ? true : false;\r\n\r\n return {\r\n \"isBlank\": isBlank,\r\n \"href\": element[property]\r\n }\r\n}\r\n\r\nexport function trackSliderMovement(eventAction: string, eventLabel: string = '') {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: 'Teaser',\r\n eventAction: eventAction,\r\n eventLabel: eventLabel.length > 0 ? eventLabel : undefined,\r\n eventNonInteraction: false\r\n });\r\n}\r\n\r\nexport function trackTeaserClick(eventCategory: string, eventAction: string, destinationUrl: any) {\r\n addLayer({\r\n event: 'ga_event',\r\n eventCategory: eventCategory,\r\n eventAction: eventAction,\r\n eventLabel: destinationUrl.href,\r\n });\r\n\r\n if (!destinationUrl.isBlank) { document.location = destinationUrl.href; }\r\n}\r\n\r\nexport function getActionFieldTracking(item: HTMLElement, checkSliders: boolean = false) {\r\n const isSlider = item.closest('.nx-slider') ? true : false;\r\n let actionFieldValue: string;\r\n if (isSlider && checkSliders) {\r\n actionFieldValue = item.closest('section').querySelector('h2') as HTMLElement ? (item.closest('section').querySelector('h2') as HTMLElement).innerText : ``;\r\n } else {\r\n actionFieldValue = document.querySelector('.nx-breadcrumb__list').lastElementChild as HTMLElement ? (document.querySelector('.nx-breadcrumb__list').lastElementChild as HTMLElement).innerText : ``;\r\n }\r\n return actionFieldValue;\r\n}\r\n\r\nexport function getCurrencyCode(): string {\r\n if (window.dataLayer) return dataLayer[0].hasOwnProperty('currencyCode') ? dataLayer[0].currencyCode : '';\r\n}\r\n\r\nexport function productTeaserTrackingObject(teasers: NodeListOf, attachClickTracking: boolean = false, excludeShownTeasers?: NodeListOf) {\r\n if (!excludeShownTeasers) {\r\n excludeShownTeasers = teasers;\r\n }\r\n\r\n const teasersArray = Object.entries(teasers).map((teaserNode) => {\r\n const name: string = teaserNode[1].getAttribute('data-name') ? teaserNode[1].getAttribute('data-name') : '',\r\n prodId: string = teaserNode[1].getAttribute('data-product-id') ? teaserNode[1].getAttribute('data-product-id') : '',\r\n price: number = teaserNode[1].getAttribute('data-product-price') ? getPriceValue(teaserNode[1].getAttribute('data-product-price')) : undefined,\r\n brand: string = teaserNode[1].getAttribute('data-brand') ? teaserNode[1].getAttribute('data-brand') : '',\r\n category: string = teaserNode[1].getAttribute('data-category') ? teaserNode[1].getAttribute('data-category') : '',\r\n variant: string = teaserNode[1].getAttribute('data-product-variant') ? teaserNode[1].getAttribute('data-product-variant') : '',\r\n position: number = Array.from(excludeShownTeasers).indexOf(teaserNode[1]) + 1,\r\n list: string = getActionFieldTracking(teaserNode[1], true);\r\n\r\n const teaserItemTrackObj = {\r\n 'id': prodId,\r\n 'name': name,\r\n 'brand': brand,\r\n 'category': category,\r\n 'variant': variant,\r\n 'position': position,\r\n 'price': price ? price.toFixed(2) : ''\r\n }\r\n\r\n teaserNode[1].classList.add('nx-product-shown');\r\n\r\n if (attachClickTracking) {\r\n const teaserNodeLink: HTMLElement = teaserNode[1].querySelector('a');\r\n productClickHandler(teaserNodeLink, teaserItemTrackObj, list);\r\n }\r\n\r\n return { ...teaserItemTrackObj, 'list': list };\r\n });\r\n \r\n return teasersArray;\r\n}\r\n\r\nexport function productClickHandler(teaserNodeLink: HTMLElement, product: Object, list: string) {\r\n teaserNodeLink.addEventListener('click', event => {\r\n event.preventDefault();\r\n const url: string = teaserNodeLink.getAttribute('href');\r\n productClickPush(product, list, url);\r\n });\r\n}\r\n\r\nexport function productClickPush(product: Object, list: string, url: any) {\r\n addLayer({\r\n event: 'productClick',\r\n ecommerce: {\r\n click: {\r\n actionField: { 'list': list },\r\n currencyCode: getCurrencyCode(),\r\n products: [product]\r\n }\r\n }\r\n });\r\n\r\n url ? document.location = url : \"\";\r\n}\r\n\r\nexport function floatNumberFromString(element: any) {\r\n const regExpForFloatNumbers = /\\d+(?:.\\d+)?/;\r\n return element.match(regExpForFloatNumbers).join('');\r\n}\r\n\r\nexport function getPriceValue(item: any) {\r\n let price = floatNumberFromString(item);\r\n price = price.replace(/,/g, \".\");\r\n\r\n return parseFloat(price);\r\n}\r\n\r\nexport function hasDataTracking(data) {\r\n if (data.tracking) {\r\n trackData(data.tracking)\r\n }\r\n}\r\n\r\nexport function trackData(trakingList) {\r\n if (!trakingList) return;\r\n\r\n trakingList.forEach(item => {\r\n const triggerOption = item.Ttrigger;\r\n switch (triggerOption) {\r\n case \"FormSubmitted\":\r\n addLayer(item.Tevent);\r\n break;\r\n default:\r\n console.log(\"No tracking set up for this event \" + triggerOption + \".\");\r\n }\r\n })\r\n\r\n}\r\n\r\n\r\n\r\n","import PhotoTinMipMapLevel from \"./PhotoTinMipMapLevel\";\r\n\r\nexport default class PhotoTinMipMap {\r\n levels: PhotoTinMipMapLevel[];\r\n width: number;\r\n height: number;\r\n canvasImage: any\r\n orientationState = [1, 6, 3, 8];\r\n currentOriantationIdx: number\r\n\r\n\r\n constructor(imgSrc: string, orientation: number, callback: () => void) {\r\n this.levels = [];\r\n\r\n this.canvasImage = new Image();\r\n this.canvasImage.onload = () => this.generate(this.canvasImage, orientation, callback);\r\n this.canvasImage.src = imgSrc;\r\n\r\n this.currentOriantationIdx = this.orientationState.findIndex(e => e == orientation);\r\n }\r\n\r\n generate(img: HTMLImageElement, orientation: number, callback: () => void): void {\r\n var oc = document.createElement('canvas'),\r\n oCtx = oc.getContext('2d'),\r\n steps: number;\r\n\r\n if (orientation == 6 || orientation == 8) {\r\n oc.width = img.height;\r\n oc.height = img.width;\r\n } else {\r\n oc.width = img.width;\r\n oc.height = img.height;\r\n }\r\n\r\n this.width = oc.width;\r\n this.height = oc.height;\r\n\r\n oCtx = this.rotateCanvasContext(oCtx, orientation, oc.width, oc.height);\r\n oCtx.drawImage(img, 0, 0);\r\n\r\n this.levels = [];\r\n this.levels.push(new PhotoTinMipMapLevel(oc.width, oc.height, oc));\r\n\r\n steps = this.getSteps(oc.width, oc.width * .1);\r\n this.generateLevel(oc, steps);\r\n\r\n //this.log();\r\n callback();\r\n }\r\n\r\n rotateCanvasContext(oCtx: CanvasRenderingContext2D, orientation: number, w: number, h: number): CanvasRenderingContext2D {\r\n var degreesToRotate: number,\r\n x: number, y: number;\r\n\r\n switch (orientation) {\r\n case 6:\r\n degreesToRotate = 90;\r\n x = h / 2;\r\n y = w / 2;\r\n break;\r\n case 3:\r\n degreesToRotate = 180;\r\n x = w / 2;\r\n y = h / 2;\r\n break;\r\n case 8:\r\n degreesToRotate = 270;\r\n x = h / 2;\r\n y = w / 2;\r\n break;\r\n case 1:\r\n default:\r\n degreesToRotate = 0;\r\n x = w / 2;\r\n y = h / 2;\r\n }\r\n\r\n oCtx.translate(w / 2, h / 2);\r\n oCtx.rotate(degreesToRotate * Math.PI / 180);\r\n oCtx.translate(-x, -y);\r\n\r\n return oCtx;\r\n }\r\n\r\n rotateCanvasImage(rotateClockwise, callback) {\r\n this.generate(this.canvasImage, this.getNextOrientation(rotateClockwise), callback);\r\n }\r\n\r\n getNextOrientation(rotateClockwise) {\r\n\r\n let orientation;\r\n if (rotateClockwise == true) {\r\n orientation = this.orientationState[this.currentOriantationIdx + 1];\r\n this.currentOriantationIdx += 1;\r\n if (this.orientationState.length == this.currentOriantationIdx) {\r\n orientation = this.orientationState[0];\r\n this.currentOriantationIdx = 0;\r\n }\r\n } else {\r\n orientation = this.orientationState[this.currentOriantationIdx - 1];\r\n this.currentOriantationIdx -= 1;\r\n if (this.currentOriantationIdx < 0) {\r\n orientation = this.orientationState[this.orientationState.length - 1];\r\n this.currentOriantationIdx = this.orientationState.length - 1;\r\n }\r\n\r\n }\r\n\r\n return orientation;\r\n }\r\n\r\n getSteps(sourceWidth: number, targetWidth: number): number {\r\n return Math.ceil(Math.log(sourceWidth / targetWidth) / Math.log(2));\r\n }\r\n\r\n generateLevel(oc, steps): void {\r\n var tempC = document.createElement('canvas'),\r\n tempCtx = tempC.getContext('2d'),\r\n width = oc.width,\r\n height = oc.height,\r\n levelWidth = Math.floor(width * .5),\r\n levelHeight = Math.floor(height * .5);\r\n\r\n tempC.width = levelWidth;\r\n tempC.height = levelHeight;\r\n\r\n tempCtx.drawImage(oc, 0, 0, width, height, 0, 0, levelWidth, levelHeight);\r\n\r\n this.levels.push(new PhotoTinMipMapLevel(tempC.width, tempC.height, tempC));\r\n\r\n if (steps > 1) {\r\n this.generateLevel(tempC, steps - 1);\r\n }\r\n }\r\n\r\n getMipMap(pixelSize: number): PhotoTinMipMapLevel {\r\n var bestLevel = 0;\r\n\r\n for (var i = 1; i < this.levels.length; i++) {\r\n var levelPixelSize = this.levels[i].width / this.width;\r\n if (levelPixelSize >= pixelSize) {\r\n bestLevel = i;\r\n }\r\n }\r\n\r\n return this.levels[bestLevel];\r\n }\r\n\r\n\r\n log(): void {\r\n document.body.style.backgroundColor = 'dimgray';\r\n\r\n for (var i = 0; i < this.levels.length; i++) {\r\n var _ = new Image();\r\n _.onload = this.appendLevel(_);\r\n _.src = this.levels[i].canvas.toDataURL();\r\n }\r\n }\r\n\r\n appendLevel(_: HTMLImageElement) {\r\n return () => {\r\n document.body.appendChild(_);\r\n }\r\n }\r\n}\r\n","var map = {\n\t\"./AlpacaExtension.ts\": 92466,\n\t\"./PhotoTin.ts\": 83338,\n\t\"./PhotoTinMipMap.ts\": 23346,\n\t\"./PhotoTinMipMapLevel.ts\": 7378\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 67846;","import AlpacaExtension from './AlpacaExtension';\r\n\r\nimport PhotoTinMipMap from \"./PhotoTinMipMap\";\r\n\r\nimport { IOSScroll, isIOS } from '../../helpers/helperFunctions';\r\nimport { trackPhototinUpload, trackPhototinAddMessage, trackPhototinAddToCart } from '../../ClassWithTracking/helpers';\r\n\r\nclass PhotoTin extends AlpacaExtension {\r\n static extName: string = 'PhotoTin';\r\n\r\n browseFileButton: HTMLElement;\r\n inner: HTMLElement;\r\n canvas: HTMLCanvasElement;\r\n zoomField: HTMLInputElement;\r\n btnZoomIn: HTMLButtonElement;\r\n btnZoomOut: HTMLButtonElement;\r\n fileInput: HTMLInputElement;\r\n errorField: HTMLElement;\r\n addToCartSection: HTMLElement;\r\n legalCheckbox: HTMLInputElement;\r\n submitButton: HTMLElement;\r\n rotateButtonLeft: HTMLButtonElement;\r\n rotateButtonRight: HTMLButtonElement;\r\n\r\n photo: PhotoTinMipMap;\r\n\r\n message: PhotoTinMipMap;\r\n\r\n canvasSizes: ICanvasSizes;\r\n\r\n tinToCanvas: number[];\r\n photoToTin: number[];\r\n\r\n zoomTimerHandler: number;\r\n prevZoomTime: Date;\r\n zoomDirection: number;\r\n\r\n prevDragPosX: number;\r\n prevDragPosY: number;\r\n\r\n tinVirtualWidth = 200;\r\n tinVirtualHeight = 200;\r\n\r\n backgroundColor: string;\r\n\r\n dragEndHandler;\r\n dragHandler;\r\n\r\n isEShopContext = false;\r\n\r\n pinchState = {\r\n start1: [],\r\n start2: [],\r\n end1: [],\r\n end2: []\r\n }\r\n\r\n init() {\r\n this.initHtmlElements();\r\n this.bindEventListeners();\r\n\r\n this.backgroundColor = this.element.dataset['background-color'] || '#00136f';\r\n this.canvasSizes = {\r\n S: { width: 213, height: 213 },\r\n M: { width: 295, height: 295 },\r\n L: { width: 538, height: 360 },\r\n XL: { width: 794, height: 450 }\r\n };\r\n\r\n window.breakpoints = {\r\n XSMALL: 640,\r\n SMALL: 768,\r\n MEDIUM: 1024,\r\n LARGE: 1280\r\n };\r\n\r\n this.resize();\r\n\r\n const messages = this.element.querySelector('[name=\"message\"]') as HTMLSelectElement;\r\n messages.addEventListener('change', this.addMessage());\r\n messages.selectedIndex = 0;\r\n messages.dispatchEvent(new CustomEvent('change', { detail: { tackMessageChange: false } }));\r\n\r\n this.tinToCanvas = this.createTinToCanvasMatrix(this.getXPosition(), 0, this.canvas.height);\r\n\r\n this.dragEndHandler = this.dragEnd.bind(this);\r\n this.dragHandler = this.drag.bind(this);\r\n this.isEShopContext = this.addToCartSection != null;\r\n this.unsetFormOverflow();\r\n }\r\n\r\n initHtmlElements() {\r\n this.browseFileButton = this.element.querySelector(\".nx-browse-file-button\") as HTMLElement;\r\n this.errorField = this.element.querySelector('.nx-error') as HTMLElement;\r\n this.inner = this.element.querySelector('.nx-phototin-inner') as HTMLElement;\r\n this.canvas = this.element.querySelector('canvas');\r\n this.zoomField = this.element.querySelector('.nx-zoom-field') as HTMLInputElement;\r\n this.btnZoomIn = this.element.querySelector('.nx-zoom-in') as HTMLButtonElement;\r\n this.btnZoomIn.disabled = true;\r\n this.btnZoomOut = this.element.querySelector('.nx-zoom-out') as HTMLButtonElement;\r\n this.btnZoomOut.disabled = true;\r\n this.fileInput = this.element.querySelector('.nx-upload') as HTMLInputElement;\r\n this.addToCartSection = document.querySelector('.nx-add-to-cart') as HTMLElement;\r\n this.legalCheckbox = document.querySelector('.nx-photo-tin-legal-checkbox') as HTMLInputElement;\r\n this.submitButton = this.getSubmitButton() as HTMLButtonElement;\r\n this.rotateButtonLeft = this.element.querySelector('.nx-phototin__rotate-btn--left') as HTMLButtonElement;\r\n this.rotateButtonLeft.disabled = true;\r\n this.rotateButtonRight = this.element.querySelector('.nx-phototin__rotate-btn--right') as HTMLButtonElement;\r\n this.rotateButtonRight.disabled = true;\r\n\r\n }\r\n\r\n bindEventListeners() {\r\n document.addEventListener('nivea:window:afterResize', () => {\r\n this.resize();\r\n this.tinToCanvas = this.createTinToCanvasMatrix(this.getXPosition(), 0, this.canvas.height);\r\n this.redrawPreview();\r\n });\r\n\r\n this.browseFileButton.addEventListener(\"click\", event => this.openDialog(event));\r\n this.btnZoomIn.addEventListener('mousedown', event => this.startZoom(event, +1));\r\n this.btnZoomIn.addEventListener('touchstart', event => this.startZoom(event, +1), { passive: true });\r\n this.btnZoomIn.addEventListener('mouseleave', (event) => this.endZoom(event));\r\n this.btnZoomIn.addEventListener('mouseup', (event) => this.endZoom(event));\r\n this.btnZoomIn.addEventListener('touchend', (event) => this.endZoom(event));\r\n this.btnZoomIn.addEventListener('touchleave', (event) => this.endZoom(event));\r\n this.btnZoomOut.addEventListener('mousedown', event => this.startZoom(event, -1));\r\n this.btnZoomOut.addEventListener('touchstart', event => this.startZoom(event, -1), { passive: true });\r\n this.btnZoomOut.addEventListener('mouseleave', (event) => this.endZoom(event));\r\n this.btnZoomOut.addEventListener('mouseup', (event) => this.endZoom(event));\r\n this.btnZoomOut.addEventListener('touchend', (event) => this.endZoom(event));\r\n this.btnZoomOut.addEventListener('touchleave', (event) => this.endZoom(event));\r\n this.canvas.addEventListener('mousedown', this.dragStart());\r\n this.canvas.addEventListener('touchstart', this.dragStart(), { passive: true });\r\n\r\n\r\n this.fileInput.addEventListener(\"change\", this.uploadPhoto());\r\n this.rotateButtonRight.addEventListener('click', (e) => this.applyRotate(e, 1));\r\n this.rotateButtonLeft.addEventListener('click', (e) => this.applyRotate(e, -1));\r\n this.addToCartSection?.addEventListener(\"click\", (e) => {\r\n const target = e.target as HTMLElement;\r\n const button = target.closest(\".nx-add-to-cart .nx-btn\");\r\n const flag = target.closest(\".nx-add-to-cart-flag\");\r\n const mobileButton = target.closest(\".nx-add-to-cart-mobile-trigger\");\r\n if (button || flag || mobileButton) this.handleAddToCartClick(e);\r\n });\r\n if (this.legalCheckbox) this.legalCheckbox.addEventListener('click', () => this.hideLegalError());\r\n\r\n window.NiveaX.AlpacaListener.subscribe('init', event => (event).detail.form.registerCustomDataHandler('refreshCart', async () => {\r\n this.hideAddToCartSection();\r\n trackPhototinAddToCart();\r\n }));\r\n\r\n document.addEventListener('Nivea:AddToCard:allowBtnClicking', () => {\r\n const addToCardBtns = document.querySelectorAll('div[data-eshop=\"AddToCartPDP\"] button.nx-btn[disabled]');\r\n this.allowUserClicking(addToCardBtns)\r\n })\r\n }\r\n\r\n getXPosition(): number {\r\n return (this.canvas.width - this.canvas.height) / 2;\r\n }\r\n\r\n createTinToCanvasMatrix(x: number, y: number, size: number) {\r\n return [x, y, size / this.tinVirtualWidth];\r\n }\r\n\r\n createPhotoToTinMatrix(w: number, h: number) {\r\n var size = Math.min(w, h);\r\n return this.mulMatrix(this.invertMatrix([w * 0.5, h * 0.5, size / this.tinVirtualWidth]), this.matrixFromTranslation([this.tinVirtualHeight * 0.5, this.tinVirtualHeight * 0.5]));\r\n }\r\n\r\n uploadPhoto(): (event) => void {\r\n var fileReader = new FileReader(),\r\n file: File;\r\n\r\n return (event) => {\r\n const htmlInputElement = event.currentTarget as HTMLInputElement;\r\n trackPhototinUpload();\r\n\r\n if (!htmlInputElement.value.length) {\r\n return;\r\n }\r\n\r\n if (!this.isValidExtension(htmlInputElement)) {\r\n this.showErrorField(this.element.dataset.notValidError);\r\n return;\r\n }\r\n\r\n const fileList = htmlInputElement.files;\r\n\r\n if (!fileList || !fileList.length) {\r\n return;\r\n }\r\n\r\n file = fileList[0];\r\n this.errorField.classList.add('nx-hidden');\r\n if (file.type !== 'image/jpeg' && file.type !== 'image/jpg') {\r\n fileReader.onload = event => this.addPhoto(1, event.target as FileReader);\r\n fileReader.readAsDataURL(file);\r\n\r\n } else {\r\n fileReader.onload = () => this.getOrientation(fileReader, (orientation: number) => {\r\n if (orientation === -1 || orientation === -2) {\r\n orientation = 1;\r\n }\r\n\r\n fileReader.onload = () => this.addPhoto(orientation, fileReader);\r\n fileReader.readAsDataURL(file);\r\n });\r\n fileReader.readAsArrayBuffer(file);\r\n }\r\n\r\n };\r\n }\r\n\r\n showErrorField(errorMsg: string): void {\r\n this.errorField.nodeValue = errorMsg;\r\n this.errorField.classList.remove('nx-hidden');\r\n }\r\n\r\n isValidExtension(fileInput: HTMLInputElement): boolean {\r\n return /(\\.jpg|jpeg|png|gif|bmp)$/i.test(fileInput.value.toLowerCase());\r\n }\r\n\r\n getOrientation(fileReader: FileReader, callback) {\r\n var view = new DataView(fileReader.result),\r\n length,\r\n offset,\r\n marker,\r\n little,\r\n tags;\r\n\r\n if (view.getUint16(0, false) != 0xFFD8) {\r\n return callback(-2);\r\n }\r\n\r\n length = view.byteLength;\r\n offset = 2;\r\n\r\n while (offset < length) {\r\n marker = view.getUint16(offset, false);\r\n offset += 2;\r\n\r\n if (marker == 0xFFE1) {\r\n if (view.getUint32(offset += 2, false) != 0x45786966) {\r\n return callback(-1);\r\n }\r\n\r\n little = view.getUint16(offset += 6, false) == 0x4949;\r\n offset += view.getUint32(offset + 4, little);\r\n tags = view.getUint16(offset, little);\r\n offset += 2;\r\n\r\n for (var i = 0; i < tags; i++) {\r\n if (view.getUint16(offset + (i * 12), little) == 0x0112) {\r\n return callback(view.getUint16(offset + (i * 12) + 8, little));\r\n }\r\n }\r\n }\r\n else if ((marker & 0xFF00) != 0xFF00) {\r\n break;\r\n } else {\r\n offset += view.getUint16(offset, false);\r\n }\r\n }\r\n\r\n return callback(-1);\r\n }\r\n\r\n addPhoto(orientation: number, fileReader: FileReader) {\r\n var photo = new PhotoTinMipMap(fileReader.result.toString(), orientation, () => {\r\n this.photoToTin = this.createPhotoToTinMatrix(photo.width, photo.height);\r\n this.photo = photo;\r\n this.applyBounds();\r\n this.updateZoomLabel();\r\n this.redrawPreview();\r\n\r\n this.btnZoomIn.disabled = false;\r\n this.btnZoomOut.disabled = false;\r\n this.rotateButtonLeft.disabled = false;\r\n this.rotateButtonRight.disabled = false;\r\n\r\n this.inner.classList.add(\"nx-image-loaded\");\r\n });\r\n }\r\n\r\n addMessage(): (event) => void {\r\n let imgSrc: string;\r\n\r\n return (event) => {\r\n const selectedOption = (event.currentTarget as HTMLSelectElement).selectedOptions[0];\r\n\r\n if (selectedOption) {\r\n imgSrc = selectedOption.value;\r\n }\r\n\r\n if (!imgSrc || !imgSrc.length) {\r\n return;\r\n }\r\n\r\n if (!(event).detail)\r\n trackPhototinAddMessage(selectedOption.innerText);\r\n\r\n var message = new PhotoTinMipMap(imgSrc, 1, () => {\r\n this.message = message;\r\n this.redrawPreview();\r\n });\r\n };\r\n }\r\n\r\n mulMatrix(a: number[], b: number[]): number[] {\r\n return [a[0] * b[2] + b[0], a[1] * b[2] + b[1], a[2] * b[2]];\r\n }\r\n\r\n applyMatrix(point: number[], b: number[]): number[] {\r\n return [point[0] * b[2] + b[0], point[1] * b[2] + b[1]];\r\n }\r\n\r\n invertMatrix(a: number[]): number[] {\r\n return [-a[0] / a[2], - a[1] / a[2], 1 / a[2]];\r\n }\r\n\r\n matrixFromTranslation(point: number[]): number[] {\r\n return [point[0], point[1], 1];\r\n }\r\n\r\n matrixFromZoom(z: number): number[] {\r\n return [0, 0, z];\r\n }\r\n\r\n applyMatrixToCanvas(ctx: CanvasRenderingContext2D, a: number[]) {\r\n\r\n ctx.transform(a[2], 0, 0, a[2], a[0], a[1]);\r\n }\r\n\r\n drawImage(ctx: CanvasRenderingContext2D, image: PhotoTinMipMap, pixelSize: number) {\r\n ctx.save();\r\n var mipMap = image.getMipMap(pixelSize);\r\n var scale = image.width / mipMap.width;\r\n ctx.scale(scale, scale);\r\n ctx.drawImage(mipMap.canvas, 0, 0);\r\n ctx.restore();\r\n }\r\n\r\n drawTinCircle(ctx: CanvasRenderingContext2D) {\r\n ctx.beginPath();\r\n ctx.arc(this.tinVirtualWidth * 0.5, this.tinVirtualHeight * 0.5, this.tinVirtualWidth * 0.5, 0, 2 * Math.PI);\r\n }\r\n\r\n drawTin(ctx: CanvasRenderingContext2D, tinToCanvas: number[], drawOutside: boolean): void {\r\n ctx.save();\r\n var photoToTin = this.photoToTin;\r\n\r\n this.applyMatrixToCanvas(ctx, tinToCanvas);\r\n\r\n if (drawOutside && this.photo) {\r\n // photo\r\n ctx.save();\r\n this.applyMatrixToCanvas(ctx, photoToTin);\r\n ctx.globalAlpha = .25;\r\n this.drawImage(ctx, this.photo, (tinToCanvas[2] * photoToTin[2]));\r\n ctx.restore();\r\n }\r\n\r\n // blue Background\r\n\r\n ctx.fillStyle = this.backgroundColor;\r\n this.drawTinCircle(ctx);\r\n ctx.fill();\r\n\r\n // photo in the Tin\r\n if (this.photo) {\r\n ctx.save();\r\n this.drawTinCircle(ctx);\r\n ctx.clip();\r\n this.applyMatrixToCanvas(ctx, photoToTin);\r\n this.drawImage(ctx, this.photo, (tinToCanvas[2] * photoToTin[2]));\r\n ctx.restore();\r\n }\r\n\r\n // overlay\r\n\r\n if (this.message) {\r\n ctx.save();\r\n var scale = this.tinVirtualWidth / this.message.width;\r\n ctx.scale(scale, scale);\r\n this.drawImage(ctx, this.message, (tinToCanvas[2] * scale));\r\n ctx.restore();\r\n }\r\n\r\n // white ring\r\n\r\n this.drawTinCircle(ctx);\r\n ctx.lineWidth = 1;\r\n ctx.strokeStyle = '#fff';\r\n ctx.stroke();\r\n ctx.closePath();\r\n\r\n\r\n ctx.restore();\r\n }\r\n // draw phototin preview in frontend \r\n redrawPreview(): void {\r\n let ctx = this.canvas.getContext('2d');\r\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\r\n this.drawTin(ctx, this.tinToCanvas, true);\r\n\r\n // logs of created images\r\n\r\n // let pt = document.getElementById('photo-tin');\r\n\r\n // let finalPT = new Image();\r\n // let thumbNail = new Image();\r\n\r\n // finalPT.src = this.export();\r\n // thumbNail.src = this.exportThumbnail();\r\n\r\n // pt.appendChild(finalPT);\r\n // pt.appendChild(thumbNail);\r\n }\r\n\r\n resize(): void {\r\n const winWidth: number = window.outerWidth;\r\n\r\n switch (true) {\r\n case (winWidth < window.breakpoints.SMALL):\r\n this.canvas.height = this.canvasSizes.S.height;\r\n // this.stage.width = this.inner.width;\r\n break;\r\n case (winWidth < window.breakpoints.MEDIUM):\r\n this.canvas.height = this.canvasSizes.M.height;\r\n // this.stage.width = this.inner.width();\r\n break;\r\n case (winWidth < window.breakpoints.LARGE):\r\n this.canvas.height = this.canvasSizes.L.height;\r\n this.canvas.width = this.canvasSizes.L.width;\r\n break;\r\n default:\r\n this.canvas.height = this.canvasSizes.XL.height;\r\n this.canvas.width = this.canvasSizes.XL.width;\r\n }\r\n }\r\n\r\n dragStart() {\r\n let isTouchEvent: boolean,\r\n touches: TouchList,\r\n startX: number,\r\n startY: number;\r\n\r\n return (event) => {\r\n event.stopImmediatePropagation();\r\n\r\n if (!this.photo || event.target !== this.canvas) {\r\n return;\r\n }\r\n\r\n isTouchEvent = event.type === 'touchstart' || event.type === 'touchmove';\r\n touches = (event as TouchEvent).touches;\r\n\r\n\r\n\r\n if (isTouchEvent) {\r\n document.querySelector(\"html\").classList.add('nx-lock');\r\n\r\n if (touches && touches.length === 2) {\r\n this.pinchState.start1 = [touches[0].clientX, touches[0].clientY];\r\n this.pinchState.start2 = [touches[1].clientX, touches[1].clientY];\r\n this.pinchState.end1 = [touches[0].clientX, touches[0].clientY];\r\n this.pinchState.end2 = [touches[1].clientX, touches[1].clientY];\r\n }\r\n }\r\n\r\n startX = isTouchEvent && touches ? touches[0].clientX : event.clientX;\r\n startY = isTouchEvent && touches ? touches[0].clientY : event.clientY;\r\n\r\n this.prevDragPosX = startX;\r\n this.prevDragPosY = startY;\r\n\r\n document.addEventListener('mousemove', this.dragHandler);\r\n document.addEventListener('touchmove', this.dragHandler, { passive: true });\r\n document.addEventListener('dragleave', this.dragEndHandler);\r\n document.addEventListener('mouseleave', this.dragEndHandler);\r\n document.addEventListener('mouseup', this.dragEndHandler);\r\n document.addEventListener('touchend', this.dragEndHandler, { passive: true });\r\n };\r\n }\r\n\r\n drag(event) {\r\n event.stopImmediatePropagation();\r\n\r\n const isTouchEvent = event.type === 'touchstart' || event.type === 'touchmove';\r\n const photoToTin = [...this.photoToTin];\r\n\r\n const touches = (event as TouchEvent).touches;\r\n const x = (isTouchEvent && touches ? touches[0].clientX : event.clientX);\r\n const y = (isTouchEvent && touches ? touches[0].clientY : event.clientY);\r\n\r\n if (touches && touches.length === 2) {\r\n this.pinchState.end1 = [touches[0].clientX, touches[0].clientY];\r\n this.pinchState.end2 = [touches[1].clientX, touches[1].clientY];\r\n this.applyPinch(photoToTin, this.pinchState.start1, this.pinchState.start2, this.pinchState.end1, this.pinchState.end2);\r\n }\r\n\r\n this.applyTranslateDelta(x - this.prevDragPosX, y - this.prevDragPosY);\r\n this.redrawPreview();\r\n\r\n this.prevDragPosX = x;\r\n this.prevDragPosY = y;\r\n }\r\n\r\n dragEnd(event) {\r\n event.stopImmediatePropagation();\r\n\r\n document.removeEventListener('mousemove', this.dragHandler);\r\n document.removeEventListener('touchmove', this.dragHandler);\r\n document.removeEventListener('dragleave', this.dragEndHandler);\r\n document.removeEventListener('mouseleave', this.dragEndHandler);\r\n document.removeEventListener('mouseup', this.dragEndHandler);\r\n document.removeEventListener('touchend', this.dragEndHandler);\r\n\r\n document.querySelector(\"html\").classList.remove('nx-lock');\r\n }\r\n\r\n zoomStart(direction: number) {\r\n this.zoomEnd();\r\n this.prevZoomTime = new Date();\r\n this.zoomDirection = direction;\r\n this.requestAFZoom(() => { this.applyZoom(); });\r\n }\r\n\r\n requestAFZoom(callback: () => void, then = undefined, fps = 60) {\r\n\r\n let now: number,\r\n delta: number,\r\n interval = 1000 / fps;\r\n\r\n if (typeof then !== \"number\") {\r\n then = new Date().valueOf();\r\n }\r\n\r\n now = new Date().valueOf();\r\n delta = now - then;\r\n\r\n if (delta > interval) {\r\n then = now - (delta % interval);\r\n callback();\r\n }\r\n\r\n this.zoomTimerHandler = window.requestAnimationFrame(() => {\r\n this.requestAFZoom(callback, then);\r\n });\r\n\r\n }\r\n\r\n applyZoom() {\r\n if (!this.prevZoomTime)\r\n return;\r\n\r\n var time = new Date();\r\n var timeDelta = (time.valueOf() - this.prevZoomTime.valueOf()) / 1000;\r\n if (timeDelta > 0.2)\r\n timeDelta = 0.2;\r\n this.prevZoomTime = time;\r\n\r\n this.applyZoomDelta(this.zoomDirection * timeDelta);\r\n this.redrawPreview();\r\n }\r\n\r\n zoomEnd() {\r\n if (this.zoomTimerHandler) {\r\n window.cancelAnimationFrame(this.zoomTimerHandler);\r\n this.applyZoom();\r\n this.zoomTimerHandler = undefined;\r\n this.prevZoomTime = undefined;\r\n }\r\n }\r\n\r\n applyTranslateDelta(x: number, y: number) {\r\n if (!this.photoToTin)\r\n return;\r\n var canvasToTin = this.invertMatrix(this.tinToCanvas);\r\n\r\n var deltaInTinSpace = [x * canvasToTin[2], y * canvasToTin[2]];\r\n\r\n this.photoToTin = this.mulMatrix(this.photoToTin, this.matrixFromTranslation(deltaInTinSpace));\r\n this.applyBounds();\r\n }\r\n\r\n applyZoomDelta(delta: number) {\r\n if (!this.photoToTin)\r\n return;\r\n var zoom = this.matrixFromZoom(Math.pow(2, delta));\r\n\r\n var currentZoom = zoom[2] * this.photoToTin[2];\r\n if (currentZoom >= this.maxZoom)\r\n currentZoom = this.maxZoom;\r\n if (currentZoom <= this.minZoom)\r\n currentZoom = this.minZoom;\r\n zoom[2] = currentZoom / this.photoToTin[2];\r\n\r\n\r\n var offset = this.matrixFromTranslation([this.tinVirtualWidth * 0.5, this.tinVirtualHeight * 0.5]);\r\n var tmp = this.mulMatrix(this.photoToTin, this.invertMatrix(offset));\r\n\r\n\r\n tmp = this.mulMatrix(tmp, zoom);\r\n\r\n\r\n this.photoToTin = this.mulMatrix(tmp, offset);\r\n\r\n this.applyBounds();\r\n this.updateZoomLabel();\r\n }\r\n\r\n updateZoomLabel() {\r\n const matrix = this.mulMatrix(this.photoToTin, this.getExportTinToCanvasMatrix()),\r\n zoom = matrix[2],\r\n zoomErrorContainer = document.querySelector('.nx-photo-tin-error'),\r\n zoomError = (zoom > 2) ? true : false;\r\n zoomError ? zoomErrorContainer.classList.add('nx-photo-tin-error--visible') : zoomErrorContainer.classList.remove('nx-photo-tin-error--visible');\r\n\r\n this.zoomField.value = Math.round(zoom * 100) + '%';\r\n }\r\n\r\n applyRotate(e, rotateClockwise) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.photo.rotateCanvasImage(rotateClockwise, () => {\r\n this.photoToTin = this.createPhotoToTinMatrix(this.photo.width, this.photo.height);\r\n this.photo = this.photo;\r\n this.applyBounds();\r\n this.updateZoomLabel();\r\n this.redrawPreview();\r\n });\r\n }\r\n\r\n applyPinch(startMatrix: number[], start1: number[], start2: number[], end1: number[], end2: number[]) {\r\n const prevDistance = Math.sqrt(\r\n (start1[0] - start2[0]) *\r\n (start1[0] - start2[0]) +\r\n (start1[1] - start2[1]) *\r\n (start1[1] - start2[1])\r\n );\r\n\r\n const lastDistance = Math.sqrt(\r\n (end1[0] - end2[0]) *\r\n (end1[0] - end2[0]) +\r\n (end1[1] - end2[1]) *\r\n (end1[1] - end2[1])\r\n );\r\n\r\n const distance = ((lastDistance - prevDistance) * 0.002);\r\n this.photoToTin = [...startMatrix]\r\n this.applyZoomDelta(distance);\r\n }\r\n\r\n\r\n minZoom = 1 / 50;\r\n maxZoom = 2;\r\n requiredVisibilityFactor = 0.1;\r\n\r\n applyBounds(): void {\r\n var m = this.photoToTin;\r\n\r\n m = this.invertMatrix(m);\r\n var x = m[0];\r\n var y = m[1];\r\n var z = m[2];\r\n var w = this.photo.width;\r\n var h = this.photo.height;\r\n var tw = this.tinVirtualWidth * z;\r\n var th = this.tinVirtualHeight * z;\r\n var requiredVisibilityFactor = this.requiredVisibilityFactor;\r\n var minX = -tw * (1 - requiredVisibilityFactor);\r\n var minY = -th * (1 - requiredVisibilityFactor);\r\n var maxX = w - tw * requiredVisibilityFactor;\r\n var maxY = h - th * requiredVisibilityFactor;\r\n var minZ = 1 / this.maxZoom;\r\n var maxZ = 1 / this.minZoom;\r\n if (z < minZ)\r\n z = minZ;\r\n if (z > maxZ)\r\n z = maxZ;\r\n if (x < minX)\r\n x = minX;\r\n if (y < minY)\r\n y = minY;\r\n if (x > maxX)\r\n x = maxX;\r\n if (y > maxY)\r\n y = maxY;\r\n m = [x, y, z];\r\n m = this.invertMatrix(m);\r\n\r\n this.photoToTin = m;\r\n }\r\n\r\n getExportTinToCanvasMatrix(): number[] {\r\n const dataset = this.element.dataset;\r\n return this.createTinToCanvasMatrix(parseInt(dataset.phototinX), parseInt(dataset.phototinY), parseInt(dataset.phototinWidth));\r\n }\r\n\r\n endZoom(event) {\r\n (event.currentTarget as HTMLButtonElement).classList.remove('active');\r\n this.zoomEnd();\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n // final print pattern for printer guy\r\n export() {\r\n const canvas = document.createElement('canvas') as HTMLCanvasElement;\r\n canvas.width = parseInt(this.element.dataset.imageWidth);\r\n canvas.height = parseInt(this.element.dataset.imageHeight);\r\n const ctx = canvas.getContext('2d');\r\n ctx.fillStyle = this.backgroundColor;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n\r\n const tinToCanvas = this.getExportTinToCanvasMatrix();\r\n this.drawTin(ctx, tinToCanvas, false);\r\n\r\n // place aswell thumbnail on print cart (right bottom aligned)\r\n const thumbnailToCanvas = this.createTinToCanvasMatrix(\r\n parseInt(this.element.dataset.thumbnailX),\r\n parseInt(this.element.dataset.thumbnailY),\r\n parseInt(this.element.dataset.thumbnailWidth)\r\n );\r\n\r\n this.drawTin(ctx, thumbnailToCanvas, false);\r\n\r\n return canvas.toDataURL('image/jpeg');\r\n }\r\n\r\n // create and export thumbnail to display in the cart\r\n exportThumbnail() {\r\n const thumbnail = document.createElement('canvas') as HTMLCanvasElement,\r\n ctx = thumbnail.getContext('2d'),\r\n thumbNailPreviewBackground = \"#fff\";\r\n\r\n thumbnail.width = parseInt(this.element.dataset.thumbnailWidth);\r\n thumbnail.height = parseInt(this.element.dataset.thumbnailWidth);\r\n ctx.fillStyle = thumbNailPreviewBackground;\r\n ctx.fillRect(0, 0, thumbnail.width, thumbnail.height);\r\n\r\n this.drawTin(ctx, this.createTinToCanvasMatrix(0, 0, thumbnail.width), false);\r\n\r\n return thumbnail.toDataURL('image/jpeg');\r\n }\r\n\r\n startZoom(event, zoomDirection: number) {\r\n (event.currentTarget as HTMLButtonElement).classList.add('active');\r\n this.zoomStart(zoomDirection);\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n /*\r\n * Returns the (Alpaca Forms) field value.\r\n */\r\n getFieldValue(args) {\r\n const id = args.id.substring(\"field_\".length);\r\n const field = args.elem;\r\n const inputFinalPhotoTin = field.querySelector(`input[name=\"${id}\"][type=\"hidden\"]`) as HTMLInputElement;\r\n const inputThumbnail = field.querySelector(`input[name=\"${id}-thumbnail\"][type=\"hidden\"]`) as HTMLInputElement;\r\n\r\n let fileName = \"\";\r\n\r\n // Create final image with thumbnail and phototin image as base64\r\n if (inputFinalPhotoTin) {\r\n // Abort validation pipeline to prevent setting incorrect values by following get field value methods.\r\n args.abort = true;\r\n args.value = null;\r\n if (this.fileInput.files.length === 0) {\r\n return;\r\n }\r\n const image = this.export();\r\n inputFinalPhotoTin.value = image;\r\n fileName = this.fileInput.files.length > 0\r\n ? this.fileInput.files[0].name\r\n : \"\";\r\n args.value = [\r\n {\r\n name: fileName,\r\n size: image.length\r\n }\r\n ];\r\n this.setQuantity(inputFinalPhotoTin.form);\r\n }\r\n // write base64 thumbnail into hidden input\r\n if (this.isEShopContext && inputThumbnail) {\r\n // Thumbnail is only needed in e-shop as thumbnail of product.\r\n // When running standalone, thumbnail would be uploaded as second image to ProCampaign, which is not necessary (and wrong).\r\n const image = this.exportThumbnail();\r\n inputThumbnail.value = image;\r\n args.value.push(\r\n {\r\n name: fileName + \"-thumbnail\",\r\n size: image.length\r\n });\r\n }\r\n }\r\n\r\n openDialog(event: any) {\r\n event.preventDefault();\r\n (this.element.querySelector(\"input[type='file']\") as HTMLElement).click();\r\n }\r\n\r\n checkLegalStatement(): boolean {\r\n const legalCheckbox = this.legalCheckbox;\r\n if (legalCheckbox) return legalCheckbox.checked;\r\n }\r\n\r\n getLegalErrorElement() {\r\n const legalErrorText = document.querySelector('.nx-photo-tin-legal-error') as HTMLInputElement;\r\n return legalErrorText;\r\n }\r\n\r\n getQuantity(): string {\r\n const quantity = document.querySelector('.nx-range-dropdown__label-value').textContent;\r\n if (quantity) return quantity;\r\n }\r\n\r\n hideLegalError() {\r\n const legalErrorText = document.querySelector('.nx-photo-tin-legal-error') as HTMLInputElement;\r\n if (legalErrorText && legalErrorText.classList.contains('nx-photo-tin-error--visible')) legalErrorText.classList.remove('nx-photo-tin-error--visible');\r\n }\r\n\r\n /**\r\n * Copies the quantity from frontend to the corresponding hidden input field in the backend.\r\n *\r\n * @param form\r\n */\r\n setQuantity(form: HTMLFormElement) {\r\n const quantityInput = form.querySelector(\"input[name$=\\\"_quantity\\\"]\") as HTMLInputElement;\r\n if (quantityInput) {\r\n quantityInput.value = this.getQuantity();\r\n }\r\n }\r\n\r\n allowUserClicking(elements): void {\r\n elements.forEach(elm => elm.disabled = false);\r\n }\r\n\r\n preventUserClicking(elements): void {\r\n elements.forEach(elm => elm.disabled = true);\r\n }\r\n\r\n handleAddToCartClick(e): void {\r\n e.stopImmediatePropagation();\r\n e.preventDefault();\r\n const submitButton = this.submitButton,\r\n addToCardBtns: NodeList[] = e.currentTarget.querySelectorAll('button');\r\n\r\n if (submitButton) {\r\n submitButton.dispatchEvent(new Event('click'));\r\n this.preventUserClicking(addToCardBtns);\r\n }\r\n }\r\n\r\n getSubmitButton(): HTMLButtonElement {\r\n const form = this.element.closest('form');\r\n\r\n if (form) {\r\n const submitButton = form.querySelector('button[type=\"submit\"]');\r\n\r\n if (submitButton) {\r\n return submitButton as HTMLButtonElement;\r\n }\r\n }\r\n }\r\n\r\n unsetFormOverflow() {\r\n const form = this.element.closest('form');\r\n\r\n if (form) form.style.overflow = 'visible';\r\n }\r\n\r\n checkFotoUpload(): number {\r\n return this.fileInput.files.length;\r\n }\r\n\r\n hideAddToCartSection(): void {\r\n const addToCartSection = this.addToCartSection;\r\n const successMessage = document.querySelector(\".alpaca-form.success-message\");\r\n\r\n if (addToCartSection && successMessage) addToCartSection.style.display = 'none';\r\n }\r\n}\r\n\r\nclass PhotoTinIos extends PhotoTin {\r\n dragStart(): (event) => void {\r\n let orignMethod = super.dragStart();\r\n\r\n return (event) => {\r\n if (!this.photo || event.target !== this.canvas) {\r\n return;\r\n }\r\n\r\n orignMethod(event);\r\n IOSScroll.prevent();\r\n };\r\n }\r\n\r\n dragEnd(isTouchEvent: boolean): void {\r\n super.dragEnd(isTouchEvent);\r\n IOSScroll.allow();\r\n }\r\n}\r\nexport default class PhotoTinFactory {\r\n static extName: string = 'PhotoTin';\r\n\r\n static setup(selector: string = `[data-alpaca-ext=\"${this.extName}\"]`): void {\r\n Array.from(document.querySelectorAll(selector))\r\n .filter((node: HTMLElement) => !node.dataset.alpacaExtInitialized)\r\n .forEach((element: HTMLElement) => {\r\n (isIOS() && PhotoTinFactory.isInLayer(element))\r\n ? new PhotoTinIos(element)\r\n : new PhotoTin(element);\r\n element.dataset.alpacaExtInitialized = \"true\";\r\n });\r\n }\r\n\r\n static isInLayer(element: HTMLElement): boolean {\r\n return element.closest('.nx-layer') != null;\r\n }\r\n}\r\n","interface IAlpacaExtension {\r\n init(...args: any[]): any;\r\n getFieldValue(...args: any[]): any;\r\n}\r\n\r\nexport default class AlpacaExtension implements IAlpacaExtension {\r\n static extName: string = '';\r\n \r\n static setup(selector: string = `[data-alpaca-ext=\"${this.extName}\"]`): void {\r\n Array.from(document.querySelectorAll(selector))\r\n .filter((node: HTMLElement) => !node.dataset.alpacaExtInitialized)\r\n .forEach((element: HTMLElement) => {\r\n new this(element); // \"this\" is a Class\r\n element.dataset.alpacaExtInitialized = \"true\";\r\n });\r\n }\r\n\r\n constructor(protected element: HTMLElement) {\r\n const alpacaListener = window.NiveaX.AlpacaListener;\r\n let initSub, readySub;\r\n\r\n if (!alpacaListener) return;\r\n\r\n // First and only one event on Alpaca init\r\n const onAlpacaInit = ({ detail: { form }}: AlpacaEvent) => {\r\n form.getFieldValuePipeline.push((args: ValidatorArgs) => this.getFieldValue(args));\r\n initSub && initSub.unsubscribe('init', onAlpacaInit);\r\n }\r\n initSub = alpacaListener.subscribe('init', onAlpacaInit);\r\n\r\n // Next events on Alpaca Froms are ready\r\n const onAlpacaFromReady = (event: AlpacaEvent) => {\r\n requestAnimationFrame(() => this.init());\r\n readySub && readySub.unsubscribe('ready', onAlpacaFromReady);\r\n };\r\n readySub = alpacaListener.subscribe('ready', onAlpacaFromReady);\r\n }\r\n\r\n // method to initialize all nodes and event listeners for current instance\r\n init() {}\r\n\r\n // method gets value of current Alpaca field\r\n getFieldValue(args: ValidatorArgs) {}\r\n}","import { isIOS } from '../helpers/helperFunctions';\r\n\r\nexport function bindFunctions(element: any, ...funcs: Array<(target: any, ...args: any[]) => void>) {\r\n return function (...args) {\r\n funcs.forEach((f, i) => f(element, args[i]));\r\n return element;\r\n }\r\n}\r\n\r\nexport function createElement(selector: string): HTMLElement {\r\n return document.createElement(selector);\r\n}\r\n\r\nexport function createAnchor(href: string = '', text: string = '', className: string = ''): HTMLAnchorElement {\r\n return bindFunctions(\r\n createElement('a'),\r\n addHref,\r\n addTextContent,\r\n addClassName\r\n )(href, text, className);\r\n}\r\n\r\nexport function createSpan(className: string): HTMLElement {\r\n return addClassName(createElement('span'), className);\r\n};\r\n\r\nexport function createDiv(className: string): HTMLElement {\r\n return addClassName(createElement('div'), className);\r\n};\r\n\r\nexport function createNav(className: string): HTMLElement {\r\n return addClassName(createElement('nav'), className);\r\n};\r\n\r\nexport function createUList(className: string): HTMLElement {\r\n return addClassName(createElement('ul'), className);\r\n};\r\n\r\nexport function createListItem(className: string): HTMLElement {\r\n return addClassName(createElement('li'), className);\r\n};\r\n\r\nexport function createButton(className: string): HTMLElement {\r\n return addClassName(createElement('button'), className);\r\n};\r\n\r\nexport function createElementFromString(str: string): HTMLElement {\r\n const wrapper = createDiv('');\r\n wrapper.innerHTML = str;\r\n return wrapper.firstElementChild || wrapper;\r\n}\r\n\r\nexport function createSVG(inner: string): HTMLElement {\r\n const svg = document.createElement('svg');\r\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\r\n svg.setAttribute('viewBox', '0 0 86 86');\r\n svg.innerHTML = inner;\r\n\r\n return svg;\r\n}\r\n\r\nexport function addTextContent(element: HTMLElement, value: string): HTMLElement {\r\n element.textContent = value;\r\n return element;\r\n}\r\n\r\nexport function addInnerHTML(element: HTMLElement, value: string): HTMLElement {\r\n element.innerHTML = value;\r\n return element;\r\n}\r\n\r\nexport function addClassName(node: HTMLElement, className: string): HTMLElement {\r\n node.className = className;\r\n return node;\r\n}\r\n\r\nexport function addClass(node: HTMLElement, className: string): HTMLElement {\r\n if (className) node.classList.add(className);\r\n return node;\r\n}\r\n\r\nexport function addClasses(node: HTMLElement, ...classes: string[]): HTMLElement {\r\n classes.forEach(cls => addClass(node, cls));\r\n return node;\r\n}\r\n\r\nexport function removeClass(node: HTMLElement, className: string): HTMLElement {\r\n if (className) node.classList.remove(className);\r\n return node;\r\n}\r\n\r\nexport function removeClasses(node: HTMLElement, ...classes: string[]): HTMLElement {\r\n classes.forEach(cls => removeClass(node, cls));\r\n return node;\r\n}\r\n\r\nexport function addClassToList(list: Element[] | HTMLElement[] | HTMLCollection | NodeList, className: string) {\r\n Array.from(list).forEach(itm => addClass(itm, className));\r\n return list;\r\n}\r\n\r\nexport function removeClassFromList(list: Element[] | HTMLElement[] | HTMLCollection | NodeList, className: string) {\r\n Array.from(list).forEach(itm => removeClass(itm, className));\r\n return list;\r\n}\r\n\r\nexport function hasClass(\r\n element: HTMLElement | Element | EventTarget,\r\n value: string\r\n): boolean {\r\n return (element)?.classList.contains(value);\r\n}\r\n\r\nexport function addHref(element: HTMLAnchorElement, value: string): HTMLAnchorElement {\r\n element.href = value;\r\n return element;\r\n}\r\n\r\nexport function addToElement(element: HTMLElement, ...items: HTMLElement[]): HTMLElement {\r\n items.filter(i => i).forEach(i => element.appendChild(i));\r\n return element;\r\n}\r\n\r\nexport function addToElementAtTheBeginning(element: HTMLElement, ...items: HTMLElement[]): HTMLElement {\r\n const children = Array.from(element.children);\r\n return addToElement(element, ...items.concat(children));\r\n}\r\n\r\nexport function addElementsFromArray(target: HTMLElement, arr: HTMLElement[]) {\r\n arr.forEach(e => addToElement(target, e));\r\n return arr;\r\n}\r\n\r\nexport function getElementHeight(element: HTMLElement): number {\r\n return element.offsetHeight;\r\n}\r\n\r\nexport function setElementHeight(element: HTMLElement, height: number) {\r\n element.style.height = height ? height + 'px' : '';\r\n return this;\r\n}\r\n\r\nexport function isInViewPort(element: HTMLElement): boolean {\r\n const elementRect = element.getBoundingClientRect(),\r\n offsetHeight = document.documentElement.offsetHeight;\r\n\r\n return elementRect.top < 0 && elementRect.bottom > 0\r\n || elementRect.top >= 0 && elementRect.top < offsetHeight\r\n || elementRect.bottom > 0 && elementRect.bottom < offsetHeight;\r\n}\r\n\r\nexport function observeFirstTimeInViewport(element): Promise {\r\n return new Promise((resolve, reject) => {\r\n const observer = new IntersectionObserver((entries, observer) => {\r\n entries.forEach(entry => {\r\n if (entry.isIntersecting) {\r\n resolve(true);\r\n observer.disconnect();\r\n }\r\n });\r\n }, { threshold: 0.01 });\r\n\r\n observer.observe(element);\r\n });\r\n}\r\n \r\n\r\nexport function getSibling(element: HTMLElement, selector: string): HTMLElement {\r\n return element.parentElement.querySelector(selector);\r\n}\r\n\r\nexport function getClosest(element: HTMLElement, selector: string): HTMLElement {\r\n do {\r\n if (element.matches(selector)) {\r\n return element;\r\n }\r\n element = element.parentElement || element.parentNode;\r\n } while (element !== null && element.nodeType === 1);\r\n\r\n return null;\r\n}\r\n\r\nexport function createScriptTag(script: HTMLScriptElement): HTMLScriptElement {\r\n let domScript = document.createElement('script');\r\n domScript.type = script.type;\r\n\r\n if (script.src) {\r\n domScript.src = script.src;\r\n } else {\r\n domScript.textContent = script.innerText;\r\n }\r\n\r\n if (script.defer) {\r\n domScript.defer = true;\r\n }\r\n\r\n return domScript;\r\n}\r\n\r\nexport function convertToPlain(html): string {\r\n var tempDivElement = document.createElement(\"div\");\r\n tempDivElement.innerHTML = html;\r\n\r\n return tempDivElement.textContent || tempDivElement.innerText || \"\";\r\n}\r\n\r\nexport function injectScriptsFromAjaxResponse(element: HTMLElement): Promise {\r\n\r\n const scripts = Array.from(element.getElementsByTagName('script'))\r\n .filter(script => !isScriptTagRendered(script))\r\n .map(createScriptTag);\r\n\r\n return Promise.all(scripts.map(script => new Promise((resolve, reject) => {\r\n if (script.src) {\r\n script.onload = () => resolve();\r\n script.onerror = () => {\r\n console.error(`Layer script was not loaded: URL ${(event.target).src}`);\r\n resolve();\r\n };\r\n } else {\r\n resolve();\r\n }\r\n\r\n document.head.appendChild(script);\r\n })));\r\n}\r\n\r\nexport function isScriptTagRendered(script: HTMLScriptElement): boolean {\r\n let exist: boolean = false;\r\n const shouldScriptNotBeMoved = script.hasAttribute('data-dont-move-script-from-layer');\r\n\r\n if (script.src) {\r\n (document.querySelectorAll(`[src=\"${script.src}\"]`).length > 0 && script.src.indexOf(\"recaptcha\") == -1) ? exist = true : exist = false;\r\n }\r\n\r\n if (shouldScriptNotBeMoved) {\r\n exist = true;\r\n }\r\n\r\n return exist;\r\n}\r\n\r\nexport function toggleClass(node: HTMLElement, className: string, force?: boolean): HTMLElement {\r\n if (typeof force === undefined) {\r\n node.classList.toggle(className);\r\n } else {\r\n force\r\n ? node.classList.add(className)\r\n : node.classList.remove(className);\r\n }\r\n\r\n return node;\r\n}\r\n\r\nexport function getChildren(node: HTMLElement, selector?: string): HTMLElement[] {\r\n let children = Array.from(node.children);\r\n\r\n if (selector) {\r\n children = children.filter(ch => hasClass(ch, selector));\r\n }\r\n\r\n return children;\r\n}\r\n\r\nexport function dispatchEvent(element: HTMLElement, event: Event): HTMLElement {\r\n element.dispatchEvent(event);\r\n return element;\r\n}\r\n\r\n/*\r\n *\r\n * Helper Functions for Video Movie\r\n *\r\n */\r\n\r\nexport function hasVideoToBeLoaded(video: HTMLVideoElement): boolean {\r\n return !isVideoLoaded(video) && isInViewPort(video) && document.readyState == \"complete\";\r\n}\r\n\r\nexport function hasVideoToBePaused(video: HTMLVideoElement) {\r\n return isVideoLoaded(video) && !isInViewPort(video) && isVideoPlaying(video);\r\n}\r\n\r\nexport function hasVideoToBePlay(video: HTMLVideoElement): boolean {\r\n return isVideoLoaded(video) && isInViewPort(video) && !isVideoPlaying(video) && isVideoAutoplay(video);\r\n}\r\n\r\nexport function isVideoAutoplay(video) {\r\n return video.getAttributeNames()?.includes('autoplay');\r\n}\r\n\r\nexport function isVideoLoaded(video: HTMLVideoElement): boolean {\r\n return (video.hasAttribute('src') || video.readyState == 4);\r\n}\r\n\r\nexport function playVideo(video: HTMLVideoElement) {\r\n return video.play();\r\n}\r\n\r\nexport function pauseMovieVideo(vid: HTMLVideoElement) {\r\n return vid.pause();\r\n}\r\n\r\nexport function showVideo(video: HTMLVideoElement) {\r\n video.parentElement.classList.add(\"nx-movie-video--ready\");\r\n}\r\n\r\nexport function setVideoSourceAttr(video: HTMLVideoElement): HTMLVideoElement {\r\n let src;\r\n\r\n if (window.innerWidth >= 768) {\r\n src = video.dataset.srcCompact || video.dataset.src || video.dataset.srcDefault;\r\n } else {\r\n src = video.dataset.srcCompactmobile || video.dataset.srcMobile || video.dataset.srcDefault;\r\n }\r\n\r\n const currentSrc = video.getAttribute('src');\r\n if (src && src !== currentSrc)\r\n video.setAttribute('src', src);\r\n\r\n return video;\r\n}\r\n\r\nexport function removeDataVideoAttr(video: HTMLVideoElement): HTMLVideoElement {\r\n video.removeAttribute('data-src');\r\n\r\n return video;\r\n}\r\n\r\nexport function isVideoPlaying(vid): boolean {\r\n const video: HTMLVideoElement = vid;\r\n return !!(video.currentTime > 0 && !video.paused && !video.ended && video.readyState > 2);\r\n}\r\n\r\nexport function getContent(node: HTMLElement | string): string {\r\n const element = typeof node === 'string' ? createElementFromString(node) : node;\r\n return element.innerHTML;\r\n}\r\n\r\nexport function isImageLoaded(img: HTMLImageElement): boolean {\r\n return (img.hasAttribute('src') || img.hasAttribute('srcset'))\r\n || (!isIOS && img.complete && img.naturalHeight !== 0);\r\n}\r\n\r\nexport function showSpinner(img: HTMLImageElement) {\r\n addClass(img.parentElement, 'nx-u-spinner');\r\n return img;\r\n}\r\n\r\nexport function hideSpinner(img: HTMLImageElement) {\r\n removeClass(img.parentElement, 'nx-u-spinner');\r\n return img;\r\n}\r\n\r\nexport function clearElement(e: HTMLElement): HTMLElement {\r\n e.innerHTML = '';\r\n return e;\r\n}\r\n\r\nexport function clearStyleElement(e: HTMLElement): HTMLElement {\r\n e.removeAttribute('style');\r\n return e;\r\n}\r\n\r\nexport function adjustLayerMarkUp(html: string, overlayTitle?): HTMLElement {\r\n let node = createElementFromString(`
${html}
`),\r\n layerTitle = (overlayTitle) ? overlayTitle : '';\r\n\r\n return createElementFromString(`\r\n
\r\n ${overlayTitle ?\r\n `
\r\n

${layerTitle}

\r\n
`\r\n : \"\"}\r\n
${node.innerHTML}
\r\n
`);\r\n}\r\n\r\nexport function setFocusIntoLayer(element:HTMLElement): void {\r\n if (window.NiveaX.deviceType.isMobile == true || element.classList.contains('nx-spush-item')) {\r\n return;\r\n }\r\n \r\n const focusableElem = element.querySelectorAll('button, [href], input:not([type=\"hidden\"]), select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\r\n firstFocusableElm = focusableElem[0] as HTMLElement;\r\n firstFocusableElm?.classList.contains('nx-shop-cart__promotion-form-input') ?\r\n firstFocusableElm?.parentElement.classList.add('nx-shop-cart__promotion-form-input--focus') : \"\";\r\n\r\n firstFocusableElm?.focus();\r\n}\r\n\r\nexport function objectToStyleString(styleObject): string {\r\n return Object.entries(styleObject).map(([k, v]) => `${k}: ${v}`).join(';');\r\n}\r\n\r\nexport function isChildOf(element: HTMLElement, parent: HTMLElement): boolean {\r\n do {\r\n if (element === parent) return true;\r\n element = element.parentElement;\r\n } while (element);\r\n\r\n return false;\r\n}\r\n\r\n\r\nexport function numDigits(x: number): number {\r\n return Math.max(Math.floor(Math.log10(Math.abs(x))), 0) + 1;\r\n}\r\n\r\nexport function addSpinnerToTeaserGrid(gridNode: HTMLElement) {\r\n addClass(gridNode, \"nx-teaser-grid--loading\");\r\n\r\n gridNode.insertBefore(createElementFromString(\r\n `
\r\n
\r\n
\r\n
\r\n
`), gridNode.firstChild || null);\r\n}\r\n\r\nexport function removeSpinnerFromTeaserGrid(gridNode: HTMLElement) {\r\n removeClass(gridNode, \"nx-teaser-grid--loading\");\r\n}\r\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"./modules/\" + (chunkId === 8469 ? \"ShopInitializer\" : chunkId) + \".\" + {\"1054\":\"8638f326\",\"8469\":\"0aba99a8\"}[chunkId] + \".js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/dist/NiveaX/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t5775: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"NiveaXwebpackJsonp\"] = self[\"NiveaXwebpackJsonp\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","export default class AlpacaExtensionLoader {\r\n constructor(private selector: string = '[data-alpaca-ext]') {\r\n this.initExtensions();\r\n document.addEventListener('alpaca-extensions:init', () => this.initExtensions());\r\n }\r\n\r\n initExtensions() {\r\n const nodes = Array.from(document.querySelectorAll(this.selector));\r\n const extNames = this.getExtensionNames(nodes);\r\n\r\n extNames\r\n .map(eN => require(`./modules/${eN}.ts`).default)\r\n .forEach(Extension => Extension.setup());\r\n }\r\n\r\n getExtensionNames(nodes: HTMLElement[]): string[] {\r\n const allExtensionNames = nodes.map((node: HTMLElement) => node.getAttribute(this.selector.slice(1, -1)));\r\n const uniqExtensionNames = Array.from(new Set(allExtensionNames));\r\n\r\n return uniqExtensionNames;\r\n }\r\n}\r\n\r\nnew AlpacaExtensionLoader();"],"names":["inProgress","PhotoTinMipMapLevel","constructor","width","height","canvas","this","getPageScrollTop","document","documentElement","scrollTop","body","IOSScroll","prevent","visual","preventClass","isIOS","unshift","length","classList","add","setTimeout","setNegativeMarginTop","allow","Math","max","firstScrollTop","shift","remove","hash","window","location","substring","indexOf","getElementById","scrollIntoView","value","style","marginTop","test","navigator","userAgent","parseJSONSafe","json","result","JSON","parse","e","console","warn","message","requestAnimationFrameTimer","func","time","requestAnimationFrame","isNotUndefined","values","every","v","undefined","isObjectEmpty","obj","Object","entries","async","trackPurchase","cartState","orderId","countryCode","dataLayer","pageCountry","AmountToPayDecimal","DeliveryCostDecimal","TotalTaxDecimal","CurrencyCode","Summary","coupon","Promotions","map","a","join","brand","hasOwnProperty","products","Items","item","category","Category","ProductName","ProductId","getPriceValue","ProductPrice","ProductSize","Quantity","push","event","currencyCode","ecommerce","purchase","actionField","id","affiliation","revenue","tax","shipping","trackPhototinUpload","eventCategory","eventAction","trackPhototinAddMessage","eventLabel","trackPhototinAddToCart","productNameNode","querySelector","productName","innerText","addToCartNode","dataset","productId","productCategory","productVariantNode","productVariant","innerHTML","price","quantity","textContent","buttonType","addLayer","options","match","replace","parseFloat","trackData","trakingList","forEach","triggerOption","Ttrigger","Tevent","log","PhotoTinMipMap","imgSrc","orientation","callback","orientationState","levels","canvasImage","Image","onload","generate","src","currentOriantationIdx","findIndex","img","steps","oc","createElement","oCtx","getContext","rotateCanvasContext","drawImage","getSteps","generateLevel","w","h","degreesToRotate","x","y","translate","rotate","PI","rotateCanvasImage","rotateClockwise","getNextOrientation","sourceWidth","targetWidth","ceil","tempC","tempCtx","levelWidth","floor","levelHeight","getMipMap","pixelSize","bestLevel","i","backgroundColor","_","appendLevel","toDataURL","appendChild","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","code","keys","resolve","module","exports","PhotoTin","tinVirtualWidth","tinVirtualHeight","isEShopContext","pinchState","start1","start2","end1","end2","minZoom","maxZoom","requiredVisibilityFactor","init","initHtmlElements","bindEventListeners","element","canvasSizes","S","M","L","XL","breakpoints","XSMALL","SMALL","MEDIUM","LARGE","resize","messages","addEventListener","addMessage","selectedIndex","dispatchEvent","CustomEvent","detail","tackMessageChange","tinToCanvas","createTinToCanvasMatrix","getXPosition","dragEndHandler","dragEnd","bind","dragHandler","drag","addToCartSection","unsetFormOverflow","browseFileButton","errorField","inner","zoomField","btnZoomIn","disabled","btnZoomOut","fileInput","legalCheckbox","submitButton","getSubmitButton","rotateButtonLeft","rotateButtonRight","redrawPreview","openDialog","startZoom","passive","endZoom","dragStart","uploadPhoto","applyRotate","target","button","closest","flag","mobileButton","handleAddToCartClick","hideLegalError","NiveaX","AlpacaListener","subscribe","form","registerCustomDataHandler","hideAddToCartSection","addToCardBtns","querySelectorAll","allowUserClicking","size","createPhotoToTinMatrix","min","mulMatrix","invertMatrix","matrixFromTranslation","file","fileReader","FileReader","htmlInputElement","currentTarget","isValidExtension","showErrorField","notValidError","fileList","files","type","addPhoto","readAsDataURL","getOrientation","readAsArrayBuffer","errorMsg","nodeValue","toLowerCase","offset","marker","little","tags","view","DataView","getUint16","byteLength","getUint32","photo","toString","photoToTin","applyBounds","updateZoomLabel","selectedOption","selectedOptions","b","applyMatrix","point","matrixFromZoom","z","applyMatrixToCanvas","ctx","transform","image","save","mipMap","scale","restore","drawTinCircle","beginPath","arc","drawTin","drawOutside","globalAlpha","fillStyle","fill","clip","lineWidth","strokeStyle","stroke","closePath","clearRect","winWidth","outerWidth","isTouchEvent","touches","startX","startY","stopImmediatePropagation","clientX","clientY","prevDragPosX","prevDragPosY","applyPinch","applyTranslateDelta","removeEventListener","zoomStart","direction","zoomEnd","prevZoomTime","Date","zoomDirection","requestAFZoom","applyZoom","then","fps","now","delta","interval","valueOf","zoomTimerHandler","timeDelta","applyZoomDelta","cancelAnimationFrame","canvasToTin","deltaInTinSpace","zoom","pow","currentZoom","tmp","getExportTinToCanvasMatrix","zoomErrorContainer","round","preventDefault","stopPropagation","startMatrix","prevDistance","sqrt","distance","m","tw","th","minX","minY","maxX","maxY","minZ","maxZ","parseInt","phototinX","phototinY","phototinWidth","imageWidth","imageHeight","fillRect","thumbnailToCanvas","thumbnailX","thumbnailY","thumbnailWidth","exportThumbnail","thumbnail","getFieldValue","args","field","elem","inputFinalPhotoTin","inputThumbnail","fileName","abort","export","name","setQuantity","click","checkLegalStatement","checked","getLegalErrorElement","getQuantity","legalErrorText","contains","quantityInput","elements","elm","preventUserClicking","Event","overflow","checkFotoUpload","successMessage","display","extName","PhotoTinIos","orignMethod","super","PhotoTinFactory","setup","selector","Array","from","filter","node","alpacaExtInitialized","isInLayer","AlpacaExtension","alpacaListener","initSub","readySub","onAlpacaInit","getFieldValuePipeline","unsubscribe","onAlpacaFromReady","createSpan","className","addClassName","createElementFromString","str","wrapper","firstElementChild","addClass","addClasses","classes","cls","removeClass","removeClasses","addToElement","items","toggleClass","force","toggle","getContent","__webpack_module_cache__","moduleId","cachedModule","__webpack_modules__","d","definition","key","defineProperty","enumerable","get","f","chunkId","Promise","all","reduce","promises","u","miniCssF","prop","prototype","call","l","url","done","script","needAttach","scripts","getElementsByTagName","s","getAttribute","charset","timeout","nc","setAttribute","onScriptComplete","prev","onerror","clearTimeout","doneFns","parentNode","removeChild","fn","head","r","Symbol","toStringTag","p","installedChunks","j","installedChunkData","promise","reject","error","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","data","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","initExtensions","nodes","getExtensionNames","eN","default","Extension","allExtensionNames","slice","Set"],"sourceRoot":""}