{"version":3,"file":"header-footer/full/js/main.js","mappings":"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","sources":["webpack://front-end-platform-web-assets/webpack/bootstrap","webpack://front-end-platform-web-assets/webpack/runtime/define property getters","webpack://front-end-platform-web-assets/webpack/runtime/hasOwnProperty shorthand","webpack://front-end-platform-web-assets/webpack/runtime/make namespace object","webpack://front-end-platform-web-assets/./node_modules/tslib/tslib.es6.js","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/constants.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/types/store.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeHours/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeHours/storeStatus.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/constants/OmniStores.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/constants/index.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/utils/environment.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/storage/cookie.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/content.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/utils/search.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/alertBanner/types.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/alertBanner/constants.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/alertBanner/storage.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/alertBanner/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/alertBanner/alertBanner.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/events/events.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/events/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/events/eventTargets.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/navigation/CareersLink.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/myKmx/savedCarsButton.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/events/eventHandlerList.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/api/api.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/search/searchApi.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/search/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/autocompleteMenuHandler.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/Menu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/AutocompleteListMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/search/SearchSuggestionsMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/targetTests/activeTests.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/nearestStore/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/nearestStore/storesApi.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeChooser/storeChooserSearch.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/utils/analytics.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/search/InventorySearch.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/listMenuKeyboardHandler.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/ListMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/DelayedListMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/myKmx/myProfileMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/navigation/moreLinksMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/storage/storage.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/dialogMenuKeyboardHandler.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/DialogMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/menu/DelayedDialogMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/nearestStore/NearestStoreMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/nearestStore/NearestStore.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/constants/seo.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/utils/seo.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeHours/storeHourMenu.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeChooser/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/wc-header.ts","webpack://front-end-platform-web-assets/./generated_files/headerMarkup.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/wc-footer.ts","webpack://front-end-platform-web-assets/./generated_files/footerMarkup.ts","webpack://front-end-platform-web-assets/./node_modules/zustand/esm/vanilla.mjs","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/store/index.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/constants.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/icons.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/data.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/utils.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/kmx-thumb-nav-menu/kmx-thumb-nav-menu-item.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/kmx-thumb-nav-menu/kmx-back-drop.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/myKmx/profileApi.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/myKmx/reservationApi.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/kmx-thumb-nav-menu/index.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/myKmx/images.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/types.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/kmx-thumb-bar/kmx-thumb-bar-item.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/kmx-thumb-bar/index.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/webcomponents/exposed-nav/kmx-thumb-nav.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/configStore/index.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/index.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/app/app.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/navigation/footerCopyright.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeChooser/storeChooser.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/components/storeChooser/storeChooserHeader.ts","webpack://front-end-platform-web-assets/./src/CarMax.Online.WebAssets/ts/targetTests/searchBarTest.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n","export const MENU_CLASSES = {\r\n aSubMenuIsOpen: 'a-sub-menu-is-open',\r\n buttonFocus: 'focus',\r\n menuOpen: 'header-footer-menu--open',\r\n menuItemFocus: 'focus',\r\n tabbableMenuItems: 'header-footer-menu-list-item',\r\n backButton: 'header-submenu-back-button',\r\n};\r\n\r\nexport const MENU_DATA_ATTR = {\r\n dialog: 'data-dialog',\r\n focusStart: 'focus-start',\r\n focusEnd: 'focus-end',\r\n};\r\n\r\nexport const NORMALIZED_KEYS = {\r\n ArrowDown: 'ArrowDown',\r\n ArrowUp: 'ArrowUp',\r\n Escape: 'Escape',\r\n Tab: 'Tab',\r\n Home: 'Home',\r\n End: 'End',\r\n Enter: 'Enter',\r\n Space: 'Space',\r\n};\r\n\r\nexport const MOBILE_SIZE = 767;\r\n\r\nexport const normalizeKey = (key: string) => {\r\n switch (key) {\r\n case 'ArrowDown':\r\n case 'Arrow':\r\n return NORMALIZED_KEYS.ArrowDown;\r\n break;\r\n case 'ArrowUp':\r\n case 'Arrow':\r\n return NORMALIZED_KEYS.ArrowUp;\r\n break;\r\n case 'Escape':\r\n case 'Esc':\r\n return NORMALIZED_KEYS.Escape;\r\n break;\r\n case 'Tab':\r\n return NORMALIZED_KEYS.Tab;\r\n break;\r\n case 'Home':\r\n return NORMALIZED_KEYS.Home;\r\n break;\r\n case 'End':\r\n return NORMALIZED_KEYS.End;\r\n break;\r\n case 'Enter':\r\n return NORMALIZED_KEYS.Enter;\r\n break;\r\n case ' ':\r\n return NORMALIZED_KEYS.Space;\r\n break;\r\n default:\r\n return '';\r\n break;\r\n }\r\n};\r\n","interface IStore extends IStoreLegacyFields {\r\n Id: string;\r\n Name: string;\r\n PhoneNumbers: PhoneNumber[];\r\n Hours: TimeRange[];\r\n PhoneHours: TimeRange[];\r\n ServiceHours: TimeRange[];\r\n Latitude: number;\r\n Longitude: number;\r\n AddressLine1: string;\r\n AddressLine2: string;\r\n City: string;\r\n MailingCity: string;\r\n StateAbbreviation: string;\r\n ZipCode: string;\r\n HolidayHours: IHolidayHours[];\r\n ActiveStatus: string;\r\n AlertMessage: string;\r\n Capabilities: string[];\r\n IsSaveable: boolean;\r\n IsCarBuyingCenter: boolean;\r\n DistanceInMiles: number;\r\n}\r\n\r\n\r\ninterface ICamelCaseStore extends ICamelCaseStoreLegacyFields {\r\n id: string;\r\n name: string;\r\n phoneNumbers: PhoneNumber[];\r\n hours: TimeRange[];\r\n phoneHours: TimeRange[];\r\n serviceHours: TimeRange[];\r\n latitude: number;\r\n longitude: number;\r\n addressLine1: string;\r\n addressLine2: string;\r\n city: string;\r\n mailingCity: string;\r\n stateAbbreviation: string;\r\n zipCode: string;\r\n holidayHours: DateTimeRange[];\r\n activeStatus: string;\r\n alertMessage: string;\r\n capabilities: string[];\r\n distanceInMiles: number;\r\n}\r\n\r\ninterface IStoreLegacyFields {\r\n Categories: [];\r\n DisplayName: '';\r\n GeneralTelephoneNumbers: [];\r\n IsTemporarilyClosed: false;\r\n Links: [];\r\n LocationDisplay: '';\r\n SalesTelephoneNumbers: [];\r\n ShowroomHours: [];\r\n State: '';\r\n Status: '';\r\n StatusAlert: '';\r\n Subtitle: '';\r\n TelephoneHours: [];\r\n TelephoneNumber: '';\r\n TelephoneNumbers: [];\r\n TollFreePhoneNumber: '';\r\n}\r\n\r\ninterface ICamelCaseStoreLegacyFields {\r\n categories: [];\r\n displayName: '';\r\n generalTelephoneNumbers: [];\r\n isTemporarilyClosed: false;\r\n isSaveable: true,\r\n isCarBuyingCenter: false,\r\n links: [];\r\n locationDisplay: '';\r\n salesTelephoneNumbers: [];\r\n showroomHours: [];\r\n state: '';\r\n status: '';\r\n statusAlert: '';\r\n subtitle: '';\r\n telephoneHours: [];\r\n telephoneNumber: '';\r\n telephoneNumbers: [];\r\n tollFreePhoneNumber: '';\r\n}\r\n\r\ninterface IPhoneNumber {\r\n type: string;\r\n number: string;\r\n formatted: string;\r\n}\r\n\r\n// There's already a StoreStatus used in the same area, and the proper WebStore endpoint is \"StoreAvailability\"\r\ninterface IStoreAvailability {\r\n Id: string;\r\n IsOpen: boolean;\r\n Holiday: DateTimeRange[];\r\n CurrentHours: TimeRange[];\r\n Alert: IStoreAlert;\r\n}\r\n\r\ninterface IStoreAlert {\r\n storeId: string;\r\n message: string;\r\n status: string;\r\n}\r\n\r\nexport const STORE_CLOSED_STATUSES = ['Temporary Closure', 'Weather Closing', 'Power Outage', 'Closed', 'LP Investigative Shutdown'];\r\n\r\nexport function getStoreStatusDisplay(message: string) {\r\n switch (message) {\r\n case 'Temporary Closure':\r\n return 'Temporarily closed';\r\n case 'Weather Closing':\r\n return 'Closed due to severe weather';\r\n case 'Power Outage':\r\n return 'Closed due to power outage';\r\n case 'Delayed Opening':\r\n return 'Delayed opening';\r\n case 'Open (on Alert)':\r\n return 'Open (on Alert)'\r\n case 'Service/repair only':\r\n return 'Service/repair only'\r\n case 'By Appointment Only':\r\n return 'Appointment Only';\r\n case 'Closed':\r\n default:\r\n return 'Temporarily closed';\r\n }\r\n}\r\n\r\nexport const isClosed = (message: string | null | undefined) => message && (STORE_CLOSED_STATUSES.includes(message) || message.indexOf('closed') > 0)\r\n\r\nexport function getDayOfWeekShort(dayIndex: number) {\r\n return ['Sun', 'Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat'][dayIndex] || '';\r\n}\r\n\r\nexport function getPrimaryPhoneNumber(store: Store) {\r\n const localPhoneNumbers = store.PhoneNumbers.filter(number => number.type == 'PhoneLocal');\r\n const phoneNumber = localPhoneNumbers.length > 0 ? localPhoneNumbers[0].formatted : '';\r\n return phoneNumber;\r\n}\r\n\r\ninterface ITimeRange {\r\n startDayOfWeek: number;\r\n endDayOfWeek: number;\r\n startHour: { days: number; hours: number; minutes: number } | string;\r\n endHour: { days: number; hours: number; minutes: number } | string;\r\n}\r\n\r\ninterface IDateTimeRange extends TimeRange {\r\n date: Date;\r\n}\r\n\r\nexport interface IHolidayHours {\r\n date: string,\r\n startTime: string | null,\r\n endTime: string | null\r\n}\r\n\r\nexport type StoreAvailability = IStoreAvailability;\r\nexport type Store = IStore;\r\nexport type CamelCaseStore = ICamelCaseStore;\r\nexport type PhoneNumber = IPhoneNumber;\r\nexport type TimeRange = ITimeRange;\r\nexport type DateTimeRange = IDateTimeRange;\r\n","export function getStartEndTime(time: { days: number; hours: number; minutes: number } | string ) {\r\n if(typeof time == \"string\") {\r\n const splitTime = time.split(\":\");\r\n return {\r\n days: undefined,\r\n hours: parseInt(splitTime[0]),\r\n minutes: parseInt(splitTime[1])\r\n };\r\n } \r\n return time;\r\n}","import { getDayOfWeekShort, IHolidayHours, Store } from '../../types/store';\r\nimport { getStartEndTime } from './utils';\r\n\r\nexport default class StoreStatus {\r\n public storeStatus: string;\r\n public hoursText: string;\r\n public statusText: string;\r\n public storeMenu: string;\r\n private store: Store;\r\n public currentTime: string;\r\n\r\n constructor(store: Store) {\r\n this.storeStatus = '';\r\n this.hoursText = '';\r\n this.statusText = '';\r\n this.storeMenu = '';\r\n this.store = store;\r\n this.currentTime = 'null';\r\n\r\n this.setStoreStatus();\r\n this.buildStoreMenu();\r\n }\r\n\r\n private parseStoreHours = (hours: number, minutes: number) => {\r\n var minuteString = '';\r\n\r\n if (minutes > 10) {\r\n minuteString += minutes;\r\n } else {\r\n minuteString += '0' + minutes;\r\n }\r\n\r\n return `${+(hours > 12 ? hours - 12 : hours)}${minuteString !== '00' ? `:${+minutes}` : ' '} ${\r\n hours >= 12 ? 'PM' : 'AM'\r\n }`;\r\n };\r\n\r\n private setStoreStatus() {\r\n const { Hours, HolidayHours } = this.store;\r\n const today = new Date();\r\n const dayOfWeek = today.getDay();\r\n const currentTime = today.getTime();\r\n const todaysHours = Hours.find(\r\n ({ startDayOfWeek, endDayOfWeek }) => dayOfWeek >= startDayOfWeek && dayOfWeek <= endDayOfWeek\r\n );\r\n\r\n if (HolidayHours) {\r\n const currentHolidayDate = HolidayHours.find(\r\n ({ date }: IHolidayHours) => new Date(date).getTime() === today.setHours(0, 0, 0, 0)\r\n );\r\n\r\n if (currentHolidayDate) {\r\n this.currentTime = new Date(currentTime).toString()\r\n let { startTime: startTime, endTime: endTime } = currentHolidayDate as any;\r\n startTime = new Date(startTime);\r\n endTime = new Date(endTime);\r\n const displayStartTime = this.parseStoreHours(startTime.getHours(), startTime.getMinutes());\r\n const displayEndTime = this.parseStoreHours(endTime.getHours(), endTime.getMinutes());\r\n if(startTime && endTime) {\r\n if(currentTime < startTime.getTime()) {\r\n this.statusText = `Holiday Hours`;\r\n this.hoursText = `Opening: ${displayStartTime} - ${displayEndTime}`;\r\n } else if(currentTime > endTime.getTime()) {\r\n this.statusText = `Holiday Hours`;\r\n this.hoursText = `Closed`;\r\n } else {\r\n this.statusText = `Holiday Hours`;\r\n this.hoursText = `Today: ${displayStartTime} - ${displayEndTime}`;\r\n }\r\n }\r\n }\r\n\r\n if (Hours && !this.hoursText && todaysHours) {\r\n this.hoursText = `Today: ${this.parseStoreHours(\r\n getStartEndTime(todaysHours.startHour).hours,\r\n getStartEndTime(todaysHours.startHour).minutes\r\n )} - ${this.parseStoreHours(getStartEndTime(todaysHours.endHour).hours, getStartEndTime(todaysHours.endHour).minutes)}`;\r\n }\r\n }\r\n }\r\n\r\n private buildStoreMenu(): void {\r\n const hourMenuElements = this.store.Hours.map(\r\n ({ startHour: startTime, endHour: endTime, startDayOfWeek, endDayOfWeek }, index) => {\r\n const time = `${this.parseStoreHours(getStartEndTime(startTime).hours, getStartEndTime(startTime).minutes)} - ${this.parseStoreHours(\r\n getStartEndTime(endTime).hours,\r\n getStartEndTime(endTime).minutes\r\n )}`;\r\n if (startDayOfWeek === endDayOfWeek) {\r\n return `<div key=${`${this.store.Id}-${index}`}>${getDayOfWeekShort(startDayOfWeek) +\r\n ': ' +\r\n time}</div>`;\r\n }\r\n return `<div key=${`${this.store.Id}-${index}`}>${getDayOfWeekShort(startDayOfWeek) +\r\n '-' +\r\n getDayOfWeekShort(endDayOfWeek) +\r\n ': ' +\r\n time}</div>`;\r\n }\r\n );\r\n\r\n this.storeMenu = hourMenuElements.join('');\r\n }\r\n}\r\n","export default {CUSTOMER_HUB_STORES_LIST: [\"6001\",\"6002\",\"6003\",\"6004\",\"6005\",\"6007\",\"6008\",\"6010\",\"6011\",\"6013\",\"6014\",\"6015\",\"6016\",\"6018\",\"6020\",\"6021\",\"6022\",\"6024\",\"6025\",\"6027\",\"6031\",\"6032\",\"6034\",\"6035\",\"6036\",\"6037\",\"6038\",\"6039\",\"6040\",\"6041\",\"6042\",\"6043\",\"6045\",\"6047\",\"6048\",\"6049\",\"6050\",\"6051\",\"6052\",\"6054\",\"6055\",\"6056\",\"6057\",\"6058\",\"6059\",\"6061\",\"6063\",\"6064\",\"6065\",\"6067\",\"6068\",\"6070\",\"6071\",\"6072\",\"6073\",\"6074\",\"6075\",\"6077\",\"6080\",\"6081\",\"6082\",\"6084\",\"6086\",\"6089\",\"6090\",\"6092\",\"6094\",\"6095\",\"6098\",\"6102\",\"6103\",\"6104\",\"6105\",\"6106\",\"6107\",\"6108\",\"6110\",\"6112\",\"6113\",\"6116\",\"6121\",\"6123\",\"6125\",\"6128\",\"6133\",\"6134\",\"6135\",\"6137\",\"6138\",\"6140\",\"6141\",\"6142\",\"6146\",\"6149\",\"6152\",\"6154\",\"6156\",\"6157\",\"6161\",\"6163\",\"6164\",\"6168\",\"6170\",\"6174\",\"6176\",\"6177\",\"6178\",\"6179\",\"7100\",\"7101\",\"7102\",\"7103\",\"7104\",\"7105\",\"7106\",\"7107\",\"7108\",\"7109\",\"7110\",\"7111\",\"7112\",\"7113\",\"7114\",\"7115\",\"7116\",\"7117\",\"7118\",\"7120\",\"7121\",\"7122\",\"7123\",\"7124\",\"7126\",\"7128\",\"7129\",\"7130\",\"7132\",\"7136\",\"7144\",\"7146\",\"7147\",\"7148\",\"7149\",\"7150\",\"7151\",\"7152\",\"7154\",\"7157\",\"7159\",\"7164\",\"7165\",\"7167\",\"7171\",\"7172\",\"7173\",\"7174\",\"7175\",\"7176\",\"7177\",\"7178\",\"7179\",\"7180\",\"7181\",\"7183\",\"7185\",\"7186\",\"7187\",\"7188\",\"7190\",\"7191\",\"7192\",\"7193\",\"7194\",\"7195\",\"7196\",\"7197\",\"7198\",\"7199\",\"7201\",\"7202\",\"7203\",\"7204\",\"7206\",\"7207\",\"7208\",\"7209\",\"7210\",\"7211\",\"7213\",\"7218\",\"7224\",\"7227\",\"7230\",\"7231\",\"7233\",\"7234\",\"7240\",\"7241\",\"7242\",\"7243\",\"7244\",\"7247\",\"7248\",\"7249\",\"7250\",\"7252\",\"7255\",\"7257\",\"7258\",\"7260\",\"7261\",\"7262\",\"7264\",\"7265\",\"7267\",\"7268\",\"7270\",\"7271\",\"7272\",\"7274\",\"7276\",\"7278\",\"7279\",\"7280\",\"7281\",\"7282\",\"7283\",\"7284\",\"7285\",\"7286\",\"7287\",\"7290\",\"7291\",\"7294\",\"7295\",\"7297\",\"7298\",\"7633\",\"7653\",\"7654\",\"7662\",\"7663\",\"7807\",\"7810\"], DELIVERY_STORES_LIST: [\"6001\",\"6002\",\"6003\",\"6005\",\"6008\",\"6010\",\"6011\",\"6012\",\"6013\",\"6014\",\"6016\",\"6017\",\"6018\",\"6024\",\"6027\",\"6031\",\"6032\",\"6035\",\"6036\",\"6041\",\"6042\",\"6043\",\"6045\",\"6047\",\"6048\",\"6052\",\"6059\",\"6063\",\"6064\",\"6065\",\"6067\",\"6068\",\"6070\",\"6071\",\"6072\",\"6073\",\"6074\",\"6077\",\"6080\",\"6081\",\"6087\",\"6089\",\"6094\",\"6095\",\"6098\",\"6102\",\"6103\",\"6104\",\"6105\",\"6107\",\"6110\",\"6112\",\"6113\",\"6116\",\"6125\",\"6128\",\"6136\",\"6138\",\"6140\",\"6141\",\"6148\",\"6156\",\"6157\",\"6161\",\"6163\",\"6164\",\"6168\",\"6174\",\"7100\",\"7101\",\"7102\",\"7103\",\"7104\",\"7105\",\"7106\",\"7107\",\"7108\",\"7109\",\"7110\",\"7111\",\"7112\",\"7113\",\"7114\",\"7115\",\"7116\",\"7117\",\"7118\",\"7120\",\"7121\",\"7122\",\"7123\",\"7124\",\"7126\",\"7128\",\"7129\",\"7130\",\"7132\",\"7136\",\"7144\",\"7146\",\"7147\",\"7148\",\"7149\",\"7150\",\"7151\",\"7152\",\"7154\",\"7157\",\"7159\",\"7164\",\"7165\",\"7167\",\"7171\",\"7172\",\"7173\",\"7175\",\"7176\",\"7177\",\"7178\",\"7179\",\"7181\",\"7183\",\"7185\",\"7186\",\"7187\",\"7190\",\"7191\",\"7194\",\"7195\",\"7196\",\"7197\",\"7198\",\"7199\",\"7201\",\"7202\",\"7203\",\"7206\",\"7207\",\"7208\",\"7213\",\"7224\",\"7227\",\"7230\",\"7231\",\"7233\",\"7234\",\"7241\",\"7242\",\"7243\",\"7244\",\"7247\",\"7248\",\"7250\",\"7252\",\"7257\",\"7258\",\"7260\",\"7261\",\"7262\",\"7264\",\"7265\",\"7271\",\"7272\",\"7274\",\"7278\",\"7279\",\"7282\",\"7283\",\"7284\",\"7285\",\"7286\",\"7287\",\"7290\",\"7291\",\"7294\",\"7295\",\"7297\",\"7298\",\"7633\",\"7653\",\"7654\",\"7662\",\"7663\",\"7807\",\"7810\"], EXPEDITED_PICKUP_STORES_LIST: [\"6001\",\"6002\",\"6003\",\"6004\",\"6005\",\"6007\",\"6008\",\"6010\",\"6011\",\"6013\",\"6014\",\"6015\",\"6016\",\"6017\",\"6018\",\"6020\",\"6021\",\"6022\",\"6024\",\"6025\",\"6027\",\"6031\",\"6032\",\"6034\",\"6035\",\"6036\",\"6037\",\"6038\",\"6039\",\"6040\",\"6041\",\"6042\",\"6043\",\"6045\",\"6047\",\"6048\",\"6049\",\"6050\",\"6051\",\"6052\",\"6054\",\"6055\",\"6056\",\"6057\",\"6058\",\"6059\",\"6061\",\"6063\",\"6064\",\"6065\",\"6067\",\"6068\",\"6070\",\"6071\",\"6072\",\"6073\",\"6074\",\"6075\",\"6077\",\"6080\",\"6081\",\"6082\",\"6084\",\"6086\",\"6089\",\"6090\",\"6092\",\"6094\",\"6095\",\"6098\",\"6102\",\"6103\",\"6104\",\"6105\",\"6106\",\"6107\",\"6108\",\"6110\",\"6112\",\"6113\",\"6116\",\"6121\",\"6123\",\"6125\",\"6128\",\"6133\",\"6134\",\"6135\",\"6137\",\"6138\",\"6140\",\"6141\",\"6142\",\"6146\",\"6149\",\"6152\",\"6156\",\"6157\",\"6161\",\"6163\",\"6164\",\"6168\",\"6170\",\"6174\",\"6176\",\"6177\",\"6178\",\"6179\",\"7100\",\"7101\",\"7102\",\"7103\",\"7104\",\"7105\",\"7106\",\"7107\",\"7108\",\"7109\",\"7110\",\"7111\",\"7112\",\"7113\",\"7114\",\"7115\",\"7116\",\"7117\",\"7118\",\"7120\",\"7121\",\"7122\",\"7123\",\"7124\",\"7126\",\"7128\",\"7129\",\"7130\",\"7132\",\"7136\",\"7144\",\"7146\",\"7147\",\"7148\",\"7149\",\"7150\",\"7151\",\"7152\",\"7154\",\"7157\",\"7159\",\"7164\",\"7165\",\"7167\",\"7171\",\"7172\",\"7173\",\"7174\",\"7175\",\"7176\",\"7177\",\"7178\",\"7179\",\"7180\",\"7181\",\"7183\",\"7185\",\"7186\",\"7187\",\"7188\",\"7190\",\"7191\",\"7192\",\"7193\",\"7194\",\"7195\",\"7196\",\"7197\",\"7198\",\"7199\",\"7201\",\"7202\",\"7203\",\"7204\",\"7206\",\"7207\",\"7208\",\"7209\",\"7210\",\"7211\",\"7213\",\"7218\",\"7224\",\"7226\",\"7227\",\"7230\",\"7231\",\"7233\",\"7234\",\"7240\",\"7241\",\"7242\",\"7243\",\"7244\",\"7247\",\"7248\",\"7249\",\"7250\",\"7252\",\"7255\",\"7257\",\"7258\",\"7260\",\"7261\",\"7262\",\"7264\",\"7265\",\"7267\",\"7268\",\"7270\",\"7271\",\"7272\",\"7274\",\"7276\",\"7278\",\"7279\",\"7280\",\"7281\",\"7282\",\"7283\",\"7284\",\"7285\",\"7286\",\"7287\",\"7290\",\"7291\",\"7294\",\"7295\",\"7297\",\"7298\",\"7633\",\"7653\",\"7654\",\"7662\",\"7663\",\"7807\",\"7810\"], AFTER_SALE_DELIVERY_STORES_LIST: [], CURBSIDE_STORES_LIST: [\"4400\",\"6001\",\"6002\",\"6003\",\"6004\",\"6005\",\"6007\",\"6008\",\"6010\",\"6011\",\"6012\",\"6013\",\"6014\",\"6015\",\"6016\",\"6017\",\"6018\",\"6020\",\"6021\",\"6022\",\"6024\",\"6025\",\"6027\",\"6031\",\"6032\",\"6034\",\"6035\",\"6036\",\"6037\",\"6038\",\"6039\",\"6040\",\"6041\",\"6042\",\"6043\",\"6045\",\"6047\",\"6048\",\"6049\",\"6050\",\"6051\",\"6052\",\"6054\",\"6055\",\"6056\",\"6057\",\"6058\",\"6059\",\"6061\",\"6063\",\"6064\",\"6065\",\"6067\",\"6068\",\"6070\",\"6071\",\"6072\",\"6073\",\"6074\",\"6075\",\"6077\",\"6080\",\"6081\",\"6082\",\"6084\",\"6086\",\"6087\",\"6089\",\"6090\",\"6092\",\"6094\",\"6095\",\"6098\",\"6102\",\"6103\",\"6104\",\"6105\",\"6106\",\"6107\",\"6108\",\"6110\",\"6112\",\"6113\",\"6116\",\"6121\",\"6123\",\"6125\",\"6128\",\"6133\",\"6134\",\"6135\",\"6136\",\"6137\",\"6138\",\"6140\",\"6141\",\"6142\",\"6146\",\"6148\",\"6149\",\"6152\",\"6154\",\"6156\",\"6157\",\"6161\",\"6163\",\"6164\",\"6168\",\"6170\",\"6174\",\"6176\",\"6177\",\"6178\",\"6179\",\"7100\",\"7101\",\"7102\",\"7103\",\"7104\",\"7105\",\"7106\",\"7107\",\"7108\",\"7109\",\"7110\",\"7111\",\"7112\",\"7113\",\"7114\",\"7115\",\"7116\",\"7117\",\"7118\",\"7120\",\"7121\",\"7122\",\"7123\",\"7124\",\"7126\",\"7128\",\"7129\",\"7130\",\"7132\",\"7136\",\"7144\",\"7146\",\"7147\",\"7148\",\"7149\",\"7150\",\"7151\",\"7152\",\"7154\",\"7157\",\"7159\",\"7164\",\"7165\",\"7167\",\"7171\",\"7172\",\"7173\",\"7174\",\"7175\",\"7176\",\"7177\",\"7178\",\"7179\",\"7180\",\"7181\",\"7183\",\"7185\",\"7186\",\"7187\",\"7188\",\"7190\",\"7191\",\"7192\",\"7193\",\"7194\",\"7195\",\"7196\",\"7197\",\"7198\",\"7199\",\"7201\",\"7202\",\"7203\",\"7204\",\"7206\",\"7207\",\"7208\",\"7209\",\"7210\",\"7211\",\"7213\",\"7218\",\"7224\",\"7226\",\"7227\",\"7230\",\"7231\",\"7233\",\"7234\",\"7240\",\"7241\",\"7242\",\"7243\",\"7244\",\"7247\",\"7248\",\"7249\",\"7250\",\"7252\",\"7255\",\"7257\",\"7258\",\"7260\",\"7261\",\"7262\",\"7264\",\"7265\",\"7267\",\"7268\",\"7270\",\"7271\",\"7272\",\"7274\",\"7276\",\"7278\",\"7279\",\"7280\",\"7281\",\"7282\",\"7283\",\"7284\",\"7285\",\"7286\",\"7287\",\"7290\",\"7291\",\"7294\",\"7295\",\"7297\",\"7298\",\"7633\",\"7653\",\"7654\",\"7662\",\"7663\",\"7807\",\"7810\"]};","import { Store, StoreAvailability } from '../types/store';\r\nimport OmniStores from './OmniStores';\r\n\r\nexport const SUBSCRIBE_TO_STORE_UPDATES_CUSTOM_EVENT = 'kmxSubscribeToMyStoreModuleUpdates';\r\nexport const SET_STORE_CUSTOM_EVENT = 'kmxUpdateMyStoreModuleByStore';\r\nexport const SET_STORE_BY_ID_CUSTOM_EVENT = 'kmxUpdateMyStoreModuleById';\r\nexport const SET_STORE_BY_ID_ONLOAD_CUSTOM_EVENT = 'kmxUpdateMyStoreModuleByIdOnLoad';\r\nexport const OPEN_STORE_SELECTION_MODAL_EVENT = 'kmxOpenStoreSelectionModal';\r\nexport const CLOSE_STORE_SELECTION_MODAL_EVENT = 'kmxCloseStoreSelectionModal';\r\nexport const ENABLE_SEARCH_BAR_TEST = 'kmxEnableSearchBarTest';\r\nexport const SET_COGNITIVE_SEARCH_EVENT = 'kmxEnableCognitiveSearch';\r\nexport const ENABLE_SEARCH_BAR_DISPLAY_TEST = 'kmxEnableSearchBarDisplayPromptTest';\r\n\r\nexport const EMPTY_STORE: Store = {\r\n Id: '',\r\n Name: '',\r\n PhoneNumbers: [],\r\n Hours: [],\r\n PhoneHours: [],\r\n ServiceHours: [],\r\n Latitude: 0,\r\n Longitude: 0,\r\n AddressLine1: '',\r\n AddressLine2: '',\r\n City: '',\r\n MailingCity: '',\r\n StateAbbreviation: '',\r\n ZipCode: '',\r\n HolidayHours: [],\r\n ActiveStatus: '',\r\n AlertMessage: '',\r\n Capabilities: [],\r\n DistanceInMiles: 0,\r\n\r\n // `legacy` fields as of 12.2021:\r\n Categories: [],\r\n DisplayName: '',\r\n GeneralTelephoneNumbers: [],\r\n IsTemporarilyClosed: false,\r\n IsSaveable: true,\r\n IsCarBuyingCenter: false,\r\n Links: [],\r\n LocationDisplay:'',\r\n SalesTelephoneNumbers: [],\r\n ShowroomHours: [],\r\n State: '',\r\n Status: '',\r\n StatusAlert: '',\r\n Subtitle: '',\r\n TelephoneHours: [],\r\n TelephoneNumber: '',\r\n TelephoneNumbers: [],\r\n TollFreePhoneNumber: ''\r\n};\r\n\r\nexport const DEFAULT_STORE_AVAILABILITY: StoreAvailability = {\r\n Id: '',\r\n IsOpen: false,\r\n CurrentHours:[],\r\n Holiday: [],\r\n Alert: { status: '', message: '', storeId: '' }\r\n}\r\n\r\nexport const CUSTOMER_HUB_STORES_LIST = OmniStores.CUSTOMER_HUB_STORES_LIST;\r\nexport const DELIVERY_STORES_LIST: string[] = OmniStores.DELIVERY_STORES_LIST;\r\nexport const EXPEDITED_PICKUP_STORES_LIST = OmniStores.EXPEDITED_PICKUP_STORES_LIST;\r\nexport const AFTER_SALE_DELIVERY_STORES_LIST: string[] = OmniStores.AFTER_SALE_DELIVERY_STORES_LIST;\r\nexport const CURBSIDE_STORES_LIST = OmniStores.CURBSIDE_STORES_LIST;\r\n\r\nexport const GRAND_OPENING_ACTIVE_STATUS = 'Grand Opening';\r\n\r\nexport const SEARCH_BAR_TEST = 'SearchBar';\r\nexport const COGNITIVE_SEARCH_TEST = 'CognitiveSearch';\r\n","interface IEnv {\r\n prod: boolean;\r\n qa: boolean;\r\n dev: boolean;\r\n}\r\ntype Env = IEnv;\r\n\r\nexport const get = (hostname: string = window.location.hostname): Env => {\r\n return {\r\n prod: !/(qa|local|dev)/.test(hostname),\r\n qa: /(qa)/.test(hostname),\r\n dev: /(local|dev)/.test(hostname),\r\n };\r\n};\r\n\r\nexport const getCarMaxBaseUrl = () => {\r\n const subdomain = get().prod ? 'www' : 'wwwqa';\r\n const url = `https://${subdomain}.carmax.com`;\r\n return url;\r\n};\r\n\r\nexport const getCAFBaseUrl = () => {\r\n const subdomain = get().prod ? 'www4' : 'www4qa';\r\n const url = `https://${subdomain}.carmax.com`;\r\n return url;\r\n};\r\n\r\nexport const getMyKmxBaseUrl = () => {\r\n return get().prod ? 'https://www.carmax.com' : 'http://localhost:5000';\r\n}\r\n\r\nexport const getQueryStringValue = (paramName: string, url: string = window.location.href) => {\r\n const regex = new RegExp('[?&]' + paramName + '(=([^&#]*)|&|#|$)');\r\n const results = regex.exec(url);\r\n\r\n if (!results || !results[2]) {\r\n return '';\r\n }\r\n\r\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n}\r\n","import * as constants from '../constants';\r\nimport { Store } from '../types/store';\r\nimport { getDistanceInMiles } from '../components/nearestStore/utils';\r\nimport * as environment from '../utils/environment';\r\n\r\nexport const COOKIES = {\r\n visitor: 'KmxVisitor_0',\r\n myKmx: 'KmxMyKmx_0',\r\n store: 'KmxStore',\r\n prevAuthQA: `Kmx_PreviousQAuth`,\r\n prevAuthPROD: `Kmx_PreviousPAuth`\r\n};\r\n\r\nexport const getStoreId = (): Store['Id'] => {\r\n const visitorCookies = getCookieObject(COOKIES.visitor);\r\n const storeId = 'StoreId';\r\n if(visitorCookies && visitorCookies[storeId]) {\r\n return visitorCookies[storeId];\r\n }\r\n\r\n return '';\r\n};\r\n\r\nexport const getStoreZipCode = (): string => {\r\n const visitorCookies = getCookieObject(COOKIES.visitor);\r\n const key = 'Zip';\r\n if(visitorCookies && visitorCookies[key]) {\r\n return visitorCookies[key];\r\n }\r\n\r\n return '';\r\n};\r\n\r\nexport const getUserEnteredZipCode = ():string | null => {\r\n const visitorCookies = getCookieObject(COOKIES.visitor);\r\n const key = 'StoreSearchZipCode';\r\n if (visitorCookies && visitorCookies[key]) {\r\n return visitorCookies[key];\r\n }\r\n return null;\r\n}\r\n\r\nexport const setCookie = (\r\n key: string,\r\n value: string,\r\n attributes: { domain: string; expires: number; path: string } | undefined\r\n) => {\r\n const attrs: any = attributes || { domain: '.carmax.com', expires: 365, path: '/' };\r\n\r\n if (typeof document === 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof attrs.expires === 'number') {\r\n const expires = new Date();\r\n expires.setMilliseconds(expires.getMilliseconds() + attrs.expires * 864e5);\r\n attrs.expires = expires;\r\n }\r\n\r\n // We're using \"expires\" because \"max-age\" is not supported by IE\r\n attrs.expires = attrs.expires ? attrs.expires.toUTCString() : '';\r\n\r\n let stringifiedAttributes = '';\r\n for (const attributeName in attrs) {\r\n if (!attrs[attributeName]) {\r\n continue;\r\n }\r\n stringifiedAttributes += `; ${attributeName}`;\r\n if (attrs[attributeName] === true) {\r\n continue;\r\n }\r\n stringifiedAttributes += `=${attrs[attributeName]}`;\r\n }\r\n\r\n return (document.cookie = `${key}=${value}${stringifiedAttributes}`);\r\n}\r\n\r\nexport const stringifyCookie = (cookieObject: any) => {\r\n let stringifiedValue = '';\r\n\r\n for (const key in cookieObject) {\r\n if (!cookieObject[key]) {\r\n continue;\r\n }\r\n stringifiedValue === '' ? (stringifiedValue += key) : (stringifiedValue += `&${key}`);\r\n if (cookieObject[key] === true) {\r\n continue;\r\n }\r\n stringifiedValue += `=${cookieObject[key]}`;\r\n }\r\n\r\n return stringifiedValue;\r\n}\r\n\r\nexport const setStoreCookie = (store: Store) => {\r\n const visitorCookie = getCookieObject(COOKIES.visitor);\r\n visitorCookie.StoreId = store.Id;\r\n visitorCookie.Zip = store.ZipCode;\r\n setCookie(COOKIES.visitor, stringifyCookie(visitorCookie), undefined);\r\n // We need to set visitor cookie and store cookie\r\n const storeCookie = getCookieObject(COOKIES.store);\r\n storeCookie.StoreId = store.Id;\r\n setCookie(COOKIES.store, stringifyCookie(storeCookie), undefined)\r\n return visitorCookie;\r\n}\r\n\r\nexport const getVisitorCookieLatLng = (visitorCookie: {Lat: string, Lon: string}): {Lat: number, Lon: number} | false => {\r\n const visitorLat: string = visitorCookie['Lat'];\r\n const visitorLong: string = visitorCookie['Lon'];\r\n if(visitorLat && visitorLong) {\r\n return {\r\n Lat: parseFloat(visitorLat),\r\n Lon: parseFloat(visitorLong)\r\n }\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\nexport const getStoreDistance = (store: Store): number => {\r\n try {\r\n var visitorCookie = getCookieObject(COOKIES.visitor);\r\n const visitorLatLng = getVisitorCookieLatLng(visitorCookie);\r\n if(visitorLatLng) {\r\n var distance = getDistanceInMiles(store.Latitude, visitorLatLng.Lat, store.Longitude, visitorLatLng.Lon);\r\n return Math.round(distance * 10) / 10;\r\n } else {\r\n return -1;\r\n }\r\n } catch (e) {\r\n return -1;\r\n }\r\n};\r\n\r\nexport const isAuthenticated = (): boolean => {\r\n try {\r\n return !!document.cookie.match(COOKIES.myKmx);\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const hasSignedIn = (): boolean => {\r\n try {\r\n const authCookieName = environment.get().prod ? COOKIES.prevAuthPROD : COOKIES.prevAuthQA;\r\n return document.cookie.includes(`${authCookieName}=`);\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const hasCustomerHubStore = (): boolean => {\r\n try {\r\n const storeId = getStoreId();\r\n return constants.CUSTOMER_HUB_STORES_LIST.indexOf(storeId) > -1;\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const hasEpuStore = (): boolean => {\r\n try {\r\n const storeId = getStoreId();\r\n return constants.EXPEDITED_PICKUP_STORES_LIST.indexOf(storeId) > -1;\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const hasAfterSaleDeliveryStore = (): boolean => {\r\n try {\r\n const storeId = getStoreId();\r\n return constants.AFTER_SALE_DELIVERY_STORES_LIST.indexOf(storeId) > -1;\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const hasDeliveryStore = (): boolean => {\r\n try {\r\n const storeId = getStoreId();\r\n return constants.DELIVERY_STORES_LIST.indexOf(storeId) > -1;\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const hasCurbsideStore = (): boolean => {\r\n try {\r\n const storeId = getStoreId();\r\n return constants.CURBSIDE_STORES_LIST.indexOf(storeId) > -1;\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport function getCookieObject(cookieName: string) {\r\n var value = '; ' + document.cookie;\r\n var parts = value.split('; ' + cookieName + '=');\r\n var cookie = '';\r\n if (parts.length > 1) {\r\n var splitParts = parts.pop();\r\n cookie = (splitParts && splitParts.split(';').shift()) || '';\r\n }\r\n\r\n var cookieObj: any = {};\r\n cookie.split('&').forEach(function(value) {\r\n var keyValue = value.split('=');\r\n if (keyValue[0] && keyValue[1] !== 'undefined') {\r\n cookieObj[keyValue[0]] = keyValue[1];\r\n }\r\n });\r\n return cookieObj;\r\n}\r\n\r\nexport const getMyKmxUserId = (): string => {\r\n const cookieName = `${COOKIES.myKmx}=userid=`;\r\n if (document.cookie.includes(cookieName)) {\r\n return document.cookie.split(cookieName)[1].split(';')[0];\r\n }\r\n return '';\r\n}\r\n","import { MENU_DATA_ATTR } from './components/menu/constants';\r\nimport StoreStatus from './components/storeHours/storeStatus';\r\nimport { getUserEnteredZipCode } from './storage/cookie';\r\nimport { getStoreStatusDisplay, isClosed, Store, StoreAvailability } from './types/store';\r\nimport * as environment from './utils/environment';\r\nimport { determineSeeCarsUrl } from './utils/search';\r\n\r\nexport const links = {\r\n appointments: {\r\n text: 'My appointments',\r\n href: '/mycarmax/appointments'\r\n },\r\n appraisals: {\r\n text: 'Appraisals',\r\n href: '/mycarmax/appraisals'\r\n },\r\n browseByCategory: {\r\n text: 'Browse by category',\r\n href: '/cars'\r\n },\r\n faq: {\r\n text: 'FAQ',\r\n href: '/faq'\r\n },\r\n helpCenter: {\r\n text: 'FAQ & support',\r\n href: '/help-center'\r\n },\r\n buyingOnline: {\r\n text: 'Buying online',\r\n href: '/buying-online'\r\n },\r\n makeAPayment: {\r\n text: 'Make a Payment',\r\n href: `${environment.getCAFBaseUrl()}/account/summary`\r\n },\r\n maxcareService: {\r\n text: 'Warranties & MaxCare⁠®',\r\n href: '/car-buying-process/maxcare-service-plans'\r\n },\r\n careers: {\r\n text: 'Search jobs at CarMax',\r\n href: 'https://careers.carmax.com/us/en/'\r\n },\r\n getAnOnlineOffer: {\r\n text: 'Get an online offer',\r\n href: '/sell-my-car'\r\n },\r\n getPreQualified: {\r\n text: 'Get pre-qualified',\r\n href: '/pre-qual/app?op=global_footer'\r\n },\r\n sellHowItWorks: {\r\n text: 'How it works',\r\n href: '/sell-my-car#how-it-works'\r\n },\r\n financeHowItWorks: {\r\n text: 'How it works',\r\n href: '/car-financing'\r\n },\r\n findAStore: {\r\n text: 'Find a store',\r\n href: '/stores'\r\n },\r\n carMaxAutoFinance: {\r\n text: 'CarMax AutoFinance',\r\n href:'/car-financing/carmax-auto-finance'\r\n },\r\n myCarMax: {\r\n text: 'MyCarMax',\r\n href: '/mycarmax/home'\r\n },\r\n myOrders: {\r\n text: 'My orders',\r\n href: '/checkout'\r\n },\r\n profileSettings: {\r\n text: 'Profile settings',\r\n href: '/mycarmax/profile-settings'\r\n },\r\n register: {\r\n text: 'Create account',\r\n href: '/mycarmax/register'\r\n },\r\n researchArticles: {\r\n text: 'Car research & advice',\r\n href: '/research'\r\n },\r\n researchEVGuide: {\r\n text: 'Guide to EVs',\r\n href: '/research/electric-vehicle-guide'\r\n },\r\n savedCars: {\r\n text: 'My favorites',\r\n href: '/mycarmax/saved-cars'\r\n },\r\n savedSearches: {\r\n text: 'My saved searches',\r\n href: '/mycarmax/saved-searches'\r\n },\r\n service: {\r\n text: 'Service & repairs',\r\n href: '/service'\r\n },\r\n signIn: {\r\n text: 'Sign in',\r\n href: `/mycarmax/sign-in?returnUrl=${encodeURIComponent(window.location.href)}`\r\n },\r\n signOut: {\r\n text: 'Sign out',\r\n href: '/mycarmax/sign-out'\r\n },\r\n viewAllInventory: {\r\n text: 'View all inventory',\r\n href: '/cars/all'\r\n },\r\n watchlist: {\r\n text: 'Your favorites',\r\n href: '/watchlist'\r\n },\r\n whyCarMax: {\r\n text: 'Why CarMax',\r\n href: '/why-carmax'\r\n }\r\n};\r\n\r\nexport const icons = {\r\n buildDropdownIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class=\"${classes}\"` : ''\r\n } viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M7 10l5 5 5-5z\"></path><path d=\"M0 0h24v24H0z\" fill=\"none\"></path></svg>`,\r\n\r\n buildWarningIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class=\"${classes}\"` : ''\r\n } viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"></path></svg>`,\r\n\r\n buildAlertInfoIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class=\"${classes}\"` : ''\r\n } width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"></path></svg>`,\r\n\r\n buildSearchIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class=\"${classes}\"` : ''\r\n } width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"></path><path d=\"M0 0h24v24H0z\" fill=\"none\"></path></svg>`,\r\n\r\n buildHomeIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class=\"${classes}\"` : ''\r\n } viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M10 20v-6h4v6h5v-8h3L12 3 2 12h3v8z\"></path><path d=\"M0 0h24v24H0z\" fill=\"none\"></path></svg>`,\r\n\r\n buildEventAvailableIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class= \"${classes}\"` : ''\r\n } viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M16.53 11.06L15.47 10l-4.88 4.88-2.12-2.12-1.06 1.06L10.59 17l5.94-5.94zM19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11z\"></path></svg>`,\r\n\r\n buildFavoriteOutlineIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class= \"${classes}\"` : ''\r\n } viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><g ><path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M16.5 3A6 6 0 0 0 12 5a6 6 0 0 0-4.5-2A5.5 5.5 0 0 0 2 8.5c0 3.8 3.4 6.9 8.6 11.5l1.4 1.4 1.4-1.4c5.2-4.6 8.6-7.7 8.6-11.5A5.5 5.5 0 0 0 16.5 3zm.1 2A3.3 3.3 0 0 1 20 8.4c0 2.8-3.2 5.8-8 10.2-4.8-4.4-8-7.4-8-10.2A3.3 3.3 0 0 1 7.4 5a3.9 3.9 0 0 1 2.9 1.4l1.7 2 1.7-2a3.9 3.9 0 0 1 3-1.4\"></path></g></svg>`,\r\n\r\n buildSearchedForIcon: (classes?: string) =>\r\n `<svg ${\r\n classes ? `class= \"${classes}\"` : ''\r\n } viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg aria-hidden=\"true\"><path d=\"M0 0h24v24H0V0zm0 0h24v24H0V0z\" fill=\"none\"/><path d=\"M17.01 14h-.8l-.27-.27c.98-1.14 1.57-2.61 1.57-4.23 0-3.59-2.91-6.5-6.5-6.5s-6.5 3-6.5 6.5H2l3.84 4 4.16-4H6.51C6.51 7 8.53 5 11.01 5s4.5 2.01 4.5 4.5c0 2.48-2.02 4.5-4.5 4.5-.65 0-1.26-.14-1.82-.38L7.71 15.1c.97.57 2.09.9 3.3.9 1.61 0 3.08-.59 4.22-1.57l.27.27v.79l5.01 4.99L22 19l-4.99-5z\"/></svg>`\r\n};\r\n\r\nconst buildDesktopCareersLinkInnerHTML = (optimizeForSeo: boolean = false) => {\r\n return `<a\r\n id=\"careers-link--desktop\"\r\n tabindex=\"-1\"\r\n class=\"header-link\"\r\n data-kmx-analytics=\"prop5=Header-More\"\r\n href=\"${links.careers.href}\"\r\n ${optimizeForSeo ? 'rel=\"nofollow\"' : ''}\r\n >${links.careers.text}</a>`;\r\n};\r\n\r\nexport const content = {\r\n CLASSNAMES: {\r\n hidden: 'hidden',\r\n visible: 'visible',\r\n bodyScrollLock: 'body-scroll-lock'\r\n },\r\n HEADER: {\r\n id: 'header',\r\n navRight: {\r\n class: 'header-nav-right',\r\n loggedInClass: 'header-nav-right--logged-in'\r\n }\r\n },\r\n FOOTER: {\r\n id: 'footer'\r\n },\r\n FOOTER_COPYRIGHT: {\r\n id: 'footer-copyright-year'\r\n },\r\n MOBILE_NAV: {\r\n body: {\r\n class: 'header-drawer-body'\r\n },\r\n menuId: 'header-nav-menu',\r\n menuClass: 'header-drawer',\r\n drawer: {\r\n defaultClass: 'header-drawer',\r\n openClass: 'header-drawer--open'\r\n },\r\n focusStartId: 'header-drawer-focus-start'\r\n },\r\n MORE_LINKS: {\r\n sectionClass: 'header-helpful-links-section',\r\n button: {\r\n id: 'header-helpful-links-button',\r\n icon: {\r\n class: 'header-helpful-links-button-icon',\r\n openClass: 'header-helpful-links-button-icon--open'\r\n }\r\n },\r\n menuId: 'header-helpful-links-menu',\r\n defaultMenu: {\r\n buildInnerHTML: (optimizeForSeo: boolean = false) => {\r\n return `<ul class=\"header-footer-menu-list\" role=\"menu\" tabindex=\"-1\" aria-orientation=\"vertical\">\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" data-kmx-analytics=\"prop5=Header-More\" class=\"header-link\" href=\"${\r\n links.service.href\r\n }\">${links.service.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" data-kmx-analytics=\"prop5=Header-More\" class=\"header-link\" href=\"${\r\n links.helpCenter.href\r\n }\" ${optimizeForSeo ? 'rel=\"nofollow\"' : ''}>${links.helpCenter.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" data-kmx-analytics=\"prop5=Header-More\" class=\"header-link\" href=\"${\r\n links.whyCarMax.href\r\n }\" ${optimizeForSeo ? 'rel=\"nofollow\"' : ''}>${links.whyCarMax.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" data-kmx-analytics=\"prop5=Header-More\" class=\"header-link\" href=\"${\r\n links.buyingOnline.href\r\n }\" ${optimizeForSeo ? 'rel=\"nofollow\"' : ''}>${links.buyingOnline.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" data-kmx-analytics=\"prop5=Header-More\" class=\"header-link\" href=\"${\r\n links.researchEVGuide.href\r\n }\">${links.researchEVGuide.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" data-kmx-analytics=\"prop5=Header-More\" class=\"header-link\" href=\"${\r\n links.maxcareService.href\r\n }\" ${optimizeForSeo ? 'rel=\"nofollow\"' : ''}>${links.maxcareService.text}</a></li>\\\r\n <hr class=\"header-footer-menu-divider\" />\\\r\n <li class=\"header-footer-menu-list-item header-footer-menu-list-item__delineated-link header-link__careers-link mobile-hidden\" role=\"menuitem\" tabindex=\"-1\">${buildDesktopCareersLinkInnerHTML(\r\n optimizeForSeo\r\n )}</li>\\\r\n </ul>`;\r\n }\r\n },\r\n careersLink: {\r\n label: 'Search jobs at CarMax',\r\n href: 'https://careers.carmax.com/us/en/',\r\n mobile: {\r\n linkHTML:\r\n '<a id=\"careers-link--mobile\" class=\"header-link header-link__delineated header-link__careers-link desktop-hidden\" data-kmx-analytics=\"prop5=Header-More\" href=\"https://careers.carmax.com/us/en/\">Search jobs at CarMax</a>',\r\n id: 'careers-link--mobile',\r\n class: 'header-link header-link__delineated desktop-hidden header-link__careers-link'\r\n },\r\n desktop: {\r\n innerHTML: buildDesktopCareersLinkInnerHTML(),\r\n id: 'careers-link--desktop',\r\n class:\r\n 'header-footer-menu-list-item header-footer-menu-list-item__delineated-link header-link__careers-link mobile-hidden tablet-hidden'\r\n }\r\n }\r\n },\r\n HEADER_SEARCH: {\r\n id: 'header-search-bar',\r\n activeClass: 'header-search-bar--active',\r\n input: {\r\n id: 'header-inventory-search'\r\n },\r\n menuId: 'header-search-bar-menu',\r\n formId: 'header-search-bar-form',\r\n autocompleteList: {\r\n id: 'header-search-bar-list',\r\n listItemClass: 'header-footer-menu-list-item',\r\n listItemRole: 'menuitem',\r\n listRole: 'menu',\r\n linkClass: 'menu-item-link',\r\n textClass: 'menu-item-text'\r\n }\r\n },\r\n HEADER_MY_STORE: {\r\n sectionClassNoStore: 'header-my-store-section-no-store',\r\n sectionClass: 'header-my-store-section',\r\n buttonId: 'header-my-store-button',\r\n buttonAlertClass: 'header-my-store-button-alert',\r\n buttonTextId: 'header-my-store-button-text',\r\n buttonSecondaryTextId: 'header-my-store-button-zipCode',\r\n storeStatusId: 'header-store-status-text',\r\n storeStatusTextId: 'store-status--text',\r\n storeStatusHoursId: 'store-status--status-hours',\r\n iconClass: 'header-footer-icon',\r\n menuId: 'header-my-store-menu',\r\n alertInfoIconContainerClass: 'header-alert-info-icon-container',\r\n alertInfoIconClass: 'header-alert-info-icon mobile-hidden',\r\n locationAlertIconContainerClass: 'header-footer-location-icon-alert',\r\n locationAlertCircleClass: 'header-footer-location-icon-alert-circle',\r\n storeSearchFormId: 'header-store-search-form'\r\n },\r\n FOOTER_MY_STORE: {\r\n sectionClass: 'footer-my-store-section',\r\n buttonId: 'footer-my-store-button',\r\n buttonAlertClass: 'footer-my-store-button-alert',\r\n buttonTextId: 'footer-my-store-button-text',\r\n iconClass: 'header-footer-icon',\r\n menuId: 'footer-my-store-menu',\r\n locationAlertIconContainerClass: 'header-footer-location-icon-alert',\r\n locationAlertCircleClass: 'header-footer-location-icon-alert-circle',\r\n storeSearchFormId: 'footer-store-search-form'\r\n },\r\n HEADER_FOOTER_FLYOUT_MENU: {\r\n storeHoursMenuClass: 'header-footer-my-store-details-store-hours-menu',\r\n storeHoursButtonClass: 'header-footer-my-store-details-store-hours-button'\r\n },\r\n MY_STORE_DETAILS: {\r\n addressClass: 'header-footer-my-store-details-address-link',\r\n getInnerHtml: (store: Store, availability: StoreAvailability, type: 'header' | 'footer') => {\r\n return getStoreDetailsHTML() + getStoreSearchHTML();\r\n function getStoreDetailsHTML() {\r\n const AddressLine2 = `${store.MailingCity}, ${store.StateAbbreviation} ${store.ZipCode}`;\r\n const storeStatus = new StoreStatus(store);\r\n const storeDistance = store.DistanceInMiles;\r\n\r\n const availabilityText = availability.IsOpen ? \"Currently Open\" : \"Currently Closed\";\r\n const alertMessage = availability.Alert?.message; // Nullable object\r\n const alertStatus = availability.Alert?.status;\r\n const alertStatusClosure = alertStatus == 'Closed' || isClosed(alertMessage);\r\n let statusText = \"\";\r\n\r\n // Order: Alert (abnormality) -> Holiday -> Regular open/closed\r\n if(alertMessage) {\r\n statusText = getStoreStatusDisplay(alertMessage);\r\n }else if(storeStatus.statusText) {\r\n statusText = storeStatus.statusText;\r\n }else {\r\n statusText = availabilityText;\r\n }\r\n\r\n const seeCarsUrl = determineSeeCarsUrl(store);\r\n const zipCodeToDisplay = getUserEnteredZipCode() ?? store.ZipCode;\r\n\r\n let html = store.Id\r\n ? `<div id=\"${type}-my-store-details\" class=\"header-footer-my-store-details\"><div class=\"header-footer-my-store-details-header\">Your store for ${\r\n zipCodeToDisplay\r\n }:</div>\\\r\n <div class=\"header-footer-my-store-details-store-name\"><span>${\r\n store.Name\r\n }<span aria-label=\"${storeDistance + \" miles\"}\" class=\"header-footer-my-store-details-distance\">${\r\n storeDistance > 0 ? '(' + storeDistance + ' mi)' : ''\r\n }</span></span><span></span></div>\\\r\n <a id=\"my-store-details-btn\" tabindex=\"0\" data-kmx-analytics=\"prop5=Header-Location\" ${MENU_DATA_ATTR.dialog}=\"${\r\n MENU_DATA_ATTR.focusStart\r\n\r\n }\" class=\"header-footer-my-store-details-link\" href=\"/stores/${\r\n store.Id\r\n }\">View more store details</a>\\\r\n <div class=\"header-footer-my-store-details-info-section\">\\\r\n <div class=\"header-footer-my-store-details-address\">${store.AddressLine1}<br>${AddressLine2}</div>\\\r\n ${`<button class=\"header-footer-my-store-details-store-hours-button\" data-kmx-analytics=\"prop5=Header-Location\">${\r\n alertStatusClosure\r\n ? `<div class=\"icon-wrapper\">${icons.buildWarningIcon('warningIcon')}</div>`\r\n : ''\r\n }\r\n <span class=\"store-status-text ${statusText.toLowerCase()}\">${\r\n statusText\r\n }\r\n ${alertStatusClosure ? \"\": `</span><span class=\"store-status-hours\">${storeStatus.hoursText}`}\r\n </span> <span class=\"icon-wrapper\">${icons.buildDropdownIcon('dropdownIcon')}</span></button>`}\r\n </div>\\\r\n <div class=\"${content.HEADER_FOOTER_FLYOUT_MENU.storeHoursMenuClass}\">${storeStatus.storeMenu}</div>\r\n <a rel=\"nofollow\" tabindex=\"0\" class=\"header-footer-my-store-details-inventory-link\" data-kmx-analytics=\"prop5=Header-Location | searchInit\" href=\"${seeCarsUrl}\">\r\n See cars at this store\r\n </a>\\\r\n </div>`\r\n : '';\r\n return html;\r\n }\r\n\r\n function getStoreSearchHTML() {\r\n const STORE_SEARCH_LABEL = 'Change your store';\r\n const STORE_SEARCH_PLACEHOLDER = 'Search by ZIP or State';\r\n let html = `<div class=\"header-footer-store-search-bar\">\\\r\n <form class=\"header-footer-store-search-bar-form\" role=\"search\" id=\"${type}-store-search-form\" onSubmit=\"event.preventDefault()\">\\\r\n <label for=\"${type}-store-search\" >${STORE_SEARCH_LABEL}</label>\\\r\n <div class=\"header-footer-store-search-bar-container\">\\\r\n <input tabindex=\"0\" ${\r\n store.Id ? '' : `${MENU_DATA_ATTR.dialog}=\"${MENU_DATA_ATTR.focusStart}\"`\r\n } id=\"${type}-store-search-form-input\" name=\"keyword\" class=\"header-footer-store-search-bar-input\" type=\"search\" placeholder=\"${STORE_SEARCH_PLACEHOLDER}\" autocomplete=\"off\" value=\"\" />\\\r\n <div class=\"header-search-bar-button-container\">\\\r\n <button data-kmx-analytics=\"prop5=Header-Location\" tabindex=\"0\" ${MENU_DATA_ATTR.dialog}=\"${\r\n MENU_DATA_ATTR.focusEnd\r\n }\" id=\"${type}-store-search-button\" aria-label=\"Search for CarMax stores.\" type=\"submit\" class=\"header-footer-icon-button\">\\\r\n ${icons.buildSearchIcon()}\\\r\n </button>\\\r\n </div>\\\r\n </div>\\\r\n </form>\\\r\n </div>`;\r\n return html;\r\n }\r\n }\r\n },\r\n MY_PROFILE: {\r\n sectionClass: 'header-my-profile-section',\r\n buttonId: 'header-my-profile-button',\r\n menuId: 'header-my-profile-menu',\r\n authenticatedMenuWithHub: {\r\n innerHTML: `<ul class=\"header-footer-menu-list\" role=\"menu\" tabindex=\"-1\" aria-hidden=\"true\" aria-orientation=\"vertical\">\\\r\n <li class=\"header-footer-menu-list-item payment-button\" role=\"menuitem\" tabindex=\"-1\"><a rel=\"nofollow\" class=\"payment-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.makeAPayment.href\r\n }\">${links.makeAPayment.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\"href=\"${\r\n links.myCarMax.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildHomeIcon('homeIcon')}</span>${links.myCarMax.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.appointments.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildEventAvailableIcon('homeIcon')}</span>${\r\n links.appointments.text\r\n }</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link header-link--favorites\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.savedCars.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildFavoriteOutlineIcon('homeIcon')}</span>${\r\n links.savedCars.text\r\n }</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.savedSearches.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildSearchedForIcon('homeIcon')}</span>${\r\n links.savedSearches.text\r\n }</a></li>\\\r\n <hr class=\"header-footer-menu-divider\" />\\\r\n <li class=\"header-footer-menu-list-item header-footer-menu-list-item__delineated-link\" role=\"menuitem\" tabindex=\"-1\"><div class=\"header-footer-menu-list-item\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.myOrders.href\r\n }\">${links.myOrders.text}</a></div></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.profileSettings.href\r\n }\">${links.profileSettings.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link header-link--priority\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.signOut.href\r\n }\">${links.signOut.text}</a></li>\\\r\n </ul>`\r\n },\r\n authenticatedMenu: {\r\n innerHTML: `<ul class=\"header-footer-menu-list\" role=\"menu\" tabindex=\"-1\" aria-hidden=\"true\" aria-orientation=\"vertical\">\\\r\n <li class=\"header-footer-menu-list-item payment-button\" role=\"menuitem\" tabindex=\"-1\"><a rel=\"nofollow\" class=\"payment-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.makeAPayment.href\r\n }\">${links.makeAPayment.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.myCarMax.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildHomeIcon('homeIcon')}</span>${links.myCarMax.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.appointments.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildEventAvailableIcon('homeIcon')}</span>${\r\n links.appointments.text\r\n }</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link header-link--favorites\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.savedCars.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildFavoriteOutlineIcon('homeIcon')}</span>${\r\n links.savedCars.text\r\n }</a></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.savedSearches.href\r\n }\"><span class=\"icon-wrapper\">${icons.buildSearchedForIcon('homeIcon')}</span>${\r\n links.savedSearches.text\r\n }</a></li>\\\r\n <hr class=\"header-footer-menu-divider\" />\\\r\n <li class=\"header-footer-menu-list-item header-footer-menu-list-item__delineated-link\" role=\"menuitem\" tabindex=\"-1\"><div class=\"header-footer-menu-list-item\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.profileSettings.href\r\n }\">${links.profileSettings.text}</a></div></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link header-link--priority\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${\r\n links.signOut.href\r\n }\">${links.signOut.text}</a></li>\\\r\n </ul>`\r\n },\r\n unauthenticatedMenu: {\r\n innerHTML: `<ul class=\"header-footer-menu-list\" role=\"menu\" tabindex=\"-1\" aria-hidden=\"true\" aria-orientation=\"vertical\">\\\r\n <li class=\"header-footer-menu-list-item payment-button\" role=\"menuitem\" tabindex=\"-1\"><a rel=\"nofollow\" class=\"payment-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${links.makeAPayment.href}\">${links.makeAPayment.text}</a></li>\\\r\n <li class=\"header-footer-menu-list-item header-footer-menu-list-item__delineated-link\" role=\"menuitem\" tabindex=\"-1\"><div class=\"header-footer-menu-list-item\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${links.signIn.href}\">${links.signIn.text}</a></div></li>\\\r\n <li class=\"header-footer-menu-list-item\" role=\"menuitem\" tabindex=\"-1\"><a tabindex=\"-1\" class=\"header-link\" data-kmx-analytics=\"prop5=Header-Profile\" href=\"${links.register.href}\">${links.register.text}</a></li>\\\r\n </ul>`\r\n }\r\n },\r\n SAVED_CARS_BUTTON: {\r\n id: 'header-saved-cars-button',\r\n visibleClass: 'visible'\r\n },\r\n STORE_CHOOSER: {\r\n WRAPPER: {\r\n id: 'store-chooser-wrapper',\r\n class: 'store-chooser-wrapper',\r\n visibleClass: 'visible'\r\n },\r\n BACKGROUND: {\r\n class: 'store-chooser-background-modal'\r\n },\r\n MODAL: {\r\n id: 'store-chooser-modal',\r\n class: 'store-chooser-modal',\r\n role: 'dialog',\r\n HEADER: {\r\n id: 'store-chooser-modal_header',\r\n class: 'store-chooser-modal_header',\r\n TITLE: {\r\n class: 'store-chooser-modal_header-title',\r\n id: 'store-chooser-modal_header-title',\r\n innerText: 'Select your store'\r\n },\r\n DESCRIPTION: {\r\n class: 'hidden',\r\n id: 'store-chooser-modal_header-description',\r\n innerText:\r\n 'You can change your store in this dialog and have the carmax experience update accordingly.'\r\n },\r\n CLOSE: {\r\n class: 'store-chooser-modal_header-close',\r\n type: 'button',\r\n ariaLabel: 'close',\r\n ariaHidden: 'false',\r\n innerHTML:\r\n '<svg class=\"store-chooser-modal_header-close-icon-svg\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"></path><path d=\"M0 0h24v24H0z\" fill=\"none\"></path></svg>'\r\n }\r\n },\r\n FORM: {\r\n id: 'store-chooser-keyword-search-form',\r\n class: 'store-chooser-modal_search-form',\r\n visibleClass: 'visible',\r\n INPUT: {\r\n id: 'store-chooser-keyword-input',\r\n class: 'store-chooser-modal_search-form-input',\r\n name: 'keyword',\r\n placeholder: 'Search by ZIP or State'\r\n },\r\n BUTTON: {\r\n class: 'store-chooser-modal_search-form-button',\r\n innerHTML:\r\n '<svg class=\"store-chooser-modal_search-form-button-svg\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M15.5 14h-.79l-.28-.27a6.5 6.5 0 10-.7.7l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0a4.5 4.5 0 11-.01-8.99A4.5 4.5 0 019.5 14z\"></path><path d=\"M0 0h24v24H0z\" fill=\"none\"></path></svg>',\r\n type: 'submit',\r\n ariaLabel: 'Set My Store',\r\n ariaHidden: 'false'\r\n }\r\n },\r\n BODY: {\r\n id: 'store-chooser-modal-body',\r\n class: 'store-chooser-modal-body',\r\n loadingInnerHTML: `<div class=\"carmax-loading\"><div class=\"carmax-loading-ring first-ring\"></div><div class=\"carmax-loading-ring second-ring\"></div><div class=\"carmax-loading-ring third-ring\"></div><div class=\"carmax-loading-ring fourth-ring\"></div></div>`,\r\n noMatchesFoundInnerHtml: `<div class=\"store-chooser-modal_no-matches\"><p class=\"store-chooser-modal_no-matches-text\">No matches found</p></div>`,\r\n LIST: {\r\n class: 'store-chooser-modal_list',\r\n STORE: {\r\n class: 'store-chooser-modal_list-store',\r\n itemInnerHTML: (\r\n name: string,\r\n distance: number,\r\n street: string,\r\n city: string,\r\n state: string,\r\n zip: string,\r\n alertMessage: string | null,\r\n hoursText: string,\r\n showHours: boolean\r\n ) => {\r\n return `<div class='store-chooser-modal_list-store-info'>\r\n <div class='store-title'>\r\n <h4 class='store-title-name'>${name}</h4>\r\n ${\r\n distance > 0\r\n ? `<span aria-label=\"${distance + \" miles\"}\" class='store-title-distance'>~${distance} mi</span>`\r\n : ''\r\n }\r\n </div>\r\n <p class='store-address'>${street}<br>${city}, ${state} ${zip}</p>\r\n ${\r\n alertMessage\r\n ? `<p class='store-hours alert'>${icons.buildWarningIcon(\r\n 'warningIcon'\r\n )}${alertMessage}</p>`\r\n : showHours\r\n ? `<p class='store-hours'>${hoursText}</p>`\r\n : ``\r\n }\r\n </div>`;\r\n },\r\n selectClass: 'store-chooser-modal_list-store-select',\r\n selectGrandOpenClass:\r\n 'store-chooser-modal_list-store-select-grand-open',\r\n selectGrandOpenInnerHTML: `<svg class=\"grand-open-store-svg\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" height=\"24\" width=\"24\" aria-hidden=\"true\"><path d=\"M23 8c-.6 0-1-.4-1-1V1c0-.6.4-1 1-1s1 .4 1 1v6c0 .6-.4 1-1 1zM19 9c-.3 0-.5-.1-.7-.3l-4-4c-.4-.4-.4-1 0-1.4s1-.4 1.4 0l4 4c.4.4.4 1 0 1.4-.2.2-.4.3-.7.3zM19 13h-6c-.6 0-1-.4-1-1s.4-1 1-1h6c.6 0 1 .4 1 1s-.4 1-1 1z\" fill=\"#db187a\" /></svg>Opening Soon`,\r\n selectSelectedClass:\r\n 'store-chooser-modal_list-store-select-selected',\r\n selectSelectedInnerHTML: `<svg class=\"selected-store-svg\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M12 2a10 10 0 100 20 10 10 0 000-20zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z\"></path></svg>Store Selected`,\r\n selectButtonClass:\r\n 'store-chooser-modal_list-store-select-button kmx-button kmx-button--tertiary',\r\n selectButtonInnerText: 'Set as my store',\r\n selectButtonType: 'button',\r\n selectButtonAriaLabel: 'set store',\r\n selectButtonAriaHidden: 'false',\r\n allStoreLinkClass: 'store-chooser-modal_list-store-all-link',\r\n allStoreLinkText: 'See All Stores',\r\n allStoreLinkHref: '/stores'\r\n }\r\n },\r\n ERROR: {\r\n class: 'store-chooser-modal_error',\r\n innerHTML: `<svg class=\"store-chooser-modal_error-svg\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"></path>\r\n </svg>\r\n <div class=\"store-chooser-modal_error-text\">\r\n Try searching again<br>by ZIP or State\r\n </div>`\r\n }\r\n }\r\n },\r\n EVENT_NAMES: {\r\n headerKeywordInput: 'store-chooser-header-input',\r\n footerKeywordInput: 'store-chooser-footer-input'\r\n }\r\n },\r\n OPTIMIZED_SEARCH: {\r\n SUV : {\r\n listItemUrl :'/cars/sport-utilities',\r\n listItemText : 'SUVs'\r\n },\r\n Hybrid : {\r\n listItemUrl :'/cars/plug-in-hybrid/electric/hybrid',\r\n listItemText : 'Hybrids & EVs'\r\n },\r\n Truck : {\r\n listItemUrl :'/cars/pickup-trucks',\r\n listItemText : 'Trucks'\r\n },\r\n Vans : {\r\n listItemUrl :'/cars/minivans-and-vans',\r\n listItemText : 'Vans & Minivans'\r\n },\r\n Article : {\r\n listItemUrl :'/articles/most-reliable-cars',\r\n listItemText : 'Most Reliable Cars — Article'\r\n }\r\n },\r\n};\r\n","import { Store } from \"../types/store\";\r\n\r\nexport const determineSeeCarsUrl = (\r\n store: Store, \r\n urlPathname: string = window.location.pathname, \r\n urlQueryString: string = window.location.search) : string => {\r\n // Creates a url to which to navigate when the user clicks See Cars.\r\n let seeCarsUrl = '';\r\n if (store && store.Id) {\r\n seeCarsUrl = `/cars/${store.Id}`;\r\n\r\n // If already on a search page with filters, keep those filters. Replace any existing store id filters.\r\n let pathname = ((urlPathname && urlPathname.toLowerCase()) || '');\r\n const queryString = ((urlQueryString && urlQueryString.toLowerCase()) || '');\r\n \r\n const hasQueryString = !!queryString;\r\n const isSearchRoute = \r\n !pathname.startsWith('/cars/all') &&\r\n (pathname.startsWith('/cars/') || \r\n (pathname.startsWith('/cars') && hasQueryString));\r\n if (isSearchRoute) {\r\n // Remove any other store filter in the url. \r\n pathname = pathname\r\n .replace(/\\/\\d{4}/g, '');\r\n seeCarsUrl = `${pathname}/${store.Id}${queryString}`;\r\n }\r\n }\r\n\r\n return seeCarsUrl;\r\n}\r\n\r\n/**\r\n * Builds a new post-store selection url\r\n */\r\nexport const determineNewStoreSelectionUrl = (\r\n urlPathname: string = window.location.pathname, \r\n urlQueryString: string = window.location.search) : string => {\r\n // Creates a url to which to navigate after changing stores.\r\n // Need to eliminate location in the query string and in the url segments as it will change the selected store back to a store in that city. \r\n if (!urlPathname && !urlQueryString) {\r\n return urlPathname;\r\n }\r\n\r\n const segments = urlPathname.split('/').filter(s => !s.toLowerCase().startsWith('location-'));\r\n const newPathname = segments.join('/');\r\n\r\n if (!urlQueryString) {\r\n return newPathname;\r\n }\r\n\r\n const queryStringParams = urlQueryString.replace('?', '').split('&');\r\n if (queryStringParams.length === 0) {\r\n return newPathname;\r\n }\r\n\r\n const newQueryString = queryStringParams\r\n .filter(p => !p.toLowerCase().startsWith('location='))\r\n .join('&');\r\n if (!newQueryString) {\r\n return newPathname;\r\n }\r\n\r\n return `${newPathname}?${newQueryString}`;\r\n}","import { Store } from '../../types/store';\r\n\r\nexport enum IAlertBannerIconTypes {\r\n Info = 'INFO',\r\n Cleaning = 'CLEANING',\r\n Close = 'CLOSE',\r\n Storefront = 'STOREFRONT',\r\n}\r\n\r\nexport enum IAlertBannerTypes {\r\n Dark = 'DARK',\r\n Urgent = 'URGENT',\r\n}\r\n\r\nexport enum IAlertBannerNearestStoreRuleType {\r\n Inclusion = 'INCLUSION',\r\n Exclusion = 'EXCLUSION',\r\n}\r\n\r\nexport interface IAlertBannerData {\r\n id: string;\r\n body: string;\r\n previousSiblingElSelector: string;\r\n pathnameRegexList: RegExp[];\r\n type?: IAlertBannerTypes;\r\n nearestStoreRules?: {\r\n type: IAlertBannerNearestStoreRuleType;\r\n list: Store['Id'][];\r\n };\r\n dismissable?: boolean;\r\n icon?: IAlertBannerIconTypes;\r\n}\r\n\r\nexport interface IRegisterAlertBannersEventDetail {\r\n alertBanners: IAlertBannerData[];\r\n}\r\n\r\nexport interface IDismissedAlertBanners {\r\n allIds: string[];\r\n byId: {\r\n [id: string]: {\r\n expires: number;\r\n };\r\n };\r\n}\r\n\r\nexport interface IDismissedAlertBannerLocalStorage {\r\n id: string;\r\n expires: number;\r\n}\r\n","import { IAlertBannerIconTypes } from './types';\r\n\r\nexport const ONE_MONTH = 2592000000;\r\n\r\nexport const constants = {\r\n STORE_DISPLAY_NAME_TEMPLATE: '{Store.Name}',\r\n MAXIMUM_LOCAL_STORAGE_DISMISSED_BANNERS: 28,\r\n DISMISSED_ALERT_BANNER_LOCAL_STORAGE_EXPIRATION: ONE_MONTH,\r\n DISMISSED_ALERT_BANNERS_LOCAL_STORAGE_KEY: 'kmx-dismissed-alert-banners',\r\n REGISTER_ALERT_BANNERS_CUSTOM_EVENT: 'kmxRegisterAlertBanners',\r\n};\r\n\r\nconst colors = {\r\n white: '#ffffff',\r\n slate100: '#f0f1f2',\r\n yellow600: '#ffd900',\r\n};\r\n\r\nconst iconSize = '24px';\r\n\r\nexport const content = {\r\n alertBanner: {\r\n id: 'alert-banner',\r\n tallClass: 'tall',\r\n urgentClass: 'urgent',\r\n darkClass: 'dark',\r\n containerClass: 'alert-banner-container',\r\n detailsClass: 'alert-banner-details',\r\n messageClass: 'alert-banner-message',\r\n descriptionClass: 'alert-banner-description',\r\n },\r\n icons: {\r\n baseClass: 'alert-banner-icon',\r\n infoIconClass: 'alert-banner-info-icon',\r\n cleaningIconClass: 'alert-banner-cleaning-icon',\r\n storefrontIconClass: 'alert-banner-storefront-icon',\r\n closeIconClass: 'alert-banner-close-icon',\r\n width: iconSize,\r\n height: iconSize,\r\n fill: colors.yellow600,\r\n darkFill: colors.slate100,\r\n urgentFill: colors.white,\r\n },\r\n closeButton: {\r\n id: 'alert-banner-close-button',\r\n class: 'alert-banner-close-button',\r\n iconWidth: iconSize,\r\n iconHeight: iconSize,\r\n iconFill: colors.white,\r\n },\r\n};\r\n\r\nexport const icons = {\r\n [IAlertBannerIconTypes.Info]: (fill: string) =>\r\n `<svg fill=\"${fill}\" class=\"${content.icons.baseClass} ${content.icons.infoIconClass}\" width=\"${content.icons.width}\" height=\"${content.icons.height}\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M0 0h24v24H0z\" fill=\"none\"></path><path d=\"M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z\"></path></svg>`,\r\n [IAlertBannerIconTypes.Cleaning]: (fill: string) =>\r\n `<svg class=\"${content.icons.baseClass} ${content.icons.cleaningIconClass}\" width=\"${content.icons.width}\" height=\"${content.icons.height}\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"0 0 18 24\" aria-hidden=\"true\"><defs><mask id=\"af3fd981-53b8-46f6-a894-5f91767dff75\" x=\"1.36\" y=\"9.02\" width=\"8.96\" height=\"14.99\" maskUnits=\"userSpaceOnUse\"><g transform=\"translate(-5 0)\"><g><polygon points=\"6.36 9.02 15.32 9.02 15.32 24 6.36 24 6.36 9.02\" fill=\"${fill}\" fill-rule=\"evenodd\"/></g></g></mask><mask id=\"bef32b73-e93e-4a9d-8af1-256f183b6298\" x=\"0\" y=\"0\" width=\"12.75\" height=\"7.01\" maskUnits=\"userSpaceOnUse\"><g transform=\"translate(-5 0)\"><g><polygon points=\"5 0 17.75 0 17.75 7.01 5 7.01 5 0\" fill=\"${fill}\" fill-rule=\"evenodd\"/></g></g></mask></defs><g><g><g><g mask=\"url(#af3fd981-53b8-46f6-a894-5f91767dff75)\"><path d=\"M13,16.15a6.72,6.72,0,0,1,.51-2.23,20.73,20.73,0,0,1,1.11-2.39,3,3,0,0,0-.49-.46A3.51,3.51,0,0,1,12.8,9H8.74l-.23.18a6.38,6.38,0,0,0-2,3.29,41,41,0,0,0,0,7.18,6.22,6.22,0,0,0,1.9,4.22.47.47,0,0,0,.32.12h5.61a.47.47,0,0,0,.38-.36q.3-1.14.51-2.1l.08-.39h-.06a6.54,6.54,0,0,1-2.28-5\" transform=\"translate(-5 0)\" fill=\"${fill}\" fill-rule=\"evenodd\"/></g></g><path d=\"M21.1,17.53a3.4,3.4,0,0,1-1.84,1.28l-.64-2.09a2.1,2.1,0,0,0,1-.62A1.94,1.94,0,0,0,20,15l1.9.15a4.07,4.07,0,0,1-.78,2.36M19.06,8a40.76,40.76,0,0,0-2.9,4.65,15.48,15.48,0,0,0-.72,1.61,4.21,4.21,0,0,0,1.27,4.91,3.56,3.56,0,0,0,1.36.71,3.34,3.34,0,0,0,1,.14A4.11,4.11,0,0,0,23,15.76c0-1-.7-3.14-3.94-7.75\" transform=\"translate(-5 0)\" fill=\"${fill}\" fill-rule=\"evenodd\"/><g><g mask=\"url(#bef32b73-e93e-4a9d-8af1-256f183b6298)\"><path d=\"M8.69,7h4.12a5.75,5.75,0,0,1,.45-2.39A5.2,5.2,0,0,0,15.72,6a2.6,2.6,0,0,0,.88,0l.29-.53c0-.24-.33-.32-.52-.49A5.37,5.37,0,0,1,14.9,2.81a9.42,9.42,0,0,1,2-.81l.88-.33V0H9.12A6.08,6.08,0,0,0,5,3.51c1.88.32,3.69.56,3.69,3.5\" transform=\"translate(-5 0)\" fill=\"${fill}\" fill-rule=\"evenodd\"/></g></g></g></g></svg>`,\r\n [IAlertBannerIconTypes.Storefront]: (fill: string) =>\r\n `<svg class=\"${content.icons.baseClass} ${content.icons.infoIconClass}\" width=\"${content.icons.width}\" height=\"${content.icons.height}\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 21\" aria-hidden=\"true\"><g><g><path d=\"M12,1.5l8.25,8.39H24V22.5H0V17.19H6V22.5H8V13.18l4-4.12,4,4.12V22.5h2V17.19h6v-2H18V12.36L12,6.21,6,12.36v2.83H0V9.89H3.75Z\" transform=\"translate(0 -1.5)\" fill=\"${fill}\" fill-rule=\"evenodd\"/></g></g></svg>`,\r\n [IAlertBannerIconTypes.Close]: (fill: string) =>\r\n `<svg fill=\"${fill}\" class=\"${content.icons.closeIconClass}\" width=\"${content.closeButton.iconWidth}\" height=\"${content.closeButton.iconHeight}\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\"><path d=\"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\"></path><path d=\"M0 0h24v24H0z\" fill=\"none\"></path></svg>`,\r\n};\r\n","import { constants } from './constants';\r\nimport { IDismissedAlertBanners, IDismissedAlertBannerLocalStorage } from './types';\r\n\r\nexport const getDismissedAlertBanners = (): IDismissedAlertBanners => {\r\n const dismissedAlertBannersLocalStorage = getDismissedAlertBannersLocalStorage();\r\n const unExpiredDismissedAlertBanners = getUnExpiredDismissedAlertBanners(dismissedAlertBannersLocalStorage);\r\n\r\n setDismissedAlertBannersLocalStorage(unExpiredDismissedAlertBanners);\r\n\r\n const dismissedAlertBanners = buildDismissedAlertBanners(unExpiredDismissedAlertBanners);\r\n return dismissedAlertBanners;\r\n};\r\n\r\nexport const addDismissedAlertBanner = (id: string): void => {\r\n const dismissedAlertBannersLocalStorage = getDismissedAlertBannersLocalStorage();\r\n let unExpiredDismissedAlertBanners = getUnExpiredDismissedAlertBanners(dismissedAlertBannersLocalStorage);\r\n\r\n unExpiredDismissedAlertBanners = removeMatchingBanners(id, unExpiredDismissedAlertBanners);\r\n unExpiredDismissedAlertBanners.push({\r\n id: id,\r\n expires: new Date().getTime() + constants.DISMISSED_ALERT_BANNER_LOCAL_STORAGE_EXPIRATION,\r\n });\r\n unExpiredDismissedAlertBanners = limitBannerCount(unExpiredDismissedAlertBanners);\r\n\r\n setDismissedAlertBannersLocalStorage(unExpiredDismissedAlertBanners);\r\n};\r\n\r\nconst buildDismissedAlertBanners = (\r\n dismissedAlertBannersLocalStorage: IDismissedAlertBannerLocalStorage[]\r\n): IDismissedAlertBanners => {\r\n let dismissedAlertBanners: IDismissedAlertBanners = { allIds: [], byId: {} };\r\n\r\n dismissedAlertBannersLocalStorage.forEach((dismissedAlertBanner: IDismissedAlertBannerLocalStorage) => {\r\n dismissedAlertBanners.allIds.push(dismissedAlertBanner.id);\r\n dismissedAlertBanners.byId[dismissedAlertBanner.id] = { expires: dismissedAlertBanner.expires };\r\n });\r\n\r\n return dismissedAlertBanners;\r\n};\r\n\r\nconst limitBannerCount = (\r\n dismissedAlertBannersLocalStorage: IDismissedAlertBannerLocalStorage[]\r\n): IDismissedAlertBannerLocalStorage[] => {\r\n if (dismissedAlertBannersLocalStorage.length > constants.MAXIMUM_LOCAL_STORAGE_DISMISSED_BANNERS) {\r\n dismissedAlertBannersLocalStorage.sort(\r\n ({ expires: a }: IDismissedAlertBannerLocalStorage, { expires: b }: IDismissedAlertBannerLocalStorage) =>\r\n b - a\r\n );\r\n dismissedAlertBannersLocalStorage.pop();\r\n }\r\n\r\n return dismissedAlertBannersLocalStorage;\r\n};\r\n\r\nconst removeMatchingBanners = (\r\n id: string,\r\n dismissedAlertBannersLocalStorage: IDismissedAlertBannerLocalStorage[]\r\n): IDismissedAlertBannerLocalStorage[] => {\r\n let matchingDismissedAlertBannerIndex = -1;\r\n dismissedAlertBannersLocalStorage.forEach((dismissedAlertBanner: IDismissedAlertBannerLocalStorage, index) => {\r\n if (dismissedAlertBanner.id === id) {\r\n matchingDismissedAlertBannerIndex = index;\r\n }\r\n });\r\n if (matchingDismissedAlertBannerIndex > -1) {\r\n dismissedAlertBannersLocalStorage.splice(\r\n matchingDismissedAlertBannerIndex,\r\n matchingDismissedAlertBannerIndex + 1\r\n );\r\n }\r\n return dismissedAlertBannersLocalStorage;\r\n};\r\n\r\nconst getUnExpiredDismissedAlertBanners = (\r\n dismissedAlertBanners: IDismissedAlertBannerLocalStorage[]\r\n): IDismissedAlertBannerLocalStorage[] => {\r\n let currentTime = new Date().getTime(),\r\n unExpiredDismissedAlertBanners: IDismissedAlertBannerLocalStorage[] = [];\r\n\r\n dismissedAlertBanners.forEach((dismissedAlertBanner: IDismissedAlertBannerLocalStorage) => {\r\n if (dismissedAlertBanner.expires && dismissedAlertBanner.expires > currentTime) {\r\n unExpiredDismissedAlertBanners.push(dismissedAlertBanner);\r\n }\r\n });\r\n\r\n return unExpiredDismissedAlertBanners;\r\n};\r\n\r\nconst getDismissedAlertBannersLocalStorage = (): IDismissedAlertBannerLocalStorage[] => {\r\n try {\r\n let serializedDismissedAlertBanners: string | null = localStorage.getItem(\r\n constants.DISMISSED_ALERT_BANNERS_LOCAL_STORAGE_KEY\r\n );\r\n\r\n if (serializedDismissedAlertBanners) {\r\n let dismissedAlertBannersLocalStorage: IDismissedAlertBannerLocalStorage[] = JSON.parse(\r\n serializedDismissedAlertBanners\r\n );\r\n\r\n return dismissedAlertBannersLocalStorage ? dismissedAlertBannersLocalStorage : [];\r\n }\r\n return [];\r\n } catch (e) {\r\n console.error('Error getting dismissed alert banner ids from localStorage: ', e);\r\n return [];\r\n }\r\n};\r\n\r\nconst setDismissedAlertBannersLocalStorage = (dismissedAlertBanners: IDismissedAlertBannerLocalStorage[]): void => {\r\n try {\r\n localStorage.setItem(\r\n constants.DISMISSED_ALERT_BANNERS_LOCAL_STORAGE_KEY,\r\n JSON.stringify(dismissedAlertBanners)\r\n );\r\n } catch (e) {\r\n console.error('Error setting dismissed alert banner ids to localStorage: ', e);\r\n }\r\n};\r\n","import { Store } from '../../types/store';\r\nimport { IAlertBannerData, IRegisterAlertBannersEventDetail, IAlertBannerNearestStoreRuleType } from './types';\r\nimport { constants } from './constants';\r\n\r\nexport const attachRegisterAlertBannersEventListener = (\r\n handleRegisterAlertBannersEvent: (alertBanners: IAlertBannerData[]) => any\r\n): void => {\r\n document.documentElement.addEventListener(constants.REGISTER_ALERT_BANNERS_CUSTOM_EVENT, ((event: CustomEvent) => {\r\n const eventDetail: IRegisterAlertBannersEventDetail = event.detail;\r\n\r\n if (eventDetail.alertBanners && eventDetail.alertBanners.length > 0) {\r\n handleRegisterAlertBannersEvent(eventDetail.alertBanners);\r\n }\r\n }) as EventListener);\r\n};\r\n\r\nexport const attachStoreChangeEventHandler = (handleStoreChangeEvent: (store: Store) => any) => {\r\n var event = new CustomEvent('kmxSubscribeToMyStoreModuleUpdates', {\r\n detail: {\r\n done: handleStoreChangeEvent,\r\n },\r\n });\r\n document.documentElement.dispatchEvent(event);\r\n};\r\n\r\nexport const attachHistoryPushStateEventHandler = (handleHistoryPushStateEvent: () => any) => {\r\n let pushState = history.pushState;\r\n history.pushState = function() {\r\n (pushState as any).apply(history, arguments);\r\n handleHistoryPushStateEvent();\r\n };\r\n};\r\n\r\nconst pathnameFilter = (pathname: string, pathnameRegexList: RegExp[]) => {\r\n let matchFound = false;\r\n pathnameRegexList.forEach(pathnameRegex => {\r\n if (!matchFound) {\r\n const match = pathname.match(pathnameRegex);\r\n matchFound = match && match.length > 0 ? true : false;\r\n }\r\n });\r\n return matchFound;\r\n};\r\n\r\nconst includedNearestStoreIdsFilter = (nearestStoreId: Store['Id'], includedNearestStoreIds: Store['Id'][] = []) => {\r\n return includedNearestStoreIds.length > 0 ? includedNearestStoreIds.indexOf(nearestStoreId) > -1 : true;\r\n};\r\n\r\nconst notExcludedNearestStoreIdsFilter = (nearestStoreId: Store['Id'], excludedNearestStoreIds: Store['Id'][] = []) => {\r\n return excludedNearestStoreIds.length > 0 ? excludedNearestStoreIds.indexOf(nearestStoreId) === -1 : true;\r\n};\r\n\r\nconst nearestStoreFilter = (alertBanner: IAlertBannerData, nearestStoreId: Store['Id']): boolean => {\r\n return alertBanner.nearestStoreRules &&\r\n alertBanner.nearestStoreRules.type === IAlertBannerNearestStoreRuleType.Inclusion\r\n ? includedNearestStoreIdsFilter(nearestStoreId, alertBanner.nearestStoreRules.list)\r\n : alertBanner.nearestStoreRules &&\r\n alertBanner.nearestStoreRules.type === IAlertBannerNearestStoreRuleType.Exclusion\r\n ? notExcludedNearestStoreIdsFilter(nearestStoreId, alertBanner.nearestStoreRules.list)\r\n : true;\r\n};\r\n\r\nexport const getPathname = (): string => {\r\n return (window as any).location.pathname;\r\n};\r\n\r\nexport const findMatchingAlertBanners = (\r\n alertBanners: IAlertBannerData[],\r\n pathname: string,\r\n nearestStoreId: Store['Id']\r\n): IAlertBannerData[] => {\r\n const matchingAlertBanners = alertBanners\r\n .filter(alertBanner => isValidAlertBanner(alertBanner))\r\n .filter(alertBanner => pathnameFilter(pathname, alertBanner.pathnameRegexList))\r\n .filter(alertBanner => nearestStoreFilter(alertBanner, nearestStoreId));\r\n\r\n return matchingAlertBanners;\r\n};\r\n\r\nexport const isValidAlertBanner = (alertBanner: IAlertBannerData): boolean => {\r\n return alertBanner.id &&\r\n alertBanner.body &&\r\n alertBanner.previousSiblingElSelector &&\r\n alertBanner.pathnameRegexList &&\r\n alertBanner.pathnameRegexList.length > 0 &&\r\n alertBanner.pathnameRegexList[0].test !== undefined\r\n ? true\r\n : false;\r\n};\r\n\r\nexport const renderTextWithStoreName = (stringWithTemplates: string, store: Store): string => {\r\n return stringWithTemplates.replace(constants.STORE_DISPLAY_NAME_TEMPLATE, store.Name);\r\n};\r\n","import { IAlertBannerData, IAlertBannerTypes, IAlertBannerIconTypes } from './types';\r\nimport { content, icons } from './constants';\r\nimport * as storage from './storage';\r\nimport * as utils from './utils';\r\nimport { Store } from '../../types/store';\r\n\r\nexport interface IAlertBanner {\r\n init(): void;\r\n}\r\n\r\nexport default class AlertBanner implements IAlertBanner {\r\n private _nearestStore: Store | null;\r\n private _alertBannerDataList: IAlertBannerData[];\r\n private _matchingAlertBanner: IAlertBannerData | null;\r\n private _isRendering: boolean;\r\n\r\n constructor() {\r\n this._nearestStore = null;\r\n this._alertBannerDataList = [];\r\n this._matchingAlertBanner = null;\r\n this._isRendering = false;\r\n\r\n this.handleRegisterAlertBannersEvent = this.handleRegisterAlertBannersEvent.bind(this);\r\n this.handleHistoryPushStateEvent = this.handleHistoryPushStateEvent.bind(this);\r\n this.handleStoreChangeEvent = this.handleStoreChangeEvent.bind(this);\r\n }\r\n\r\n private handleRegisterAlertBannersEvent(alertBannerDataList: IAlertBannerData[]): void {\r\n utils.attachHistoryPushStateEventHandler(this.handleHistoryPushStateEvent);\r\n this._alertBannerDataList = alertBannerDataList;\r\n this.updateBanner();\r\n }\r\n\r\n private handleHistoryPushStateEvent(): void {\r\n this.updateBanner();\r\n }\r\n\r\n private handleStoreChangeEvent(store: Store): void {\r\n if (!this._nearestStore || this._nearestStore.Id !== store.Id) {\r\n this._nearestStore = store;\r\n this.updateBanner();\r\n }\r\n }\r\n\r\n private updateBanner(): void {\r\n this._matchingAlertBanner = this.findMatchingBanner();\r\n\r\n if (this._matchingAlertBanner && this._nearestStore) {\r\n this.render(this._matchingAlertBanner, this._nearestStore);\r\n } else {\r\n this.removeBanner();\r\n }\r\n }\r\n\r\n private findMatchingBanner(): IAlertBannerData | null {\r\n let matchingAlertBanner = null;\r\n\r\n if (this._nearestStore) {\r\n const matchingAlertBanners = utils.findMatchingAlertBanners(\r\n this._alertBannerDataList,\r\n utils.getPathname(),\r\n this._nearestStore.Id\r\n );\r\n\r\n if (matchingAlertBanners.length === 1) {\r\n const bannerId = matchingAlertBanners[0].id;\r\n const dismissedAlertBanners = storage.getDismissedAlertBanners();\r\n\r\n if (dismissedAlertBanners.allIds.indexOf(bannerId) === -1) {\r\n matchingAlertBanner = matchingAlertBanners[0];\r\n }\r\n } else if (matchingAlertBanners.length > 1) {\r\n console.error('Multiple alert banners registered for page: ', matchingAlertBanners);\r\n }\r\n }\r\n\r\n return matchingAlertBanner;\r\n }\r\n\r\n private handleAlertBannerClose(id: IAlertBannerData['id']): void {\r\n this.removeBanner();\r\n storage.addDismissedAlertBanner(id);\r\n }\r\n\r\n private removeBanner(): void {\r\n const alertBanner = document.querySelector(`#${content.alertBanner.id}`);\r\n if (alertBanner && alertBanner.parentNode) {\r\n alertBanner.parentNode.removeChild(alertBanner);\r\n }\r\n }\r\n\r\n private render(alertBanner: IAlertBannerData, nearestStore: Store): void {\r\n if (!this._isRendering) {\r\n this._isRendering = true;\r\n let iconFill =\r\n alertBanner.type === IAlertBannerTypes.Dark\r\n ? content.icons.darkFill\r\n : alertBanner.type === IAlertBannerTypes.Urgent\r\n ? content.icons.urgentFill\r\n : content.icons.fill;\r\n let bannerThemeClass =\r\n alertBanner.type === IAlertBannerTypes.Dark\r\n ? content.alertBanner.darkClass\r\n : alertBanner.type === IAlertBannerTypes.Urgent\r\n ? content.alertBanner.urgentClass\r\n : '';\r\n let bannerSizeClass = !alertBanner.dismissable && !alertBanner.icon ? content.alertBanner.tallClass : '';\r\n\r\n const bannerHtml = `<aside id=\"${content.alertBanner.id}\" class=\"${bannerThemeClass} ${bannerSizeClass}\">\r\n <div class=\"${content.alertBanner.containerClass}\">\r\n <div class=\"${content.alertBanner.detailsClass}\">\r\n ${alertBanner.icon ? icons[alertBanner.icon](iconFill) : ''}\r\n <div class=\"${content.alertBanner.messageClass}\">\r\n <p class=\"${content.alertBanner.descriptionClass}\">${utils.renderTextWithStoreName(\r\n alertBanner.body,\r\n nearestStore\r\n )}</p>\r\n </div>\r\n </div>\r\n ${\r\n alertBanner.dismissable === false\r\n ? ''\r\n : `<button id=\"${content.closeButton.id}\" class=\"${\r\n content.closeButton.class\r\n }\" aria-haspopup=\"false\" aria-controls=\"alert-banner\" aria-label=\"Dismiss alert banner\">\r\n ${icons[IAlertBannerIconTypes.Close](content.closeButton.iconFill)}\r\n </button>`\r\n }\r\n </div>\r\n </aside>`;\r\n\r\n let existingBanner = document.querySelector(`#${content.alertBanner.id}`);\r\n if (existingBanner) {\r\n this.removeBanner();\r\n }\r\n\r\n let previousSiblingEl = document.querySelector(alertBanner.previousSiblingElSelector);\r\n if (previousSiblingEl) {\r\n previousSiblingEl.insertAdjacentHTML('afterend', bannerHtml);\r\n const alertBannerCloseButton = document.querySelector(\r\n `#${content.alertBanner.id} #${content.closeButton.id}`\r\n ) as HTMLElement;\r\n if (alertBannerCloseButton) {\r\n let id = alertBanner.id;\r\n alertBannerCloseButton.onclick = () => {\r\n this.handleAlertBannerClose(id);\r\n };\r\n }\r\n }\r\n this._isRendering = false;\r\n }\r\n }\r\n\r\n public init(): void {\r\n utils.attachRegisterAlertBannersEventListener(this.handleRegisterAlertBannersEvent);\r\n utils.attachStoreChangeEventHandler(this.handleStoreChangeEvent);\r\n }\r\n}\r\n","import InventorySearch from '../components/search/InventorySearch';\r\nimport MoreLinksMenu from '../components/navigation/moreLinksMenu';\r\nimport MyProfileMenu from '../components/myKmx/myProfileMenu';\r\nimport NearestStore from '../components/nearestStore/NearestStore';\r\nimport StoreHourMenu from '../components/storeHours/storeHourMenu';\r\n\r\ninterface IComponentsMap {\r\n [componentName: string]:\r\n | NearestStore\r\n | MoreLinksMenu\r\n | MyProfileMenu\r\n | InventorySearch\r\n | StoreHourMenu;\r\n}\r\nexport type ComponentsMap = IComponentsMap;\r\n\r\ninterface IEventTargetData {\r\n isTarget: boolean;\r\n eventType: string;\r\n event: Event | TouchEvent;\r\n components: ComponentsMap;\r\n style?:any;\r\n}\r\nexport type EventTargetData = IEventTargetData;\r\n\r\ninterface IEventTarget {\r\n selector: string;\r\n exceptions?: string[] | any;\r\n done: (eventTargetData: EventTargetData) => any;\r\n}\r\nexport type EventTarget = IEventTarget;\r\n\r\nexport interface IEventHandler {\r\n selector: string;\r\n eventType: string;\r\n targets: EventTarget[];\r\n}\r\nexport type EventHandler = IEventHandler;\r\n\r\nexport interface IEvents {\r\n components: ComponentsMap;\r\n addEventListenerWithDelegation(eventHandler: EventHandler, eventHandlerEl: Element): void;\r\n addEventHandlers(eventHandlerList: EventHandler[]): void;\r\n}\r\n\r\nexport default class Events implements IEvents {\r\n components: IEvents['components'];\r\n\r\n constructor(components: IEvents['components']) {\r\n this.components = components;\r\n }\r\n\r\n isException(target:HTMLElement,exceptions: Array<string>) {\r\n if ( exceptions ) {\r\n return exceptions.some(i=>{\r\n return target.closest(i)\r\n })\r\n }\r\n }\r\n\r\n addEventListenerWithDelegation(eventHandler: EventHandler, eventHandlerEl: Element | Window) {\r\n const eventHandlerElement = eventHandlerEl as Element;\r\n eventHandlerElement.addEventListener(eventHandler.eventType, e => {\r\n if(eventHandler.selector === \"window\"){\r\n eventHandler.targets[0].done({\r\n isTarget: true,\r\n eventType: eventHandler.eventType,\r\n event: e,\r\n components: this.components,\r\n });\r\n }\r\n else{\r\n for (let i = 0; i < eventHandler.targets.length; i++) {\r\n let isTarget = !!(e && e.target && (<HTMLElement>e.target).closest(eventHandler.targets[i].selector)|| this.isException(<HTMLElement>e.target,eventHandler.targets[i].exceptions));\r\n eventHandler.targets[i].done({\r\n isTarget: isTarget,\r\n eventType: eventHandler.eventType,\r\n event: e,\r\n components: this.components,\r\n });\r\n }\r\n }\r\n });\r\n }\r\n\r\n addEventHandlers(eventHandlerList: EventHandler[]): void {\r\n eventHandlerList.forEach((eventHandler: EventHandler) => {\r\n if(eventHandler.selector === \"window\"){\r\n this.addEventListenerWithDelegation(eventHandler, window);\r\n }\r\n else{\r\n const eventHandlerEl = document.querySelector(eventHandler.selector);\r\n if (eventHandlerEl) {\r\n this.addEventListenerWithDelegation(eventHandler, eventHandlerEl);\r\n }\r\n }\r\n\r\n });\r\n }\r\n}\r\n","import { EventTargetData } from './events';\r\n\r\nexport const waitToUpdateMenuState = (done: () => any): void => {\r\n window.setTimeout(() => {\r\n done();\r\n }, 0);\r\n};\r\n\r\nexport const isDuplicateClickEvent = (\r\n clickedElementsList: string[],\r\n elName: string,\r\n eventType: EventTargetData['eventType']\r\n) => {\r\n let touchedElementIndex = clickedElementsList.indexOf(elName);\r\n if (touchedElementIndex > -1) {\r\n clickedElementsList.splice(touchedElementIndex, 1);\r\n return eventType === 'click';\r\n } else {\r\n if (eventType === 'touchend') {\r\n clickedElementsList.push(elName);\r\n }\r\n return false;\r\n }\r\n};\r\n","import * as savedCarsButton from '../components/myKmx/savedCarsButton';\r\nimport * as utils from './utils';\r\nimport * as careers from '../components/navigation/CareersLink';\r\nimport InventorySearch from '../components/search/InventorySearch';\r\nimport MoreLinksMenu from '../components/navigation/moreLinksMenu';\r\nimport MyProfileMenu from '../components/myKmx/myProfileMenu';\r\nimport NearestStore from '../components/nearestStore/NearestStore';\r\nimport { content } from '../content';\r\nimport { EventTarget } from './events';\r\nimport StoreHourMenu from '../components/storeHours/storeHourMenu';\r\nimport { MENU_CLASSES } from '../components/menu/constants';\r\n\r\nlet clickedElementsList: string[] = [];\r\n\r\nexport const clickOutsideEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.MOBILE_NAV.menuId}`,\r\n done: eventTargetData => {\r\n if (!eventTargetData.isTarget ) {\r\n let mobileNavOpenEl = document.querySelector(\r\n `.${content.MOBILE_NAV.drawer.defaultClass}.${MENU_CLASSES.menuOpen}`\r\n ) as HTMLElement;\r\n\r\n if (mobileNavOpenEl) {\r\n careers.setDesktopContent();\r\n }\r\n (eventTargetData.components['moreLinksMenu'] as MoreLinksMenu).handleCloseButtonClick();\r\n }\r\n },\r\n },\r\n {\r\n selector: `.${content.HEADER_MY_STORE.sectionClass}`,\r\n done: eventTargetData => {\r\n if (!eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleClickOutside('header');\r\n }\r\n },\r\n },\r\n {\r\n selector: `.${content.FOOTER_MY_STORE.sectionClass}`,\r\n done: eventTargetData => {\r\n if (!eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleClickOutside('footer');\r\n }\r\n },\r\n },\r\n {\r\n selector: `.${content.MY_PROFILE.sectionClass}`,\r\n done: eventTargetData => {\r\n if (!eventTargetData.isTarget) {\r\n (eventTargetData.components['myProfileMenu'] as MyProfileMenu).handleClickOutside();\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.HEADER_SEARCH.id}`,\r\n done: eventTargetData => {\r\n if (!eventTargetData.isTarget) {\r\n (eventTargetData.components['inventorySearch'] as InventorySearch).handleClickOutside();\r\n }\r\n },\r\n },\r\n];\r\n\r\nexport const headerInputEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.HEADER_SEARCH.formId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['inventorySearch'] as InventorySearch).handleInput(eventTargetData.event);\r\n }\r\n },\r\n },\r\n];\r\n\r\nexport const headerKeydownEventTargets: EventTarget[] = [\r\n\r\n {\r\n selector: `#${content.MORE_LINKS.button.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['moreLinksMenu'] as MoreLinksMenu).handleOpenButtonKeydown(\r\n eventTargetData.event as KeyboardEvent\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.MORE_LINKS.menuId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['moreLinksMenu'] as MoreLinksMenu).handleMenuKeydown(\r\n eventTargetData.event as KeyboardEvent\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.HEADER_MY_STORE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleButtonKeydown(\r\n eventTargetData.event as KeyboardEvent,\r\n 'header'\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.HEADER_MY_STORE.menuId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleMenuKeydown(\r\n eventTargetData.event as KeyboardEvent,\r\n 'header'\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.MY_PROFILE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['myProfileMenu'] as MyProfileMenu).handleOpenButtonKeydown(\r\n eventTargetData.event as KeyboardEvent\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.MY_PROFILE.menuId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['myProfileMenu'] as MyProfileMenu).handleMenuKeydown(\r\n eventTargetData.event as KeyboardEvent\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.HEADER_SEARCH.input.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['inventorySearch'] as InventorySearch).handleInputKeydown(\r\n event as KeyboardEvent\r\n );\r\n }\r\n },\r\n },\r\n];\r\n\r\nexport const headerSubmitEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.HEADER_SEARCH.formId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['inventorySearch'] as InventorySearch).handleSubmit(eventTargetData.event);\r\n }\r\n },\r\n },\r\n];\r\n\r\nexport const headerClickEventTargets: EventTarget[] = [\r\n {\r\n selector: `.${content.HEADER_FOOTER_FLYOUT_MENU.storeHoursButtonClass}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n if (\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n `.${content.HEADER_FOOTER_FLYOUT_MENU.storeHoursButtonClass}`,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n utils.waitToUpdateMenuState(() => {\r\n (eventTargetData.components['storeHourMenu'] as StoreHourMenu).handleStoreStatusButtonClick();\r\n });\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${MENU_CLASSES.backButton}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n if (\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n MENU_CLASSES.backButton,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.MORE_LINKS.button.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n if (\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n content.MORE_LINKS.button.id,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n (eventTargetData.components['moreLinksMenu'] as MoreLinksMenu).handleOpenButtonClick();\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.HEADER_MY_STORE.buttonId}`,\r\n done: eventTargetData => {\r\n if (\r\n eventTargetData.isTarget &&\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n content.HEADER_MY_STORE.buttonId,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n (eventTargetData.components['nearestStore'] as NearestStore).toggle(eventTargetData.isTarget, 'header');\r\n },\r\n },\r\n {\r\n selector: `#${content.MY_PROFILE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n if (\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n content.MY_PROFILE.buttonId,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n (eventTargetData.components['myProfileMenu'] as MyProfileMenu).handleOpenButtonClick();\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.SAVED_CARS_BUTTON.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n if (\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n content.SAVED_CARS_BUTTON.id,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n savedCarsButton.handleClick();\r\n }\r\n }\r\n },\r\n {\r\n selector: `#${content.HEADER_SEARCH.input.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget && eventTargetData.eventType === 'click') {\r\n (eventTargetData.components['inventorySearch'] as InventorySearch).handleInput(eventTargetData.event);\r\n }\r\n }\r\n },\r\n {\r\n selector: `#${content.HEADER.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget && eventTargetData.eventType === 'click') {\r\n (eventTargetData.components['inventorySearch'] as InventorySearch).handleClickOutside()\r\n }\r\n }\r\n }\r\n];\r\n\r\nexport const headerMouseoverEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.MORE_LINKS.button.id}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['moreLinksMenu'] as MoreLinksMenu).handleMouseover();\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.HEADER_MY_STORE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleMouseover();\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.MY_PROFILE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['myProfileMenu'] as MyProfileMenu).handleMouseover();\r\n }\r\n },\r\n },\r\n];\r\n\r\nexport const footerClickEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.FOOTER_MY_STORE.buttonId}`,\r\n done: eventTargetData => {\r\n if (\r\n eventTargetData.isTarget &&\r\n utils.isDuplicateClickEvent(\r\n clickedElementsList,\r\n content.FOOTER_MY_STORE.buttonId,\r\n eventTargetData.eventType\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n (eventTargetData.components['nearestStore'] as NearestStore).toggle(eventTargetData.isTarget, 'footer');\r\n },\r\n },\r\n];\r\n\r\nexport const footerKeydownEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.FOOTER_MY_STORE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleButtonKeydown(\r\n eventTargetData.event as KeyboardEvent,\r\n 'footer'\r\n );\r\n }\r\n },\r\n },\r\n {\r\n selector: `#${content.FOOTER_MY_STORE.menuId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleMenuKeydown(\r\n eventTargetData.event as KeyboardEvent,\r\n 'footer'\r\n );\r\n }\r\n },\r\n },\r\n];\r\n\r\nexport const footerMouseoverEventTargets: EventTarget[] = [\r\n {\r\n selector: `#${content.FOOTER_MY_STORE.buttonId}`,\r\n done: eventTargetData => {\r\n if (eventTargetData.isTarget) {\r\n (eventTargetData.components['nearestStore'] as NearestStore).handleMouseover();\r\n }\r\n },\r\n },\r\n];\r\n","import { content } from '../../content';\r\n\r\nconst buildDesktopCareersLink : any = () => {\r\n let careersListItem = document.createElement('li');\r\n careersListItem.className = content.MORE_LINKS.careersLink.desktop.class;\r\n careersListItem.setAttribute('role','menuitem')\r\n careersListItem.setAttribute('tabindex','-1')\r\n careersListItem.innerHTML = content.MORE_LINKS.careersLink.desktop.innerHTML;\r\n return careersListItem;\r\n}\r\n\r\nconst addDesktopCareersLink = () => {\r\n let moreMenuList = document.querySelector('#header-helpful-links-menu .header-footer-menu-list') as HTMLElement;\r\n let careersLink = document.querySelector('#header-helpful-links-menu .header-link__careers-link') as HTMLElement;\r\n\r\n if(moreMenuList && !careersLink) {\r\n moreMenuList.appendChild(buildDesktopCareersLink());\r\n }\r\n}\r\n\r\nconst buildMobileCareersLink = () => {\r\n let careersLink = document.createElement('a');\r\n let linkText = document.createTextNode(`${content.MORE_LINKS.careersLink.label}`);\r\n careersLink.id = content.MORE_LINKS.careersLink.mobile.id;\r\n careersLink.className = content.MORE_LINKS.careersLink.mobile.class;\r\n careersLink.href = content.MORE_LINKS.careersLink.href;\r\n careersLink.setAttribute(\"data-dialog\", \"focus-end\");\r\n careersLink.appendChild(linkText);\r\n return careersLink;\r\n}\r\n\r\nconst addMobileCareersLink = () => {\r\n let moreLinksSection = document.querySelector('#header-helpful-links-menu .header-footer-menu-list') as HTMLElement;\r\n let careersLink = document.querySelector('#header-helpful-links-menu .header-link__careers-link') as HTMLElement;\r\n\r\n if(moreLinksSection && !careersLink) {\r\n moreLinksSection.append(buildMobileCareersLink());\r\n }\r\n}\r\n\r\nexport const setMobileContent = () => {\r\n removeCareersLinks();\r\n addMobileCareersLink();\r\n}\r\n\r\nexport const setDesktopContent = () => {\r\n removeCareersLinks();\r\n addDesktopCareersLink();\r\n}\r\n\r\nconst removeCareersLinks = () => {\r\n let careersLink = document.querySelector('.header-link__careers-link') as HTMLElement;\r\n if(careersLink) {\r\n careersLink.remove();\r\n }\r\n}\r\n","import { content, links } from '../../content';\r\nimport * as cookie from '../../storage/cookie';\r\nimport * as environment from '../../utils/environment';\r\n\r\nexport const render = (): void => {\r\n const navRightSectionEl = document.querySelector(`#${content.HEADER.id} .${content.HEADER.navRight.class}`);\r\n const savedCarsButtonEl = document.querySelector(`#${content.HEADER.id} #${content.SAVED_CARS_BUTTON.id}`);\r\n\r\n if (navRightSectionEl && savedCarsButtonEl) {\r\n if (cookie.isAuthenticated() || cookie.hasSignedIn()) {\r\n savedCarsButtonEl.classList.add(content.SAVED_CARS_BUTTON.visibleClass);\r\n navRightSectionEl.classList.add(content.HEADER.navRight.loggedInClass);\r\n } else {\r\n savedCarsButtonEl.classList.remove(content.SAVED_CARS_BUTTON.visibleClass);\r\n navRightSectionEl.classList.remove(content.HEADER.navRight.loggedInClass);\r\n }\r\n }\r\n return undefined;\r\n};\r\n\r\nexport const handleClick = (windowRef: Window = window): void => {\r\n windowRef.location.href =\r\n environment.getCarMaxBaseUrl() +\r\n (cookie.isAuthenticated() || cookie.hasSignedIn() ? links.savedCars.href : links.watchlist.href);\r\n};\r\n","import * as eventTargets from './eventTargets';\r\nimport { content } from '../content';\r\nimport { EventHandler } from './events';\r\n\r\nconst clickOutsideEventHandler: EventHandler = {\r\n selector: 'body',\r\n eventType: 'click',\r\n targets: eventTargets.clickOutsideEventTargets,\r\n};\r\n\r\nconst headerInputEventHandler: EventHandler = {\r\n selector: `#${content.HEADER.id}`,\r\n eventType: 'input',\r\n targets: eventTargets.headerInputEventTargets,\r\n};\r\n\r\nconst headerKeydownEventHandler: EventHandler = {\r\n selector: `#${content.HEADER.id}`,\r\n eventType: 'keydown',\r\n targets: eventTargets.headerKeydownEventTargets,\r\n};\r\n\r\nconst headerSubmitEventHandler: EventHandler = {\r\n selector: `#${content.HEADER.id}`,\r\n eventType: 'submit',\r\n targets: eventTargets.headerSubmitEventTargets,\r\n};\r\n\r\nconst headerClickEventHandler: EventHandler = {\r\n selector: `#${content.HEADER.id}`,\r\n eventType: 'click',\r\n targets: eventTargets.headerClickEventTargets,\r\n};\r\n\r\nconst headerTouchendEventHandler: EventHandler = {\r\n selector: `#${content.HEADER.id}`,\r\n eventType: 'touchend',\r\n targets: eventTargets.headerClickEventTargets,\r\n};\r\n\r\nconst headerMouseoverEventHandler: EventHandler = {\r\n selector: `#${content.HEADER.id}`,\r\n eventType: 'mouseover',\r\n targets: eventTargets.headerMouseoverEventTargets,\r\n};\r\n\r\nconst footerKeydownEventHandler: EventHandler = {\r\n selector: `#${content.FOOTER.id}`,\r\n eventType: 'keydown',\r\n targets: eventTargets.footerKeydownEventTargets,\r\n};\r\n\r\nconst footerClickEventHandler: EventHandler = {\r\n selector: `#${content.FOOTER.id}`,\r\n eventType: 'click',\r\n targets: eventTargets.footerClickEventTargets,\r\n};\r\n\r\nconst footerTouchendEventHandler: EventHandler = {\r\n selector: `#${content.FOOTER.id}`,\r\n eventType: 'touchend',\r\n targets: eventTargets.footerClickEventTargets,\r\n};\r\n\r\nconst footerMouseoverEventHandler: EventHandler = {\r\n selector: `#${content.FOOTER.id}`,\r\n eventType: 'mouseover',\r\n targets: eventTargets.footerMouseoverEventTargets,\r\n};\r\n\r\nexport const eventHandlerList: EventHandler[] = [\r\n clickOutsideEventHandler,\r\n headerInputEventHandler,\r\n headerKeydownEventHandler,\r\n headerSubmitEventHandler,\r\n headerTouchendEventHandler,\r\n headerMouseoverEventHandler,\r\n headerClickEventHandler,\r\n footerTouchendEventHandler,\r\n footerKeydownEventHandler,\r\n footerClickEventHandler,\r\n footerMouseoverEventHandler\r\n];\r\n","interface IOptions {\r\n url: string;\r\n apiKey?: string;\r\n withCredentials?: boolean;\r\n}\r\nexport type Options = IOptions;\r\n\r\nexport const get = (options: Options, success: (res: any) => any, error: (error: any) => any) => {\r\n if (success && typeof success === 'function' && error && typeof error === 'function') {\r\n try {\r\n let { url, apiKey, withCredentials } = options;\r\n let xhr = new XMLHttpRequest();\r\n xhr.open('GET', url);\r\n xhr.setRequestHeader('Accept', 'application/json');\r\n if (withCredentials) {\r\n xhr.withCredentials = withCredentials;\r\n }\r\n if (apiKey) {\r\n xhr.setRequestHeader('ApiKey', apiKey);\r\n }\r\n xhr.onreadystatechange = () => {\r\n if (xhr.readyState === 4) {\r\n if (xhr.status === 200 && xhr.response) {\r\n const response: any = JSON.parse(xhr.response);\r\n success(response);\r\n } else if (xhr.status === 204) {\r\n success(null);\r\n } else {\r\n error(xhr.response);\r\n }\r\n }\r\n };\r\n xhr.send();\r\n } catch (e) {\r\n error(e);\r\n }\r\n }\r\n};\r\n","import * as api from '../../api/api';\r\nimport { Options } from '../../api/api';\r\nimport { SearchResults, GetURLParams } from '../../types/search';\r\nimport { COOKIES, isAuthenticated } from '../../storage/cookie';\r\n\r\n\r\nexport type SearchSuggestionsApiResponse = SearchResults | null;\r\n\r\nexport const SEARCH_SUGGESTIONS_API = {\r\n uri: '/api/cars/suggestions?keyword='\r\n};\r\n\r\nconst getUserId = () => {\r\n if (isAuthenticated()) {\r\n const myKmxUserId = document.cookie.split(`${COOKIES.myKmx}=`)[1].split(';')[0];\r\n return `&${myKmxUserId}`;\r\n } else {\r\n return ''\r\n }\r\n};\r\n\r\nexport const getUrl = ({ search, params = '', userId }: GetURLParams): string =>\r\n SEARCH_SUGGESTIONS_API.uri + encodeURIComponent(search) + (params ? `&${params}` : '') + (userId ? userId : '');\r\n\r\nexport const getSearchSuggestions = (\r\n search: string,\r\n params: string,\r\n done: (searchSuggestionsApiResponse: SearchResults | null) => any\r\n) => {\r\n const options: Options = {\r\n url: getUrl({ search, params, userId: getUserId() }),\r\n withCredentials: true\r\n };\r\n api.get(\r\n options,\r\n function success(res) {\r\n done(res);\r\n },\r\n function error(e) {\r\n console.error('Error fetching search suggestions: ', e);\r\n done(null);\r\n }\r\n );\r\n};\r\n","export const isStockNumber = (val: string) => /^\\d{8,8}$/.test(val);\r\n\r\nexport const updateSearchId = () => {\r\n function generateUUID() {\r\n let d = new Date().getTime();\r\n\r\n if (window.performance && typeof window.performance.now === 'function') {\r\n d += window.performance.now();\r\n }\r\n\r\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\r\n let r = (d + Math.random() * 16) % 16 | 0;\r\n d = Math.floor(d / 16);\r\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\r\n });\r\n\r\n return uuid;\r\n }\r\n\r\n const uuid = generateUUID();\r\n const dData = (window as any).digitalData;\r\n localStorage.setItem('searchID', uuid);\r\n if (dData && dData.user && dData.user[0] && dData.user[0].attributes) {\r\n dData.user[0].attributes.searchID = uuid;\r\n }\r\n};\r\n\r\nexport const redirectToCarPage = (stockNumber: string, windowRef: Window = window) => {\r\n windowRef.location.assign('/car/' + stockNumber);\r\n};\r\n\r\nlet debounceTimerId: number;\r\nexport const debounce = (done: () => any, interval: number) => {\r\n window.clearTimeout(debounceTimerId);\r\n\r\n debounceTimerId = window.setTimeout(() => {\r\n done();\r\n }, interval);\r\n};\r\n","import AutocompleteListMenu from './AutocompleteListMenu';\r\nimport { MENU_CLASSES, NORMALIZED_KEYS, normalizeKey } from './constants';\r\n\r\nexport const handleInputKeydown = (event: KeyboardEvent, menu: AutocompleteListMenu) => {\r\n let key = normalizeKey(event.key);\r\n if (key) {\r\n switch (key) {\r\n case NORMALIZED_KEYS.ArrowDown:\r\n processArrows(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.ArrowUp:\r\n processArrows(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.Enter:\r\n handleInputEnter(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.Escape:\r\n handleInputEscape(menu);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleMenuOpen = (menu: AutocompleteListMenu) => {\r\n menu.inputEl.classList.add(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.add(MENU_CLASSES.menuOpen);\r\n menu.inputEl.setAttribute('aria-expanded', 'true');\r\n};\r\n\r\nexport const handleMenuClose = (menu: AutocompleteListMenu) => {\r\n removeListItemFocus(menu);\r\n menu.inputEl.classList.remove(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.remove(MENU_CLASSES.menuOpen);\r\n menu.inputEl.setAttribute('aria-expanded', 'false');\r\n};\r\n\r\nfunction handleInputEnter(event: KeyboardEvent, menu: AutocompleteListMenu) {\r\n let selectedEl = getSelectedListItem(menu);\r\n if (selectedEl) {\r\n event.preventDefault();\r\n const userInput = selectedEl.dataset.userInput;\r\n if (userInput) {\r\n setInputValue(menu, userInput);\r\n menu.inputEl.form?.submit();\r\n } else if (selectedEl.children.length > 0 && selectedEl.children[0].hasAttribute('href')) {\r\n (selectedEl.children[0] as HTMLAnchorElement).click();\r\n } else if (selectedEl.children.length > 0 && selectedEl.children[0].firstChild) {\r\n const label = selectedEl.children[0].firstChild.textContent as string;\r\n setInputValue(menu, label);\r\n } else {\r\n setInputValue(menu, menu.inputEl.value);\r\n }\r\n }\r\n menu.closeMenu();\r\n}\r\n\r\nfunction handleInputEscape(menu: AutocompleteListMenu) {\r\n setInputValue(menu, '');\r\n menu.closeMenu();\r\n}\r\n\r\nfunction removeListItemFocus(menu: AutocompleteListMenu) {\r\n let selectedEl = getSelectedListItem(menu);\r\n if (selectedEl) {\r\n selectedEl.classList.remove(MENU_CLASSES.menuItemFocus);\r\n selectedEl.setAttribute('tabindex', '-1');\r\n }\r\n else {\r\n return;\r\n }\r\n}\r\n\r\nfunction selectListItem(menu: AutocompleteListMenu, nextElement: HTMLElement) {\r\n removeListItemFocus(menu);\r\n if (nextElement) {\r\n nextElement.classList.add(MENU_CLASSES.menuItemFocus);\r\n nextElement.setAttribute('tabindex', '0');\r\n }\r\n}\r\n\r\nfunction processArrows(event: KeyboardEvent, menu: AutocompleteListMenu) {\r\n let { key } = event;\r\n event.preventDefault();\r\n let allListItems = menu.menuEl.querySelectorAll('.header-footer-menu-list-item.default-highlight');\r\n allListItems.forEach((item) => {\r\n item.classList.remove('default-highlight');\r\n });\r\n const selectedEl = menu.menuEl.querySelector('.header-footer-menu-list-item.focus') as HTMLElement;\r\n let listItems = menu.menuEl.querySelectorAll('.header-footer-menu-list-item');\r\n const array = Array.prototype.slice.call(listItems);\r\n const focusedIndex = [...array].findIndex(listItem => selectedEl === listItem);\r\n let listIndex = 0;\r\n if (listItems && selectedEl) {\r\n if (focusedIndex !== -1) {\r\n if (key === 'ArrowUp') {\r\n listIndex = focusedIndex === 0 ? listItems.length - 1 : focusedIndex - 1;\r\n } else {\r\n listIndex = focusedIndex === listItems.length - 1 ? 0 : focusedIndex + 1;\r\n }\r\n }\r\n selectListItem(menu, listItems.item(listIndex) as HTMLElement);\r\n }\r\n else {\r\n selectListItem(menu, listItems.item(0) as HTMLElement);\r\n }\r\n}\r\n\r\nfunction getSelectedListItem(menu: AutocompleteListMenu) {\r\n return menu.menuEl.querySelector(`.${MENU_CLASSES.menuItemFocus}`) as HTMLElement;\r\n}\r\n\r\nfunction setInputValue(menu: AutocompleteListMenu, text: string): void {\r\n menu.inputEl.value = text;\r\n menu.inputEl.setAttribute('value', text);\r\n}","export interface IMenu {\r\n inputEl?: HTMLInputElement;\r\n toggleButtonEl?: HTMLElement;\r\n menuEl: HTMLElement;\r\n open: boolean;\r\n keyboardHandler: any;\r\n openMenu(): void;\r\n closeMenu(): void;\r\n handleInputKeydown(event: KeyboardEvent): void;\r\n handleOpenButtonClick(): void;\r\n handleCloseButtonClick(): void;\r\n handleClickOutside(): void;\r\n handleOpenButtonKeydown(event: KeyboardEvent): void;\r\n handleCloseButtonKeydown(event: KeyboardEvent): void;\r\n handleMenuKeydown(event: KeyboardEvent): void;\r\n}\r\n\r\nexport default abstract class Menu implements IMenu {\r\n private _open: boolean;\r\n private _onMenuOpen?: () => any;\r\n private _onMenuClose?: () => any;\r\n\r\n constructor(onMenuOpen?: () => any, onMenuClose?: () => any) {\r\n this._open = false;\r\n if (onMenuOpen) {\r\n this._onMenuOpen = onMenuOpen;\r\n }\r\n if (onMenuClose) {\r\n this._onMenuClose = onMenuClose;\r\n }\r\n }\r\n\r\n abstract get menuEl(): HTMLElement;\r\n abstract get keyboardHandler(): any;\r\n\r\n public get open(): boolean {\r\n return this._open;\r\n }\r\n\r\n public openMenu(): void {\r\n this._open = true;\r\n (this.keyboardHandler as any).handleMenuOpen(this);\r\n if (this._onMenuOpen) {\r\n this._onMenuOpen();\r\n }\r\n }\r\n\r\n public closeMenu(): void {\r\n this._open = false;\r\n (this.keyboardHandler as any).handleMenuClose(this);\r\n if (this._onMenuClose) {\r\n this._onMenuClose();\r\n }\r\n }\r\n\r\n public handleInputKeydown(event: KeyboardEvent): void {\r\n (this.keyboardHandler as any).handleInputKeydown(event, this);\r\n }\r\n\r\n public handleOpenButtonClick(): void {\r\n this.open ? this.closeMenu() : this.openMenu();\r\n }\r\n\r\n public handleCloseButtonClick(): void {\r\n this._open = false;\r\n (this.keyboardHandler as any).handleMenuClose(this);\r\n }\r\n\r\n public handleClickOutside(): void {\r\n if (this.open) {\r\n this._open = false;\r\n (this.keyboardHandler as any).handleMenuClose(this);\r\n if (this._onMenuClose) {\r\n this._onMenuClose();\r\n }\r\n }\r\n }\r\n\r\n public handleOpenButtonKeydown(event: KeyboardEvent): void {\r\n (this.keyboardHandler as any).handleOpenButtonKeydown(event, this);\r\n }\r\n\r\n public handleCloseButtonKeydown(event: KeyboardEvent): void {\r\n (this.keyboardHandler as any).handleCloseButtonKeydown(event, this);\r\n }\r\n\r\n public handleMenuKeydown(event: KeyboardEvent): void {\r\n (this.keyboardHandler as any).handleMenuKeydown(event, this);\r\n }\r\n}\r\n","import * as autocompleteMenuHandler from './autocompleteMenuHandler';\r\nimport Menu from './Menu';\r\nimport { SearchResults, Suggestion } from '../../types/search';\r\n\r\nexport interface IAutocompleteListMenu {\r\n inputEl: HTMLInputElement;\r\n menuEl: HTMLElement;\r\n menuListEl?: HTMLElement;\r\n handleClickOutside(): void;\r\n clear(): void;\r\n}\r\n\r\nexport default abstract class AutocompleteListMenu extends Menu implements IAutocompleteListMenu {\r\n private _inputEl: HTMLInputElement;\r\n private _menuEl: HTMLElement;\r\n private _menuListEl: HTMLElement;\r\n private _keyboardHandler: any;\r\n\r\n constructor(\r\n inputEl: HTMLInputElement,\r\n menuEl: HTMLElement,\r\n menuListEl: HTMLElement,\r\n onMenuOpen?: () => any,\r\n onMenuClose?: () => any\r\n ) {\r\n super(onMenuOpen, onMenuClose);\r\n this._inputEl = inputEl;\r\n this._menuEl = menuEl;\r\n this._menuListEl = menuListEl;\r\n this._keyboardHandler = autocompleteMenuHandler;\r\n }\r\n\r\n get inputEl(): HTMLInputElement {\r\n return this._inputEl;\r\n }\r\n\r\n get menuEl(): HTMLElement {\r\n return this._menuEl;\r\n }\r\n\r\n get menuListEl(): HTMLElement | undefined {\r\n return this._menuListEl;\r\n }\r\n\r\n get keyboardHandler(): any {\r\n return this._keyboardHandler;\r\n }\r\n\r\n public abstract buildSuggestions(listItems: SearchResults): HTMLElement;\r\n public abstract buildIneligibleTermsAlternatesSuggestions(suggestions: Suggestion[]): HTMLElement;\r\n\r\n public handleClickOutside(): void {\r\n super.handleClickOutside();\r\n this.clear();\r\n }\r\n\r\n public render(listItems: SearchResults) {\r\n if (listItems) {\r\n if (this.menuListEl) {\r\n if (this.menuListEl.children.length > 0) {\r\n this.updateListMenu(listItems);\r\n } else {\r\n this.clear();\r\n this.createListMenu(listItems);\r\n }\r\n\r\n if (!this.open) {\r\n this.openMenu();\r\n }\r\n }\r\n } else {\r\n this.closeMenu();\r\n this.clear();\r\n }\r\n }\r\n\r\n public clear(): void {\r\n if (this.menuListEl) {\r\n this.menuEl.innerHTML = '';\r\n this.menuListEl.innerHTML = '';\r\n }\r\n }\r\n\r\n private createListMenu(listItems: SearchResults) {\r\n if (listItems) {\r\n if (listItems.ineligibleTermsAlternates && listItems.ineligibleTermsAlternates.length > 0) {\r\n this.buildIneligibleTermsAlternatesSuggestions(listItems.ineligibleTermsAlternates);\r\n }\r\n else {\r\n this.buildSuggestions(listItems);\r\n }\r\n }\r\n }\r\n\r\n private updateListMenu(listItems: SearchResults) {\r\n const suggestionsSearchListHtml = document.querySelector('suggestions');\r\n if (suggestionsSearchListHtml) {\r\n suggestionsSearchListHtml.innerHTML = '';\r\n this.createListMenu(listItems);\r\n }\r\n }\r\n}\r\n","import AutocompleteListMenu from '../menu/AutocompleteListMenu';\r\nimport { content } from '../../content';\r\nimport { QueryParameter, SearchResults, Results, Suggestion } from '../../types/search';\r\n\r\nexport default class SearchSuggestionsMenu extends AutocompleteListMenu {\r\n constructor(onMenuOpen?: () => any, onMenuClose?: () => any) {\r\n const inputEl = document.querySelector(\r\n `#${content.HEADER.id} #${content.HEADER_SEARCH.input.id}`\r\n ) as HTMLInputElement;\r\n const menuEl = document.querySelector(`#${content.HEADER.id} #${content.HEADER_SEARCH.menuId}`) as HTMLElement;\r\n const menuListEl = document.querySelector(\r\n `#${content.HEADER.id} #${content.HEADER_SEARCH.autocompleteList.id}`\r\n ) as HTMLElement;\r\n\r\n super(inputEl, menuEl, menuListEl, onMenuOpen, onMenuClose);\r\n }\r\n\r\n buildBaseListItem() {\r\n const listItemClassName = content.HEADER_SEARCH.autocompleteList.listItemClass;\r\n const listItemRole = content.HEADER_SEARCH.autocompleteList.listItemRole;\r\n const linkClassName = content.HEADER_SEARCH.autocompleteList.linkClass;\r\n const textClassName = content.HEADER_SEARCH.autocompleteList.textClass;\r\n const listItemLabel = document.createElement('div');\r\n const listItemEl = document.createElement('li');\r\n const link = document.createElement('a');\r\n listItemEl.setAttribute('role', listItemRole);\r\n listItemEl.className = listItemClassName;\r\n link.className = linkClassName;\r\n listItemLabel.className = textClassName;\r\n\r\n return { listItemEl, link, listItemLabel };\r\n }\r\n\r\n classifyResults(listItems: SearchResults) {\r\n const results: Results[] = (listItems.cognitiveResults && listItems.cognitiveResults.documentResult.results) || [];\r\n\r\n const classifiedResults: any = {\r\n articlesAndResearch: [],\r\n reviews: [],\r\n home: [],\r\n questionAndAnswer: {},\r\n };\r\n\r\n results.forEach((r) => {\r\n if (r.document.segment === 'research' || r.document.segment === 'articles') {\r\n classifiedResults.articlesAndResearch && classifiedResults.articlesAndResearch.push(r);\r\n }\r\n\r\n (classifiedResults[r.document.segment] || []).push(r);\r\n });\r\n\r\n if (listItems.cognitiveResults && listItems.cognitiveResults.answer) {\r\n classifiedResults.questionAndAnswer.query = listItems.cognitiveResults.query;\r\n classifiedResults.questionAndAnswer.answer = listItems.cognitiveResults.answer;\r\n }\r\n\r\n return classifiedResults;\r\n }\r\n\r\n buildSuggestions(listItems: SearchResults): HTMLElement {\r\n if (this.menuEl) {\r\n this.menuEl.innerHTML = '';\r\n }\r\n\r\n const userInput = this.inputEl.value.trim();\r\n\r\n if (userInput) {\r\n const listItem = this.buildSearchForListItem(userInput);\r\n this.menuEl?.appendChild(listItem);\r\n }\r\n\r\n const { articlesAndResearch, reviews, home, questionAndAnswer } = this.classifyResults(listItems);\r\n let hasNoSavedSearches = false;\r\n let hasNoRecentSearches = false;\r\n let hasNoFreeTextSearches = false;\r\n let hasNoArticlesAndResearch = articlesAndResearch.length === 0;\r\n const savedSearches = listItems.savedSearches;\r\n const recentSearches = listItems.recentSearches;\r\n const freeTextSearches = listItems.freeTextSearches;\r\n\r\n if (savedSearches && savedSearches.length > 0) {\r\n const sectionId = 'savedSearches';\r\n const savedSearchesHtml = this.createMenuSection(sectionId, 'Saved Searches');\r\n const savedSearchesListHtml = savedSearchesHtml.querySelector(`#${sectionId}`);\r\n savedSearches.forEach((savedSearch) => {\r\n const listItems = this.buildSavedSearchListItem(savedSearch.displayText, savedSearch.secondaryText, savedSearch.entityId);\r\n savedSearchesHtml && savedSearchesListHtml && savedSearchesListHtml.appendChild(listItems);\r\n });\r\n this.menuEl && this.menuEl.appendChild(savedSearchesHtml);\r\n }\r\n else {\r\n hasNoSavedSearches = true;\r\n }\r\n\r\n if (recentSearches && recentSearches.length > 0) {\r\n const sectionId = 'recentSearches';\r\n const recentSearchesHtml = this.createMenuSection(sectionId, 'Recent Searches');\r\n const recentSearchesListHtml = recentSearchesHtml.querySelector(`#${sectionId}`);\r\n recentSearches.forEach((recentSearch) => {\r\n const listItems = this.buildRecentSearchListItem(recentSearch.secondaryText as string, recentSearch.value, recentSearch.additionalQueryStringParameters);\r\n recentSearchesHtml && recentSearchesListHtml && recentSearchesListHtml.appendChild(listItems);\r\n })\r\n this.menuEl && this.menuEl.appendChild(recentSearchesHtml);\r\n }\r\n else {\r\n hasNoRecentSearches = true;\r\n }\r\n\r\n if (freeTextSearches && freeTextSearches.length > 0) {\r\n const sectionId = 'suggestions';\r\n const suggestionsSearchesHtml = this.createMenuSection(sectionId, 'Search');\r\n const suggestionsSearchesListHtml = suggestionsSearchesHtml.querySelector(`#${sectionId}`);\r\n listItems.freeTextSearches.forEach((search) => {\r\n const listItems = this.buildFreeTextSearchListItem(search.displayText, search.value, search.type);\r\n suggestionsSearchesHtml && suggestionsSearchesListHtml && suggestionsSearchesListHtml.appendChild(listItems);\r\n });\r\n this.menuEl && this.menuEl.appendChild(suggestionsSearchesHtml);\r\n }\r\n else {\r\n hasNoFreeTextSearches = true;\r\n }\r\n\r\n if (hasNoSavedSearches && hasNoRecentSearches && hasNoFreeTextSearches && hasNoArticlesAndResearch) {\r\n const sectionId = 'optimizedSearch';\r\n const optimizedSearchHtml = this.createMenuSection(sectionId, 'Featured', false, true);\r\n const optimizedSearchListHtml = optimizedSearchHtml.querySelector(`#${sectionId}`);\r\n const SUVlistItem = this.buildSearchOptimizationListItemEl(content.OPTIMIZED_SEARCH.SUV.listItemUrl, content.OPTIMIZED_SEARCH.SUV.listItemText);\r\n optimizedSearchHtml && optimizedSearchListHtml && optimizedSearchListHtml.appendChild(SUVlistItem);\r\n const HybridListItem = this.buildSearchOptimizationListItemEl(content.OPTIMIZED_SEARCH.Hybrid.listItemUrl, content.OPTIMIZED_SEARCH.Hybrid.listItemText);\r\n optimizedSearchHtml && optimizedSearchListHtml && optimizedSearchListHtml.appendChild(HybridListItem);\r\n const TruckListItem = this.buildSearchOptimizationListItemEl(content.OPTIMIZED_SEARCH.Truck.listItemUrl, content.OPTIMIZED_SEARCH.Truck.listItemText);\r\n optimizedSearchHtml && optimizedSearchListHtml && optimizedSearchListHtml.appendChild(TruckListItem);\r\n const VansListItem = this.buildSearchOptimizationListItemEl(content.OPTIMIZED_SEARCH.Vans.listItemUrl, content.OPTIMIZED_SEARCH.Vans.listItemText);\r\n optimizedSearchHtml && optimizedSearchListHtml && optimizedSearchListHtml.appendChild(VansListItem);\r\n const ArticleListItem = this.buildSearchOptimizationListItemEl(content.OPTIMIZED_SEARCH.Article.listItemUrl, content.OPTIMIZED_SEARCH.Article.listItemText, true);\r\n optimizedSearchHtml && optimizedSearchListHtml && optimizedSearchListHtml.appendChild(ArticleListItem);\r\n this.menuEl && this.menuEl.append(optimizedSearchHtml);\r\n }\r\n\r\n if (articlesAndResearch && articlesAndResearch.length > 0) {\r\n const sectionId = 'articlesandresearch';\r\n const researchSearchesHtml = this.createMenuSection(sectionId, 'Research & Advice');\r\n const researchSearchesListHtml = researchSearchesHtml.querySelector(`#${sectionId}`);\r\n articlesAndResearch.forEach((search: Results) => {\r\n const listItemEl = this.buildFreeTextSearchListItemEl(search.highlights.title[0], search.document.url, 'Research & Advice');\r\n researchSearchesHtml && researchSearchesListHtml && researchSearchesListHtml.appendChild(listItemEl);\r\n });\r\n this.menuEl && this.menuEl.appendChild(researchSearchesHtml);\r\n }\r\n\r\n if (reviews && reviews.length > 0) {\r\n const sectionId = 'reviews';\r\n const reviewsSearchesHtml = this.createMenuSection(sectionId, 'Reviews');\r\n const reviewsSearchesListHtml = reviewsSearchesHtml.querySelector(`#${sectionId}`);\r\n reviews.forEach((search: Results) => {\r\n const listItemEl = this.buildFreeTextSearchListItemEl(search.highlights.title[0], search.document.url, 'Reviews');\r\n reviewsSearchesHtml && reviewsSearchesListHtml && reviewsSearchesListHtml.appendChild(listItemEl);\r\n });\r\n this.menuEl && this.menuEl.appendChild(reviewsSearchesHtml);\r\n }\r\n\r\n if (home && home.length > 0) {\r\n const sectionId = 'home';\r\n const homeSearchesHtml = this.createMenuSection(sectionId, 'Home');\r\n const homeSearchesListHtml = homeSearchesHtml.querySelector(`#${sectionId}`);\r\n home.forEach((search: Results) => {\r\n const listItemEl = this.buildFreeTextSearchListItemEl(search.highlights.title[0], search.document.url, 'Home');\r\n homeSearchesHtml && homeSearchesListHtml && homeSearchesListHtml.appendChild(listItemEl);\r\n });\r\n this.menuEl && this.menuEl.appendChild(homeSearchesHtml);\r\n }\r\n\r\n if (questionAndAnswer && questionAndAnswer.answer) {\r\n const sectionId = 'qa';\r\n const homeSearchesHtml = this.createMenuSection(sectionId, 'Q&A', true);\r\n const homeSearchesListHtml = homeSearchesHtml.querySelector(`#${sectionId}`);\r\n const listItemEl = this.buildQuestionAndAnswerListItemEl(questionAndAnswer);\r\n listItemEl.classList.add('qa-bg');\r\n homeSearchesHtml && homeSearchesListHtml && homeSearchesListHtml.appendChild(listItemEl);\r\n this.menuEl && this.menuEl.appendChild(homeSearchesHtml);\r\n }\r\n\r\n return this.menuEl;\r\n }\r\n\r\n buildSearchForListItem(userInput: string): HTMLElement {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n\r\n listItemEl.classList.add('header-footer-menu-list-item', 'search-for-highlight', 'default-highlight');\r\n listItemEl.dataset.userInput = userInput;\r\n\r\n const queryString = encodeURIComponent(userInput);\r\n\r\n link.href = `/cars?search=${queryString}`;\r\n link.dataset.prop4 = userInput;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Search For');\r\n\r\n const searchForText = document.createElement('span');\r\n searchForText.classList.add('search-for-text');\r\n searchForText.textContent = 'Search for ';\r\n\r\n const userInputText = document.createElement('span');\r\n userInputText.classList.add('search-query-text');\r\n userInputText.textContent = `\"${userInput}\"`;\r\n\r\n listItemLabel.innerHTML = '';\r\n listItemLabel.append(searchForText, userInputText);\r\n\r\n link.appendChild(listItemLabel);\r\n listItemEl.appendChild(link);\r\n\r\n link.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n this.inputEl.value = userInput;\r\n this.closeMenu();\r\n this.inputEl.form?.submit();\r\n });\r\n\r\n return listItemEl;\r\n }\r\n\r\n buildIneligibleTermsAlternatesSuggestions(suggestions: Suggestion[]): HTMLElement {\r\n const sectionId = 'unavailableModelSuggestions';\r\n const html = this.createMenuSection(sectionId, 'You Might Like', false, false, true);\r\n const sectionHtml = html.querySelector(`#${sectionId}`);\r\n\r\n suggestions.forEach((s: Suggestion) => {\r\n const listItemsHtml = this.buildIneligibleTermsAlternatesSuggestionListItemEl(s);\r\n\r\n html && sectionHtml && sectionHtml.appendChild(listItemsHtml);\r\n });\r\n\r\n const noteHtml = document.createElement('div');\r\n noteHtml.className = 'header-search-bar-note';\r\n noteHtml.innerHTML = \"<span>We don't sell this car.</span>\";\r\n this.menuEl && this.menuEl.appendChild(noteHtml);\r\n this.menuEl && this.menuEl.appendChild(html);\r\n return this.menuEl;\r\n }\r\n\r\n buildIneligibleTermsAlternatesSuggestionListItemEl(suggestion: Suggestion): HTMLElement {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n link.href = `/cars?searchToken=${suggestion.value}`;\r\n link.dataset.prop4 = suggestion.displayText;\r\n const prop5 = `Search Bar:You Might Like`;\r\n link.dataset.prop5 = prop5;\r\n link.setAttribute('data-kmx-analytics', `prop5=${prop5}`);\r\n\r\n link.appendChild(listItemLabel);\r\n listItemLabel.textContent = suggestion.displayText;\r\n listItemEl.appendChild(link);\r\n\r\n return listItemEl;\r\n }\r\n\r\n //This uses the legacy FreeTextSearches type\r\n buildFreeTextSearchListItemEl(listItemText: string, listItemLink: string, header: string): HTMLElement {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n const domParser = new DOMParser();\r\n const htmlDocument = domParser.parseFromString(`<div class='menu-item-inner-text'>${listItemText}</div>`, 'text/html').body;\r\n link.href = listItemLink;\r\n link.dataset.prop4 = listItemText;\r\n const prop5 = `Search Bar:${header}`;\r\n link.dataset.prop5 = prop5;\r\n link.setAttribute('data-kmx-analytics', `prop5=${prop5}`);\r\n link.appendChild(listItemLabel);\r\n listItemLabel.appendChild(htmlDocument.childNodes[0]);\r\n listItemEl.appendChild(link);\r\n return listItemEl;\r\n }\r\n\r\n buildQuestionAndAnswerListItemEl(questionAndAnswer: any): HTMLElement {\r\n const { listItemEl } = this.buildBaseListItem();\r\n const container = document.createElement('div');\r\n const questionClassName = 'list-item-question';\r\n const answerClassName = 'list-item-answer';\r\n\r\n const domParser = new DOMParser();\r\n const query = domParser.parseFromString(`<div class=${questionClassName}>${questionAndAnswer.query}</div>`, 'text/html').body.childNodes[0];\r\n const answer = domParser.parseFromString(`<div class=${answerClassName}>${questionAndAnswer.answer}</div>`, 'text/html').body.childNodes[0];\r\n\r\n container.className = 'questionContainer';\r\n container.appendChild(query);\r\n container.appendChild(answer);\r\n listItemEl.appendChild(container);\r\n\r\n return listItemEl;\r\n }\r\n\r\n //This uses the legacy SavedSearches type\r\n buildSavedSearchListItemEl(\r\n listItemName: string,\r\n listItemDesc: string,\r\n listItemLocation: string,\r\n listItemUrl: string\r\n ): HTMLElement {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n const description = document.createElement('div');\r\n const location = document.createElement('span');\r\n\r\n description.innerText = `${listItemDesc} `;\r\n description.className = 'list-item-description';\r\n location.textContent = `(${listItemLocation})`;\r\n description.appendChild(location);\r\n\r\n listItemLabel.textContent = listItemName;\r\n listItemLabel.classList.add('saved-search-label');\r\n link.href = listItemUrl;\r\n link.dataset.prop4 = listItemName;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Saved Searches');\r\n link.appendChild(listItemLabel);\r\n link.appendChild(description);\r\n location.className = 'list-item-location';\r\n\r\n listItemEl.appendChild(link);\r\n\r\n return listItemEl;\r\n }\r\n\r\n buildSavedSearchListItem(displayText: string, secondaryText: string | undefined, entityId: string | undefined) {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n const description = document.createElement('div');\r\n description.innerText = `${secondaryText} `;\r\n description.className = 'list-item-description';\r\n\r\n const filterCount = document.createElement('span');\r\n filterCount.className = 'filters';\r\n\r\n listItemEl.classList.add('saved-search');\r\n link.href = `/cars?savedSearchId=${entityId}`;\r\n link.dataset.prop4 = displayText;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Saved Searches');\r\n\r\n link.appendChild(listItemLabel);\r\n link.appendChild(description);\r\n link.appendChild(filterCount);\r\n listItemLabel.textContent = displayText;\r\n listItemEl.appendChild(link);\r\n return listItemEl;\r\n }\r\n\r\n buildRecentSearchListItem(displayText: string, searchToken: string, additionalQueryStringParameters?: QueryParameter[]) {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n\r\n const filterCount = document.createElement('span');\r\n filterCount.className = 'filters';\r\n\r\n listItemEl.classList.add('recent-search');\r\n link.dataset.prop4 = displayText;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Recent Searches');\r\n\r\n if (additionalQueryStringParameters) {\r\n link.href = this.buildRecentSearchUrlWithAdditionalParameters(searchToken, additionalQueryStringParameters);\r\n }\r\n else {\r\n if (displayText == \"My Budget\") {\r\n link.href = searchToken;\r\n }\r\n else\r\n {\r\n link.href = `/cars?searchToken=${searchToken}`;\r\n }\r\n }\r\n\r\n link.appendChild(listItemLabel);\r\n link.appendChild(filterCount);\r\n listItemLabel.textContent = displayText;\r\n listItemEl.appendChild(link);\r\n return listItemEl;\r\n }\r\n\r\n buildRecentSearchUrlWithAdditionalParameters(searchToken: string, params: QueryParameter[]) {\r\n let queryString = \"\";\r\n\r\n for(var param of params) {\r\n if (param.type == \"ConditionAmountMax\") {\r\n queryString += `&conditionedAmount=0-${param.content}`\r\n }\r\n }\r\n\r\n return `/cars?searchToken=${searchToken}${queryString}`;\r\n }\r\n\r\n buildFreeTextSearchListItem(displayText: string, value: string, type?: string) {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n\r\n const filterCount = document.createElement('span');\r\n filterCount.className = 'filters';\r\n\r\n if (type === 'Url') {\r\n // Fully resolved url.\r\n link.href = value;\r\n } else {\r\n var queryString = value?.replace(/ /g, '+');\r\n link.href = `/cars?search=${queryString}`;\r\n }\r\n\r\n link.dataset.prop4 = displayText;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Search');\r\n\r\n link.appendChild(listItemLabel);\r\n link.appendChild(filterCount);\r\n listItemLabel.textContent = displayText;\r\n listItemEl.appendChild(link);\r\n return listItemEl;\r\n }\r\n\r\n //This uses RecentSearchesFromLocalStorage type\r\n buildRecentSearchListItemEl(\r\n originalSearch: string,\r\n listItemText: string,\r\n listItemFilters: number,\r\n listItemUrl: string\r\n ): HTMLElement {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n const filterCount = document.createElement('span');\r\n filterCount.className = 'filters';\r\n if (listItemFilters > 0) {\r\n filterCount.innerHTML = `+${listItemFilters}${listItemFilters > 1 ? ' filters' : ' filter'}`;\r\n }\r\n listItemEl.classList.add('recent-search');\r\n link.href = listItemUrl;\r\n link.dataset.prop4 = listItemText;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Recent Searches');\r\n\r\n if (originalSearch && originalSearch.localeCompare(listItemText, undefined, { sensitivity: 'accent' })) {\r\n const greedySearch = document.createElement('span');\r\n greedySearch.innerHTML = `${originalSearch} ${String.fromCharCode(8594)}  `;\r\n link.appendChild(greedySearch);\r\n }\r\n\r\n link.appendChild(listItemLabel);\r\n link.appendChild(filterCount);\r\n listItemLabel.textContent = `${listItemText} `;\r\n listItemEl.appendChild(link);\r\n return listItemEl;\r\n }\r\n\r\n buildSearchOptimizationListItemEl(\r\n listItemUrl: string,\r\n listItemText: string,\r\n isArticleItem: boolean = false,\r\n ): HTMLElement {\r\n const { listItemEl, link, listItemLabel } = this.buildBaseListItem();\r\n\r\n link.href = listItemUrl;\r\n link.className = `menu-item-link optimized-link`;\r\n link.dataset.prop4 = listItemText;\r\n link.setAttribute('data-kmx-analytics', 'prop5=Search Bar:Suggestions');\r\n link.appendChild(listItemLabel);\r\n if (isArticleItem) {\r\n listItemLabel.innerHTML = `Most Reliable Cars — <span class=\"optimized-article\">Article</span>`;\r\n }\r\n else {\r\n listItemLabel.textContent = listItemText;\r\n }\r\n listItemEl.className = `header-footer-menu-list-item optimized-list-item`\r\n listItemEl.appendChild(link);\r\n\r\n return listItemEl;\r\n }\r\n\r\n createMenuSection(listId: string, headingTitle: string, isQuestionAndAnswer: boolean = false, isFeatured: boolean = false, hasNote: boolean = false) {\r\n // Create the elements needed for the search menu list\r\n const searchListContainer = document.createElement('div');\r\n const heading = document.createElement('div');\r\n const searchList = document.createElement('ul');\r\n const listRole = content.HEADER_SEARCH.autocompleteList.listRole;\r\n\r\n //Apply the classes and id to the specific list\r\n searchList.className = `header-footer-menu-list ${isQuestionAndAnswer && 'qa-bg'}`;\r\n searchList.id = listId;\r\n searchList.setAttribute('role', listRole);\r\n searchListContainer.className = `header-footer-menu-section ${isQuestionAndAnswer && 'qa-section'} ${hasNote ? 'has-note' : ''}`;\r\n heading.className = `header-footer-menu-heading ${isQuestionAndAnswer && 'qa-heading'} ${isFeatured && 'optimized-heading'}`;\r\n heading.innerHTML = headingTitle;\r\n\r\n // build html structure and add it to the menu\r\n searchListContainer.appendChild(heading);\r\n searchListContainer.appendChild(searchList);\r\n return searchListContainer;\r\n }\r\n}\r\n","interface IActiveTests { \r\n activateTest: (name: string, data: object | undefined) => void;\r\n determineIsActive: (name: string) => boolean; \r\n}\r\n\r\ninterface IActiveTest {\r\n name: string;\r\n data: object | undefined;\r\n}\r\n\r\nclass ActiveTests implements IActiveTests { \r\n private static instance: ActiveTests;\r\n \r\n private activeTests: IActiveTest[] = [];\r\n \r\n private constructor() {\r\n\r\n }\r\n\r\n static getInstance() {\r\n return this.instance || (this.instance = new this());\r\n }\r\n\r\n activateTest(name: string, data: object | undefined = undefined) {\r\n this.activeTests.push({ \r\n name, \r\n data \r\n });\r\n }\r\n\r\n determineIsActive(name: string) {\r\n return this.activeTests.some(t => t.name === name);\r\n }\r\n\r\n getTestData(name: string): object | undefined {\r\n const activeTest: IActiveTest | undefined = this.activeTests.find(t => t.name === name);\r\n if (!activeTest) {\r\n return undefined;\r\n }\r\n\r\n return activeTest.data;\r\n }\r\n}\r\n\r\nexport default ActiveTests.getInstance();\r\n","import { Store } from '../../types/store';\r\n\r\nconst zipRegEx = /^\\d{5}$/;\r\n\r\nexport const buildTelephoneLink = (telephoneNumber: string) => {\r\n return `tel:${telephoneNumber.replace(/\\D/g, '')}`;\r\n};\r\n\r\nexport const isZipCode = (value: string) => {\r\n return zipRegEx.test(value);\r\n};\r\n\r\nexport const camelToPascal = (object: any) => {\r\n var pascalObject: any = {};\r\n Object.keys(object).map(key => {\r\n const pascalKey = key.charAt(0).toUpperCase() + key.substring(1);\r\n pascalObject[pascalKey] = object[key];\r\n });\r\n\r\n return pascalObject;\r\n};\r\n\r\n// Haversine formula function\r\nexport function getDistanceInMiles(lat1: number, lat2: number, lon1: number, lon2: number) {\r\n function toRad(x: number) {\r\n return (x * Math.PI) / 180;\r\n }\r\n\r\n const R = 6371; // km\r\n\r\n const x1 = lat2 - lat1;\r\n const dLat = toRad(x1);\r\n const x2 = lon2 - lon1;\r\n const dLon = toRad(x2);\r\n const a =\r\n Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(toRad(lat1)) * Math.cos(toRad(lat2)) * Math.sin(dLon / 2) * Math.sin(dLon / 2);\r\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n let d = R * c;\r\n\r\n d /= 1.60934;\r\n\r\n return d;\r\n}\r\n","import * as api from '../../api/api';\r\nimport { Options } from '../../api/api';\r\nimport { DEFAULT_STORE_AVAILABILITY, EMPTY_STORE } from '../../constants';\r\nimport { Store, StoreAvailability } from '../../types/store';\r\nimport * as environment from '../../utils/environment';\r\nimport { camelToPascal, isZipCode } from './utils';\r\n\r\nexport const EXTERNAL_STORES_API = {\r\n uri: '/stores/api'\r\n};\r\n\r\nfunction getBaseUrl() {\r\n return environment.get().prod ? 'www' : 'wwwqa';\r\n}\r\n\r\nexport const getStoreUrl = (id: Store['Id']) => {\r\n return `https://${getBaseUrl()}.carmax.com${EXTERNAL_STORES_API.uri}/${id}`;\r\n};\r\n\r\nexport const getStoreAvailabilityUrl = (id: Store['Id']) => {\r\n return `https://${getBaseUrl()}.carmax.com${EXTERNAL_STORES_API.uri}/status/${id}`;\r\n};\r\n\r\nexport const getStoresByKeywordUrl = (keyword: string, take: number) => {\r\n return `https://${getBaseUrl()}.carmax.com${EXTERNAL_STORES_API.uri}/keyword/${keyword}/${take}`;\r\n};\r\n\r\nexport const getStore = (id: Store['Id'], done: (store: Store) => any) => {\r\n const options: Options = {\r\n url: getStoreUrl(id),\r\n };\r\n api.get(\r\n options,\r\n function success(res) {\r\n const store = camelToPascal(res) as Store;\r\n done(store);\r\n },\r\n function error(e) {\r\n console.error('Error fetching nearest store: ', e);\r\n done(EMPTY_STORE);\r\n }\r\n );\r\n};\r\n\r\nexport const getStoreAvailability = (id: Store['Id'], done: (storeStatus: StoreAvailability) => any) => {\r\n const options: Options = {\r\n url: getStoreAvailabilityUrl(id),\r\n };\r\n api.get(\r\n options,\r\n function success(res) {\r\n const store = camelToPascal(res) as StoreAvailability;\r\n done(store);\r\n },\r\n function error(e) {\r\n console.error('Error fetching store availability: ', e);\r\n done(DEFAULT_STORE_AVAILABILITY);\r\n }\r\n );\r\n};\r\n\r\nexport const getStoresByKeyword = (storeZip: string, keyword: string, take: number, done: (stores: Store[] | null, allStores: Store[] | null) => void) => {\r\n const options: Options = {\r\n url: getStoresByKeywordUrl(keyword, take),\r\n };\r\n api.get(\r\n options,\r\n\r\n function success(res) {\r\n let storesPascal = res? res.map((r: Store) => camelToPascal(r)): [];\r\n let storesWithoutCBC = storesPascal.filter((store: Store) => !store.IsCarBuyingCenter );\r\n if (isZipCode(storeZip) && !isZipCode(keyword)) {\r\n // If previous fetch was not by zipcode,\r\n // fetch all stores by zipcode to fill in the distances\r\n getStoresByKeyword(storeZip, storeZip, 9999, (zipStores: Store[] | null) => {\r\n if (zipStores) {\r\n storesWithoutCBC = storesWithoutCBC.map((sp: Store) => {\r\n const found = zipStores.find((zs: Store) => zs.Id === sp.Id);\r\n if (found) {\r\n sp.DistanceInMiles = found.DistanceInMiles;\r\n }\r\n\r\n return sp;\r\n });\r\n }\r\n done(storesWithoutCBC, zipStores);\r\n });\r\n } else {\r\n done(storesWithoutCBC, null);\r\n }\r\n },\r\n function error(e) {\r\n console.error('Error fetching nearest store: ', e);\r\n done(null, null)\r\n }\r\n );\r\n};\r\n","import { GRAND_OPENING_ACTIVE_STATUS, SET_STORE_BY_ID_CUSTOM_EVENT } from '../../constants';\r\nimport { content } from '../../content';\r\nimport { COOKIES, getCookieObject, getStoreId, getStoreZipCode, setCookie, stringifyCookie } from '../../storage/cookie';\r\nimport { IPayload } from '../../types/analytics';\r\nimport { Store } from '../../types/store';\r\nimport { ANALYTICS_CONSTANTS, track } from '../../utils/analytics';\r\nimport { determineNewStoreSelectionUrl } from '../../utils/search';\r\nimport * as storesApi from '../nearestStore/storesApi';\r\nimport StoreStatus from '../storeHours/storeStatus';\r\n\r\nexport const buildStoreSearchFormAndResults = () => {\r\n // Structure the search form\r\n const searchFormHTML = document.createElement('form');\r\n searchFormHTML.classList.add(content.STORE_CHOOSER.MODAL.FORM.class);\r\n searchFormHTML.id = content.STORE_CHOOSER.MODAL.FORM.id;\r\n searchFormHTML.onsubmit = (e) => {\r\n e.preventDefault();\r\n const formData = new FormData(searchFormHTML);\r\n const keywordInput = formData.get('keyword') as string;\r\n\r\n if (keywordInput) { initiateNewSearch(keywordInput) }\r\n else { buildErrorState() }\r\n }\r\n // Create input element\r\n const searchInputHTML = document.createElement('input');\r\n searchInputHTML.className = content.STORE_CHOOSER.MODAL.FORM.INPUT.class;\r\n searchInputHTML.id = content.STORE_CHOOSER.MODAL.FORM.INPUT.id;\r\n searchInputHTML.name = content.STORE_CHOOSER.MODAL.FORM.INPUT.name;\r\n searchInputHTML.placeholder = content.STORE_CHOOSER.MODAL.FORM.INPUT.placeholder;\r\n searchInputHTML.maxLength = 25;\r\n // Create button for submitting form (magnifying glass)\r\n const searchSubmitButtonHTML = document.createElement('button');\r\n searchSubmitButtonHTML.className = content.STORE_CHOOSER.MODAL.FORM.BUTTON.class;\r\n searchSubmitButtonHTML.innerHTML = content.STORE_CHOOSER.MODAL.FORM.BUTTON.innerHTML;\r\n searchSubmitButtonHTML.setAttribute('aria-label', content.STORE_CHOOSER.MODAL.FORM.BUTTON.ariaLabel);\r\n searchSubmitButtonHTML.setAttribute('aria-hidden', content.STORE_CHOOSER.MODAL.FORM.BUTTON.ariaHidden);\r\n searchSubmitButtonHTML.setAttribute('type', content.STORE_CHOOSER.MODAL.FORM.BUTTON.type);\r\n // Bring the HTML together\r\n searchFormHTML.appendChild(searchInputHTML);\r\n searchFormHTML.appendChild(searchSubmitButtonHTML);\r\n listenForCustomEventToInitiateSearch();\r\n return searchFormHTML;\r\n}\r\n\r\nfunction initiateNewSearch(keyword: string) {\r\n const foundStoreModalBody = document.querySelector(`#${content.STORE_CHOOSER.MODAL.BODY.id}`);\r\n const foundStoreModalClose: HTMLButtonElement | null = document.querySelector(`.${content.STORE_CHOOSER.MODAL.HEADER.CLOSE.class}`);\r\n if (foundStoreModalClose && foundStoreModalBody && foundStoreModalBody.innerHTML === '') { foundStoreModalClose.focus(); }\r\n if (foundStoreModalBody) {\r\n foundStoreModalBody.innerHTML = content.STORE_CHOOSER.MODAL.BODY.loadingInnerHTML;\r\n // render the loading indicator above until the API completes below\r\n if (keyword) {\r\n storesApi.getStoresByKeyword(getStoreZipCode(), keyword, 30, (stores: Store[] | null, allStores: Store[] | null) => {\r\n if (stores) {\r\n const yourStoreId = getStoreId();\r\n if (stores.filter(store => store.Id === yourStoreId).length == 0) {\r\n storesApi.getStore(yourStoreId, (yourStore: Store) => {\r\n if (allStores) {\r\n const found = allStores.find((s) => s.Id === yourStoreId);\r\n if (found) {\r\n yourStore.DistanceInMiles = found.DistanceInMiles;\r\n }\r\n }\r\n buildDisplayableListOfStores(stores, yourStoreId, yourStore)\r\n });\r\n } else {\r\n const yourStores = stores.sort((a, b) => { return yourStoreId === a.Id ? -1 : yourStoreId === a.Id ? 1 : 0 })\r\n buildDisplayableListOfStores(yourStores, yourStoreId)\r\n }\r\n } else {\r\n buildErrorState();\r\n }\r\n })\r\n } else {\r\n buildErrorState();\r\n }\r\n }\r\n}\r\n\r\nfunction buildDisplayableListOfStores(stores: Store[], yourStoreId: string, yourStore?: Store) {\r\n const activeStores = stores.filter(store => store != null\r\n && (store.IsSaveable || store.ActiveStatus === GRAND_OPENING_ACTIVE_STATUS));\r\n buildListOfStores(activeStores, yourStoreId, yourStore);\r\n}\r\n\r\n// \"YourStore\" needs to be handled separately from the list\r\n// So that we can properly determine the no-matches case if the only store returned is your store disregarding the safety fetch.\r\nfunction buildListOfStores(stores: Store[], yourStoreId: string, yourStore?: Store) {\r\n const foundModal = document.getElementById(content.STORE_CHOOSER.MODAL.BODY.id);\r\n if (!foundModal) {\r\n return;\r\n }\r\n\r\n foundModal.innerHTML = ''\r\n\r\n if(!stores || stores.length == 0) {\r\n const noMatchesFound = document.createElement('div');\r\n noMatchesFound.innerHTML = content.STORE_CHOOSER.MODAL.BODY.noMatchesFoundInnerHtml;\r\n foundModal.appendChild(noMatchesFound);\r\n }\r\n\r\n const yourStores = yourStore? ([yourStore]).concat(stores): stores;\r\n\r\n if (yourStores) {\r\n const storesWrapper = document.createElement('ul');\r\n storesWrapper.classList.add(content.STORE_CHOOSER.MODAL.BODY.LIST.class);\r\n\r\n for (let s = 0; s < 30; s++) {\r\n if (yourStores[s] && yourStores[s].Id) {\r\n storesWrapper.appendChild(renderStoreItem(yourStores[s], yourStoreId === yourStores[s].Id));\r\n }\r\n }\r\n\r\n foundModal.appendChild(storesWrapper);\r\n const allStoresLink = document.createElement('a');\r\n allStoresLink.className = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.allStoreLinkClass;\r\n allStoresLink.href = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.allStoreLinkHref;\r\n allStoresLink.text = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.allStoreLinkText;\r\n storesWrapper.appendChild(allStoresLink);\r\n }\r\n}\r\n\r\nfunction buildErrorState() {\r\n const errorWrapper = document.createElement('div');\r\n errorWrapper.classList.add(content.STORE_CHOOSER.MODAL.BODY.ERROR.class);\r\n errorWrapper.innerHTML = content.STORE_CHOOSER.MODAL.BODY.ERROR.innerHTML;\r\n const foundModal = document.getElementById(content.STORE_CHOOSER.MODAL.BODY.id);\r\n if (foundModal) {\r\n foundModal.innerHTML = ''\r\n foundModal.appendChild(errorWrapper);\r\n }\r\n}\r\n\r\nexport function determineSection(referenceEl: HTMLElement) {\r\n const header = referenceEl?.closest('header');\r\n const footer = referenceEl?.closest('footer');\r\n const location = header && 'header' || footer && 'footer' || 'unknown';\r\n return location;\r\n}\r\n\r\n\r\nfunction renderStoreItem(store: Store, storeIsSelectedStore: boolean) {\r\n const newStoreItemHTML = document.createElement('li');\r\n newStoreItemHTML.classList.add(content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.class);\r\n const storeStatus = new StoreStatus(store);\r\n\r\n function reloadPageToUpdateDate() {\r\n window.location.reload();\r\n }\r\n\r\n function selectNewStoreAction(el: HTMLElement | null) {\r\n //update kmx visitor cookie with user-entered zip code\r\n const searchFormElement: HTMLFormElement | null = document.querySelector(`#${content.STORE_CHOOSER.MODAL.FORM.id}`);\r\n if(searchFormElement) {\r\n const formData = new FormData(searchFormElement);\r\n const keywordInput = formData.get('keyword') as string;\r\n const visitorCookie = getCookieObject(COOKIES.visitor);\r\n\r\n //check if the user's input is a zipcode\r\n var matches = keywordInput.match(/^\\d{5}$/g);\r\n if (matches != null){\r\n visitorCookie.StoreSearchZipCode = keywordInput;\r\n }\r\n else {\r\n visitorCookie.StoreSearchZipCode = undefined;\r\n }\r\n setCookie(COOKIES.visitor, stringifyCookie(visitorCookie), undefined);\r\n }\r\n\r\n const newUrl = determineNewStoreSelectionUrl();\r\n history.pushState({}, '', newUrl);\r\n const selectStoreEvent = new CustomEvent(SET_STORE_BY_ID_CUSTOM_EVENT, { detail: { id: store.Id, distanceInMiles: store.DistanceInMiles, done: () => reloadPageToUpdateDate() } })\r\n document.documentElement.dispatchEvent(selectStoreEvent);\r\n const position = el && determineSection(el);\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.setStore,\r\n \"linkDetails\": {\r\n \"name\": \"Set as my store\",\r\n \"position\": `${position}-location`,\r\n },\r\n \"storeSelected\": store.Name\r\n } as IPayload;\r\n track(payload);\r\n }\r\n\r\n newStoreItemHTML.innerHTML = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.itemInnerHTML(\r\n store.Name,\r\n store.DistanceInMiles,\r\n store.AddressLine1,\r\n store.MailingCity,\r\n store.StateAbbreviation,\r\n store.ZipCode,\r\n store.AlertMessage,\r\n storeStatus.hoursText,\r\n store.IsSaveable);\r\n\r\n // Each store item button selection needs to generated this way in order to add click events\r\n const storeSelectorWrapperHtml = document.createElement('div');\r\n storeSelectorWrapperHtml.classList.add(content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectClass);\r\n // Create elements for building on\r\n const storeNotSaveableSelectedHTML = document.createElement('div');\r\n const storeSelectorButtonHtml = document.createElement('button');\r\n // Only build the elements out if we need to per store (performance improvement and probably could be refactored to not have the ternary below)\r\n if (storeIsSelectedStore) {\r\n storeNotSaveableSelectedHTML.className = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectSelectedClass;\r\n storeNotSaveableSelectedHTML.innerHTML = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectSelectedInnerHTML;\r\n } else if (store.ActiveStatus === GRAND_OPENING_ACTIVE_STATUS) {\r\n storeNotSaveableSelectedHTML.className = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectGrandOpenClass;\r\n storeNotSaveableSelectedHTML.innerHTML = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectGrandOpenInnerHTML;\r\n } else {\r\n storeSelectorButtonHtml.className = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectButtonClass;\r\n storeSelectorButtonHtml.innerText = content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectButtonInnerText;\r\n storeSelectorButtonHtml.setAttribute('type', content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectButtonType);\r\n storeSelectorButtonHtml.setAttribute('aria-label', content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectButtonAriaLabel);\r\n storeSelectorButtonHtml.setAttribute('aria-hidden', content.STORE_CHOOSER.MODAL.BODY.LIST.STORE.selectButtonAriaHidden);\r\n storeSelectorButtonHtml.setAttribute('data-kmx-analytics', `prop5=Header-Location | location=${store.Name}`);\r\n storeSelectorButtonHtml.onclick = (event: Event) => selectNewStoreAction(event.target as HTMLElement);\r\n }\r\n // TODO: figure out how to name things and refactor so we dont need this ternary here but just the if else above\r\n storeSelectorWrapperHtml.appendChild((storeIsSelectedStore || !store.IsSaveable) ? storeNotSaveableSelectedHTML : storeSelectorButtonHtml);\r\n // Combine elements to build HTML\r\n newStoreItemHTML.appendChild(storeSelectorWrapperHtml);\r\n return newStoreItemHTML;\r\n}\r\n\r\nfunction listenForCustomEventToInitiateSearch() {\r\n function openModal(e: any) {\r\n const searchInput = document.querySelector(`#${content.STORE_CHOOSER.MODAL.FORM.INPUT.id}`);\r\n const foundSearchInput: HTMLInputElement | null = searchInput as HTMLInputElement;\r\n const foundBodyElement = document.getElementsByTagName('body')[0] as HTMLBodyElement;\r\n const foundBaseHtmlElement = document.getElementsByTagName('html')[0] as HTMLHtmlElement;\r\n if (foundBodyElement) { foundBodyElement.classList.add(content.CLASSNAMES.bodyScrollLock) };\r\n if (foundBaseHtmlElement) { foundBaseHtmlElement.classList.add(content.CLASSNAMES.bodyScrollLock) };\r\n if (foundSearchInput) {\r\n foundSearchInput.value = e.detail.keyword;\r\n const foundModalWrapper = document.querySelector(`#${content.STORE_CHOOSER.WRAPPER.id}`);\r\n if (foundModalWrapper && !foundModalWrapper.classList.contains(content.STORE_CHOOSER.MODAL.FORM.visibleClass)) {\r\n foundModalWrapper.classList.add(content.STORE_CHOOSER.MODAL.FORM.visibleClass);\r\n initiateNewSearch(e.detail.keyword);\r\n }\r\n }\r\n const foundCloseIcon: HTMLButtonElement | null = document.querySelector(`.${content.STORE_CHOOSER.MODAL.HEADER.CLOSE.class}`);\r\n foundCloseIcon && foundCloseIcon.focus();\r\n }\r\n window.addEventListener(content.STORE_CHOOSER.EVENT_NAMES.headerKeywordInput, openModal);\r\n window.addEventListener(content.STORE_CHOOSER.EVENT_NAMES.footerKeywordInput, openModal);\r\n}\r\n","import { IPayload } from '../types/analytics';\r\nimport { determineSection } from '../components/storeChooser/storeChooserSearch';\r\nimport { content } from '../content';\r\n\r\ndeclare global {\r\n interface Window {\r\n _satellite: any;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n adobeDataLayer: any;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface Window {\r\n digitalData: any;\r\n }\r\n}\r\n\r\nexport const ANALYTICS_CONSTANTS = {\r\n STORE: {\r\n searchInitiated: 'search-stores-initiated',\r\n searchSuccessful: 'search-stores-successful',\r\n setStoreInitiated: 'set-store-initiated',\r\n setStoreSuccessful: 'set-store-successful',\r\n },\r\n ANIMATION:{\r\n animationFired: 'HP_icon_wave',\r\n },\r\n LOCATIONS: {\r\n header: 'Header',\r\n footer: 'Footer'\r\n },\r\n EVENTS: {\r\n click: 'ctaClick',\r\n getPreQualified: 'financeLeadInitiation',\r\n storeChange: 'storeChange',\r\n storeChangeFooter: 'storeChangeFooter',\r\n setStore: 'setMyStore',\r\n searchInitiated: 'searchInitiatedHeaderFooter'\r\n }\r\n}\r\n\r\nexport const trackAnalyticsEvent = (eventId: string): void => {\r\n if (window._satellite) {\r\n window._satellite.track(eventId);\r\n }\r\n};\r\n\r\nconst clearSourceSection = (): void => {\r\n if (window.digitalData && window.digitalData.sourceSection) {\r\n window.digitalData.sourceSection = \"\";\r\n }\r\n};\r\n\r\n\r\nexport const track = (payload:IPayload): void => {\r\n // \"adobeDataLayer\" will appear in the console if the site in questions is using \"EDDL\"\r\n !payload?.event ? payload.event = ANALYTICS_CONSTANTS.EVENTS.click : null;\r\n console.log('Header Footer Tagging Payload - ', JSON.stringify(payload));\r\n if (typeof window.adobeDataLayer != 'undefined') {\r\n\r\n window.adobeDataLayer.push(payload);\r\n } else {\r\n const { event, linkDetails, storeSelected } = payload;\r\n // if \"adobeDataLayer\" does not exist, it will fallback\r\n const { position , name } = linkDetails;\r\n window.digitalData = window.digitalData || {};\r\n window.digitalData.lead = { position };\r\n window.digitalData.name = { name };\r\n window.digitalData.storeSelected = storeSelected;\r\n clearSourceSection();\r\n linkDetails.name && trackAnalyticsEvent(linkDetails.name);\r\n }\r\n};\r\n\r\n\r\n\r\n\r\n\r\n\r\nexport const initDesktopHeaderTracking = (header: any)=> {\r\n // EDDL tracking solution for desktop header links\r\n const desktopHeaderLinks = header.querySelectorAll('.header-link');\r\n const desktopHeaderMoreButton = header.querySelector('#header-helpful-links-button');\r\n const desktopFavoriteHeaderLink = header.querySelector('#header-saved-cars-button');\r\n const desktopProfileIconButton = header.querySelector('#header-my-profile-button');\r\n\r\n\r\n const footerHeaderLogo = header.querySelector('#carmax-logo-header');\r\n if (footerHeaderLogo) {\r\n\r\n footerHeaderLogo.addEventListener('click', (e: Event) => {\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n // this name's requirement does not follow the typical pattern\r\n \"name\": 'Carmax',\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload;\r\n track(payload);\r\n });\r\n }\r\n\r\n\r\n if (desktopHeaderLinks) {\r\n desktopHeaderLinks.forEach((a: HTMLAnchorElement) => {\r\n\r\n if ( a.getAttribute('id') === 'carmax-logo-header') return;\r\n\r\n a.addEventListener('click', (e: Event) => {\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n let name: string;\r\n let event : string;\r\n\r\n if( target.innerText.toLowerCase().trim() === \"shop\") {\r\n event = ANALYTICS_CONSTANTS.EVENTS.searchInitiated;\r\n } else {\r\n event = ANALYTICS_CONSTANTS.EVENTS.click\r\n }\r\n\r\n name = target.text;\r\n\r\n const payload = {\r\n \"event\": event,\r\n \"linkDetails\": {\r\n \"name\": name,\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload;\r\n\r\n track(payload)\r\n\r\n });\r\n });\r\n };\r\n\r\n if (desktopHeaderMoreButton) {\r\n desktopHeaderMoreButton.addEventListener('click', (e: Event) => {\r\n\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n \"name\": 'More',\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload;\r\n track(payload)\r\n\r\n });\r\n }\r\n\r\n const button = document.getElementById(content.HEADER_MY_STORE.buttonId);\r\n button?.addEventListener('click', (e: Event) => {\r\n const position = determineSection(button);\r\n const target = e?.currentTarget as HTMLElement;\r\n const parent = target.closest('.header-footer-icon-button');\r\n const headerStoreName = parent?.querySelector('#header-my-store-button-text');\r\n\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n \"name\": headerStoreName?.textContent,\r\n \"position\" : position\r\n }\r\n } as IPayload;\r\n track(payload)\r\n });\r\n\r\n if (desktopFavoriteHeaderLink) {\r\n desktopFavoriteHeaderLink.addEventListener('click', (e: Event) => {\r\n const payload = {\r\n event: ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n \"name\": 'My Saved Cars',\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload;\r\n track(payload);\r\n });\r\n }\r\n\r\n if (desktopProfileIconButton) {\r\n desktopProfileIconButton.addEventListener('click', (e:Event)=> {\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n \"name\": 'My Profile',\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload;\r\n track(payload);\r\n });\r\n }\r\n}\r\n\r\nexport const initFooterTracking = (footer: any)=> {\r\n // EDDL tracking solution for footer links\r\n const footerLinks = footer.querySelectorAll('.footer-link');\r\n\r\n\r\n const button = document.getElementById(content.FOOTER_MY_STORE.buttonId);\r\n button?.addEventListener('click', (e: Event) => {\r\n const position = determineSection(button);\r\n const target = e?.currentTarget as HTMLElement;\r\n const parent = target.closest('.header-footer-icon-button');;\r\n const footerStoreName = parent?.querySelector('#footer-my-store-button-text');\r\n\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n \"name\": footerStoreName?.textContent,\r\n \"position\" : position\r\n }\r\n } as IPayload;\r\n track(payload)\r\n });\r\n\r\n if ( footerLinks ) {\r\n\r\n footerLinks.forEach((a: HTMLAnchorElement)=>{\r\n\r\n if ( a.closest('.footer-privacy')) return ;\r\n\r\n if ( a.getAttribute('id') === \"carmax-logo-footer\") return;\r\n\r\n a.addEventListener('click', (e : Event)=>{\r\n const target = e.currentTarget as HTMLAnchorElement;\r\n let name : string | undefined;\r\n let event = ANALYTICS_CONSTANTS.EVENTS.click;\r\n const isSocialLink = target.classList.contains('footer-link--social');\r\n const isPrequalLink = target.getAttribute('id') === 'footer-link-prequalify';\r\n\r\n if ( isSocialLink ) {\r\n const ariaLabel = target.getAttribute('aria-label');\r\n name = ariaLabel && ariaLabel || undefined\r\n } else {\r\n name = target.text;\r\n }\r\n\r\n if ( target.text === \"Browse by category\" || target.text === \"View all inventory\") {\r\n event = ANALYTICS_CONSTANTS.EVENTS.searchInitiated\r\n }\r\n\r\n const payload = {\r\n \"event\": event,\r\n \"linkDetails\": {\r\n \"name\": name,\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.footer\r\n }\r\n } as IPayload;\r\n\r\n if ( !isPrequalLink ) {\r\n track(payload)\r\n }\r\n\r\n })\r\n })\r\n }\r\n\r\n const footerCarMaxLogo = footer.querySelector('#carmax-logo-footer');\r\n if (footerCarMaxLogo) {\r\n footerCarMaxLogo.addEventListener('click', (e: Event) => {\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n // this name's requirement does not follow the typical pattern\r\n \"name\": 'Carmax',\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.footer\r\n }\r\n } as IPayload;\r\n track(payload);\r\n });\r\n }\r\n\r\n const footerPrivacyLinkOne = footer.querySelector('.footer-privacy .footer-link');\r\n if (footerPrivacyLinkOne) {\r\n\r\n footerPrivacyLinkOne.addEventListener('click', (e: Event) => {\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n // this name's requirement does not follow the typical pattern\r\n \"name\": 'privacy policy',\r\n \"position\": 'footer-privacy'\r\n }\r\n } as IPayload;\r\n track(payload);\r\n });\r\n }\r\n\r\n const footerPrequalifiedLink = footer.querySelector('#footer-link-prequalify');\r\n if (footerPrequalifiedLink) {\r\n\r\n footerPrequalifiedLink.addEventListener('click', (e: Event) => {\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.getPreQualified,\r\n \"linkDetails\": {\r\n \"name\": 'Get pre-qualified',\r\n \"position\": 'Footer-Finance',\r\n },\r\n \"leadDetails\":{\r\n \"leadOriginationPage\": 'Footer_GetPrequalified',\r\n \"leadType\": 'Finance First Prequalification Application',\r\n }\r\n } as IPayload;\r\n track(payload);\r\n });\r\n }\r\n}\r\n\r\n","import * as searchApi from './searchApi';\r\nimport * as utils from './utils';\r\nimport * as constants from '../../constants';\r\nimport SearchSuggestionsMenu from './SearchSuggestionsMenu';\r\nimport { content } from '../../content';\r\nimport { getQueryStringValue } from '../../utils/environment';\r\nimport activeTests from '../../targetTests/activeTests';\r\nimport { IPayload } from '../../types/analytics';\r\nimport { ANALYTICS_CONSTANTS, track } from '../../utils/analytics';\r\n\r\nexport interface IInventorySearch {\r\n attachSetCognitiveSearchListener(): void;\r\n handleInput(event: Event): void;\r\n handleSubmit(event: Event): void;\r\n handleInputKeydown(event: KeyboardEvent): void;\r\n handleMenuKeydown(event: KeyboardEvent): void;\r\n handleClickOutside(): void;\r\n}\r\n\r\nexport default class InventorySearch implements IInventorySearch {\r\n private _menu: SearchSuggestionsMenu;\r\n private ineligibleTerm: string = '';\r\n\r\n constructor() {\r\n this.attachSetCognitiveSearchListener();\r\n this._menu = new SearchSuggestionsMenu(\r\n () => {\r\n this.setSearchBarActiveState(true);\r\n },\r\n () => {\r\n this.setSearchBarActiveState(false);\r\n }\r\n );\r\n this.preserveSearchBarPriorContents();\r\n\r\n const searchButton = document.querySelector('#header-search-button') as HTMLElement;\r\n if (searchButton != null) {\r\n searchButton.onclick = (e: MouseEvent) => this.handleSearchClick(e);\r\n }\r\n }\r\n\r\n public attachSetCognitiveSearchListener(): void {\r\n window.addEventListener(constants.SET_COGNITIVE_SEARCH_EVENT, () => {\r\n activeTests.activateTest(constants.COGNITIVE_SEARCH_TEST);\r\n });\r\n }\r\n\r\n handleInput(event: Event): void {\r\n const targetEl = event.target as HTMLInputElement;\r\n utils.debounce(() => {\r\n this.ineligibleTerm = '';\r\n if (targetEl.value || targetEl === document.activeElement) {\r\n let params = '';\r\n if (targetEl.value && activeTests.determineIsActive(constants.COGNITIVE_SEARCH_TEST)) {\r\n params = 'useCognitiveSearch=true';\r\n }\r\n\r\n if (!activeTests.determineIsActive(constants.SEARCH_BAR_TEST)) {\r\n searchApi.getSearchSuggestions(targetEl.value, params, searchSuggestionsList => {\r\n if (searchSuggestionsList) {\r\n if(searchSuggestionsList.ineligibleTermsAlternates && searchSuggestionsList.ineligibleTermsAlternates.length > 0) {\r\n this.ineligibleTerm = targetEl.value;\r\n }\r\n this._menu.render(searchSuggestionsList);\r\n }\r\n });\r\n }\r\n } else {\r\n this._menu.render({\r\n freeTextSearches: [],\r\n length: 0,\r\n savedSearches: [],\r\n recentSearches: [],\r\n ineligibleTermsAlternates: []\r\n });\r\n }\r\n }, 300);\r\n }\r\n\r\n handleSubmit(event: Event): void {\r\n if (event) {\r\n event.preventDefault();\r\n\r\n const input = document.querySelector(`#${content.HEADER_SEARCH.input.id}`) as HTMLInputElement;\r\n\r\n // Prevent submit if the current text in the input has been marked as ineligible.\r\n const isIneligibleTerm = this.checkIneligibleTerm(input);\r\n if (input && !isIneligibleTerm) {\r\n utils.updateSearchId();\r\n const trimmedInputValue = input.value.trim();\r\n if (utils.isStockNumber(trimmedInputValue)) {\r\n utils.redirectToCarPage(trimmedInputValue);\r\n } else {\r\n const formEl = event.target as HTMLFormElement;\r\n if (formEl) {\r\n formEl.submit();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n handleInputKeydown(event: KeyboardEvent): void {\r\n this._menu.handleInputKeydown(event);\r\n }\r\n\r\n handleMenuKeydown(event: KeyboardEvent): void {\r\n this._menu.handleMenuKeydown(event);\r\n }\r\n\r\n handleClickOutside(): void {\r\n this._menu.handleClickOutside();\r\n }\r\n\r\n handleSearchClick(event: MouseEvent): void {\r\n //HERE ADD\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"linkDetails\" : {\r\n \"name\": \"Search Bar:header-search-bar-form\",\r\n \"position\": \"Free-Text Search Box\"\r\n },\r\n \"search\" : {\r\n \"initiationMethod\" : \"Homepage|Free-Text Search Box|Search Bar:header-search-bar-form\"\r\n }\r\n } as IPayload;\r\n track(payload);\r\n const input = document.querySelector(`#${content.HEADER_SEARCH.input.id}`) as HTMLInputElement;\r\n const isIneligibleTerm = this.checkIneligibleTerm(input);\r\n if (input && input.value && isIneligibleTerm) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n }\r\n\r\n private checkIneligibleTerm(input: HTMLInputElement) : boolean {\r\n if (!this.ineligibleTerm) {\r\n return false;\r\n }\r\n\r\n const isIneligibleTerm = input.value === this.ineligibleTerm;\r\n if (!isIneligibleTerm) {\r\n // The text box no longer contains the text marked as ineligible. Clear it.\r\n this.ineligibleTerm = '';\r\n }\r\n\r\n return isIneligibleTerm;\r\n }\r\n\r\n private setSearchBarActiveState(active: boolean): void {\r\n const headerSearchBar = document.querySelector(`#${content.HEADER.id} #${content.HEADER_SEARCH.id}`);\r\n\r\n if (headerSearchBar) {\r\n if (active) {\r\n headerSearchBar.classList.add(content.HEADER_SEARCH.activeClass);\r\n } else {\r\n headerSearchBar.classList.remove(content.HEADER_SEARCH.activeClass);\r\n }\r\n }\r\n }\r\n\r\n private preserveSearchBarPriorContents() {\r\n // The search param will contain the last value the user searched on.\r\n const searchQueryStringValue = getQueryStringValue('search');\r\n\r\n const input = document.querySelector(`#${content.HEADER_SEARCH.input.id}`) as HTMLInputElement;\r\n if (input) {\r\n input.value = searchQueryStringValue;\r\n }\r\n }\r\n}\r\n","import ListMenu from './ListMenu';\r\nimport { MENU_CLASSES, NORMALIZED_KEYS, normalizeKey } from './constants';\r\n\r\nexport const handleOpenButtonKeydown = (event: KeyboardEvent, menu: ListMenu) => {\r\n let key = normalizeKey(event.key);\r\n if (key) {\r\n switch (key) {\r\n case NORMALIZED_KEYS.ArrowDown:\r\n handleButtonArrowDown(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.ArrowUp:\r\n handleButtonArrowUp(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.Enter:\r\n case NORMALIZED_KEYS.Space:\r\n handleOpenButtonEnterSpace(event, menu);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleMenuKeydown = (event: KeyboardEvent, menu: ListMenu) => {\r\n let key = normalizeKey(event.key);\r\n if (key) {\r\n switch (key) {\r\n case NORMALIZED_KEYS.ArrowDown:\r\n handleMenuArrowDown(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.ArrowUp:\r\n handleMenuArrowUp(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.Escape:\r\n handleMenuEscape(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.Tab:\r\n handleMenuTab(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.Home:\r\n handleMenuHome(event, menu);\r\n break;\r\n case NORMALIZED_KEYS.End:\r\n handleMenuEnd(event, menu);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleMenuOpen = (menu: ListMenu) => {\r\n menu.toggleButtonEl.classList.add(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.add(MENU_CLASSES.menuOpen);\r\n menu.toggleButtonEl.setAttribute('aria-expanded', 'true');\r\n};\r\n\r\nexport const handleMenuClose = (menu: ListMenu) => {\r\n removeListItemFocus(menu);\r\n menu.toggleButtonEl.classList.remove(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.remove(MENU_CLASSES.menuOpen);\r\n menu.toggleButtonEl.setAttribute('aria-expanded', 'false');\r\n};\r\n\r\nfunction handleButtonArrowUp(event: KeyboardEvent, menu: ListMenu) {\r\n event.preventDefault();\r\n menu.openMenu();\r\n if (menu.menuListEl) {\r\n const tabbableMenuItems = menu.menuListEl.getElementsByClassName(MENU_CLASSES.tabbableMenuItems)\r\n selectListItem(menu, menu.menuListEl.children[tabbableMenuItems.length - 1] as HTMLElement);\r\n }\r\n}\r\n\r\nfunction handleButtonArrowDown(event: KeyboardEvent, menu: ListMenu) {\r\n event.preventDefault();\r\n menu.openMenu();\r\n if (menu.menuListEl) {\r\n selectListItem(menu, menu.menuListEl.getElementsByClassName(MENU_CLASSES.tabbableMenuItems)[0] as HTMLElement);\r\n }\r\n}\r\n\r\nfunction handleOpenButtonEnterSpace(event: KeyboardEvent, menu: ListMenu) {\r\n event.preventDefault();\r\n if (!menu.open) {\r\n menu.openMenu();\r\n if (menu.menuListEl) {\r\n let focusableEl = menu.menuListEl.getElementsByClassName(MENU_CLASSES.tabbableMenuItems)[0];\r\n selectListItem(menu, focusableEl as HTMLElement);\r\n }\r\n } else {\r\n menu.closeMenu();\r\n }\r\n}\r\n\r\nfunction handleMenuArrowDown(event: KeyboardEvent, menu: ListMenu) {\r\n event.preventDefault();\r\n processMenuArrowDown(event.target as HTMLElement, menu);\r\n}\r\n\r\nfunction handleMenuArrowUp(event: KeyboardEvent, menu: ListMenu) {\r\n event.preventDefault();\r\n processMenuArrowUp(event.target as HTMLElement, menu);\r\n}\r\n\r\nfunction handleMenuEscape(event: KeyboardEvent, menu: ListMenu) {\r\n removeListItemFocus(menu);\r\n menu.closeMenu();\r\n menu.toggleButtonEl.focus();\r\n}\r\n\r\nfunction handleMenuTab(event: KeyboardEvent, menu: ListMenu) {\r\n removeListItemFocus(menu);\r\n menu.closeMenu();\r\n}\r\n\r\nfunction handleMenuHome(event: KeyboardEvent, menu: ListMenu) {\r\n if (menu.menuListEl) {\r\n event.preventDefault();\r\n selectListItem(menu, menu.menuListEl.children[0] as HTMLElement);\r\n }\r\n}\r\n\r\nfunction handleMenuEnd(event: KeyboardEvent, menu: ListMenu) {\r\n if (menu.menuListEl) {\r\n event.preventDefault();\r\n selectListItem(menu, menu.menuListEl.children[menu.menuListEl.children.length - 1] as HTMLElement);\r\n }\r\n}\r\n\r\nfunction removeListItemFocus(menu: ListMenu) {\r\n let selectedEl = menu.menuEl.querySelector(`.${MENU_CLASSES.menuItemFocus}`);\r\n if (selectedEl) {\r\n selectedEl.classList.remove(MENU_CLASSES.menuItemFocus);\r\n selectedEl.setAttribute('tabindex', '-1');\r\n let listItemContentEl = selectedEl.children[0];\r\n listItemContentEl.setAttribute('tabindex', '-1');\r\n }\r\n}\r\n\r\nfunction selectListItem(menu: ListMenu, el: HTMLElement) {\r\n removeListItemFocus(menu);\r\n el.classList.add(MENU_CLASSES.menuItemFocus);\r\n el.setAttribute('tabindex', '0');\r\n let listItemContentEl = el.children[0] as HTMLElement;\r\n listItemContentEl.setAttribute('tabindex', '0');\r\n listItemContentEl.focus();\r\n}\r\n\r\nfunction processMenuArrowUp(listItemEl: HTMLElement, menu: ListMenu) {\r\n if (menu.menuListEl) {\r\n let nextListItemEl =\r\n listItemEl.parentElement && listItemEl.parentElement.previousElementSibling\r\n ? listItemEl.parentElement.previousElementSibling\r\n : menu.menuListEl.children[menu.menuListEl.children.length - 1];\r\n selectListItem(menu, nextListItemEl as HTMLElement);\r\n }\r\n}\r\n\r\nfunction processMenuArrowDown(listItemEl: HTMLElement, menu: ListMenu) {\r\n if (menu.menuListEl) {\r\n let nextListItemEl =\r\n listItemEl.parentElement && listItemEl.parentElement.nextElementSibling\r\n ? listItemEl.parentElement.nextElementSibling\r\n : menu.menuListEl.getElementsByClassName(MENU_CLASSES.tabbableMenuItems)[0];\r\n selectListItem(menu, nextListItemEl as HTMLElement);\r\n }\r\n}\r\n","import * as listMenuKeyboardHandler from './listMenuKeyboardHandler';\r\nimport Menu from './Menu';\r\n\r\nexport interface IListMenu {\r\n toggleButtonEl: HTMLElement;\r\n menuEl: HTMLElement;\r\n menuListEl?: HTMLElement;\r\n}\r\n\r\nexport default class ListMenu extends Menu implements IListMenu {\r\n private _toggleButtonEl: HTMLElement;\r\n private _menuEl: HTMLElement;\r\n private _menuListEl?: HTMLElement;\r\n private _keyboardHandler: any;\r\n\r\n constructor(toggleButtonEl: HTMLElement, menuEl: HTMLElement, menuListEl?: HTMLElement) {\r\n super();\r\n this._toggleButtonEl = toggleButtonEl;\r\n this._menuEl = menuEl;\r\n this._menuListEl = menuListEl;\r\n this._keyboardHandler = listMenuKeyboardHandler;\r\n }\r\n\r\n get toggleButtonEl(): HTMLElement {\r\n return this._toggleButtonEl;\r\n }\r\n\r\n get menuEl(): HTMLElement {\r\n return this._menuEl;\r\n }\r\n\r\n get keyboardHandler(): any {\r\n return this._keyboardHandler;\r\n }\r\n\r\n get menuListEl(): HTMLElement | undefined {\r\n if (this._menuListEl) {\r\n return this._menuListEl;\r\n }\r\n }\r\n\r\n set menuListEl(el: HTMLElement | undefined) {\r\n this._menuListEl = el;\r\n }\r\n}\r\n","import { IPayload } from '../../types/analytics';\r\nimport { ANALYTICS_CONSTANTS, track } from '../../utils/analytics';\r\nimport { determineSection } from '../storeChooser/storeChooserSearch';\r\nimport ListMenu from './ListMenu';\r\n\r\nexport interface IDelayedListMenu {\r\n handleMouseover(): void;\r\n render(force: boolean): void;\r\n}\r\n\r\nexport default abstract class DelayedListMenu extends ListMenu implements IDelayedListMenu {\r\n private _rendered: boolean;\r\n menuName: string | undefined;\r\n\r\n constructor(toggleButtonEl: HTMLElement, menuEl: HTMLElement, menuName?: string) {\r\n super(toggleButtonEl, menuEl);\r\n this._rendered = false;\r\n this.menuName = menuName;\r\n }\r\n\r\n public handleOpenButtonClick(): void {\r\n this.render();\r\n super.handleOpenButtonClick();\r\n }\r\n\r\n public handleOpenButtonKeydown(event: KeyboardEvent) {\r\n this.render();\r\n super.handleOpenButtonKeydown(event);\r\n }\r\n\r\n public handleMouseover() {\r\n this.render();\r\n }\r\n\r\n abstract buildMenuHTML(): string;\r\n\r\n public render(force = false): void {\r\n if (!this._rendered || force) {\r\n this._rendered = true;\r\n this.menuEl.innerHTML = this.buildMenuHTML();\r\n let menuListEl = this.menuEl.querySelector('ul');\r\n this.menuListEl = menuListEl as HTMLElement;\r\n const location = determineSection(menuListEl as HTMLElement);\r\n this.menuEl.querySelectorAll('a').forEach(link=>{\r\n link.addEventListener('click', (e:Event)=> {\r\n const clickedEl = e.currentTarget as HTMLElement;\r\n const name = clickedEl.textContent;\r\n const payload = {\r\n event: ANALYTICS_CONSTANTS.EVENTS.click,\r\n \"linkDetails\": {\r\n \"name\": name,\r\n \"position\": `${location}-${this.menuName}`\r\n }\r\n } as IPayload;\r\n track(payload);\r\n })\r\n })\r\n }\r\n }\r\n}\r\n","import * as cookie from '../../storage/cookie';\r\nimport DelayedListMenu from '../menu/DelayedListMenu';\r\nimport { content } from '../../content';\r\n\r\nexport default class MyProfileMenu extends DelayedListMenu {\r\n constructor() {\r\n let toggleButtonEl = document.querySelector(\r\n `#${content.HEADER.id} #${content.MY_PROFILE.buttonId}`\r\n ) as HTMLElement;\r\n let menuEl = document.querySelector(`#${content.HEADER.id} #${content.MY_PROFILE.menuId}`) as HTMLElement;\r\n\r\n super(toggleButtonEl, menuEl,'profile');\r\n }\r\n\r\n buildMenuHTML() {\r\n let html = !cookie.isAuthenticated()\r\n ? content.MY_PROFILE.unauthenticatedMenu.innerHTML\r\n : cookie.hasCustomerHubStore()\r\n ? content.MY_PROFILE.authenticatedMenuWithHub.innerHTML\r\n : content.MY_PROFILE.authenticatedMenu.innerHTML;\r\n return html;\r\n }\r\n}\r\n","import DelayedListMenu from '../menu/DelayedListMenu';\r\nimport ISeoLinkOptimizer from '../../utils/seo';\r\nimport { content } from '../../content';\r\n\r\nexport default class MoreLinksMenu extends DelayedListMenu {\r\n private seoLinkOptimizer?: ISeoLinkOptimizer; // optional because the constructor doesn't always call super()\r\n\r\n constructor(optimizer: ISeoLinkOptimizer) {\r\n let toggleButtonEl = document.querySelector(\r\n `#${content.HEADER.id} #${content.MORE_LINKS.button.id}`\r\n ) as HTMLElement;\r\n let menuEl = document.querySelector(`#${content.HEADER.id} #${content.MORE_LINKS.menuId}`) as HTMLElement;\r\n super(toggleButtonEl, menuEl, 'more');\r\n if (toggleButtonEl && menuEl) {\r\n this.seoLinkOptimizer = optimizer;\r\n }\r\n }\r\n\r\n buildMenuHTML() {\r\n return content.MORE_LINKS.defaultMenu.buildInnerHTML(\r\n this.seoLinkOptimizer && this.seoLinkOptimizer.shouldRenderSeoOptimizedLinks()\r\n );\r\n }\r\n\r\n\r\n}\r\n","import { NearestStoreLocalStorage } from '../types/storage';\r\nimport { Store } from '../types/store';\r\n\r\nconst FIVE_MINUTES = 300000;\r\n\r\nexport const NEAREST_STORE = {\r\n key: 'kmx-nearest-store',\r\n expiration: FIVE_MINUTES,\r\n};\r\n\r\nexport const getStore = (id: Store['Id']): Store | null => {\r\n try {\r\n let serializedNearestStore = localStorage.getItem(NEAREST_STORE.key);\r\n\r\n if (serializedNearestStore) {\r\n let nearestStoreLocalStorage: NearestStoreLocalStorage = JSON.parse(serializedNearestStore);\r\n\r\n if (\r\n !nearestStoreLocalStorage.expires ||\r\n (nearestStoreLocalStorage.expires && nearestStoreLocalStorage.expires < new Date().getTime())\r\n ) {\r\n localStorage.removeItem(NEAREST_STORE.key);\r\n }\r\n\r\n if (nearestStoreLocalStorage.store.Id === id) {\r\n return nearestStoreLocalStorage.store;\r\n }\r\n }\r\n return null;\r\n } catch (e) {\r\n console.error('Error getting nearest store from localStorage: ', e);\r\n return null;\r\n }\r\n};\r\n\r\nexport const setStore = (store: Store): void => {\r\n try {\r\n const nearestStoreLocalStorage: NearestStoreLocalStorage = {\r\n store: store,\r\n expires: new Date().getTime() + NEAREST_STORE.expiration,\r\n };\r\n\r\n localStorage.setItem(NEAREST_STORE.key, JSON.stringify(nearestStoreLocalStorage));\r\n } catch (e) {\r\n console.error('Error saving nearest store to localStorage: ', e);\r\n }\r\n};\r\n\r\nexport const getRecentSearchesFromLocalStorage = () => {\r\n const recentSearchesString = window && window.localStorage && window.localStorage.getItem('kmx-recent-searches');\r\n return recentSearchesString ? JSON.parse(recentSearchesString) : [];\r\n};\r\n","import DialogMenu from './DialogMenu';\r\nimport { content } from '../../content';\r\nimport { MENU_CLASSES, MENU_DATA_ATTR, NORMALIZED_KEYS, normalizeKey } from './constants';\r\n\r\nexport const handleOpenButtonKeydown = (event: KeyboardEvent, menu: DialogMenu) => {\r\n let key = normalizeKey(event.key);\r\n if (key) {\r\n switch (key) {\r\n case NORMALIZED_KEYS.Enter:\r\n case NORMALIZED_KEYS.Space:\r\n handleOpenButtonEnterSpace(event, menu);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleCloseButtonKeydown = (event: KeyboardEvent, menu: DialogMenu) => {\r\n let key = normalizeKey(event.key);\r\n if (key) {\r\n switch (key) {\r\n case NORMALIZED_KEYS.Enter:\r\n case NORMALIZED_KEYS.Space:\r\n handleCloseButtonEnterSpace(event, menu);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleMenuKeydown = (event: KeyboardEvent, menu: DialogMenu) => {\r\n let key = normalizeKey(event.key);\r\n if (key) {\r\n switch (key) {\r\n case NORMALIZED_KEYS.Escape:\r\n handleMenuEscape(menu);\r\n break;\r\n case NORMALIZED_KEYS.Tab:\r\n handleMenuTab(event, menu);\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n};\r\n\r\nexport const handleMenuOpen = (menu: DialogMenu) => {\r\n menu.toggleButtonEl.classList.add(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.remove('visibility-hidden')\r\n menu.menuEl.classList.add(MENU_CLASSES.menuOpen);\r\n menu.toggleButtonEl.setAttribute('aria-expanded', 'true');\r\n};\r\n\r\nexport const handleMenuClose = (menu: DialogMenu) => {\r\n menu.toggleButtonEl.classList.remove(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.remove(MENU_CLASSES.menuOpen);\r\n menu.toggleButtonEl.setAttribute('aria-expanded', 'false');\r\n};\r\n\r\nfunction handleOpenButtonEnterSpace(event: KeyboardEvent, menu: DialogMenu) {\r\n if (!menu.open) {\r\n event.preventDefault();\r\n menu.openMenu();\r\n setOpenMenuAccessibility(menu);\r\n }\r\n}\r\n\r\nfunction handleCloseButtonEnterSpace(event: KeyboardEvent, menu: DialogMenu) {\r\n if (menu.open) {\r\n event.preventDefault();\r\n menu.closeMenu();\r\n setCloseMenuAccessibility(menu);\r\n }\r\n}\r\n\r\nfunction handleMenuEscape(menu: DialogMenu) {\r\n if (menu.open) {\r\n menu.closeMenu();\r\n }\r\n setCloseMenuAccessibility(menu);\r\n}\r\n\r\nfunction setOpenMenuAccessibility(menu: DialogMenu) {\r\n let focusableEl = menu.menuEl.querySelector(`[${MENU_DATA_ATTR.dialog}=\"${MENU_DATA_ATTR.focusStart}\"]`);\r\n if (focusableEl) {\r\n (focusableEl as HTMLElement).focus();\r\n if (menu.closeButtonEl) {\r\n focusableEl.removeAttribute(MENU_DATA_ATTR.dialog);\r\n menu.closeButtonEl.setAttribute(MENU_DATA_ATTR.dialog, MENU_DATA_ATTR.focusStart);\r\n }\r\n }\r\n menu.toggleButtonEl.classList.add(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.add(MENU_CLASSES.menuOpen);\r\n menu.toggleButtonEl.setAttribute('aria-expanded', 'true');\r\n}\r\n\r\nfunction setCloseMenuAccessibility(menu: DialogMenu) {\r\n menu.toggleButtonEl.focus();\r\n let menuFocusStartEl = document.querySelector(`#${content.MOBILE_NAV.focusStartId}`);\r\n if (menuFocusStartEl) {\r\n menuFocusStartEl.setAttribute(MENU_DATA_ATTR.dialog, MENU_DATA_ATTR.focusStart);\r\n }\r\n if (menu.closeButtonEl) {\r\n menu.closeButtonEl.removeAttribute(MENU_DATA_ATTR.dialog);\r\n }\r\n menu.toggleButtonEl.classList.remove(MENU_CLASSES.buttonFocus);\r\n menu.menuEl.classList.remove(MENU_CLASSES.menuOpen);\r\n menu.toggleButtonEl.setAttribute('aria-expanded', 'false');\r\n}\r\n\r\nfunction handleMenuTab(event: KeyboardEvent, menu: DialogMenu) {\r\n processTab(menu, event);\r\n}\r\n\r\nfunction processTab(menu: DialogMenu, event: KeyboardEvent) {\r\n if (menu.open && menu.menuEl && event.target) {\r\n let childMenuEvent = isChildMenuEvent(event);\r\n let dialogDataAttr = (event.target as HTMLElement).getAttribute(MENU_DATA_ATTR.dialog);\r\n\r\n if (!event.shiftKey) {\r\n if (dialogDataAttr === MENU_DATA_ATTR.focusEnd) {\r\n selectFirstFocusableEl(menu, event);\r\n }\r\n if (childMenuEvent) {\r\n selectFirstFocusableEl(menu, event);\r\n }\r\n }\r\n\r\n if (event.shiftKey) {\r\n if (dialogDataAttr === MENU_DATA_ATTR.focusStart) {\r\n selectLastFocusableEl(menu, event);\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction selectFirstFocusableEl(menu: DialogMenu, event: KeyboardEvent): void {\r\n event.preventDefault();\r\n let firstFocusableEl = menu.menuEl.querySelector(`[${MENU_DATA_ATTR.dialog}=\"${MENU_DATA_ATTR.focusStart}\"]`);\r\n if (firstFocusableEl) {\r\n (firstFocusableEl as HTMLElement).focus();\r\n }\r\n}\r\n\r\nfunction selectLastFocusableEl(menu: DialogMenu, event: KeyboardEvent): void {\r\n event.preventDefault();\r\n let lastFocusableEl = menu.menuEl.querySelector(`[${MENU_DATA_ATTR.dialog}=\"${MENU_DATA_ATTR.focusEnd}\"]`);\r\n if (lastFocusableEl) {\r\n (lastFocusableEl as HTMLElement).focus();\r\n }\r\n}\r\n\r\nfunction isChildMenuEvent(event: KeyboardEvent): boolean {\r\n let eventPath = (event as any).path || ((event as any).composedPath && (event as any).composedPath());\r\n let isChild = false;\r\n\r\n if (eventPath) {\r\n let openMenus = 0;\r\n\r\n eventPath.forEach((el: Element) => {\r\n if (el.classList && el.classList.contains(MENU_CLASSES.menuOpen)) {\r\n openMenus++;\r\n }\r\n });\r\n\r\n isChild = openMenus > 1;\r\n }\r\n\r\n return isChild;\r\n}\r\n","import * as dialogMenuKeyboardHandler from './dialogMenuKeyboardHandler';\r\nimport Menu from './Menu';\r\n\r\nexport interface IDialogMenu {\r\n closeButtonEl?: HTMLElement;\r\n}\r\n\r\nexport default class DialogMenu extends Menu implements IDialogMenu {\r\n private _toggleButtonEl: HTMLElement;\r\n private _menuEl: HTMLElement;\r\n private _closeButtonEl?: HTMLElement;\r\n private _keyboardHandler: any;\r\n\r\n constructor(toggleButtonEl: HTMLElement, menuEl: HTMLElement, closeButtonEl?: HTMLElement) {\r\n super();\r\n this._toggleButtonEl = toggleButtonEl;\r\n this._menuEl = menuEl;\r\n this._closeButtonEl = closeButtonEl;\r\n this._keyboardHandler = dialogMenuKeyboardHandler;\r\n }\r\n\r\n get toggleButtonEl(): HTMLElement {\r\n return this._toggleButtonEl;\r\n }\r\n\r\n get menuEl(): HTMLElement {\r\n return this._menuEl;\r\n }\r\n\r\n get closeButtonEl(): HTMLElement | undefined {\r\n return this._closeButtonEl;\r\n }\r\n\r\n get keyboardHandler(): any {\r\n return this._keyboardHandler;\r\n }\r\n}\r\n","import { content } from '../../content';\r\nimport { IPayload } from '../../types/analytics';\r\nimport { ANALYTICS_CONSTANTS, track } from '../../utils/analytics';\r\nimport { determineSection } from '../storeChooser/storeChooserSearch';\r\nimport DialogMenu from './DialogMenu';\r\n\r\nexport interface IDelayedDialogMenu {\r\n handleMouseover(): void;\r\n render(force: boolean): void;\r\n}\r\n\r\nexport default abstract class DelayedDialogMenu extends DialogMenu implements IDelayedDialogMenu {\r\n private _rendered: boolean;\r\n menuName: string;\r\n\r\n constructor(toggleButtonEl: HTMLElement, menuEl: HTMLElement, menuName: string, closeButtonEl?: HTMLElement, ) {\r\n super(toggleButtonEl, menuEl, closeButtonEl);\r\n this._rendered = false;\r\n this.menuName = menuName;\r\n }\r\n\r\n public handleOpenButtonClick(): void {\r\n this.render();\r\n super.handleOpenButtonClick();\r\n }\r\n\r\n public handleOpenButtonKeydown(event: KeyboardEvent) {\r\n this.render();\r\n super.handleOpenButtonKeydown(event);\r\n }\r\n\r\n public handleMouseover() {\r\n this.render();\r\n }\r\n\r\n abstract buildMenuHTML(): string;\r\n\r\n public render(force = false): void {\r\n if (!this._rendered || force) {\r\n this._rendered = true;\r\n this.menuEl.innerHTML = this.buildMenuHTML();\r\n\r\n const menuLinks = this.menuEl.querySelectorAll('a');\r\n menuLinks.forEach((link)=>{\r\n link.addEventListener('click', (e:Event)=>{\r\n const clickedEl = e.currentTarget as HTMLAnchorElement;\r\n const location = determineSection(clickedEl);\r\n const name = clickedEl.innerText;\r\n const event = name.toLowerCase().trim() === 'see cars at this store' ? ANALYTICS_CONSTANTS.EVENTS.searchInitiated : ANALYTICS_CONSTANTS.EVENTS.click;\r\n const payload = {\r\n \"event\": event,\r\n \"linkDetails\": {\r\n \"name\": name,\r\n \"position\": `${location}-${this.menuName}`\r\n }\r\n } as IPayload;\r\n track(payload);\r\n })\r\n })\r\n\r\n\r\n const headerStoreSearchForm = this.menuEl.querySelector(`#${content.HEADER_MY_STORE.storeSearchFormId}`) as HTMLFormElement;\r\n headerStoreSearchForm?.addEventListener('submit',(e)=>{\r\n const data = new FormData(headerStoreSearchForm);\r\n const location = determineSection(e.currentTarget as HTMLElement);\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.storeChange,\r\n \"linkDetails\" : {\r\n \"name\": data?.get('keyword'),\r\n \"position\": `${location}-${this.menuName}`\r\n }\r\n } as IPayload;\r\n track(payload);\r\n })\r\n\r\n\r\n const footerStoreSearchForm = this.menuEl.querySelector(`#${content.FOOTER_MY_STORE.storeSearchFormId}`) as HTMLFormElement;\r\n footerStoreSearchForm?.addEventListener('submit',(e)=>{\r\n const data = new FormData(footerStoreSearchForm);\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.storeChangeFooter,\r\n \"linkDetails\": {\r\n \"name\": data?.get('keyword'),\r\n \"position\": `footer-${this.menuName}`\r\n }\r\n } as IPayload;\r\n track(payload);\r\n })\r\n }\r\n }\r\n}\r\n","import DelayedDialogMenu from '../menu/DelayedDialogMenu';\r\nimport NearestStore from './NearestStore';\r\nimport { content } from '../../content';\r\n\r\ninterface INearestStoreMenu {\r\n type: 'header' | 'footer';\r\n}\r\n\r\nexport default class NearestStoreMenu extends DelayedDialogMenu implements INearestStoreMenu {\r\n private _type: 'header' | 'footer';\r\n private _nearestStore: NearestStore;\r\n\r\n constructor(type: 'header' | 'footer', nearestStore: NearestStore) {\r\n const componentConst = type === 'header' ? 'HEADER' : 'FOOTER';\r\n const myStoreConst = type === 'header' ? 'HEADER_MY_STORE' : 'FOOTER_MY_STORE';\r\n const componentId = content[componentConst].id;\r\n const menuId = content[myStoreConst].menuId;\r\n\r\n let toggleButtonEl = document.querySelector(\r\n `#${(content as any)[componentConst].id} #${(content as any)[`${componentConst}_MY_STORE`].buttonId}`\r\n ) as HTMLElement;\r\n let menuEl = document.querySelector(`#${componentId} #${menuId}`) as HTMLElement;\r\n\r\n super(toggleButtonEl, menuEl, 'location');\r\n\r\n this._type = type;\r\n this._nearestStore = nearestStore;\r\n }\r\n\r\n get type(): 'header' | 'footer' {\r\n return this._type;\r\n }\r\n\r\n buildMenuHTML() {\r\n return content.MY_STORE_DETAILS.getInnerHtml(this._nearestStore.nearestStore, this._nearestStore.storeAvailability, this._type);\r\n }\r\n}\r\n","import * as constants from '../../constants';\r\nimport { DEFAULT_STORE_AVAILABILITY, EMPTY_STORE } from '../../constants';\r\nimport { content, icons } from '../../content';\r\nimport * as cookie from '../../storage/cookie';\r\nimport * as storage from '../../storage/storage';\r\nimport * as storesApi from './storesApi';\r\nimport NearestStoreMenu from './NearestStoreMenu';\r\nimport { ANALYTICS_CONSTANTS, track } from '../../utils/analytics';\r\nimport { IPayload } from '../../types/analytics';\r\nimport { Store, StoreAvailability } from '../../types/store';\r\n\r\ninterface ISubscribeToStoreUpdatesEventDetail {\r\n done: (store: Store) => any;\r\n}\r\nexport type SubscribeToStoreUpdatesEventDetail = ISubscribeToStoreUpdatesEventDetail;\r\n\r\ninterface IOpenStoreSelectionModal {\r\n done?: () => any;\r\n stateOrZip: string|number;\r\n}\r\nexport type OpenStoreSelectionModalEventDetail = IOpenStoreSelectionModal;\r\n\r\ninterface ISetStoreEventDetail {\r\n done?: () => any;\r\n store: Store;\r\n}\r\nexport type SetStoreEventDetail = ISetStoreEventDetail;\r\n\r\ninterface ISetStoreByIdEventDetail {\r\n distanceInMiles: number;\r\n done?: (store: Store) => any;\r\n id: Store['Id'];\r\n reload?: boolean;\r\n}\r\nexport type SetStoreByIdEventDetail = ISetStoreByIdEventDetail;\r\n\r\nexport interface INearestStore {\r\n headerMenu: NearestStoreMenu;\r\n footerMenu: NearestStoreMenu;\r\n nearestStore: Store;\r\n initialRenderingComplete: boolean;\r\n flyoutOpen: { [index: string]: boolean };\r\n footerFlyoutOpen: boolean;\r\n storeUpdateSubscribers: SubscribeToStoreUpdatesEventDetail['done'][];\r\n init(): void;\r\n attachSubscribeToStoreUpdatesEventListener(): void;\r\n attachSetStoreEventListener(): void;\r\n attachSetStoreByIdEventListener(): void;\r\n attachSetStoreByIdOnloadEventListener():void;\r\n attachOpenStoreSelectionModalListener(): void;\r\n handleLoad(store: Store): void;\r\n load(): void;\r\n toggle(isTarget: boolean, type: 'header' | 'footer'): void;\r\n handleButtonKeydown(event: KeyboardEvent, string: 'header' | 'footer'): void;\r\n handleMenuKeydown(event: KeyboardEvent, string: 'header' | 'footer'): void;\r\n handleMouseover(): void;\r\n handleClickOutside(type: 'header' | 'footer'): void;\r\n renderHeaderStoreName(): void;\r\n renderFooterStoreName(): void;\r\n renderHeaderStoreAlerts(hasAlert: boolean): void;\r\n renderFooterStoreAlerts(hasAlert: boolean): void;\r\n renderAll(force: boolean): void;\r\n update(store: Store): void;\r\n}\r\n\r\nexport default class NearestStore implements INearestStore {\r\n private _nearestStore: Store;\r\n private _storeAvailability: StoreAvailability;\r\n headerMenu: NearestStoreMenu;\r\n footerMenu: NearestStoreMenu;\r\n initialRenderingComplete: boolean;\r\n flyoutOpen: { [index: string]: boolean };\r\n footerFlyoutOpen: boolean;\r\n storeUpdateSubscribers: SubscribeToStoreUpdatesEventDetail['done'][];\r\n menuLocation: string;\r\n\r\n constructor() {\r\n this._nearestStore = EMPTY_STORE;\r\n this._storeAvailability = DEFAULT_STORE_AVAILABILITY;\r\n this.initialRenderingComplete = false;\r\n this.flyoutOpen = { header: false, footer: false };\r\n this.footerFlyoutOpen = false;\r\n this.storeUpdateSubscribers = [];\r\n this.menuLocation = '';\r\n\r\n this.attachSubscribeToStoreUpdatesEventListener();\r\n this.attachSetStoreEventListener();\r\n this.attachSetStoreByIdEventListener();\r\n this.attachSetStoreByIdOnloadEventListener();\r\n this.attachOpenStoreSelectionModalListener();\r\n\r\n this.headerMenu = new NearestStoreMenu('header', this);\r\n this.footerMenu = new NearestStoreMenu('footer', this);\r\n }\r\n\r\n public init(): void {\r\n this.load();\r\n }\r\n\r\n get nearestStore(): Store {\r\n return this._nearestStore;\r\n }\r\n\r\n set nearestStore(store: Store) {\r\n this._nearestStore = store;\r\n\r\n this.storeUpdateSubscribers.forEach((subscriber: SubscribeToStoreUpdatesEventDetail['done']) => {\r\n subscriber(store);\r\n });\r\n }\r\n\r\n get storeAvailability(): StoreAvailability {\r\n return this._storeAvailability;\r\n }\r\n\r\n set storeAvailability(storeAvailability: StoreAvailability) {\r\n this._storeAvailability = storeAvailability;\r\n }\r\n\r\n public attachSubscribeToStoreUpdatesEventListener(): void {\r\n document.documentElement.addEventListener(constants.SUBSCRIBE_TO_STORE_UPDATES_CUSTOM_EVENT, ((\r\n event: CustomEvent\r\n ) => {\r\n const eventDetail: SubscribeToStoreUpdatesEventDetail = event.detail;\r\n\r\n if (eventDetail.done && typeof eventDetail.done === 'function') {\r\n if (this.nearestStore.Id) {\r\n eventDetail.done(this.nearestStore);\r\n }\r\n this.storeUpdateSubscribers.push(eventDetail.done);\r\n }\r\n }) as EventListener);\r\n }\r\n\r\n public attachSetStoreEventListener(): void {\r\n document.documentElement.addEventListener(constants.SET_STORE_CUSTOM_EVENT, ((event: CustomEvent) => {\r\n const eventDetail: SetStoreEventDetail = event.detail;\r\n this.update(eventDetail.store);\r\n if (eventDetail.done && typeof eventDetail.done === 'function') {\r\n eventDetail.done();\r\n }\r\n }) as EventListener);\r\n }\r\n\r\n public attachOpenStoreSelectionModalListener(): void {\r\n document.documentElement.addEventListener(\r\n constants.OPEN_STORE_SELECTION_MODAL_EVENT, ((event: CustomEvent) => {\r\n const eventDetail: OpenStoreSelectionModalEventDetail = event.detail;\r\n\r\n const customEvent = new CustomEvent(content.STORE_CHOOSER.EVENT_NAMES.headerKeywordInput, { detail: { keyword: eventDetail.stateOrZip }});\r\n dispatchEvent(customEvent);\r\n }) as EventListener);\r\n }\r\n\r\n public attachSetStoreByIdEventListener(): void {\r\n document.documentElement.addEventListener(constants.SET_STORE_BY_ID_CUSTOM_EVENT, ((event: CustomEvent) => {\r\n this.setStoreByID(true,event)\r\n\r\n }) as EventListener);\r\n }\r\n\r\n public setStoreByID(sendDataToAdobeAnalytics:boolean, event: CustomEvent):void {\r\n\r\n const eventDetail: SetStoreByIdEventDetail = event.detail;\r\n const currentStore = cookie.getStoreId();\r\n\r\n\r\n\r\n if(eventDetail.id && currentStore !== eventDetail.id) {\r\n\r\n storesApi.getStore(eventDetail.id, (store: Store) => {\r\n if (store && store.Id) {\r\n cookie.setStoreCookie(store);\r\n store.DistanceInMiles = eventDetail.distanceInMiles ? eventDetail.distanceInMiles : 0;\r\n this.update(store);\r\n }\r\n if (eventDetail.done && typeof eventDetail.done === 'function') {\r\n eventDetail.done(store);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @description set store onload without sending data to adobe analytics\r\n */\r\n public attachSetStoreByIdOnloadEventListener(): void {\r\n document.documentElement.addEventListener(constants.SET_STORE_BY_ID_ONLOAD_CUSTOM_EVENT, ((event: CustomEvent) => {\r\n this.setStoreByID(false,event)\r\n }) as EventListener);\r\n }\r\n\r\n public handleLoad(store: Store): void {\r\n this.nearestStore = store;\r\n\r\n this.renderHeaderStoreName();\r\n this.renderFooterStoreName();\r\n this.renderHeaderStoreAlerts(!!this.nearestStore.AlertMessage);\r\n this.renderFooterStoreAlerts(!!this.nearestStore.AlertMessage);\r\n\r\n if (this.initialRenderingComplete) {\r\n this.renderAll(true);\r\n }\r\n }\r\n\r\n public load(): void {\r\n let nearestStoreId = cookie.getStoreId();\r\n\r\n function validateCachedStoreExists(cStore: Store): boolean {\r\n return cStore && cStore.Id && cStore.Hours ? true : false;\r\n }\r\n\r\n if (!nearestStoreId) {\r\n this.handleLoad(EMPTY_STORE);\r\n } else {\r\n let cachedStore: Store | null = storage.getStore(nearestStoreId);\r\n\r\n if (cachedStore && validateCachedStoreExists(cachedStore)) {\r\n this.handleLoad(cachedStore);\r\n } else {\r\n storesApi.getStore(nearestStoreId, (store: Store) => {\r\n storage.setStore(store);\r\n this.handleLoad(store);\r\n });\r\n }\r\n\r\n // Ideally this would be combined with getStore request\r\n // But the store data caching used both here and in the stores api would make it difficult.\r\n storesApi.getStoreAvailability(nearestStoreId, (availability: StoreAvailability) => {\r\n this.storeAvailability = availability;\r\n this.handleLoad(this.nearestStore);\r\n });\r\n }\r\n }\r\n\r\n public toggle(isTarget: boolean, type: string): void {\r\n this.menuLocation = type;\r\n if (isTarget) {\r\n if (!this.initialRenderingComplete) {\r\n this.renderAll();\r\n this.initialRenderingComplete = true;\r\n }\r\n type === 'header' ? this.headerMenu.handleOpenButtonClick() : this.footerMenu.handleOpenButtonClick();\r\n }\r\n\r\n function closeStoreMenuOnInputSubmit(menuToClose: NearestStoreMenu) {\r\n menuToClose.handleCloseButtonClick();\r\n }\r\n\r\n const activeMenu: NearestStoreMenu = type === 'header' ? this.headerMenu : this.footerMenu;\r\n const searchHeaderInputForm: HTMLFormElement | null = document.querySelector(\r\n `#${content.HEADER_MY_STORE.storeSearchFormId}`\r\n );\r\n const searchFooterInputForm: HTMLFormElement | null = document.querySelector(\r\n `#${content.FOOTER_MY_STORE.storeSearchFormId}`\r\n );\r\n if (searchHeaderInputForm) {\r\n searchHeaderInputForm.addEventListener('submit', (e: Event) => {\r\n const formData = new FormData(searchHeaderInputForm);\r\n const keywordInput = formData.get('keyword');\r\n const keywordInputEvent = new CustomEvent(content.STORE_CHOOSER.EVENT_NAMES.headerKeywordInput, {\r\n detail: { keyword: keywordInput }\r\n });\r\n dispatchEvent(keywordInputEvent);\r\n closeStoreMenuOnInputSubmit(activeMenu);\r\n });\r\n }\r\n if (searchFooterInputForm) {\r\n searchFooterInputForm.addEventListener('submit', (e: Event) => {\r\n const formData = new FormData(searchFooterInputForm);\r\n const keywordInput = formData.get('keyword');\r\n const keywordInputEvent = new CustomEvent(content.STORE_CHOOSER.EVENT_NAMES.headerKeywordInput, {\r\n detail: { keyword: keywordInput }\r\n });\r\n dispatchEvent(keywordInputEvent);\r\n closeStoreMenuOnInputSubmit(activeMenu);\r\n });\r\n }\r\n }\r\n\r\n public handleButtonKeydown(event: KeyboardEvent, type: 'header' | 'footer'): void {\r\n type === 'header'\r\n ? this.headerMenu.handleOpenButtonKeydown(event)\r\n : this.footerMenu.handleOpenButtonKeydown(event);\r\n }\r\n\r\n public handleMenuKeydown(event: KeyboardEvent, type: 'header' | 'footer'): void {\r\n type === 'header' ? this.headerMenu.handleMenuKeydown(event) : this.footerMenu.handleMenuKeydown(event);\r\n }\r\n\r\n public handleMouseover(): void {\r\n if (!this.initialRenderingComplete) {\r\n this.renderAll();\r\n this.initialRenderingComplete = true;\r\n }\r\n }\r\n\r\n public handleClickOutside(type: 'header' | 'footer'): void {\r\n type === 'header' ? this.headerMenu.handleClickOutside() : this.footerMenu.handleClickOutside();\r\n }\r\n\r\n public renderHeaderStoreName(): void {\r\n let headerButtonEl: HTMLElement | null = document.querySelector(`#${content.HEADER_MY_STORE.buttonId}`);\r\n const zipCodeToDisplay = cookie.getUserEnteredZipCode() ?? this.nearestStore.ZipCode;\r\n\r\n // Inject new html so that other repositories do not have to rebuild/deploy html changes.\r\n if (headerButtonEl) {\r\n headerButtonEl.classList.add('visible');\r\n if (this.nearestStore.Id) {\r\n headerButtonEl.innerHTML = '';\r\n let buttonHtml = headerButtonEl.innerHTML;\r\n let locationIconHtml = `<svg class=\"header-footer-icon\" width=\"40\" height=\"40\"\r\n viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.29 11c0-5.35 4.36-9.71 9.71-9.71 5.35 0 9.71 4.12 9.71 9.71 0 5.569-6.153 9.57-8.207 10.905l-.023.015c-.45.29-.97.44-1.48.44s-1.03-.15-1.48-.44C8.48 20.6 2.29 16.35 2.29 11Zm8.97 9.711.03.019c.43.28.99.28 1.42 0 1.87-1.21 7.58-4.91 7.58-9.73 0-4.57-3.72-8.29-8.29-8.29-4.57 0-8.29 3.48-8.29 8.29 0 4.785 5.651 8.472 7.55 9.711ZM8.29 11c0-2.05 1.66-3.71 3.71-3.71s3.71 1.66 3.71 3.71-1.66 3.71-3.71 3.71S8.29 13.05 8.29 11Zm1.42 0c0 1.26 1.03 2.29 2.29 2.29s2.29-1.03 2.29-2.29S13.26 8.71 12 8.71 9.71 9.74 9.71 11Z\" />\r\n <circle class=\"hidden header-footer-location-icon-alert-circle\" cx=\"19\" cy=\"4\" r=\"4\"\r\n stroke=\"white\" stroke-width=\"1\" />\r\n </svg>`;\r\n let appendHtml = `<div class=\"header-footer-flyout-button-text-container\">\r\n <span id=\"header-my-store-button-zipCode\">Your store for ${zipCodeToDisplay}</span>\r\n <div class=\"header-find-your-store-container\">\r\n <span id=\"header-my-store-button-text\">${this.nearestStore.Name}</span>\r\n <svg class=\"header-footer-icon--secondary\" width=\"20\" height=\"15\" viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n </div>\r\n </div>`;\r\n headerButtonEl.innerHTML = locationIconHtml + buttonHtml + appendHtml;\r\n }\r\n } else {\r\n let headerMyStoreButton = <HTMLElement>(\r\n document.querySelector(\r\n `#${content.HEADER.id} #${content.HEADER_MY_STORE.buttonId} > .${content.HEADER_MY_STORE.iconClass}`\r\n )\r\n );\r\n let headerMyStoreSection = <HTMLElement>(\r\n document.querySelector(`#${content.HEADER.id} .${content.HEADER_MY_STORE.sectionClass}`)\r\n );\r\n\r\n if (headerMyStoreButton) {\r\n headerMyStoreButton.classList.add(content.CLASSNAMES.visible);\r\n }\r\n if (headerMyStoreSection) {\r\n headerMyStoreSection.classList.add(content.HEADER_MY_STORE.sectionClassNoStore);\r\n }\r\n }\r\n }\r\n\r\n public renderFooterStoreName(): void {\r\n let footerFlyoutButtonTextEl = document.querySelector(\r\n `#${content.FOOTER.id} #${content.FOOTER_MY_STORE.buttonTextId}`\r\n );\r\n if (footerFlyoutButtonTextEl && this.nearestStore.Id) {\r\n footerFlyoutButtonTextEl.textContent = this.nearestStore.Name;\r\n }\r\n }\r\n\r\n private renderHeaderAlertInfoIcon(hasAlert: boolean): void {\r\n let existingStoreAlertContainerEl = <HTMLElement>(\r\n document.querySelector(`#${content.HEADER.id} .${content.HEADER_MY_STORE.alertInfoIconContainerClass}`)\r\n );\r\n\r\n if (hasAlert) {\r\n let headerMyStoreButtonEl = <HTMLElement>(\r\n document.querySelector(`#${content.HEADER.id} #${content.HEADER_MY_STORE.buttonId}`)\r\n );\r\n\r\n if (!existingStoreAlertContainerEl && headerMyStoreButtonEl) {\r\n let firstChildEl = headerMyStoreButtonEl.firstChild;\r\n let storeAlertContainerEl = document.createElement('span');\r\n storeAlertContainerEl.classList.add(content.HEADER_MY_STORE.alertInfoIconContainerClass);\r\n storeAlertContainerEl.innerHTML = icons.buildAlertInfoIcon(content.HEADER_MY_STORE.alertInfoIconClass);\r\n headerMyStoreButtonEl.insertBefore(storeAlertContainerEl, firstChildEl);\r\n }\r\n } else {\r\n if (existingStoreAlertContainerEl && existingStoreAlertContainerEl.parentNode) {\r\n existingStoreAlertContainerEl.parentNode.removeChild(existingStoreAlertContainerEl);\r\n }\r\n }\r\n }\r\n\r\n private renderAlertLocationIcon(options: { hasAlert: boolean; type: 'HEADER' | 'FOOTER' }): void {\r\n let myStoreConstantName = options.type === 'HEADER' ? 'HEADER_MY_STORE' : 'FOOTER_MY_STORE';\r\n let svgCircleAlertEls = document.querySelectorAll(\r\n `#${(content[options.type] as any).id} .${\r\n ((content as any)[myStoreConstantName] as any).locationAlertCircleClass\r\n }`\r\n );\r\n let myStoreButton = document.querySelector(`#${((content as any)[myStoreConstantName] as any).buttonId}`);\r\n\r\n if (myStoreButton) {\r\n if (options.hasAlert) {\r\n myStoreButton.classList.add(((content as any)[myStoreConstantName] as any).buttonAlertClass);\r\n\r\n if (svgCircleAlertEls && svgCircleAlertEls.length > 0) {\r\n svgCircleAlertEls.forEach((el: Element) => {\r\n el && el.classList && el.classList.remove(content.CLASSNAMES.hidden);\r\n });\r\n }\r\n } else {\r\n myStoreButton.classList.remove(((content as any)[myStoreConstantName] as any).buttonAlertClass);\r\n\r\n if (svgCircleAlertEls.length > 0) {\r\n svgCircleAlertEls.forEach((el: Element) => {\r\n el && el.classList && el.classList.add(content.CLASSNAMES.hidden);\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n public renderHeaderStoreAlerts(hasAlert: boolean): void {\r\n this.renderHeaderAlertInfoIcon(hasAlert);\r\n this.renderAlertLocationIcon({ hasAlert: hasAlert, type: 'HEADER' });\r\n }\r\n\r\n public renderFooterStoreAlerts(hasAlert: boolean): void {\r\n this.renderAlertLocationIcon({ hasAlert: hasAlert, type: 'FOOTER' });\r\n }\r\n\r\n public renderAll(force = false): void {\r\n this.renderHeaderStoreName();\r\n this.renderFooterStoreName();\r\n this.renderHeaderStoreAlerts(!!this.nearestStore.AlertMessage);\r\n this.renderFooterStoreAlerts(!!this.nearestStore.AlertMessage);\r\n\r\n this.headerMenu.render(force);\r\n this.footerMenu.render(force);\r\n\r\n if (!this.initialRenderingComplete) {\r\n this.initialRenderingComplete = true;\r\n }\r\n }\r\n\r\n public update(store: Store): void {\r\n this.nearestStore = store;\r\n storage.setStore(store);\r\n this.renderAll(true);\r\n\r\n }\r\n}\r\n","\r\nexport const PERMANENTLY_NO_FOLLOWED_LINKS =['/supplier-inclusion','/pre-qual/app']\r\n\r\nexport const NUM_OPTIMIZED_LINKS = 22 - PERMANENTLY_NO_FOLLOWED_LINKS.length;\r\n\r\nexport const ENABLE_SEO_OPTIMIZED_LINKS = true;\r\n\r\nexport const SEO_OPTIMIZED_LINKS = [\r\n '/car-financing/carmax-auto-finance',\r\n '/about-carmax',\r\n '/help-center#contact-us',\r\n 'https://socialresponsibility.carmax.com/',\r\n 'https://foundation.carmax.com',\r\n 'https://media.carmax.com',\r\n 'https://investors.carmax.com',\r\n 'https://careers.carmax.com/us/en',\r\n '/service',\r\n '/help-center',\r\n '/car-buying-process/maxcare-service-plans',\r\n '/privacy-policy',\r\n '/privacy-policy/opt-out',\r\n '/home/docs/financial-privacy-policy-feb-2022.pdf',\r\n '/interest-based-ads',\r\n '/terms',\r\n '/faq/safety-recalls',\r\n '/terms#ca-disclosure',\r\n '/notice-of-accessibility'\r\n];\r\n","import * as constants from '../constants/seo';\r\n\r\nexport interface ISeoLinkOptimizer {\r\n enableSeoOptimizedLinks: boolean;\r\n optimizeServerRenderedLinks(): void;\r\n shouldRenderSeoOptimizedLinks(): boolean;\r\n};\r\n\r\nexport default class SeoLinkOptimizer implements ISeoLinkOptimizer {\r\n enableSeoOptimizedLinks: boolean;\r\n\r\n constructor() {\r\n this.enableSeoOptimizedLinks = constants.ENABLE_SEO_OPTIMIZED_LINKS;\r\n }\r\n\r\n public optimizeServerRenderedLinks(): void {\r\n if (!this.shouldRenderSeoOptimizedLinks()) { return }\r\n\r\n const footerLinks = document.querySelectorAll('.footer-link');\r\n footerLinks.forEach(el => {\r\n if (this.shouldOptimizeLink(el)) {\r\n this.addNofollow(el);\r\n }\r\n });\r\n }\r\n\r\n public shouldRenderSeoOptimizedLinks(): boolean {\r\n return (this.enableSeoOptimizedLinks && window.location.pathname !== '/');\r\n }\r\n\r\n private shouldOptimizeLink(element: Element): boolean {\r\n if (constants.SEO_OPTIMIZED_LINKS.findIndex(link => link === element.getAttribute('href')) > -1) {\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n private addNofollow(element: Element): void {\r\n element.setAttribute('rel', 'nofollow');\r\n };\r\n}\r\n","import { content } from '../../content';\r\n\r\nexport interface IStoreHourMenu {\r\n handleStoreStatusButtonClick(): void;\r\n}\r\n\r\nexport default class StoreHourMenu implements IStoreHourMenu {\r\n private showMenu = false;\r\n\r\n public handleStoreStatusButtonClick() {\r\n this.showMenu = !this.showMenu;\r\n const display = this.showMenu ? content.CLASSNAMES.visible : content.CLASSNAMES.hidden;\r\n\r\n let storeStatusMenuEl = document.getElementsByClassName(\r\n content.HEADER_FOOTER_FLYOUT_MENU.storeHoursMenuClass\r\n )[0];\r\n\r\n if (storeStatusMenuEl) {\r\n storeStatusMenuEl.className = content.HEADER_FOOTER_FLYOUT_MENU.storeHoursMenuClass + ' ' + display;\r\n }\r\n\r\n let storeStatusButtonEl = document.getElementsByClassName(\r\n content.HEADER_FOOTER_FLYOUT_MENU.storeHoursButtonClass\r\n )[0];\r\n\r\n if (storeStatusButtonEl) {\r\n storeStatusButtonEl.className =\r\n content.HEADER_FOOTER_FLYOUT_MENU.storeHoursButtonClass +\r\n ' ' +\r\n (this.showMenu ? content.CLASSNAMES.visible : '');\r\n }\r\n }\r\n}\r\n","import { content } from '../../content';\r\nimport * as constants from '../../constants';\r\n\r\nexport function closeModal() {\r\n const foundModal = document.querySelector(`#${content.STORE_CHOOSER.WRAPPER.id}`) as HTMLDivElement;\r\n if(foundModal) {\r\n foundModal.classList.remove(content.STORE_CHOOSER.WRAPPER.visibleClass);\r\n }\r\n const foundBodyElement = document.getElementsByTagName('body')[0] as HTMLBodyElement;\r\n const foundBaseHtmlElement = document.getElementsByTagName('html')[0] as HTMLHtmlElement;\r\n if(foundBodyElement) { foundBodyElement.classList.remove(content.CLASSNAMES.bodyScrollLock) };\r\n if(foundBaseHtmlElement) { foundBaseHtmlElement.classList.remove(content.CLASSNAMES.bodyScrollLock) };\r\n\r\n var event = new CustomEvent(constants.CLOSE_STORE_SELECTION_MODAL_EVENT);\r\n document.documentElement.dispatchEvent(event);\r\n}\r\n","import { defaultMarkup } from '../../../../generated_files/headerMarkup';\r\nimport { initDesktopHeaderTracking } from '../utils/analytics';\r\n\r\ninterface IHeaderAttributes {\r\n theme?: string | null;\r\n}\r\n\r\nconst htmlMarkup = ({ theme = '' }: IHeaderAttributes) => defaultMarkup(theme);\r\n\r\nclass Header extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n const theme = this.getAttribute('data-theme');\r\n this.innerHTML = htmlMarkup({ theme });\r\n setTimeout(() => {\r\n const header = this.querySelector('#header');\r\n header!.setAttribute('style', 'display:block');\r\n }, 100);\r\n\r\n initDesktopHeaderTracking(this);\r\n }\r\n}\r\n\r\nconst KMX_GLOBAL_HEADER = 'kmx-global-header';\r\nif (customElements.get(KMX_GLOBAL_HEADER) === undefined) {\r\n customElements.define(KMX_GLOBAL_HEADER, Header);\r\n} else {\r\n}\r\n","//Do Not Update this file: the contents of this file are generated via a script\n export const defaultMarkup = (theme:string | null)=>`\r\n<a id=\"skipMainContent\" href=\"#main-content-heading\" class=\"skip-nav\">Skip to main content</a>\r\n<header id=\"header\" class=\"${theme}\" role=\"banner\">\r\n <nav class=\"header-nav\" aria-label=\"primary\">\r\n <!-- Left nav -->\r\n <section class=\"header-nav-left\">\r\n <a id=\"carmax-logo-header\" href=\"/\" class=\"header-link\" data-kmx-analytics=\"prop5=Header\" aria-label=\"CarMax home page\">\r\n <!-- CarMax logo -->\r\n <svg class=\"header-main-logo\" viewBox=\"0 0 327.84 64\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path fill=\"#053361\"\r\n d=\"M289.8 5.05a1.1 1.1 0 0 0 .85-1.12c0-1.17-1.23-1.17-1.57-1.17h-1.65V7.4h.64V5.3h.8c.76 0 .94.2 1 .9a5.26 5.26 0 0 0 .23 1.2h.66a6.74 6.74 0 0 1-.28-1.46c-.05-.57-.2-.77-.7-.9zm-.72-.3h-1V3.3h1c.34 0 .92 0 .92.74s-.6.7-.92.7zM289 .8a4.33 4.33 0 1 0 4.32 4.32A4.34 4.34 0 0 0 289 .8zm0 8.2a3.83 3.83 0 1 1 3.8-3.84A3.82 3.82 0 0 1 289 9z\">\r\n </path>\r\n <path fill=\"#053361\"\r\n d=\"M129.42 54.55h32.32V64h-32.32v-9.45zm41.53 0V64h32.32v-9.45zm41.52 0V64h32.32v-9.45zm41.52 0V64h32.3v-9.45zm41.52 0V64h32.32v-9.45z\">\r\n </path>\r\n <path fill=\"#053361\"\r\n d=\"M129.57 42.43V1.23h16.26l.4 6.24h.15c2.82-5.9 7-7.47 10.88-7.47 5.3 0 9.16 2.38 11.3 7.47 2.82-5.9 7-7.47 10.88-7.47 7 0 12 4.1 12 15v27.43h-16.7V16.58c0-2.87-1.3-4.43-2.88-4.43s-3 1.3-3 4.6v25.68h-16.7V16.58c0-2.87-1.3-4.43-2.9-4.43s-3 1.3-3 4.6v25.68zm138.26 0h16.75l-11.48-22 9.35-19H265l-4.64 13-5.6-13H237.3l10.16 19-11.15 22h16.95l7.1-15 7.48 15zm-48.7-14.2V24.8h-2.6c-5.1 0-6.2 2.46-6.2 4.74 0 2.62 1.5 4.25 4.44 4.25 3.34 0 4.37-2.2 4.37-5.56zm0-11.32v-4.23c0-2-1-3.27-3.72-3.27-2.37 0-3.65.82-3.88 4.25h-15.86c.64-11 10.5-13.4 20.57-13.4 15.33 0 20.25 5 20.25 14.54v27.6h-16.85l-.5-3.88c-2.78 3.76-7 5.15-11.36 5.15-8.1 0-13.8-4.4-13.8-12.5 0-10.12 7.93-14.3 22.86-14.3z\">\r\n </path>\r\n <path fill=\"#053361\"\r\n d=\"M25.18 27.16H40.5c0 11.38-9.1 16.35-19.32 16.35C6.7 43.5 0 34.7 0 21.6-.38 8.75 7.28.06 21.23.06c10.4 0 19.22 4.23 19.28 16.36h-15c-.22-4.68-1.93-5.6-3.93-5.6-4.24 0-4.64 4.35-4.64 11 0 6.3.35 11 4.46 11 2.1 0 3.54-1.26 3.77-5.6zm78.18-8.77h1.37c3.15 0 5.43-1.1 5.43-4.18s-2.1-3.66-5.3-3.66h-1.5v7.83zm-16 24V1.2h24.4c8.84 0 14 2.68 14 10.45 0 4.74-2 8.34-8.18 9.94 4 .33 6.17 2.1 7 5.24.9 3.54 1.3 8.08 2.07 15.6h-16c-1.5-9.25-.88-8.3-1.45-11.83-.35-2.05-1.37-2.85-4-2.85h-1.9v14.68zM58.53 25.72h7l-3.4-15.55-3.6 15.55zm-19.8 16.7L52 1.13h21.17l13.27 41.3H69.5l-1.6-6.64H56.08l-1.66 6.63z\">\r\n </path>\r\n </svg>\r\n </a>\r\n <!-- menu flyout -->\r\n <div class=\"header-drawer-container\">\r\n <aside class=\"header-drawer\" id=\"header-nav-menu\" title=\"header-drawer\">\r\n <div class=\"header-drawer-body\">\r\n <a id=\"header-drawer-focus-start\" data-dialog=\"focus-start\" href=\"/cars\"\r\n class=\"header-link\" data-kmx-analytics=\"prop5=Header | searchInit\">Shop</a>\r\n <a id=\"header-sell-link\" href=\"/sell-my-car\" class=\"header-link\" data-kmx-analytics=\"prop5=Header\">Sell/Trade</a>\r\n <a id=\"header-finance-link\" href=\"/car-financing\" class=\"header-link\" data-kmx-analytics=\"prop5=Header\">Finance</a>\r\n <a id=\"header-research-link\" href=\"/research\" class=\"header-link\" data-kmx-analytics=\"prop5=Header\">Research</a>\r\n <!-- More links menu -->\r\n <section class=\"header-helpful-links-section\">\r\n <button id=\"header-helpful-links-button\" aria-haspopup=\"true\"\r\n aria-controls=\"header-helpful-links-menu\" aria-label=\"Open buy links menu\"\r\n class=\"header-footer-icon-button\" type=\"button\" data-kmx-analytics=\"prop5=Header\">\r\n <span class=\"header-helpful-links-title\">More</span>\r\n <!-- Arrow drop down icon -->\r\n <svg class=\"header-footer-icon-button-icon mobile-hidden\" width=\"16px\"\r\n height=\"16px\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\">\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n\r\n <!-- Keyboard arrow drop down icon -->\r\n <svg class=\"header-helpful-links-button-icon tablet-hidden desktop-hidden\" height=\"24\" width=\"24\"\r\n viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M7.41 7.84L12 12.42l4.59-4.58L18 9.25l-6 6-6-6z\"></path>\r\n <path d=\"M0-.75h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n </button>\r\n <div class=\"header-footer-menu-container\">\r\n <div id=\"header-helpful-links-menu\" role=\"menu\"\r\n aria-labelledby=\"header-helpful-links-button\" class=\"header-footer-menu\"></div>\r\n </div>\r\n </section>\r\n </div>\r\n </aside>\r\n <div class=\"header-drawer-scrim\"></div>\r\n </div>\r\n </section>\r\n <!-- Right nav -->\r\n <section class=\"header-nav-right\">\r\n <!-- My store flyout -->\r\n <div class=\"header-my-store-section\">\r\n <button id=\"header-my-store-button\" aria-haspopup=\"true\" aria-controls=\"header-my-store-menu\"\r\n aria-label=\"Open my store flyout\" class=\"header-footer-icon-button\" data-kmx-analytics=\"prop5=Header\">\r\n <!-- Location icon with alert -->\r\n <svg class=\"header-footer-icon tablet-hidden desktop-hidden\" width=\"40\" height=\"40\"\r\n viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.29 11c0-5.35 4.36-9.71 9.71-9.71 5.35 0 9.71 4.12 9.71 9.71 0 5.569-6.153 9.57-8.207 10.905l-.023.015c-.45.29-.97.44-1.48.44s-1.03-.15-1.48-.44C8.48 20.6 2.29 16.35 2.29 11Zm8.97 9.711.03.019c.43.28.99.28 1.42 0 1.87-1.21 7.58-4.91 7.58-9.73 0-4.57-3.72-8.29-8.29-8.29-4.57 0-8.29 3.48-8.29 8.29 0 4.785 5.651 8.472 7.55 9.711ZM8.29 11c0-2.05 1.66-3.71 3.71-3.71s3.71 1.66 3.71 3.71-1.66 3.71-3.71 3.71S8.29 13.05 8.29 11Zm1.42 0c0 1.26 1.03 2.29 2.29 2.29s2.29-1.03 2.29-2.29S13.26 8.71 12 8.71 9.71 9.74 9.71 11Z\" />\r\n <circle class=\"hidden header-footer-location-icon-alert-circle\" cx=\"19\" cy=\"4\" r=\"4\"\r\n stroke=\"white\" stroke-width=\"1\" />\r\n </svg>\r\n <span id=\"header-my-store-button-text\">Find Your Store</span>\r\n <!-- Caret icon -->\r\n <svg class=\"header-footer-icon--secondary\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n </button>\r\n <div class=\"header-footer-menu-container\">\r\n <div id=\"header-my-store-menu\" aria-modal=\"true\" role=\"dialog\"\r\n aria-labelledby=\"header-my-store-button\" class=\"header-footer-menu\"></div>\r\n </div>\r\n </div>\r\n <!-- Saved cars link -->\r\n <button id=\"header-saved-cars-button\" aria-label=\"My saved cars\" class=\"header-footer-icon-button\" data-kmx-analytics=\"prop5=Header\">\r\n <!-- Favorite icon -->\r\n <svg class=\"header-footer-icon header-footer-icon--priority\" width=\"40px\" height=\"40px\"\r\n viewBox=\"8 8 24 24\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path d=\"M20 28.64c-.27 0-.54-.04-.79-.13-4.22-1.41-8.92-6.48-8.92-11.51 0-3.68 2.32-5.44 4.3-5.82 1.82-.35 4.03.27 5.41 2.3 1.37-2.03 3.59-2.65 5.41-2.3 1.99.38 4.3 2.14 4.3 5.82 0 5.02-4.7 10.1-8.92 11.51-.26.09-.52.13-.79.13Zm-4.44-16.13c-.24 0-.47.02-.7.07-1.52.29-3.15 1.61-3.15 4.42 0 4.29 4.2 8.91 7.95 10.16.22.07.46.07.68 0 3.75-1.25 7.95-5.87 7.95-10.16 0-2.81-1.63-4.13-3.15-4.42-1.57-.3-3.57.41-4.48 2.69-.22.54-1.1.54-1.32 0-.78-1.95-2.36-2.75-3.78-2.75v-.01Z\" />\r\n </svg>\r\n </button>\r\n <!-- My profile menu -->\r\n <div class=\"header-my-profile-section\">\r\n <button id=\"header-my-profile-button\" aria-haspopup=\"true\" aria-controls=\"header-my-profile-menu\"\r\n aria-label=\"Go to my profile page\" class=\"header-footer-icon-button\" data-kmx-analytics=\"prop5=Header\">\r\n <!-- Person icon -->\r\n <svg class=\"header-footer-icon\" width=\"40\" height=\"40\" viewBox=\"0 -3 24 31\"\r\n xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M7.29 7c0 2.6 2.11 4.71 4.71 4.71S16.71 9.6 16.71 7 14.6 2.29 12 2.29 7.29 4.4 7.29 7Zm1.42 0c0-1.81 1.48-3.29 3.29-3.29S15.29 5.19 15.29 7s-1.48 3.29-3.29 3.29S8.71 8.81 8.71 7ZM4.29 19c0 1.49 1.22 2.71 2.71 2.71h10c1.49 0 2.71-1.22 2.71-2.71v-1c0-2.6-2.11-4.71-4.71-4.71H9c-2.6 0-4.71 2.11-4.71 4.71v1Zm1.42-1c0-1.81 1.48-3.29 3.29-3.29h6c1.81 0 3.29 1.48 3.29 3.29v1c0 .71-.58 1.29-1.29 1.29H7c-.71 0-1.29-.58-1.29-1.29v-1Z\" />\r\n </svg>\r\n </button>\r\n <div class=\"header-footer-menu-container\">\r\n <div id=\"header-my-profile-menu\" role=\"menu\" aria-labelledby=\"header-my-profile-button\"\r\n class=\"header-footer-menu\"></div>\r\n </div>\r\n </div>\r\n </section>\r\n </nav>\r\n <!-- Search bar -->\r\n <section id=\"header-search-bar\" class=\"header-search-bar\">\r\n <form id=\"header-search-bar-form\" class=\"header-search-bar-form\" role=\"search\" method=\"GET\" action=\"/cars\">\r\n <fieldset class=\"header-search-bar-form-fieldset\">\r\n <div class=\"header-search-bar-container\">\r\n <label for=\"header-inventory-search\" class=\"visually-hidden\">Search make, model, or keyword</label>\r\n <input id=\"header-inventory-search\" name=\"search\" class=\"header-search-bar-input\" type=\"search\"\r\n placeholder=\"Search by make, model, or keyword\"\r\n aria-placeholder=\"Search by make, model, or keyword\" autocomplete=\"off\" value=\"\"\r\n maxlength=\"100\" />\r\n <div class=\"header-search-bar-button-container\">\r\n <button id=\"header-search-button\" aria-label=\"Submit search by Make, Model, or Keyword\"\r\n type=\"submit\" class=\"header-footer-icon-button\" data-kmx-analytics=\"noClickTrack\">\r\n <!-- Search icon -->\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\"\r\n aria-hidden=\"true\">\r\n <path\r\n d=\"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\">\r\n </path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n </button>\r\n </div>\r\n <div class=\"header-search-animated-categories\">\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">make</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">model</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">keyword</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">make</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">model</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">keyword</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">make</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">model</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">keyword</div>\r\n <div aria-hidden=\"true\" class=\"header-search-animated-category\">make, model, or keyword</div>\r\n </div>\r\n </div>\r\n </fieldset>\r\n </form>\r\n <div class=\"header-footer-menu-container\">\r\n <div id=\"header-search-bar-menu\" class=\"header-footer-menu\" tabindex=\"-1\">\r\n <ul id=\"header-search-bar-list\" class=\"header-footer-menu-list\" role=\"menu\" aria-hidden=\"true\"\r\n aria-orientation=\"vertical\"></ul>\r\n </div>\r\n </div>\r\n </section>\r\n</header>`;","import { defaultMarkup } from '../../../../generated_files/footerMarkup';\r\nimport { initFooterTracking } from '../utils/analytics';\r\n\r\nclass Footer extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n this.innerHTML = defaultMarkup(null);\r\n\r\n initFooterTracking(this)\r\n }\r\n}\r\n\r\nconst KMX_GLOBAL_FOOTER = 'kmx-global-footer';\r\nif (!customElements.get(KMX_GLOBAL_FOOTER)) {\r\n customElements.define(KMX_GLOBAL_FOOTER, Footer);\r\n}\r\n","//Do Not Update this file: the contents of this file are generated via a script\n export const defaultMarkup = (theme:string | null)=>`<footer id=\"footer\" role=\"contentinfo\">\r\n <div class=\"footer\">\r\n <!-- Social links -->\r\n <section class=\"footer-social-section\">\r\n <a id=\"carmax-logo-footer\" href=\"/\" class=\"footer-link mobile-hidden tablet-hidden\" aria-label=\"CarMax home page\">\r\n <!-- CarMax logo -->\r\n <svg\r\n height=\"24\"\r\n width=\"123\"\r\n viewBox=\"0 0 327.84 64\"\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n >\r\n <path\r\n fill=\"#fff\"\r\n d=\"M289.8 5.05a1.1 1.1 0 0 0 .85-1.12c0-1.17-1.23-1.17-1.57-1.17h-1.65V7.4h.64V5.3h.8c.76 0 .94.2 1 .9a5.26 5.26 0 0 0 .23 1.2h.66a6.74 6.74 0 0 1-.28-1.46c-.05-.57-.2-.77-.7-.9zm-.72-.3h-1V3.3h1c.34 0 .92 0 .92.74s-.6.7-.92.7zM289 .8a4.33 4.33 0 1 0 4.32 4.32A4.34 4.34 0 0 0 289 .8zm0 8.2a3.83 3.83 0 1 1 3.8-3.84A3.82 3.82 0 0 1 289 9z\"\r\n ></path>\r\n <path\r\n fill=\"#fff\"\r\n d=\"M129.42 54.55h32.32V64h-32.32v-9.45zm41.53 0V64h32.32v-9.45zm41.52 0V64h32.32v-9.45zm41.52 0V64h32.3v-9.45zm41.52 0V64h32.32v-9.45z\"\r\n ></path>\r\n <path\r\n fill=\"#fff\"\r\n d=\"M129.57 42.43V1.23h16.26l.4 6.24h.15c2.82-5.9 7-7.47 10.88-7.47 5.3 0 9.16 2.38 11.3 7.47 2.82-5.9 7-7.47 10.88-7.47 7 0 12 4.1 12 15v27.43h-16.7V16.58c0-2.87-1.3-4.43-2.88-4.43s-3 1.3-3 4.6v25.68h-16.7V16.58c0-2.87-1.3-4.43-2.9-4.43s-3 1.3-3 4.6v25.68zm138.26 0h16.75l-11.48-22 9.35-19H265l-4.64 13-5.6-13H237.3l10.16 19-11.15 22h16.95l7.1-15 7.48 15zm-48.7-14.2V24.8h-2.6c-5.1 0-6.2 2.46-6.2 4.74 0 2.62 1.5 4.25 4.44 4.25 3.34 0 4.37-2.2 4.37-5.56zm0-11.32v-4.23c0-2-1-3.27-3.72-3.27-2.37 0-3.65.82-3.88 4.25h-15.86c.64-11 10.5-13.4 20.57-13.4 15.33 0 20.25 5 20.25 14.54v27.6h-16.85l-.5-3.88c-2.78 3.76-7 5.15-11.36 5.15-8.1 0-13.8-4.4-13.8-12.5 0-10.12 7.93-14.3 22.86-14.3z\"\r\n ></path>\r\n <path\r\n fill=\"#fff\"\r\n d=\"M25.18 27.16H40.5c0 11.38-9.1 16.35-19.32 16.35C6.7 43.5 0 34.7 0 21.6-.38 8.75 7.28.06 21.23.06c10.4 0 19.22 4.23 19.28 16.36h-15c-.22-4.68-1.93-5.6-3.93-5.6-4.24 0-4.64 4.35-4.64 11 0 6.3.35 11 4.46 11 2.1 0 3.54-1.26 3.77-5.6zm78.18-8.77h1.37c3.15 0 5.43-1.1 5.43-4.18s-2.1-3.66-5.3-3.66h-1.5v7.83zm-16 24V1.2h24.4c8.84 0 14 2.68 14 10.45 0 4.74-2 8.34-8.18 9.94 4 .33 6.17 2.1 7 5.24.9 3.54 1.3 8.08 2.07 15.6h-16c-1.5-9.25-.88-8.3-1.45-11.83-.35-2.05-1.37-2.85-4-2.85h-1.9v14.68zM58.53 25.72h7l-3.4-15.55-3.6 15.55zm-19.8 16.7L52 1.13h21.17l13.27 41.3H69.5l-1.6-6.64H56.08l-1.66 6.63z\"\r\n ></path>\r\n </svg>\r\n </a>\r\n <a href=\"https://www.youtube.com/@CarMax\" target=\"_blank\" rel=\"noopener\" class=\"footer-link footer-link--social\" aria-label=\"CarMax Youtube\">\r\n <!-- YouTube icon -->\r\n <svg\r\n width=\"30\"\r\n height=\"21\"\r\n viewBox=\"0 0 30 21\"\r\n fill=\"none\"\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M28.69 3.17C28.36 1.94 27.39 0.98 26.16 0.65C23.93 0.05 15 0 15 0C15 0 6.07 0 3.84 0.65C2.61 0.98 1.64 1.94 1.31 3.17C0.71 5.40 0.71 10.05 0.71 10.05C0.71 10.05 0.71 14.70 1.31 16.93C1.64 18.16 2.61 19.12 3.84 19.45C6.07 20.05 15 20.05 15 20.05C15 20.05 23.93 20.05 26.16 19.45C27.39 19.12 28.36 18.16 28.69 16.93C29.28 14.70 29.28 10.05 29.28 10.05C29.28 10.05 29.28 5.40 28.69 3.17H28.69ZM12.14 14.34V5.77L19.56 10.05L12.14 14.34Z\" fill=\"white\" />\r\n </svg>\r\n </a>\r\n <a href=\"https://instagram.com/carmax?igshid=MzRlODBiNWFlZA==\" target=\"_blank\" rel=\"noopener\" class=\"footer-link footer-link--social\" aria-label=\"CarMax Instagram\">\r\n <!-- Instagram icon -->\r\n <svg\r\n width=\"20\" \r\n height=\"21\"\r\n fill=\"none\"\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n >\r\n <path fill=\"#fff\" d=\"M5.858.121c-1.064.05-1.79.22-2.425.47-.658.256-1.215.6-1.77 1.156a4.898 4.898 0 0 0-1.15 1.772C.267 4.156.1 4.883.053 5.948.006 7.012-.004 7.355.001 10.07c.005 2.716.017 3.056.069 4.123.05 1.064.22 1.79.47 2.426.256.657.6 1.214 1.156 1.769a4.894 4.894 0 0 0 1.774 1.15c.636.245 1.363.413 2.428.46 1.064.046 1.407.057 4.122.052 2.715-.005 3.056-.017 4.123-.068 1.066-.05 1.79-.221 2.425-.47a4.901 4.901 0 0 0 1.769-1.156 4.9 4.9 0 0 0 1.15-1.774c.246-.636.413-1.363.46-2.427.046-1.067.057-1.408.052-4.123-.005-2.715-.018-3.056-.068-4.122-.05-1.067-.22-1.79-.47-2.427a4.91 4.91 0 0 0-1.156-1.769 4.88 4.88 0 0 0-1.773-1.15c-.637-.245-1.364-.413-2.428-.46C13.039.06 12.697.048 9.98.053 7.265.057 6.925.07 5.858.121Zm.117 18.078c-.975-.043-1.504-.205-1.857-.34-.467-.18-.8-.398-1.152-.746a3.08 3.08 0 0 1-.75-1.149c-.137-.352-.302-.881-.347-1.856-.05-1.054-.06-1.37-.066-4.04-.006-2.67.004-2.986.05-4.04.042-.974.205-1.504.34-1.857.18-.468.397-.8.746-1.151a3.087 3.087 0 0 1 1.149-.75c.352-.138.881-.302 1.856-.348 1.054-.05 1.37-.06 4.04-.066 2.67-.006 2.986.004 4.041.05.974.043 1.505.204 1.857.34.467.18.8.397 1.151.746.351.35.568.682.75 1.15.138.35.302.88.348 1.855.05 1.054.061 1.37.066 4.04.005 2.669-.004 2.986-.05 4.04-.043.975-.205 1.504-.34 1.857a3.1 3.1 0 0 1-.747 1.152c-.349.35-.681.567-1.148.75-.352.137-.882.301-1.856.347-1.054.05-1.37.06-4.04.066-2.671.006-2.986-.005-4.04-.05m8.151-13.493a1.2 1.2 0 1 0 2.4-.003 1.2 1.2 0 0 0-2.4.003Zm-9.262 5.355a5.134 5.134 0 1 0 10.27-.02 5.134 5.134 0 0 0-10.27.02Zm1.802-.004a3.333 3.333 0 1 1 6.666-.013 3.333 3.333 0 0 1-6.666.013Z\" />\r\n </svg>\r\n </a>\r\n <a href=\"https://www.tiktok.com/@carmax\" target=\"_blank\" rel=\"noopener\" class=\"footer-link footer-link--social\" aria-label=\"CarMax TikTok\">\r\n <!-- TikTok icon -->\r\n <svg\r\n width=\"18\"\r\n height=\"21\"\r\n fill=\"none\"\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n >\r\n <path fill=\"#fff\" d=\"M15.116 4.06A4.793 4.793 0 0 1 12.936.05H9.499l-.005 13.78a2.892 2.892 0 0 1-2.885 2.782 2.891 2.891 0 0 1-2.89-2.89 2.894 2.894 0 0 1 2.89-2.891c.297 0 .583.049.853.133v-3.51a6.297 6.297 0 0 0-.853-.062 6.336 6.336 0 0 0-6.329 6.33 6.324 6.324 0 0 0 2.702 5.181 6.29 6.29 0 0 0 3.627 1.147 6.336 6.336 0 0 0 6.329-6.328V6.734a8.18 8.18 0 0 0 4.784 1.538V4.834c-.96 0-1.855-.285-2.605-.774Z\" />\r\n </svg>\r\n </a>\r\n <a href=\"https://www.facebook.com/CarMax/\" target=\"_blank\" rel=\"noopener\" class=\"footer-link footer-link--social\" aria-label=\"CarMax Facebook\">\r\n <!-- Facebook icon -->\r\n <svg\r\n width=\"24\"\r\n height=\"23\" \r\n fill=\"none\"\r\n focusable=\"false\"\r\n aria-hidden=\"true\"\r\n >\r\n <path fill=\"#fff\" d=\"M23.067 11.118C23.067 5.006 18.112.051 12 .051S.933 5.006.933 11.118c0 5.524 4.047 10.103 9.338 10.933v-7.734H7.46v-3.199h2.81V8.68c0-2.774 1.652-4.306 4.18-4.306 1.211 0 2.477.216 2.477.216v2.724h-1.395c-1.375 0-1.804.853-1.804 1.728v2.076h3.07l-.49 3.2h-2.58v7.733c5.291-.83 9.338-5.409 9.338-10.933Z\" />\r\n </svg>\r\n </a>\r\n </section>\r\n <!-- My store flyout -->\r\n <section class=\"footer-my-store-section\">\r\n <button\r\n id=\"footer-my-store-button\"\r\n aria-haspopup=\"true\"\r\n aria-controls=\"footer-my-store-menu\"\r\n aria-label=\"Open my store flyout\"\r\n class=\"header-footer-icon-button\"\r\n >\r\n <!-- Location icon with alert -->\r\n <svg\r\n class=\"header-footer-icon\"\r\n width=\"24\"\r\n height=\"24\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n >\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.29 11c0-5.35 4.36-9.71 9.71-9.71 5.35 0 9.71 4.12 9.71 9.71 0 5.569-6.153 9.57-8.207 10.905l-.023.015c-.45.29-.97.44-1.48.44s-1.03-.15-1.48-.44C8.48 20.6 2.29 16.35 2.29 11Zm8.97 9.711.03.019c.43.28.99.28 1.42 0 1.87-1.21 7.58-4.91 7.58-9.73 0-4.57-3.72-8.29-8.29-8.29-4.57 0-8.29 3.48-8.29 8.29 0 4.785 5.651 8.472 7.55 9.711ZM8.29 11c0-2.05 1.66-3.71 3.71-3.71s3.71 1.66 3.71 3.71-1.66 3.71-3.71 3.71S8.29 13.05 8.29 11Zm1.42 0c0 1.26 1.03 2.29 2.29 2.29s2.29-1.03 2.29-2.29S13.26 8.71 12 8.71 9.71 9.74 9.71 11Z\" />\r\n <circle\r\n class=\"hidden header-footer-location-icon-alert-circle\"\r\n cx=\"19\"\r\n cy=\"4\"\r\n r=\"4\"\r\n stroke=\"#1773cf\"\r\n stroke-width=\"1\"\r\n />\r\n <circle\r\n class=\"hidden header-footer-location-icon-alert-circle\"\r\n cx=\"19\"\r\n cy=\"4\"\r\n r=\"3\"\r\n stroke=\"white\"\r\n stroke-width=\"1\"\r\n />\r\n </svg>\r\n <span class=\"visually-hidden\">My store name</span>\r\n <span id=\"footer-my-store-button-text\">Find Your Store</span>\r\n <!-- Arrow drop down icon -->\r\n <svg\r\n class=\"header-footer-icon\"\r\n width=\"16px\"\r\n height=\"16px\"\r\n viewBox=\"0 0 24 24\"\r\n aria-hidden=\"true\"\r\n >\r\n <path d=\"M7 10l5 5 5-5z\"></path>\r\n <path d=\"M0 0h24v24H0z\" fill=\"none\"></path>\r\n </svg>\r\n </button>\r\n <div class=\"header-footer-menu-container\">\r\n <div\r\n id=\"footer-my-store-menu\"\r\n aria-modal=\"true\"\r\n role=\"dialog\"\r\n aria-labelledby=\"footer-my-store-button\"\r\n class=\"header-footer-menu\"\r\n tabindex=\"-1\"\r\n ></div>\r\n </div>\r\n </section>\r\n <div class=\"footer-section-divider\"></div>\r\n <!-- Primary navigation -->\r\n <div class=\"footer-primary-navigation\">\r\n <section class=\"footer-primary-navigation-section\">\r\n <h2 class=\"footer-primary-navigation-section-header\">Shop</h2>\r\n <ul class=\"footer-primary-navigation-section-list\">\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/cars\" class=\"footer-link\" data-kmx-analytics=\"searchInit\">Browse by category</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/cars/all\" class=\"footer-link\" data-kmx-analytics=\"searchInit\">View all inventory</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/stores\" class=\"footer-link\">Find a store</a></li>\r\n </ul>\r\n </section>\r\n <section class=\"footer-primary-navigation-section\">\r\n <h2 class=\"footer-primary-navigation-section-header\">Sell/Trade</h2>\r\n <ul class=\"footer-primary-navigation-section-list\">\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/sell-my-car\" class=\"footer-link\">Get an online offer</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/sell-my-car#how-it-works\" class=\"footer-link\">How it works</a></li>\r\n </ul>\r\n </section>\r\n <section class=\"footer-primary-navigation-section\">\r\n <h2 class=\"footer-primary-navigation-section-header\">Finance</h2>\r\n <ul class=\"footer-primary-navigation-section-list\">\r\n <li class=\"footer-primary-navigation-section-list-item\"><a\r\n id=\"footer-link-prequalify\"\r\n href=\"/pre-qual/app?op=global_footer\"\r\n class=\"footer-link\"\r\n rel=\"nofollow\"\r\n data-finance-op=\"global_footer\"\r\n >Get pre-qualified</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/car-financing\" class=\"footer-link\">How it works</a>\r\n </li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/car-financing/carmax-auto-finance\"\r\n class=\"footer-link\">CarMax Auto Finance</a></li>\r\n </ul>\r\n </section>\r\n <section class=\"footer-primary-navigation-section\">\r\n <h2 class=\"footer-primary-navigation-section-header\">About</h2>\r\n <ul class=\"footer-primary-navigation-section-list\">\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/about-carmax\" class=\"footer-link\">About CarMax</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/help-center#contact-us\" class=\"footer-link\">Contact us</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"https://socialresponsibility.carmax.com/\"\r\n class=\"footer-link\">Social responsibility</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"https://foundation.carmax.com\"\r\n class=\"footer-link\">CarMax Foundation</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"https://media.carmax.com\" class=\"footer-link\">Media center</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/supplier-inclusion\" rel=\"nofollow\" class=\"footer-link\">Supplier inclusion</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"https://investors.carmax.com\"\r\n class=\"footer-link\">Investor relations</a></li>\r\n </ul>\r\n </section>\r\n <section class=\"footer-primary-navigation-section\">\r\n <h2 class=\"footer-primary-navigation-section-header\">Careers</h2>\r\n <ul class=\"footer-primary-navigation-section-list\">\r\n <li class=\"footer-primary-navigation-section-list-item\">\r\n <a href=\"https://careers.carmax.com/us/en\" class=\"footer-link\">Search jobs</a>\r\n </li>\r\n </ul>\r\n </section>\r\n <section class=\"footer-primary-navigation-section\">\r\n <h2 class=\"footer-primary-navigation-section-header\">More</h2>\r\n <ul class=\"footer-primary-navigation-section-list\">\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/service\" class=\"footer-link\">Service & repairs</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/help-center\" class=\"footer-link\">FAQ & support</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/why-carmax\" class=\"footer-link\">Why CarMax</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/buying-online\" class=\"footer-link\">Buying online</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/research\" class=\"footer-link\">Car research & advice</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/research/electric-vehicle-guide\" class=\"footer-link\">Guide to EVs</a></li>\r\n <li class=\"footer-primary-navigation-section-list-item\"><a href=\"/car-buying-process/maxcare-service-plans\" class=\"footer-link\">Warranties and MaxCare®</a></li> \r\n </ul>\r\n </section>\r\n </div>\r\n <section class=\"footer-privacy\">\r\n <span class=\"footer-privacy-text\">\r\n By using carmax.com, you consent to the monitoring and storing of your interactions with the website,\r\n including with a CarMax vendor, for use in improving and personalizing our services. See our <a href=\"/privacy-policy\" class=\"footer-link\">Privacy Policy</a> for details.\r\n </span>\r\n <div class=\"footer-section-divider\"></div>\r\n </section>\r\n \r\n <!-- Secondary navigation -->\r\n <section class=\"footer-secondary-navigation\">\r\n <a href=\"/privacy-policy\" class=\"footer-link\">Privacy Policy</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/privacy-policy/opt-out\" class=\"footer-link\">Do Not Sell or Share My Information</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/home/docs/financial-privacy-policy-feb-2022.pdf\" class=\"footer-link\">Financial Privacy Policy</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/interest-based-ads\" class=\"footer-link\">Interest-Based Ads</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/terms\" class=\"footer-link\">Terms of Use</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/responsible-disclosure\" class=\"footer-link\">Responsible Disclosure</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/faq/safety-recalls\" class=\"footer-link\">CarMax Recall Policy</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/social-community-guidelines\" class=\"footer-link\">Social Community Guidelines</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/terms#ca-disclosure\" class=\"footer-link\">CA Supply Chain Transparency</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <a href=\"/notice-of-accessibility\" class=\"footer-link\">Accessibility</a>\r\n <span class=\"footer-secondary-navigation-divider\">|</span>\r\n <span class=\"footer-link\" id=\"oo-feedback-footer\"></span>\r\n </section>\r\n <!-- Copyright -->\r\n <section class=\"footer-copyright\">\r\n <span class=\"footer-copyright-text\"\r\n >Copyright © <span id=\"footer-copyright-year\"></span> CarMax Enterprise Services, LLC</span\r\n >\r\n </section>\r\n </div>\r\n</footer>\r\n`;","const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, getInitialState, subscribe, destroy };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if ((import.meta.env ? import.meta.env.MODE : void 0) !== \"production\") {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","import { createStore } from \"zustand/vanilla\";\r\nimport { toggleChatFob, titleAsId } from \"../utils\";\r\nimport { isAuthenticated } from \"../../../storage/cookie\";\r\n\r\nexport interface IMenuData {\r\n currentTitle?: string;\r\n isThumbNavMenuOpen?: boolean;\r\n thumbNavIndex?: number;\r\n isSignedIn: boolean;\r\n activeTestVariant: string | undefined;\r\n reservationStockNumber?: string;\r\n onNavItemClick: ({ title }: { title: string, prevTitle : string | undefined }) => void;\r\n openThumbNav: () => void;\r\n closeThumbNav: (prevTitle:string | undefined) => void;\r\n setActiveTestVariant: (variant:string) => void;\r\n}\r\n\r\nexport const navStore = createStore((set): IMenuData => {\r\n return {\r\n currentTitle: undefined,\r\n isThumbNavMenuOpen: false,\r\n thumbNavIndex: undefined,\r\n isSignedIn: isAuthenticated(),\r\n activeTestVariant: undefined,\r\n onNavItemClick: ({ title, prevTitle }) => {\r\n if ( title !== prevTitle ) {\r\n set({\r\n currentTitle: title, isThumbNavMenuOpen: true,\r\n });\r\n } else {\r\n set({\r\n currentTitle: undefined, isThumbNavMenuOpen: false,\r\n });\r\n }\r\n },\r\n openThumbNav: () => {\r\n set({ isThumbNavMenuOpen: true });\r\n toggleChatFob('hidden');\r\n },\r\n closeThumbNav: (prevTitle:string|undefined) => {\r\n set({ isThumbNavMenuOpen: false, currentTitle: undefined });\r\n toggleChatFob('visible');\r\n const firstNavBarItem = document.querySelector(`#kmx-thumb-bar__item__button-${titleAsId(prevTitle!)}`) as HTMLElement;\r\n firstNavBarItem.focus();\r\n },\r\n setActiveTestVariant: (variant:string) => {\r\n set({ activeTestVariant : variant });\r\n }\r\n }\r\n});\r\n","export const appElId = 'kmx-hf';\r\nexport const CHAT_FAB_BOTTOM_DISTANCE = 85;\r\nexport const MR_CUTE_TEST_CUSTOM_EVENT = 'kmxMrCuteTestEvent';\r\n","interface IIcons {\r\n [key: string]: string;\r\n}\r\n\r\nexport const icons: IIcons = {\r\n buildings: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"24\" viewBox=\"0 0 30 24\">\r\n <path fill=\"currentColor\" d=\"M24.3333 5.33333H21.6667V8H24.3333V5.33333Z\r\n M24.3333 10.6667H21.6667V13.3333H24.3333V10.6667Z\r\n M24.3333 16H21.6667V18.6667H24.3333V16Z\r\n M0.333344 10.6667V24H8.33334V17.3333H11V24H19V10.6667L9.66668 4L0.333344 10.6667ZM16.3333 21.3333H13.6667V14.6667H5.66668V21.3333H3.00001V12L9.66668 7.33333L16.3333 12V21.3333Z\r\n M12.3333 0V2.62667L15 4.53333V2.66667H27V21.3333H21.6667V24H29.6667V0H12.3333Z\" fill=\"#000\"/>\r\n </svg>\r\n `),\r\n calendar: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12 2.66675V4.00008H20V2.66675H22.6666V4.00008H25.3333C27.5424 4.00008 29.3333 5.79094 29.3333 8.00008V24.0001C29.3333 26.2092 27.5424 28.0001 25.3333 28.0001H6.66663C4.45749 28.0001 2.66663 26.2092 2.66663 24.0001V8.00008C2.66663 5.79095 4.45749 4.00008 6.66663 4.00008H9.33329V2.66675H12ZM5.33329 8.00008C5.33329 7.2637 5.93025 6.66675 6.66663 6.66675H25.3333C26.0697 6.66675 26.6666 7.2637 26.6666 8.00008V9.33342H5.33329V8.00008ZM5.33329 12.0001V24.0001C5.33329 24.7365 5.93025 25.3334 6.66663 25.3334H25.3333C26.0697 25.3334 26.6666 24.7365 26.6666 24.0001V12.0001H5.33329ZM12 14.6667H9.33329V17.3334H12V14.6667ZM9.33329 20.0001H12V22.6667H9.33329V20.0001ZM17.3333 14.6667H14.6666V17.3334H17.3333V14.6667ZM14.6666 20.0001H17.3333V22.6667H14.6666V20.0001ZM22.6666 14.6667H20V17.3334H22.6666V14.6667ZM20 20.0001H22.6666V22.6667H20V20.0001Z\" />\r\n </svg>`),\r\n calculator: btoa(`<svg width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.0068 2H20.9326C24.8005 2 27.9394 5.13892 27.9394 9.00679V23.8832C27.9394 27.7511 24.8005 30.89 20.9326 30.89H12.0068C8.13892 30.89 5 27.7511 5 23.8832V9.00679C5 5.13892 8.13892 2 12.0068 2ZM20.9326 28.7775C23.6253 28.7775 25.827 26.5758 25.827 23.8832V9.00679C25.827 6.31416 23.6253 4.11245 20.9326 4.11245H12.0068C9.31416 4.11245 7.11245 6.31416 7.11245 9.00679V23.8832C7.11245 26.5758 9.31416 28.7775 12.0068 28.7775H20.9326ZM12.7505 7.9506H20.1887C22.0036 7.9506 23.4764 9.42337 23.4764 11.2383C23.4764 13.0532 22.0036 14.526 20.1887 14.526H12.7505C10.9356 14.526 9.46283 13.0532 9.46283 11.2383C9.46283 9.42337 10.9356 7.9506 12.7505 7.9506ZM12.7505 12.4135H20.1887C20.8433 12.4135 21.364 11.8929 21.364 11.2383C21.364 10.5837 20.8433 10.0631 20.1887 10.0631H12.7505C12.096 10.0631 11.5753 10.5837 11.5753 11.2383C11.5753 11.8929 12.096 12.4135 12.7505 12.4135ZM12.0068 20.908C12.8284 20.908 13.4944 20.242 13.4944 19.4204C13.4944 18.5988 12.8284 17.9327 12.0068 17.9327C11.1852 17.9327 10.5192 18.5988 10.5192 19.4204C10.5192 20.242 11.1852 20.908 12.0068 20.908ZM17.9573 19.4204C17.9573 20.242 17.2912 20.908 16.4696 20.908C15.648 20.908 14.982 20.242 14.982 19.4204C14.982 18.5988 15.648 17.9327 16.4696 17.9327C17.2912 17.9327 17.9573 18.5988 17.9573 19.4204ZM20.9326 20.908C21.7542 20.908 22.4202 20.242 22.4202 19.4204C22.4202 18.5988 21.7542 17.9327 20.9326 17.9327C20.111 17.9327 19.4449 18.5988 19.4449 19.4204C19.4449 20.242 20.111 20.908 20.9326 20.908ZM13.4944 23.8832C13.4944 24.7048 12.8284 25.3708 12.0068 25.3708C11.1852 25.3708 10.5192 24.7048 10.5192 23.8832C10.5192 23.0616 11.1852 22.3955 12.0068 22.3955C12.8284 22.3955 13.4944 23.0616 13.4944 23.8832ZM16.4696 25.3708C17.2912 25.3708 17.9573 24.7048 17.9573 23.8832C17.9573 23.0616 17.2912 22.3955 16.4696 22.3955C15.648 22.3955 14.982 23.0616 14.982 23.8832C14.982 24.7048 15.648 25.3708 16.4696 25.3708ZM22.4202 23.8832C22.4202 24.7048 21.7542 25.3708 20.9326 25.3708C20.111 25.3708 19.4449 24.7048 19.4449 23.8832C19.4449 23.0616 20.111 22.3955 20.9326 22.3955C21.7542 22.3955 22.4202 23.0616 22.4202 23.8832Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n carLift: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path d=\"M12 14.6666C12.7364 14.6666 13.3334 14.0696 13.3334 13.3333C13.3334 12.5969 12.7364 11.9999 12 11.9999C11.2637 11.9999 10.6667 12.5969 10.6667 13.3333C10.6667 14.0696 11.2637 14.6666 12 14.6666Z\" fill=\"#2A343D\"/>\r\n <path d=\"M20 14.6666C20.7364 14.6666 21.3334 14.0696 21.3334 13.3333C21.3334 12.5969 20.7364 11.9999 20 11.9999C19.2637 11.9999 18.6667 12.5969 18.6667 13.3333C18.6667 14.0696 19.2637 14.6666 20 14.6666Z\" fill=\"#2A343D\"/>\r\n <path d=\"M7.70671 20.6666H8.29337C8.86671 20.6666 9.33337 20.1866 9.33337 19.5866V17.9999H22.6667V19.5866C22.6667 20.1866 23.12 20.6666 23.7067 20.6666H24.2934C24.8667 20.6666 25.3334 20.1866 25.3334 19.5866V10.9199C25.3334 10.9199 23.5467 5.54659 23.2534 4.66659C23.1867 4.45325 23.0934 4.27992 23 4.13325C22.9734 4.10659 22.96 4.07992 22.9334 4.03992C22.4267 3.34659 21.7067 3.33325 21.7067 3.33325H10.2934C10.2934 3.33325 9.57337 3.34659 9.06671 4.05325C9.04004 4.07992 9.02671 4.10659 9.00004 4.13325C8.90671 4.27992 8.81337 4.45325 8.74671 4.66659C8.45337 5.54659 6.66671 10.9199 6.66671 10.9199V19.5866C6.66671 20.1866 7.13337 20.6666 7.70671 20.6666ZM11.1067 5.99992H20.8934L21.2 6.91992L21.7734 8.66658H10.2267L11.1067 5.99992ZM9.33337 11.3333H22.6667V15.3333H9.33337V11.3333Z\" fill=\"#2A343D\"/>\r\n <path d=\"M5.33337 22.0133V24.6666H14.6667V28.6666H17.3334V24.6666H26.6667V22.0133H5.33337Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n categories: btoa(`<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill=\"currentColor\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13.3333 10.6667V0H24V10.6667H13.3333ZM16 8H21.3333V2.66667H16V8ZM0 24H10.6667V13.3333H0V24ZM2.66667 16H8V21.3333H2.66667V16ZM17.3333 13.3333H20V17.3333H24V20H20V24H17.3333V20H13.3333V17.3333H17.3333V13.3333ZM0 10.6667H10.6667V0H0V10.6667ZM2.66667 2.66667H8V8H2.66667V2.66667Z\" />\r\n <mask id=\"mask0_3401_20760\" style=\"mask-type:luminance\" maskUnits=\"userSpaceOnUse\" x=\"0\" y=\"0\" width=\"24\" height=\"24\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M13.3333 10.6667V0H24V10.6667H13.3333ZM16 8H21.3333V2.66667H16V8ZM0 24H10.6667V13.3333H0V24ZM2.66667 16H8V21.3333H2.66667V16ZM17.3333 13.3333H20V17.3333H24V20H20V24H17.3333V20H13.3333V17.3333H17.3333V13.3333ZM0 10.6667H10.6667V0H0V10.6667ZM2.66667 2.66667H8V8H2.66667V2.66667Z\" fill=\"currentColor\"/>\r\n </mask>\r\n <g mask=\"url(#mask0_3401_20760)\">\r\n <rect x=\"-4\" y=\"-4\" width=\"32\" height=\"32\"/>\r\n </g>\r\n </svg>\r\n `),\r\n close: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>`),\r\n dollarSign: btoa(`\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 12 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill=\"currentColor\" d=\"M6.39016 7.9C4.12016 7.31 3.39016 6.7 3.39016 5.75C3.39016 4.66 4.40016 3.9 6.09016 3.9C7.87016 3.9 8.53016 4.75 8.59016 6H10.8002C10.7302 4.28 9.68016 2.7 7.59016 2.19V0H4.59016V2.16C2.65016 2.58 1.09016 3.84 1.09016 5.77C1.09016 8.08 3.00016 9.23 5.79016 9.9C8.29016 10.5 8.79016 11.38 8.79016 12.31C8.79016 13 8.30016 14.1 6.09016 14.1C4.03016 14.1 3.22016 13.18 3.11016 12H0.910156C1.03016 14.19 2.67016 15.42 4.59016 15.83V18H7.59016V15.85C9.54016 15.48 11.0902 14.35 11.0902 12.3C11.0902 9.46 8.66016 8.49 6.39016 7.9Z\" />\r\n `),\r\n dollarSignSmaller: btoa(`<svg width=\"9\" height=\"18\" viewBox=\"0 0 9 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M6.34012 8.86002L3.12012 7.79002C2.32012 7.52002 1.79012 6.78002 1.79012 5.94002C1.79012 4.87002 2.66012 3.99002 3.74012 3.99002H5.28012C6.25012 3.99002 7.07012 4.71002 7.21012 5.66002C7.26012 6.05002 7.63012 6.32002 8.01012 6.26002C8.40012 6.21002 8.67012 5.85002 8.61012 5.46002C8.38012 3.81002 6.95012 2.56002 5.28012 2.56002H5.22012V0.98002C5.22012 0.59002 4.90012 0.27002 4.51012 0.27002C4.12012 0.27002 3.80012 0.59002 3.80012 0.98002V2.56002H3.74012C1.88012 2.56002 0.370117 4.07002 0.370117 5.93002C0.370117 7.38002 1.30012 8.66002 2.67012 9.12002L5.89012 10.19C6.69012 10.46 7.22012 11.2 7.22012 12.04C7.22012 13.11 6.35012 13.99 5.27012 13.99H3.73012C2.76012 13.99 1.94012 13.27 1.80012 12.32C1.75012 11.93 1.39012 11.66 1.00012 11.72C0.610117 11.77 0.340117 12.13 0.400117 12.52C0.630117 14.17 2.06012 15.42 3.73012 15.42H3.79012V17C3.79012 17.39 4.11012 17.71 4.50012 17.71C4.89012 17.71 5.21012 17.39 5.21012 17V15.42H5.27012C7.13012 15.42 8.64012 13.91 8.64012 12.05C8.64012 10.6 7.72012 9.32002 6.34012 8.86002Z\" fill=\"currentColor\"/>\r\n </svg>\r\n\r\n `),\r\n diamond: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M25.3333 4H6.66663L2.66663 12L16 28L29.3333 12L25.3333 4ZM12.8266 10.6667L14.8266 6.66667H17.1733L19.1733 10.6667H12.8266ZM14.6666 13.3333V22.24L7.25329 13.3333H14.6666ZM17.3333 13.3333H24.7466L17.3333 22.24V13.3333ZM25.68 10.6667H22.1466L20.1466 6.66667H23.68L25.68 10.6667ZM8.31996 6.66667H11.8533L9.85329 10.6667H6.31996L8.31996 6.66667Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n house: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"30\" height=\"28\" fill=\"none\"><path stroke=\"currentColor\" stroke=\"#2A343D\" stroke-linejoin=\"round\" stroke-width=\"2.909\" d=\"M23.727 25.636V15.454h4.364L15 2.364 1.91 15.454h4.363v10.182h5.818v-7.273h5.818v7.273h5.818Z\"/></svg>`),\r\n houseUnfilled: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path d=\"M16 8.25317L22.6667 14.2532V24.6665H20V16.6665H12V24.6665H9.33335V14.2532L16 8.25317ZM16 4.6665L2.66669 16.6665H6.66669V27.3332H14.6667V19.3332H17.3334V27.3332H25.3334V16.6665H29.3334L16 4.6665Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n houseUnfilledNonBtoa: (`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path d=\"M16 8.25317L22.6667 14.2532V24.6665H20V16.6665H12V24.6665H9.33335V14.2532L16 8.25317ZM16 4.6665L2.66669 16.6665H6.66669V27.3332H14.6667V19.3332H17.3334V27.3332H25.3334V16.6665H29.3334L16 4.6665Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n lifePreserver: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M16 2.66675C8.63996 2.66675 2.66663 8.64008 2.66663 16.0001C2.66663 23.3601 8.63996 29.3334 16 29.3334C23.36 29.3334 29.3333 23.3601 29.3333 16.0001C29.3333 8.64008 23.36 2.66675 16 2.66675ZM25.9466 12.1601L22.24 13.6934C21.56 11.8801 20.1333 10.4401 18.3066 9.77341L19.84 6.06675C22.64 7.13342 24.8666 9.36008 25.9466 12.1601ZM16 20.0001C13.7866 20.0001 12 18.2134 12 16.0001C12 13.7867 13.7866 12.0001 16 12.0001C18.2133 12.0001 20 13.7867 20 16.0001C20 18.2134 18.2133 20.0001 16 20.0001ZM12.1733 6.05341L13.7333 9.76008C11.8933 10.4267 10.44 11.8801 9.75996 13.7201L6.05329 12.1734C7.13329 9.36008 9.35996 7.13341 12.1733 6.05341ZM6.05329 19.8267L9.75996 18.2934C10.44 20.1334 11.88 21.5734 13.72 22.2401L12.16 25.9467C9.35996 24.8667 7.13329 22.6401 6.05329 19.8267ZM19.84 25.9467L18.3066 22.2401C20.1333 21.5601 21.5733 20.1201 22.24 18.2801L25.9466 19.8401C24.8666 22.6401 22.64 24.8667 19.84 25.9467Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n location: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M16 15.9998C14.5333 15.9998 13.3333 14.7998 13.3333 13.3332C13.3333 11.8665 14.5333 10.6665 16 10.6665C17.4667 10.6665 18.6667 11.8665 18.6667 13.3332C18.6667 14.7998 17.4667 15.9998 16 15.9998ZM24 13.5998C24 8.75984 20.4667 5.33317 16 5.33317C11.5333 5.33317 8.00001 8.75984 8.00001 13.5998C8.00001 16.7198 10.6 20.8532 16 25.7865C21.4 20.8532 24 16.7198 24 13.5998ZM16 2.6665C21.6 2.6665 26.6667 6.95984 26.6667 13.5998C26.6667 18.0265 23.1067 23.2665 16 29.3332C8.89334 23.2665 5.33334 18.0265 5.33334 13.5998C5.33334 6.95984 10.4 2.6665 16 2.6665Z\"/>\r\n </svg>`),\r\n magnifyingGlass: btoa(`<svg width=\"19\" height=\"19\" viewBox=\"0 0 19 19\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M18.4 17.5001L14.68 13.7801C15.88 12.3501 16.61 10.5201 16.61 8.51006C16.61 3.99006 12.93 0.310059 8.40996 0.310059C3.88996 0.310059 0.209961 3.99006 0.209961 8.51006C0.209961 13.0301 3.88996 16.7101 8.40996 16.7101C10.42 16.7101 12.25 15.9801 13.68 14.7801L17.4 18.5001C17.54 18.6401 17.72 18.7101 17.9 18.7101C18.08 18.7101 18.26 18.6401 18.4 18.5001C18.68 18.2201 18.68 17.7701 18.4 17.5001ZM1.62996 8.51006C1.62996 4.77006 4.66996 1.73006 8.40996 1.73006C12.15 1.73006 15.19 4.77006 15.19 8.51006C15.19 12.2501 12.15 15.2901 8.40996 15.2901C4.66996 15.2901 1.62996 12.2501 1.62996 8.51006Z\" fill=\"currentColor\"/>\r\n </svg>\r\n `),\r\n offer: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M18.6667 2.66675H7.99999C6.53333 2.66675 5.33333 3.86675 5.33333 5.33341V26.6667C5.33333 28.1334 6.53333 29.3334 7.99999 29.3334H24C25.4667 29.3334 26.6667 28.1334 26.6667 26.6667V10.6667L18.6667 2.66675ZM7.99999 26.6667V5.33341H17.3333V10.6667H24V26.6667H7.99999ZM14.6667 25.3334H17.3333V24.0001H18.6667C19.4 24.0001 20 23.4001 20 22.6667V18.6667C20 17.9334 19.4 17.3334 18.6667 17.3334H14.6667V16.0001H20V13.3334H17.3333V12.0001H14.6667V13.3334H13.3333C12.6 13.3334 12 13.9334 12 14.6667V18.6667C12 19.4001 12.6 20.0001 13.3333 20.0001H17.3333V21.3334H12V24.0001H14.6667V25.3334Z\" />\r\n </svg>`),\r\n qualified: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"><path fill=\"currentColor\" d=\"M14 17.333V12c0-.733-.6-1.333-1.333-1.333H7.333V8H14V5.333h-3.333V4H8v1.333H6c-.733 0-1.333.6-1.333 1.334V12c0 .733.6 1.333 1.333 1.333h5.333V16H4.667v2.667H8V20h2.667v-1.333h2c.733 0 1.333-.6 1.333-1.334Zm11.453-.64-7.546 7.534-3.774-3.774-1.88 1.894L17.907 28l9.426-9.427-1.88-1.88Z\" /></svg>`),\r\n question: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M14.6667 24.0001H17.3333V21.3334H14.6667V24.0001ZM16 2.66675C8.64001 2.66675 2.66667 8.64008 2.66667 16.0001C2.66667 23.3601 8.64001 29.3334 16 29.3334C23.36 29.3334 29.3333 23.3601 29.3333 16.0001C29.3333 8.64008 23.36 2.66675 16 2.66675ZM16 26.6667C10.12 26.6667 5.33334 21.8801 5.33334 16.0001C5.33334 10.1201 10.12 5.33341 16 5.33341C21.88 5.33341 26.6667 10.1201 26.6667 16.0001C26.6667 21.8801 21.88 26.6667 16 26.6667ZM16 8.00008C13.0533 8.00008 10.6667 10.3867 10.6667 13.3334H13.3333C13.3333 11.8667 14.5333 10.6667 16 10.6667C17.4667 10.6667 18.6667 11.8667 18.6667 13.3334C18.6667 16.0001 14.6667 15.6667 14.6667 20.0001H17.3333C17.3333 17.0001 21.3333 16.6667 21.3333 13.3334C21.3333 10.3867 18.9467 8.00008 16 8.00008Z\" />\r\n </svg>`),\r\n money: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M25.3333 18.6666V7.99992C25.3333 6.53325 24.1333 5.33325 22.6666 5.33325H3.99998C2.53331 5.33325 1.33331 6.53325 1.33331 7.99992V18.6666C1.33331 20.1333 2.53331 21.3333 3.99998 21.3333H22.6666C24.1333 21.3333 25.3333 20.1333 25.3333 18.6666ZM22.6666 18.6666H3.99998V7.99992H22.6666V18.6666ZM13.3333 9.33325C11.12 9.33325 9.33331 11.1199 9.33331 13.3333C9.33331 15.5466 11.12 17.3333 13.3333 17.3333C15.5466 17.3333 17.3333 15.5466 17.3333 13.3333C17.3333 11.1199 15.5466 9.33325 13.3333 9.33325ZM30.6666 9.33325V23.9999C30.6666 25.4666 29.4666 26.6666 28 26.6666H5.33331C5.33331 25.3333 5.33331 25.4666 5.33331 23.9999H28V9.33325C29.4666 9.33325 29.3333 9.33325 30.6666 9.33325Z\" />\r\n </svg>`),\r\n register: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M14 15.6667C16.9467 15.6667 19.3334 13.28 19.3334 10.3333C19.3334 7.38667 16.9467 5 14 5C11.0534 5 8.66671 7.38667 8.66671 10.3333C8.66671 13.28 11.0534 15.6667 14 15.6667ZM14 7.66667C15.4667 7.66667 16.6667 8.86667 16.6667 10.3333C16.6667 11.8 15.4667 13 14 13C12.5334 13 11.3334 11.8 11.3334 10.3333C11.3334 8.86667 12.5334 7.66667 14 7.66667ZM6.00004 23.6667C6.26671 22.8267 9.42671 21.4267 12.6134 21.08L15.3334 18.4133C14.8134 18.36 14.4267 18.3333 14 18.3333C10.44 18.3333 3.33337 20.12 3.33337 23.6667V26.3333H15.3334L12.6667 23.6667H6.00004ZM26.8 16.3333L19.96 23.2267L17.2 20.4533L15.3334 22.3333L19.96 27L28.6667 18.2133L26.8 16.3333Z\" />\r\n </svg>`),\r\n searchList: btoa(`\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M9.33332 11.3335H2.66666V8.66683H9.33332V11.3335ZM9.33332 15.3335H2.66666V18.0002H9.33332V15.3335ZM27.4533 24.6668L22.3467 19.5602C21.28 20.2535 20.0267 20.6668 18.6667 20.6668C14.9867 20.6668 12 17.6802 12 14.0002C12 10.3202 14.9867 7.3335 18.6667 7.3335C22.3467 7.3335 25.3333 10.3202 25.3333 14.0002C25.3333 15.3602 24.92 16.6135 24.2267 17.6668L29.3333 22.7868L27.4533 24.6668ZM22.6667 14.0002C22.6667 11.8002 20.8667 10.0002 18.6667 10.0002C16.4667 10.0002 14.6667 11.8002 14.6667 14.0002C14.6667 16.2002 16.4667 18.0002 18.6667 18.0002C20.8667 18.0002 22.6667 16.2002 22.6667 14.0002ZM2.66666 24.6668H16V22.0002H2.66666V24.6668Z\"/>\r\n </svg>\r\n `),\r\n service: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\"><path fill=\"currentColor\" d=\"M12 14.667A1.333 1.333 0 1 0 12 12a1.333 1.333 0 0 0 0 2.667Zm8 0A1.333 1.333 0 1 0 20 12a1.333 1.333 0 0 0 0 2.667Z\" fill=\"#2A343D\"/><path fill=\"currentColor\" d=\"M7.707 20.667h.586c.574 0 1.04-.48 1.04-1.08V18h13.334v1.587c0 .6.453 1.08 1.04 1.08h.586c.574 0 1.04-.48 1.04-1.08V10.92s-1.786-5.373-2.08-6.253A2.206 2.206 0 0 0 23 4.133c-.027-.026-.04-.053-.067-.093a1.68 1.68 0 0 0-1.226-.707H10.293s-.72.014-1.226.72c-.027.027-.04.054-.067.08-.093.147-.187.32-.253.534-.294.88-2.08 6.253-2.08 6.253v8.667c0 .6.466 1.08 1.04 1.08ZM11.107 6h9.786l.307.92.573 1.747H10.227L11.107 6Zm-1.774 5.333h13.334v4H9.333v-4Zm-4 10.68v2.654h9.334v4h2.666v-4h9.334v-2.654H5.333Z\" fill=\"currentColor\"/></svg>`),\r\n signIn: btoa(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" fill=\"none\">\r\n <path fill=\"currentColor\" d=\"M14.6666 9.33333L12.8 11.2L16.2666 14.6667H2.66663V17.3333H16.2666L12.8 20.8L14.6666 22.6667L21.3333 16L14.6666 9.33333ZM26.6666 25.3333H16V28H26.6666C28.1333 28 29.3333 26.8 29.3333 25.3333V6.66667C29.3333 5.2 28.1333 4 26.6666 4H16V6.66667H26.6666V25.3333Z\" />\r\n </svg>`),\r\n sparkles: btoa(`<svg width=\"26\" height=\"25\" viewBox=\"0 0 26 25\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M4.94666 1.33339C4.94666 0.810556 4.52282 0.386719 3.99999 0.386719C3.47716 0.386719 3.05332 0.810556 3.05332 1.33339V3.05339H1.33332C0.810495 3.05339 0.386658 3.47722 0.386658 4.00005C0.386658 4.52288 0.810495 4.94672 1.33332 4.94672H3.05332V6.66672C3.05332 7.18955 3.47716 7.61339 3.99999 7.61339C4.52282 7.61339 4.94666 7.18955 4.94666 6.66672V4.94672H6.66666C7.18949 4.94672 7.61332 4.52288 7.61332 4.00005C7.61332 3.47722 7.18949 3.05339 6.66666 3.05339H4.94666V1.33339Z\" fill=\"#2A343D\"/>\r\n <path d=\"M6.66666 15.0534C7.18949 15.0534 7.61332 15.4772 7.61332 16.0001V19.0534H10.6667C11.1895 19.0534 11.6133 19.4772 11.6133 20.0001C11.6133 20.5229 11.1895 20.9467 10.6667 20.9467H7.61332V24C7.61332 24.5229 7.18949 24.9467 6.66666 24.9467C6.14383 24.9467 5.71999 24.5229 5.71999 24V20.9467H2.66666C2.14383 20.9467 1.71999 20.5229 1.71999 20.0001C1.71999 19.4772 2.14383 19.0534 2.66666 19.0534H5.71999V16.0001C5.71999 15.4772 6.14383 15.0534 6.66666 15.0534Z\" fill=\"#2A343D\"/>\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.9467 2.00005C16.9467 1.47722 16.5228 1.05339 16 1.05339C15.4772 1.05339 15.0533 1.47722 15.0533 2.00005C15.0533 6.26389 11.5972 9.72005 7.33332 9.72005C6.81049 9.72005 6.38666 10.1439 6.38666 10.6667C6.38666 11.1895 6.81049 11.6134 7.33332 11.6134C11.5972 11.6134 15.0533 15.0695 15.0533 19.3334C15.0533 19.8562 15.4772 20.2801 16 20.2801C16.5228 20.2801 16.9467 19.8562 16.9467 19.3334C16.9467 15.0695 20.4028 11.6134 24.6667 11.6134C25.1895 11.6134 25.6133 11.1895 25.6133 10.6667C25.6133 10.1439 25.1895 9.72005 24.6667 9.72005C20.4028 9.72005 16.9467 6.26389 16.9467 2.00005ZM11.4985 10.6667C13.4619 9.72144 15.0547 8.12864 16 6.16526C16.9453 8.12864 18.5381 9.72144 20.5014 10.6667C18.5381 11.612 16.9453 13.2048 16 15.1682C15.0547 13.2048 13.4619 11.612 11.4985 10.6667Z\" fill=\"#2A343D\"/>\r\n </svg>`),\r\n accountProfile: btoa(`<svg width=\"25\" height=\"24\" viewBox=\"0 0 25 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12.1001 11.71C9.50014 11.71 7.39014 9.60004 7.39014 7.00004C7.39014 4.40004 9.50014 2.29004 12.1001 2.29004C14.7001 2.29004 16.8101 4.40004 16.8101 7.00004C16.8101 9.60004 14.7001 11.71 12.1001 11.71ZM12.1001 3.71004C10.2901 3.71004 8.81014 5.19004 8.81014 7.00004C8.81014 8.81004 10.2901 10.29 12.1001 10.29C13.9101 10.29 15.3901 8.81004 15.3901 7.00004C15.3901 5.19004 13.9101 3.71004 12.1001 3.71004Z\" fill=\"currentColor\"/>\r\n <path d=\"M17.1001 21.71H7.10014C5.61014 21.71 4.39014 20.49 4.39014 19V18C4.39014 15.4 6.50014 13.29 9.10014 13.29H15.1001C17.7001 13.29 19.8101 15.4 19.8101 18V19C19.8101 20.49 18.5901 21.71 17.1001 21.71ZM9.10014 14.71C7.29014 14.71 5.81014 16.19 5.81014 18V19C5.81014 19.71 6.39014 20.29 7.10014 20.29H17.1001C17.8101 20.29 18.3901 19.71 18.3901 19V18C18.3901 16.19 16.9101 14.71 15.1001 14.71H9.10014Z\" fill=\"currentColor\"/>\r\n </svg>\r\n `),\r\n accountProfileGif: btoa(`<img height=\"24\" width=\"27.5\" src= \"data:image/gif;base64,R0lGODlhNwAwAOZ+AC44QSw2Py02P251ezpDSzlCSzM9RcvO0FpiaUNMVPf393B3fS85QquvskJLU0xVXC03QKmtsfj5+YiOk1BYX6SorIuQlfP09HyCiEpSWjI7RE1VXV1la4eMkbS3uzdBST1GTnR6gEFKUjtETDdASFlhaDhCSjE6Q4CGizI8RT9IUMHExzQ+Rl9nbjA6Qv39/bm8v46UmDY/SGVtc4WLkERNVWxzeWNqcbG1uFBZYEZOVri7vnh+hFVdZTxGTkdQWEBJUVdfZuDi49TW2Orr7J6jp1NbYmhvdZKXmzU+R6GlqcfKzF9mbWFpbzxFTdPV15meooSKj3uBh05WXoyRlnR7gUtUW5eboKuvs5WanuXm59fZ2pOYndrc3mpxeJyhpY+UmWtyeOPl5klRWezt7lFZYbCzt0VNVdze3250e8DDxn+Fi8nLzj5HT2JpcM/R09DS1H6EiXl/hVhgZ+7v8MXHynZ8guLj5GRscnJ4fvLy84OJjqaqris1Pv///wAAACH/C05FVFNDQVBFMi4wAwECAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDkuMS1jMDAyIDc5LmRiYTNkYTNiNSwgMjAyMy8xMi8xNS0xMDo0MjozNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDphNjVmYjhjMi0wYmVhLTQyMzctYWM3My0w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\" />`),\r\n smiley: btoa(`<svg width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"currentColor\" d=\"M14.3 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Zm-7 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3Z\"/><path d=\"M10.8 14c-1.48 0-2.75-.81-3.45-2H5.68a5.495 5.495 0 0 0 10.24 0h-1.67c-.69 1.19-1.97 2-3.45 2Zm-.01-14C5.27 0 .8 4.48.8 10s4.47 10 9.99 10c5.53 0 10.01-4.48 10.01-10S16.32 0 10.79 0Zm.01 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8Z\"/></svg>\r\n `),\r\n tag: btoa(`<svg width=\"21\" height=\"20\" viewBox=\"0 0 21 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M15.6997 6C16.252 6 16.6997 5.55228 16.6997 5C16.6997 4.44772 16.252 4 15.6997 4C15.1474 4 14.6997 4.44772 14.6997 5C14.6997 5.55228 15.1474 6 15.6997 6Z\" fill=\"currentColor\"/>\r\n <path d=\"M17.6999 0.289785H11.5299C10.8099 0.289785 10.1299 0.569785 9.60986 1.07979L1.77986 8.90979C0.719863 9.96979 0.719863 11.6898 1.77986 12.7398L7.94986 18.9098C8.47986 19.4398 9.16986 19.6998 9.86986 19.6998C10.5699 19.6998 11.2599 19.4398 11.7899 18.9098L19.6199 11.0798C20.1299 10.5698 20.4099 9.88979 20.4099 9.15979V2.98978C20.4099 1.49978 19.1899 0.279785 17.6999 0.279785V0.289785ZM18.9899 9.16979C18.9899 9.50979 18.8599 9.83979 18.6099 10.0798L10.7799 17.9098C10.2899 18.3998 9.43986 18.3998 8.95986 17.9098L2.78986 11.7398C2.54986 11.4998 2.40986 11.1698 2.40986 10.8298C2.40986 10.4898 2.53986 10.1598 2.78986 9.91979L10.6199 2.08979C10.8599 1.84979 11.1899 1.70979 11.5299 1.70979H17.6999C18.4099 1.70979 18.9899 2.28979 18.9899 2.99979V9.16979Z\" fill=\"currentColor\"/>\r\n </svg>\r\n\r\n `),\r\n threeDots: btoa(`<svg width=\"20\" height=\"4\" viewBox=\"0 0 20 4\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.2998 3.5C3.12823 3.5 3.7998 2.82843 3.7998 2C3.7998 1.17157 3.12823 0.5 2.2998 0.5C1.47138 0.5 0.799805 1.17157 0.799805 2C0.799805 2.82843 1.47138 3.5 2.2998 3.5ZM10.2998 3.5C11.1282 3.5 11.7998 2.82843 11.7998 2C11.7998 1.17157 11.1282 0.5 10.2998 0.5C9.47138 0.5 8.7998 1.17157 8.7998 2C8.7998 2.82843 9.47138 3.5 10.2998 3.5ZM19.7998 2C19.7998 2.82843 19.1282 3.5 18.2998 3.5C17.4714 3.5 16.7998 2.82843 16.7998 2C16.7998 1.17157 17.4714 0.5 18.2998 0.5C19.1282 0.5 19.7998 1.17157 19.7998 2Z\" fill=\"currentColor\"/>\r\n </svg>\r\n\r\n `)\r\n}\r\n","import { INav } from './types';\r\nimport { icons } from \"./icons\";\r\nimport { getCAFBaseUrl } from '../../utils/environment';\r\nimport { getStoreId } from \"../../storage/cookie\";\r\nimport { ANALYTICS_CONSTANTS } from '../../utils/analytics';\r\n\r\n// kmxAnalytics is optional as we know that the top header items require prop5= Header,\r\n// which is baked into the thumb-nav-item.ts button. Additional tags can be added to the menu data here.\r\nexport const data: INav = {\r\n title: 'Main Nav',\r\n menuItems: [\r\n {\r\n icon: icons.magnifyingGlass,\r\n title: 'Shop',\r\n submenu: [\r\n {\r\n icon: icons.categories,\r\n text: 'Browse by category',\r\n kmxAnalytics: 'prop5=Header-Shop|searchInit',\r\n url: '/cars',\r\n analytics: {\r\n \"event\" : ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"searchInitiation\": {\r\n \"initiationMethod\": 'home|browse-by-category|Header-Shop'\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.searchList,\r\n text: 'View all inventory',\r\n kmxAnalytics: 'prop5=Header-Shop|searchInit',\r\n url: '/cars/all',\r\n analytics: {\r\n \"event\" : ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"searchInitiation\": {\r\n \"initiationMethod\": 'home|view all inventory|Header-Shop'\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.location,\r\n text: 'Shop cars near me',\r\n kmxAnalytics: 'prop5=Header-Shop|searchInit',\r\n url: `/cars/${getStoreId()}`,\r\n analytics: {\r\n \"event\" : ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"searchInitiation\": {\r\n \"initiationMethod\": 'home|shop cars near me|Header-Shop'\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.buildings,\r\n text: 'Find a store',\r\n kmxAnalytics: 'prop5=Header-Shop',\r\n url: '/stores',\r\n }\r\n ]\r\n },\r\n {\r\n icon: icons.tag,\r\n title: 'Sell/Trade',\r\n analytics: {\r\n \"linkDetail\" : {\r\n \"name\": 'Sell'\r\n }\r\n },\r\n submenu: [\r\n {\r\n icon: icons.offer,\r\n text: 'Get an online offer',\r\n kmxAnalytics: 'prop5=Header-Sell',\r\n url: '/sell-my-car',\r\n },\r\n {\r\n icon: icons.question,\r\n text: 'How it works',\r\n kmxAnalytics: 'prop5=Header-Sell',\r\n url: '/sell-my-car#how-it-works',\r\n }\r\n ]\r\n },\r\n {\r\n icon: icons.dollarSignSmaller,\r\n title: 'Finance',\r\n submenu: [\r\n {\r\n icon: icons.qualified,\r\n text: 'Get pre-qualified',\r\n kmxAnalytics: 'noClickTrack | prop5= Header-Finance',\r\n url: '/pre-qual/app?op=exposed_nav_header',\r\n attributes: {\r\n \"data-finance-lead-initiate\": \"true\",\r\n \"data-finance-op\": \"Header_Finance\",\r\n \"data-finance-formtype\": \"Finance First Prequalification Application\",\r\n \"data-finance-action\": \"Init\",\r\n \"data-ignore-anchor-tag-rule\": \"true\",\r\n },\r\n analytics: {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.getPreQualified,\r\n \"leadDetails\": {\r\n \"leadOriginationPage\": 'Header_GetPrequalified',\r\n \"leadType\": 'Finance First Prequalification Application',\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.question,\r\n text: 'How it works',\r\n kmxAnalytics: 'prop5=Header-Finance',\r\n url: '/car-financing',\r\n },\r\n {\r\n icon: icons.money,\r\n text: 'CarMax Auto Finance',\r\n kmxAnalytics: 'prop5=Header-Finance',\r\n url: '/car-financing/carmax-auto-finance',\r\n }\r\n ]\r\n },\r\n {\r\n icon: icons.threeDots,\r\n title: 'More',\r\n submenu: [\r\n {\r\n icon: icons.service,\r\n text: 'Service & repairs',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/service',\r\n },\r\n {\r\n icon: icons.lifePreserver,\r\n text: 'FAQs & support',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/help-center',\r\n },\r\n {\r\n icon: icons.diamond,\r\n text: 'Why CarMax',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/why-carmax',\r\n },\r\n {\r\n text: 'Buying online',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/buying-online',\r\n },\r\n {\r\n text: 'Car research & advice',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/research',\r\n },\r\n {\r\n text: 'Guide to EVs',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/research/electric-vehicle-guide',\r\n },\r\n {\r\n text: 'Warranties & MaxCareâ ®',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/car-buying-process/maxcare-service-plans',\r\n },\r\n {\r\n text: 'Search jobs at CarMax',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: 'https://careers.carmax.com/us/en/',\r\n }\r\n\r\n\r\n ]\r\n },\r\n {\r\n icon: icons.accountProfile,\r\n title: 'My Account',\r\n isAccountMenu: true,\r\n submenu: [\r\n {\r\n icon: btoa('<div style=\"display: block\" id=\"reservation-loader\" class=\"mydashboard-loader\"></div>'),\r\n text: 'My dashboard',\r\n kmxAnalytics: 'prop4=MyCarMax|prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/home',\r\n showLoggedIn: true,\r\n },\r\n {\r\n icon: icons.calendar,\r\n text: 'My appointments',\r\n kmxAnalytics: 'prop4=My appointments|prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/appointments',\r\n showLoggedIn: true,\r\n },\r\n {\r\n icon: icons.dollarSign,\r\n text: 'Make a payment',\r\n kmxAnalytics: 'prop4=Make a payment|prop5=Header-Profile-Exposed-Nav',\r\n url: `${getCAFBaseUrl()}/account/summary`,\r\n },\r\n {\r\n text: 'My favorites',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/saved-cars',\r\n showLoggedIn: true,\r\n },\r\n {\r\n text: 'My saved searches',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/saved-searches',\r\n showLoggedIn: true,\r\n },\r\n {\r\n text: 'Profile settings',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/profile-settings',\r\n showLoggedIn: true,\r\n },\r\n {\r\n icon: icons.signIn,\r\n text: 'Sign in',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: `/mycarmax/sign-in?returnUrl=${encodeURIComponent(window.location.href)}`,\r\n showLoggedIn: false,\r\n },\r\n {\r\n text: 'Sign out',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/sign-out',\r\n showLoggedIn: true,\r\n }, {\r\n icon: icons.register,\r\n text: 'Create account',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/register',\r\n showLoggedIn: false,\r\n },\r\n ]\r\n },\r\n ]\r\n};\r\n\r\nexport const testData: INav = {\r\n title: 'Main Nav',\r\n menuItems: [\r\n {\r\n icon: icons.magnifyingGlass,\r\n title: 'Shop',\r\n submenu: [\r\n {\r\n icon: icons.location,\r\n text: 'Shop cars near me',\r\n kmxAnalytics: 'prop5=Header-Shop|searchInit',\r\n url: `/cars/${getStoreId()}`,\r\n analytics: {\r\n \"event\" : ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"searchInitiation\": {\r\n \"initiationMethod\": 'home|shop cars near me|Header-Shop'\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.categories,\r\n text: 'Browse by category',\r\n kmxAnalytics: 'prop5=Header-Shop|searchInit',\r\n url: '/cars',\r\n analytics: {\r\n \"event\" : ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"searchInitiation\": {\r\n \"initiationMethod\": 'home|browse by category|Header-Shop'\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.searchList,\r\n text: 'View all inventory',\r\n kmxAnalytics: 'prop5=Header-Shop|searchInit',\r\n url: '/cars/all',\r\n analytics: {\r\n \"event\" : ANALYTICS_CONSTANTS.EVENTS.searchInitiated,\r\n \"searchInitiation\": {\r\n \"initiationMethod\": 'home|view-all-inventory|Header-Shop'\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.buildings,\r\n text: 'Find a store',\r\n kmxAnalytics: 'prop5=Header-Shop',\r\n url: '/stores',\r\n\r\n },\r\n {\r\n icon: icons.sparkles,\r\n text: 'Car research & advice',\r\n kmxAnalytics: 'prop3=Homepage | prop4= Car research & advice | prop5=Header-Finance | prop6=prop3|prop4|prop5',\r\n url: '/research',\r\n\r\n },\r\n {\r\n text: 'Guide to EVs',\r\n kmxAnalytics: 'prop3=Homepage | prop4= Guide to EVs | prop5=Header-Finance | prop6=prop3|prop4|prop5',\r\n url: '/research/electric-vehicle-guide',\r\n\r\n }\r\n ]\r\n },\r\n {\r\n icon: icons.tag,\r\n title: 'Sell/Trade',\r\n analytics: {\r\n \"linkDetail\" : {\r\n \"name\": 'Sell'\r\n }\r\n },\r\n submenu: [\r\n {\r\n icon: icons.offer,\r\n text: 'Get an online offer',\r\n kmxAnalytics: 'prop5=Header-Sell',\r\n url: '/sell-my-car',\r\n },\r\n {\r\n icon: icons.question,\r\n text: 'How it works',\r\n kmxAnalytics: 'prop5=Header-Sell',\r\n url: '/sell-my-car#how-it-works',\r\n }\r\n ]\r\n },\r\n {\r\n icon: icons.dollarSignSmaller,\r\n title: 'Finance',\r\n submenu: [\r\n {\r\n icon: icons.qualified,\r\n text: 'Get pre-qualified',\r\n kmxAnalytics: 'noClickTrack | prop5= Header-Finance',\r\n url: '/pre-qual/app?op=exposed_nav_header',\r\n attributes: {\r\n \"data-finance-lead-initiate\": \"true\",\r\n \"data-finance-op\": \"Header_Finance\",\r\n \"data-finance-formtype\": \"Finance First Prequalification Application\",\r\n \"data-finance-action\": \"Init\",\r\n \"data-ignore-anchor-tag-rule\": \"true\",\r\n },\r\n analytics: {\r\n \"event\": ANALYTICS_CONSTANTS.EVENTS.getPreQualified,\r\n \"leadDetails\": {\r\n \"leadOriginationPage\": 'Header_GetPrequalified',\r\n \"leadType\": 'Finance First Prequalification Application',\r\n }\r\n }\r\n },\r\n {\r\n icon: icons.question,\r\n text: 'How it works',\r\n kmxAnalytics: 'prop5=Header-Finance',\r\n url: '/car-financing',\r\n },\r\n {\r\n icon: icons.calculator,\r\n text: 'Car payment calculator',\r\n kmxAnalytics: 'prop3=Homepage | prop4= car payment calculator | prop5=Header-Finance | prop6=prop3|prop4|prop5',\r\n url: '/car-financing/car-payment-calculator',\r\n },\r\n {\r\n icon: icons.money,\r\n text: 'CarMax Auto Finance',\r\n kmxAnalytics: 'prop5=Header-Finance',\r\n url: '/car-financing/carmax-auto-finance',\r\n }\r\n ]\r\n },\r\n {\r\n icon: icons.threeDots,\r\n title: 'More',\r\n submenu: [\r\n {\r\n icon: icons.service,\r\n text: 'Service & repairs',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/service',\r\n },\r\n {\r\n icon: icons.lifePreserver,\r\n text: 'FAQs & support',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/help-center',\r\n },\r\n {\r\n icon: icons.diamond,\r\n text: 'Why CarMax',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/why-carmax',\r\n },\r\n {\r\n text: 'Buying online',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/buying-online',\r\n },\r\n {\r\n text: 'Warranties & MaxCareâ ®',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: '/car-buying-process/maxcare-service-plans',\r\n },\r\n {\r\n text: 'Search jobs at CarMax',\r\n kmxAnalytics: 'prop5=Header-More',\r\n url: 'https://careers.carmax.com/us/en/',\r\n }\r\n\r\n\r\n ]\r\n },\r\n {\r\n icon: icons.accountProfileGif,\r\n title: 'My Account',\r\n isAccountMenu: true,\r\n submenu: [\r\n {\r\n icon: icons.dollarSign,\r\n text: 'Make a payment',\r\n kmxAnalytics: 'prop4=Make a payment|prop5=Header-Profile-Exposed-Nav',\r\n url: `${getCAFBaseUrl()}/account/summary`,\r\n },\r\n {\r\n icon: icons.house,\r\n text: 'MyCarMax',\r\n kmxAnalytics: 'prop4=MyCarMax|prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/home',\r\n showLoggedIn: true,\r\n },\r\n {\r\n icon: icons.calendar,\r\n text: 'My appointments',\r\n kmxAnalytics: 'prop4=My appointments|prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/appointments',\r\n showLoggedIn: true,\r\n },\r\n {\r\n text: 'My favorites',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/saved-cars',\r\n showLoggedIn: true,\r\n },\r\n {\r\n text: 'My saved searches',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/saved-searches',\r\n showLoggedIn: true,\r\n },\r\n {\r\n text: 'My orders',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/checkout',\r\n showLoggedIn: true,\r\n },\r\n {\r\n text: 'Profile settings',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/profile-settings',\r\n showLoggedIn: true,\r\n },\r\n {\r\n icon: icons.signIn,\r\n text: 'Sign in',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: `/mycarmax/sign-in?returnUrl=${encodeURIComponent(window.location.href)}`,\r\n showLoggedIn: false,\r\n },\r\n {\r\n text: 'Sign out',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/sign-out',\r\n showLoggedIn: true,\r\n }, {\r\n icon: icons.register,\r\n text: 'Create account',\r\n kmxAnalytics: 'prop5=Header-Profile-Exposed-Nav',\r\n url: '/mycarmax/register',\r\n showLoggedIn: false,\r\n },\r\n ]\r\n },\r\n ]\r\n};\r\n","import { ISubMenuItem, IAttributes } from './types';\r\nimport { navStore } from './store';\r\nimport { IMenuData } from './store';\r\nimport { MOBILE_SIZE } from '../../components/menu/constants';\r\nimport { MR_CUTE_TEST_CUSTOM_EVENT } from './constants';\r\nimport { data, testData } from './data';\r\n\r\nexport const addCustomElement = (elementName = '', customElementClass: any) => {\r\n if (!customElements.get(elementName)) {\r\n if (customElementClass) {\r\n customElements.define(elementName, customElementClass);\r\n }\r\n else {\r\n }\r\n }\r\n else {\r\n }\r\n}\r\n\r\nexport const filterAuthorizedMenuItems = (isSignedIn: boolean, submenuItem: ISubMenuItem) => {\r\n const { showLoggedIn, text } = submenuItem;\r\n return isSignedIn === showLoggedIn || showLoggedIn === undefined;\r\n}\r\n\r\nexport const computeAttributes = (attributes: IAttributes): string => {\r\n let attributeString = '';\r\n for (const key in attributes) {\r\n const value = attributes[key];\r\n attributeString += ` ${key}=\"${value}\"`\r\n }\r\n return attributeString;\r\n}\r\n\r\nexport const toggleChatFob = (showHide: string) => {\r\n const el = document.getElementById('startChatFab');\r\n if (el) {\r\n if (showHide === 'visible') {\r\n el.style.visibility = 'visible';\r\n } else if (showHide === 'hidden') {\r\n el.style.visibility = 'hidden';\r\n }\r\n }\r\n}\r\n\r\nexport const setMenuHeight = () => {\r\n const currentMenuElement = document.querySelector(`.kmx-hf__menu`) as HTMLElement;\r\n if (currentMenuElement) {\r\n setTimeout(() => {\r\n currentMenuElement.style.height = `${window.innerHeight - 96}px`;\r\n }, 50);\r\n }\r\n}\r\n\r\nexport const minimizeChatWindow = () => {\r\n const minMaxButton = document.getElementById('embeddedChatFab');\r\n const chatBoxActive = document.querySelector('.chatbox-active') !== null;\r\n\r\n if ( chatBoxActive && minMaxButton ) {\r\n minMaxButton.click()\r\n }\r\n}\r\n\r\nexport const manageChatFab = () => {\r\n enum VerticalDirections {\r\n Down = 'down',\r\n Up = 'up'\r\n }\r\n\r\n try {\r\n // TODO should this be in the zustand store so all components could use it?\r\n const isThumbNavVisible = () => {\r\n const desktopSizeMinWidth = window.matchMedia(`(min-width: ${MOBILE_SIZE + 1}px)`);\r\n return !desktopSizeMinWidth.matches;\r\n };\r\n\r\n const manageChatFabPosition = (direction: string) => {\r\n if (isThumbNavVisible()) {\r\n const initialChatFab = document.getElementById('startChatFab') as HTMLElement;\r\n const postInteractionChatFab = document.getElementById('embeddedChatFab') as HTMLElement;\r\n setPosition(initialChatFab, direction);\r\n setPosition(postInteractionChatFab, direction);\r\n }\r\n };\r\n\r\n const setPosition = (chatFabEl: HTMLElement, direction: string) => {\r\n if (chatFabEl) {\r\n if (direction === VerticalDirections.Up) {\r\n chatFabEl.style.transform = 'translateY(-70px)';\r\n } else if (direction === VerticalDirections.Down) {\r\n chatFabEl.style.bottom = 'calc(16px + env(safe-area-inset-bottom))';\r\n chatFabEl.style.transform = 'translateY(0)';\r\n }\r\n }\r\n };\r\n\r\n const targetNode = document.querySelector('body') as HTMLElement;\r\n const config = { attributes: true, childList: true, subtree: true };\r\n const callback = (mutationList: MutationRecord[]) => {\r\n for (const mutation of mutationList) {\r\n if (mutation.type === 'childList') {\r\n const target = mutation.target as Element;\r\n if (target.id === 'vehicle-image-gallery') {\r\n const direction = mutation.addedNodes.length > 0 ? VerticalDirections.Down : VerticalDirections.Up;\r\n manageChatFabPosition(direction);\r\n }\r\n } else if (mutation.type === 'attributes') {\r\n const target = mutation.target as Element;\r\n if (target.className === 'fullScreenDialog') {\r\n manageChatFabPosition(VerticalDirections.Down);\r\n }\r\n if (target.classList.contains('fullScreenDialog') && target.classList.contains('hidden')) {\r\n manageChatFabPosition(VerticalDirections.Up);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const ob = new MutationObserver(callback);\r\n ob.observe(targetNode, config);\r\n } catch (err) {\r\n console.error(err);\r\n }\r\n}\r\n\r\nexport const generateTopLevelHeaderTags = (title: string | undefined) => `${title ? `prop4=${title}` : ''}|prop5=Header`;\r\n\r\n/**\r\n * @description adds or removes backdrop that is used behind menu.\r\n * @param isBackdropVisible\r\n */\r\n\r\nexport const updateBackDrop = (isBackdropVisible: boolean) => {\r\n const menu = document.querySelector('kmx-thumb-nav-menu');\r\n\r\n if (isBackdropVisible) {\r\n const backdrop = document.createElement('kmx-thumb-nav-back-drop');\r\n menu ? menu.append(backdrop) : null;\r\n }\r\n else {\r\n let backdrop;\r\n menu ? backdrop = menu.querySelector('kmx-thumb-nav-back-drop') : null;\r\n if (backdrop) {\r\n backdrop.remove();\r\n }\r\n }\r\n}\r\n\r\nexport const titleAsId = (title:string) => {\r\n return title!.replace('/','').replace(' ','');\r\n}\r\n\r\nconst tabbingAndArrowKeyCallback = (e: KeyboardEvent) => {\r\n\r\n const { currentTitle, closeThumbNav } = navStore.getState() as IMenuData;\r\n\r\n const menuButtonsWrapper = document.querySelector('.kmx-hf__menu__list') as HTMLElement;\r\n const menuButtons = Array.from(\r\n menuButtonsWrapper.querySelectorAll('.kmx-hf__menu__list__item__link')\r\n ) as HTMLElement[];\r\n const closeButton = document.getElementById('kmx-hf__menu__btn-close');\r\n const navigableMenuItems = [closeButton!, ...menuButtons];\r\n\r\n let keyboardEvent = <KeyboardEvent>e;\r\n let shift = e.shiftKey;\r\n let arrowUp = keyboardEvent.key === 'ArrowUp';\r\n let arrowDown = keyboardEvent.key === 'ArrowDown';\r\n let tab = keyboardEvent.key === 'Tab';\r\n\r\n if (arrowDown) {\r\n e.preventDefault();\r\n\r\n const focusedMenuItem = document.activeElement as HTMLElement;\r\n const focusedIndex = focusedMenuItem ? navigableMenuItems.indexOf(focusedMenuItem) : 0;\r\n\r\n if (focusedIndex + 1 < navigableMenuItems.length) {\r\n const nextListItem = navigableMenuItems[focusedIndex + 1];\r\n nextListItem.focus();\r\n } else {\r\n const startOfList = navigableMenuItems[0];\r\n startOfList.focus();\r\n }\r\n }\r\n\r\n if ((tab && !shift)) {\r\n e.preventDefault();\r\n\r\n const focusedMenuItem = document.activeElement as HTMLElement;\r\n const focusedIndex = focusedMenuItem ? navigableMenuItems.indexOf(focusedMenuItem) : 0;\r\n\r\n if (focusedIndex + 1 < navigableMenuItems.length) {\r\n const nextListItem = navigableMenuItems[focusedIndex + 1];\r\n nextListItem.focus();\r\n\r\n } else if ( currentTitle ) {\r\n const relatedTopMenuButton = document.getElementById(`kmx-thumb-bar__item__button-${titleAsId(currentTitle)}`)\r\n relatedTopMenuButton && relatedTopMenuButton.focus();\r\n closeThumbNav(currentTitle);\r\n\r\n } else {\r\n }\r\n }\r\n\r\n if (arrowUp || (shift && tab)) {\r\n e.preventDefault();\r\n\r\n const focusedMenuItem = document.activeElement as HTMLElement;\r\n const focusedIndex = focusedMenuItem ? navigableMenuItems.indexOf(focusedMenuItem) : 0;\r\n\r\n if (focusedIndex > 0) {\r\n const nextFocus = navigableMenuItems[focusedIndex - 1];\r\n nextFocus.focus();\r\n } else {\r\n const endOfList = navigableMenuItems[navigableMenuItems.length - 1];\r\n endOfList.focus();\r\n }\r\n }\r\n};\r\n\r\nexport const addTabbingArrowKeyListener = () => {\r\n document.addEventListener('keydown', tabbingAndArrowKeyCallback);\r\n};\r\n\r\nexport const removeTabbingArrowKeyListener = () => {\r\n document.removeEventListener('keydown', tabbingAndArrowKeyCallback);\r\n};\r\n\r\nexport const determineMenuDataSource = (activeTestVariant:string | undefined) => {\r\n switch (activeTestVariant ) {\r\n case MR_CUTE_TEST_CUSTOM_EVENT:\r\n return testData;\r\n default:\r\n return data;\r\n }\r\n}\r\n","import { addCustomElement, computeAttributes, determineMenuDataSource, filterAuthorizedMenuItems, updateBackDrop } from '../utils';\r\nimport { appElId } from '../constants';\r\nimport { navStore, IMenuData } from \"../store\";\r\nimport { ANALYTICS_CONSTANTS, track } from '../../../../ts/utils/analytics';\r\nimport { IMenuItem, INav, ISubMenuItem , } from '../types';\r\nimport { IPayload } from '../../../types/analytics';\r\n\r\nconst componentLevelPrefix = `${appElId}__menu__list__item`;\r\n\r\nclass ThumbNavMenuItem extends HTMLElement {\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n\r\n const { index } = this.dataset;\r\n\r\n const subMenuIndex = Number(index);\r\n\r\n const { closeThumbNav, currentTitle, isSignedIn, activeTestVariant } = navStore.getState() as IMenuData;\r\n\r\n const menuData: INav = determineMenuDataSource(activeTestVariant);\r\n\r\n const parentMenu = menuData.menuItems.filter( parentMenu => parentMenu.title.toLowerCase().trim() === currentTitle?.toLowerCase().trim())[0] as IMenuItem;\r\n\r\n const thisMenuItem = parentMenu.submenu?.filter((_, currSubmenuIndex) => currSubmenuIndex === subMenuIndex)[0] as ISubMenuItem;\r\n\r\n const { icon, text, url, analytics, attributes, kmxAnalytics } = thisMenuItem\r\n\r\n const attributeString = attributes && String(attributes) !== \"undefined\" ? computeAttributes(attributes) : '';\r\n\r\n const hasIcon = String(icon) !== \"undefined\";\r\n\r\n const linkID = `${text!.split(\" \").join(\"-\").toLowerCase()}-link`;\r\n\r\n const show = filterAuthorizedMenuItems(isSignedIn, thisMenuItem)\r\n\r\n if (show) {\r\n this.innerHTML = `\r\n <div class=\"${componentLevelPrefix}${hasIcon ? \" has-icon\" : \"\"}\">\r\n <a id=\"${linkID}\" href=\"${url}\" class=\"${componentLevelPrefix}__link\" ${attributeString} data-kmx-analytics=\"${kmxAnalytics}\">\r\n ${hasIcon ? `<div class=\"${componentLevelPrefix}__link__icon\">${icon !== undefined && atob(icon)}</div>` : ''}\r\n <span class=\"${componentLevelPrefix}__link__text\">${text}</span>\r\n </a>\r\n </div>\r\n `;\r\n } else {\r\n this.innerHTML = '';\r\n }\r\n\r\n const thisLink = this.querySelector('a');\r\n\r\n if (thisLink) {\r\n console.log('@build of submenu buttons', analytics?.[\"event\"], text)\r\n thisLink.addEventListener('click', () => {\r\n const parentMenuTitle = parentMenu.title.toLowerCase().trim();\r\n const computedParentMenuTitle = parentMenuTitle === \"sell/trade\" ? \"sell\" : parentMenuTitle;\r\n const name = String(text);\r\n const position = `${ANALYTICS_CONSTANTS.LOCATIONS.header}-${computedParentMenuTitle}`; // header-sell, etc.\r\n\r\n const payload = {\r\n \"event\": analytics?.[\"event\"], // menu item data may have an event other than \"click\", such as pre-qual or search. If undefined, track function with default to 'click'.\r\n \"linkDetails\" : {\r\n \"name\": name,\r\n \"position\": position,\r\n },\r\n \"search\": analytics?.searchInitiation,\r\n \"leadDetails\": analytics?.leadDetails\r\n } as IPayload\r\n track(payload);\r\n })\r\n }\r\n\r\n if (thisLink && url && url.includes('#')) {\r\n thisLink.addEventListener('click', () => {\r\n closeThumbNav(currentTitle);\r\n updateBackDrop(false);\r\n });\r\n }\r\n }\r\n}\r\n\r\nconst KMX_THUMB_NAV_MENU_ITEM = 'kmx-thumb-nav-menu-item';\r\n\r\naddCustomElement(KMX_THUMB_NAV_MENU_ITEM, ThumbNavMenuItem);\r\n","import { addCustomElement } from '../utils';\r\nimport { navStore, IMenuData } from \"../store\";\r\n\r\nclass ThumbNavBackDrop extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n _backdrop?: any;\r\n _currentState = navStore;\r\n\r\n closeHandler() {\r\n const { closeThumbNav, currentTitle } = this._currentState.getState() as IMenuData;\r\n closeThumbNav(currentTitle);\r\n }\r\n\r\n connectedCallback() {\r\n\r\n const styleTag = `\r\n <style>\r\n html body {\r\n overflow:hidden;\r\n height:100vh;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n }\r\n </style>\r\n `;\r\n\r\n this.innerHTML = `\r\n ${styleTag}\r\n <div class=\"kmx-hf__menu__backdrop\"></div>\r\n `;\r\n\r\n this._backdrop = this.querySelector('.kmx-hf__menu__backdrop');\r\n const { _backdrop } = this;\r\n if (_backdrop) {\r\n _backdrop.addEventListener('click', () => {\r\n\r\n const thisElement = document.querySelector('kmx-thumb-nav-back-drop')\r\n if (thisElement)\r\n thisElement.remove();\r\n this.closeHandler();\r\n this.innerHTML = '';\r\n this.remove();\r\n });\r\n }\r\n\r\n }\r\n disconnectedCallback() {\r\n this._backdrop.removeEventListener('click', () => {\r\n\r\n const thisElement = document.querySelector('kmx-thumb-nav-back-drop')\r\n if (thisElement)\r\n thisElement.remove();\r\n this.closeHandler();\r\n this.innerHTML = '';\r\n this.remove();\r\n });\r\n this.remove();\r\n }\r\n}\r\n\r\naddCustomElement('kmx-thumb-nav-back-drop', ThumbNavBackDrop);\r\n","import * as api from '../../api/api';\r\nimport { Options } from '../../api/api';\r\nimport { getMyKmxUserId } from '../../storage/cookie';\r\n\r\nexport const fetchProfile = () => {\r\n const myKmxUserId = getMyKmxUserId();\r\n const { origin } = window.location;\r\n const profileUrl = origin + `/mycarmax/api/header/${myKmxUserId}/profile`; // MyCarMax BFF\r\n\r\n const options: Options = {\r\n url: profileUrl,\r\n withCredentials: true\r\n };\r\n api.get(\r\n options,\r\n function success(res) {\r\n const el = document.getElementById(\"mydashboard-header\") as HTMLElement;\r\n el.innerText = res?.firstName ? `Hi ${res.firstName},` : 'Hello!';\r\n\r\n if (res?.firstName) localStorage.setItem('firstName', res.firstName);\r\n },\r\n function error(e) {\r\n console.error('Error fetching profile data: ', e);\r\n const el = document.getElementById(\"mydashboard-header\") as HTMLElement;\r\n el.innerText = `Hello!`;\r\n }\r\n );\r\n};\r\n","import * as api from '../../api/api';\r\nimport { Options } from '../../api/api';\r\nimport { icons } from '../../webcomponents/exposed-nav/icons';\r\nimport { getMyKmxUserId } from '../../storage/cookie';\r\nimport { getVehicleHeroImage } from './images';\r\n\r\nexport const getReservation = async () => {\r\n const myKmxUserId = getMyKmxUserId();\r\n const { origin } = window.location;\r\n const rsvpUrl = origin + `/mycarmax/api/header/${myKmxUserId}/reservation`; // MyCarMax BFF\r\n\r\n const options: Options = {\r\n url: rsvpUrl,\r\n };\r\n api.get(\r\n options,\r\n function success(res) {\r\n const icon = res?.stockNumber ? getVehicleHeroImage(res.stockNumber) : icons.houseUnfilledNonBtoa;\r\n const text = res?.stockNumber ? 'My cart' : 'My dashboard';\r\n setIconContent(icon, text);\r\n requestAnimationFrame(() => {\r\n clearLoader(res?.stockNumber); // TODO: clearLoader gets executed after the api call resolves but before the image finishes painting\r\n });\r\n },\r\n function error(e) {\r\n clearLoader(false);\r\n const icon = icons.houseUnfilledNonBtoa;\r\n const text = 'My dashboard';\r\n\r\n setIconContent(icon, text)\r\n console.error('Error fetching rsvp data: ', e);\r\n }\r\n );\r\n};\r\n\r\nexport const setIconContent = (icon: string, text: string) => {\r\n const iconContainer = document.querySelector('#my-dashboard-link > div') as HTMLElement;\r\n const iconNode = document.createRange().createContextualFragment(icon);\r\n const iconLabel = document.querySelector('#my-dashboard-link > span') as HTMLElement;\r\n\r\n iconContainer.appendChild(iconNode);\r\n iconLabel.innerText = text;\r\n}\r\n\r\nexport const clearLoader = (hasVehicleImage: boolean) => {\r\n const iconContainer = document.getElementById('reservation-loader') as HTMLElement;\r\n iconContainer.style.border = 'transparent';\r\n\r\n if (!hasVehicleImage) {\r\n iconContainer.style.display = 'none';\r\n }\r\n}\r\n","\r\nimport { addCustomElement, filterAuthorizedMenuItems, setMenuHeight, addTabbingArrowKeyListener, removeTabbingArrowKeyListener } from '../utils';\r\nimport { appElId } from '../constants';\r\nimport { navStore, IMenuData } from \"../store\";\r\nimport { data, testData } from '../data';\r\nimport { icons } from '../icons';\r\nimport { IMenuItem, ISubMenuItem } from '../types';\r\nimport './kmx-thumb-nav-menu-item';\r\nimport './kmx-back-drop';\r\nimport { MR_CUTE_TEST_CUSTOM_EVENT } from '../constants';\r\nimport { isAuthenticated } from '../../../storage/cookie';\r\nimport { fetchProfile } from '../../../components/myKmx/profileApi';\r\nimport { getReservation } from '../../../components/myKmx/reservationApi';\r\n\r\nconst componentLevelPrefix = `${appElId}__menu`;\r\n\r\nconst template = (isSignedIn: boolean) => {\r\n return `\r\n <div id=\"subMenuContainer\" role=\"menu\" class=\"${componentLevelPrefix} ${isSignedIn ? 'signed-in' : ''} \">\r\n <button tabindex=\"-1\" id=\"${componentLevelPrefix}__btn-close\" role=\"menuitem\" class=\"${componentLevelPrefix}__btn-close\" aria-label=\"Close menu\">${atob(icons.close)}</button>\r\n <div id=\"kmx-thumb-nav-menu-content\"></div>\r\n </div>\r\n `\r\n}\r\n\r\nconst computeHeadingText = (currentTitle: string | undefined, currentItem: IMenuItem) => {\r\n if (currentItem && currentItem.isAccountMenu) {\r\n return 'Hello!';\r\n } else {\r\n return currentTitle;\r\n }\r\n}\r\n\r\nconst computeMyKmxHeadingText = (currentTitle: string | undefined, currentItem: IMenuItem) => {\r\n if (currentItem && currentItem.isAccountMenu && isAuthenticated()) {\r\n getReservation();\r\n let firstName = localStorage.getItem('firstName');\r\n\r\n if (!firstName) {\r\n fetchProfile();\r\n return `<div class=\"mydashboard-loader\"></div>`\r\n }\r\n\r\n return `Hi ${firstName},`;\r\n } else {\r\n return currentTitle;\r\n }\r\n}\r\n\r\nconst buildThumbNavMenuItem = (index: number) => {\r\n // do not have a way to\r\n return `\r\n <kmx-thumb-nav-menu-item data-index=\"${index}\">\r\n </kmx-thumb-nav-menu-item>\r\n `;\r\n}\r\n\r\nconst menuContent = (subMenuItems: ISubMenuItem[] | undefined, state: IMenuData | null) => {\r\n\r\n if (state) {\r\n const { isSignedIn, currentTitle, activeTestVariant } = state;\r\n if (currentTitle === undefined) {\r\n\r\n return '';\r\n\r\n } else {\r\n const currentItem = data.menuItems.find((item) => item.title.toLocaleLowerCase() === (currentTitle as string).toLocaleLowerCase());\r\n\r\n const html = subMenuItems && subMenuItems\r\n .map((_, index) => {\r\n return buildThumbNavMenuItem(index)\r\n }).join('');\r\n\r\n return `\r\n <header class=\"${componentLevelPrefix}__title\" id=\"mydashboard-header\">${computeMyKmxHeadingText(currentTitle, (currentItem as IMenuItem))}</header>\r\n <div id=\"${currentTitle.split(' ').join('')}\" class=\"${componentLevelPrefix}__list\">\r\n ${html}\r\n </div>\r\n `\r\n }\r\n } else {\r\n return '';\r\n }\r\n\r\n};\r\n\r\nclass ThumbNavMenu extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n\r\n _currentState = navStore;\r\n _initialState = navStore.getState() as IMenuData;\r\n _button?: HTMLElement;\r\n _backDropElement: string = 'kmx-thumb-nav-back-drop';\r\n\r\n /**\r\n * @description closes menu\r\n */\r\n closeHandler() {\r\n const { closeThumbNav, currentTitle } = this._currentState.getState() as IMenuData;\r\n closeThumbNav(currentTitle);\r\n this.setMenuContent(undefined, false)\r\n }\r\n\r\n /**\r\n * @description adds or removes backdrop that is used behind menu.\r\n * @param isBackdropVisible\r\n */\r\n updateBackDrop(isBackdropVisible: boolean) {\r\n const backDropElement = this._backDropElement;\r\n if (isBackdropVisible) {\r\n const backdrop = document.createElement(backDropElement);\r\n this.append(backdrop);\r\n const backdropInnerEl = this.querySelector('.kmx-hf__menu__backdrop') as HTMLElement\r\n setTimeout(() => {\r\n backdropInnerEl.classList.add('mobile-backdrop--visible');\r\n }, 1);\r\n const closeButton = this.querySelector('#kmx-hf__menu__btn-close');\r\n }\r\n else {\r\n const backdrop = this.querySelector(this._backDropElement);\r\n if (backdrop) {\r\n const backdropInnerEl = this.querySelector('.kmx-hf__menu__backdrop') as HTMLElement\r\n backdropInnerEl.addEventListener('transitionend', (e) => {\r\n backdropInnerEl.parentElement!.remove();\r\n });\r\n backdropInnerEl.classList.remove('mobile-backdrop--visible');\r\n }\r\n }\r\n }\r\n\r\n connectedCallback() {\r\n this.updateMenuItems();\r\n this.innerHTML = template(this._initialState.isSignedIn);\r\n this.closeListener();\r\n localStorage.removeItem(\"firstName\");\r\n }\r\n\r\n updateMenuItems() {\r\n this._currentState.subscribe((state: any, prev: any) => {\r\n if (state.currentTitle !== undefined) {\r\n if (state.activeTestVariant === MR_CUTE_TEST_CUSTOM_EVENT) {\r\n const testSubMenuItems = testData.menuItems.filter(item => item.title === state.currentTitle)[0].submenu;\r\n this.setMenuContent(testSubMenuItems, state);\r\n }\r\n else {\r\n const subMenuItems = data.menuItems.filter(item => item.title === state.currentTitle)[0].submenu;\r\n this.setMenuContent(subMenuItems, state);\r\n }\r\n }\r\n this.toggleMenu(state, prev);\r\n })\r\n }\r\n\r\n /**\r\n * @description: animates menu based on app state\r\n */\r\n toggleMenu(state: any, prev: any) {\r\n const menuElement = document.querySelector(`.${componentLevelPrefix}`) as HTMLElement;\r\n if (state.currentTitle !== undefined) {\r\n addTabbingArrowKeyListener();\r\n document.addEventListener('keyup', this.escKeyupCallback)\r\n } else {\r\n this.setMenuContent(undefined, false);\r\n removeTabbingArrowKeyListener();\r\n document.removeEventListener('keyup', this.escKeyupCallback);\r\n }\r\n\r\n if (state.isThumbNavMenuOpen && !prev.isThumbNavMenuOpen) {\r\n this.updateBackDrop(true);\r\n if (menuElement) {\r\n const closeButton = menuElement.querySelector('#kmx-hf__menu__btn-close');\r\n window.addEventListener('orientationchange', setMenuHeight);\r\n setTimeout(() => {\r\n menuElement.classList.add('menu--fade-in');\r\n closeButton && closeButton.setAttribute('tabindex', '0');\r\n setMenuHeight();\r\n }, 0);\r\n }\r\n }\r\n\r\n if (!state.isThumbNavMenuOpen) {\r\n this.updateBackDrop(false);\r\n if (menuElement) {\r\n setTimeout(() => {\r\n menuElement.style.height = '0px';\r\n menuElement.classList.remove('menu--fade-in');\r\n }, 0);\r\n window.removeEventListener('orientationchange', setMenuHeight);\r\n }\r\n }\r\n }\r\n\r\n setMenuContent(subMenuItems: ISubMenuItem[] | undefined, state: any) {\r\n const contentContainer = this.querySelector('#kmx-thumb-nav-menu-content');\r\n if (contentContainer) {\r\n if (!subMenuItems) {\r\n contentContainer.innerHTML = '';\r\n } else {\r\n contentContainer.innerHTML = menuContent(subMenuItems, state);\r\n }\r\n }\r\n }\r\n\r\n escKeyupCallback = (e: KeyboardEvent) => {\r\n const closeButton = this.querySelector(`#${componentLevelPrefix}__btn-close`);\r\n let keyboardEvent = <KeyboardEvent>e;\r\n if (keyboardEvent.key === \"Escape\") {\r\n this.closeHandler();\r\n closeButton && closeButton.setAttribute('tabindex', '-1');\r\n }\r\n }\r\n\r\n closeListener() {\r\n const closeButton = this.querySelector(`#${componentLevelPrefix}__btn-close`);\r\n\r\n if (closeButton) {\r\n\r\n closeButton.removeEventListener('click', () => {\r\n this.closeHandler();\r\n this.updateBackDrop(false);\r\n });\r\n\r\n closeButton.addEventListener('click', () => {\r\n this.closeHandler();\r\n });\r\n\r\n }\r\n }\r\n\r\n disconnectedCallback() {\r\n console.log('disconnect');\r\n }\r\n}\r\n\r\nconst KMX_THUMB_NAV_MENU = 'kmx-thumb-nav-menu';\r\n\r\naddCustomElement(KMX_THUMB_NAV_MENU, ThumbNavMenu);\r\n\r\n\r\n","export const getVehicleHeroImage = (stockNumber: string | number) => {\r\n return `<img class=\"vehicle_hero-img\" src=\"https://img2.carmax.com/assets/${stockNumber}/hero.jpg\" alt=\"Vehicle with stock number ${stockNumber}\" />`;\r\n}","interface IIndexable {\r\n [key: string]: any;\r\n}\r\n\r\nexport interface INav {\r\n title?: string;\r\n menuItems: IMenuItem[];\r\n}\r\n\r\nexport interface IMenuItem {\r\n title: string;\r\n icon?: string;\r\n isAccountMenu?: boolean;\r\n kmxAnalytics?: string;\r\n analytics?: IAnalytics;\r\n submenu?: ISubMenuItem[];\r\n}\r\n\r\nexport interface IAttributes {\r\n [key: string]: string;\r\n}\r\n\r\nexport interface ISubMenuItem {\r\n text?: string;\r\n icon?: string;\r\n url?: string;\r\n kmxAnalytics?: string;\r\n showLoggedIn?: boolean;\r\n showLoggedOut?: boolean;\r\n attributes?: IAttributes;\r\n analytics?: IAnalytics;\r\n}\r\n\r\nexport interface IAnalytics extends IIndexable {\r\n linkDetails?: {\r\n event?: string; // defaults to ctaClick ( typeof click )\r\n name?: string;\r\n }\r\n searchInitiation?: {\r\n initiationMethod: string;\r\n };\r\n leadDetail?: {\r\n leadOriginationPage: string;\r\n leadType: string;\r\n };\r\n};\r\n\r\nexport enum ThumbBarItemHighlightAction {\r\n 'HIGHLIGHT' = 'highlight',\r\n 'SELECT' = 'select',\r\n 'INACTIVE' = 'inactive'\r\n}\r\n","import { addCustomElement, filterAuthorizedMenuItems, generateTopLevelHeaderTags, titleAsId } from '../utils';\r\nimport { appElId } from '../constants';\r\nimport { IMenuData, navStore } from \"../store\";\r\nimport { data } from '../data';\r\nimport { ThumbBarItemHighlightAction } from '../types'\r\n\r\nconst componentLevelCSSPrefix = `${appElId}__thumb-bar__item`;\r\n\r\n\r\nexport const toggleButtonHighlight = (action: ThumbBarItemHighlightAction, button: HTMLButtonElement | null) => {\r\n const highlightClass = `${componentLevelCSSPrefix}__button--highlighted`;\r\n const activeClass = 'kmx-hf__thumb-bar__item--active';\r\n if (button) {\r\n if (action === ThumbBarItemHighlightAction.HIGHLIGHT) {\r\n button.classList.add(highlightClass);\r\n button.classList.remove(activeClass);\r\n } else if ( action === ThumbBarItemHighlightAction.SELECT) {\r\n button.classList.add(highlightClass);\r\n button.classList.add(activeClass);\r\n } else if ( action === ThumbBarItemHighlightAction.INACTIVE ) {\r\n button.classList.remove(highlightClass);\r\n button.classList.remove(activeClass);\r\n }\r\n }\r\n}\r\n\r\nexport class ThumbBarItem extends HTMLElement {\r\n\r\n constructor() {\r\n super();\r\n }\r\n\r\n connectedCallback() {\r\n\r\n const { icon, title, kmxAnalytics } = this.dataset;\r\n const { isThumbNavMenuOpen} = navStore.getState() as IMenuData;\r\n const navEl = document.querySelector('.kmx-hf__thumb-bar');\r\n\r\n this.innerHTML = `\r\n <div class=\"${componentLevelCSSPrefix}\">\r\n\r\n <button\r\n id=\"kmx-thumb-bar__item__button-${titleAsId(title!)}\"\r\n type=\"button\"\r\n class=\"${componentLevelCSSPrefix}__button ${componentLevelCSSPrefix}__button--highlighted\"\r\n aria-label=\"Open ${title} menu.\"\r\n aria-controls=\"subMenuContainer\"\r\n aria-expanded=\"false\"\r\n aria-haspopup=\"true\"\r\n data-title=\"${title}\"\r\n data-kmx-analytics=\"${generateTopLevelHeaderTags(title)}${this.buildAnalytics(kmxAnalytics)}\">\r\n ${ icon && `<div class=\"${componentLevelCSSPrefix}__icon\">${atob(icon)}</div>`}\r\n <div class=\"${componentLevelCSSPrefix}__title\">${title}</div>\r\n </button>\r\n\r\n </div>\r\n `;\r\n\r\n navStore.subscribe(({currentTitle, activeTestVariant}: any, prev: any) => {\r\n\r\n const thisButton : HTMLButtonElement | null = this.querySelector(`.${componentLevelCSSPrefix}__button`);\r\n\r\n if (!currentTitle && ( activeTestVariant === \"B\" || activeTestVariant === \"C\" ) ) {\r\n thisButton!.setAttribute('aria-expanded', 'false');\r\n return toggleButtonHighlight(ThumbBarItemHighlightAction.INACTIVE, thisButton);\r\n }\r\n\r\n if (currentTitle === undefined && thisButton) {\r\n toggleButtonHighlight(ThumbBarItemHighlightAction.HIGHLIGHT, thisButton);\r\n thisButton!.setAttribute('aria-expanded', 'false');\r\n } else if ( currentTitle === title ) {\r\n toggleButtonHighlight(ThumbBarItemHighlightAction.SELECT, thisButton);\r\n thisButton!.setAttribute('aria-expanded', 'true');\r\n } else if (currentTitle !== title) {\r\n toggleButtonHighlight(ThumbBarItemHighlightAction.INACTIVE, thisButton);\r\n thisButton!.setAttribute('aria-expanded', 'false');\r\n }\r\n\r\n });\r\n }\r\n\r\n buildAnalytics(kmxAnalytics:string | undefined) {\r\n if ( kmxAnalytics && String(kmxAnalytics) !== \"undefined\" ) {\r\n return ` | ${kmxAnalytics}`;\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n renderSeoMenu(isSignedIn: boolean, title: string | undefined) {\r\n const subMenuItems = data.menuItems.filter(item => item.title === title)[0].submenu;\r\n if (subMenuItems) {\r\n return (\r\n subMenuItems.\r\n filter(item => filterAuthorizedMenuItems(isSignedIn, item))\r\n .map(({ text, url }) => {\r\n return `<li class=\"${componentLevelCSSPrefix}__seoSubMenu__item\"><a tabindex=\"-1\" href=\"${url}\">${text}</a></li>`;\r\n })\r\n .join('')\r\n );\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n}\r\n\r\nconst KMX_THUMB_BAR_ITEM = 'kmx-thumb-bar-item';\r\n\r\naddCustomElement(KMX_THUMB_BAR_ITEM, ThumbBarItem);\r\n","import { addCustomElement, manageChatFab, minimizeChatWindow } from '../utils';\r\nimport { data, testData } from '../data';\r\nimport { IMenuItem } from '../types';\r\nimport '../kmx-thumb-nav-menu';\r\nimport './kmx-thumb-bar-item';\r\nimport { appElId } from '../constants';\r\nimport { navStore, IMenuData } from '../store';\r\nimport { ANALYTICS_CONSTANTS, track} from '../../../utils/analytics'\r\nimport { MR_CUTE_TEST_CUSTOM_EVENT } from '../constants';\r\nimport { IPayload } from '../../../types/analytics';\r\n\r\n// The SCSS file should compile to this and I'm trying out placing a constant here.\r\nconst componentLevelPrefix = `${appElId}__thumb-bar`;\r\n\r\nclass ThumbBar extends HTMLElement {\r\n\r\n\r\n constructor() {\r\n super();\r\n };\r\n\r\n clickedMenu = false;\r\n hasScrolled = false;\r\n\r\n renderTemplate(menuItems: IMenuItem[]) {\r\n return `\r\n <heading id=\"navHeading\" class=\"visually-hidden\">Main Navigation</heading>\r\n <nav class=\"${componentLevelPrefix}\" role=\"navigation\" aria-labelledby=\"navHeading\">\r\n ${this.renderMenuItems(menuItems)}\r\n </nav>\r\n `;\r\n };\r\n\r\n connectedCallback() {\r\n\r\n console.log ( ' override is running ');\r\n let testVariant : string | undefined = undefined;\r\n let loggedIn: boolean = false;\r\n const { setActiveTestVariant } = navStore.getState() as IMenuData;\r\n navStore.subscribe(({ currentTitle, isThumbNavMenuOpen, isSignedIn, activeTestVariant }: any) => {\r\n this.toggleNavBarOpen(isThumbNavMenuOpen);\r\n prevTitle = currentTitle;\r\n loggedIn = isSignedIn;\r\n testVariant = activeTestVariant;\r\n });\r\n\r\n window.addEventListener(MR_CUTE_TEST_CUSTOM_EVENT, ((event:CustomEventInit) => {\r\n setActiveTestVariant(event.detail);\r\n this.setAnimatedProfile(loggedIn, testVariant);\r\n }));\r\n\r\n this.innerHTML = this.renderTemplate(data.menuItems);\r\n\r\n let prevTitle : string | undefined = undefined;\r\n\r\n this.createButtonEventListeners();\r\n\r\n this.setUpMenuFadeOnScroll();\r\n\r\n manageChatFab();\r\n };\r\n\r\n setAnimatedProfile(loggedIn?: boolean, activeTestVariant?: string | undefined, prevTitle?: string | undefined){\r\n const visits = sessionStorage.getItem('com.adobe.reactor.core.visitorTracking.pagesViewed');\r\n\r\n let shouldAnimate = !loggedIn && ( visits === null || visits === '1' ) && activeTestVariant === MR_CUTE_TEST_CUSTOM_EVENT && !this.clickedMenu && !this.hasScrolled;\r\n\r\n if(shouldAnimate){\r\n const payload = {\r\n \"event\": ANALYTICS_CONSTANTS.ANIMATION.animationFired,\r\n \"linkDetails\": {\r\n \"name\": ANALYTICS_CONSTANTS.ANIMATION.animationFired,\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload\r\n track(payload)\r\n this.innerHTML = this.renderTemplate(testData.menuItems);\r\n this.createButtonEventListeners();\r\n }\r\n else{\r\n this.innerHTML = this.renderTemplate(data.menuItems);\r\n if(prevTitle){\r\n this.createButtonEventListeners(prevTitle);\r\n navStore.setState({prevTitle});\r\n }\r\n else{\r\n this.createButtonEventListeners();\r\n }\r\n this.setUpMenuFadeOnScroll();\r\n }\r\n }\r\n\r\n createButtonEventListeners(prevTitle?: string | undefined){\r\n navStore.subscribe(({ currentTitle }: any) => {\r\n prevTitle = currentTitle;\r\n });\r\n\r\n const { onNavItemClick, activeTestVariant } = navStore.getState() as IMenuData;\r\n\r\n const topLevelNavButtons = this.querySelectorAll('.kmx-hf__thumb-bar__item__button');\r\n\r\n topLevelNavButtons.forEach((button) => {\r\n button.addEventListener('click', (e) => {\r\n const clickedButton = e.currentTarget as HTMLElement;\r\n const title = clickedButton.dataset.title;\r\n minimizeChatWindow();\r\n if (title) {\r\n onNavItemClick({ title, prevTitle });\r\n const name = title;\r\n const payload = {\r\n \"linkDetails\": {\r\n \"name\": name,\r\n \"position\": ANALYTICS_CONSTANTS.LOCATIONS.header\r\n }\r\n } as IPayload\r\n track(payload);\r\n };\r\n\r\n if(activeTestVariant === MR_CUTE_TEST_CUSTOM_EVENT && this.clickedMenu === false){\r\n this.clickedMenu = true;\r\n this.setAnimatedProfile(undefined, undefined ,prevTitle);\r\n }\r\n });\r\n });\r\n }\r\n\r\n setUpMenuFadeOnScroll() {\r\n const scrollEffectClass = 'bg-glass--gray';\r\n let navEl: (HTMLElement | null) = document.querySelector(`.${componentLevelPrefix}`);\r\n let test : string | undefined = \"\";\r\n\r\n navStore.subscribe(({ activeTestVariant }: any) => {\r\n test = activeTestVariant;\r\n });\r\n\r\n window.addEventListener('scroll', e => {\r\n if ( navEl ) {\r\n window.scrollY > 50 ? navEl.classList.add(scrollEffectClass) : navEl.classList.remove(scrollEffectClass);\r\n }\r\n\r\n if(this.hasScrolled === false && test === MR_CUTE_TEST_CUSTOM_EVENT){\r\n this.hasScrolled = true;\r\n this.setAnimatedProfile();\r\n }\r\n });\r\n };\r\n\r\n renderMenuItems(menuItems: IMenuItem[]) {\r\n return menuItems.map(({ title, icon, kmxAnalytics }) => {\r\n return `\r\n <kmx-thumb-bar-item\r\n data-title=\"${title}\"\r\n data-icon=\"${icon}\"\r\n data-kmx-analytics=\"${kmxAnalytics}\">\r\n </kmx-thumb-bar-item>\r\n `\r\n }).join('');\r\n };\r\n\r\n toggleChatFab(isThumbNavMenuOpen: boolean) {\r\n const style = isThumbNavMenuOpen ? 'hidden' : 'visible';\r\n const onLoadChatFab = document.getElementById('startChatFab')\r\n const postInteractionChatFab = document.getElementById('embeddedChatFab')\r\n onLoadChatFab ? onLoadChatFab.style.visibility = style : null;\r\n postInteractionChatFab ? postInteractionChatFab.style.visibility = style : null;\r\n }\r\n\r\n toggleNavBarOpen(isThumbNavMenuOpen: boolean) {\r\n const navBar = this.querySelector(`.${componentLevelPrefix}`);\r\n this.toggleChatFab(isThumbNavMenuOpen);\r\n\r\n\r\n if (navBar) {\r\n if (isThumbNavMenuOpen) {\r\n navBar.classList.add(`${componentLevelPrefix}--open`);\r\n } else {\r\n navBar.classList.remove(`${componentLevelPrefix}--open`);\r\n }\r\n };\r\n };\r\n};\r\n\r\nconst KMX_THUMB_BAR = 'kmx-thumb-bar';\r\n\r\naddCustomElement(KMX_THUMB_BAR, ThumbBar);\r\n\r\n","import { addCustomElement } from './utils';\r\nimport \"./kmx-thumb-bar\";\r\nimport \"./kmx-thumb-nav-menu\";\r\n\r\n\r\nconst template = `\r\n <kmx-thumb-nav-menu>\r\n </kmx-thumb-nav-menu>\r\n <kmx-thumb-bar>\r\n </kmx-thumb-bar>\r\n`;\r\n\r\nclass ThumbNav extends HTMLElement {\r\n constructor() {\r\n super();\r\n }\r\n connectedCallback() {\r\n this.innerHTML = template;\r\n }\r\n}\r\n\r\nconst KMX_THUMB_NAV = 'kmx-thumb-nav';\r\n\r\naddCustomElement(KMX_THUMB_NAV, ThumbNav);\r\n\r\n","import { createStore } from \"zustand/vanilla\";\r\n\r\n\r\nexport interface IConfigData {\r\n ConfigurationSettings?: any;\r\n FeatureFlags?: any;\r\n setConfig: (config: any) => void\r\n}\r\n\r\nexport const configStore = createStore((set): IConfigData => {\r\n return {\r\n FeatureFlags: { EnableFeatureFlag: false },\r\n setConfig: (config: any) => {\r\n const { ConfigurationSettings, FeatureFlags } = config;\r\n set({ ConfigurationSettings, FeatureFlags })\r\n }\r\n }\r\n});\r\n\r\n\r\ndeclare global {\r\n interface Window {\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n configStore: any;\r\n }\r\n}\r\n\r\nwindow.configStore = configStore || {};\r\n","import '../scss/index.scss';\r\nimport * as app from './app/app';\r\nimport './webcomponents/wc-header';\r\nimport './webcomponents/wc-footer';\r\nimport './webcomponents/exposed-nav/kmx-thumb-nav';\r\nimport { appElId } from './webcomponents/exposed-nav/constants';\r\nimport { configStore, IConfigData } from \"./configStore\";\r\n\r\nasync function getFeatureFlags() {\r\n const { setConfig } = configStore.getState() as IConfigData;\r\n const response = await fetch('/shared/api/config/header-footer');\r\n const config = await response.json();\r\n setConfig(config);\r\n}\r\n\r\ngetFeatureFlags();\r\n\r\napp.start();\r\n\r\nconst kmx_thumb_nav = document.createElement('kmx-thumb-nav');\r\nkmx_thumb_nav.id = appElId;\r\ndocument.body.prepend(kmx_thumb_nav);\r\nconst skipToMainContentLink = document.createRange().createContextualFragment(`<a id=\"skipMainContent\" href=\"#main-content-heading\" class=\"skip-nav\">Skip to main content</a>`)\r\ndocument.body.prepend(skipToMainContentLink)\r\n","import * as savedCarsButton from '../components/myKmx/savedCarsButton';\r\nimport * as footerCopyright from '../components/navigation/footerCopyright';\r\nimport AlertBanner from '../components/alertBanner/alertBanner';\r\nimport Events from '../events/events';\r\nimport { eventHandlerList } from '../events/eventHandlerList';\r\nimport InventorySearch from '../components/search/InventorySearch';\r\nimport MyProfileMenu from '../components/myKmx/myProfileMenu';\r\nimport MoreLinksMenu from '../components/navigation/moreLinksMenu';\r\nimport NearestStore from '../components/nearestStore/NearestStore';\r\nimport SeoLinkOptimizer, * as seo from '../utils/seo';\r\nimport StoreHourMenu from '../components/storeHours/storeHourMenu';\r\nimport * as storeChooser from '../components/storeChooser/storeChooser';\r\nimport * as searchBarTest from '../targetTests/searchBarTest';\r\n\r\nexport const start = (): void => {\r\n savedCarsButton.render();\r\n footerCopyright.render();\r\n storeChooser.render();\r\n\r\n const seoLinkOptimizer = new SeoLinkOptimizer();\r\n seoLinkOptimizer.optimizeServerRenderedLinks();\r\n let moreLinksMenu = new MoreLinksMenu(seoLinkOptimizer);\r\n let nearestStore = new NearestStore();\r\n let inventorySearch = new InventorySearch();\r\n nearestStore.init();\r\n let myProfileMenu = new MyProfileMenu();\r\n let storeHourMenu = new StoreHourMenu();\r\n\r\n let events = new Events({\r\n moreLinksMenu,\r\n nearestStore,\r\n myProfileMenu,\r\n inventorySearch,\r\n storeHourMenu\r\n });\r\n events.addEventHandlers(eventHandlerList);\r\n\r\n searchBarTest.subscribe();\r\n\r\n let alertBanner = new AlertBanner();\r\n alertBanner.init();\r\n};\r\n","import { content } from '../../content';\r\n\r\nexport const render = (): void => {\r\n let footerCopyrightEl = document.querySelector(`#${content.FOOTER_COPYRIGHT.id}`);\r\n if (footerCopyrightEl) {\r\n const currentYear = new Date().getFullYear();\r\n footerCopyrightEl.textContent = currentYear.toString();\r\n }\r\n};\r\n","import { content } from '../../content';\r\nimport { buildStoreChooserHeader } from './storeChooserHeader';\r\nimport { buildStoreSearchFormAndResults } from './storeChooserSearch';\r\nimport { closeModal } from './utils';\r\n\r\n\r\nexport const render = () => {\r\n // Build wrapper element of store chooser\r\n const storeChooserWrapperHTML: HTMLElement = document.createElement('div');\r\n storeChooserWrapperHTML.classList.add(content.STORE_CHOOSER.WRAPPER.class);\r\n storeChooserWrapperHTML.id = content.STORE_CHOOSER.WRAPPER.id;\r\n // create a sem-transparent background\r\n const modalBackgroundHTML: HTMLElement = document.createElement('div');\r\n modalBackgroundHTML.classList.add(content.STORE_CHOOSER.BACKGROUND.class);\r\n modalBackgroundHTML.addEventListener('click', () => closeModal());\r\n // create the modal for users to interact with\r\n const storeChooserModalHTML: HTMLElement = document.createElement('div');\r\n storeChooserModalHTML.classList.add(content.STORE_CHOOSER.MODAL.class);\r\n storeChooserModalHTML.id = content.STORE_CHOOSER.MODAL.id;\r\n storeChooserModalHTML.setAttribute('role', content.STORE_CHOOSER.MODAL.role);\r\n storeChooserModalHTML.setAttribute('aria-labelledby', content.STORE_CHOOSER.MODAL.HEADER.TITLE.id);\r\n storeChooserModalHTML.setAttribute('aria-describedby', content.STORE_CHOOSER.MODAL.HEADER.DESCRIPTION.id);\r\n storeChooserModalHTML.addEventListener('keyup', (e: KeyboardEvent) => {\r\n if(e.key === 'Escape') closeModal();\r\n });\r\n // Append the header and search form\r\n storeChooserModalHTML.appendChild(buildStoreChooserHeader());\r\n storeChooserModalHTML.appendChild(buildStoreSearchFormAndResults());\r\n // add a body element for the search results\r\n const storeChooserModalBodyHTML: HTMLElement = document.createElement('div');\r\n storeChooserModalBodyHTML.classList.add(content.STORE_CHOOSER.MODAL.BODY.class);\r\n storeChooserModalBodyHTML.id = content.STORE_CHOOSER.MODAL.BODY.id;\r\n storeChooserModalHTML.appendChild(storeChooserModalBodyHTML)\r\n storeChooserWrapperHTML.appendChild(modalBackgroundHTML);\r\n storeChooserWrapperHTML.appendChild(storeChooserModalHTML);\r\n // make sure the header is there before we try and slide this to be the first child element\r\n const headerElement: HTMLElement | null = document.querySelector(`#${content.HEADER.id}`);\r\n if(headerElement) { \r\n headerElement.prepend(storeChooserWrapperHTML);\r\n }\r\n}\r\n","import { content } from \"../../content\";\r\nimport { closeModal } from \"./utils\";\r\n\r\nexport const buildStoreChooserHeader = () => {\r\n // Create the header main element\r\n const headerHTML: HTMLElement = document.createElement('div');\r\n headerHTML.classList.add(content.STORE_CHOOSER.MODAL.HEADER.class);\r\n headerHTML.id = content.STORE_CHOOSER.MODAL.HEADER.id;\r\n // Create the title\r\n const titleHTML: HTMLElement = document.createElement('h2');\r\n titleHTML.className = content.STORE_CHOOSER.MODAL.HEADER.TITLE.class;\r\n titleHTML.id = content.STORE_CHOOSER.MODAL.HEADER.TITLE.id;\r\n titleHTML.innerText = content.STORE_CHOOSER.MODAL.HEADER.TITLE.innerText\r\n // Create the title\r\n const hiddenDescriptionHTML: HTMLElement = document.createElement('p');\r\n hiddenDescriptionHTML.className = content.STORE_CHOOSER.MODAL.HEADER.DESCRIPTION.class;\r\n hiddenDescriptionHTML.id = content.STORE_CHOOSER.MODAL.HEADER.DESCRIPTION.id;\r\n hiddenDescriptionHTML.innerText = content.STORE_CHOOSER.MODAL.HEADER.DESCRIPTION.innerText\r\n // Bring the title and close icon together\r\n headerHTML.appendChild(titleHTML);\r\n headerHTML.appendChild(hiddenDescriptionHTML);\r\n headerHTML.appendChild(buildCloseIcon());\r\n return headerHTML;\r\n}\r\n\r\nfunction buildCloseIcon() {\r\n\r\n\r\n // Create the outer button of the close icon\r\n const closeButtonHTML: HTMLElement = document.createElement('button');\r\n closeButtonHTML.classList.add(content.STORE_CHOOSER.MODAL.HEADER.CLOSE.class);\r\n closeButtonHTML.setAttribute('type', content.STORE_CHOOSER.MODAL.HEADER.CLOSE.type);\r\n closeButtonHTML.setAttribute('aria-label', content.STORE_CHOOSER.MODAL.HEADER.CLOSE.ariaLabel);\r\n closeButtonHTML.setAttribute('aria-hidden', content.STORE_CHOOSER.MODAL.HEADER.CLOSE.ariaHidden); \r\n // add the click action associated\r\n closeButtonHTML.addEventListener('click', () => closeModal())\r\n // Include inner html for styling the svg\r\n closeButtonHTML.innerHTML = content.STORE_CHOOSER.MODAL.HEADER.CLOSE.innerHTML;\r\n return closeButtonHTML;\r\n}\r\n","import activeTests from './activeTests';\r\nimport * as constants from '../constants';\r\nimport { content } from '../content';\r\n\r\nfunction onEventFired(event: any) {\r\n activeTests.activateTest(constants.ENABLE_SEARCH_BAR_DISPLAY_TEST);\r\n\r\n const input = document.getElementById(content.HEADER_SEARCH.input.id);\r\n if (input) {\r\n const group = event.detail.group;\r\n if (group === 'B') {\r\n input.setAttribute('placeholder', \"Describe what you're looking for\");\r\n input.setAttribute('aria-placeholder', \"Describe what you're looking for\");\r\n } else if (group === 'C') {\r\n input.setAttribute('placeholder', 'What kind of car are you looking for?');\r\n input.setAttribute('aria-placeholder', 'What kind of car are you looking for?');\r\n } else if (group === 'D') {\r\n input.setAttribute('placeholder', \"Tell us what you're looking for\");\r\n input.setAttribute('aria-placeholder', \"Tell us what you're looking for\");\r\n }\r\n }\r\n}\r\n\r\nexport function subscribe() {\r\n // Note: Fired by adobe target test 'SF Search Bar Test'.\r\n document.documentElement.addEventListener(constants.ENABLE_SEARCH_BAR_DISPLAY_TEST, (event => {\r\n onEventFired(event);\r\n }) as EventListener);\r\n}\r\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","step","next","e","rejected","result","done","then","apply","create","MENU_CLASSES","MENU_DATA_ATTR","NORMALIZED_KEYS","normalizeKey","STORE_CLOSED_STATUSES","getDayOfWeekShort","dayIndex","getStartEndTime","time","splitTime","split","days","undefined","hours","parseInt","minutes","StoreStatus","constructor","store","parseStoreHours","minuteString","this","storeStatus","hoursText","statusText","storeMenu","currentTime","setStoreStatus","buildStoreMenu","Hours","HolidayHours","today","Date","dayOfWeek","getDay","getTime","todaysHours","find","startDayOfWeek","endDayOfWeek","currentHolidayDate","date","setHours","toString","startTime","endTime","displayStartTime","getHours","getMinutes","displayEndTime","startHour","endHour","hourMenuElements","map","index","Id","join","SET_STORE_BY_ID_CUSTOM_EVENT","ENABLE_SEARCH_BAR_DISPLAY_TEST","EMPTY_STORE","Name","PhoneNumbers","PhoneHours","ServiceHours","Latitude","Longitude","AddressLine1","AddressLine2","City","MailingCity","StateAbbreviation","ZipCode","ActiveStatus","AlertMessage","Capabilities","DistanceInMiles","Categories","DisplayName","GeneralTelephoneNumbers","IsTemporarilyClosed","IsSaveable","IsCarBuyingCenter","Links","LocationDisplay","SalesTelephoneNumbers","ShowroomHours","State","Status","StatusAlert","Subtitle","TelephoneHours","TelephoneNumber","TelephoneNumbers","TollFreePhoneNumber","DEFAULT_STORE_AVAILABILITY","IsOpen","CurrentHours","Holiday","Alert","status","message","storeId","CUSTOMER_HUB_STORES_LIST","GRAND_OPENING_ACTIVE_STATUS","COGNITIVE_SEARCH_TEST","hostname","window","location","prod","test","qa","dev","getCAFBaseUrl","COOKIES","getStoreId","visitorCookies","getCookieObject","getUserEnteredZipCode","setCookie","attributes","attrs","domain","expires","path","document","setMilliseconds","getMilliseconds","toUTCString","stringifiedAttributes","attributeName","cookie","stringifyCookie","cookieObject","stringifiedValue","isAuthenticated","match","hasSignedIn","authCookieName","includes","cookieName","parts","length","splitParts","pop","shift","cookieObj","forEach","keyValue","getMyKmxUserId","links","encodeURIComponent","href","icons","classes","buildDesktopCareersLinkInnerHTML","optimizeForSeo","CLASSNAMES","hidden","visible","bodyScrollLock","HEADER","id","navRight","class","loggedInClass","FOOTER","FOOTER_COPYRIGHT","MOBILE_NAV","body","menuId","menuClass","drawer","defaultClass","openClass","focusStartId","MORE_LINKS","sectionClass","button","icon","defaultMenu","buildInnerHTML","careersLink","label","mobile","linkHTML","desktop","innerHTML","HEADER_SEARCH","activeClass","input","formId","autocompleteList","listItemClass","listItemRole","listRole","linkClass","textClass","HEADER_MY_STORE","sectionClassNoStore","buttonId","buttonAlertClass","buttonTextId","buttonSecondaryTextId","storeStatusId","storeStatusTextId","storeStatusHoursId","iconClass","alertInfoIconContainerClass","alertInfoIconClass","locationAlertIconContainerClass","locationAlertCircleClass","storeSearchFormId","FOOTER_MY_STORE","HEADER_FOOTER_FLYOUT_MENU","storeHoursMenuClass","storeHoursButtonClass","MY_STORE_DETAILS","addressClass","getInnerHtml","availability","type","storeDistance","availabilityText","alertMessage","alertStatusClosure","indexOf","getStoreStatusDisplay","seeCarsUrl","urlPathname","pathname","urlQueryString","search","toLowerCase","queryString","hasQueryString","startsWith","replace","determineSeeCarsUrl","zipCodeToDisplay","getStoreDetailsHTML","MY_PROFILE","authenticatedMenuWithHub","authenticatedMenu","unauthenticatedMenu","SAVED_CARS_BUTTON","visibleClass","STORE_CHOOSER","WRAPPER","BACKGROUND","MODAL","role","TITLE","innerText","DESCRIPTION","CLOSE","ariaLabel","ariaHidden","FORM","INPUT","name","placeholder","BUTTON","BODY","loadingInnerHTML","noMatchesFoundInnerHtml","LIST","STORE","itemInnerHTML","distance","street","city","state","zip","showHours","selectClass","selectGrandOpenClass","selectGrandOpenInnerHTML","selectSelectedClass","selectSelectedInnerHTML","selectButtonClass","selectButtonInnerText","selectButtonType","selectButtonAriaLabel","selectButtonAriaHidden","allStoreLinkClass","allStoreLinkText","allStoreLinkHref","ERROR","EVENT_NAMES","headerKeywordInput","footerKeywordInput","OPTIMIZED_SEARCH","SUV","listItemUrl","listItemText","Hybrid","Truck","Vans","Article","IAlertBannerIconTypes","IAlertBannerTypes","IAlertBannerNearestStoreRuleType","colors","iconSize","tallClass","urgentClass","darkClass","containerClass","detailsClass","messageClass","descriptionClass","baseClass","infoIconClass","cleaningIconClass","storefrontIconClass","closeIconClass","width","height","fill","darkFill","urgentFill","iconWidth","iconHeight","iconFill","Info","Cleaning","Storefront","Close","getUnExpiredDismissedAlertBanners","dismissedAlertBanners","unExpiredDismissedAlertBanners","dismissedAlertBanner","push","getDismissedAlertBannersLocalStorage","serializedDismissedAlertBanners","localStorage","getItem","JSON","parse","console","error","setDismissedAlertBannersLocalStorage","setItem","stringify","isValidAlertBanner","alertBanner","previousSiblingElSelector","pathnameRegexList","AlertBanner","_nearestStore","_alertBannerDataList","_matchingAlertBanner","_isRendering","handleRegisterAlertBannersEvent","bind","handleHistoryPushStateEvent","handleStoreChangeEvent","alertBannerDataList","pushState","history","arguments","updateBanner","findMatchingBanner","render","removeBanner","matchingAlertBanner","matchingAlertBanners","alertBanners","nearestStoreId","filter","matchFound","pathnameRegex","pathnameFilter","nearestStoreRules","Inclusion","includedNearestStoreIds","includedNearestStoreIdsFilter","list","Exclusion","excludedNearestStoreIds","notExcludedNearestStoreIdsFilter","nearestStoreFilter","bannerId","dismissedAlertBannersLocalStorage","allIds","byId","buildDismissedAlertBanners","handleAlertBannerClose","matchingDismissedAlertBannerIndex","splice","removeMatchingBanners","sort","a","b","limitBannerCount","querySelector","parentNode","removeChild","nearestStore","Dark","Urgent","bannerThemeClass","bannerSizeClass","dismissable","bannerHtml","stringWithTemplates","previousSiblingEl","insertAdjacentHTML","alertBannerCloseButton","onclick","init","documentElement","addEventListener","event","eventDetail","detail","CustomEvent","dispatchEvent","Events","components","isException","target","exceptions","some","i","closest","addEventListenerWithDelegation","eventHandler","eventHandlerEl","eventType","selector","targets","isTarget","addEventHandlers","eventHandlerList","isDuplicateClickEvent","clickedElementsList","elName","touchedElementIndex","clickOutsideEventTargets","eventTargetData","remove","removeCareersLinks","moreMenuList","appendChild","careersListItem","createElement","className","setAttribute","buildDesktopCareersLink","addDesktopCareersLink","handleCloseButtonClick","handleClickOutside","headerInputEventTargets","handleInput","headerKeydownEventTargets","handleOpenButtonKeydown","handleMenuKeydown","handleButtonKeydown","handleInputKeydown","headerSubmitEventTargets","handleSubmit","headerClickEventTargets","handleStoreStatusButtonClick","setTimeout","handleOpenButtonClick","toggle","windowRef","headerMouseoverEventTargets","handleMouseover","footerClickEventTargets","footerKeydownEventTargets","footerMouseoverEventTargets","clickOutsideEventHandler","headerInputEventHandler","headerKeydownEventHandler","headerSubmitEventHandler","headerClickEventHandler","headerTouchendEventHandler","headerMouseoverEventHandler","footerKeydownEventHandler","footerClickEventHandler","options","success","url","apiKey","withCredentials","xhr","XMLHttpRequest","open","setRequestHeader","onreadystatechange","readyState","response","send","getUrl","params","userId","debounceTimerId","menu","preventDefault","menuEl","querySelectorAll","item","classList","selectedEl","listItems","focusedIndex","Array","slice","findIndex","listItem","listIndex","selectListItem","processArrows","getSelectedListItem","userInput","dataset","setInputValue","inputEl","form","submit","children","hasAttribute","click","firstChild","textContent","closeMenu","handleInputEnter","handleInputEscape","handleMenuOpen","add","handleMenuClose","removeListItemFocus","nextElement","text","Menu","onMenuOpen","onMenuClose","_open","_onMenuOpen","_onMenuClose","openMenu","keyboardHandler","handleCloseButtonKeydown","AutocompleteListMenu","menuListEl","super","_inputEl","_menuEl","_menuListEl","_keyboardHandler","clear","updateListMenu","createListMenu","ineligibleTermsAlternates","buildIneligibleTermsAlternatesSuggestions","buildSuggestions","suggestionsSearchListHtml","SearchSuggestionsMenu","buildBaseListItem","listItemClassName","linkClassName","textClassName","listItemLabel","listItemEl","link","classifyResults","results","cognitiveResults","documentResult","classifiedResults","articlesAndResearch","reviews","home","questionAndAnswer","r","segment","answer","query","trim","buildSearchForListItem","hasNoSavedSearches","hasNoRecentSearches","hasNoFreeTextSearches","hasNoArticlesAndResearch","savedSearches","recentSearches","freeTextSearches","sectionId","savedSearchesHtml","createMenuSection","savedSearchesListHtml","savedSearch","buildSavedSearchListItem","displayText","secondaryText","entityId","recentSearchesHtml","recentSearchesListHtml","recentSearch","buildRecentSearchListItem","additionalQueryStringParameters","suggestionsSearchesHtml","suggestionsSearchesListHtml","buildFreeTextSearchListItem","optimizedSearchHtml","optimizedSearchListHtml","SUVlistItem","buildSearchOptimizationListItemEl","HybridListItem","TruckListItem","VansListItem","ArticleListItem","append","researchSearchesHtml","researchSearchesListHtml","buildFreeTextSearchListItemEl","highlights","title","reviewsSearchesHtml","reviewsSearchesListHtml","homeSearchesHtml","homeSearchesListHtml","buildQuestionAndAnswerListItemEl","prop4","searchForText","userInputText","suggestions","html","sectionHtml","s","listItemsHtml","buildIneligibleTermsAlternatesSuggestionListItemEl","noteHtml","suggestion","prop5","listItemLink","header","htmlDocument","DOMParser","parseFromString","childNodes","container","domParser","buildSavedSearchListItemEl","listItemName","listItemDesc","listItemLocation","description","filterCount","searchToken","buildRecentSearchUrlWithAdditionalParameters","param","content","buildRecentSearchListItemEl","originalSearch","listItemFilters","localeCompare","sensitivity","greedySearch","String","fromCharCode","isArticleItem","listId","headingTitle","isQuestionAndAnswer","isFeatured","hasNote","searchListContainer","heading","searchList","activeTests","getInstance","instance","activateTest","data","determineIsActive","t","getTestData","activeTest","zipRegEx","isZipCode","camelToPascal","object","pascalObject","keys","pascalKey","charAt","toUpperCase","substring","EXTERNAL_STORES_API","getBaseUrl","getStoreUrl","getStoreAvailabilityUrl","getStoresByKeywordUrl","keyword","take","getStore","res","getStoresByKeyword","storeZip","storesWithoutCBC","zipStores","sp","found","zs","initiateNewSearch","foundStoreModalBody","foundStoreModalClose","focus","getStoreZipCode","stores","allStores","yourStoreId","yourStore","buildDisplayableListOfStores","buildErrorState","foundModal","getElementById","noMatchesFound","yourStores","concat","storesWrapper","renderStoreItem","allStoresLink","buildListOfStores","errorWrapper","determineSection","referenceEl","footer","storeIsSelectedStore","newStoreItemHTML","storeSelectorWrapperHtml","storeNotSaveableSelectedHTML","storeSelectorButtonHtml","el","searchFormElement","keywordInput","FormData","visitorCookie","matches","StoreSearchZipCode","newUrl","newPathname","queryStringParams","newQueryString","p","determineNewStoreSelectionUrl","selectStoreEvent","distanceInMiles","reload","position","payload","ANALYTICS_CONSTANTS","EVENTS","setStore","track","selectNewStoreAction","searchInitiated","searchSuccessful","setStoreInitiated","setStoreSuccessful","ANIMATION","animationFired","LOCATIONS","getPreQualified","storeChange","storeChangeFooter","log","adobeDataLayer","linkDetails","storeSelected","digitalData","lead","sourceSection","eventId","_satellite","InventorySearch","ineligibleTerm","attachSetCognitiveSearchListener","_menu","setSearchBarActiveState","preserveSearchBarPriorContents","searchButton","handleSearchClick","targetEl","activeElement","searchSuggestionsList","clearTimeout","isIneligibleTerm","checkIneligibleTerm","uuid","d","performance","now","c","Math","random","floor","generateUUID","dData","user","searchID","trimmedInputValue","stockNumber","assign","formEl","stopPropagation","active","headerSearchBar","searchQueryStringValue","paramName","RegExp","exec","decodeURIComponent","getQueryStringValue","getElementsByClassName","handleButtonArrowDown","tabbableMenuItems","handleButtonArrowUp","focusableEl","handleOpenButtonEnterSpace","nextListItemEl","parentElement","nextElementSibling","processMenuArrowDown","handleMenuArrowDown","previousElementSibling","processMenuArrowUp","handleMenuArrowUp","toggleButtonEl","handleMenuEscape","handleMenuTab","handleMenuHome","handleMenuEnd","listItemContentEl","ListMenu","_toggleButtonEl","DelayedListMenu","menuName","_rendered","force","buildMenuHTML","currentTarget","MyProfileMenu","MoreLinksMenu","optimizer","seoLinkOptimizer","shouldRenderSeoOptimizedLinks","NEAREST_STORE","nearestStoreLocalStorage","closeButtonEl","removeAttribute","setOpenMenuAccessibility","setCloseMenuAccessibility","handleCloseButtonEnterSpace","childMenuEvent","eventPath","composedPath","isChild","openMenus","contains","isChildMenuEvent","dialogDataAttr","getAttribute","shiftKey","selectFirstFocusableEl","lastFocusableEl","selectLastFocusableEl","processTab","menuFocusStartEl","firstFocusableEl","DialogMenu","_closeButtonEl","DelayedDialogMenu","clickedEl","headerStoreSearchForm","footerStoreSearchForm","NearestStoreMenu","componentConst","myStoreConst","componentId","_type","storeAvailability","NearestStore","_storeAvailability","initialRenderingComplete","flyoutOpen","footerFlyoutOpen","storeUpdateSubscribers","menuLocation","attachSubscribeToStoreUpdatesEventListener","attachSetStoreEventListener","attachSetStoreByIdEventListener","attachSetStoreByIdOnloadEventListener","attachOpenStoreSelectionModalListener","headerMenu","footerMenu","load","subscriber","update","customEvent","stateOrZip","setStoreByID","sendDataToAdobeAnalytics","currentStore","StoreId","Zip","storeCookie","handleLoad","renderHeaderStoreName","renderFooterStoreName","renderHeaderStoreAlerts","renderFooterStoreAlerts","renderAll","cachedStore","serializedNearestStore","removeItem","cStore","closeStoreMenuOnInputSubmit","menuToClose","activeMenu","searchHeaderInputForm","searchFooterInputForm","keywordInputEvent","headerButtonEl","buttonHtml","locationIconHtml","appendHtml","headerMyStoreButton","headerMyStoreSection","footerFlyoutButtonTextEl","renderHeaderAlertInfoIcon","hasAlert","existingStoreAlertContainerEl","headerMyStoreButtonEl","firstChildEl","storeAlertContainerEl","insertBefore","renderAlertLocationIcon","myStoreConstantName","svgCircleAlertEls","myStoreButton","SEO_OPTIMIZED_LINKS","SeoLinkOptimizer","enableSeoOptimizedLinks","optimizeServerRenderedLinks","shouldOptimizeLink","addNofollow","element","StoreHourMenu","showMenu","display","storeStatusMenuEl","storeStatusButtonEl","closeModal","foundBodyElement","getElementsByTagName","foundBaseHtmlElement","Header","HTMLElement","connectedCallback","theme","defaultMarkup","htmlMarkup","desktopHeaderLinks","desktopHeaderMoreButton","desktopFavoriteHeaderLink","desktopProfileIconButton","footerHeaderLogo","parent","headerStoreName","initDesktopHeaderTracking","KMX_GLOBAL_HEADER","customElements","define","Footer","footerLinks","footerStoreName","isSocialLink","isPrequalLink","footerCarMaxLogo","footerPrivacyLinkOne","footerPrequalifiedLink","initFooterTracking","KMX_GLOBAL_FOOTER","createStoreImpl","createState","listeners","Set","setState","partial","nextState","is","previousState","listener","getState","api","getInitialState","initialState","subscribe","delete","destroy","warn","createStore","navStore","set","currentTitle","isThumbNavMenuOpen","thumbNavIndex","isSignedIn","activeTestVariant","onNavItemClick","prevTitle","openThumbNav","toggleChatFob","closeThumbNav","titleAsId","setActiveTestVariant","variant","appElId","MR_CUTE_TEST_CUSTOM_EVENT","buildings","btoa","calendar","calculator","carLift","categories","close","dollarSign","dollarSignSmaller","diamond","house","houseUnfilled","houseUnfilledNonBtoa","lifePreserver","magnifyingGlass","offer","qualified","question","money","register","service","signIn","sparkles","accountProfile","accountProfileGif","smiley","tag","threeDots","menuItems","submenu","kmxAnalytics","analytics","isAccountMenu","showLoggedIn","testData","addCustomElement","elementName","customElementClass","filterAuthorizedMenuItems","submenuItem","showHide","style","visibility","setMenuHeight","currentMenuElement","innerHeight","tabbingAndArrowKeyCallback","menuButtonsWrapper","menuButtons","from","navigableMenuItems","keyboardEvent","arrowUp","arrowDown","tab","focusedMenuItem","relatedTopMenuButton","componentLevelPrefix","ThumbNavMenuItem","subMenuIndex","Number","menuData","determineMenuDataSource","parentMenu","thisMenuItem","_","currSubmenuIndex","attributeString","computeAttributes","hasIcon","linkID","show","atob","thisLink","parentMenuTitle","computedParentMenuTitle","searchInitiation","leadDetails","backdrop","updateBackDrop","ThumbNavBackDrop","_currentState","closeHandler","_backdrop","thisElement","disconnectedCallback","removeEventListener","setIconContent","iconContainer","iconNode","createRange","createContextualFragment","iconLabel","clearLoader","hasVehicleImage","border","ThumbNavMenu","_initialState","_backDropElement","escKeyupCallback","closeButton","setMenuContent","isBackdropVisible","backDropElement","backdropInnerEl","updateMenuItems","closeListener","prev","testSubMenuItems","subMenuItems","toggleMenu","menuElement","contentContainer","currentItem","toLocaleLowerCase","buildThumbNavMenuItem","myKmxUserId","origin","requestAnimationFrame","firstName","fetchProfile","computeMyKmxHeadingText","menuContent","ThumbBarItemHighlightAction","componentLevelCSSPrefix","toggleButtonHighlight","action","highlightClass","HIGHLIGHT","SELECT","INACTIVE","ThumbBarItem","generateTopLevelHeaderTags","buildAnalytics","thisButton","renderSeoMenu","ThumbBar","clickedMenu","hasScrolled","renderTemplate","renderMenuItems","testVariant","loggedIn","toggleNavBarOpen","setAnimatedProfile","createButtonEventListeners","setUpMenuFadeOnScroll","VerticalDirections","isThumbNavVisible","matchMedia","manageChatFabPosition","direction","initialChatFab","postInteractionChatFab","setPosition","chatFabEl","Up","transform","Down","bottom","targetNode","config","childList","subtree","MutationObserver","mutationList","mutation","addedNodes","observe","err","manageChatFab","visits","sessionStorage","minMaxButton","minimizeChatWindow","scrollEffectClass","navEl","scrollY","toggleChatFab","onLoadChatFab","navBar","ThumbNav","configStore","FeatureFlags","EnableFeatureFlag","setConfig","ConfigurationSettings","fetch","json","getFeatureFlags","navRightSectionEl","savedCarsButtonEl","footerCopyrightEl","currentYear","getFullYear","storeChooserWrapperHTML","modalBackgroundHTML","storeChooserModalHTML","headerHTML","titleHTML","hiddenDescriptionHTML","closeButtonHTML","buildCloseIcon","buildStoreChooserHeader","searchFormHTML","onsubmit","searchInputHTML","maxLength","searchSubmitButtonHTML","openModal","foundSearchInput","foundModalWrapper","foundCloseIcon","listenForCustomEventToInitiateSearch","buildStoreSearchFormAndResults","storeChooserModalBodyHTML","headerElement","prepend","moreLinksMenu","inventorySearch","myProfileMenu","storeHourMenu","group","onEventFired","kmx_thumb_nav","skipToMainContentLink"],"sourceRoot":""}