{"version":3,"file":"default/js/cbt.js","mappings":";;;;;;;;;;AAAa;;AAEb;AACA,UAAU;AACV,SAAS;AACT,SAAS;AACT,WAAW;AACX,UAAU;AACV;;AAEA,oDAAoD;AACpD;;AAEA;AACA;AACA,WAAW,QAAQ;AACnB,aAAa,QAAQ;AACrB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;;;;;;UC3BA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;;;;;;ACtBA;AACA;AACA;;AAEa;;AAEb,eAAe,mBAAO,CAAC,4FAAkB;AACzC;;AAEA;AACA;AACA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB,iBAAiB,QAAQ;AACzB;;AAEA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA,qEAAqE;AACrE,0FAA0F;AAC1F;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,eAAe,QAAQ;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA,SAAS;;AAET;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,UAAU;AACV;AACA;AACA;;AAEA;AACA;AACA,cAAc,aAAa;AAC3B,cAAc,SAAS;AACvB;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,aAAa;AAC/B,oBAAoB,OAAO;AAC3B;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,uBAAuB;AACnD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sFAAsF;AACtF,sBAAsB;AACtB;AACA;AACA;AACA;AACA;AACA,yCAAyC;AACzC;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,iBAAiB;;AAEjB;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;;AAEzB;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B;AACA;AACA;AACA,6BAA6B;AAC7B,yBAAyB;AACzB;AACA,iBAAiB;AACjB,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;;AAEA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,kBAAkB,UAAU;AAC5B,kBAAkB,QAAQ;AAC1B;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,UAAU;AAC5B,kBAAkB,QAAQ;AAC1B;AACA;AACA,4BAA4B,mBAAmB;AAC/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wBAAwB,uBAAuB;AAC/C;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oCAAoC,yBAAyB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gDAAgD,2BAA2B;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA,yBAAyB;AACzB;AACA;;AAEA;AACA;AACA,wBAAwB,0BAA0B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,6BAA6B;AAC7B,0BAA0B;AAC1B;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oDAAoD,gCAAgC;AACpF;AACA;AACA,0CAA0C;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wFAAwF;AACxF;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,CAAC","sources":["webpack://sfra-startup-kit/./cartridges/int_cbt/cartridge/client/default/js/utils/unescape.js","webpack://sfra-startup-kit/webpack/bootstrap","webpack://sfra-startup-kit/./cartridges/int_cbt/cartridge/client/default/js/cbt.js"],"sourcesContent":["\"use strict\";\n\nconst htmlUnescapes = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \""\": \"\\\"\",\n \"'\": \"'\"\n};\n\nconst reEscapedHtml = /&(?:amp|lt|gt|quot|#(0+)?39);/g;\nconst reHasEscapedHtml = RegExp(reEscapedHtml.source);\n\n/**\n * Unescapes a given string by replacing HTML entities with their corresponding characters\n * @param {string} string - the string to unescape\n * @returns {string} the unescaped string\n */\nfunction unescape(string) {\n return string && reHasEscapedHtml.test(string)\n ? string.replace(\n reEscapedHtml,\n (entity) => htmlUnescapes[entity] || \"'\"\n )\n : string || \"\";\n}\n\nmodule.exports = unescape;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","/**\n * Property of OSF GLOBAL SERVICES INC. , an OSF Digital company. OSF remains the sole owner of all right, title and interest in the software. Do not copy, sell, reverse engineer or otherwise attempt to derive or obtain information about the functioning, manufacture or operation therein.\n */\n\n\"use strict\";\n\nvar unescape = require(\"./utils/unescape\");\nlet liveClick = [];\n\nvar impressionCounter = 0;\nclass CBTController {\n /**\n * function to push data to the dataLayer, and add hash\n * @param {Object} data - data to push\n */\n static hashPush(data) {\n var dataReassigned = data;\n if (dataReassigned) {\n if (dataReassigned.options !== \"Quantity\" || dataReassigned.options !== \"Options\") {\n delete dataReassigned.options;\n }\n if (dataReassigned.eventTypes) {\n delete dataReassigned.eventTypes;\n }\n if (dataReassigned.selector) {\n delete dataReassigned.selector;\n }\n // eslint-disable-next-line no-restricted-globals\n if ((location.hash.indexOf(dataReassigned.event + \"cbt\") === -1)) {\n dataLayer.push(dataReassigned);\n }\n }\n }\n\n /**\n * Parse the data object into json\n * @param {string} data\n * @returns {Object} jsonObject\n */\n\n static parseJSON(data) {\n var dataReassigned = data;\n let parsedJson = {};\n try {\n parsedJson = JSON.parse(dataReassigned);\n } catch (error) {\n // Handle cases of missing closing quote\n if (dataReassigned.length > dataReassigned.lastIndexOf(\"}\")) {\n dataReassigned = dataReassigned.substring(0, dataReassigned.lastIndexOf(\"}\") + 1);\n }\n // eslint-disable-next-line quotes\n parsedJson = JSON.parse(dataReassigned.replace(/'/gi, '\"').replace(/\\\\\"/, \"'\"));\n }\n return parsedJson;\n }\n\n /**\n * check data type and parse string into JSON\n * @param {Object} data - data to push\n */\n static dataPush(data) {\n var dataReassigned = data;\n if ((typeof (dataReassigned) === \"string\") && (dataReassigned !== \"\")) {\n if ((dataReassigned != null) || (dataReassigned !== \"null\")) {\n dataReassigned = CBTController.parseJSON(unescape(dataReassigned));\n CBTController.hashPush(dataReassigned);\n }\n } else {\n CBTController.hashPush(data);\n }\n }\n\n static tileViewObserverCallback(entries, observer) {\n var productItems = [];\n entries.forEach(entry => {\n if (entry.isIntersecting && window.impressionsContainer) {\n observer.unobserve(entry.target);\n var productID = entry.target.getAttribute(\"data-itemid\");\n window.impressionsContainer = window.impressionsContainer.filter((impression) => {\n var result = true;\n if (impression.item_id === productID || impression.item_variant.includes(productID)) {\n impression.item_variant = impression.item_id;\n productItems.push(impression);\n result = false;\n }\n return result;\n });\n }\n });\n\n let dataLayerObj = {\n event: \"view_item_list\",\n ecommerce: {}\n };\n dataLayerObj.ecommerce.items = productItems;\n\n if (dataLayerObj.ecommerce.items.length > 0) {\n CBTController.dataPush(dataLayerObj);\n } else {\n dataLayerObj = \"\";\n }\n }\n\n /**\n * Finds all data DOM elements and pushes them to the data layer\n * @param {HTMLElement} node - the node containing the data-cbt attribute\n * @param {boolean} initialLoad - whether this is the initial page load\n */\n static findAllDataDOM(node, initialLoad) {\n if (!window.impressionsContainer || initialLoad) {\n window.impressionsContainer = [];\n }\n var dataCollectionObj = {};\n window.yValuesarray = [];\n\n /**\n * Push data layer objects to the data layer\n * @param {HTMLElement} node - the node containing the data-cbt attribute\n * @returns {Array} impressionsContainer - an array of items\n */\n function dataPushDataLayerObj() {\n let allCBTData = node.querySelectorAll(\"[data-cbt]\");\n\n if (!allCBTData.length) {\n return window.impressionsContainer;\n }\n\n for (let i = 0; i < allCBTData.length; i += 1) {\n let tempNode = allCBTData[i];\n dataCollectionObj = CBTController.parseJSON(tempNode.getAttribute(\"data-cbt\"));\n\n if (dataCollectionObj && dataCollectionObj.event === \"view_item_list\") {\n dataCollectionObj.ecommerce.items.index = impressionCounter;\n impressionCounter += 1;\n }\n\n // Handle Search Bar input\n if (dataCollectionObj && dataCollectionObj.action === \"Search\" && dataCollectionObj.label) {\n CBTController.dataPush(dataCollectionObj);\n }\n if (!dataCollectionObj || !dataCollectionObj.eventTypes || !dataCollectionObj.event) {\n continue;\n }\n\n let eventTypes = dataCollectionObj.eventTypes.split(\",\");\n\n if (eventTypes.indexOf(\"show\") !== -1) {\n // Handle show events that appered as a result of a click in specific cases\n if (dataCollectionObj.eventTypes.indexOf(\"click\") !== -1) {\n dataCollectionObj.category = \"Click\";\n CBTController.dataPush(dataCollectionObj);\n continue;\n }\n if (dataCollectionObj.event === \"view_item_list\") {\n impressionsContainer.push(dataCollectionObj.ecommerce.items); // eslint-disable-line\n } else {\n CBTController.dataPush(dataCollectionObj);\n }\n tempNode.removeAttribute(\"data-cbt\");\n }\n }\n return impressionsContainer; // eslint-disable-line\n }\n\n window.impressionsContainer = dataPushDataLayerObj();\n\n if (window.impressionsContainer.length > 0) {\n var products = document.querySelectorAll(\".viewItemListTrigger\");\n\n const observer = new IntersectionObserver(CBTController.tileViewObserverCallback,\n {\n threshold: 1\n });\n\n var moreResultButton = document.querySelector(\".show-more\");\n\n if (!moreResultButton) {\n window.gridload = true;\n }\n\n if (initialLoad || window.gridload) {\n window.gridload = false;\n products.forEach(product => {\n observer.observe(product);\n });\n }\n\n window.totalGrid = products;\n\n $(\".container\").on(\"click\", \".show-more button\", function (e) {\n e.preventDefault();\n var loaded = false;\n $(document).ajaxComplete((event, xhr, settings) => {\n if (settings.url.includes(\"Search-UpdateGrid\") && !loaded) {\n loaded = true;\n var firstGrid = document.querySelectorAll(\".viewItemListTrigger\");\n var otherGrid = [];\n firstGrid.forEach((element, index) => {\n if (index >= window.totalGrid.length) {\n otherGrid.push(element);\n }\n });\n\n if (otherGrid.length > 12) {\n otherGrid = \"\";\n }\n\n window.totalGrid = [...window.totalGrid, ...otherGrid];\n products = [...otherGrid];\n\n // eslint-disable-next-line\n const observer = new IntersectionObserver(CBTController.tileViewObserverCallback,\n {\n threshold: 1\n });\n setTimeout(() => {\n products.forEach(product => {\n observer.observe(product);\n });\n }, 100);\n }\n });\n });\n }\n }\n\n /* Update Product Tile data-cbt attribute with actual index so it works with \"Show more\" feature */\n static updateTilesPosition(nodes) {\n var productCollection = [];\n var productCounter = -1;\n\n for (let i = 0; i < nodes.length; i += 1) {\n let tempNode = nodes[i];\n var dataCollectionObj = CBTController.parseJSON(tempNode.getAttribute(\"data-cbt\"));\n if (dataCollectionObj && dataCollectionObj.event === \"select_item\") {\n if (productCollection.indexOf(dataCollectionObj.ecommerce.items.item_id) === -1) {\n productCollection.push(dataCollectionObj.ecommerce.items.item_id);\n productCounter += 1;\n }\n dataCollectionObj.ecommerce.items.index = productCounter;\n tempNode.dataset.cbt = JSON.stringify(dataCollectionObj);\n }\n }\n }\n\n /**\n * if \"link\" option enable, set same \"data-cbt\" to all node childNodes,\n * to have the event in clickListenerRun\n */\n\n static handleLinks(node) {\n const allCBTData = node.querySelectorAll(\"[data-cbt]\");\n\n if (!allCBTData.length) {\n return false;\n }\n\n // Call updateTilesPosition to avoid querying document another time\n CBTController.updateTilesPosition(allCBTData);\n\n /**\n * Sets the data-cbt attribute of the given child nodes\n * @param {NodeList} childs - the child nodes to set the attribute on\n * @param {string} data - the data to set the attribute to\n */\n function setChildData(childs, data) {\n for (let i = 0; i < childs.length; i += 1) {\n if (childs[i].nodeType === 1) {\n if (childs[i].getAttribute(\"data-cbt\")) continue;\n childs[i].setAttribute(\"data-cbt\", data);\n if (childs[i].childNodes.length) {\n setChildData(childs[i].childNodes, data);\n }\n }\n }\n }\n\n /**\n * Sets the data-selected attribute of the child nodes of the given element\n * @param {NodeList} childs - the child nodes of the given element\n * @param {string} data - the data to be set\n */\n function setChildDataForRefinementSelectionState(childs, data) {\n for (let i = 0; i < childs.length; i += 1) {\n if (childs[i].nodeType === 1) {\n if (childs[i].getAttribute(\"data-selected\")) continue;\n childs[i].setAttribute(\"data-selected\", data);\n if (childs[i].childNodes.length) {\n setChildDataForRefinementSelectionState(childs[i].childNodes, data);\n }\n }\n }\n }\n\n for (let i = 0; i < allCBTData.length; i += 1) {\n let tempNode = allCBTData[i];\n const dataStr = tempNode.getAttribute(\"data-cbt\");\n const refinementSelectionStateDataStr = tempNode.getAttribute(\"data-selected\");\n const dataObj = CBTController.parseJSON(dataStr);\n\n if (!dataObj) continue;\n\n if (typeof dataObj.eventTypes !== \"undefined\" && dataObj.eventTypes.indexOf(\"link\") !== -1) {\n if (tempNode.childNodes.length) {\n setChildData(tempNode.childNodes, dataStr);\n if (refinementSelectionStateDataStr) {\n setChildDataForRefinementSelectionState(tempNode.childNodes, refinementSelectionStateDataStr);\n }\n }\n }\n\n if (typeof dataObj.eventTypes !== \"undefined\" && dataObj.eventTypes.indexOf(\"add\") !== -1) {\n let dynamicNodes = document.querySelectorAll(dataObj.selector);\n if (dynamicNodes.length) {\n for (let j = 0; j < dynamicNodes.length; j += 1) {\n let tempDynamicNode = dynamicNodes[j];\n // eslint-disable-next-line\n let dataObj = CBTController.parseJSON(dataStr);\n let eventTypes = dataObj.eventTypes.split(\",\");\n eventTypes.splice(eventTypes.indexOf(\"add\"), 1);\n dataObj.eventTypes = eventTypes.join(\",\");\n tempDynamicNode.setAttribute(\"data-cbt\", JSON.stringify(dataObj));\n }\n tempNode.removeAttribute(\"data-cbt\");\n }\n }\n }\n }\n\n /**\n * run AJAX listener, to find all (cbt_data in JSON) or (data-cbt in HTML) sent via XMLHttpRequest\n */\n static AJAXListenerRun() {\n var listenerSend = XMLHttpRequest.prototype.send;\n XMLHttpRequest.prototype.send = function () {\n var callback = this.onreadystatechange;\n this.onreadystatechange = function () {\n if (this.readyState === 4 && this.status === 200) {\n if (this.getAllResponseHeaders().indexOf(\"application/json\") !== -1) {\n var myArr = CBTController.parseJSON(this.responseText);\n if (myArr.cbt_data || myArr.cbt_data_productSet) {\n if (myArr.cbt_data instanceof Array) {\n for (var i = 0; i < myArr.cbt_data.length; i += 1) {\n var result = myArr.cbt_data[i];\n CBTController.dataPush(result);\n }\n }\n CBTController.dataPush(myArr.cbt_data);\n CBTController.dataPush(myArr.cbt_data_productSet);\n }\n }\n\n if (this.getAllResponseHeaders().indexOf(\"text/html\") !== -1) {\n var container = document.implementation.createHTMLDocument(\"\").documentElement;\n container.innerHTML = this.responseText;\n var timeout = null;\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(function () {\n CBTController.findAllDataDOM(container);\n }, 1);\n }\n }\n if (callback) {\n callback.apply(this, arguments);\n }\n };\n listenerSend.apply(this, arguments);\n };\n }\n\n // run DOM updates listener, to find all cbt-data added to DOM\n static DOMListenerRun() {\n var timeout = null;\n let observer = new MutationObserver(function () {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(function () {\n CBTController.handleLinks(document);\n }, 1000);\n });\n const targetNode = document.body;\n const config = { childList: true, subtree: true };\n observer.observe(targetNode, config);\n }\n\n static clickListenerRun() {\n let allContainers = document.querySelectorAll(\"body,.container\");\n for (let i = 0; i < allContainers.length; i += 1) {\n let tempNode = allContainers[i];\n tempNode.addEventListener(\"click\", function (event) {\n if (event && event.target && event.target.getAttribute(\"data-cbt\")) {\n let node = event.target;\n let data = CBTController.parseJSON(node.getAttribute(\"data-cbt\"));\n if (data && data.eventTypes && data.eventTypes.indexOf(\"click\") !== -1) {\n if (data.event !== \"select_item\") {\n if (!data.action) {\n data.action = \"click\";\n }\n data.category = \"Click\";\n }\n\n if (data.event === \"share\" || data.event === \"menu_click\" || data.event === \"product_filter_plp\") {\n delete data.label;\n delete data.action;\n delete data.category;\n delete data.action;\n }\n\n if (data.event === \"form_submit\" || data.event === \"login\" || data.event === \"account_activity\") {\n delete data.category;\n delete data.action;\n }\n\n if (data.event === \"product_filter_plp\") {\n window.gridload = true;\n window.impressionsContainer = [];\n }\n\n if (data.event === \"product_filter_plp\" && node.getAttribute(\"data-selected\") === \"true\") {\n return;\n }\n\n if (data.event === \"product_filter_pdp\" || data.event === \"product_filter_qv\") {\n if (node.classList.contains(\"selected\")) return;\n delete data.label;\n delete data.action;\n delete data.category;\n }\n\n if (liveClick.indexOf(data.event) === -1) {\n liveClick.push(data.event);\n setTimeout(function () {\n liveClick.splice(liveClick.indexOf(data.event), 1);\n }, 10);\n } else {\n return;\n }\n CBTController.dataPush(data);\n }\n }\n });\n }\n }\n\n static changeListenerRun() {\n document.addEventListener(\"change\", function (event) {\n if (event && event.target && event.target.getAttribute(\"data-cbt\")) {\n let node = event.target;\n let data = CBTController.parseJSON(node.getAttribute(\"data-cbt\"));\n if (data && data.eventTypes && data.eventTypes.indexOf(\"change\") !== -1) {\n if (node.options) {\n data.label = node.options[node.options.selectedIndex].text;\n if (data.event === \"product_filter_plp\") {\n window.gridload = true;\n var ifSorting = data.filter_type === \"Sort\" ? true : data.filter_type === \"Sorting\";\n if (ifSorting) {\n if (node.options[node.options.selectedIndex].dataset.id) {\n var sortingRuleOnChange = (node.options[node.options.selectedIndex].dataset.id).split(\"-\");\n data.filter_value = \"\";\n for (var i = 0; i < sortingRuleOnChange.length; i += 1) {\n if (sortingRuleOnChange.length - i === 0) {\n data.filter_value += sortingRuleOnChange[i];\n } else {\n data.filter_value += sortingRuleOnChange[i] + \" \";\n }\n }\n }\n }\n }\n }\n if (typeof node.attributes.type !== \"undefined\" && node.attributes.type.nodeValue === \"checkbox\") {\n if (!data.label) {\n data.label = node.checked ? \"checked\" : \"unchecked\";\n }\n }\n if (!data.label) {\n data.label = node.value;\n }\n if (!data.action) {\n data.action = \"change\";\n }\n data.category = \"Click\";\n\n if (data.event === \"share\" || data.event === \"menu_click\" || data.event === \"product_filter_plp\") {\n delete data.label;\n delete data.action;\n delete data.category;\n }\n\n if (data.event === \"product_filter_pdp\" || data.event === \"product_filter_qv\") {\n data.filter_value = data.label;\n delete data.label;\n delete data.action;\n delete data.category;\n }\n }\n CBTController.dataPush(data);\n }\n });\n }\n\n static SFRAClick() {\n var cbtData = document.getElementById(\"cbt-sfra-links\").value;\n document.querySelector(\".menu-footer.locate-store\").dataset.cbt = cbtData;\n\n var cbtAccountMenus = document.querySelectorAll(\"#collapsible-account li > a\");\n cbtAccountMenus.forEach(function (item) {\n var tempCbt = JSON.parse(cbtData);\n tempCbt.menu_item_name = item.textContent;\n tempCbt.menu_item_section = \"Account\";\n item.dataset.cbt = JSON.stringify(tempCbt);\n });\n var cbtCustomerServiceMenus = document.querySelectorAll(\"#collapsible-customer-service li > a\");\n cbtCustomerServiceMenus.forEach(function (item) {\n var tempCbt = JSON.parse(cbtData);\n tempCbt.menu_item_name = item.textContent;\n tempCbt.menu_item_section = \"Customer Service\";\n item.dataset.cbt = JSON.stringify(tempCbt);\n });\n var cbtAboutMenus = document.querySelectorAll(\"#collapsible-about li > a\");\n cbtAboutMenus.forEach(function (item) {\n var tempCbt = JSON.parse(cbtData);\n tempCbt.menu_item_name = item.textContent;\n tempCbt.menu_item_section = \"About\";\n item.dataset.cbt = JSON.stringify(tempCbt);\n });\n }\n\n static SFRABaseFixes() {\n var eventCleaner = setInterval(() => {\n $(\".container\").off(\"change\", \"[name=sort-order]\");\n var foundSelect = false;\n var foundSelectColor = false;\n $._data(document).events.change.forEach((event) => {\n if (event.selector === 'select[class*=\\\"select-\\\"], .options-select') { // eslint-disable-line\n if (foundSelect) {\n event.handler = () => {};\n } else {\n foundSelect = true;\n }\n }\n });\n $._data(document).events.click.forEach((event) => {\n if (event.selector === \"[data-attr=\\\"color\\\"] button\") {\n if (foundSelectColor) {\n event.handler = () => {};\n } else {\n foundSelectColor = true;\n }\n }\n });\n }, 1000);\n setTimeout(() => {\n clearInterval(eventCleaner);\n }, 10000);\n /* eslint-disable */\n $(document).on('change', '[name=sort-order]', (function (t) {\n t.preventDefault(),\n $.spinner().start();\n var selectedUrl = this.value;\n var url = new URL(selectedUrl);\n var queryParamValue = url.searchParams.get('srule');\n // Remove the srule parameter from the base URL\n var baseUrl = new URL(this.baseURI);\n baseUrl.searchParams.delete('srule');\n // Construct the new URL with the updated srule parameter\n baseUrl.searchParams.set('srule', queryParamValue);\n // Update the URL without reloading the page\n history.pushState(null, null, baseUrl.toString());\n $(this).trigger('search:sort', this.value),\n $.ajax({\n url: this.value,\n data: {\n selectedUrl: this.value\n },\n method: 'GET',\n success: function (t) {\n $('.product-grid').empty().html(t),\n $.spinner().stop();\n },\n error: function () {\n $.spinner().stop();\n }\n });\n }\n ));\n /* eslint-enable */\n }\n}\n\n/**\n * initial cbt-data search and dataLayer push on page\n * AJAX listener run\n */\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n if (document.getElementById(\"cbt-sfra-links\")) {\n CBTController.SFRAClick();\n }\n CBTController.findAllDataDOM(document, true);\n CBTController.AJAXListenerRun();\n CBTController.DOMListenerRun();\n CBTController.SFRABaseFixes();\n\n if (cbtSitePreferences.CBT_CLICK) {\n CBTController.clickListenerRun();\n CBTController.changeListenerRun();\n }\n});\n"],"names":[],"sourceRoot":""}