{ "version": 3, "sources": ["../../../Scripts/Src/Shared/Utils/common-utils.ts", "../../../Scripts/Src/Shared/Utils/analytics-utils.ts", "../../../Scripts/Src/Shared/Analytics/data/data-layer.facade.ts", "../../../Scripts/Src/Shared/Analytics/content/search-analytics.ts", "../../../Scripts/Src/Components/SearchEvents/search-events.ts", "../../../Scripts/Src/Components/IceMenuLoader/ice-menu-loader.ts"], "sourcesContent": ["\uFEFFexport const throttle = (callback: (..._: T) => void, wait: number): ((..._: T) => void) => {\n let queuedToRun: NodeJS.Timeout | undefined;\n let previouslyRun: number;\n return function invokeFn(...args: T) {\n const now = Date.now();\n queuedToRun = clearTimeout(queuedToRun) as undefined;\n if (!previouslyRun || now - previouslyRun >= wait) {\n callback(...args);\n previouslyRun = now;\n } else {\n queuedToRun = setTimeout(invokeFn.bind(null, ...args), wait - (now - previouslyRun));\n }\n };\n};\n\ntype Process = (...args: unknown[]) => void;\nexport const debounce = (callback: (args: unknown[]) => void, ms: number): Process => {\n let timeout: NodeJS.Timeout;\n return (...args: unknown[]): void => {\n clearTimeout(timeout);\n timeout = setTimeout((): void => callback(args), ms);\n };\n};\n\nexport const isEmptyString = (str: string | undefined): boolean => {\n return !str || 0 === str.length || str.trim().length === 0;\n};\n\nexport enum DeviceType {\n Mobile,\n Tablet,\n Desktop,\n}\n\nexport function getDeviceType(): DeviceType {\n const windowWidth = document.documentElement.clientWidth;\n\n if (windowWidth < 448) {\n return DeviceType.Mobile;\n }\n if (windowWidth < 770) {\n return DeviceType.Tablet;\n }\n return DeviceType.Desktop;\n}\n\nexport function clearClassList(arrow: Element): void {\n const classList = arrow.classList;\n for (let i = classList.length; i > 0; i--) {\n classList.remove(classList[i]);\n }\n}\n\nexport interface OutOfViewInfo {\n top: boolean;\n left: boolean;\n bottom: boolean;\n right: boolean;\n any: boolean;\n}\n\nexport function isOutOfViewport(el: Element | DOMRect, deviationY = 0, deviationX = 0): OutOfViewInfo {\n // Get element's bounding\n\n const bounding = el instanceof Element ? el.getBoundingClientRect() : el;\n\n const windowBottom = window.innerHeight || document.documentElement.clientHeight;\n\n // Check if it's out of the viewport on each side\n const top = bounding.top + deviationY < 0 || windowBottom < bounding.top + deviationY;\n const left = bounding.left + deviationX < 0;\n const bottom = bounding.bottom - deviationY > (window.innerHeight || document.documentElement.clientHeight);\n const right = bounding.right - deviationX > (window.innerWidth || document.documentElement.clientWidth);\n return { top, left, bottom, right, any: top || left || bottom || right };\n}\n\nexport function GetYOutOfViewport(el: Element | DOMRect, margin = 0): number {\n // Get element's bounding\n\n const bounding = el instanceof Element ? el.getBoundingClientRect() : el;\n const windowBottom = window.innerHeight || document.documentElement.clientHeight;\n\n const outside = bounding.bottom > windowBottom ? bounding.bottom - windowBottom + margin : 0;\n\n return outside;\n}\n\nexport function uuid(): string {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport function shortId(): string {\n return \"xxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0;\n const v = c === \"x\" ? r : (r & 0x3) | 0x8;\n return v.toString(8);\n });\n}\n\nexport function getNumberAttribute(el: Element, attributeName: string): number {\n const attr = el.getAttribute(attributeName);\n if (attr === null) {\n return 0;\n }\n\n const num = parseInt(attr, 10);\n if (isNaN(num)) {\n return 0;\n }\n return num;\n}\n\nexport const toNumber = (value: string) => {\n const num = parseInt(value, 10);\n if (isNaN(num)) {\n return 0;\n }\n return num;\n};\n\nexport const CopytoClipBoard = (elValue: string): void => {\n // Create new element\n elValue = decodeURIComponent(elValue);\n\n // Copy text to clipboard\n if (navigator.clipboard) {\n navigator.clipboard.writeText(elValue).catch((err) => console.error(\"Copy to clipboard failed\", err));\n } else {\n const el = document.createElement(\"input\");\n // Set value (string to be copied)\n el.value = elValue;\n // Set non-editable to avoid focus and move outside of view\n el.setAttribute(\"readonly\", \"\");\n el.setAttribute(\"style\", '{ position: \"absolute\", left: \"-9999px\" }');\n document.body.appendChild(el);\n // Select text inside element\n el.select();\n // use old commandExec() way / Depricated\n document.execCommand(\"copy\");\n // Remove temporary element\n document.body.removeChild(el);\n }\n};\n\nexport const trimChars = (str: string, chars: string): string => {\n return str.replace(new RegExp(`^[${chars}]+|[${chars}]+$`, \"g\"), \"\");\n};\n\nexport const findFirst = (arr: [], func: (value: never, index: number, array: unknown[]) => []): unknown[] => {\n const res = arr.filter(func);\n if (res) return res;\n return new Array();\n};\n\nexport const isInteger = (value: number): boolean => {\n return value % 1 === 0;\n};\n\nexport const toBoolean = (value: unknown): boolean => {\n return value === \"true\" || value === \"True\" || value === true;\n};\n\nexport function queryAll(selector: string, el = document): T[] {\n return Array.from(el.querySelectorAll(selector));\n}\n\nexport const getUrlParam = (paramName: string) => {\n const url = new URL(window.location.href);\n const searchParams = url.searchParams;\n return searchParams.get(paramName);\n};\n\nexport const padZeros = (num: number, maxLength: number): string => {\n return num.toString().padStart(maxLength, \"0\");\n};\n\nexport const convertSecToTime = (sec: number): string => {\n if (!sec || Number.isNaN(sec)) {\n return \"\";\n }\n\n const hours = Math.floor(sec / 3600);\n const minutes = Math.floor((sec % 3600) / 60);\n const seconds = Math.floor((sec % 3600) % 60);\n\n const hoursString = hours > 0 ? `${hours}:` : \"\";\n const minuteString = hours > 0 ? padZeros(minutes, 2) : minutes.toString();\n const secondsString = seconds >= 0 ? padZeros(seconds, 2) : \"\";\n return `${hoursString}${minuteString}:${secondsString}`;\n};\nexport type BusinessUnit = \"B2B\" | \"B2C\";\n\nexport const normalizeWhitespace = (text: string): string => text.trim().replace(/\\n/g, \" \").replace(/ +/g, \" \");\n\nexport const parseUrl = (url: string): URL | null => {\n if (typeof URL.canParse === \"function\") {\n return URL.canParse(url) ? new URL(url) : null;\n }\n try {\n return new URL(url);\n } catch (_error) {\n console.error(\"Error parsing URL\", url, _error);\n return null;\n }\n};\n\nexport const isB2BPage = (): boolean => /\\/bedrift($|\\/$|\\/.+)/gi.test(window.location.pathname.toLocaleLowerCase());\n\nexport const capitalizeFirstLetter = (str: string | undefined): string => {\n if (!str) return \"\"; // Handle empty string\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n", "import { BusinessUnit, isB2BPage } from \"./common-utils\";\n\n/*\n * Andy's Log, Stardate 30.05.2024\n * This is my final entry.\n * So Long, and Thanks for All the Fish <3\n * Now my watch has ended.\n * Cherrio!\n */\n\nexport const getBusinessUnit = (): BusinessUnit => (isB2BPage() ? \"B2B\" : \"B2C\");\nexport const isMobileBroadbandPath = (): boolean =>\n window.location.pathname.startsWith(\"/mobilt-bredband\") ||\n window.location.pathname.startsWith(\"/bedrift/mobilt-bredband\");\nexport const isMobilabonnementPath = (): boolean => window.location.pathname.startsWith(\"/mobilabonnement\");\nexport const isPathInUrl = (path: string): boolean => window.location.pathname.toLowerCase().includes(path);\n\nexport const attachClickEventListener = (\n targets: NodeListOf | Element,\n handler: EventListenerOrEventListenerObject,\n): void => {\n if (targets instanceof Element) {\n targets.addEventListener(\"click\", handler);\n } else {\n targets.forEach((element) => {\n element.addEventListener(\"click\", handler);\n });\n }\n};\n\nexport const handleAnalyticsError = (\n error: string,\n context: string,\n errorType: \"reference\" | \"error\" = \"reference\",\n): void => {\n switch (errorType) {\n case \"reference\":\n throw new ReferenceError(`${error} in ${context}`);\n case \"error\":\n throw new Error(`${error} in ${context}`);\n default:\n console.warn(`${error} in ${context}`);\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const addIndexToItems = (items: any[]) => {\n return items.map((item, index) => ({\n ...item,\n index: index,\n }));\n};\n", "import { GA4FrontPageEvent } from \"../content/frontpage-analytics\";\nimport { BaseGA4FeedbackEvent } from \"../content/feedback-analytics\";\nimport {\n GA4ContactFormEvent,\n GA4FormStartEvent,\n GA4LeadFormEvent,\n GA4NewsLetterEvent,\n} from \"../content/form-analytics\";\nimport { BaseGA4MenuEvent } from \"../content/menu-analytics\";\n\nimport { GA4FAQEvent } from \"../content/faq-analytics\";\nimport { BaseGA4FunnelTracking } from \"../content/funnel-analytics\";\nimport { BaseGA4LoginData } from \"../content/login-analytics\";\nimport { GA4PhoneClickEvent } from \"../content/phone-analytics\";\nimport { BaseGA4MbbEvent } from \"../ecommerce/mbb/b2c/mbb-b2c-analytics.models\";\nimport { BaseEcommerceAddonEvent } from \"../ecommerce/voice/voice-addon-analytics\";\nimport { GA4B2BSubscriptionEvent } from \"../ecommerce/mbb/b2b/mbb-b2b-analytics\";\nimport {\n GA4SubscriptionCardEvent,\n GA4SubscriptionPromoBannerEvent,\n GA4SubscriptionToggleEvent,\n} from \"../content/subscription-analytics\";\nimport { GA4SearchClickEvent } from \"../content/search-analytics\";\nimport {\n GA4GoToCheckoutButtonClick,\n GA4OrderingButtonClick,\n} from \"@shared/Analytics/ecommerce/voice/voice-analytics-types\";\nimport { GA4CustomerService } from \"@shared/Analytics/content/customer-service-analytics\";\n\nexport const clearPreviousEcommerceObjectToDataLayer = (): void => {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push({ ecommerce: null }); // Clear the previous ecommerce object.\n};\n\ntype BaseDataLayerEvents =\n | BaseEcommerceAddonEvent\n | BaseGA4FeedbackEvent\n | BaseGA4FunnelTracking\n | BaseGA4LoginData\n | BaseGA4MbbEvent\n | BaseGA4MenuEvent\n | GA4B2BSubscriptionEvent\n | GA4ContactFormEvent\n | GA4CustomerService\n | GA4FAQEvent\n | GA4FormStartEvent\n | GA4FrontPageEvent\n | GA4GoToCheckoutButtonClick\n | GA4LeadFormEvent\n | GA4NewsLetterEvent\n | GA4OrderingButtonClick\n | GA4PhoneClickEvent\n | GA4SearchClickEvent\n | GA4SubscriptionCardEvent\n | GA4SubscriptionPromoBannerEvent\n | GA4SubscriptionToggleEvent;\n\nexport const pushToDataLayer = (event: BaseDataLayerEvents): void => {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(event);\n};\n", "import { getBusinessUnit } from \"@shared/Utils/analytics-utils\";\nimport { pushToDataLayer } from \"@shared/Analytics/data/data-layer.facade\";\nimport { BusinessUnit } from \"@shared/Utils\";\n\nexport type GA4SearchClickEvent = {\n event: \"search_click\";\n search_term: string;\n search_has_predictions: boolean;\n search_predictions: string; // \"no predictions\" if no predictions\n business_unit: BusinessUnit;\n};\n\nexport const sendGA4SearchClickEvent = (term: string, predictions: Array) => {\n const event: GA4SearchClickEvent = {\n event: \"search_click\",\n search_term: term,\n search_has_predictions: predictions.length > 0,\n search_predictions: predictions.length > 0 ? predictions.join(\", \") : \"no predictions\",\n business_unit: getBusinessUnit(),\n };\n pushToDataLayer(event);\n};\n", "import { sendGA4SearchClickEvent } from \"@shared/Analytics/content/search-analytics\";\n\nconst FORM_SELECTOR = \".js-search-form\";\nconst INPUT_SELECTOR = \"#search, #ord\";\nconst AUTOCOMPLETE_ITEM_SELECTOR = \".ice-autocomplete-item\";\n\nconst addAutoCompleteClickEvents = (searchInputs: NodeListOf) => {\n for (const input of searchInputs) {\n input.addEventListener(\"Iceac_queryValueChanged\", () => {\n handleQueryValueChanged(input);\n });\n }\n};\n\nconst addSearchSubmitEvents = (forms: NodeListOf) => {\n for (const form of forms) {\n form.addEventListener(\"submit\", () => {\n handleSearchSubmit(form);\n });\n }\n};\n\nconst handleSearchSubmit = (form: HTMLFormElement) => {\n const term = getSearchTerm(form);\n if (!term) return;\n const predictions = getSearchPredictions(form);\n sendGA4SearchClickEvent(term, predictions);\n};\n\nconst handleQueryValueChanged = (input: Element) => {\n const form = input.closest(FORM_SELECTOR);\n if (!form) throw new Error(\"Could not find search form when handling queryValueChanged\");\n handleSearchSubmit(form);\n form.submit();\n};\n\nconst getSearchTerm = (form: HTMLFormElement) => {\n const searchInput = form.querySelector(INPUT_SELECTOR);\n if (!searchInput) return null;\n return searchInput.value;\n};\n\nconst getSearchPredictions = (form: HTMLFormElement) => {\n const predictionElements = form.querySelectorAll(AUTOCOMPLETE_ITEM_SELECTOR);\n if (!predictionElements) return [];\n\n const predictions = Array.from(predictionElements)\n .map((prediction: HTMLElement) => prediction.innerText)\n .filter(Boolean);\n return predictions;\n};\n\nexport const bootstrapSearchEvents = (doc: Document | ShadowRoot = document) => {\n const searchInputs = doc.querySelectorAll(INPUT_SELECTOR);\n addAutoCompleteClickEvents(searchInputs);\n\n const searchForm = doc.querySelectorAll(FORM_SELECTOR);\n addSearchSubmitEvents(searchForm);\n};\n", "import { isEmptyString } from \"@shared/Utils\";\nimport { bootstrapSearchEvents } from \"../SearchEvents/search-events\";\n\ntype MenuLoaderModel = {\n viewString: string;\n};\n\nconst createScriptTag = (url: string) => {\n const script = document.createElement(\"script\");\n script.setAttribute(\"src\", url);\n return script;\n};\n\nconst createLinkTag = (url: string) => {\n const linkElem = document.createElement(\"link\");\n linkElem.setAttribute(\"rel\", \"stylesheet\");\n linkElem.setAttribute(\"href\", url);\n return linkElem;\n};\n\nclass IceMenuLoader extends HTMLElement {\n constructor() {\n super();\n\n this.attachShadow({ mode: \"open\" });\n }\n\n get baseUrl() {\n const url = this.getAttribute(\"baseurl\");\n if (isEmptyString(url)) {\n throw \"Base url is missing in ice-menuloader!\";\n }\n return url;\n }\n\n get loadFooter() {\n return this.getAttribute(\"show-footer\") === \"true\";\n }\n\n get loadFooterBottomOnly() {\n return this.getAttribute(\"bottom-only\");\n }\n\n get getMark() {\n return this.getAttribute(\"mark\");\n }\n\n sendStandaloneEvent = () => {\n const eventToBeDispatched = new CustomEvent(\"__ice_InitStandalone\", {\n detail: { document: this.shadowRoot },\n });\n\n document.dispatchEvent(eventToBeDispatched);\n bootstrapSearchEvents(this.shadowRoot);\n\n document.removeEventListener(\"StandaloneScriptsLoaded\", this.sendStandaloneEvent);\n };\n\n connectedCallback() {\n this.shadowRoot.appendChild(createScriptTag(`${this.baseUrl}/js/dist/standalone.min.js`));\n this.shadowRoot.appendChild(createLinkTag(`${this.baseUrl}/css/brand/standalone.min.css`));\n\n const url = encodeURI(\n this.loadFooter\n ? `${this.baseUrl}/api/footer?bottomonly=${this.loadFooterBottomOnly}&mark=${this.getMark}&home=${this.baseUrl}`\n : `${this.baseUrl}/api/header?mark=${this.getMark}&home=${this.baseUrl}`,\n );\n\n fetch(url, {\n headers: {\n \"Content-type\": \"application/json\",\n },\n mode: \"cors\",\n method: \"GET\",\n })\n .then((response) => {\n return response.json();\n })\n .then((data: MenuLoaderModel) => {\n const div = document.createElement(\"div\");\n div.innerHTML = data.viewString;\n this.shadowRoot.appendChild(div);\n\n setTimeout(() => {\n this.sendStandaloneEvent();\n }, 50);\n })\n .catch((error) => {\n console.error(error);\n });\n }\n}\n\ncustomElements.define(\"ice-menuloader\", IceMenuLoader);\n"], "mappings": "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", "names": ["isEmptyString", "str", "isB2BPage", "getBusinessUnit", "isB2BPage", "pushToDataLayer", "event", "sendGA4SearchClickEvent", "term", "predictions", "event", "getBusinessUnit", "pushToDataLayer", "FORM_SELECTOR", "INPUT_SELECTOR", "AUTOCOMPLETE_ITEM_SELECTOR", "addAutoCompleteClickEvents", "searchInputs", "input", "handleQueryValueChanged", "addSearchSubmitEvents", "forms", "form", "handleSearchSubmit", "term", "getSearchTerm", "predictions", "getSearchPredictions", "sendGA4SearchClickEvent", "searchInput", "predictionElements", "prediction", "bootstrapSearchEvents", "doc", "searchForm", "createScriptTag", "url", "script", "createLinkTag", "linkElem", "IceMenuLoader", "isEmptyString", "eventToBeDispatched", "bootstrapSearchEvents", "response", "data", "div", "error"] }