{"version":3,"file":"homepage-min.js","mappings":"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","sources":["webpack://waves/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","webpack://waves/./src/domain/abtest/abtest-provider.ts","webpack://waves/./src/DAL/storage-provider.ts","webpack://waves/./src/domain/url-provider.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/cart-steps.ts","webpack://waves/./src/projects/products/enums/product-department-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/last-payment-option-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/payment-tabs-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/credit-card-service-enum.ts","webpack://waves/./src/projects/shopping-cart/cart-bridger-pay/enums/credit-card-tab.ts","webpack://waves/./src/projects/homepage/index.ts","webpack://waves/./src/domain/marketing/gtm-provider.ts"],"sourcesContent":["export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","import { IABMasterSlotData, IABTest, IABTestSystem, IABTestVariation } from './abtest-interfaces';\r\nimport { getQueryString } from '../url-provider';\r\nimport { getCookie, getLocalStorageItem, setLocalStorageItem } from '../../DAL/storage-provider';\r\n\r\n/*\r\nUsage:\r\n-------\r\nconst abtest = getABTest('NeoWizeListRecs9019');\r\n\r\nif(abtest.isActive){\r\n sendABTestAnalytics(abtest);\r\n // sendABTestAnalytics(abtest, 'unavailable object');\r\n\r\n console.log(abtest.selected);\r\n}\r\n */\r\n\r\n/**\r\n * Allows to TypeScript recognize abtests namespace\r\n */\r\ndeclare global {\r\n interface Window {\r\n abtests: any;\r\n }\r\n}\r\n\r\nexport enum ABTestTypeEnum{\r\n Client = 0,\r\n Server = 1\r\n}\r\n\r\n// const EXPIRATION = 2000000000;\r\nconst CLIENT_SIDE_LOCAL_STORAGE_NAME = 'waves_abtest';\r\nconst SERVER_SIDE_COOKIE_NAME = 'waves_abtest_server';\r\n\r\n/**\r\n * handle the case when test has a master with selected \"off\" variant but their variant percents are different\r\n */\r\nconst handlePartialMasterVariants = (test: IABTest) => {\r\n if(!test.variations) return;\r\n\r\n let sum = 0;\r\n const offItems = [];\r\n\r\n for(let i=0; i 0) ? (100 / sum) : 0;\r\n\r\n for(let i=0; i the same, otherwise different\r\n */\r\nconst compareTestsVariants = (test1: IABTest, test2: IABTest) => {\r\n\r\n const test1Variations = test1.variations || [];\r\n const test2Variations = test2.variations || [];\r\n\r\n const values1 = test1Variations.map(item => item.percent);\r\n\r\n values1.sort((a, b) => {\r\n return a - b;\r\n });\r\n\r\n const values2 = test2Variations.map(item => item.percent);\r\n\r\n values2.sort((a, b) => {\r\n return a - b;\r\n });\r\n\r\n return values1.join(' ') === values2.join(' ');\r\n};\r\n\r\n/**\r\n * choose variation for 1 test\r\n */\r\nconst chooseVariation = (test: IABTest) => {\r\n\r\n const notRandomNumbers = [];\r\n\r\n if(!test || !test.variations) return;\r\n\r\n for(let i=0; i {\r\n\r\n if(!variations) return [];\r\n\r\n const testVariations: IABTestVariation[] = [];\r\n\r\n const list = variations.split(',');\r\n\r\n for(let i=0; i {\r\n\r\n const $data = document.getElementById('abtest-data') as HTMLElement;\r\n if(!$data) return [];\r\n\r\n const result: IABTest[] = [];\r\n let data = [];\r\n\r\n try{\r\n data = JSON.parse($data.textContent || '');\r\n }\r\n catch(ex){}\r\n\r\n if(!data) return [];\r\n\r\n for(let i=0; i {\r\n\r\n if (!window.location.search || window.location.search.indexOf('abtest') === -1) return [];\r\n\r\n const abtestString = getQueryString()['abtest'];\r\n\r\n if(!abtestString) return [];\r\n\r\n const tests = [];\r\n const testsArr = abtestString.split('_');\r\n\r\n for(let i=0; i {\r\n\r\n for(let i=0; i {\r\n\r\n for(let i=0; i {\r\n\r\n const masterSlotIDs: IABMasterSlotData = {};\r\n const regular = [];\r\n\r\n // get updated tests and split them to 2 groups: master and non-master\r\n for(let i=0; i {\r\n\r\n if(!savedTests || !Array.isArray(savedTests)){\r\n savedTests = [];\r\n }\r\n\r\n if(!newTests || !Array.isArray(newTests)){\r\n newTests = [];\r\n }\r\n\r\n let updatedTests: IABTest[] = [];\r\n\r\n //find old tests that appear in new tests already and add them (they have selected value already)\r\n findOldTestsThatAppearInNewTests(updatedTests, savedTests, newTests);\r\n\r\n //find new tests that don't appear in old tests\r\n findNewTestsThankDontAppearInOldTests(updatedTests, savedTests, newTests);\r\n\r\n //choose variations\r\n updatedTests = chooseVariations(updatedTests);\r\n\r\n return updatedTests;\r\n};\r\n\r\n/**\r\n * client side tests init\r\n */\r\nconst initClientSideTests = () => {\r\n\r\n // get test data printed as JSON in HTML\r\n const newClientSideTests = getTestsFromHTML(false);\r\n\r\n // try to get value from storage\r\n let savedClientSideTests: IABTest[] = [];\r\n let savedClientSideTestsStr = getLocalStorageItem(CLIENT_SIDE_LOCAL_STORAGE_NAME) as string;\r\n\r\n try{\r\n savedClientSideTests = JSON.parse(savedClientSideTestsStr);\r\n\r\n /*\r\n if(typeof savedClientSideTests === 'string'){\r\n savedClientSideTests = JSON.parse(savedClientSideTests);\r\n }*/\r\n }\r\n catch(ex){\r\n savedClientSideTests = [];\r\n }\r\n\r\n // merge client side tests and get updated tests\r\n const clientSideTests = mergeTests(savedClientSideTests, newClientSideTests);\r\n\r\n setLocalStorageItem(CLIENT_SIDE_LOCAL_STORAGE_NAME, clientSideTests);\r\n\r\n return clientSideTests;\r\n};\r\n\r\n/**\r\n * server side tests init\r\n */\r\nconst initServerSideTests = () => {\r\n\r\n // try to get value from cookies\r\n let serverSideTestsStr = getCookie(SERVER_SIDE_COOKIE_NAME);\r\n let serverSideTests: IABTest[] = [];\r\n\r\n if(!serverSideTestsStr) return [];\r\n\r\n try{\r\n serverSideTests = JSON.parse(serverSideTestsStr) as IABTest[];\r\n }\r\n catch(ex){\r\n serverSideTests = [];\r\n }\r\n\r\n return serverSideTests;\r\n};\r\n\r\n/**\r\n * init A/B test system\r\n */\r\nexport const initABTestSystem = () : IABTestSystem => {\r\n\r\n // change tests since the last time\r\n let clientSideTests: IABTest[] = [];\r\n let serverSideTests: IABTest[] = [];\r\n\r\n // try to get client side tests from url;\r\n // used for debug;\r\n const urlTests = getClientSideTestsFromURL();\r\n\r\n if(!urlTests || urlTests.length <= 0){\r\n\r\n clientSideTests = initClientSideTests();\r\n serverSideTests = initServerSideTests();\r\n }\r\n\r\n return {\r\n clientSideTests,\r\n serverSideTests,\r\n urlTests,\r\n }\r\n};\r\n\r\n/**\r\n * get test by test name\r\n */\r\nexport const getABTest = (testName: string) => {\r\n\r\n if(!window.abtests){\r\n window.abtests = initABTestSystem() as IABTestSystem;\r\n }\r\n\r\n if(!window.abtests) return null;\r\n\r\n const urlTest = window.abtests.urlTests.find((test: IABTest) => test.codeName.toLowerCase().trim() === testName.toLowerCase().trim());\r\n\r\n if(urlTest && urlTest.isActive) return urlTest;\r\n\r\n const clientSideTest = window.abtests.clientSideTests.find((test: IABTest) => test.codeName.toLowerCase().trim() === testName.toLowerCase().trim());\r\n\r\n if(clientSideTest && clientSideTest.isActive) return clientSideTest;\r\n\r\n const serverSideTest = window.abtests.serverSideTests.find((test: IABTest) => test.codeName.toLowerCase().trim() === testName.toLowerCase().trim());\r\n\r\n if(serverSideTest && serverSideTest.isActive && serverSideTest.started) return serverSideTest;\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * send data to google analytics\r\n */\r\nexport const sendABTestAnalytics = (_test: IABTest, selected = '') => {\r\n\r\n if (!_test || !window.dataLayer) return;\r\n\r\n const test = {..._test};\r\n\r\n if(selected !== ''){\r\n test.selected = selected;\r\n }\r\n\r\n // send data to google analytics\r\n window.dataLayer.push({\r\n 'testName': test.codeName\r\n , 'testVariation': test.selected\r\n , 'testSlot': test.slot\r\n , 'event': 'user entered test'\r\n });\r\n\r\n // some tests have master slot ID not equal to 0\r\n const masterSlotID = Number(test.masterSlotID) || 0;\r\n\r\n if (masterSlotID === 0 || !window.abtests || !window.abtests.clientSideTests) return;\r\n\r\n // find all tests with masterSlotID property equal to the given master\r\n const found = window.abtests.clientSideTests.filter((item: IABTest) => {\r\n const slot = Number(item.slot) || 0;\r\n return masterSlotID === slot;\r\n });\r\n\r\n if (!found || found.length <= 0) return;\r\n\r\n // we suppose that there is only one master with the given slot number\r\n const master = found[0];\r\n\r\n // check if master and test have the same variants\r\n const theSameVariantValues = compareTestsVariants(test, master);\r\n\r\n if(!theSameVariantValues) return;\r\n\r\n //send master data to GA\r\n window.dataLayer.push({\r\n 'testName': master.codeName\r\n ,'testVariation': master.selected\r\n ,'testSlot': master.slot\r\n ,'event': 'user entered test'\r\n });\r\n};","export const COOKIES = 'cookies';\r\nexport const SESSION_STORAGE = 'session-storage';\r\nexport const LOCAL_STORAGE = 'local-storage';\r\n\r\n/**\r\n * check if storage type is enabled\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n */\r\nexport const isStorageEnabled = (storageType: string) => {\r\n\r\n if(storageType === COOKIES) return true;\r\n\r\n if(storageType === LOCAL_STORAGE){\r\n\r\n const temp = 'test';\r\n\r\n try {\r\n window.localStorage.setItem(temp, temp);\r\n window.localStorage.removeItem(temp);\r\n return true;\r\n }\r\n catch(e) {\r\n return false;\r\n }\r\n }\r\n\r\n if(storageType === SESSION_STORAGE){\r\n\r\n const temp = 'test';\r\n\r\n try {\r\n window.sessionStorage.setItem(temp, temp);\r\n window.sessionStorage.removeItem(temp);\r\n return true;\r\n }\r\n catch(e) {\r\n return false;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\n/**\r\n * set cookie\r\n * expiration - cookie expiration in minutes (-1 = cookie expires when browser is closed)\r\n * samesite - strict or lax\r\n */\r\nexport const setCookie = (\r\n name: string,\r\n value: any,\r\n expiration: number = -1,\r\n secure: boolean = false,\r\n samesite: string|undefined = undefined,\r\n preventStringify: boolean = false,\r\n domain?: string, // .waves.com\r\n) => {\r\n\r\n const escapedValue = encodeURIComponent(preventStringify ? value : JSON.stringify(value));\r\n const exp = Number(expiration) || -1;\r\n let cookieString = '';\r\n\r\n const domainValue = domain ? `domain=${ domain };` : '';\r\n\r\n if(exp === -1) {\r\n\r\n // cookie expires when browser is closed\r\n // If neither expires nor max-age specified the cookie will expire at the end of session.\r\n cookieString = `${ name }=${ escapedValue };path=/;${ domainValue }`;\r\n }\r\n else{\r\n const date = new Date();\r\n date.setMinutes(date.getMinutes() + expiration);\r\n\r\n // option to set expiration in days:\r\n //864e5 = 86400000 = 1000*60*60*24 represents the number of milliseconds in a 24 hour day.\r\n //date.setTime(date.getTime() + (days * 864e5));\r\n\r\n const expires = date.toUTCString();\r\n cookieString = `${ name }=${ escapedValue };path=/;${ domainValue }expires=${ expires }`;\r\n }\r\n\r\n if(samesite){\r\n // The strict value will prevent the cookie from being sent by the browser to the target site in all cross-site browsing context, even when following a regular link.\r\n // The lax value will only send cookies for TOP LEVEL navigation GET requests. This is sufficient for user tracking, but it will prevent many CSRF attacks.\r\n cookieString += `;samesite=${samesite}`;\r\n }\r\n\r\n if(secure){\r\n // Cookie to only be transmitted over secure protocol as https. Before Chrome 52, this flag could appear with cookies from http domains.\r\n cookieString += ';secure';\r\n }\r\n\r\n document.cookie = cookieString;\r\n};\r\n\r\n/**\r\n * Get cookie by name\r\n */\r\nexport const getCookie = (name: string) => {\r\n\r\n const cookies = document.cookie.split(';');\r\n\r\n for (let i=0; i {\r\n const escapedValue = encodeURIComponent(JSON.stringify(value));\r\n window.localStorage.setItem(storageName, escapedValue);\r\n};\r\n\r\n/**\r\n * get a value to the local storage\r\n */\r\nexport const getLocalStorageItem = (storageName: string) => {\r\n const value = window.localStorage.getItem(storageName) as string;\r\n return decodeURIComponent(value);\r\n};\r\n\r\n/**\r\n * save a value to the session storage\r\n */\r\nexport const setSessionStorageItem = (storageName: string, value: any) => {\r\n const escapedValue = encodeURIComponent(JSON.stringify(value));\r\n window.sessionStorage.setItem(storageName, escapedValue);\r\n};\r\n\r\n/**\r\n * get a value to the session storage\r\n */\r\nexport const getSessionStorageItem = (storageName: string) => {\r\n const value = window.sessionStorage.getItem(storageName) as string;\r\n return decodeURIComponent(value);\r\n};\r\n\r\n/**\r\n * save to web storage or cookies\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n * cookiesExpiration - cookies expiration in minutes (-1 = cookies expire when browser is closed)\r\n */\r\nexport const saveToStorage = (storageType: string, storageName: any, value: any, cookiesExpiration: number = -1) => {\r\n\r\n // if this storage type is not supported -> do nothing\r\n if(!isStorageEnabled(storageType)) return;\r\n\r\n if(storageType === COOKIES) {\r\n setCookie(storageName, value, cookiesExpiration);\r\n }\r\n\r\n if(storageType === LOCAL_STORAGE) {\r\n setLocalStorageItem(storageName, value);\r\n }\r\n\r\n if(storageType === SESSION_STORAGE) {\r\n setSessionStorageItem(storageName, value);\r\n }\r\n};\r\n\r\n/**\r\n * get value from storage\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n */\r\nexport const getFromStorage = (storageType: string, storageName: string) : string|null => {\r\n\r\n // if this storage type is not supported -> do nothing\r\n if(!isStorageEnabled(storageType)) return null;\r\n\r\n if(storageType === COOKIES) {\r\n return getCookie(storageName);\r\n }\r\n\r\n if(storageType === LOCAL_STORAGE) {\r\n return getLocalStorageItem(storageName);\r\n }\r\n\r\n if(storageType === SESSION_STORAGE) {\r\n return getSessionStorageItem(storageName);\r\n }\r\n\r\n return null;\r\n};\r\n\r\n/**\r\n * if storage already exists, append to it, otherwise create a new one\r\n * storageType - 'local-storage', 'session-storage', or 'cookies'\r\n * storageName - it is used like key name in web storage, or like cookie name\r\n * this is a property name that is used to store the value inside the general widgets object\r\n * value - the value that should be stored\r\n * cookiesExpiration - cookies expiration in minutes (-1 = cookies expire when browser is closed)\r\n */\r\nexport const appendToStorage = (storageType: string, storageName: string, key: string, value: any, cookiesExpiration: number = -1) => {\r\n\r\n let data = getFromStorage(storageType, storageName) as any;\r\n\r\n try{\r\n data = JSON.parse(data);\r\n }\r\n catch(err){}\r\n\r\n if(!data) {\r\n\r\n // create new entry\r\n data = {\r\n [key]: value\r\n };\r\n }\r\n else{\r\n // append the entry\r\n data[key] = value;\r\n }\r\n\r\n // overwrite the storage\r\n saveToStorage(storageType, storageName, data, cookiesExpiration = -1);\r\n};","import { IIndexable } from './interfaces';\r\n\r\n/**\r\n * Read a page's GET URL variables and return them as an associative array\r\n * search (optional) - '?me=myValue&name2=SomeOtherValue'\r\n *\r\n * Usage:\r\n * ------\r\n * getQueryString(); //window.location.search\r\n * getQueryString('?me=myValue&name2=SomeOtherValue');\r\n * getQueryString()['key'] -> value\r\n *\r\n * Result:\r\n * -------\r\n * {\r\n * \"me\" : \"myValue\",\r\n * \"name2\" : \"SomeOtherValue\"\r\n * }\r\n *\r\n */\r\nexport const getQueryString = (search?: string, caseSensitive: boolean = true) : IIndexable => {\r\n\r\n const result = {} as IIndexable;\r\n\r\n if(!search){\r\n search = window.location.search;\r\n }\r\n\r\n // decode if needed\r\n search = window.decodeURIComponent(search.toString());\r\n\r\n if(!caseSensitive){\r\n search = search?.toLowerCase();\r\n }\r\n\r\n if(search.length <= 1) return result;\r\n\r\n // get hashes\r\n const hashes = search.substring(1).split('&');\r\n\r\n for(let i = 0; i < hashes.length; i++){\r\n\r\n //get hash\r\n const hash = hashes[i];\r\n\r\n //get hash sections\r\n const sections = hash.split('=');\r\n\r\n if(sections.length >= 2){\r\n\r\n let val = '';\r\n\r\n for(let s=1; s 1){\r\n val += '=';\r\n }\r\n\r\n val += sections[s];\r\n }\r\n\r\n //add to the object\r\n result[sections[0]] = val;\r\n }\r\n }\r\n\r\n return result;\r\n};\r\n\r\n/**\r\n * generate return URL that includes query string and hashes\r\n * https://www.waves.com/login?ReturnUrl=/vocal-mixing-masterclass-leslie-brathwaite?playlist=756640c2-13c0-408b-ad77-0294173d7721\r\n */\r\nexport const getReturnURL = (prefix = '/login') => {\r\n /*\r\n const qs = Object.entries(getQueryString()).map(([key, value], index) => `${key}=${value}`); //\r\n qs.push(`returnurl=${encodeURIComponent(window.location.pathname)}`);\r\n return `/login?${qs.join('&')}`*/\r\n\r\n const returnURL = `ReturnUrl=${window.location.pathname}${window.location.search}${window.location.hash}`;\r\n return `${prefix}?${returnURL}`\r\n};\r\n\r\nexport const removeQueryParamFromUrl = (queryParam: string) => {\r\n if(!queryParam || typeof URLSearchParams === 'undefined') return;\r\n\r\n const url = new URL(window.location.href);\r\n const params = new URLSearchParams(url.search);\r\n if(params.has(queryParam)){\r\n params.delete(queryParam);\r\n url.search = params.toString();\r\n }\r\n\r\n window.history.replaceState({}, '', url.toString());\r\n};","export enum CartSteps {\r\n First = 1,\r\n Second = 2,\r\n Third = 3,\r\n}","export enum ProductDepartmentEnum {\r\n Bundles = 1,\r\n Plugins = 2,\r\n General = 5,\r\n Books = 6,\r\n InactiveItems = 7,\r\n LiveSound = 8,\r\n Hardware = 9,\r\n Software = 10,\r\n Subscription = 12,\r\n Consumer = 13,\r\n RentToOwnDynamic = 14,\r\n RentToOwnStatic = 15,\r\n Merch = 16,\r\n WavesUpdatePlan = 17,\r\n Upgrades = 18,\r\n Courses = 19,\r\n SubscriptionDynamic = 20,\r\n Gifts = 21,\r\n CoursesWithSoftware = 22,\r\n SubscriptionNonRecurring = 23,\r\n Mastering = 24,\r\n}","/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-3278\r\n * ap = alipay, pp = paypal, cc = credit card, null = no previous purchase\r\n */\r\nexport enum LastPaymentOption {\r\n NONE = '',\r\n CreditCard = 'cc',\r\n PayPal = 'pp',\r\n AliPay = 'ap',\r\n}","export enum PaymentTabsEnum {\r\n CreditCard = 1,\r\n PayPal = 2,\r\n AliPay = 3,\r\n}","export enum CreditCardServiceEnum {\r\n None = 0,\r\n FirstData = 1,\r\n Pinnacle = 2,\r\n Stripe = 3\r\n}","export enum CreditCardTabTabsEnum {\r\n NewCreditCard = 1,\r\n SavedCreditCards = 2,\r\n}","import {getABTest, sendABTestAnalytics} from \"../../domain/abtest/abtest-provider\";\r\nimport {sendGAEvent} from \"../../domain/marketing/gtm-provider\";\r\n\r\nwindow.addEventListener('DOMContentLoaded', (event) => {\r\n\r\n const nodeGUID = document.getElementById('nodeguid')?.textContent?.trim().toLowerCase();\r\n if(nodeGUID !== '2a648dcc-c490-4886-9cfe-138c45ae35d8'){\r\n ABShow('hide');\r\n return;\r\n }\r\n\r\n const isUserPurhased = document.getElementById('is-user-purhased')?.textContent?.trim().toLowerCase();\r\n //console.log('isUserPurhased: ',isUserPurhased);\r\n if(isUserPurhased !== 'false'){\r\n ABShow('hide');\r\n return;\r\n }\r\n\r\n const abtest_SBSBannerHP = getABTest('SBSBannerHP33');\r\n const abTestEnabled = !!abtest_SBSBannerHP && abtest_SBSBannerHP.isActive;\r\n if(!abTestEnabled) {\r\n ABShow('hide');\r\n return;\r\n }\r\n\r\n\r\n\r\n const visitorFindMethod = document.getElementById('visitor-find-method')?.textContent?.trim().toLowerCase();\r\n if(visitorFindMethod !== undefined && visitorFindMethod !== null && visitorFindMethod !== '')\r\n sendGAEvent('visitor-find-method',visitorFindMethod);\r\n\r\n sendABTestAnalytics(abtest_SBSBannerHP);\r\n\r\n\r\n ABShow(abtest_SBSBannerHP.selected);\r\n\r\n\r\n function ABShow(abtestSelected : string) {\r\n const abEmptySection = document.getElementById('ab-empty');\r\n const abTopSection = document.getElementById('ab-top');\r\n const abBigSection = document.getElementById('ab-sbs');\r\n const abStripSection = document.getElementById('ab-strip');\r\n if(!abTopSection || !abBigSection || !abStripSection || !abEmptySection) {\r\n if(abEmptySection)\r\n abEmptySection.classList.add(\"hidden\");\r\n if(abTopSection)\r\n abTopSection.classList.remove(\"hidden\");\r\n return;\r\n };\r\n\r\n\r\n if(abtestSelected === 'hide'){\r\n abEmptySection.classList.add(\"hidden\");\r\n abTopSection.classList.remove(\"hidden\");\r\n }\r\n if(abtestSelected === 'big'){\r\n abEmptySection.classList.add(\"hidden\");\r\n abBigSection.classList.remove(\"hidden\");\r\n abTopSection.classList.remove(\"hidden\");\r\n }\r\n if(abtestSelected === 'strip'){\r\n abEmptySection.classList.add(\"hidden\");\r\n abStripSection.classList.remove(\"hidden\");\r\n abTopSection.classList.remove(\"hidden\");\r\n }\r\n };\r\n\r\n});\r\n\r\nexport {};","/**\r\n * Allows to TypeScript recognize google tag manager namespace\r\n */\r\nimport {IListItem} from \"../../projects/list-page/interfaces/interfaces\";\r\nimport { CartSteps } from '../../projects/shopping-cart/cart-bridger-pay/enums/cart-steps';\r\nimport { ICartData } from '../../projects/shopping-cart/cart-bridger-pay/interfaces';\r\nimport { getHiddenDataNumber, getHiddenDataString } from '../hidden-data-provider';\r\nimport { IOrder } from '../../projects/shopping-cart/cart-thank-you/interfaces';\r\nimport { getExpectedLTV } from '../../projects/shopping-cart/cart-bridger-pay/domain/shopping-cart-provider';\r\n\r\ndeclare global {\r\n interface Window {\r\n dataLayer: any;\r\n }\r\n}\r\n\r\ninterface IGAProduct{\r\n name: string,\r\n id: string,\r\n price: number,\r\n category: string,\r\n variant: string,\r\n list: string,\r\n}\r\n\r\ninterface IGAImpression {\r\n name: string,\r\n id: string,\r\n price: number,\r\n category: string,\r\n variant: string,\r\n list: string,\r\n position: number,\r\n}\r\n\r\ninterface IActionField{\r\n list: string,\r\n}\r\n\r\ninterface ICheckoutActionField {\r\n step: number,\r\n option?: number,\r\n}\r\n\r\n/**\r\n * send data to GTM after registration\r\n */\r\nexport const gtmCreateAccount = (referrer = 'from Signup form') => {\r\n if(!window.dataLayer) return;\r\n\r\n window.dataLayer.push({\r\n 'GA_event_category': 'Registration',\r\n 'GA_event_action': 'New account',\r\n 'GA_event_label': referrer,\r\n 'event': 'GTM event To GA'\r\n });\r\n};\r\n\r\n/**\r\n * send google analytics track event\r\n * @param {string} eventTitle - event title (data-gaevent=\"Click\")\r\n * @param {string} eventValue - event value (data-gavalue=\"...\")\r\n */\r\nexport const sendGAEvent = (eventTitle: string, eventValue: string) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n window.dataLayer.push({\r\n 'GA_event_action': eventTitle\r\n , 'GA_event_category': window.location.pathname\r\n , 'GA_event_label': eventValue\r\n , 'event': 'GTM event To GA'\r\n });\r\n};\r\n\r\n/**\r\n * get category from url\r\n */\r\nexport const getCategoryFromURL = (url: string) => {\r\n\r\n if(!url) return '';\r\n\r\n const idx = url.lastIndexOf('/');\r\n\r\n if(idx !== -1){\r\n return url.substring(0, url.lastIndexOf('/')).replace('/', '');\r\n }\r\n\r\n return '';\r\n};\r\n\r\n/**\r\n * send product clicks to the gtm\r\n */\r\nexport const sendGaEventImpressions = (impressions: IGAImpression[]) => {\r\n\r\n if(!window.dataLayer || !impressions || impressions.length <= 0) return;\r\n\r\n window.dataLayer.push({\r\n event: 'ProductImpression'\r\n ,ecommerce: {\r\n currencyCode: 'USD' //local currency is optional\r\n ,impressions: impressions\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * send product details to the gtm\r\n */\r\nexport const sendGaEventProductDetails = (analyticsData: { price: number; name: string; id: string; category: string }[]) => {\r\n\r\n if(!window.dataLayer || !analyticsData || analyticsData.length <= 0) return;\r\n\r\n window.dataLayer.push({\r\n event: 'productDetail'\r\n ,ecommerce: {\r\n detail: {\r\n products: analyticsData\r\n }\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * send product clicks to the gtm\r\n * actionField - {list: 'List Page'} (Product Page Tab / List Page / Shopping Cart Gallery / Homepage)\r\n */\r\nexport const sendGaEventProductClick = (actionField: IActionField, products: IGAProduct[]) => {\r\n\r\n if(!window.dataLayer || !products || products.length <= 0) return;\r\n\r\n window.dataLayer.push({\r\n event: 'productClick'\r\n ,ecommerce: {\r\n click: {\r\n actionField: actionField\r\n ,products: products\r\n }\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * send Google Analytics list page event\r\n */\r\nexport const sendGAListPageEvent = (product: IListItem, listName: string = 'List Page') => {\r\n\r\n const title = product.title ? product.title : listName;\r\n\r\n const item = {\r\n name: product.documentName\r\n ,id: product.skuNumber\r\n ,price: product.skuPrice\r\n ,category: getCategoryFromURL(product.documentUrlPath)\r\n ,variant: 'NONE'\r\n ,list: title\r\n };\r\n\r\n sendGaEventProductClick({list: title}, [item]);\r\n};\r\n\r\n/**\r\n * send page type event to google analytics according to the following meta on the page:\r\n * \r\n */\r\nexport const sendGAPageTypeEvent = () => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n const $meta = document.querySelector('meta[property=\"google-ecomm-pagetype\"]');\r\n if(!$meta) return;\r\n\r\n window.dataLayer.push({\r\n pageType: $meta.getAttribute('content') || '',\r\n });\r\n};\r\n\r\n/**\r\n * send GA user guid event from the following hidden field:\r\n *
@ViewBag.LayoutModel.GA_GUID
\r\n */\r\nexport const sendGAWavesUserGuidEvent = (gaGuid = '') => {\r\n if(!window.dataLayer) return;\r\n\r\n window['dataLayer'].push({\r\n 'waves-user-guid': gaGuid || getHiddenDataString('ga-user-guid'),\r\n });\r\n};\r\n\r\n/**\r\n * This event is sent when user clicks on 'proceed to checkout' button on each cart step.\r\n */\r\nexport const sendGaCheckoutEvent = (cartStep: CartSteps, cartData: ICartData) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n if(cartStep === CartSteps.Third){\r\n\r\n window.dataLayer.push({\r\n 'GA_event_action': 'Payment Method'\r\n ,'GA_event_category': document.location.pathname\r\n ,'GA_event_label': 'Credit Card'\r\n ,'event': 'GTM event To GA'\r\n });\r\n }\r\n\r\n const actionField: ICheckoutActionField = {\r\n step: cartStep,\r\n };\r\n\r\n if(cartStep === CartSteps.First) {\r\n actionField.option = cartData.cartItems.reduce((total, cur) => total + cur.skuUnits, 0);\r\n }\r\n\r\n const products: any[] = cartData.cartItems.filter(cartItem => cartItem.isActive).map(cartItem => {\r\n return {\r\n skuid:\tcartItem.skuid,\r\n skuDepartment:\tcartItem.skuDepartmentID,\r\n skuDepartmentName:\tcartItem.departmentName, //'plugins',\r\n skuguid: cartItem.skuguid,\r\n name: cartItem.skuName,\r\n skunumber:\tcartItem.skuNumber,\r\n skuNeedsShipping:\tcartItem.skuNeedsShipping,\r\n //isSBL:\tfalse,\r\n //isPDL:\tfalse,\r\n //img:\t'/1lib/images/products/plugins/tiny/clarity-vx.png',\r\n thumb:\tcartItem.skuThumb,\r\n quantity:\tcartItem.skuUnits,\r\n price:\tcartItem.priceData.price,\r\n upsell:\tcartItem.priceData.discount,\r\n msrp:\tcartItem.skU_MSRP,\r\n yousave: cartItem.priceData.discount,\t//119.01,\r\n producttotal: cartItem.priceData.price * cartItem.skuUnits,\r\n link:\tcartItem.documentUrlPath,\r\n cartComment: cartItem.cartComment,\r\n skuEnabled:\tcartItem.skuEnabled,\r\n //mvrDiscountPrice:\t0,\r\n //mvrItemDiscount:\t0,\r\n pricega: cartItem.priceData.price,\r\n }\r\n })\r\n\r\n window['dataLayer'].push({\r\n event: 'checkout',\r\n CartValue: cartData.priceData.totalPrice,\r\n ecommerce: {\r\n checkout: {\r\n actionField: actionField,\r\n products,\r\n }\r\n }\r\n });\r\n};\r\n\r\nexport const sendGATransactionTriggerEventHelper = (orderData: IOrder) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n const products: any[] = [];\r\n\r\n for(let orderItem of orderData.orderItems){\r\n products.push({\r\n 'name': orderItem.orderItemSKUName,\r\n 'id': orderItem.skuNumber,\r\n 'price': orderItem.discountPrice,\r\n 'brand': 'Waves',\r\n 'category': (orderItem.departmentDisplayName ?? '').toLowerCase(),\r\n 'quantity': orderItem.orderItemUnitCount,\r\n });\r\n }\r\n\r\n if(orderData.upsellDiscount > 0){\r\n\r\n products.push({\r\n 'name': 'Discount',\r\n 'price': -orderData.upsellDiscount,\r\n 'brand': 'Waves',\r\n 'quantity': 1,\r\n });\r\n }\r\n\r\n window.dataLayer.push({\r\n event: 'TransactionTrigger'\r\n ,PaymentMethod: orderData.fundSourceType // 'Credit Card / PayPal / AliPay / Splitit'\r\n\r\n ,ecommerce: {\r\n purchase: {\r\n 'actionField': {\r\n 'id': orderData.wavesReceiptID,\r\n 'affiliation': 'Online Store',\r\n 'revenue': orderData.totalPrice - orderData.taxPrice - orderData.shippingTaxPrice,\r\n 'tax': orderData.taxPrice + orderData.shippingTaxPrice,\r\n 'shipping': orderData.shippingPrice,\r\n },\r\n products,\r\n }\r\n }\r\n });\r\n\r\n};\r\n\r\n/**\r\n * This event is sent on 'thank you' page only after the real purchase.\r\n */\r\nexport const sendGATransactionTriggerEvent = (orderData: IOrder) => {\r\n sendGATransactionTriggerEventHelper(orderData);\r\n\r\n window.dataLayer.push({\r\n event: getExpectedLTV(orderData) > 0 ? 'TransactionTriggerSBS' : 'TransactionTriggerPerpetual',\r\n });\r\n};\r\n\r\nexport const sendThankYouDataToGTM = (orderData: IOrder) => {\r\n if(!window.dataLayer) return;\r\n\r\n const quantity = orderData.orderItems.reduce(\r\n (previousQty, orderItem) => previousQty + orderItem.orderItemUnitCount,\r\n 0\r\n );\r\n\r\n window.dataLayer.push({\r\n 'quantity': quantity,\r\n 'receiptid': orderData.wavesReceiptID,\r\n 'priceWithoutTaxAndShipping': getHiddenDataNumber('price-without-tax-and-shipping'),\r\n 'OrderID': orderData.orderID,\r\n 'email': orderData.email,\r\n 'yotpo-api-key': getHiddenDataString('yotpo-api-key'),\r\n 'expectedLTV': getExpectedLTV(orderData),\r\n });\r\n};\r\n\r\n/**\r\n * send data to gtm every time when product is added to cart\r\n */\r\nexport const sendGAEventAddToCart = (\r\n documentName: string,\r\n skuNumber: string,\r\n skuPrice: number,\r\n documentUrlPath: string,\r\n list: string = '',\r\n) => {\r\n\r\n if(!window.dataLayer) return;\r\n\r\n const data = {\r\n event: 'addToCart'\r\n ,ecommerce: {\r\n currencyCode: 'USD'\r\n ,add: {\r\n products: [\r\n {\r\n name: documentName\r\n ,id: skuNumber\r\n ,price: skuPrice\r\n ,variant: 'NONE'\r\n ,quantity: 1\r\n ,category: getCategoryFromURL(documentUrlPath)\r\n }\r\n ],\r\n }\r\n }\r\n };\r\n\r\n if(list){\r\n // @ts-ignore\r\n data.ecommerce.add.actionField = { list, };\r\n }\r\n\r\n window.dataLayer.push(data);\r\n};\r\n\r\n/**\r\n * https://wavesaudio.atlassian.net/browse/DSWEB-1143\r\n * Edited by Raz Liveyatan, 04.11.2021\r\n * Migrated by Raz Liveyatan, 27.06.2022\r\n * send page view to the gtm\r\n * @param {any} PageViewObject\r\n */\r\nexport const sendGaPageView = (PageViewObject:any) => {\r\n\r\n if(!window.dataLayer || !PageViewObject) return;\r\n\r\n window.dataLayer.push({\r\n event: 'pageview',\r\n page: {\r\n path: PageViewObject.pageLocation,\r\n title: PageViewObject.title\r\n }\r\n });\r\n};\r\n\r\n"],"names":["obj","key","value","Object","defineProperty","enumerable","configurable","writable","ABTestTypeEnum","CLIENT_SIDE_LOCAL_STORAGE_NAME","handlePartialMasterVariants","test","variations","sum","offItems","i","length","variant","name","startsWith","percent","push","proportion","offItem","Math","round","compareTestsVariants","test1","test2","test1Variations","test2Variations","values1","map","item","sort","a","b","values2","join","chooseVariation","notRandomNumbers","variation","j","idx","floor","random","selected","parseVariations","testVariations","list","split","variationItemList","trim","Number","initClientSideTests","newClientSideTests","isServer","$data","document","getElementById","result","data","JSON","parse","textContent","ex","dataItem","copy","codeName","isActive","toLowerCase","masterSlotID","slot","testType","started","undefined","Client","getTestsFromHTML","savedClientSideTests","savedClientSideTestsStr","storageName","window","localStorage","getItem","decodeURIComponent","getLocalStorageItem","clientSideTests","savedTests","newTests","Array","isArray","updatedTests","savedTest","newTest","findOldTestsThatAppearInNewTests","ifAppear","findNewTestsThankDontAppearInOldTests","masterSlotIDs","regular","masterData","chooseVariations","mergeTests","escapedValue","encodeURIComponent","stringify","setItem","setLocalStorageItem","initABTestSystem","serverSideTests","urlTests","location","search","indexOf","abtestString","caseSensitive","toString","hashes","substring","sections","val","s","getQueryString","tests","testsArr","testData","getClientSideTestsFromURL","serverSideTestsStr","cookies","cookie","index","substr","getCookie","initServerSideTests","CartSteps","ProductDepartmentEnum","LastPaymentOption","PaymentTabsEnum","CreditCardServiceEnum","CreditCardTabTabsEnum","addEventListener","event","ABShow","abtest_SBSBannerHP","testName","abtests","urlTest","find","clientSideTest","serverSideTest","getABTest","visitorFindMethod","eventValue","abtestSelected","abEmptySection","abTopSection","abBigSection","abStripSection","classList","add","remove","dataLayer","pathname","_test","found","filter","master","sendABTestAnalytics"],"sourceRoot":""}