{"mappings":"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","sources":["scripts/src/tagManager/index.ts","scripts/src/tagManager/custom-events/book-appointment/index.ts","scripts/src/element-ready/index.ts","scripts/src/tagManager/custom-events/brochure-request/index.ts","scripts/src/tagManager/custom-events/brochure-view/index.ts","scripts/src/tagManager/custom-events/contact/index.ts","scripts/src/tagManager/custom-events/event-contact/index.ts","scripts/src/tagManager/custom-events/newsletter-signup/index.ts","scripts/src/tagManager/custom-events/store-contact/index.ts","scripts/src/tagManager/custom-events/store-contact-links/index.ts","scripts/src/tagManager/eccomerce/checkout-step/index.ts","scripts/src/tagManager/eccomerce/product-click/index.ts","scripts/src/tagManager/eccomerce/product-impression/index.ts","node_modules/lodash.throttle/index.js"],"sourcesContent":["// import \"./globals.d.ts\";\r\nimport { IBasketItem } from \"../../src/api/types\";\r\nimport { IStore } from \"../../src/react/store-search/types\";\r\nimport { IDataLayerObject, IDetail, IEventData, IImpression, IPurchase, IProduct as IGTMProduct, ICartItem as IGTMCartItem, ISearchTerm, ISearchAction, IAvailabilityResponse, IFacebookPixel } from \"./types\";\r\nimport { IAvailability, IProduct } from \"../react/product-options/types\";\r\nimport { bookAppointment } from \"./custom-events/book-appointment\";\r\nimport { brochureRequest } from \"./custom-events/brochure-request\";\r\nimport { brochureView } from \"./custom-events/brochure-view\";\r\nimport { contact } from \"./custom-events/contact\";\r\nimport { eventContact } from \"./custom-events/event-contact\";\r\nimport { newsletterSignup } from \"./custom-events/newsletter-signup\";\r\nimport { siteSearch } from \"./custom-events/site-search\";\r\nimport { storeContact } from \"./custom-events/store-contact\";\r\nimport { storeContactLinks } from \"./custom-events/store-contact-links\";\r\nimport { checkoutStep } from \"./eccomerce/checkout-step\";\r\nimport { productClick } from \"./eccomerce/product-click\";\r\nimport { productImpression } from \"./eccomerce/product-impression\";\r\nimport { subscribe, events } from \"../api/events\";\r\n\r\n\r\nconst testMode = (obj?: IDataLayerObject | undefined, callback?: () => void | undefined) => {\r\n\r\n const urlParams = new URLSearchParams(window.location.search);\r\n if (urlParams.get('gtm_debug') == \"x\") {\r\n if (!!obj) {\r\n console.log(obj, callback, JSON.stringify(obj));\r\n }\r\n }\r\n}\r\n\r\nconst pushToDataLayer = (obj: IDataLayerObject, callback?: () => void) => {\r\n\r\n if (window.google_tag_manager) {\r\n window.dataLayer = window.dataLayer || [];\r\n window.dataLayer.push(obj);\n\n if (!!callback) {\r\n setTimeout(function () {\n callback();\n }, 500);\r\n }\r\n } else { \r\n if (document.readyState != 'complete') {\r\n // Attach onload event with current vales to re-run.\r\n // in some cases the gtm window loads after the push to datalayer function\r\n window.addEventListener(\"load\", () => {\r\n pushToDataLayer(obj, callback);\r\n });\r\n }\r\n else {\r\n // Otherwise tag manager wont load run the callback if any.\r\n if (!!callback) {\r\n callback();\r\n }\r\n }\r\n }\n\r\n testMode(obj, callback);\r\n\r\n};\r\n\r\nexport const createEvent = (obj: IDataLayerObject) => {\r\n pushToDataLayer(obj);\r\n};\r\n\r\n/**\r\n * Measures the failures/success views of the order details and order lookup page\r\n */\r\nexport const trackOrderLookup = (\r\n) => {\r\n\r\n if (document.querySelector('.js-track-order-lookup-error,.js-track-order-lookup-success') != null) {\r\n let success = document.querySelector('.js-track-order-lookup-error') != null\r\n ? false : document.querySelector('.js-track-order-lookup-success') != null ? true : false;\r\n const data: IEventData = {\r\n category: \"track my order\",\r\n action: \"view\",\r\n label: success + \"\"\r\n };\r\n pushToDataLayer({\r\n event: \"track my order\",\r\n eventData: data\r\n });\r\n };\r\n}\r\n\r\n/**\r\n * take the original product name and sets the correct casing for each word.\r\n * @param {string} text - product name convert so the same casing to prevent duplicates in reporting.\r\n */\r\nexport const productNameCasing = (name: string) => {\r\n return name.replace(/\\w\\S*/g, txt => {\r\n return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();\r\n });\r\n};\r\n\r\n/**\r\n * https://developers.google.com/tag-manager/enhanced-ecommerce#product-clicks\r\n * @param {IProduct} product - product that was clicked\r\n * @param {string} productListName? - the list that the product was clicked from\r\n * @param {string} url - url for current product being clicked\r\n */\r\nexport const trackProductClick = (\r\n element: JQuery.ClickEvent,\r\n product: IProduct,\r\n callback: () => void,\r\n productListName: string\r\n) => {\r\n element.preventDefault();\r\n pushToDataLayer(\r\n {\r\n event: \"productClick\",\r\n ecommerce: {\r\n click: {\r\n actionField: productListName ? { list: productListName } : undefined, // Optional list property.\r\n products: [product]\r\n }\r\n }\r\n },\r\n callback\r\n );\r\n};\r\n\r\n/**\r\n * https://developers.google.com/tag-manager/enhanced-ecommerce#impressions\r\n * @param {Array[IImpression]} products - products that have been seen in viewport\r\n * @param {string} currencyCode - currency code of the selected product\r\n */\r\nexport const trackProductImpressions = (\r\n products?: IImpression[],\r\n) => {\r\n pushToDataLayer({\r\n event: \"productImpression\",\r\n ecommerce: {\r\n impressions: products\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * https://developers.google.com/tag-manager/enhanced-ecommerce#details\r\n * @param {IProductGtm[]} product - Iproduct: product of product page\r\n * @param {string} productListName? - the list page name of product, parent category\r\n */\r\nexport const trackProductDetail = (detail: IDetail) => {\r\n const product: IProduct = detail.article;\r\n var gtmProduct = getProduct(null, product);\r\n pushToDataLayer({\r\n event: \"productDetail\",\r\n ecommerce: {\r\n detail: {\r\n actionField: { list: detail.productListName },\r\n products: [gtmProduct]\r\n }\r\n }\r\n });\r\n\r\n};\r\n\r\nsubscribe(events.AVAILABILITY_VIEW, (event: CustomEvent) => { return trackProductAvailability(event); });\r\n\r\n\r\n\r\n\r\nexport const trackProductPageErrors = () => {\r\n const data: IEventData = {\r\n category: \"product page errors\",\r\n action: \"view\",\r\n label: window.location.href,\r\n };\r\n pushToDataLayer({\r\n event: \"product page react app error\", eventData: data\r\n })\r\n\r\n};\r\n\r\nsubscribe(events.PRODUCT_DETAIL_VIEW, (event: CustomEvent) => { return trackProductDetail(event.detail); });\r\nsubscribe(events.PRODUCTPAGE_ERROR, (event: CustomEvent) => { return trackProductPageErrors(); });\r\n\r\n/**\r\n * https://developers.google.com/tag-manager/enhanced-ecommerce#cart\r\n * @param {IProduct} product - product that is being added\r\n * @param {string} currencyCode? - currency code for product\r\n */\r\nexport const trackAddToCart = (cartItem: IGTMCartItem) => {\r\n const product: IGTMProduct = getProduct(cartItem.basketItem, null, cartItem.quantity);\r\n pushToDataLayer({\r\n event: \"addToCart\",\r\n ecommerce: {\r\n add: {\r\n products: [product]\r\n }\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * https://developers.google.com/tag-manager/enhanced-ecommerce#cart\r\n * @param {IProduct} product - product that is being added\r\n */\r\nexport const trackRemoveFromCart = (\r\n cartItem: IGTMCartItem,\r\n) => {\r\n let product: IGTMProduct = getProduct(cartItem.basketItem, null, cartItem.quantity);\r\n pushToDataLayer({\r\n event: \"removeFromCart\",\r\n ecommerce: {\r\n remove: {\r\n products: [product]\r\n }\r\n }\r\n })\r\n};\r\n\r\n\r\nsubscribe(events.ITEM_REMOVED_FROM_BASKET, (event: CustomEvent) => { return trackRemoveFromCart(event.detail); });\r\n\r\n\r\n\r\n/**\r\n * https://developers.google.com/tag-manager/enhanced-ecommerce#checkoutstep\r\n * @param {IProduct} products - products in cart\r\n * @param {string} checkoutStepName - name of the current checkout step\r\n * @param {number} checkoutStepValue - position of the step in the sequence of checkout steps\r\n */\r\nexport const trackCheckoutStep = (\r\n products: IGTMProduct[],\r\n checkoutStepName: string,\r\n checkoutStepValue: number\r\n) => {\r\n pushToDataLayer({\r\n event: \"checkout\",\r\n ecommerce: {\r\n checkout: {\r\n actionField: { step: checkoutStepValue, option: checkoutStepName },\r\n products: products.length > 1 ? products : [products[0]],\r\n }\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * Records purchases after successful transaction\r\n */\r\nexport const trackPurchase = () => {\r\n if (document.querySelector(\".js-track-transaction\") != null) {\r\n var gaRevenueTag: IPurchase = JSON.parse(document.querySelector(\".js-track-transaction\")?.getAttribute(\"data-purchase\") as string);\r\n\r\n pushToDataLayer({\r\n event: \"purchase\",\r\n ecommerce: {\r\n purchase: gaRevenueTag,\r\n productIdsArray: {\r\n article: gaRevenueTag.products.map(x => x.id?.articleId),\r\n product: gaRevenueTag.products.map(x => x.id?.productId)\r\n }\r\n }\r\n });\r\n }\r\n};\r\n\r\n\r\n/**\r\n * @param {IBasketItem} basketItem - element from within the basket.\r\n * @param {IProduct} iproduct - Product data from react app.\r\n */\r\nexport const getProduct = (basketItem?: IBasketItem | null, product?: IProduct | null, quantity?: number): IGTMProduct => {\r\n let gtmProduct: IGTMProduct = {};\r\n\r\n if (basketItem != null) {\r\n // This data is used on the add to cart, remove cart,\r\n // & checkout steps; from the basket react app.\r\n gtmProduct.name = basketItem.ProductNameGTM;\r\n gtmProduct.id = { productId: basketItem.ProductId, articleId: basketItem.FinishedArticleId != null ? basketItem.FinishedArticleId.ArticleId : null };\r\n gtmProduct.price = basketItem.ItemPriceRaw;\r\n gtmProduct.brand = basketItem.Type;\r\n gtmProduct.category = basketItem.Category;\r\n gtmProduct.currencyCode = basketItem.CurrencyCode;\r\n gtmProduct.variant = basketItem.OptionName;\r\n if (basketItem != null && basketItem[\"SelectedQuantity\"] != null) {\r\n gtmProduct.quantity = basketItem.SelectedQuantity;\r\n }\r\n }\r\n else if (product != null) {\r\n // This data is used on the product detail view only.\r\n gtmProduct.name = product.productName;\r\n gtmProduct.id = { productId: product.productId, articleId: product.articleId };\r\n gtmProduct.price = (product.prices != null && product.prices.length > 0) ? product.prices.find(e => e.id.articleId == product.articleId)?.value : 0;\r\n gtmProduct.category = product.category;\r\n gtmProduct.variant = product.productArticles.find(e => e.articleId == product.articleId)?.optionName;\r\n gtmProduct.currencyCode = product.lowestPrice != null && product.lowestPrice.currencyCode != null ? product.lowestPrice.currencyCode : \"GBP\"\r\n }\r\n\r\n if (quantity != null) {\r\n gtmProduct.quantity = quantity;\r\n }\r\n\r\n return gtmProduct;\r\n};\r\n\r\n\r\n\r\n\r\nsubscribe(events.ITEM_ADDED_TO_BASKET, (event: CustomEvent) => { return trackAddToCart(event.detail); });\r\n/**\r\n * /our-stores/store-results/ in react app\r\n * @param {string} searchTerm - value from react in store search\r\n */\r\nexport const trackStoreSearchInApp = (searchTerm: string) => {\r\n const data: IEventData = {\r\n category: \"store search\",\r\n action: \"search\",\r\n label: searchTerm.toLowerCase()\r\n };\r\n\r\n pushToDataLayer({\r\n event: \"store search\",\r\n eventData: data\r\n });\r\n};\r\n\r\n/*\r\n * /our-stores/store-results/ in react app\r\n * @param {IStore} store - object with values from the location search.\r\n * @param {string} label - static string represents the type of link clicked on.\r\n */\r\nexport const trackStoreMapLinkInApp = (\r\n location: IStore,\r\n label: string,\r\n event: any,\r\n callback: () => void\r\n) => {\r\n location = location as IStore;\r\n\r\n event.preventDefault();\r\n const data: IEventData = {\r\n category: \"store map\",\r\n action: \"click\",\r\n label: location.name + \" \" + label,\r\n nonInteraction: true\r\n };\r\n pushToDataLayer(\r\n {\r\n event: \"map interaction\",\r\n eventData: data\r\n },\r\n callback\r\n );\r\n};\n\n\r\nexport const trackLongLat = (\r\n regionCode: string,\r\n latLong: string,\r\n callback: () => void\r\n) => {\r\n\r\n const data: IEventData = {\r\n category: \"store latlong\",\r\n action: \"click\",\r\n label: latLong,\r\n nonInteraction: true\r\n };\r\n pushToDataLayer(\r\n {\r\n event: \"store search latlong\",\r\n eventData: data\r\n },\r\n callback\r\n );\r\n};\r\n\r\n/**\r\n * /our-stores/store-results/ in react app\r\n * @param {IStore} store - object with values from the location search\r\n * @param {string} label - static string represents the type of link clicked on\r\n */\r\nexport const trackStoreCardLinkInApp = (\r\n location: IStore,\r\n label: string,\r\n partnerStore: boolean,\r\n event: any,\r\n callback: () => void\r\n) => {\n event.preventDefault();\n\r\n location = location as IStore;\r\n const data: IEventData = {\r\n category: \"store card\",\r\n action: \"click\",\r\n label: location.name + \" \" + label,\r\n nonInteraction: true\r\n };\n\r\n pushToDataLayer(\r\n {\r\n event: \"store card\",\r\n eventData: data\r\n },\r\n callback\r\n );\r\n};\r\n\r\n/**\r\n * brochure request, sends events for each brochure\r\n * @param {string[]} brochures - list of names relating to the brochure order.\r\n */\r\nexport const trackBrochureRequest = (\r\n brochures: string[],\r\n event?: any,\r\n callback?: () => void\r\n) => {\r\n for (const brochure of brochures) {\r\n if (brochure.length > 1) {\r\n const data: IEventData = {\r\n category: \"brochure request\",\r\n action: \"form submit\",\r\n label: brochure.toLowerCase(),\r\n nonInteraction: true\r\n };\r\n pushToDataLayer({\r\n event: \"brochure request\",\r\n eventData: data\r\n });\r\n }\r\n }\r\n};\r\n\r\n/**\r\n * brochure view for issuu\r\n * @param {string} brochureName - name of the brochure\r\n * @param {string} type of view: download or view in browser\r\n */\r\nexport const trackBrochureView = (brochureName: string, type: string) => {\r\n const data: IEventData = {\r\n category: \"brochure view\",\r\n action: \"form submit\",\r\n label: brochureName + \" \" + type,\r\n nonInteraction: true\r\n };\r\n pushToDataLayer({\r\n event: \"brochure view\",\r\n eventData: data\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n/**\r\n * Site search, before the form is submitted what value the search terms was.\r\n * @param {string} searchTerm - string with value from the site search\r\n */\r\nexport const trackSiteSearch = (\r\n searchAction: ISearchAction,\r\n) => {\r\n\r\n searchAction.event.preventDefault();\r\n const data: IEventData = {\r\n category: \"site search\",\r\n action: \"search\",\r\n label: searchAction.eventData.label\r\n };\r\n pushToDataLayer(\r\n {\r\n event: \"site search\",\r\n eventData: data\r\n },\r\n searchAction.callback\r\n );\r\n};\r\n\r\nsubscribe(events.OPEN_SEARCH, (event: CustomEvent) => {\r\n pushToDataLayer({\r\n event: \"search modal opened\",\r\n });\r\n});\r\n\r\nsubscribe(events.SITE_SEARCH, (event: CustomEvent) => { return trackSiteSearch(event.detail as ISearchAction) });\r\n\r\n\r\n\r\n/**\r\n * Contact form on neptune store page\r\n * @param {string} storeName - store or partner name\r\n */\r\nexport const trackStoreContact = (storeName: string) => {\r\n const data: IEventData = {\r\n category: \"store contact\",\r\n action: \"form submit\",\r\n label: storeName\r\n };\r\n pushToDataLayer({\r\n event: \"store contact\",\r\n eventData: data\r\n });\r\n};\r\n\r\n/**\r\n * Tracks links on the contact us page, telephone & email\r\n * @param {string} linkText - tel (department) or email: mailto value\r\n */\r\n\r\nexport const trackContactLinks = (\r\n linkText: string,\r\n event: any,\r\n callback: () => void\r\n) => {\r\n event.preventDefault();\r\n const data: IEventData = {\r\n category: \"contact links\",\r\n action: \"click\",\r\n label: linkText\r\n };\r\n pushToDataLayer(\r\n {\r\n event: \"contact links\",\r\n eventData: data\r\n },\r\n callback\r\n );\r\n};\r\n\r\n/**\r\n * Track links on neptune store page\r\n * @param {string} link - store or partner name\r\n */\r\nexport const trackStoreContactLinks = (\r\n storeName: string,\r\n link: string,\r\n event: any,\r\n newTab: boolean,\r\n callback: () => void\r\n) => {\r\n if (!newTab) {\r\n event.preventDefault();\r\n }\r\n const data: IEventData = {\r\n category: \"store contact links\",\r\n action: \"click\",\r\n label: storeName + \" | \" + link\r\n };\r\n pushToDataLayer(\r\n {\r\n event: \"store contact links\",\r\n eventData: data\r\n },\r\n callback\r\n );\r\n};\r\n\r\n/**\r\n * Event form on events page for store\r\n * @param {string} eventName - event name for the current event form to track\r\n */\r\nexport const trackEventContact = (eventName: string) => {\r\n const data: IEventData = {\r\n category: \"event sign up\",\r\n action: \"form submit\",\r\n label: eventName\r\n };\r\n pushToDataLayer({\r\n event: \"event sign up\",\r\n eventData: data\r\n });\r\n};\r\n\r\n/**\r\n * Event form book an appointment\r\n * @param {[]} inStoreOrVisit - values for if in store or visit\r\n * @param {[]} consultationType - values for consultation type\r\n */\r\nexport const trackBookAppointment = (consultationType: string) => {\r\n const data: IEventData = {\r\n category: \"book an appointment\",\r\n action: \"form submit\",\r\n label: consultationType\r\n };\r\n pushToDataLayer({\r\n event: \"book an appointment\",\r\n eventData: data\r\n });\r\n};\r\n\r\n/**\r\n * Tracks successful sign ups to the newsletter page.\r\n * @param {string} url - url of the current page for when signup newsletter was subscribed.\r\n * @param {void} callback - optional event to happen after push to datalayer.\r\n */\r\nexport const trackNewsletterSignup = (url: string, callback?: () => void) => {\r\n const data: IEventData = {\r\n category: \"newsletter sign up\",\r\n action: \"form submit\",\r\n label: url\r\n };\r\n pushToDataLayer(\r\n {\r\n event: \"newsletter sign up\",\r\n eventData: data\r\n },\r\n callback\r\n );\r\n};\r\n\r\n/**\r\n * Tracks products that have the attribute back in stock set to true,\r\n * or if the form has been submitted successfully\r\n * @param {string} legacySku - the master code for the viewed product.\r\n * @param {string} action - the action for that triggered the event.\r\n */\r\nexport const trackBackInStock = (articleId: string, action: string) => {\r\n const data: IEventData = {\r\n category: \"back in stock\",\r\n action: action,\r\n label: articleId\r\n };\r\n pushToDataLayer({\r\n event: \"back in stock\",\r\n eventData: data\r\n });\r\n};\r\n\r\n/**\r\n * product availability tracking, tracks product and their related availability text.\r\n * @param {IAvailability[]} availability - Availability text for the related article & finishes.\r\n */\r\nexport const trackProductAvailability = (\r\n event?: CustomEvent,\r\n) => {\r\n\r\n const availabilityReponse: IAvailabilityResponse = event?.detail;\r\n var isFound = false;\r\n\r\n // Only track availability on uk text.\r\n if (!document.querySelector('html[data-lang=\"en-GB\"]') || !availabilityReponse || !availabilityReponse.availability) {\r\n return;\r\n }\r\n\r\n const eventData: IEventData = {\r\n category: \"product availability\",\r\n action: availabilityReponse.legacySku,\r\n label: availabilityReponse.availability.text,\r\n details: JSON.stringify(availabilityReponse.availability.id.finishes)\r\n };\r\n\r\n let productAvailabilityStored: Array = JSON.parse(sessionStorage.getItem('productAvailabilityCheck') || \"[]\");\r\n\r\n\r\n if (productAvailabilityStored.length > 0) {\r\n // Do not send the event again if its already been sent.\r\n productAvailabilityStored.forEach(e => {\r\n if (e.action == eventData.action) {\r\n if (e.label == eventData.label) {\r\n if (e.details == eventData.details) {\r\n isFound = true;\r\n }\r\n }\r\n }\r\n })\r\n\r\n if (isFound) {\r\n return;\r\n }\r\n }\r\n\r\n productAvailabilityStored.push(eventData);\r\n sessionStorage.setItem('productAvailabilityCheck', JSON.stringify(productAvailabilityStored));\r\n\r\n pushToDataLayer({\r\n event: \"product availability\",\r\n eventData: eventData\r\n });\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nproductImpression();\r\nproductClick();\r\ncheckoutStep();\r\ntrackPurchase();\r\nbrochureRequest();\r\nbrochureView();\r\nsiteSearch()\r\nstoreContact();\r\neventContact();\r\nbookAppointment();\r\nnewsletterSignup();\r\nstoreContactLinks();\r\ncontact();\r\ntrackOrderLookup();\r\n","import $ from \"jquery\";\nimport { elementReady } from \"../../../../src/element-ready\";\nimport { trackBookAppointment } from \"../../index\";\n\n// when successfully submitted\nconst bookAppointmentComplete = (consultationType: string) => {\n let hasRan = false;\n elementReady(\".cog-cognito .cog-confirmation__message\", () => {\n if (!hasRan) {\n trackBookAppointment(consultationType);\n var s = document.createElement('script');\n s.innerHTML = \"pintrk('track', 'lead', {lead_type: '\" + consultationType.replace(/ /g, \"\") + \"'}); \\n\"\n document.body.appendChild(s);\n hasRan = true;\n }\n });\n};\nexport const bookAppointment = () => {\n // class is applied from third party script\n\n $(document).on(\"click\", \".cog-button--submit\", event => {\n event.stopImmediatePropagation();\r\n const consultationTypes = document.querySelectorAll('.cog-cognito fieldset:first-of-type input[type=\"checkbox\"]');\n\n if (consultationTypes.length == 0) {\n return;\r\n }\n\n var selected = [];\n consultationTypes.forEach(e => {\n\n if (e.checked) {\n selected.push(e.value);\r\n }\n })\n\n if (selected.length == 0) {\n selected.push(\"n/a\");\r\n }\n\n bookAppointmentComplete(JSON.stringify(selected));\n });\n\n};\n","/**\r\n * Indefintely expects dom selector to exist and will repeat function until node is loaded\r\n * @param {string} selector - dom selector for pending element\r\n * @param {void} callback - the event for which should run after\r\n */\r\nexport const elementReady = (selector: string, callback: () => void) => {\r\n if (document.querySelector(selector) != null) {\r\n callback();\r\n } else {\r\n setTimeout(() => {\r\n elementReady(selector, callback);\r\n }, 30);\r\n }\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackBrochureRequest } from \"../../index\";\r\n\r\nexport const brochureRequest = () => {\r\n $(\".js-track-brochure-request\").each((i, element) => {\r\n const brochures = $(element).val() as string;\r\n // Splits selected brochures using unique character from requested brochures.\r\n const brochuresArray: any[] = brochures.split(\"~\");\r\n trackBrochureRequest(brochuresArray);\r\n });\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackBrochureView } from \"../../index\";\r\n\r\nexport const brochureView = () => {\r\n $(\".js-track-brochure-view\").on(\"click\", event => {\r\n trackBrochureView(\r\n $(event.currentTarget).data(\"name\"),\r\n $(event.currentTarget).data(\"type\")\r\n );\r\n });\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackContactLinks } from \"../../index\";\r\n\r\nexport const contact = () => {\r\n $(\".js-track-contact\").on(\"click\", event => {\r\n const linkText =\r\n $(event.currentTarget).attr(\"data-category\") != null\r\n ? ($(event.currentTarget).attr(\"data-category\") as string)\r\n : ($(event.currentTarget).attr(\"href\") as string);\r\n\r\n trackContactLinks(\r\n linkText,\r\n event,\r\n () =>\r\n (window.location.href = $(event.currentTarget).attr(\"href\") as string)\r\n );\r\n });\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackEventContact } from \"../../index\";\r\n\r\nexport const eventContact = () => {\r\n if ($('.js-track-success-url').length) {\r\n var url = new URL(window.location.href);\r\n const storeEventContactName = url.searchParams.get(\"storeEventContactName\")\r\n if (storeEventContactName != null) {\r\n trackEventContact(storeEventContactName);\r\n }\r\n }\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackNewsletterSignup } from \"../../index\";\r\n\r\nexport const newsletterSignup = () => {\r\n if ($(\".js-track-newsletter-signup\").length) {\r\n trackNewsletterSignup(window.location.href);\r\n }\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackStoreContact } from \"../../index\";\r\n\r\nexport const storeContact = () => {\r\n if ($('.js-track-success-url').length) { \r\n var url = new URL(window.location.href);\r\n const storeContactName = url.searchParams.get(\"storeContactName\") \r\n if (storeContactName != null) { \r\n trackStoreContact(storeContactName);\r\n }\r\n }\r\n};\r\n","import $ from \"jquery\";\r\nimport { trackStoreContactLinks } from \"../../index\";\r\n\r\nexport const storeContactLinks = () => {\r\n $(\".js-track-store-contact-link\").on(\"click\", event => {\r\n const gmaps =\r\n $(event.currentTarget)\r\n .attr(\"href\")\r\n ?.indexOf(\"maps.google\") !== -1;\r\n trackStoreContactLinks(\r\n $(\"h1\").html() as string,\r\n $(event.currentTarget).attr(\"href\") as string,\r\n event,\r\n gmaps ? true : false,\r\n () => {\r\n if (!gmaps) {\r\n window.location.href = $(event.currentTarget).attr(\"href\") as string;\r\n }\r\n }\r\n );\r\n });\r\n};\r\n","import $ from \"jquery\";\r\nimport { elementReady } from \"../../../../src/element-ready\";\r\nimport { productNameCasing, trackCheckoutStep } from \"../../index\";\r\nimport { IProduct as IGTMProduct } from \"../../types\";\r\n\r\nconst checkoutStepAdd = () => {\r\n const products = new Array();\r\n $(\"#basket-app-checkout .js-basket-item\").each((index, element) => {\r\n if ($(element).data(\"product\") != null) {\r\n const product = $(element).data(\"product\");\r\n product.name = productNameCasing(product.name);\r\n products.push(product);\r\n }\r\n });\r\n const checkoutStepName = $(\"#basket-app-checkout\").data(\"step-name\") || \"\";\r\n const checkoutStepValue = $(\"#basket-app-checkout\").data(\"step-value\") || \"\";\r\n trackCheckoutStep(products, checkoutStepName, checkoutStepValue);\r\n};\r\n\r\nexport const checkoutStep = () => {\r\n const basketAppCheckout = document.getElementById(\r\n \"basket-app-checkout\"\r\n ) as HTMLElement;\r\n if (basketAppCheckout != null) {\r\n elementReady(\".js-basket-item\", () => checkoutStepAdd()); \r\n }\r\n};\r\n","import $ from \"jquery\";\r\nimport { productNameCasing, trackProductClick } from \"../../index\";\r\nimport { IProduct as IGTMProduct } from \"../../types\";\r\n\r\nexport const productClick = () => {\r\n // product list click action\r\n $(\".js-track-product-click\").on(\"click\", e => {\r\n let product = $(e.currentTarget).data(\"product\");\r\n\r\n product = product as IGTMProduct;\r\n product.name = productNameCasing(product.name);\r\n const productListName = $(e.currentTarget).data(\"list\") as string;\r\n trackProductClick( e,\r\n product,\r\n () => (window.location.href = $(e.currentTarget).attr(\"href\") as string),\r\n productListName\r\n );\r\n });\r\n};\r\n","import $ from \"jquery\";\r\nimport throttle from \"lodash.throttle\";\r\nimport { productNameCasing, trackProductImpressions } from \"../../index\";\r\nimport { IImpression } from \"../../types\";\r\n\r\nexport const isVisible = (element: JQuery) => {\r\n const $window = $(window);\r\n const docViewTop = $window.scrollTop() as number;\r\n const docViewBottom = docViewTop + $window.height()!;\r\n const elemTop = $(element).offset()?.top!;\r\n const elemBottom = elemTop + $(element)?.height()!;\r\n return elemBottom <= docViewBottom && elemTop >= docViewTop;\r\n};\r\n\r\nexport const productImpression = () => {\r\n // product list impressions\r\n let productsViewed = new Array();\r\n\r\n const onScroll = () => {\r\n if ($(\".js-track-product-impression\").length > 0) {\r\n const productsToTrack = new Array();\r\n $(\".js-track-product-impression\").each((index, element) => {\r\n if (isVisible($(element))) {\r\n const product = $(element).data(\"product\") as IImpression;\r\n product.name = productNameCasing(product.name);\r\n product.list = $(element).data(\"list\"); \r\n product.id = product.id[\"productId\"] != null ? product.id[\"productId\"] : product.id;\r\n if (productsViewed.some(p => p.id === product.id)) {\r\n return;\r\n }\r\n productsToTrack.push(product);\r\n }\r\n });\r\n if (productsToTrack.length > 0) {\r\n productsViewed = productsViewed.concat(productsToTrack);\r\n trackProductImpressions(productsToTrack);\r\n }\r\n }\r\n };\r\n const throttledScroll = throttle(onScroll, 100);\r\n window.addEventListener('scroll', (e) => { throttledScroll() }, { passive: true });\r\n};\r\n","/**\n * lodash (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors \n * Released under MIT license \n * Based on Underscore.js 1.8.3 \n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n"],"names":["$gDPVd","parcelRequire","$884d9158a3ae40e0$var$pushToDataLayer","obj","callback","window","google_tag_manager","dataLayer","push","setTimeout","document","readyState","addEventListener","URLSearchParams","location","search","get","console","log","JSON","stringify","$884d9158a3ae40e0$var$testMode","$884d9158a3ae40e0$export$c30017717ce2168e","$884d9158a3ae40e0$export$2e8b88c4a0edb9e8","querySelector","success","event","eventData","category","action","label","$884d9158a3ae40e0$export$9bacbe68c06b2523","name","replace","txt","charAt","toUpperCase","substr","toLowerCase","$884d9158a3ae40e0$export$a51bb7cafc9a2200","element","product","productListName","preventDefault","ecommerce","click","actionField","list","undefined","products","$884d9158a3ae40e0$export$4ce423d0796b177f","impressions","$884d9158a3ae40e0$export$d22ffb5fd0be0696","detail","article","gtmProduct","$884d9158a3ae40e0$export$e2005c9600188ac7","$aOilU","subscribe","events","AVAILABILITY_VIEW","$884d9158a3ae40e0$export$753c95c30d4ed106","$884d9158a3ae40e0$export$1a13cd532d3cee94","data","href","PRODUCT_DETAIL_VIEW","PRODUCTPAGE_ERROR","$884d9158a3ae40e0$export$c8b93a961802392a","cartItem","basketItem","quantity","add","$884d9158a3ae40e0$export$f899675fe30bc3f5","remove","ITEM_REMOVED_FROM_BASKET","$884d9158a3ae40e0$export$9cedfb516514f81b","checkoutStepName","checkoutStepValue","checkout","step","option","length","$884d9158a3ae40e0$export$c0440a6856e748cf","ref1","gaRevenueTag","parse","getAttribute","purchase","productIdsArray","map","x","ref","id","articleId","productId","ProductNameGTM","ProductId","FinishedArticleId","ArticleId","price","ItemPriceRaw","brand","Type","Category","currencyCode","CurrencyCode","variant","OptionName","SelectedQuantity","ref3","productName","prices","find","e","value","productArticles","optionName","lowestPrice","ITEM_ADDED_TO_BASKET","$884d9158a3ae40e0$export$5811ce772a7597ee","searchTerm","$884d9158a3ae40e0$export$7034b10c06827df5","nonInteraction","$884d9158a3ae40e0$export$3faf72ce08cd5a8e","regionCode","latLong","$884d9158a3ae40e0$export$a62a01fa9f9cd025","partnerStore","$884d9158a3ae40e0$export$bb8c59ab022f0c8","brochures","brochure","$884d9158a3ae40e0$export$2333ad44012b021d","brochureName","type","$884d9158a3ae40e0$export$a47525f7e2fcc1e9","searchAction","OPEN_SEARCH","SITE_SEARCH","$884d9158a3ae40e0$export$da08cb9f51180b0","storeName","$884d9158a3ae40e0$export$2947b8b630794e68","linkText","$884d9158a3ae40e0$export$4263de2619b9e297","link","newTab","$884d9158a3ae40e0$export$abff12b4e1f9f116","eventName","$884d9158a3ae40e0$export$876bb8023c3775c8","consultationType","$884d9158a3ae40e0$export$83e5199887da1e7e","url","$884d9158a3ae40e0$export$fa8d323af8f7fbc9","availabilityReponse","isFound","availability","legacySku","text","details","finishes","productAvailabilityStored","sessionStorage","getItem","forEach","setItem","$2LbhP","productImpression","$8NfNv","productClick","$aVN3R","checkoutStep","$jYl0z","brochureRequest","$d1enP","brochureView","$9uiKM","siteSearch","$5sG9v","storeContact","$37SXT","eventContact","bookAppointment","$7Y3Qv","newsletterSignup","$f403g","storeContactLinks","$9gn2N","contact","$4sYka","$0e12d9a21bd1550f$export$2ac64a422d3a9b85","$parcel$interopDefault","on","stopImmediatePropagation","consultationTypes","querySelectorAll","selected","checked","hasRan","$ckKaX","elementReady","$7XRCK","trackBookAppointment","s","createElement","innerHTML","body","appendChild","$0e12d9a21bd1550f$var$bookAppointmentComplete","$2158775948cf311d$export$5a68694636710d38","selector","$25238c31dd17d7bb$export$62f76f491386a7f8","each","i","brochuresArray","val","split","trackBrochureRequest","$b274e0bf729ce27c$export$a92b539189e36f3e","trackBrochureView","currentTarget","$a6c26ec889a5ccf4$export$414d047e665c7112","attr","trackContactLinks","$a5dce0626583d953$export$eb472208c3faad9","storeEventContactName","URL","searchParams","trackEventContact","$fec51713d51767fe$export$2a30a008700ed34","trackNewsletterSignup","$bfcb7fa697cb527e$export$d1a8a8a96cdeb12f","storeContactName","trackStoreContact","$68db823e5e5ca9e8$export$4afc861da29f5ccf","gmaps","indexOf","trackStoreContactLinks","html","$41a6a31b0a147d54$export$598070e4353dd058","getElementById","Array","index","productNameCasing","trackCheckoutStep","$41a6a31b0a147d54$var$checkoutStepAdd","$498a374459e67895$export$74be9f952a259636","trackProductClick","$267968e3d6628076$export$465ae8ae524a2b6a","productsViewed","throttledScroll","$leeC5","productsToTrack","$window","docViewTop","scrollTop","docViewBottom","height","elemTop","offset","top","$267968e3d6628076$export$795910f5f15a9633","some","p","concat","trackProductImpressions","passive","$f7463db15f187b9d$var$FUNC_ERROR_TEXT","$f7463db15f187b9d$var$reTrim","$f7463db15f187b9d$var$reIsBadHex","$f7463db15f187b9d$var$reIsBinary","$f7463db15f187b9d$var$reIsOctal","$f7463db15f187b9d$var$freeParseInt","parseInt","$f7463db15f187b9d$var$freeGlobal","$parcel$global","Object","$f7463db15f187b9d$var$freeSelf","self","$f7463db15f187b9d$var$root","Function","$f7463db15f187b9d$var$objectToString","prototype","toString","$f7463db15f187b9d$var$nativeMax","Math","max","$f7463db15f187b9d$var$nativeMin","min","$f7463db15f187b9d$var$now","Date","now","$f7463db15f187b9d$var$debounce","func","wait","options","lastArgs","lastThis","maxWait","result1","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","apply","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","result","remainingWait","debounced","isInvoking","arguments","this","$f7463db15f187b9d$var$toNumber","$f7463db15f187b9d$var$isObject","cancel","clearTimeout","flush","$f7463db15f187b9d$var$isObjectLike","call","$f7463db15f187b9d$var$isSymbol","other","valueOf","isBinary","test","slice","module","exports"],"version":3,"file":"tagManager.df3f6c68.js.map"}