{"version":3,"file":"TrackMotionSolution.chunk-90619.js","mappings":"4MASMA,EAAYC,OAAOC,OAAO,CAC/BC,KAAM,oBAGDC,EAAiBH,OAAOC,OAAO,CACpCG,SAAU,uBAsBX,SAASC,EAAgBC,GAGxB,IAAMC,EAAW,CAChBC,SAAU,WACVC,MAAOH,EAAEI,OAAOC,KAEhBC,aAAc,iBACdC,cAAeP,EAAEI,OAAOC,MAGnBP,EAAwBE,EAAEI,OAkBPI,aAAaX,EAAeC,UAhBjDA,IACHG,EAASQ,OAASX,EAClBG,EAASS,eAAiBZ,GAG3Ba,EAAAA,EAAYV,EACb,CAeA,IAAMW,EAAQ,CACbC,KAnDD,YAQCC,EAAAA,EAAAA,IAAOrB,EAAUG,KAAM,QAASG,EANjC,E,uBCwCA,SAASgB,EAAaC,GAGrB,OAFoBA,EAAIC,cAAcC,QAAQ,OAAQ,IAGvD,CAOA,SAASC,EAAWC,GAEnB,IApDwBC,EAmExB,GAbID,SAAAA,EAAcd,eACjBc,EAAad,aAAeS,EAAaK,EAAad,eAGnDc,SAAAA,EAAcV,iBAEjBU,EAAaV,eAAiBK,EAAaK,EAAaV,iBAGrDU,SAAAA,EAAcb,gBACjBa,EAAab,cAAgBQ,EAAaK,EAAab,oBAhEhCc,EAmEJD,KA9DdC,EAAInB,UAAoC,iBAAjBmB,EAAInB,WAI3BmB,EAAIZ,QAAgC,iBAAfY,EAAIZ,SAIzBY,EAAIlB,OAA8B,iBAAdkB,EAAIlB,OAI1BkB,EAAIf,cAA4C,iBAArBe,EAAIf,cAI/Be,EAAIX,gBAAgD,iBAAvBW,EAAIX,gBAIjCW,EAAId,eAA8C,iBAAtBc,EAAId,eA0CD,CAClC,IAAMN,EAAW,CAChBqB,MAjBY,cAkBZF,aAAAA,GAGDG,OAAOC,UAAUC,KAAKxB,EACvB,CACD,C,gDA9FAsB,OAAOC,UAAYD,OAAOC,WAAa,E","sources":["webpack://motion-entertainment/./wwwroot/Content/scripts/src/app/ui/track/motion-solution.js","webpack://motion-entertainment/./wwwroot/Content/scripts/src/util/track.js"],"sourcesContent":["/* app/ui/track/motion-solution */\n\nimport { listen } from 'Util/core';\nimport * as track from 'Util/track';\n\n/**\n * @typedef {import('../../../util/track.js').EventDetails} EventDetails\n */\n\nconst selectors = Object.freeze({\n\tbook: '.js-track__book'\n});\n\nconst dataAttributes = Object.freeze({\n\tlocation: 'data-book-location',\n});\n\n/**\n * Initialise the CED Solution tracking module.\n */\nfunction init() {\n\t_initEvents();\n}\n\n/**\n * Bind event listeners for the CED Solution tracking module.\n */\nfunction _initEvents() {\n\tlisten(selectors.book, 'click', _bookClickEvent);\n}\n\n/**\n * Callback for the solution click event\n *\n * @param {MouseEvent} e\n */\nfunction _bookClickEvent(e) {\n\t/** @type {EventDetails} */\n\tdebugger;\n\tconst eventObj = {\n\t\tcategory: 'Book Now',\n\t\tlabel: e.target.href,\n\n\t\tga4EventName: 'book_now_click',\n\t\tga4EventLabel: e.target.href\n\t};\n\n\tconst location = _getLocation(e.target);\n\n\tif (location) {\n\t\teventObj.action = location;\n\t\teventObj.ga4EventAction = location;\n\t}\n\tdebugger;\n\ttrack.event(eventObj);\n}\n\n/**\n * Get the name of a solution based on the event target of a click event.\n *\n * @param {HTMLElement} $target\n *\n * @return {string | null} The name of the current solution\n */\nfunction _getLocation($target) {\n\tconst location = $target.getAttribute(dataAttributes.location);\n\n\treturn location;\n}\n\nconst Track = {\n\tinit\n};\n\nexport { Track };\n","/* util/track */\n\n// Intended for easily tracking events using Google Tag Manager's dataLayer\n\nwindow.dataLayer = window.dataLayer || [];\n\n/**\n * @typedef {object} EventDetails\n * @property {string} category - For GA Universal.\n * @property {string} action - For GA Universal.\n * @property {string} label - For GA Universal.\n * @property {string} [ga4EventName] - For GA4. Should be in snake_case.\n * @property {string} [ga4EventAction] - For GA4. Should be in snake_case.\n * @property {string} [ga4EventLabel] - For GA4. Should be in snake_case.\n */\n\n/**\n * Checks if a given value is an EventDetails.\n *\n * @param {any} val - The value to check\n *\n * @return {boolean} - If the tested value is an EventDetails.\n */\nfunction _isEventDetails(val) {\n\tif (!val) {\n\t\treturn false;\n\t}\n\n\tif (!(val.category && typeof val.category === 'string')) {\n\t\treturn false;\n\t}\n\n\tif (!(val.action && typeof val.action === 'string')) {\n\t\treturn false;\n\t}\n\n\tif (!(val.label && typeof val.label === 'string')) {\n\t\treturn false;\n\t}\n\n\tif (val.ga4EventName && typeof val.ga4EventName !== 'string') {\n\t\treturn false;\n\t}\n\n\tif (val.ga4EventAction && typeof val.ga4EventAction !== 'string') {\n\t\treturn false;\n\t}\n\n\tif (val.ga4EventLabel && typeof val.ga4EventLabel !== 'string') {\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\n/**\n * Convert a string to snake_case.\n *\n * @param {string} str - The string to convert.\n *\n * @return {string} - The same string, in snake_case.\n */\nfunction _toSnakeCase(str) {\n\tconst snakeString = str.toLowerCase().replace(/\\s+/g, '_');\n\n\treturn snakeString;\n}\n\n/**\n * Track a GA event.\n *\n * @param {EventDetails} eventDetails - The details of the event to track\n */\nfunction trackEvent(eventDetails) {\n\t// Use the same name for each event to minimise setup in GTM\n\tconst event = 'customEvent';\n\n\tif (eventDetails?.ga4EventName) {\n\t\teventDetails.ga4EventName = _toSnakeCase(eventDetails.ga4EventName);\n\t}\n\n\tif (eventDetails?.ga4EventAction) {\n\t\tdebugger;\n\t\teventDetails.ga4EventAction = _toSnakeCase(eventDetails.ga4EventAction);\n\t}\n\n\tif (eventDetails?.ga4EventLabel) {\n\t\teventDetails.ga4EventLabel = _toSnakeCase(eventDetails.ga4EventLabel);\n\t}\n\n\tif (_isEventDetails(eventDetails)) {\n\t\tconst eventObj = {\n\t\t\tevent,\n\t\t\teventDetails,\n\t\t};\n\n\t\twindow.dataLayer.push(eventObj);\n\t}\n}\n\nexport {\n\ttrackEvent as event,\n};\n"],"names":["selectors","Object","freeze","book","dataAttributes","location","_bookClickEvent","e","eventObj","category","label","target","href","ga4EventName","ga4EventLabel","getAttribute","action","ga4EventAction","track","Track","init","listen","_toSnakeCase","str","toLowerCase","replace","trackEvent","eventDetails","val","event","window","dataLayer","push"],"sourceRoot":""}