if(!window.initVar){ window.initVar = { apiUrl: "https://cartbite-app-api.staqlab.com/grow", serviceWorkerUrl: "/apps/grow/grow/api/p/js/sw.js", subscriberNewUniqueIdUrl: "https://cartbite-app-api.staqlab.com/grow/api/subscribers/uniqueId", clientStatusUrl: "https://cartbite-app-api.staqlab.com/grow/api/clientStatus", clickNotificationUrl: "https://cartbite-app-api.staqlab.com/grow/api/workflows/event", subscribeUrl: "https://cartbite-app-api.staqlab.com/grow/api/subscriber", meta: {}, vapidKey: "BAEl-2EpKUVEhKGi9vX4SRvIqvIE4A3Aoz7jw9ZKS4e-idWQincXyH_gFApWtK8kZTaevjs8o0m-jX1hLRp7zTg", clientId: "QHH5QNAB8MXH8YUW9QGKXWMQ", pushOptInSetting: {"delay":86400,"message":{"body":"We will notify you about new products and exclusive promotions","title":"Never miss a sale","buttons":[{"label":"Later","order":1},{"label":"Allow","order":2}],"iconUrl":"https://stlf.s3.ap-south-1.amazonaws.com/QHH5QNAB8MXH8YUW9QGKXWMQ/IA6UBNLBWX/ucpfh.png"},"isEnabled":false,"showModal":true,"initialDelay":10}, subscriberId: '', stockFulFilledPushCampaign: { isActive: true, uniqueId: 'QHH5QNAB8MXH8YUW9QGKXWMQ-5' }, stockFulFilledEmailCampaign: { isActive: true, uniqueId: 'QHH5QNAB8MXH8YUW9QGKXWMQ-7' }, stockFulFilledSmsCampaign: { isActive: true, uniqueId: 'QHH5QNAB8MXH8YUW9QGKXWMQ-10' }, priceDropPushCampaign: { isActive: true, uniqueId: 'QHH5QNAB8MXH8YUW9QGKXWMQ-6', }, priceDropEmailCampaign: { isActive: true, uniqueId: 'QHH5QNAB8MXH8YUW9QGKXWMQ-8', }, priceDropSmsCampaign: { isActive: true, uniqueId: 'QHH5QNAB8MXH8YUW9QGKXWMQ-11', }, stockWidget: { selector: "gw-stock-fulfilled", isEnabled: true, popupSelector: "gw-stock-fulfilled-iframe", buttonType: "inline", inlineButtonParentSelector: `.gw-button-widget-container`, backgroundColor: "#B8827F", textColor: "#ffffff", subscriptionText: "Avísame cuando esté disponible", subscribedText: "Te avisaremos cuando el artículo esté disponible.", modalHtml: ` `, showIfAnyVariantIsOutOfStock: false, showOnPreorderProduct:true, showOnCollectionPage:false }, priceDropWidget: { selector: "gw-price-drop", isEnabled: false, popupSelector: "gw-price-drop-iframe", buttonType: "float", inlineButtonParentSelector: ``, backgroundColor: "#000000", textColor: "#ffffff", subscriptionText: "Notify me when price drops", subscribedText: "We will notify you when price drops", modalHtml: `{priceDropModalHtml}` }, customJs: `initVar.addStockFulfilledButtonV2Enabled = true; let insertAfterEle=document.querySelector(".product-single__buttons"); let buttonWrapper=document.createElement('div') buttonWrapper.className="gw-button-widget-container" if(insertAfterEle) insertAfterEle.parentNode.insertBefore(buttonWrapper,insertAfterEle.nextSibling);`, customCss: `null`, translationJson: {}, dataVariantId: "data-variant-id", dataProductId: "data-product-id", dataProductHandle: "data-product-handle", clickedProductId: null, clickedProductHandle: null, clickedVariantId: null, defaultCountry:'', skipAddingCookies:false, checkForCookies:true, addFloatWidget: function (text, dataAttribute, onClickFunction, productId, variantId, productHandle) { let button = document.createElement("button"); button.setAttribute(dataAttribute, '') button.classList = "btn button Button gw-float-widget" button.type = "button"; button.innerText = text; button.setAttribute(initVar.dataProductId, productId) button.setAttribute(initVar.dataVariantId, variantId) button.setAttribute(initVar.dataProductHandle, productHandle) button.onclick = (e) => onClickFunction(e); document.body.appendChild(button); }, setStockFulFilledVariantOptions: async function () { let modalData = window.growCampaignPopUps[initVar.stockWidget.popupSelector].$data; if (!initVar.clickedProductId) { return -1 } else { let product = await this.getProduct(initVar.clickedProductHandle); modalData.variants = product.variants.filter(x => !initVar.checkIfInStock(x, product)).map(x => { return { text: x.title, value: x.id } }); let isSelectedVariantIsOutOfStock = modalData.variants.find(x => x.value === initVar.clickedVariantId) if (!isSelectedVariantIsOutOfStock) { let firstOutOfStockVariant = initVar.getValueIfExist(() => modalData.variants[0].value); if (firstOutOfStockVariant) { initVar.clickedVariantId = firstOutOfStockVariant; } } modalData.selectedVariant = initVar.clickedVariantId; modalData.variantKey = "vk-" + (new Date().valueOf()) } }, setPriceDropVariantOptions: async function () { let modalData = window.growCampaignPopUps[initVar.priceDropWidget.popupSelector].$data; if (!initVar.clickedProductId) { return -1 } else { let product = await this.getProduct(initVar.clickedProductHandle); modalData.variants = product.variants.map(x => { return { text: x.title, value: x.id } }); modalData.selectedVariant = initVar.clickedVariantId; modalData.variantKey = "vk-" + (new Date().valueOf()) } }, variantChangedFromModal: function (variantId) { initVar.clickedVariantId = variantId }, stockWidgetClicked: async function (event) { growConfig.performTranslation(); setTimeout((()=>{initVar.getValueIfExist((()=>{document.querySelector("#gw-stock-fulfilled-iframe").contentDocument.querySelector(".modal-container").focus()}))}),500); initVar.clickedProductId = initVar.getValueIfExist(() => Number(event.target.attributes[initVar.dataProductId].value)) initVar.clickedProductHandle = initVar.getValueIfExist(() => (event.target.attributes[initVar.dataProductHandle].value)) initVar.clickedVariantId = initVar.getValueIfExist(() => Number(event.target.attributes[initVar.dataVariantId].value)) //check if email campaign is enabled // if (initVar.stockFulFilledEmailCampaign.isActive) document.getElementById(initVar.stockWidget.popupSelector).style.setProperty('display','block') initVar.setStockFulFilledVariantOptions(); if (await growClient.isPushConsentGiven()) await initVar.sendSubscriptionRequest(initVar.stockFulFilledPushCampaign.uniqueId) }, waitForEvent: async function (ms, conditionCheck, times) { let c = 0; while (c < times) { let isSatsfied = await conditionCheck() if (isSatsfied) { return isSatsfied; } await new Promise(res => { setTimeout(() => { res() }, ms) }) c++; } return false; }, addToCartClicked: async function (event) { initVar.log("cart clicked") let cart; let isSatisfied = await initVar.waitForEvent(100, async () => { cart = await initVar.getCart() return cart.items && cart.items.length }, 10) if (!isSatisfied) { return } const url = `${initVar.apiUrl}/api/subscribers/cartMapping`; const mapping = { clientId: initVar.clientId, cartToken: cart.token, subscriberUniqueId: initVar.subscriberId, cartJson: { token: cart.token, items: cart.items.map(item => { return { product_id: item.product_id, product_title: item.product_title, image: initVar.getValueIfExist(() => item.image.split("?")[0]), variant_id: item.variant_id, variant_title: item.variant_title, price: item.price } }) } }; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(mapping) }); }, checkEmail: function (email) { return /\S+@\S+\.\S+/.test(email) }, checkPhoneNumber: function (phoneNumber) { phoneNumber = phoneNumber.replace(/-/g, "").replace(/ /g, "") .replace(/\(/g, "").replace(/\)/g, "") if (Number.isNaN(phoneNumber)) { return false } if (parseInt(phoneNumber) !== Number(phoneNumber)) { return false } if (parseInt(phoneNumber) < 100) { return false } return true }, priceDropClicked: async function (event) { growConfig.performTranslation(); setTimeout((()=>{initVar.getValueIfExist((()=>{document.querySelector("#gw-price-drop-iframe").contentDocument.querySelector(".modal-container").focus()}))}),500); // if (initVar.priceDropEmailCampaign.isActive) // console.log("setting growClickedProduct") initVar.clickedProductId = initVar.getValueIfExist(() => Number(event.target.attributes[initVar.dataProductId].value)) initVar.clickedProductHandle = initVar.getValueIfExist(() => (event.target.attributes[initVar.dataProductHandle].value)) initVar.clickedVariantId = initVar.getValueIfExist(() => Number(event.target.attributes[initVar.dataVariantId].value)) document.getElementById(initVar.priceDropWidget.popupSelector).style.setProperty('display','block') initVar.setPriceDropVariantOptions(); if (await growClient.isPushConsentGiven()) await initVar.sendSubscriptionRequest(initVar.priceDropPushCampaign.uniqueId) document.querySelectorAll(`[${initVar.priceDropWidget.selector}]`)[0].innerText = initVar.getValueIfExist(()=>initVar.translationJson[Shopify.locale].priceDropWidget.widget.afterSubscribeText)|| initVar.priceDropWidget.subscribedText; }, sendSubscriptionRequest: async function (campaignId, adHocData) { let product = null let variant = null try { if (initVar.clickedProductHandle && initVar.clickedProductHandle !== "undefined") { let clickedProduct ; if(window.location.href.includes("/products/")) clickedProduct=(await (await fetch(`${initVar.clickedProductHandle}.js`)).json()); else clickedProduct=await this.getProduct(initVar.clickedProductHandle); initVar.processProduct(clickedProduct) let clickedVariant = clickedProduct.variants.find(x => x.id === initVar.clickedVariantId) if (clickedVariant) { initVar.log("Clicked Variant Found") product = clickedProduct; variant = clickedVariant; } } } catch (e) { console.log(e) } if (!product || !variant) { console.error("Parsing Variant from Url") product = await initVar.getProduct() variant = await initVar.getSelectedVariant(product) } let subscriptionEvent = { productId: Number(product.id), productPrice: Number(variant.price), variantId: variant.id, variantPrice: Number(variant.price), productTitle: product.title, variantTitle: variant.title, href:window.location.href } if (product.id !== initVar.clickedProductId) { console.error("Error in check product id attribute") } if (variant.id !== initVar.clickedVariantId) { console.error("Error in check variant id attribute") } const mapping = { campaignUniqueId: campaignId, subscriberUniqueId: initVar.subscriberId, email: adHocData && adHocData.email, smsTarget: adHocData && adHocData.smsTarget, smsDialCode: adHocData && adHocData.smsDialCode, optInToMarketing: adHocData && adHocData.optInToMarketing, subscriptionEvent: subscriptionEvent, locale: initVar.getValueIfExist(()=>Shopify.locale) }; const url = `${initVar.apiUrl}/api/subscribers/campaignMapping`; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(mapping) }); }, getSubscriptionEvent: async function (campaignId, variantId) { const url = `${initVar.apiUrl}/api/subscribers/campaignMapping?campaignUniqueId=${campaignId}&subscriberUniqueId=${initVar.subscriberId}&variantId=${variantId}`; return (await (await fetch(url)).json()) }, getProduct: async function (handle) { //if(window.product) if (!window.gwProduct || window.gwProduct.id !== gwProduct.id || !window.gwProduct.variants || !window.gwProduct.length) { let product; try { handle = handle || window.location.href.split("?")[0].split("#")[0] if(window.location.href.includes("/products/")) product = (await (await fetch(`${handle}.js`)).json()) else product = (await (await fetch(`${window.location.origin}/products/${handle}.js`)).json()) } catch (e) { initVar.log("Error in fetching product", e) } window.gwProduct = product; initVar.processProduct(window.gwProduct) } return window.gwProduct; }, processProduct: function (product) { product.variants.forEach(x => { x.price = x.price / 100 }) return product; }, getCart: async function () { let cart; try { cart = (await (await fetch(`/cart.js`)).json()) cart.items.forEach(x => { x.price = x.price / 100 }) return cart; } catch (e) { initVar.log("Error in fetching product", e) } }, getQueryParam: function (name) { let queryStringToJSON = (qs) => { qs = qs || location.search.slice(1); let pairs = qs.split('&'); let result = {}; pairs.forEach(function (p) { let pair = p.split('='); let key = pair[0]; let value = decodeURIComponent(pair[1] || ''); if (result[key]) { if (Object.prototype.toString.call(result[key]) === '[object Array]') { result[key].push(value); } else { result[key] = [result[key], value]; } } else { result[key] = value; } }); return JSON.parse(JSON.stringify(result)); } let queryJson = queryStringToJSON(location.search.slice(1)) return queryJson[name]; }, getOptionValue: async function (index) { let value = this.getValueIfExist(() => initVar.getVariantSelector(index).find(x => { return (x.type === "radio" && x.checked === true) || x.type !== "radio" }).value) if (!value) { value = this.getValueIfExist(() => { let item = initVar.getVariantSelector(index).find(x => { if (x.tagName === "LI") { return x.className.includes("is-selected") } }) if (item) { //add or condition here in future return item.getAttribute("data-escape") } }) } return value; }, getSelectedVariant: async function (product) { let variantId = "" if (!variantId) { let op1 = await initVar.getOptionValue(1) || null let op2 = await initVar.getOptionValue(2) || null let op3 = await initVar.getOptionValue(3) || null initVar.log(op1, op2, op3) let variant = product.variants.find(x => x.option1 === op1 && x.option2 === op2 && x.option3 === op3) if (variant) { variantId = variant.id } } initVar.log(variantId, "by options") if (!variantId) variantId = parseInt(initVar.getQueryParam('variant')) if(!variantId){ if(initVar.variantIdFormSelector){ variantId = initVar.getValueIfExist(()=>document.querySelector( initVar.variantIdFormSelector).getAttribute("value")); } } if (!variantId) { variantId = parseInt(window.ShopifyAnalytics && window.ShopifyAnalytics.meta && window.ShopifyAnalytics.meta.selectedVariantId) let variant = product.variants.find(x => Number(x.id) === Number(variantId)) if (!variant) variantId = null } if (!variantId && product.variants.length === 1) variantId = product.variants[0].id if (!variantId) { if (!(initVar.selectFirstVariant === false)) { variantId = (product.variants.find(x=>x.available) || product.variants[0]).id } } let variant = product.variants.find(x => Number(x.id) === Number(variantId)) // if(!variantFromUrl){ // variantFromUrl=product. // } return variant; }, getValueIfExist: function (fn) { try { return fn(); } catch (e) { return; } }, beforeClosePopUp:function (id){}, closePopUp: function (id) { initVar.beforeClosePopUp(id); document.getElementById(id).style.setProperty('display','none','important') }, campaignPopUpNotifyButtonClicked: async function (id, workFlowId, inptData, optInToMarketing) { if ([initVar.stockFulFilledEmailCampaign.uniqueId, initVar.priceDropEmailCampaign.uniqueId].some(x => x === workFlowId)) { await initVar.sendSubscriptionRequest(workFlowId, { email: inptData, optInToMarketing: optInToMarketing }) } if ([initVar.stockFulFilledSmsCampaign.uniqueId, initVar.priceDropSmsCampaign.uniqueId].some(x => x === workFlowId)) { await initVar.sendSubscriptionRequest(workFlowId, { smsTarget: inptData.smsTarget, smsDialCode: inptData.smsDialCode, optInToMarketing: optInToMarketing }) } if ([initVar.stockFulFilledEmailCampaign.uniqueId, initVar.stockFulFilledSmsCampaign.uniqueId].some(x => x === workFlowId)) document.querySelectorAll(`[${initVar.stockWidget.selector}]`)[0].innerText = initVar.getValueIfExist(()=>initVar.translationJson[Shopify.locale].stockWidget.widget.afterSubscribeText) || initVar.stockWidget.subscribedText; initVar.log(id, inptData, workFlowId) }, getStockFulfilledWidgetBeforeSubscribeText: function (){ return initVar.getValueIfExist(()=>initVar.translationJson[Shopify.locale].stockWidget.widget.beforeSubscribeText) || initVar.stockWidget.subscriptionText; }, getPriceDropWidgetBeforeSubscribeText: function (){ return initVar.getValueIfExist(()=>initVar.translationJson[Shopify.locale].priceDropWidget.widget.beforeSubscribeText) || initVar.priceDropWidget.subscriptionText; }, addPopUp: function (idSelector, html) { initVar.log("addPopup") if (!document.getElementById(idSelector)) { let iframe = document.createElement('iframe'); iframe.style.setProperty('display','none','important') iframe.id = idSelector; iframe.className = "gw-modal" iframe.srcdoc = html document.body.appendChild(iframe); } }, renderStockWidget: async function (product, variant) { this.addPopUp(initVar.stockWidget.popupSelector, initVar.stockWidget.modalHtml) while (document.querySelectorAll(`[${initVar.stockWidget.selector}]`).length > 0) { document.querySelectorAll(`[${initVar.stockWidget.selector}]`)[0].parentNode .removeChild(document.querySelectorAll(`[${initVar.stockWidget.selector}]`)[0]) } if (!initVar.stockWidget.isEnabled) { return; } if(initVar.stockWidgetDoNotShowTag){ let doNotShowTagExist=product.tags && product.tags.some(x=>x.toLowerCase()===initVar.stockWidgetDoNotShowTag); console.log("Stock Widget DoNotShowTag exist",doNotShowTagExist); if(doNotShowTagExist){ return true; } } if(initVar.stockWidgetShowTag) { let showTagExist = product.tags && product.tags.some(x => x.toLowerCase() === initVar.stockWidgetShowTag); console.log("Stock Widget showTagExist exist", showTagExist); if (!showTagExist) { return true; } } let showWidgetEvenIfCurrentVariantIsInStock = false if (initVar.stockWidget.showIfAnyVariantIsOutOfStock) { showWidgetEvenIfCurrentVariantIsInStock = product.variants.some(x => !initVar.checkIfInStock(x, product)) } if (!initVar.checkIfInStock(variant, product) || showWidgetEvenIfCurrentVariantIsInStock) { let text=initVar.getStockFulfilledWidgetBeforeSubscribeText(); if (initVar.stockWidget.buttonType === 'float') { initVar.addFloatWidget(text, initVar.stockWidget.selector, initVar.stockWidgetClicked, product && product.id, variant && variant.id, product && product.handle) } if (window["addStockFulfilledButton"]) { window["addStockFulfilledButton"]() } else { initVar.addStockFulfilledButton(product && product.id, variant && variant.id, product && product.handle) } } }, renderPriceDropWidget: async function (product, variant) { this.addPopUp(initVar.priceDropWidget.popupSelector, initVar.priceDropWidget.modalHtml) while (document.querySelectorAll(`[${initVar.priceDropWidget.selector}]`).length > 0) { document.querySelectorAll(`[${initVar.priceDropWidget.selector}]`)[0].parentNode .removeChild(document.querySelectorAll(`[${initVar.priceDropWidget.selector}]`)[0]) } if (!initVar.priceDropWidget.isEnabled) { return; } if(initVar.priceDropDoNotShowTag){ let doNotShowTagExist=product.tags && product.tags.some(x=>x.toLowerCase()===initVar.priceDropDoNotShowTag); initVar.log("Price Drop DoNotShowTag exist",doNotShowTagExist); if(doNotShowTagExist){ return true; } } if(initVar.priceDropShowTag) { let showTagExist = product.tags && product.tags.some(x => x.toLowerCase() === initVar.priceDropShowTag); console.log("Price Drop showTagExist exist", showTagExist); if (!showTagExist) { return true; } } if (initVar.checkIfInStock(variant, product)) { let text =initVar.getPriceDropWidgetBeforeSubscribeText(); if (initVar.priceDropWidget.buttonType === 'float') { initVar.addFloatWidget(text, initVar.priceDropWidget.selector, initVar.priceDropClicked, product && product.id, variant && variant.id, product && product.handle) } if (window["addPriceDropButton"]) { window["addPriceDropButton"]() } else { initVar.addPriceDropButton(product && product.id, variant && variant.id, product && product.handle) } } }, checkIfInStock: function (variant, product) { if((initVar.stockWidget.showOnPreorderProduct===true) && window.gwProductInventoryPolicy && window.gwProductInventoryPolicy[variant.id]==="continue" && window.gwProductInventoryQuantity && parseInt(window.gwProductInventoryQuantity[variant.id])<=0){ return false; } if (variant.available) { return true; } return false; }, afterVariantChangeFn:function (){ }, onVariantChange: async function () { try { if (!initVar.processingOnVariantChange) { initVar.processingOnVariantChange = true; let product = await initVar.getProduct() let variant = await initVar.getSelectedVariant(product) await initVar.renderStockWidget(product, variant) await initVar.renderPriceDropWidget(product, variant) initVar.processingOnVariantChange = false; console.log("Grow Variant Change title", variant.title) initVar.getValueIfExist(()=>initVar.afterVariantChangeFn()) //alert("variant"+variant.id) } } catch (e) { console.log(e) initVar.processingOnVariantChange = false; } }, performTranslation: function () { if (growConfig.translateContent) { growConfig.translateContent() }else { initVar.translateStockWidget(); initVar.translateProceDropWidget(); } }, registerOnVariantChange: function () { let firstTimeUrl = document.URL; document.addEventListener('change', function () { let currentPageUrl = document.URL; let url = new URL(currentPageUrl); let isVariantUrl = url.searchParams.get("variant"); currentPageUrl = isVariantUrl ? currentPageUrl : isVariantUrl; if (currentPageUrl && firstTimeUrl !== currentPageUrl) { firstTimeUrl = currentPageUrl; initVar.log('Grow Url Variant change variant_id: ' + isVariantUrl + ''); window.growConfig.onVariantChange(); } }); [1, 2, 3].forEach(index => { initVar.getValueIfExist(() => { initVar.getVariantSelector(index).forEach(x => { x.addEventListener('change', window.growConfig.onVariantChange) if (x.tagName === "LI") { x.addEventListener('click', () => { setTimeout(() => { window.growConfig.onVariantChange() }, 500) }) } }) }) }) }, getVariantSelector: function (index) { let ele = document.querySelectorAll(`[data-index=\"option${index}\"]`) || document.querySelectorAll(`#Option-product-${index - 1}`) if (!ele || !ele.length || ele.length === 0) ele = document.querySelectorAll(`#Option-product-${index - 1}`) if (!ele || !ele.length || ele.length === 0) ele = document.querySelectorAll(`#nt_select_ppr_${index - 1} li`) return [...ele] }, registerAddToCartChange: function () { initVar.getValueIfExist(() => { let ele = document.querySelector("[name=\"add\"]") || document.querySelector("[data-action=\"add-to-cart\"]") || document.querySelector("[data-add-to-cart]") ele.addEventListener('click', window.growConfig.addToCartClicked) }) }, isPostPurchasePage: function () { return ( Shopify && (Shopify.Checkout) && (Shopify.Checkout.page === "thank_you" || Shopify.Checkout.isOrderStatusPage)) ||(window.location.href.includes("checkout")) || (window.location.href.includes("thank_you")) }, isCartPage: function () { return (window.location.href.includes("cart")) }, sendOrderPurchaseEvent: async function (client) { let json = await client.getNotificationsClicked() if (json.length) { const url = `${initVar.apiUrl}/api/workflows/event`; fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientUniqueId: initVar.clientId, notificationWorkFlowUniqueId: null, subscriberUniqueId: initVar.subscriberId, eventData: { amount: Number(Shopify.checkout.subtotal_price), name: "purchase", notificationsClicked: json, checkoutToken: Shopify && Shopify.Checkout && Shopify.Checkout.token, orderStatusUrl: window.location.href, orderId: Shopify.checkout && Shopify.checkout.order_id }, }) }); } }, registerUtmParameter: async function () { if (this.getQueryParam("cbn_campaign")) { await growClient.registerNotificationClick(this.getQueryParam("message_process_id"), this.getQueryParam("cbn_campaign"), this.getQueryParam("cbn_medium")) } }, addPriceDropButton: function (productId, variantId, productHandle) { if (initVar.addPriceDropButtonV2Enabled === true) { return initVar.addPriceDropButtonV2(productId, variantId, productHandle); } let parentElement = window.priceDropButtonParent if (initVar.priceDropWidget.buttonType !== 'inline') { return } if (!parentElement) { if (initVar.priceDropWidget.inlineButtonParentSelector) { parentElement = document.querySelector(initVar.priceDropWidget.inlineButtonParentSelector) if (!parentElement) { return } } } let btn = document.createElement("button"); btn.innerHTML = initVar.getPriceDropWidgetBeforeSubscribeText(); btn.className = 'btn btn-success gw-button-widget' btn.setAttribute('gw-price-drop', '') btn.setAttribute(initVar.dataProductId, productId) btn.setAttribute(initVar.dataVariantId, variantId) btn.setAttribute(initVar.dataProductHandle, productHandle) btn.style.backgroundColor = growConfig.priceDropWidget.backgroundColor btn.style.color = growConfig.priceDropWidget.textColor btn.onclick = (e) => { e.preventDefault(); growConfig.priceDropClicked(e) } parentElement.appendChild(btn) }, log:function (...msg){ console.log(...msg) }, addStockFulfilledButton: function (productId, variantId, productHandle) { if (initVar.addStockFulfilledButtonV2Enabled === true) { return initVar.addStockFulfilledButtonV2(productId, variantId, productHandle); } let parentElement = window.stockWidgetButtonParent; if (initVar.stockWidget.buttonType !== 'inline') { return } if (!parentElement) { if (initVar.stockWidget.inlineButtonParentSelector) { parentElement = document.querySelector(initVar.stockWidget.inlineButtonParentSelector) if (!parentElement) { return } } } let btn = document.createElement("button"); btn.innerHTML = initVar.getStockFulfilledWidgetBeforeSubscribeText(); btn.className = 'btn btn-success gw-button-widget' btn.setAttribute('gw-stock-fulfilled', '') btn.setAttribute(initVar.dataProductId, productId) btn.setAttribute(initVar.dataVariantId, variantId) btn.setAttribute(initVar.dataProductHandle, productHandle) btn.style.backgroundColor = growConfig.stockWidget.backgroundColor btn.style.color = growConfig.stockWidget.textColor btn.onclick = (e) => { e.preventDefault(); growConfig.stockWidgetClicked(e) } parentElement.appendChild(btn) this.campaignInlineButtonAddedEvent('gw-stock-fulfilled') }, addStockFulfilledButtonV2: async function (productId, variantId, productHandle) { initVar.log("Placing Inline Button") if (initVar.stockWidget.buttonType !== 'inline') { return } // let addToCartButtonClasses; if (initVar.addToCartSelector === undefined) initVar.addToCartSelector = "[name=add]" if (initVar.addAddToCartClasses === undefined) initVar.addAddToCartClasses = true; if (initVar.addToCartButtonClasses === undefined) initVar.addToCartButtonClasses = "btn btn-success" if (initVar.addAddToCartClassesIgnoreList === undefined) { initVar.addAddToCartClassesIgnoreList = "disabled" } let addToCartButton = document.querySelector(initVar.addToCartSelector) let parentElement = window.stockWidgetButtonParent; if (addToCartButton && initVar.addAddToCartClasses) { initVar.addToCartButtonClasses = addToCartButton.className.split(" ") .filter(x => !initVar.addAddToCartClassesIgnoreList.split(" ").some(y => y == x)).join(" ") } if (!parentElement) { if (initVar.stockWidget.inlineButtonParentSelector) { parentElement = document.querySelector(initVar.stockWidget.inlineButtonParentSelector) } else { if (addToCartButton) parentElement = addToCartButton.parentNode } } let btn = document.createElement("button"); btn.innerHTML = initVar.getStockFulfilledWidgetBeforeSubscribeText(); btn.className = 'gw-button-widget gw-button-widget-v2' + " " + initVar.addToCartButtonClasses btn.setAttribute('gw-stock-fulfilled', '') btn.setAttribute(initVar.dataProductId, productId) btn.setAttribute(initVar.dataVariantId, variantId) btn.setAttribute(initVar.dataProductHandle, productHandle) btn.style.backgroundColor = growConfig.stockWidget.backgroundColor btn.style.color = growConfig.stockWidget.textColor btn.onclick = (e) => { e.preventDefault(); growConfig.stockWidgetClicked(e) } if (!parentElement) { await initVar.waitForEvent(200, async () => { initVar.log("Waiting for rendering of parent element of Inline button") return parentElement }, 10) } parentElement.appendChild(btn) this.campaignInlineButtonAddedEvent('gw-stock-fulfilled') }, campaignInlineButtonAddedEvent:function (buttonAttribute){ }, addPriceDropButtonV2: function (productId, variantId, productHandle) { initVar.log("Placing Inline Button") if (initVar.priceDropWidget.buttonType !== 'inline') { return } // let addToCartButtonClasses; if (initVar.addToCartSelector === undefined) initVar.addToCartSelector = "[name=add]" if (initVar.addAddToCartClasses === undefined) initVar.addAddToCartClasses = true; if (initVar.addToCartButtonClasses === undefined) initVar.addToCartButtonClasses = "btn btn-success" if (initVar.addAddToCartClassesIgnoreList === undefined) { initVar.addAddToCartClassesIgnoreList = "disabled" } let addToCartButton = document.querySelector(initVar.addToCartSelector) let parentElement = window.priceDropButtonParent if (addToCartButton && initVar.addAddToCartClasses) { initVar.addToCartButtonClasses = addToCartButton.className.split(" ") .filter(x => !initVar.addAddToCartClassesIgnoreList.split(" ").some(y => y == x)).join(" ") } if (!parentElement) { if (initVar.priceDropWidget.inlineButtonParentSelector) { parentElement = document.querySelector(initVar.priceDropWidget.inlineButtonParentSelector) } else { if (addToCartButton) parentElement = addToCartButton.parentNode } } let btn = document.createElement("button"); btn.innerHTML = initVar.getPriceDropWidgetBeforeSubscribeText(); btn.className = 'gw-button-widget gw-button-widget-v2' + " " + initVar.addToCartButtonClasses btn.setAttribute('gw-price-drop', '') btn.setAttribute(initVar.dataProductId, productId) btn.setAttribute(initVar.dataVariantId, variantId) btn.setAttribute(initVar.dataProductHandle, productHandle) btn.style.backgroundColor = growConfig.priceDropWidget.backgroundColor btn.style.color = growConfig.priceDropWidget.textColor btn.onclick = (e) => { e.preventDefault(); growConfig.priceDropClicked(e) } parentElement.appendChild(btn) }, translateStockWidget: function (){ let locale=Shopify.locale let gwLocaleJson=initVar.translationJson && initVar.translationJson[locale] if(!gwLocaleJson || !gwLocaleJson.stockWidget || !gwLocaleJson.stockWidget.modal.heading ){ return; } if(gwLocaleJson){ let stockWidgetModal=document.querySelector("#gw-stock-fulfilled-iframe").contentDocument initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".modal-title").innerText=gwLocaleJson.stockWidget.modal.heading;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".notification-message").innerText=gwLocaleJson.stockWidget.modal.subheading;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".notify-button").innerText=gwLocaleJson.stockWidget.modal.notifyButtonTitle;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".marketing-container-label").innerText=gwLocaleJson.stockWidget.modal.optInMarketingText;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".marketing-container-label").innerText=gwLocaleJson.stockWidget.modal.optInMarketingText;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".privacy-text").innerText=gwLocaleJson.stockWidget.modal.privacyText;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".email-input").placeholder=gwLocaleJson.stockWidget.modal.emailPlaceholder;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".gw-success-message .success-text").innerText=gwLocaleJson.stockWidget.modal.successText;}) initVar.getValueIfExist(()=>{stockWidgetModal.querySelector(".gw-success-message .close-text").innerText=gwLocaleJson.stockWidget.modal.successCloseText;}) } }, translateProceDropWidget: function (){ let locale=Shopify.locale let gwLocaleJson=initVar.translationJson && initVar.translationJson[locale] if(!gwLocaleJson || !gwLocaleJson.priceDropWidget || !gwLocaleJson.priceDropWidget.modal.heading ){ return; } if(gwLocaleJson){ let priceDropModal=document.querySelector("#gw-price-drop-iframe").contentDocument initVar.getValueIfExist(()=>{priceDropModal.querySelector(".modal-title").innerText=gwLocaleJson.priceDropWidget.modal.heading;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".notification-message").innerText=gwLocaleJson.priceDropWidget.modal.subheading;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".notify-button").innerText=gwLocaleJson.priceDropWidget.modal.notifyButtonTitle;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".marketing-container-label").innerText=gwLocaleJson.priceDropWidget.modal.optInMarketingText;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".marketing-container-label").innerText=gwLocaleJson.priceDropWidget.modal.optInMarketingText;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".privacy-text").innerText=gwLocaleJson.priceDropWidget.modal.privacyText;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".email-input").placeholder=gwLocaleJson.priceDropWidget.modal.emailPlaceholder;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".gw-success-message .success-text").innerText=gwLocaleJson.priceDropWidget.modal.successText;}) initVar.getValueIfExist(()=>{priceDropModal.querySelector(".gw-success-message .close-text").innerText=gwLocaleJson.priceDropWidget.modal.successCloseText;}) } }, isStore:function (){ if(!window["Shopify"] || (window["Shopify"] && window["Shopify"].designMode)){ return false; } return true; } } if (!window.growClient) { window.GrowClient=function(e){var t={};function i(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,i),o.l=!0,o.exports}return i.m=e,i.c=t,i.d=function(e,t,n){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(i.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)i.d(n,o,function(t){return e[t]}.bind(null,o));return n},i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,"a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p="",i(i.s=1)}([function(e,t,i){"use strict";var n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))((function(o,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.DbKeys=t.DbManager=void 0;class o{constructor(){this.cookiePeriod=31104e3}static Instance(){return n(this,void 0,void 0,(function*(){return o.instance||(o.instance=new o),o.instance}))}save(e,t){return n(this,void 0,void 0,(function*(){let i=!1;window.initVar.checkForCookies&&window.Shopify.customerPrivacy&&(window.Shopify.customerPrivacy.analyticsProcessingAllowed()&&window.Shopify.customerPrivacy.preferencesProcessingAllowed()||[r.LastOptInAt].some(t=>t===e)||(i=!0)),window.initVar.skipAddingCookies&&(i=!0),i?o.cookies.push({key:e,value:t}):document.cookie=`${e}=${t};max-age=${this.cookiePeriod};path=/`}))}find(e){return n(this,void 0,void 0,(function*(){return o.cookies.find(t=>t.key===e)?o.cookies.find(t=>t.key===e).value:this.getcookie(e)}))}findValue(e){return n(this,void 0,void 0,(function*(){let t=yield this.getcookie(e);return t||null}))}clear(e){return n(this,void 0,void 0,(function*(){document.cookie=e+"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;"}))}getcookie(e=""){let t=document.cookie,i={};if(t=t.split(";"),""!==t[0]||void 0!==t[0][0])return t.forEach((function(e){" "===(e=e.split(/=(.+)/))[0].substr(0,1)&&(e[0]=e[0].substr(1)),i[e[0]]=e[1]})),""!==e?i[e]:i}}t.DbManager=o,o.cookies=[];class r{}t.DbKeys=r,r.SubscriberId="gw-subId",r.ClientId="gw-clientId",r.NotificationsClicked="gw-notifications-clicked",r.PushData="gw-push",r.VapidPublicKey="gw-vapid-public",r.IsActive="gw-isActive-"+parseInt((new Date).valueOf()-(new Date).valueOf()%6e5),r.LastOptInAt="gw-lastOptInAt"},function(e,t,i){"use strict";var n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))((function(o,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.GrowClient=void 0;const o=i(0),r=i(2);class s{constructor(){}init(e){return n(this,void 0,void 0,(function*(){if(this.initVars=e,yield this.getClientStatus()){if(this.db=yield o.DbManager.Instance(),yield this.db.save(o.DbKeys.ClientId,this.initVars.clientId),!(yield this.db.findValue(o.DbKeys.SubscriberId))){let e=yield this.getUniqueId();yield this.db.save(o.DbKeys.SubscriberId,e)}if(this.swRegistration=yield this.registerServiceWorker(),this.pushManager=new r.GrowPushManager(this.initVars,this.swRegistration),this.db.save(o.DbKeys.VapidPublicKey,e.vapidKey),!(yield this.checkNotificationSupport()))return Promise.reject("Notification Not Supported");if(!(yield this.checkServiceWorkerSupport()))return Promise.reject("Service Worker Not Supported");yield this.pushManager.init(),this.onInit&&(yield this.processOnInit())}}))}processOnInit(){return n(this,void 0,void 0,(function*(){let e=yield this.db.find(o.DbKeys.SubscriberId);e&&(yield this.onInit(e))}))}registerServiceWorker(){return n(this,void 0,void 0,(function*(){return yield navigator.serviceWorker.register(this.initVars.serviceWorkerUrl||"/sw.js").catch(e=>(console.error("Grow",e),Promise.reject(e)))}))}checkServiceWorkerSupport(){return n(this,void 0,void 0,(function*(){return"serviceWorker"in navigator?Promise.resolve(!0):Promise.resolve(!1)}))}checkNotificationSupport(){return n(this,void 0,void 0,(function*(){return"Notification"in window?Promise.resolve(!0):Promise.resolve(!1)}))}getNotificationsClicked(){return n(this,void 0,void 0,(function*(){this.db||(this.db=yield o.DbManager.Instance());let e=yield this.db.find(o.DbKeys.NotificationsClicked);return e?JSON.parse(e):[]}))}getUniqueId(){return n(this,void 0,void 0,(function*(){return yield fetch(this.initVars.subscriberNewUniqueIdUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}).then(e=>n(this,void 0,void 0,(function*(){return(yield e.json()).uniqueId})))}))}getClientStatus(){return n(this,void 0,void 0,(function*(){this.db||(this.db=yield o.DbManager.Instance());let e=yield this.db.findValue(o.DbKeys.IsActive);return!e||"true"===e}))}registerNotificationClick(e,t,i){return n(this,void 0,void 0,(function*(){this.db||(this.db=yield o.DbManager.Instance());let n=yield this.getSubscriberId(),r=yield this.db.find(o.DbKeys.NotificationsClicked),s=[];r&&(s=JSON.parse(r)||[]);let a={notificationWorkFlowUniqueId:t,notificationType:i,subscriberId:n,timestamp:(new Date).valueOf()};s.push(a),yield this.db.save(o.DbKeys.NotificationsClicked,JSON.stringify(s)),yield fetch(this.initVars.clickNotificationUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({uniqueId:e+"-"+n,clientUniqueId:this.initVars.clientId,notificationWorkFlowUniqueId:t,subscriberUniqueId:n,eventData:{name:"click",notificationType:i}})}).catch(e=>{console.error("error in sending click notification url",e)})}))}getSubscriberId(){return n(this,void 0,void 0,(function*(){return this.db||(this.db=yield o.DbManager.Instance()),yield this.db.findValue(o.DbKeys.SubscriberId)}))}saveDbValue(e,t){return n(this,void 0,void 0,(function*(){this.db||(this.db=yield o.DbManager.Instance());yield this.db.save(e,t);return this.db.findValue(e)}))}getDbValue(e){return n(this,void 0,void 0,(function*(){return this.db||(this.db=yield o.DbManager.Instance()),yield this.db.findValue(e)}))}isPushConsentGiven(){return n(this,void 0,void 0,(function*(){return this.db||(this.db=yield o.DbManager.Instance()),yield this.db.findValue(o.DbKeys.PushData)}))}}t.GrowClient=s;let a=new s;t.default=a},function(e,t,i){"use strict";var n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))((function(o,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.GrowPushManager=void 0;const o=i(0),r=i(3),s=i(4),a=i(11);t.GrowPushManager=class{constructor(e,t){this.initVars=e,this.swRegistration=t,this.initVars=e}init(){return n(this,void 0,void 0,(function*(){if(this.db=yield o.DbManager.Instance(),!this.initVars.pushOptInSetting.isEnabled)return;if((yield this.showConsentPopup())&&this.initVars.pushOptInSetting.isEnabled){const e=new s.PopupManager(this.initVars),t=yield e.show(this.initVars.pushOptInSetting.showModal);if(yield this.db.save(o.DbKeys.LastOptInAt,(new Date).getTime()/1e3),!t)return void(yield this.db.save(o.DbKeys.LastOptInAt,(new Date).getTime()/1e3));if(console.log("requesting prompt"),this.notificationStatus=yield this.requestNotificationPermission(),!this.notificationStatus)return;yield this.saveSubscription()}}))}saveSubscription(){return n(this,void 0,void 0,(function*(){const e=yield this.createPushSubscription(),t=yield this.saveToServer(e);if(200===t.status){const i=yield t.json().then(e=>e.uniqueId),n=yield o.DbManager.Instance();return yield n.save(o.DbKeys.SubscriberId,i),yield n.save(o.DbKeys.ClientId,this.initVars.clientId),yield n.save(o.DbKeys.PushData,JSON.stringify(e.toJSON())),e}return null}))}requestNotificationPermission(){return n(this,void 0,void 0,(function*(){return"granted"===(yield Notification.requestPermission().catch(e=>(console.error(e,"Grow Notification Prompt"),Promise.reject(e))))}))}showConsentPopup(){return n(this,void 0,void 0,(function*(){if(void 0!==window.safari)return!1;const e=yield this.db.find(o.DbKeys.LastOptInAt),t=Number.parseInt(e||"0");if(!Number.isNaN(t)&&(new Date).getTime()/1e3JSON.parse(n));if(!r||!a.HelperUtils.isPushSimilar(r,t)){(yield this.tryReSubscribingToGrow())||(yield this.removeSubscription(),i=!0)}}return i&&(console.log("subscriptionDoesNotExist"),yield a.HelperUtils.sleep(1e3*this.initVars.pushOptInSetting.initialDelay||0)),i}))}tryReSubscribingToGrow(){return n(this,void 0,void 0,(function*(){try{return yield this.saveSubscription(),!0}catch(e){return console.error(e.message),!1}}))}removeSubscription(){return n(this,void 0,void 0,(function*(){let e=yield this.swRegistration.pushManager.getSubscription();if(e){const t=yield o.DbManager.Instance();return yield t.clear(o.DbKeys.ClientId),yield t.clear(o.DbKeys.SubscriberId),yield e.unsubscribe()}return!1}))}createPushSubscription(){return n(this,void 0,void 0,(function*(){const e={userVisibleOnly:!0,applicationServerKey:a.HelperUtils.urlBase64ToUint8Array(this.initVars.vapidKey)};return yield this.swRegistration.pushManager.subscribe(e)}))}saveToServer(e){return n(this,void 0,void 0,(function*(){const t=Object.assign({userAgent:navigator.userAgent},this.initVars.meta),i={push:e,clientId:this.initVars.clientId,subscriberUniqueId:yield this.db.findValue(o.DbKeys.SubscriberId),meta:t};return yield fetch(this.initVars.subscribeUrl,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(i)})}))}}},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Constants=void 0;class n{}t.Constants=n,n.DefaultOptinTimeout=86400},function(e,t,i){"use strict";var n=this&&this.__awaiter||function(e,t,i,n){return new(i||(i=Promise))((function(o,r){function s(e){try{c(n.next(e))}catch(e){r(e)}}function a(e){try{c(n.throw(e))}catch(e){r(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))};Object.defineProperty(t,"__esModule",{value:!0}),t.PopupManager=void 0,i(5);const o=i(9),r=i(10);t.PopupManager=class{constructor(e){this.modalId="grow-consent-modal";const t={modalId:this.modalId,iconUrl:e.pushOptInSetting.message.iconUrl||"",title:e.pushOptInSetting.message.title||"Subscribe to Notifications",body:e.pushOptInSetting.message.body||"",closeText:e.pushOptInSetting.message.buttons.find(e=>1===e.order).label||"Later",subscribeText:e.pushOptInSetting.message.buttons.find(e=>2===e.order).label||"Subscribe"};let i='';i=i.replace(/{{modalId}}/g,this.modalId),i=i.replace(/{{iconUrl}}/g,t.iconUrl),i=i.replace(/{{title}}/g,t.title),i=i.replace(/{{body}}/g,t.body),i=i.replace(/{{closeText}}/g,t.closeText),i=i.replace(/{{subscribeText}}/g,t.subscribeText);const n=r.render(i,t);let s=document.createElement("div");s.innerHTML=n,s=s.firstChild||s;const a=s.querySelector(".grow_modal__btn-primary"),c=s.querySelector(".grow_modal__btn-cancel");a&&a.addEventListener("click",()=>this.subscribeClick(!0)),c&&c.addEventListener("click",()=>this.subscribeClick(!1)),document.body.appendChild(s),o.default.init({awaitCloseAnimation:!0})}show(e){return n(this,void 0,void 0,(function*(){return!e||(o.default.show(this.modalId),new Promise(e=>this.confirmationResolve=e))}))}subscribeClick(e){return o.default.close(this.modalId),this.confirmationResolve(e)}}},function(e,t,i){var n=i(6),o=i(7);"string"==typeof(o=o.__esModule?o.default:o)&&(o=[[e.i,o,""]]);var r={insert:"head",singleton:!1};n(o,r);e.exports=o.locals||{}},function(e,t,i){"use strict";var n,o=function(){return void 0===n&&(n=Boolean(window&&document&&document.all&&!window.atob)),n},r=function(){var e={};return function(t){if(void 0===e[t]){var i=document.querySelector(t);if(window.HTMLIFrameElement&&i instanceof window.HTMLIFrameElement)try{i=i.contentDocument.head}catch(e){i=null}e[t]=i}return e[t]}}(),s=[];function a(e){for(var t=-1,i=0;ie.length)&&(t=e.length);for(var i=0,n=new Array(t);i0&&this.registerTriggers.apply(this,o(r)),this.onClick=this.onClick.bind(this),this.onKeydown=this.onKeydown.bind(this)}var t,i,r;return t=e,(i=[{key:"registerTriggers",value:function(){for(var e=this,t=arguments.length,i=new Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:null;if(this.activeElement=document.activeElement,this.modal.setAttribute("aria-hidden","false"),this.modal.classList.add(this.config.openClass),this.scrollBehaviour("disable"),this.addEventListeners(),this.config.awaitOpenAnimation){var i=function t(){e.modal.removeEventListener("animationend",t,!1),e.setFocusToFirstNode()};this.modal.addEventListener("animationend",i,!1)}else this.setFocusToFirstNode();this.config.onShow(this.modal,this.activeElement,t)}},{key:"closeModal",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=this.modal;if(this.modal.setAttribute("aria-hidden","true"),this.removeEventListeners(),this.scrollBehaviour("enable"),this.activeElement&&this.activeElement.focus&&this.activeElement.focus(),this.config.onClose(this.modal,this.activeElement,e),this.config.awaitCloseAnimation){var i=this.config.openClass;this.modal.addEventListener("animationend",(function e(){t.classList.remove(i),t.removeEventListener("animationend",e,!1)}),!1)}else t.classList.remove(this.config.openClass)}},{key:"closeModalById",value:function(e){this.modal=document.getElementById(e),this.modal&&this.closeModal()}},{key:"scrollBehaviour",value:function(e){if(this.config.disableScroll){var t=document.querySelector("body");switch(e){case"enable":Object.assign(t.style,{overflow:""});break;case"disable":Object.assign(t.style,{overflow:"hidden"})}}}},{key:"addEventListeners",value:function(){this.modal.addEventListener("touchstart",this.onClick),this.modal.addEventListener("click",this.onClick),document.addEventListener("keydown",this.onKeydown)}},{key:"removeEventListeners",value:function(){this.modal.removeEventListener("touchstart",this.onClick),this.modal.removeEventListener("click",this.onClick),document.removeEventListener("keydown",this.onKeydown)}},{key:"onClick",value:function(e){e.target.hasAttribute(this.config.closeTrigger)&&this.closeModal(e)}},{key:"onKeydown",value:function(e){27===e.keyCode&&this.closeModal(e),9===e.keyCode&&this.retainFocus(e)}},{key:"getFocusableNodes",value:function(){var e=this.modal.querySelectorAll(s);return Array.apply(void 0,o(e))}},{key:"setFocusToFirstNode",value:function(){var e=this;if(!this.config.disableFocus){var t=this.getFocusableNodes();if(0!==t.length){var i=t.filter((function(t){return!t.hasAttribute(e.config.closeTrigger)}));i.length>0&&i[0].focus(),0===i.length&&t[0].focus()}}}},{key:"retainFocus",value:function(e){var t=this.getFocusableNodes();if(0!==t.length)if(t=t.filter((function(e){return null!==e.offsetParent})),this.modal.contains(document.activeElement)){var i=t.indexOf(document.activeElement);e.shiftKey&&0===i&&(t[t.length-1].focus(),e.preventDefault()),!e.shiftKey&&t.length>0&&i===t.length-1&&(t[0].focus(),e.preventDefault())}else t[0].focus()}}])&&n(t.prototype,i),r&&n(t,r),e}(),c=null,l=function(e){if(!document.getElementById(e))return console.warn("MicroModal: ❗Seems like you have missed %c'".concat(e,"'"),"background-color: #f8f9fa;color: #50596c;font-weight: bold;","ID somewhere in your code. Refer example below to resolve it."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",'')),!1},d=function(e,t){if(function(e){e.length<=0&&(console.warn("MicroModal: ❗Please specify at least one %c'micromodal-trigger'","background-color: #f8f9fa;color: #50596c;font-weight: bold;","data attribute."),console.warn("%cExample:","background-color: #f8f9fa;color: #50596c;font-weight: bold;",''))}(e),!t)return!0;for(var i in t)l(i);return!0},{init:function(e){var t=Object.assign({},{openTrigger:"data-micromodal-trigger"},e),i=o(document.querySelectorAll("[".concat(t.openTrigger,"]"))),n=function(e,t){var i=[];return e.forEach((function(e){var n=e.attributes[t].value;void 0===i[n]&&(i[n]=[]),i[n].push(e)})),i}(i,t.openTrigger);if(!0!==t.debugMode||!1!==d(i,n))for(var r in n){var s=n[r];t.targetModal=r,t.triggers=o(s),c=new a(t)}},show:function(e,t){var i=t||{};i.targetModal=e,!0===i.debugMode&&!1===l(e)||(c&&c.removeEventListeners(),(c=new a(i)).showModal())},close:function(e){e?c.closeModalById(e):c.closeModal()}});window.MicroModal=u,t.default=u},function(e,t,i){e.exports=function(){"use strict"; /*! * mustache.js - Logic-less {{mustache}} templates with JavaScript * http://github.com/janl/mustache.js */var e=Object.prototype.toString,t=Array.isArray||function(t){return"[object Array]"===e.call(t)};function i(e){return"function"==typeof e}function n(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\'{GrowClientJs}'")}function o(e,t){return null!=e&&"object"==typeof e&&t in e}var r=RegExp.prototype.test,s=/\S/;function a(e){return!function(e,t){return r.call(e,t)}(s,e)}var c={"&":"&","<":"<",">":">",'"':""","'":"'","/":"/","`":"`","=":"="},l=/\s*/,d=/\s+/,u=/\s*=/,f=/\s*\}/,h=/#|\^|\/|>|\{|&|=|!/;function p(e){this.string=e,this.tail=e,this.pos=0}function g(e,t){this.view=e,this.cache={".":this.view},this.parent=t}function m(){this.templateCache={_cache:{},set:function(e,t){this._cache[e]=t},get:function(e){return this._cache[e]},clear:function(){this._cache={}}}}p.prototype.eos=function(){return""===this.tail},p.prototype.scan=function(e){var t=this.tail.match(e);if(!t||0!==t.index)return"";var i=t[0];return this.tail=this.tail.substring(i.length),this.pos+=i.length,i},p.prototype.scanUntil=function(e){var t,i=this.tail.search(e);switch(i){case-1:t=this.tail,this.tail="";break;case 0:t="";break;default:t=this.tail.substring(0,i),this.tail=this.tail.substring(i)}return this.pos+=t.length,t},g.prototype.push=function(e){return new g(e,this)},g.prototype.lookup=function(e){var t,n,r,s=this.cache;if(s.hasOwnProperty(e))t=s[e];else{for(var a,c,l,d=this,u=!1;d;){if(e.indexOf(".")>0)for(a=d.view,c=e.split("."),l=0;null!=a&&l0?o[o.length-1][4]:i;break;default:n.push(t)}return i}(function(e){for(var t,i,n=[],o=0,r=e.length;o"===s?a=this.renderPartial(r,t,i,o):"&"===s?a=this.unescapedValue(r,t):"name"===s?a=this.escapedValue(r,t,o):"text"===s&&(a=this.rawValue(r)),void 0!==a&&(c+=a);return c},m.prototype.renderSection=function(e,n,o,r,s){var a=this,c="",l=n.lookup(e[1]);if(l){if(t(l))for(var d=0,u=l.length;d0||!i)&&(o[r]=n+o[r]);return o.join("\n")},m.prototype.renderPartial=function(e,t,n,o){if(n){var r=this.getConfigTags(o),s=i(n)?n(e[1]):n[e[1]];if(null!=s){var a=e[6],c=e[5],l=e[4],d=s;0==c&&l&&(d=this.indentPartial(s,l,a));var u=this.parse(d,r);return this.renderTokens(u,t,n,d,o)}}},m.prototype.unescapedValue=function(e,t){var i=t.lookup(e[1]);if(null!=i)return i},m.prototype.escapedValue=function(e,t,i){var n=this.getConfigEscape(i)||v.escape,o=t.lookup(e[1]);if(null!=o)return"number"==typeof o&&n===v.escape?String(o):n(o)},m.prototype.rawValue=function(e){return e[1]},m.prototype.getConfigTags=function(e){return t(e)?e:e&&"object"==typeof e?e.tags:void 0},m.prototype.getConfigEscape=function(e){return e&&"object"==typeof e&&!t(e)?e.escape:void 0};var v={name:"mustache.js",version:"4.2.0",tags:["{{","}}"],clearCache:void 0,escape:void 0,parse:void 0,render:void 0,Scanner:void 0,Context:void 0,Writer:void 0,set templateCache(e){b.templateCache=e},get templateCache(){return b.templateCache}},b=new m;return v.clearCache=function(){return b.clearCache()},v.parse=function(e,t){return b.parse(e,t)},v.render=function(e,i,n,o){if("string"!=typeof e)throw new TypeError('Invalid template! Template should be a "string" but "'+(t(r=e)?"array":typeof r)+'" was given as the first argument for mustache#render(template, view, partials)');var r;return b.render(e,i,n,o)},v.escape=function(e){return String(e).replace(/[&<>"'`=\/]/g,(function(e){return c[e]}))},v.Scanner=p,v.Context=g,v.Writer=m,v}()},function(e,t,i){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.HelperUtils=void 0;t.HelperUtils=class{static urlBase64ToUint8Array(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),i=window.atob(t),n=new Uint8Array(i.length);for(let e=0;e{setTimeout(()=>{t()},e)})}static getValueIfExist(e){try{return e()}catch(e){return}}static isPushSimilar(e,t){return e.endpoint===t.endpoint&&e.keys.p256dh===t.keys.p256dh&&e.keys.auth===t.keys.auth}}}]);; (async function () { let styles = `.gw-float-widget { border-radius: 5px 5px 0px 0px; top: 50% ; position: fixed !important; right: 0px ; z-index: 1000; border: none ; padding: 10px 20px; font-size: 14px ; cursor: pointer ; font-weight: bold ; margin-right: 8px; transform: translate(45%, -50%) rotate(-90deg) !important; -webkit-transform: translate(45%, -50%) rotate(-90deg) ; -moz-transform: translate(45%, -50%) rotate(-90deg) ; -o-transform: translate(45%, -50%) rotate(-90deg) ; -ms-transform: translate(45%, -50%) rotate(-90deg) ; } .gw-float-widget[gw-stock-fulfilled] { color: #ffffff; background-color: #B8827F; } .gw-float-widget[gw-price-drop] { color: #ffffff; background-color: #000000; } .gw-collection-page-button{ z-index:2; width:100%; color: #ffffff; background-color: #B8827F; padding:10px; font-size:12px; margin-top:5px; border:none; cursor:pointer; position:relative; } .gw-float-widget { width: fit-content; } .gw-float-widget[gw-price-drop] { } .gw-button-widget[gw-stock-fulfilled] { margin-top:15px; } .gw-modal,#gw-stock-fulfilled-iframe,#gw-price-drop-iframe { position: fixed; height: 100%; width: 100%; top: 0; z-index: 99999; overflow: hidden; display: none; border:none; } .gw-button-widget{ width:100%; } ` let styleSheet = document.createElement("style") styleSheet.type = "text/css" let inlineCode = document.createTextNode(styles); styleSheet.appendChild(inlineCode); document.head.appendChild(styleSheet) let client = GrowClient.default; if (initVar.isPostPurchasePage()) { initVar.sendOrderPurchaseEvent(client) } client.onInit = (subId) => { initVar.log("subId" + subId) initVar.subscriberId = subId // window.growConfig.cartMappingFn() } client.init(initVar) window["growClient"] = client if (!(await client.getClientStatus())) { initVar.log("Client is not active") return; } initVar.subscriberId = await client.getSubscriberId() //try with subscriber id, it can take time to get subscriber id if (initVar.isPostPurchasePage()) { initVar.sendOrderPurchaseEvent(client) } window["growConfig"] = initVar window["initVar"] = initVar // window.growConfig.cartMappingFn = async function () { // let cartResponse = await fetch('/cart.js') // .then(x => x.json()) // .catch(x => console.log(x.status)); // if (cartResponse && cartResponse.token) { // // } // }; growConfig.registerUtmParameter(); window.growConfig.addToCartClicked(); if (initVar.customJs) { let scriptElm = document.createElement('script'); scriptElm.type = "text/javascript" let inlineCode = document.createTextNode(initVar.customJs); // scriptElm.innerText = initVar.customJs scriptElm.appendChild(inlineCode); document.head.appendChild(scriptElm) } if (initVar.customCss) { let styleElm = document.createElement('style'); let inlineCode = document.createTextNode(initVar.customCss); styleElm.appendChild(inlineCode); document.head.appendChild(styleElm) } initVar.getValueIfExist(() => { fetch('https://www.cloudflare.com/cdn-cgi/trace', {method: "GET"}).then(async (res) => { let loc = await res.text(); initVar.defaultCountry = loc &&loc.split('\n').find(x => x.includes('loc')).split('=')[1].trim(); }) }) lastPage = null; window.productChangeIntervalSet = false; if (!window.productChangeIntervalSet) { setInterval(async () => { window.productChangeIntervalSet = true; if (window.location.href.includes("/products/") && window.location.href !== lastPage) { // console.log("Checking Product Data"); lastPage = window.location.href await initVar.registerOnVariantChange() await initVar.registerAddToCartChange() await initVar.onVariantChange() } }, 500) } let isCollectionPage=window.location.href.includes("/collections/"); if(initVar.showOnOtherPages){ isCollectionPage=true } if (isCollectionPage && !window.location.href.includes("/products/")){ if(initVar.stockWidget.showOnCollectionPage){ if (!initVar.stockWidget.isEnabled) { return; } let mainJsScriptTag = document.createElement('script'); mainJsScriptTag.src = window.cartBiteCollectionJsUrl; mainJsScriptTag.async = true; document.getElementsByTagName('head')[0].appendChild(mainJsScriptTag); } } })(); } }