{"version":3,"file":"bundle.553.2fc58e242df7cfeedc187787c6bd7701.js","mappings":"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","sources":["webpack://ws-tracking/./src/utils/createOrUpdateHiddenField.js","webpack://ws-tracking/./src/utils/eventTracker.js","webpack://ws-tracking/./src/utils/isValidUrlPath.js","webpack://ws-tracking/./src/utils/isEmpty.js","webpack://ws-tracking/./src/events/dialog/ajaxContentLoaded.js","webpack://ws-tracking/./src/events/dialog/publishDialogAction.js","webpack://ws-tracking/./src/utils/getLinkLabel.js","webpack://ws-tracking/./src/utils/findVehicleByProperty.js","webpack://ws-tracking/./src/utils/getFormTitle.js","webpack://ws-tracking/./src/utils/widgetIsPresent.js","webpack://ws-tracking/./src/utils/getFormEventData.js","webpack://ws-tracking/./src/events/form/change.js","webpack://ws-tracking/./src/utils/getPIIExistence.js","webpack://ws-tracking/./src/utils/hasMyWalletInteraction.js","webpack://ws-tracking/./src/utils/mapPageAlias.js","webpack://ws-tracking/./src/events/form/confirmation.js","webpack://ws-tracking/./src/utils/storeFormEventId.js","webpack://ws-tracking/./src/events/form/initiation.js","webpack://ws-tracking/./node_modules/uuid/dist/esm-browser/native.js","webpack://ws-tracking/./node_modules/uuid/dist/esm-browser/rng.js","webpack://ws-tracking/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://ws-tracking/./node_modules/uuid/dist/esm-browser/v4.js","webpack://ws-tracking/./src/utils/generateUuid.js","webpack://ws-tracking/./src/utils/createElement.js","webpack://ws-tracking/./src/utils/setFormSessionId.js","webpack://ws-tracking/./src/utils/formatCAIWallet.js","webpack://ws-tracking/./src/utils/injectCAIWalletConfig.js","webpack://ws-tracking/./src/utils/injectExtraInfo.js","webpack://ws-tracking/./src/utils/injectMyCars.js","webpack://ws-tracking/./src/events/form/onPage.js","webpack://ws-tracking/./src/events/form/paymentCalcInit.js","webpack://ws-tracking/./src/events/form/slideChange.js","webpack://ws-tracking/./src/utils/getSubmissionTimestamp.js","webpack://ws-tracking/./src/utils/cleanFieldLabel.js","webpack://ws-tracking/./src/utils/getFieldLabel.js","webpack://ws-tracking/./src/utils/getInvalidFields.js","webpack://ws-tracking/./src/utils/getInvalidFieldsHTML5.js","webpack://ws-tracking/./src/utils/createOrUpdateHiddenFields.js","webpack://ws-tracking/./src/utils/hashPii.js","webpack://ws-tracking/./src/utils/injectFormTrackingAttributes.js","webpack://ws-tracking/./src/utils/setFinanceFormSsnFieldLogging.js","webpack://ws-tracking/./src/utils/injectShiftSessionId.js","webpack://ws-tracking/./src/utils/injectUniteCorrelationId.js","webpack://ws-tracking/./src/events/form/submission.js","webpack://ws-tracking/./src/utils/injectClickPath.js","webpack://ws-tracking/./src/events/link/clickToCall.js","webpack://ws-tracking/./src/utils/getBackgroundColor.js","webpack://ws-tracking/./src/utils/getCtaIndex.js","webpack://ws-tracking/./src/utils/getAllDescendantTextNodeValues.js","webpack://ws-tracking/./src/utils/getLinkText.js","webpack://ws-tracking/./src/events/link/clicked.js","webpack://ws-tracking/./src/events/link/centerClicked.js","webpack://ws-tracking/./src/events/link/compare.js","webpack://ws-tracking/./src/events/link/getDirections.js","webpack://ws-tracking/./src/events/link/hproduct.js","webpack://ws-tracking/./src/events/link/incentive.js","webpack://ws-tracking/./src/events/link/navigationClick.js","webpack://ws-tracking/./src/events/link/recommendedVehicle.js","webpack://ws-tracking/./src/events/link/share.js","webpack://ws-tracking/./src/events/link/socialHeader.js","webpack://ws-tracking/./src/events/link/vehicleCompare.js","webpack://ws-tracking/./src/events/maps/maps.js","webpack://ws-tracking/./src/events/map/pin.js","webpack://ws-tracking/./src/events/page/filterSearch.js","webpack://ws-tracking/./src/utils/getNameAndValueFromSlider.js","webpack://ws-tracking/./src/utils/getFacetsForBreadcrumbs.js","webpack://ws-tracking/./src/events/page/filterSearchClick.js","webpack://ws-tracking/./src/events/page/typedSearch.js","webpack://ws-tracking/./src/events/page/typedSearchInit.js","webpack://ws-tracking/./src/events/page/vehicleDetailView.js","webpack://ws-tracking/./src/events/page/view.js","webpack://ws-tracking/./src/events/slideshow/click.js","webpack://ws-tracking/./src/events/slideshow/pagerClick.js","webpack://ws-tracking/./src/events/video/milestonesReport.js","webpack://ws-tracking/./src/utils/getHashCode.js","webpack://ws-tracking/./src/events/video/play.js","webpack://ws-tracking/./src/events/video/milestonesTrack.js","webpack://ws-tracking/./src/utils/eventHandling/selectorsToHandle.js","webpack://ws-tracking/./src/utils/eventHandling/getSelectorOnHandlers.js","webpack://ws-tracking/./src/utils/eventHandling/handleDynamicForms.js","webpack://ws-tracking/./src/utils/eventHandling/handleTrackEvent.js","webpack://ws-tracking/./src/utils/eventHandling/handleDDCEvent.js","webpack://ws-tracking/./src/utils/eventHandling/getDocumentOnHandlers.js","webpack://ws-tracking/./src/utils/eventHandling/getEventObjects.js","webpack://ws-tracking/./src/utils/eventHandling/handleDocumentOnEvent.js","webpack://ws-tracking/./src/utils/eventHandling/attachHandlers.js","webpack://ws-tracking/./src/utils/eventHandling/handleWsTrackingEventListener.js","webpack://ws-tracking/./src/utils/eventHandling/handleEvents.js","webpack://ws-tracking/./node_modules/wsm-tagging-utils/dist/umd.js"],"sourcesContent":["import { createElement } from 'wsm-tagging-utils';\n\n/**\n * Searches form for specified field and creates hidden field if not found.\n *\n * @param {jQuery} formElement The form being searched.\n * @param {string} hiddenFieldName The name of the field being searched for or created.\n * @param {string} [defaultValue] The value of the field if not defined.\n * @param {object} additionalAttributes An object of additional attributes you want to include on the input.\n * @returns {Object} The field input element that was found or created.\n */\nconst createOrUpdateHiddenField = (\n\tform,\n\thiddenFieldName,\n\tdefaultValue = '',\n\tadditionalAttributes = {}\n) => {\n\tlet field;\n\n\tif (form) {\n\t\tfield = form.querySelector(`input[name='${hiddenFieldName}']`);\n\n\t\tif (!field) {\n\t\t\tconst attrs = Object.entries(additionalAttributes)\n\t\t\t\t.map(([key, value]) => `${key}=\"${value}\"`)\n\t\t\t\t.join(' ');\n\t\t\tfield = createElement(`\n\t\t\t\t\n\t\t\t`);\n\t\t\tform.appendChild(field);\n\t\t}\n\n\t\tfield.value = defaultValue;\n\t}\n\n\treturn field;\n};\n\nexport default createOrUpdateHiddenField;\n","let eventMap = {};\n\nconst generateKey = (event, timeStamp) =>\n\ttimeStamp ? `${event}-${timeStamp}` : event;\n\nconst setEventHasRun = (key, value) => {\n\teventMap[key] = value;\n};\n\nconst getEventHasRun = (key) => eventMap[key];\n\n/**\n * Used to prevent events from firing twice. This issue was discovered when an event handler fired on\n * nested selectors that were both delegated to such as `button, a[href]` for the\n * ddc.generic.link event.\n *\n * @param event is the DDC DataLayer Event System Name (ie. ddc.form.submission)\n * @param timeStamp is the jquery event.timeStamp\n * @returns {boolean} true or false depending on if the event ran or not\n */\nexport const eventHasRun = (\n\tevent,\n\t{ value = true, timeStamp = false } = {}\n) => {\n\tconst key = generateKey(event, timeStamp);\n\n\t// if event+timeStamp has never run add to map and return false\n\tif (!getEventHasRun(key)) {\n\t\tsetEventHasRun(key, value);\n\t\treturn false;\n\t}\n\n\treturn true;\n};\n\nexport const getEventHasRunValue = (key) => {\n\treturn eventMap?.[key];\n};\n\n/**\n * Used to reset events for testing\n */\nexport const resetEvents = (win) => {\n\tif (win.test) {\n\t\teventMap = {};\n\t}\n};\n","/** Validates that url does not contain null in pathname.\n *\n * @param url The url to validate.\n * @returns {boolean} true or false if pathname does not contain null\n */\nconst isValidUrlPath = (url) => {\n\tconst parser = document.createElement('a');\n\n\tparser.href = url;\n\n\treturn !!parser.pathname.match(/^((?!null).)*$/);\n};\n\nexport default isValidUrlPath;\n","const isEmpty = (obj) =>\n\t[Object, Array].includes((obj || {}).constructor) &&\n\t!Object.entries(obj || {}).length;\n\nexport default isEmpty;\n","import { eventHasRun } from '../../utils/eventTracker';\nimport isValidUrlPath from '../../utils/isValidUrlPath';\nimport isEmpty from '../../utils/isEmpty';\n\nexport const DDC_DIALOG_AJAXCONTENTLOADED = 'ddc.dialog.ajaxContentLoaded';\n\n// Fires when ajax content loads from ajaxDialogComplete or slideOpen document level events\nfunction ajaxContentLoaded(\n\t{ DDC: { dialogs } },\n\t{ timeStamp },\n\tname,\n\tpath,\n\t$content\n) {\n\tlet eventObject;\n\tif (\n\t\t!eventHasRun(DDC_DIALOG_AJAXCONTENTLOADED, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\tlet $element = $content;\n\t\tlet hasForm = false;\n\n\t\tif ($element) {\n\t\t\thasForm = $element.find('form').length > 0;\n\t\t} else if (dialogs && (name || isValidUrlPath(path))) {\n\t\t\t$element = dialogs?.[name] || dialogs?.[path];\n\t\t\thasForm =\n\t\t\t\t($element &&\n\t\t\t\t\t!isEmpty($element) &&\n\t\t\t\t\t$element.find('form').length > 0) ||\n\t\t\t\tfalse;\n\t\t}\n\n\t\tif (hasForm) {\n\t\t\t$element.find('form').attr('data-modal', true);\n\t\t}\n\n\t\teventObject = {\n\t\t\teventType: DDC_DIALOG_AJAXCONTENTLOADED,\n\t\t\teventData: {\n\t\t\t\telement: $element,\n\t\t\t\thasForm,\n\t\t\t\tname: name || '',\n\t\t\t\tpath\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default ajaxContentLoaded;\n","import findDialogTitle from '../../utils/findDialogTitle';\nimport { eventHasRun } from '../../utils/eventTracker';\n\nexport const CLOSED = 'closed';\nexport const OPENED = 'opened';\n\nfunction publishDialogAction(win, action, { timeStamp, target: element }) {\n\tlet eventObject;\n\n\tif (action && [CLOSED, OPENED].includes(action)) {\n\t\tconst eventType = `ddc.dialog.${action}`;\n\n\t\tif (action === OPENED) {\n\t\t\tdocument\n\t\t\t\t.querySelectorAll('.ui-dialog')\n\t\t\t\t.forEach((dialog) =>\n\t\t\t\t\tdialog.removeAttribute('ws-tracking-dialog-latest')\n\t\t\t\t);\n\t\t\telement\n\t\t\t\t?.closest?.('.ui-dialog')\n\t\t\t\t?.setAttribute?.('ws-tracking-dialog-latest', true);\n\t\t}\n\n\t\tif (\n\t\t\t!eventHasRun(eventType, {\n\t\t\t\ttimeStamp\n\t\t\t})\n\t\t) {\n\t\t\tconst dialog =\n\t\t\t\telement?.closest?.('.ui-dialog') ||\n\t\t\t\telement?.querySelector?.('.ddc-mobile-slidein') ||\n\t\t\t\tdocument.querySelector(\n\t\t\t\t\t'.ui-dialog[ws-tracking-dialog-latest=\"true\"]'\n\t\t\t\t);\n\n\t\t\tconst form = dialog?.querySelector('form');\n\n\t\t\teventObject = {\n\t\t\t\teventType,\n\t\t\t\teventData: {\n\t\t\t\t\telement,\n\t\t\t\t\tpageName: win.DDC?.dataLayer?.page?.pageInfo?.pageName,\n\t\t\t\t\tdialogTitle: findDialogTitle(dialog),\n\t\t\t\t\thasForm: !!form,\n\t\t\t\t\ttrackingId: form?.dataset?.formTrackingId || ''\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\n\treturn eventObject;\n}\n\nexport default publishDialogAction;\n","/**\n * Resolves label text on SELECT nodes for certain tagging projects.\n *\n * @param element SELECT element containing the text.\n * @returns string label text.\n */\n\nconst getLinkLabel = (element) => {\n\tlet label = '';\n\tif (element && element.nodeName === 'SELECT') {\n\t\tif ($(element).siblings('label').length > 0) {\n\t\t\tlabel = $(element).siblings('label').text();\n\t\t} else {\n\t\t\tlabel = $(element).find('option:first-child').text();\n\t\t}\n\t}\n\treturn label;\n};\n\nexport default getLinkLabel;\n","/**\n * Returns a vehicle object if it has the matching vehicle property being passed in.\n * Note: intended for use on VLP only\n *\n * @param {string} name Property name containing value to be compared.\n * @param {string} value Value to compare against.\n * @returns {object}\n */\nconst findVehicleByProperty = (name, value, vehicles) =>\n\tvehicles ? vehicles.find((vehicle) => vehicle[name] === value) || {} : {};\n\nexport default findVehicleByProperty;\n","// Helper Methods\n\nconst getTextContent = (element) => {\n\tif (\n\t\t!element ||\n\t\t[...element.childNodes].map((item) => item.nodeName).includes('FORM')\n\t) {\n\t\treturn null;\n\t}\n\n\treturn element.textContent;\n};\n\n/**\n * Gets the form title based on context, trimmed:\n * Forms in dialog get the ui-dialog title\n * Forms on page get the widget title\n *\n * If not found, returns empty string.\n *\n * @param {jQuery} form the form as a jquery object\n * @returns {string} the form title, or empty string\n */\nconst getFormTitle = (form) => {\n\tconst formTitle =\n\t\t// get dialog title\n\t\tgetTextContent(\n\t\t\tform?.closest('.ui-dialog')?.querySelector('.ui-dialog-title')\n\t\t) ||\n\t\t// get form title\n\t\tgetTextContent(\n\t\t\tform\n\t\t\t\t?.closest('[data-widget-id]')\n\t\t\t\t?.querySelector('h1, .widget-heading')\n\t\t) ||\n\t\t// title of navigation forms\n\t\tgetTextContent(\n\t\t\tform?.closest('.nav-fragment')?.previousElementSibling\n\t\t) ||\n\t\t// get widget title\n\t\tgetTextContent(form?.closest('[data-widget-id]')?.firstElementChild) ||\n\t\t// you get nothing!\n\t\t'';\n\n\treturn formTitle.trim();\n};\n\nexport default getFormTitle;\n","/**\n * Tests for the presence of a given widget in the current page.\n *\n * @param regex The regular expression object used to test against each widget on the page\n * @returns {boolean} true if the specified widget is present; false otherwise\n */\nconst widgetIsPresent = (regex, pageWidgets) =>\n\tpageWidgets?.find?.((pageWidget) => regex.test(pageWidget)) !== undefined;\n\nexport default widgetIsPresent;\n","import findVehicleByProperty from './findVehicleByProperty';\nimport getFormTitle from './getFormTitle';\nimport widgetIsPresent from './widgetIsPresent';\n\nconst getFieldValue = (form, fieldName) =>\n\tform?.querySelector?.(`input[name=\"${fieldName}\"]`)?.value || '';\n\nconst getFormEventData = ({\n\tform,\n\tvehicles = [],\n\tdataLayer: { page: { pageInfo: { pageWidgets = [] } = {} } = {} } = {}\n}) => {\n\tconst formTrackingName = form?.dataset?.formTrackingName;\n\tconst uuid =\n\t\tgetFieldValue(form, 'itemId') ||\n\t\tgetFieldValue(form, 'vehicleId') ||\n\t\tgetFieldValue(form, 'dl.uuid');\n\n\tconst initiatingClickText = localStorage?.getItem(\n\t\t'ddc_data_layer-initiatingClickText'\n\t);\n\n\tconst eventData = {\n\t\tcurrentTime: new Date().getTime(),\n\t\tcustomFormId: getFieldValue(form, 'custom.form.id'),\n\t\tformTitle: getFormTitle(form),\n\t\t...(formTrackingName && {\n\t\t\tformTrackingName\n\t\t}),\n\t\tisSRP: widgetIsPresent(/ws-inv-listing/, pageWidgets),\n\t\ttrackingId: form?.dataset?.formTrackingId,\n\t\ttrackingTags: getFieldValue(form, 'trackingTags'),\n\t\tvehicle: uuid ? findVehicleByProperty('uuid', uuid, vehicles) : {},\n\t\tisLead: getFieldValue(form, '_action').length > 0,\n\t\tisModal: form?.dataset?.modal === 'true',\n\t\t...(initiatingClickText && { initiatingClickText })\n\t};\n\n\treturn eventData;\n};\n\nexport default getFormEventData;\n","import { eventHasRun } from '../../utils/eventTracker';\nimport getSection from '../../utils/getSection';\nimport getLinkLabel from '../../utils/getLinkLabel';\nimport getFormEventData from '../../utils/getFormEventData';\n\nexport const DDC_FORM_CHANGE = 'ddc.form.change';\nexport const DDC_FORM_FACETBROWSECHANGE = 'ddc.form.facetbrowsechange';\nexport const DDC_FORM_INVENTORYSEARCHLEADCHANGE =\n\t'ddc.form.inventorySearchLeadChange';\n\nconst isValidTag = (tagName, formChangeTypes = ['select']) =>\n\tformChangeTypes.map((type) => type.toUpperCase()).includes(tagName);\n\nfunction change(win, event) {\n\tlet eventObject;\n\tconst {\n\t\ttarget,\n\t\ttimeStamp,\n\t\ttarget: { name, type }\n\t} = event;\n\n\tif (!target?.classList?.contains?.('hidden')) {\n\t\tconst form = target.closest('form');\n\t\tconst isFacetBrowse = form.classList.contains('facetbrowse-ajax-form');\n\t\tconst isSearchLeadForm = form.classList.contains(\n\t\t\t'inventory-search-lead-form'\n\t\t);\n\t\tconst isSelect = target.tagName === 'SELECT';\n\t\tlet eventType = DDC_FORM_CHANGE;\n\n\t\tif (isFacetBrowse) {\n\t\t\teventType = DDC_FORM_FACETBROWSECHANGE;\n\t\t} else if (isSearchLeadForm) {\n\t\t\teventType = DDC_FORM_INVENTORYSEARCHLEADCHANGE;\n\t\t}\n\n\t\tif (\n\t\t\t!eventHasRun(eventType, {\n\t\t\t\ttimeStamp\n\t\t\t})\n\t\t) {\n\t\t\t// scoping controlled by the formChangeTypes preference\n\t\t\t// if you need more than SELECT fields to trigger form change the pref must be set\n\t\t\t// so that we do not add too many events to window.dataLayer for clients that do not need them\n\t\t\tif (\n\t\t\t\tisValidTag(\n\t\t\t\t\ttarget.tagName,\n\t\t\t\t\twin?.DDC?.WidgetData?.['ws-tracking']?.formChangeTypes\n\t\t\t\t) &&\n\t\t\t\ttarget?.closest?.('.hide-from-ws-tracking') === null // added to avoid internal event viewer tracking\n\t\t\t) {\n\t\t\t\tconst {\n\t\t\t\t\tDDC: {\n\t\t\t\t\t\tdataLayer = {},\n\t\t\t\t\t\tdataLayer: { vehicles = [] } = {}\n\t\t\t\t\t} = {}\n\t\t\t\t} = win;\n\t\t\t\tconst trackingId = form?.dataset?.formTrackingId;\n\t\t\t\tconst eventData = {\n\t\t\t\t\telement: target,\n\t\t\t\t\tformEventId:\n\t\t\t\t\t\tform.querySelector('input[name=\"formEventId\"]')\n\t\t\t\t\t\t\t?.value || '',\n\t\t\t\t\tlabel: name || '', // if a SELECT field this can be ovewritten below by the selected option's text\n\t\t\t\t\tfieldName: name || '', // this is the actual field name in the HTML\n\t\t\t\t\tlinkType: type,\n\t\t\t\t\t...(trackingId && { trackingId }),\n\t\t\t\t\t...getFormEventData({\n\t\t\t\t\t\tform,\n\t\t\t\t\t\tvehicles,\n\t\t\t\t\t\tdataLayer\n\t\t\t\t\t})\n\t\t\t\t};\n\n\t\t\t\tconst section = getSection(target);\n\t\t\t\tconst customLinkLabel = getLinkLabel(target);\n\n\t\t\t\tif (section) {\n\t\t\t\t\teventData.trackingSection = section;\n\t\t\t\t}\n\n\t\t\t\tif (customLinkLabel) {\n\t\t\t\t\teventData.customLinkLabel = customLinkLabel;\n\t\t\t\t}\n\n\t\t\t\tif (isSelect) {\n\t\t\t\t\tconst selectedOption = target.options[target.selectedIndex];\n\t\t\t\t\tconst selectedText = selectedOption && selectedOption.text;\n\t\t\t\t\tif (!name && selectedText) {\n\t\t\t\t\t\teventData.label = selectedText;\n\t\t\t\t\t}\n\t\t\t\t\teventData.firstOptionText =\n\t\t\t\t\t\t(target.options.length > 0 && target.options[0].text) ||\n\t\t\t\t\t\t'';\n\t\t\t\t\teventData.selectedValue =\n\t\t\t\t\t\t(selectedOption && selectedOption.value) || '';\n\t\t\t\t}\n\n\t\t\t\tconst visibleSelects = $(form)\n\t\t\t\t\t.find('select')\n\t\t\t\t\t.filter(':visible');\n\t\t\t\t$.each(visibleSelects, (_index, element) => {\n\t\t\t\t\tconst $element = $(element);\n\t\t\t\t\tconst value = $element.val();\n\n\t\t\t\t\tif (value) {\n\t\t\t\t\t\teventData[$element.attr('name')] = value;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tif (target.labels?.length) {\n\t\t\t\t\teventData.text = target.labels[0].textContent.trim();\n\t\t\t\t}\n\n\t\t\t\teventObject = {\n\t\t\t\t\teventType,\n\t\t\t\t\teventData\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\treturn eventObject;\n}\n\nexport default change;\n","/**\n *\n * @param form\n * @return - An object containing which PII fields exist for the event. This will use both data from eventData\n * or from window.DDC.dataLayer.confirmation.\n * @example\n * {\n * firstNameExists: true,\n * lastNameExists: true,\n * phoneExists: false,\n * emailExists: true\n * }\n */\nconst getPIIExistence = (form, confirmation = {}) => {\n\tconst pii = [\n\t\t'applicant.contact.email',\n\t\t'applicant.contact.firstName',\n\t\t'applicant.contact.lastName',\n\t\t'applicant.contact.phone',\n\t\t'applicant.contact.address.street',\n\t\t'contact.firstName',\n\t\t'contact.lastName',\n\t\t'contact.email',\n\t\t'contact.phone',\n\t\t'contact.address.street'\n\t];\n\tconst fields = {};\n\n\tpii.forEach((info) => {\n\t\tconst lookup = info\n\t\t\t.replace('applicant.', '')\n\t\t\t.replace('contact.', '')\n\t\t\t.replace('address.', '');\n\t\tconst prop = `${lookup.replace('address.', '')}Exists`;\n\t\tconst formFieldHasValue =\n\t\t\tform &&\n\t\t\t((form?.elements?.[info] && !!form.elements?.[info].value) ||\n\t\t\t\t(form?.elements?.[`${info}.sep`] &&\n\t\t\t\t\t!!form.elements?.[`${info}.sep`].value)); // formbuilder adds .sep to fields\n\t\tfields[prop] =\n\t\t\tfields[prop] || // If we don't have this then true entries will get overwritten\n\t\t\t(form && formFieldHasValue) ||\n\t\t\t(confirmation && !!confirmation[lookup]) ||\n\t\t\tfalse;\n\t});\n\n\treturn fields;\n};\n\nexport default getPIIExistence;\n","/**\n * Determine if the user has interacted with My Wallet\n * @returns bool\n */\nexport default (win) => {\n\tconst CAIWalletConfigValue =\n\t\twindow.localStorage?.getItem('CAIWalletConfig');\n\tconst optOut = win.DDC.getSiteProperty('OptOutCAIWalletConfig');\n\tif (!optOut && CAIWalletConfigValue) {\n\t\tconst CAIWalletConfig = JSON.parse(CAIWalletConfigValue);\n\t\tif (CAIWalletConfig && CAIWalletConfig.interactions) {\n\t\t\treturn (\n\t\t\t\tCAIWalletConfig.interactions.hasUpdatedWallet ||\n\t\t\t\tCAIWalletConfig.interactions.hasOpenedWallet\n\t\t\t);\n\t\t}\n\t}\n\treturn false;\n};\n","// pageType definition from Pixall\n// https://pixall-qa-api.prod.analytics.dealer.com/docs#pagetype-required\n\nconst pageAliasMapping = [\n\t{\n\t\tmatcher: '(?:^AUTO_.*_DETAILS|.*_DETAILS.*)$',\n\t\tdata: {\n\t\t\tpageType: 'vdp'\n\t\t}\n\t},\n\t{\n\t\tmatcher:\n\t\t\t'.*(?:INVENTORY_LISTING|INVENTORY_FEATURED|INVENTORY_SEARCH|_INVENTORY|SMARTBROWSE|FACETBROWSE_AJAX).*',\n\t\tdata: {\n\t\t\tpageType: 'vlp'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*(?:CONTACT|QUICK_QUOTE|INVENTORY_FINDER|CARFINDER).*',\n\t\tdata: {\n\t\t\tpageType: 'contact'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*404.*',\n\t\tdata: {\n\t\t\tpageType: 'error'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*(?:ABOUT|BLOG|EMPLOYMENT|NEWS|STAFF|TESTIMONIALS).*',\n\t\tdata: {\n\t\t\tpageType: 'about'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*(?:COMPARE|FAVORITES).*',\n\t\tdata: {\n\t\t\tpageType: 'comparison'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*(?:DIRECTIONS|LOCATIONS).*',\n\t\tdata: {\n\t\t\tpageType: 'directions'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*FINANCE.*',\n\t\tdata: {\n\t\t\tpageType: 'finance'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*(?:INCENTIVES|SPECIALS).*',\n\t\tdata: {\n\t\t\tpageType: 'specials'\n\t\t}\n\t},\n\t{\n\t\tmatcher: 'INDEX',\n\t\tdata: {\n\t\t\tpageType: 'home'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*PARTS.*',\n\t\tdata: {\n\t\t\tpageType: 'parts'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*(?:SERVICE|BODYSHOP).*',\n\t\tdata: {\n\t\t\tpageType: 'service'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*SHOWROOM.*',\n\t\tdata: {\n\t\t\tpageType: 'showroom'\n\t\t}\n\t},\n\t{\n\t\tmatcher: '.*',\n\t\tdata: {\n\t\t\tpageType: 'other'\n\t\t}\n\t}\n];\n\n/**\n * Returns the pageType mapping given the DDC page alias.\n * Mapping keys are treated as regular expressions used to test\n * the current page alias for a match.\n *\n * @param {string} pageAlias The DDC page alias\n * @returns {string} The pageType mapping, must return a value, default is 'other'\n */\nfunction mapPageAlias(pageAliasIn) {\n\tlet mapping;\n\tlet pageType;\n\n\tif (typeof pageAliasIn === 'string' && pageAliasIn !== '') {\n\t\tconst pageAlias = pageAliasIn.toUpperCase();\n\t\tmapping = Object.entries(pageAliasMapping).find((obj) =>\n\t\t\tpageAlias.match(obj[1].matcher)\n\t\t);\n\t\tpageType = mapping[1]?.data?.pageType;\n\t}\n\n\treturn pageType || null;\n}\n\nexport default mapPageAlias;\n","import { eventHasRun } from '../../utils/eventTracker';\nimport getPIIExistence from '../../utils/getPIIExistence';\nimport {\n\twsTrackNrClickPathMissing,\n\twsTrackNrBlockedFormConfirmation\n} from '../../utils/wsTrackNr';\nimport hasMyWalletInteraction from '../../utils/hasMyWalletInteraction';\nimport mapPageAlias from '../../utils/mapPageAlias';\nimport {\n\thasStoredFormEventId,\n\tstoreFormEventId\n} from '../../utils/storeFormEventId';\n\nexport const DDC_FORM_CONFIRMATION = 'ddc.form.confirmation';\n\nconst getInputFieldValue = ($form, attrVal, attr = 'name') =>\n\t$form.find(`[${attr}='${attrVal}']`).val();\n\nasync function confirmation(win, doc, event, eventCategory = '') {\n\tconst { DDC } = win;\n\tlet eventObject;\n\tconst { dataLayer } = DDC;\n\tdataLayer.confirmation = dataLayer.confirmation || {};\n\tconst dataLayerConfirmation = dataLayer.confirmation;\n\tconst $element = event\n\t\t? $(event.target)\n\t\t: $(dataLayerConfirmation?.element);\n\tconst $form = $element.closest('form');\n\tconst submissionTimestamp =\n\t\t$form\n\t\t\t.find(\n\t\t\t\t'[name=\"_custom=SUBMISSION_TIMESTAMP=-1=submissionTimestamp\"]'\n\t\t\t)\n\t\t\t.val() || dataLayerConfirmation.submissionTimestamp;\n\t// do not block form confirmation events that have a missing timestamp\n\t// and\n\t// only check eventHasRun if there is a timestamp\n\t// otherwise could prevent tracking on pages with multiple forms that lack submission timestamps\n\tif (\n\t\t!submissionTimestamp ||\n\t\t(!!submissionTimestamp &&\n\t\t\t!eventHasRun(DDC_FORM_CONFIRMATION, {\n\t\t\t\ttimeStamp: submissionTimestamp\n\t\t\t}))\n\t) {\n\t\tconst formTrackingName =\n\t\t\tgetInputFieldValue($form, 'formTrackingName') ||\n\t\t\tdataLayerConfirmation.formTrackingName ||\n\t\t\t$form.data('form-tracking-name') ||\n\t\t\tDDC.getUrlParams().formTrackingName;\n\n\t\t// on form confirmation pages:\n\t\t// this relies on Widget.jsx component to have run first on a confirmation page\n\t\t// it does seem to work that way even though handleEvents.js is higher up in the js file\n\t\t// on ajax form confirmation pages:\n\t\t// this works because we wait until form.fields is defined and an object\n\t\tlet piiData;\n\t\tawait new Promise((resolve) => {\n\t\t\tlet interval;\n\t\t\t// safe timeout\n\t\t\tconst timeout = setTimeout(() => {\n\t\t\t\tclearInterval(interval);\n\t\t\t\tresolve();\n\t\t\t}, 1000);\n\t\t\tinterval = setInterval(() => {\n\t\t\t\tif (\n\t\t\t\t\twin.DDC?.WidgetData['ws-tracking']?.confirmationData?.form\n\t\t\t\t\t\t?.fields\n\t\t\t\t) {\n\t\t\t\t\tpiiData = {\n\t\t\t\t\t\tfields: win.DDC?.WidgetData['ws-tracking']\n\t\t\t\t\t\t\t?.confirmationData?.form?.fields,\n\t\t\t\t\t\tfieldsTrimmedLowerCase:\n\t\t\t\t\t\t\twin.DDC?.WidgetData['ws-tracking']?.confirmationData\n\t\t\t\t\t\t\t\t?.form?.fieldsTrimmedLowerCase\n\t\t\t\t\t};\n\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\tresolve();\n\t\t\t\t}\n\t\t\t}, 10);\n\t\t});\n\n\t\tconst eventData = {\n\t\t\tcurrentTime: new Date().getTime(),\n\t\t\tcustomFormId:\n\t\t\t\tgetInputFieldValue($form, 'custom.form.id') ||\n\t\t\t\tdataLayerConfirmation.customFormId ||\n\t\t\t\t'',\n\t\t\telapsedTime:\n\t\t\t\tparseInt(\n\t\t\t\t\tgetInputFieldValue($form, 'dl.formElapsedTime') ||\n\t\t\t\t\t\tdataLayerConfirmation.elapsedTime,\n\t\t\t\t\t10\n\t\t\t\t) || '',\n\t\t\telement:\n\t\t\t\tgetInputFieldValue($form, 'dl.element') ||\n\t\t\t\tdataLayerConfirmation.element ||\n\t\t\t\t'',\n\t\t\teventCategory,\n\t\t\t...(piiData &&\n\t\t\t\tObject.keys(piiData).length && {\n\t\t\t\t\t...piiData\n\t\t\t\t}),\n\t\t\tformEventId:\n\t\t\t\tgetInputFieldValue($form, 'formEventId') ||\n\t\t\t\tdataLayerConfirmation.formEventId ||\n\t\t\t\t'',\n\t\t\tsubmissionTimestamp,\n\t\t\tformTitle:\n\t\t\t\tgetInputFieldValue($form, 'dl.widgetName') ||\n\t\t\t\tdataLayerConfirmation.formTitle ||\n\t\t\t\t'',\n\t\t\tfromVdp:\n\t\t\t\tgetInputFieldValue($form, 'dl.fromVdp') === 'true' ||\n\t\t\t\twindow.DDC?.WidgetData?.['ws-tracking']?.confirmationData?.form\n\t\t\t\t\t?.fields?.fromVdp ||\n\t\t\t\tfalse,\n\t\t\tfromVlp:\n\t\t\t\tgetInputFieldValue($form, 'dl.fromVlp') === 'true' ||\n\t\t\t\twindow.DDC?.WidgetData?.['ws-tracking']?.confirmationData?.form\n\t\t\t\t\t?.fields?.fromVlp ||\n\t\t\t\tfalse,\n\t\t\tisModal:\n\t\t\t\tgetInputFieldValue($form, 'dl.isModal') === 'true' ||\n\t\t\t\tdataLayerConfirmation.isModal === 'true' ||\n\t\t\t\tfalse,\n\t\t\tparams:\n\t\t\t\tgetInputFieldValue($form, 'dl.params') ||\n\t\t\t\tdataLayer.page.pageInfo.params ||\n\t\t\t\t'',\n\t\t\tpreferredContact:\n\t\t\t\tgetInputFieldValue($form, 'dl.contact.preferredContact') ||\n\t\t\t\tdataLayerConfirmation.preferredContact ||\n\t\t\t\t'',\n\t\t\tpageName:\n\t\t\t\tgetInputFieldValue($form, 'dl.pageName') ||\n\t\t\t\tDDC.getUrlParams().pageAlias ||\n\t\t\t\t'',\n\t\t\tpixallPageType: mapPageAlias(dataLayer.confirmation.pageName) || '',\n\t\t\ttrackingTags:\n\t\t\t\tgetInputFieldValue($form, 'trackingTags') ||\n\t\t\t\tdataLayerConfirmation.trackingTags ||\n\t\t\t\t'',\n\t\t\ttrackingId:\n\t\t\t\tgetInputFieldValue($form, 'dl.formTrackingId') ||\n\t\t\t\tdataLayerConfirmation.trackingId ||\n\t\t\t\t$form.data('form-tracking-id') ||\n\t\t\t\t'',\n\t\t\t...(formTrackingName && { formTrackingName }),\n\t\t\tuserSessionId:\n\t\t\t\tdataLayer.confirmation.pageName ||\n\t\t\t\tgetInputFieldValue($form, 'userSessionId') ||\n\t\t\t\t'',\n\t\t\tvalidate:\n\t\t\t\tgetInputFieldValue($form, 'dl.validate') === 'true' ||\n\t\t\t\tdataLayerConfirmation.validate === 'true' ||\n\t\t\t\tfalse,\n\t\t\tvehicle:\n\t\t\t\tdataLayerConfirmation?.vehicle || dataLayer.vehicles?.[0] || '',\n\t\t\tzip:\n\t\t\t\tgetInputFieldValue(\n\t\t\t\t\t$form,\n\t\t\t\t\t'dl.contact.address.postalCode',\n\t\t\t\t\t'data-id'\n\t\t\t\t) ||\n\t\t\t\tdataLayerConfirmation.zip ||\n\t\t\t\t'',\n\t\t\t...getPIIExistence($form[0], DDC)\n\t\t};\n\n\t\tconst { flags } = win.DDC.WidgetData['ws-tracking'];\n\n\t\tif (\n\t\t\tflags['ws-tracking-block-duplicate-form-event-ids'] &&\n\t\t\teventData.formEventId &&\n\t\t\thasStoredFormEventId(eventData.formEventId)\n\t\t) {\n\t\t\twsTrackNrBlockedFormConfirmation(eventData.formEventId);\n\t\t\treturn null;\n\t\t} else if (\n\t\t\tflags['ws-tracking-block-duplicate-form-event-ids'] &&\n\t\t\teventData.formEventId\n\t\t) {\n\t\t\tstoreFormEventId(eventData.formEventId);\n\t\t}\n\n\t\tif (\n\t\t\tflags['ws-tracking-block-duplicate-form-session-ids'] &&\n\t\t\teventData.userSessionId &&\n\t\t\teventData.userSessionId !== sessionStorage.getItem('userSessionId')\n\t\t) {\n\t\t\twsTrackNrBlockedFormConfirmation(eventData.formEventId);\n\t\t\treturn null;\n\t\t}\n\n\t\tif (dataLayerConfirmation?.formVehicleModel) {\n\t\t\teventData.formVehicleModel =\n\t\t\t\tdataLayerConfirmation?.formVehicleModel ||\n\t\t\t\tgetInputFieldValue($form, 'model');\n\t\t}\n\n\t\tconst initiatingClickText = localStorage?.getItem(\n\t\t\t'ddc_data_layer-initiatingClickText'\n\t\t);\n\t\tif (initiatingClickText) {\n\t\t\teventData.initiatingClickText = initiatingClickText;\n\t\t\tlocalStorage?.removeItem('ddc_data_layer-initiatingClickText');\n\t\t}\n\n\t\t/**\n\t\t * `dataLayer.confirmation` updates for AJAX forms.\n\t\t * Assume confirmation events not fired on POST confirmation page\n\t\t * are AJAX submissions.\n\t\t * NOTE: $pageName defined above is originating page alias and not\n\t\t * current page alias.\n\t\t */\n\t\tif (\n\t\t\tDDC?.dataLayer?.page?.pageInfo?.pageName?.indexOf('CONFIRM') === -1\n\t\t) {\n\t\t\t// update missing values in confirmation object\n\t\t\tObject.keys(dataLayerConfirmation).forEach((key) => {\n\t\t\t\tif (\n\t\t\t\t\t(typeof dataLayerConfirmation[key] === 'undefined' ||\n\t\t\t\t\t\tdataLayerConfirmation[key] === null) &&\n\t\t\t\t\ttypeof eventData[key] !== 'undefined' &&\n\t\t\t\t\teventData[key] !== null\n\t\t\t\t) {\n\t\t\t\t\tdataLayerConfirmation[key] = eventData[key];\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// parse vehicle information on non-VDP pages\n\t\t\tconst uuid = $form.find(\"input[name='dl.uuid']\").val();\n\t\t\tconst vehicle =\n\t\t\t\tuuid &&\n\t\t\t\tdataLayer.vehicles.find(\n\t\t\t\t\t(vehicleObj) => vehicleObj.uuid === uuid\n\t\t\t\t);\n\n\t\t\tif (vehicle) {\n\t\t\t\teventData.vehicle = vehicle;\n\t\t\t\tdataLayerConfirmation.vehicle = vehicle;\n\t\t\t\tdataLayerConfirmation.uuid = uuid;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\teventData.eventCategory === 'digital-retailing-cox' ||\n\t\t\teventData.formEventId ||\n\t\t\teventData.submissionTimestamp ||\n\t\t\teventData.trackingId ||\n\t\t\teventData.customFormId\n\t\t) {\n\t\t\teventObject = {\n\t\t\t\teventType: DDC_FORM_CONFIRMATION,\n\t\t\t\teventData\n\t\t\t};\n\t\t}\n\n\t\tif (eventData.validate === true) {\n\t\t\t// Only when validate is true we want to check if there is a clickpath\n\t\t\t// We want to grab the params and parse the clickpath\n\t\t\t// If the string or the value from the clickpath string does not exist then we log it on newRelic\n\t\t\tconst { params } = eventData;\n\t\t\tconst paramsArray = params.split('&');\n\t\t\tconst clickPathString =\n\t\t\t\tparamsArray.find((item) => item.includes('clickpath')) || '';\n\t\t\tconst [, clickPath] = clickPathString.split('=');\n\n\t\t\tif (!clickPath) {\n\t\t\t\twsTrackNrClickPathMissing();\n\t\t\t}\n\t\t}\n\n\t\teventData.mywallet = !!hasMyWalletInteraction(win);\n\n\t\tif (\n\t\t\twin?.DDC?.WidgetData?.['ws-tracking']?.flags?.[\n\t\t\t\t'ws-tracking-form-reporting'\n\t\t\t]\n\t\t) {\n\t\t\twin?.newrelic?.addPageAction('wsTrackingFormConfirmation', {\n\t\t\t\tconfirmationPageAlias:\n\t\t\t\t\twin?.DDC?.dataLayer?.page?.pageInfo?.pageName,\n\t\t\t\tconfirmationPagePath:\n\t\t\t\t\twin?.DDC?.dataLayer?.page?.pageInfo?.pagePath,\n\t\t\t\tcustomFormId: eventData.customFormId,\n\t\t\t\tdealershipName: win?.DDC?.dataLayer?.dealership?.dealershipName,\n\t\t\t\tformEventId: eventData.formEventId,\n\t\t\t\tformLocation: eventData.isModal\n\t\t\t\t\t? 'modal'\n\t\t\t\t\t: win?.DDC?.WidgetData?.['ws-tracking']?.confirmationData\n\t\t\t\t\t\t\t?.form?.fields?.formLocation,\n\t\t\t\tformPageAlias: eventData.pageName,\n\t\t\t\tformPagePath: win?.DDC?.dataLayer?.confirmation?.formPagePath,\n\t\t\t\tformTrackingName: eventData.formTrackingName,\n\t\t\t\treferrerPageAlias: win?.DDC?.dataLayer?.confirmation?.pageName,\n\t\t\t\treferrerPagePath: doc?.referrer,\n\t\t\t\treferrerPixallPageType: eventData.pixallPageType,\n\t\t\t\tsource: 'ws-tracking',\n\t\t\t\ttrackingId: eventData.trackingId\n\t\t\t});\n\t\t}\n\t}\n\n\treturn eventObject;\n}\n\nexport default confirmation;\n","export const hasStoredFormEventId = (id) => {\n\tlet formEventIds = window.localStorage.getItem('formEventIds');\n\tformEventIds = formEventIds ? JSON.parse(formEventIds) : [];\n\treturn formEventIds.indexOf(id) > -1;\n};\n\nexport const storeFormEventId = (id) => {\n\tlet formEventIds = localStorage.getItem('formEventIds');\n\tformEventIds = formEventIds ? JSON.parse(formEventIds) : [];\n\tformEventIds.push(id);\n\tformEventIds = JSON.stringify(formEventIds);\n\twindow.localStorage.setItem('formEventIds', formEventIds);\n};\n","import getFormEventData from '../../utils/getFormEventData';\nimport { eventHasRun } from '../../utils/eventTracker';\nimport getSection from '../../utils/getSection';\n\nexport const DDC_FORM_INITIATION = 'ddc.form.initiation';\n\nfunction initiation(\n\t{\n\t\tDDC: {\n\t\t\tdataLayer = {},\n\t\t\tdataLayer: {\n\t\t\t\tpage: { pageInfo: { pageName } = {} } = {},\n\t\t\t\tvehicles = []\n\t\t\t} = {}\n\t\t}\n\t},\n\t{ currentTarget, timeStamp }\n) {\n\tlet eventObject;\n\tconst form = currentTarget?.closest('form');\n\n\tconst formEventId =\n\t\tform?.querySelector('input[name=\"formEventId\"]')?.value || '';\n\tconst formEventData = getFormEventData({\n\t\tform,\n\t\tvehicles,\n\t\tdataLayer\n\t});\n\tconst eventMapId = formEventId || formEventData.trackingId;\n\n\t// Currently typedSearch forms are not tracked for initiation.\n\tif (form?.dataset?.formTrackingType === 'typedSearch') {\n\t\teventHasRun(eventMapId, {\n\t\t\tvalue: {\n\t\t\t\tformInitiationTime: new Date().getTime()\n\t\t\t}\n\t\t});\n\t} else if (\n\t\t// make sure this form has not initialized yet\n\t\t!eventHasRun(DDC_FORM_INITIATION, {\n\t\t\ttimeStamp\n\t\t}) &&\n\t\t// only submit formInitiation once\n\t\t!eventHasRun(eventMapId, {\n\t\t\tvalue: {\n\t\t\t\tformInitiationTime: new Date().getTime()\n\t\t\t}\n\t\t})\n\t) {\n\t\tconst activeElement = document.activeElement.getAttribute('name');\n\t\tconst activeElementTag = document.activeElement.tagName.toLowerCase();\n\t\tconst section = getSection(form);\n\n\t\teventObject = {\n\t\t\teventType: DDC_FORM_INITIATION,\n\t\t\teventData: {\n\t\t\t\telement: form,\n\t\t\t\tformEventId,\n\t\t\t\tpageName,\n\t\t\t\t...formEventData\n\t\t\t}\n\t\t};\n\n\t\tif (section) {\n\t\t\teventObject.eventData.trackingSection = section;\n\t\t}\n\n\t\tif (activeElement) {\n\t\t\teventObject.eventData.activeElement = activeElement;\n\t\t\teventObject.eventData.activeElementTag = activeElementTag;\n\t\t\tif (document.activeElement.labels.length) {\n\t\t\t\teventObject.eventData.text =\n\t\t\t\t\tdocument.activeElement.labels[0].textContent.trim();\n\t\t\t}\n\t\t}\n\t}\n\n\treturn eventObject;\n}\n\nexport default initiation;\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default {\n randomUUID\n};","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nlet getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nconst byteToHex = [];\n\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\n\nexport function unsafeStringify(arr, offset = 0) {\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();\n}\n\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset); // Consistency check for valid UUID. If this throws, it's likely due to one\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\n\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n\n options = options || {};\n const rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return unsafeStringify(rnds);\n}\n\nexport default v4;","import { v4 as uuidv4 } from 'uuid';\n\nconst generateUuid = (form) => {\n\tlet formEventId = '';\n\n\tif (form) {\n\t\tconst enableLogs =\n\t\t\tnew URLSearchParams(window.location.search).get('_mode') ===\n\t\t\t'debug';\n\n\t\tif (enableLogs) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log('formEventId:current ---->', form);\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log('cms-web:formEventId ----->', formEventId);\n\t\t}\n\n\t\tconst formEventIdField = form?.querySelector?.(\n\t\t\t'input[name=\"formEventId\"]'\n\t\t);\n\n\t\tformEventId = formEventIdField?.value;\n\n\t\tformEventId = uuidv4().replace(/-/g, '');\n\t\tformEventIdField?.setAttribute?.('value', formEventId);\n\t\tif (enableLogs)\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(`ws-tracking:formEventId -----> ${formEventId}`);\n\n\t\tconst actionURL = form.getAttribute('action');\n\n\t\tif (actionURL) {\n\t\t\tif (enableLogs)\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(`old:actionUrl ----> ${actionURL}`);\n\n\t\t\tconst formActionUrl = actionURL.split('?');\n\t\t\tconst formActionParams = new URLSearchParams(formActionUrl[1]);\n\t\t\tformActionParams.set('formEventId', formEventId);\n\t\t\tform.setAttribute(\n\t\t\t\t'action',\n\t\t\t\t`${formActionUrl[0]}?${formActionParams.toString()}`\n\t\t\t);\n\n\t\t\tif (enableLogs)\n\t\t\t\t// eslint-disable-next-line no-console\n\t\t\t\tconsole.log(\n\t\t\t\t\t`new:actionUrl ----> ${form.getAttribute('action')}`\n\t\t\t\t);\n\t\t}\n\t}\n\n\treturn formEventId;\n};\n\nexport default generateUuid;\n","import { readyHTMLForParse } from 'wsm-tagging-utils';\n\n/**\n *\n * @param {string} str The HTML string to turn into an element.\n * @returns An HTMLElement for use in testing.\n */\nconst createElement = (str) => {\n\tconst element = document.createElement('template');\n\telement.innerHTML = readyHTMLForParse(str);\n\treturn element.content.firstChild;\n};\n\nexport default createElement;\n","import createElement from './createElement';\nimport { TrackedInfo } from '../global-constants';\n\nconst setFormSessionId = (form) => {\n\tif (form) {\n\t\t// const enableLogs =\n\t\t// \tnew URLSearchParams(window.location.search).get('_mode') ===\n\t\t// \t'debug';\n\t\t// Get session Id out of session Storage\n\t\tconst sessionId = sessionStorage.getItem(TrackedInfo.USER_SESSION_ID);\n\n\t\tif (sessionId) {\n\t\t\tconst sessionReferer = sessionStorage.getItem(\n\t\t\t\tTrackedInfo.SESSION_REFERRER\n\t\t\t);\n\t\t\tconst userSessionIdFormField = form.querySelector(\n\t\t\t\t'input[name=\"userSessionId\"]'\n\t\t\t);\n\n\t\t\tif (userSessionIdFormField) {\n\t\t\t\tuserSessionIdFormField.setAttribute('value', sessionId);\n\t\t\t} else {\n\t\t\t\tform.appendChild(\n\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t``\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (sessionReferer) {\n\t\t\t\tform.appendChild(\n\t\t\t\t\tcreateElement(\n\t\t\t\t\t\t``\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexport default setFormSessionId;\n","const formatCAIWallet = (walletData) => {\n\tconst parseCurrency = (n) => {\n\t\tconst num = n ?? 0;\n\t\tconst currencyOptions = {\n\t\t\tstyle: 'currency',\n\t\t\tcurrency: 'USD',\n\t\t\tminimumFractionDigits: num % 1 ? 2 : 0,\n\t\t\tmaximumFractionDigits: num % 1 ? 2 : 0\n\t\t};\n\t\treturn parseFloat(num, 10).toLocaleString('en-US', currencyOptions);\n\t};\n\n\tconst creditRange = {\n\t\ta: 'Excellent',\n\t\tb: 'Very Good',\n\t\tc: 'Good',\n\t\td: 'Fair',\n\t\te: 'Rebuilding'\n\t};\n\n\tconst {\n\t\tbudget,\n\t\tcreditType,\n\t\tdealType,\n\t\tdownPayment,\n\t\tloanTerm,\n\t\tmonthlyBudget,\n\t\ttradeIn\n\t} = walletData;\n\n\t// if you update this, make sure to also update the unit tests: injectCAIWalletConfig.test.js\n\tconst format = [\n\t\t'My Wallet/Offer Details:',\n\t\t' Deal Type: '.concat(dealType || 'Finance', ',')\n\t];\n\n\tif (budget) {\n\t\tformat.push(' Sale Price: '.concat(parseCurrency(budget), ','));\n\t}\n\n\tif (downPayment !== null) {\n\t\tformat.push(' Down Payment: '.concat(parseCurrency(downPayment), ','));\n\t}\n\n\tif (creditType) {\n\t\tformat.push(' Credit Range: '.concat(creditRange[creditType], ','));\n\t}\n\n\tif (loanTerm) {\n\t\tformat.push(' Terms: '.concat(loanTerm, ' months,'));\n\t}\n\n\tif (monthlyBudget) {\n\t\tformat.push(' Payment: '.concat(parseCurrency(monthlyBudget), ','));\n\t}\n\n\tif (tradeIn?.value) {\n\t\tformat.push(' Trade-In Value: '.concat(parseCurrency(tradeIn.value)));\n\t}\n\n\treturn format.join('\\n');\n};\n\nexport default formatCAIWallet;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\nimport formatCAIWallet from './formatCAIWallet';\n\nconst injectCAIWalletConfig = (win, form) => {\n\tif (win?.DDC?.getSiteProperty('OptOutCAIWalletConfig') === true) {\n\t\treturn;\n\t}\n\n\tconst walletConfigKey = 'CAIWalletConfig';\n\n\tconst data = win?.localStorage?.getItem(walletConfigKey) || '{}';\n\tconst walletData = JSON.parse(data);\n\n\tconst { interactions } = walletData;\n\tconst { hasOpenedWallet, hasUpdatedWallet } = interactions || {};\n\n\tif (!(hasOpenedWallet || hasUpdatedWallet)) {\n\t\treturn;\n\t}\n\n\tcreateOrUpdateHiddenField(\n\t\tform,\n\t\t`_custom=CAI_WALLET_CONFIG=-1=${walletConfigKey}`,\n\t\tformatCAIWallet(walletData)\n\t);\n};\n\nexport default injectCAIWalletConfig;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\nimport getKeysForExtraInfo from './getKeysForExtraInfo';\n\n/**\n *\n * @param {Object} win\n * @param {HTMLFormElement} form\n * @param {Object} prefParams\n */\nconst injectExtraInfo = (\n\twin,\n\tform,\n\t{ cookiesForExtraInfo = '', paramsForExtraInfo = '' } = {}\n) => {\n\tconst cookieNames = getKeysForExtraInfo(win, cookiesForExtraInfo);\n\tconst paramNames = getKeysForExtraInfo(win, paramsForExtraInfo);\n\n\tcookieNames.forEach((mappedCookieName, cookieName) => {\n\t\tconst cookieValue = win.Cookies.get(cookieName);\n\n\t\t// We inject the cookie if it exists\n\t\tif (cookieValue) {\n\t\t\tcreateOrUpdateHiddenField(\n\t\t\t\tform,\n\t\t\t\t`_custom=${mappedCookieName.toUpperCase()}=1=${mappedCookieName}`,\n\t\t\t\tcookieValue\n\t\t\t);\n\t\t}\n\t});\n\tparamNames.forEach((param) => {\n\t\tconst paramValue = win.sessionStorage.getItem(\n\t\t\t`extra-info-param-${param}`\n\t\t);\n\n\t\t// We inject the param if it exists\n\t\tif (paramValue) {\n\t\t\tcreateOrUpdateHiddenField(\n\t\t\t\tform,\n\t\t\t\t`_custom=${param.toUpperCase()}=1=${param}`,\n\t\t\t\tparamValue\n\t\t\t);\n\t\t}\n\t});\n};\nexport default injectExtraInfo;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\n\nconst formatMyCars = (vehicle) =>\n\t`${vehicle.stockNumber} - ${vehicle.vehicleTitle}`;\n\nconst injectMyCars = (form) => {\n\tconst myCarsKey = 'mycars-user';\n\tlet trackedCount = 0;\n\tlet savedCount = 0;\n\n\tif (!localStorage?.getItem(myCarsKey)) {\n\t\treturn;\n\t}\n\n\tconst data = localStorage?.getItem(myCarsKey);\n\tconst myCarsUserData = JSON.parse(data);\n\tif (myCarsUserData && myCarsUserData.vehicles) {\n\t\tmyCarsUserData.vehicles.forEach((vehicle) => {\n\t\t\tif (\n\t\t\t\t(vehicle.tracked || vehicle.newSave) &&\n\t\t\t\tvehicle.stockNumber &&\n\t\t\t\tvehicle.vehicleTitle\n\t\t\t) {\n\t\t\t\tlet customFieldKey;\n\t\t\t\tlet customFieldValue;\n\t\t\t\tif (vehicle.tracked && vehicle.newSave) {\n\t\t\t\t\ttrackedCount += 1;\n\t\t\t\t\tsavedCount += 1;\n\t\t\t\t\tcustomFieldKey = `_custom=Mycars Alert ${trackedCount}=1=${myCarsKey}`;\n\t\t\t\t\tcustomFieldValue = formatMyCars(vehicle);\n\t\t\t\t\tcreateOrUpdateHiddenField(\n\t\t\t\t\t\tform,\n\t\t\t\t\t\tcustomFieldKey,\n\t\t\t\t\t\tcustomFieldValue\n\t\t\t\t\t);\n\t\t\t\t\tcustomFieldKey = `_custom=Mycars Save ${savedCount}=1=${myCarsKey}`;\n\t\t\t\t\tcreateOrUpdateHiddenField(\n\t\t\t\t\t\tform,\n\t\t\t\t\t\tcustomFieldKey,\n\t\t\t\t\t\tcustomFieldValue\n\t\t\t\t\t);\n\t\t\t\t} else if (vehicle.tracked) {\n\t\t\t\t\ttrackedCount += 1;\n\t\t\t\t\tcustomFieldKey = `_custom=Mycars Alert ${trackedCount}=1=${myCarsKey}`;\n\t\t\t\t\tcustomFieldValue = formatMyCars(vehicle);\n\t\t\t\t\tcreateOrUpdateHiddenField(\n\t\t\t\t\t\tform,\n\t\t\t\t\t\tcustomFieldKey,\n\t\t\t\t\t\tcustomFieldValue\n\t\t\t\t\t);\n\t\t\t\t} else if (vehicle.newSave) {\n\t\t\t\t\tsavedCount += 1;\n\t\t\t\t\tcustomFieldKey = `_custom=Mycars Save ${savedCount}=1=${myCarsKey}`;\n\t\t\t\t\tcustomFieldValue = formatMyCars(vehicle);\n\t\t\t\t\tcreateOrUpdateHiddenField(\n\t\t\t\t\t\tform,\n\t\t\t\t\t\tcustomFieldKey,\n\t\t\t\t\t\tcustomFieldValue\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexport default injectMyCars;\n","import generateUuid from '../../utils/generateUuid';\nimport getFormEventData from '../../utils/getFormEventData';\nimport setFormSessionId from '../../utils/setFormSessionId';\nimport injectCAIWalletConfig from '../../utils/injectCAIWalletConfig';\nimport injectExtraInfo from '../../utils/injectExtraInfo';\nimport getSection from '../../utils/getSection';\nimport injectMyCars from '../../utils/injectMyCars';\n\nexport const DDC_FORM_ONPAGE = 'ddc.form.onPage';\n\nfunction onPage(win, element) {\n\tconst {\n\t\tDDC: {\n\t\t\tdataLayer = {},\n\t\t\tdataLayer: { vehicles },\n\t\t\tWidgetData: {\n\t\t\t\t'ws-tracking': { cookiesForExtraInfo, paramsForExtraInfo }\n\t\t\t}\n\t\t}\n\t} = win;\n\n\tlet eventObject;\n\tconst form = element.closest('form');\n\n\tsetFormSessionId(form);\n\n\tif (form?.offsetParent) {\n\t\tif (form.getAttribute(DDC_FORM_ONPAGE) !== 'true') {\n\t\t\tform.setAttribute(DDC_FORM_ONPAGE, 'true');\n\t\t\tconst formEventId = generateUuid(form);\n\n\t\t\tconst eventData = {\n\t\t\t\telement,\n\t\t\t\tformEventId,\n\t\t\t\ttrackingSection: getSection(element, win.DDC),\n\t\t\t\t...getFormEventData({\n\t\t\t\t\tform,\n\t\t\t\t\tvehicles,\n\t\t\t\t\tdataLayer\n\t\t\t\t})\n\t\t\t};\n\n\t\t\teventObject = {\n\t\t\t\teventType: DDC_FORM_ONPAGE,\n\t\t\t\teventData\n\t\t\t};\n\n\t\t\t// injectCAIWalletConfig & injectExtraInfo are in events/form/submission.js as well\n\t\t\t// just in case the ws-tracking selectors do not find the form for onPage\n\t\t\tif (Object.keys(eventData.vehicle)) {\n\t\t\t\tinjectCAIWalletConfig(win, form);\n\t\t\t}\n\t\t\tinjectMyCars(form);\n\t\t\tinjectExtraInfo(win, form, {\n\t\t\t\tcookiesForExtraInfo,\n\t\t\t\tparamsForExtraInfo\n\t\t\t});\n\t\t}\n\t}\n\n\treturn eventObject;\n}\n\nexport default onPage;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_FORM_PAYMENTCALC = 'ddc.form.paymentCalcInit';\n\nfunction paymentCalcInit({ currentTarget }) {\n\tlet eventObject;\n\tconst widgetId =\n\t\tcurrentTarget.closest?.('[data-widget-id]')?.dataset.widgetId;\n\n\tif (!eventHasRun(widgetId)) {\n\t\teventObject = {\n\t\t\teventType: DDC_FORM_PAYMENTCALC,\n\t\t\t// this event always pushed an empty eventData object, keeping in case something relies on this\n\t\t\teventData: {}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default paymentCalcInit;\n","import getSection from '../../utils/getSection';\n\nexport const DDC_FORM_SLIDECHANGE = 'ddc.form.slideChange';\n\nfunction slideChange({ target } = {}, { handle, values } = {}) {\n\tconst element = handle || target;\n\t// const {\n\t// \thandle: target = e.target,\n\t// \tvalues\n\t// } = ui;\n\tconst label = $(element)\n\t\t.closest('.ui-slider')\n\t\t.siblings('input')\n\t\t.attr('name');\n\tconst section = getSection(element);\n\tconst eventObject = {\n\t\teventType: DDC_FORM_SLIDECHANGE,\n\t\teventData: {\n\t\t\telement,\n\t\t\tlabel,\n\t\t\tvalues\n\t\t}\n\t};\n\n\tif (section) {\n\t\teventObject.eventData.trackingSection = section;\n\t}\n\n\treturn eventObject;\n}\n\nexport default slideChange;\n","/** Returns submission timestamp value of string\n *\n * @returns {string} submission timestamp as YYYY-MM-DDThh:mm:ss\n */\nconst getSubmissionTimestamp = () => {\n\treturn new Date().toISOString().replace(/.\\d+Z$/g, '');\n};\n\nexport default getSubmissionTimestamp;\n","/**\n * Takes a field label and converts it to lowercase, replaces spaces with underscores,\n * removes asterisks and colons, and trims whitespace.\n *\n * @param fieldLabel The field label to format.\n * @returns string The formatted field label.\n */\nconst cleanFieldLabel = (fieldLabel) => {\n\tif (!fieldLabel) {\n\t\treturn fieldLabel;\n\t}\n\n\treturn fieldLabel\n\t\t.trim()\n\t\t.replace(/ /g, '_')\n\t\t.replace(/\\*/, '')\n\t\t.replace(/:/, '')\n\t\t.toLowerCase();\n};\n\nexport default cleanFieldLabel;\n","/**\n * Returns a fields label.\n *\n * @param field The field to parse for a label.\n * @returns string The fields label.\n */\nconst getFieldLabel = (field) =>\n\t$(field).parents('.form-group').find('label').text() ||\n\t$(field).attr('name');\n\nexport default getFieldLabel;\n","import cleanFieldLabel from './cleanFieldLabel';\nimport getFieldLabel from './getFieldLabel';\n\n/**\n * Returns a map of form field text to it's related error.\n *\n * @param $elements array of failed validation elements. Element are those using jquery validation library.\n * @returns map of form field text and related errors.\n */\nconst getInvalidFields = ($elements) => {\n\tconst invalidFields = {};\n\n\t$elements.each((_index, element) => {\n\t\tconst $element = $(element);\n\t\tconst $errors = $element.next('.errors');\n\t\tconst text = cleanFieldLabel(getFieldLabel(element));\n\t\tconst isInvalid = $element.hasClass('invalid');\n\n\t\tif (isInvalid) {\n\t\t\tif ($errors.length > 0) {\n\t\t\t\tinvalidFields[text] = $errors.text();\n\t\t\t} else if (element.validationMessage) {\n\t\t\t\tinvalidFields[text] = element.validationMessage;\n\t\t\t}\n\t\t}\n\t});\n\n\treturn invalidFields;\n};\n\nexport default getInvalidFields;\n","import cleanFieldLabel from './cleanFieldLabel';\nimport getFieldLabel from './getFieldLabel';\n\n/**\n * Returns a map of form field text to it's related error.\n *\n * @param $elements array of failed validation elements. Element are those that fail HTML5 validation.\n * @returns map of form field text and related errors.\n */\nconst getInvalidFieldsHTML5 = ($elements) => {\n\tconst invalidFields = {};\n\n\t$elements.each((_index, element) => {\n\t\tconst text = cleanFieldLabel(getFieldLabel(element));\n\n\t\tif (element.validationMessage) {\n\t\t\tinvalidFields[text] = element.validationMessage;\n\t\t}\n\t});\n\n\treturn invalidFields;\n};\n\nexport default getInvalidFieldsHTML5;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\n\n/**\n *\n * @param {jQuery Object} $form The form to modify with updated or new fields\n * @param {Object} data object where the keys represent the value of the name attribute\n * on a form field and the values represent the value to update the field with\n * @example\n * // // field will be created or updated\n * data: {\n * \t'example': 'exampleval'\n * }\n * // // created or updated field\n */\nconst createOrUpdateHiddenFields = (form, data) => {\n\tObject.entries(data).forEach(([attrVal, fieldVal]) => {\n\t\tcreateOrUpdateHiddenField(form, attrVal, fieldVal);\n\t});\n};\n\nexport default createOrUpdateHiddenFields;\n","const piiFields = [\n\t'applicant.contact.email',\n\t'applicant.contact.firstName',\n\t'applicant.contact.lastName',\n\t'applicant.contact.phone',\n\t'applicant.contact.address.street',\n\t'coApplicant.contact.email',\n\t'coApplicant.contact.firstName',\n\t'coApplicant.contact.lastName',\n\t'coApplicant.contact.phone',\n\t'coApplicant.contact.address.street',\n\t'contact.firstName',\n\t'contact.lastName',\n\t'contact.phone',\n\t'phoneNumber',\n\t'contact.email',\n\t'contact.address.street'\n];\nconst standardize = (field) =>\n\tfield\n\t\t.replace('applicant.', '')\n\t\t.replace('contact.', '')\n\t\t.replace('address.', '')\n\t\t.replace('Number', '')\n\t\t.replace('.sep', '');\n\n// SHA256 hashes a string\nconst shaHash = async (message, crypto) => {\n\tconst msgUint8 = new TextEncoder().encode(message);\n\tconst hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n\tconst hashArray = Array.from(new Uint8Array(hashBuffer));\n\treturn hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\n// goes through an object of key/value pairs and for each key that includes a string in the piiFields\n// list it hashes the value\n// all other keys are discarded so only the pii is returned in an object of {fields,vals}\nconst getHashedPii = (parameterMap, crypto) => {\n\tconst fields = [];\n\tconst vals = [];\n\tconst valsTrimmedLowerCase = [];\n\tObject.entries(parameterMap).forEach(([field, fieldValue]) => {\n\t\tif (piiFields.find((piiField) => field.startsWith(piiField))) {\n\t\t\tfields.push(field);\n\t\t\tvals.push(shaHash(fieldValue, crypto));\n\t\t\tvalsTrimmedLowerCase.push(\n\t\t\t\tshaHash(fieldValue.replace(/\\s/g, '').toLowerCase(), crypto)\n\t\t\t);\n\t\t}\n\t});\n\treturn {\n\t\tfields,\n\t\tvals,\n\t\tvalsTrimmedLowerCase\n\t};\n};\n\n// the reason you have to pass crypto is because node needs crypto library\n// and browsers needs to use window.crypto\nconst hashPii = async (parameterMap, crypto) => {\n\tconst pii = {};\n\tconst piiTrimmedLowerCase = {};\n\tconst { fields, vals, valsTrimmedLowerCase } = getHashedPii(\n\t\tparameterMap,\n\t\tcrypto\n\t);\n\tawait Promise.all([\n\t\tPromise.all(vals).then((resolvedVals) => {\n\t\t\tfields.forEach((field, index) => {\n\t\t\t\tpii[standardize(field)] = resolvedVals[index];\n\t\t\t});\n\t\t}),\n\t\tPromise.all(valsTrimmedLowerCase).then((resolvedVals) => {\n\t\t\tfields.forEach((field, index) => {\n\t\t\t\tpiiTrimmedLowerCase[standardize(field)] = resolvedVals[index];\n\t\t\t});\n\t\t})\n\t]);\n\treturn { fields: pii, fieldsTrimmedLowerCase: piiTrimmedLowerCase };\n};\n\nexport default hashPii;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\nimport { getTrackedAttributesString } from './trackingAttributesGenerator';\n\nconst injectFormTrackingAttributes = (form) => {\n\tif (form) {\n\t\tconst trackedData = getTrackedAttributesString(new FormData(form));\n\t\tcreateOrUpdateHiddenField(form, 'userSessionData', trackedData);\n\t}\n};\n\nexport default injectFormTrackingAttributes;\n","const setFinanceFormSsnFieldLogging = (form) => {\n\t// This will automatically set a custom attribute when a finance form is submitted\n\tconst ssnField = form?.querySelector('[name=\"applicant.ssn\"]');\n\n\tconst hasShortSsnField = ssnField?.pattern === '(^$)|(^\\\\d{4}$)';\n\n\tif (hasShortSsnField) {\n\t\twindow?.newrelic?.setCustomAttribute(\n\t\t\t'hasShortSsnField',\n\t\t\thasShortSsnField\n\t\t);\n\t}\n};\n\nexport default setFinanceFormSsnFieldLogging;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\n\nconst injectShiftSessionId = (form) => {\n\tconst shiftSessionId = sessionStorage.getItem('SaveShiftSession');\n\n\tif (shiftSessionId) {\n\t\tcreateOrUpdateHiddenField(\n\t\t\tform,\n\t\t\t'_custom=SHIFT_SESSION_ID=-1=shiftSessionId',\n\t\t\tshiftSessionId\n\t\t);\n\t}\n};\n\nexport default injectShiftSessionId;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\n\nconst injectUniteCorrelationId = (form) => {\n\tconst correlationId = sessionStorage.getItem('SaveUniteCorrelationId');\n\n\tif (correlationId) {\n\t\tcreateOrUpdateHiddenField(\n\t\t\tform,\n\t\t\t'_custom=UD_CORRELATION_ID=-1=udCorrelationId',\n\t\t\tcorrelationId\n\t\t);\n\t}\n};\n\nexport default injectUniteCorrelationId;\n","import { eventHasRun, getEventHasRunValue } from '../../utils/eventTracker';\nimport getSubmissionTimestamp from '../../utils/getSubmissionTimestamp';\nimport getInvalidFields from '../../utils/getInvalidFields';\nimport getInvalidFieldsHTML5 from '../../utils/getInvalidFieldsHTML5';\nimport getPIIExistence from '../../utils/getPIIExistence';\nimport createOrUpdateHiddenFields from '../../utils/createOrUpdateHiddenFields';\nimport injectCAIWalletConfig from '../../utils/injectCAIWalletConfig';\nimport injectExtraInfo from '../../utils/injectExtraInfo';\nimport hasMyWalletInteraction from '../../utils/hasMyWalletInteraction';\nimport confirmationEvent from './confirmation';\nimport getFormEventData from '../../utils/getFormEventData';\nimport hashPii from '../../utils/hashPii';\nimport getSection from '../../utils/getSection';\nimport injectFormTrackingAttributes from '../../utils/injectFormTrackingAttributes';\nimport injectClickPath from '../../utils/injectClickPath';\nimport setFinanceFormSsnFieldLogging from '../../utils/setFinanceFormSsnFieldLogging';\nimport injectMyCars from '../../utils/injectMyCars';\nimport injectShiftSessionId from '../../utils/injectShiftSessionId';\nimport injectUniteCorrelationId from '../../utils/injectUniteCorrelationId';\n\nexport const DDC_FORM_TYPEDSEARCH = 'ddc.form.typedSearch';\nexport const DDC_FORM_SUBMISSION = 'ddc.form.submission';\n\nasync function submission(win, event = {}) {\n\tconst {\n\t\ttarget: element,\n\t\ttarget: { tagName = '', textContent = '' } = {},\n\t\ttimeStamp = 0\n\t} = event;\n\n\tconst {\n\t\tDDC,\n\t\tDDC: {\n\t\t\tdataLayer,\n\t\t\tdataLayer: {\n\t\t\t\tpage: {\n\t\t\t\t\tpageInfo: { isVdp, isVlp, pageName }\n\t\t\t\t},\n\t\t\t\tvehicles\n\t\t\t},\n\t\t\tWidgetData: {\n\t\t\t\t'ws-tracking': { cookiesForExtraInfo, paramsForExtraInfo }\n\t\t\t}\n\t\t}\n\t} = win;\n\n\tconst eventObjects = [];\n\tconst form = element?.closest('form');\n\tconst $form = $(form);\n\tconst fromTrackingType = form?.dataset?.formTrackingType;\n\tconst eventType =\n\t\tfromTrackingType === 'typedSearch'\n\t\t\t? DDC_FORM_TYPEDSEARCH\n\t\t\t: DDC_FORM_SUBMISSION;\n\n\tif (\n\t\tform &&\n\t\twindow.DDC?.dataLayer.site.siteInfo.dealerId === 'hertzcarsales'\n\t) {\n\t\t(async () => {\n\t\t\tconst { default: hertzDefault } = await import(\n\t\t\t\t'../../utils/injectHertzLink'\n\t\t\t);\n\n\t\t\tif (hertzDefault) {\n\t\t\t\thertzDefault(form);\n\t\t\t}\n\t\t})();\n\t}\n\n\tinjectClickPath({\n\t\tform,\n\t\tmaxClickPathCount: parseInt(\n\t\t\twindow?.DDC?.WidgetData?.['ws-tracking']?.maxClickpathCount || 100,\n\t\t\t10\n\t\t)\n\t});\n\tinjectFormTrackingAttributes(form);\n\tsetFinanceFormSsnFieldLogging(form);\n\n\tif (\n\t\t!eventHasRun(eventType, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\tconst { confirmation } = dataLayer;\n\t\tconst eventData = {\n\t\t\tformEventId:\n\t\t\t\tform?.querySelector('input[name=\"formEventId\"]')?.value || '',\n\t\t\tuserSessionId:\n\t\t\t\tform?.querySelector('input[name=\"userSessionId\"]')?.value || '',\n\t\t\t// we pass submissionTimestamp if it exists in local storage\n\t\t\t// allows for a submission timestamp to come from another place\n\t\t\t// such as: /cms-sites/htdocs/sites/a/autonation/js/price.js\n\t\t\tsubmissionTimestamp:\n\t\t\t\tlocalStorage?.getItem('submissionTimestamp') ||\n\t\t\t\tgetSubmissionTimestamp(),\n\t\t\telement,\n\t\t\tctaText: form?.querySelector('[type=\"submit\"]')?.textContent || '',\n\t\t\t...getPIIExistence(form, confirmation),\n\t\t\t...getFormEventData({\n\t\t\t\tform,\n\t\t\t\tvehicles,\n\t\t\t\tdataLayer\n\t\t\t})\n\t\t};\n\n\t\tconst section = getSection(element, win.DDC) || '';\n\t\tconst validator = $form.data('validator');\n\t\tconst eventMapId = eventData.formEventId || eventData.trackingId;\n\t\tconst formInitiationTime =\n\t\t\tgetEventHasRunValue(eventMapId)?.formInitiationTime;\n\t\teventData.elapsedTime = formInitiationTime\n\t\t\t? eventData.currentTime - formInitiationTime\n\t\t\t: 0;\n\n\t\tconfirmation.element = element;\n\n\t\t// data passed to the confirmation page for the form confirmation event\n\t\tconst fieldsToUpdateOrCreate = {\n\t\t\t'dl.custom.form.id': eventData.customFormId,\n\t\t\t'dl.element': `${tagName} ${textContent}`\n\t\t\t\t?.replace?.(/[\\r\\n ]+/gm, ' ')\n\t\t\t\t?.trim?.(),\n\t\t\t'dl.formElapsedTime': eventData.elapsedTime,\n\t\t\t'dl.formTrackingId': eventData.trackingId,\n\t\t\t'dl.fromVdp': isVdp,\n\t\t\t'dl.fromVlp': isVlp,\n\t\t\t'dl.isModal': eventData.isModal,\n\t\t\t'dl.params': $form.attr('action')?.split('?')[1] || '',\n\t\t\t'dl.widgetName': eventData.formTitle,\n\t\t\t'dl.pageName': pageName\n\t\t};\n\n\t\teventData.formVehicleModel =\n\t\t\tform?.querySelector('[name=\"model\"]')?.value || '';\n\n\t\tconst uuid = isVdp && vehicles?.length > 0 && vehicles[0]?.uuid;\n\t\tif (uuid) {\n\t\t\tfieldsToUpdateOrCreate['dl.uuid'] = uuid;\n\t\t}\n\n\t\t// If form is typed search push a typedSearch event. If not, check that validation is enabled.\n\t\t// If enabled eventData.validate will be true when validation passes and false when validation fails.\n\t\t// If validation passes, push a form submission event including location and contact info.\n\t\t// If validation is not enabled, push a form submission event anyway showing validation is not enabled.\n\n\t\tif (fromTrackingType === 'typedSearch') {\n\t\t\teventData.typedSearchContent = form?.querySelector(\n\t\t\t\t\"input[name='search']\"\n\t\t\t)?.value;\n\t\t} else if (validator) {\n\t\t\teventData.zip =\n\t\t\t\tform?.querySelector(\n\t\t\t\t\t\"input[data-id='contact.address.postalCode']\"\n\t\t\t\t)?.value || '';\n\t\t\teventData.preferredContact =\n\t\t\t\tform?.querySelector(\n\t\t\t\t\t\"select[data-id='contact.preferredContact']\"\n\t\t\t\t)?.value || '';\n\n\t\t\t// on the mobile send to phone form there is a jquery innerText error\n\t\t\t// that we catch here\n\t\t\t// it only happens when the form does not validate\n\t\t\t// TODO: Look into why that error happens\n\t\t\ttry {\n\t\t\t\teventData.validate = validator.checkValidity();\n\t\t\t} catch (e) {\n\t\t\t\teventData.validate = false;\n\t\t\t}\n\n\t\t\tfieldsToUpdateOrCreate['dl.contact.address.postalCode'] =\n\t\t\t\teventData.zip;\n\t\t\tfieldsToUpdateOrCreate['dl.contact.preferredContact'] =\n\t\t\t\teventData.preferredContact;\n\t\t\teventData.invalidFields = getInvalidFields(validator.getInputs());\n\t\t} else if (typeof validator === 'undefined') {\n\t\t\teventData.validate = form?.checkValidity();\n\t\t\teventData.invalidFields = getInvalidFieldsHTML5(\n\t\t\t\t$(form?.querySelectorAll(':invalid'))\n\t\t\t);\n\t\t}\n\n\t\tif (typeof eventData.validate !== 'undefined') {\n\t\t\tfieldsToUpdateOrCreate['dl.validate'] = eventData.validate;\n\t\t}\n\n\t\tif (validator || typeof validator === 'undefined') {\n\t\t\tfieldsToUpdateOrCreate[\n\t\t\t\t'_custom=SUBMISSION_TIMESTAMP=-1=submissionTimestamp'\n\t\t\t] = eventData.submissionTimestamp;\n\t\t}\n\n\t\tfieldsToUpdateOrCreate['dl.formLocation'] = form?.closest?.(\n\t\t\t'.nav-fragment'\n\t\t)\n\t\t\t? 'navigation'\n\t\t\t: 'inpage';\n\n\t\t// injectCAIWalletConfig & injectExtraInfo are in events/form/submission.js as well\n\t\t// just in case the ws-tracking selectors do not find the form for onPage\n\t\tif (form?.querySelector('input[name=\"dl.uuid\"]')?.value) {\n\t\t\tinjectCAIWalletConfig(win, form);\n\t\t}\n\n\t\tinjectMyCars(form);\n\t\tinjectExtraInfo(win, form, {\n\t\t\tcookiesForExtraInfo,\n\t\t\tparamsForExtraInfo\n\t\t});\n\t\tinjectShiftSessionId(form);\n\t\tinjectUniteCorrelationId(form);\n\n\t\tcreateOrUpdateHiddenFields(form, fieldsToUpdateOrCreate);\n\n\t\t// Handle PII\n\n\t\t// wipe out existing data\n\t\t// then in form confirmation on ajax pages we can tell if this has been written out yet\n\t\t// That also indicates that the hashPii function has run\n\t\tDDC.dataLayer.confirmation = DDC.dataLayer.confirmation || {};\n\n\t\tconst formData = new FormData(form);\n\t\tconst parameterMap = {};\n\n\t\tformData.forEach((value, key) => {\n\t\t\tparameterMap[key] = value;\n\t\t});\n\n\t\thashPii(parameterMap, win.crypto).then((hashedPii) => {\n\t\t\tconst formConfirmation = DDC.dataLayer.confirmation;\n\n\t\t\t// This is for the EPrice form for same-page submissions\n\t\t\t// Most of the forms lead to a confirmation page otherwise\n\t\t\t({\n\t\t\t\tfields: {\n\t\t\t\t\tfirstName: formConfirmation.firstName,\n\t\t\t\t\tlastName: formConfirmation.lastName,\n\t\t\t\t\temail: formConfirmation.email,\n\t\t\t\t\tstreet: formConfirmation.street\n\t\t\t\t},\n\t\t\t\tfieldsTrimmedLowerCase: {\n\t\t\t\t\tfirstName: formConfirmation.firstNameLowerCase,\n\t\t\t\t\tlastName: formConfirmation.lastNameLowerCase,\n\t\t\t\t\temail: formConfirmation.emailLowerCase,\n\t\t\t\t\tstreet: formConfirmation.streetLowerCase\n\t\t\t\t}\n\t\t\t} = hashedPii);\n\n\t\t\tformConfirmation.userSessionId =\n\t\t\t\tsessionStorage.getItem('userSessionId');\n\t\t});\n\n\t\teventObjects.push({\n\t\t\teventType,\n\t\t\teventData\n\t\t});\n\n\t\t// US897430: temporary fix, require permanent solution.\n\t\tif (eventData.trackingId === 'PROMO-CTA-LEAD') {\n\t\t\teventObjects.push(await confirmationEvent(win, event));\n\t\t}\n\n\t\teventData.trackingSection = section;\n\t\teventData.mywallet = !!hasMyWalletInteraction(win);\n\t}\n\n\treturn eventObjects;\n}\n\nexport default submission;\n","import createOrUpdateHiddenField from './createOrUpdateHiddenField';\n\nexport default ({ form, maxClickpathCount = 100 }) => {\n\tlet clickPath = JSON.parse(\n\t\tsessionStorage.getItem('ws-tracking-clickpath') || '[]'\n\t);\n\tif (clickPath.length > maxClickpathCount) {\n\t\tclickPath = clickPath.slice(\n\t\t\tclickPath.length - maxClickpathCount,\n\t\t\tclickPath.length\n\t\t);\n\t}\n\n\tconst clickPathValue = clickPath\n\t\t.map((click) => {\n\t\t\tconst { viewType, timestamp, path } = click;\n\t\t\treturn `${timestamp}|${viewType}|${path}`;\n\t\t})\n\t\t.join('^');\n\n\tcreateOrUpdateHiddenField(form, 'clickpath', clickPathValue);\n};\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_LINK_CLICKTOCALL = 'ddc.link.clickToCall';\n\nfunction clickToCall({ currentTarget: element, timeStamp }) {\n\tlet eventObject;\n\tconst $element = $(element);\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_CLICKTOCALL, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_CLICKTOCALL,\n\t\t\teventData: {\n\t\t\t\tclickToCallDepartment: $element\n\t\t\t\t\t.closest('[data-click-to-call]')\n\t\t\t\t\t.data('click-to-call'),\n\t\t\t\tphoneNumber: $element\n\t\t\t\t\t.closest('[data-click-to-call]')\n\t\t\t\t\t.data('click-to-call-phone'),\n\t\t\t\telement\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default clickToCall;\n","const getHexFromRgb = (rgba) =>\n\trgba\n\t\t.match(/^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*(\\d+\\.{0,1}\\d*))?\\)$/)\n\t\t?.slice(1)\n\t\t.map((n, i) =>\n\t\t\t(i === 3 ? Math.round(parseFloat(n) * 255) : parseFloat(n))\n\t\t\t\t.toString(16)\n\t\t\t\t.padStart(2, '0')\n\t\t\t\t.replace('NaN', '')\n\t\t)\n\t\t.join('');\n\nexport const getHexBackgroundColor = (element) => {\n\t// This will always adhere to rgb/rgba format\n\t// We need the above function to parse it to hex\n\tconst { backgroundColor = '' } =\n\t\telement instanceof Element ? window.getComputedStyle(element) : {};\n\n\tconst hexValue =\n\t\ttypeof backgroundColor === 'string'\n\t\t\t? getHexFromRgb(backgroundColor)\n\t\t\t: '';\n\n\treturn typeof hexValue !== 'undefined' ? `#${hexValue.slice(0, 6)}` : '';\n};\n","export const getCtaIndex = (element) => {\n\tconst ctaElement =\n\t\telement instanceof Element\n\t\t\t? element.closest('[class*=\"cst-btn\"]') ||\n\t\t\t element.closest('[data-name*=\"content-cta-col\"]')\n\t\t\t: null;\n\n\tlet ctaClass = null;\n\n\tif (ctaElement) {\n\t\tctaClass =\n\t\t\t[...(ctaElement?.classList || [])]?.find((item) =>\n\t\t\t\titem.includes('cst-btn')\n\t\t\t) || ctaElement.getAttribute('data-name');\n\t}\n\n\treturn !ctaClass ? null : Number(ctaClass.split('-').pop());\n};\n","/**\n * Takes a DOM element and recursively traverses it to build up a string containing the text value from\n * each text node, separated by a delimiter.\n *\n * @param element Link element to traverse.\n * @param delimiterString String used to separate each text node\n * @returns string The text value of each text node, separated by a delimiter.\n */\nconst getAllDescendantTextNodeValues = (\n\telement,\n\tdelimiterString = ' | ',\n\twin\n) => {\n\tlet result = '';\n\n\t(function findTextNodes(current) {\n\t\tfor (let i = 0; i < current.childNodes.length; i++) {\n\t\t\tconst child = current.childNodes[i];\n\t\t\tconst isTextNode = child.nodeType === 3;\n\t\t\tconst isString = typeof child.nodeValue === 'string';\n\t\t\tconst isEmptyString = isString && child.nodeValue.trim() === '';\n\t\t\tconst isNewLineCharacter =\n\t\t\t\tisString &&\n\t\t\t\tchild.nodeValue.length === 1 &&\n\t\t\t\tchild.nodeValue.indexOf('\\n') !== -1;\n\t\t\t/**\n\t\t\t * Retrieve text of base element regardless of visibility.\n\t\t\t * Handles scenario where clicked button is then hidden.\n\t\t\t */\n\t\t\tconst isHiddenText =\n\t\t\t\tchild.parentNode !== element &&\n\t\t\t\t((typeof child.parentNode.className === 'string' &&\n\t\t\t\t\tchild.parentNode.className.indexOf('hide') > -1) ||\n\t\t\t\t\twin\n\t\t\t\t\t\t.getComputedStyle(child.parentNode)\n\t\t\t\t\t\t.getPropertyValue('visibility') === 'hidden' ||\n\t\t\t\t\twin\n\t\t\t\t\t\t.getComputedStyle(child.parentNode)\n\t\t\t\t\t\t.getPropertyValue('display') === 'none');\n\n\t\t\tif (\n\t\t\t\tisTextNode &&\n\t\t\t\t!isEmptyString &&\n\t\t\t\t!isNewLineCharacter &&\n\t\t\t\t!isHiddenText\n\t\t\t) {\n\t\t\t\tresult += child.nodeValue.trim() + delimiterString;\n\t\t\t} else {\n\t\t\t\tfindTextNodes(child);\n\t\t\t}\n\t\t}\n\t})(element);\n\n\treturn result.slice(0, -delimiterString.length);\n};\n\nexport default getAllDescendantTextNodeValues;\n","import getAllDescendantTextNodeValues from './getAllDescendantTextNodeValues';\n\n/**\n * Resolves link text on a variety of different links (e.g. image links).\n *\n * @param element Link element containing the text.\n * @returns string Link text.\n */\nconst getLinkText = (element, win) => {\n\t// if there is at least one text node, return the value\n\t// if there is no text node but there is an image, return image alt, title, or src value\n\t// otherwise if the element has an href attribute, return href value\n\n\tlet linkText = getAllDescendantTextNodeValues(element, undefined, win);\n\n\tif (linkText === '') {\n\t\tconst $element = $(element);\n\t\tconst $img = $element.find('img');\n\t\tconst hasImageSrcText = $img.attr('src')?.startsWith('data:image/');\n\n\t\tlinkText =\n\t\t\t$img.attr('alt') ||\n\t\t\t$img.attr('title') ||\n\t\t\t(!hasImageSrcText && $img.attr('src')) ||\n\t\t\t$element.attr('href') ||\n\t\t\t'';\n\t}\n\n\treturn linkText.trim();\n};\n\nexport default getLinkText;\n","import { eventHasRun } from '../../utils/eventTracker';\nimport { getHexBackgroundColor } from '../../utils/getBackgroundColor';\nimport { getCtaIndex } from '../../utils/getCtaIndex';\nimport widgetIsPresent from '../../utils/widgetIsPresent';\nimport getLinkText from '../../utils/getLinkText';\nimport findVehicleByProperty from '../../utils/findVehicleByProperty';\n\nexport const DDC_LINK_GENERIC = 'ddc.link.generic';\n\nfunction clicked(win, { currentTarget: element, timeStamp, originalEvent }) {\n\tconst {\n\t\tDDC: {\n\t\t\tdataLayer: {\n\t\t\t\tpage: {\n\t\t\t\t\tpageInfo: { isVlp, pageWidgets }\n\t\t\t\t},\n\t\t\t\tvehicles\n\t\t\t}\n\t\t}\n\t} = win;\n\tlet eventObject;\n\tif (\n\t\t!eventHasRun(DDC_LINK_GENERIC, {\n\t\t\ttimeStamp\n\t\t}) &&\n\t\telement instanceof Element &&\n\t\telement?.getAttribute?.('ui-tabs-initial-load') !== 'true' &&\n\t\t// US784493 - Next line added so we do not track internal event viewer\n\t\t!originalEvent?.path?.some?.((el) =>\n\t\t\tel?.classList?.contains?.('hide-from-ws-tracking')\n\t\t) &&\n\t\t[undefined, null].includes(\n\t\t\toriginalEvent?.target?.closest?.('.hide-from-ws-tracking')\n\t\t)\n\t) {\n\t\tif (\n\t\t\telement?.classList?.contains?.('dialog') &&\n\t\t\t!$(element).parents('.ui-dialog').length\n\t\t) {\n\t\t\tlocalStorage?.setItem(\n\t\t\t\t'ddc_data_layer-initiatingClickText',\n\t\t\t\t$(element).text().trim()\n\t\t\t);\n\t\t}\n\n\t\tlet department;\n\t\tlet departmentId;\n\t\tlet containsImage = false;\n\n\t\tif (element.href?.startsWith('tel:')) {\n\t\t\tconst dataClickToCall = element?.closest('[data-click-to-call]')\n\t\t\t\t?.dataset?.clickToCall;\n\t\t\tconst dataClickToCallId = element?.closest(\n\t\t\t\t'[data-click-to-call-id]'\n\t\t\t)?.dataset?.clickToCallId;\n\t\t\tconst dataTrackingDept = element?.closest(\n\t\t\t\t'[data-ws-tracking-department]'\n\t\t\t)?.dataset?.wsTrackingDepartment;\n\t\t\tconst dataPhoneRef =\n\t\t\t\telement?.closest('[data-phone-ref]')?.dataset?.phoneRef;\n\t\t\tdepartment =\n\t\t\t\tdataClickToCall ||\n\t\t\t\tdataClickToCallId ||\n\t\t\t\tdataTrackingDept ||\n\t\t\t\t(dataPhoneRef !== 'null' && dataPhoneRef);\n\t\t\tdepartmentId = dataClickToCallId || null;\n\t\t}\n\n\t\tif (element.querySelector('img')) {\n\t\t\tcontainsImage = true;\n\t\t}\n\n\t\tconst eventData = {\n\t\t\ttext: getLinkText(element, win),\n\t\t\turl: element?.getAttribute?.('href') || '',\n\t\t\tpageName: win.DDC.dataLayer.page.pageInfo.pageName,\n\t\t\telement,\n\t\t\tcontainsImage,\n\t\t\tbackgroundColor: getHexBackgroundColor(element),\n\t\t\tctaIndex: getCtaIndex(element),\n\t\t\tisSRP: widgetIsPresent(/ws-inv-listing/, pageWidgets),\n\t\t\tisIncentivePanel:\n\t\t\t\t($(element).closest('.multi-incentive-modal').length > 0 ||\n\t\t\t\t\t$(element).closest('.single-incentive-modal').length > 0) &&\n\t\t\t\t$(element).closest('.panel-title').length > 0,\n\t\t\t...(department && { department, departmentId })\n\t\t};\n\n\t\tif ($(element).closest('.ddc-footer').length > 0) {\n\t\t\teventData.location = 'footer';\n\t\t} else if (\n\t\t\t$(element).closest('.navbar-nav').length > 0 ||\n\t\t\t$(element).closest('.navbar-default').length > 0 ||\n\t\t\t$(element).closest('.ddc-mobile-fragment-nav').length > 0\n\t\t) {\n\t\t\teventData.location = 'mainNav';\n\t\t} else if ($(element).closest('.page-header').length > 0) {\n\t\t\teventData.location = 'header';\n\t\t} else {\n\t\t\teventData.location = 'content';\n\t\t}\n\t\tif ($(element).closest('.vehicle-ctas').length && isVlp) {\n\t\t\teventData.isSrpVehicleCta = true;\n\t\t}\n\t\tif (eventData.isSRP) {\n\t\t\tconst uuid =\n\t\t\t\t$(element).closest('[data-uuid]').attr('data-uuid') || '';\n\t\t\tconst vehicle = uuid\n\t\t\t\t? findVehicleByProperty('uuid', uuid, vehicles)\n\t\t\t\t: {};\n\t\t\teventData.vehicle = vehicle;\n\t\t} else if (win.DDC.dataLayer.page.pageInfo.isVdp) {\n\t\t\t[eventData.vehicle] = vehicles;\n\t\t}\n\n\t\tif (eventData.isIncentivePanel) {\n\t\t\teventData.dataIncentiveId = $(element)\n\t\t\t\t.closest('.panel')\n\t\t\t\t.find('[data-incentive-id]')\n\t\t\t\t.attr('data-incentive-id');\n\t\t\teventData.dataIncentiveName = $(element)\n\t\t\t\t.closest('.panel')\n\t\t\t\t.find('[data-incentive-id]')\n\t\t\t\t.attr('data-incentive-name');\n\t\t}\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_GENERIC,\n\t\t\teventData\n\t\t};\n\t}\n\n\tif (element instanceof Element) {\n\t\telement?.setAttribute?.('ui-tabs-initial-load', false);\n\n\t\tif (\n\t\t\telement.querySelector('i') !== null &&\n\t\t\telement.querySelector('i').className.includes('menu')\n\t\t) {\n\t\t\teventObject.eventData.isHamburgerMenu = true;\n\t\t}\n\t}\n\n\treturn eventObject;\n}\n\nexport default clicked;\n","import clicked from './clicked';\n\nexport default (win, event) => {\n\tlet eventObject;\n\t/* Check for center click */\n\tif (event.button === 1) {\n\t\teventObject = clicked(win, event);\n\t\teventObject.eventData.clickType = 'center';\n\t}\n\treturn eventObject;\n};\n","import { eventHasRun } from '../../utils/eventTracker';\nimport findVehicleByProperty from '../../utils/findVehicleByProperty';\n\nexport const DDC_LINK_COMPAREPAGECLICK = 'ddc.link.comparePageClick';\n\nfunction compare(\n\t{\n\t\tDDC: {\n\t\t\tdataLayer: { vehicles }\n\t\t}\n\t},\n\t{ currentTarget: element, timeStamp }\n) {\n\tlet eventObject;\n\tconst $element = $(element);\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_COMPAREPAGECLICK, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\tconst vin = $element.data('compareId');\n\t\tconst { bodyStyle, exteriorColor, make, model, trim, modelYear } =\n\t\t\tfindVehicleByProperty('vin', vin, vehicles);\n\t\tconst position = $element.data('index-position');\n\t\tconst type = $element.data('type');\n\n\t\tconst containedImg = element.querySelector('.photo') || false;\n\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_COMPAREPAGECLICK,\n\t\t\teventData: {\n\t\t\t\tbodyStyle,\n\t\t\t\telement,\n\t\t\t\texteriorColor,\n\t\t\t\tmake,\n\t\t\t\tmodel,\n\t\t\t\tposition,\n\t\t\t\ttrim,\n\t\t\t\ttype,\n\t\t\t\tvin,\n\t\t\t\tyear: modelYear,\n\t\t\t\tcontainedImg,\n\t\t\t\taltText: containedImg\n\t\t\t\t\t? containedImg.getAttribute('alt') || `Image ${vin}`\n\t\t\t\t\t: '',\n\t\t\t\tlinkText: $element.text()\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default compare;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_LINK_GETDIRECTIONS = 'ddc.link.getDirections';\n\nfunction getDirections({ currentTarget: element, timeStamp }) {\n\tlet eventObject;\n\tconst $element = $(element);\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_GETDIRECTIONS, {\n\t\t\ttimeStamp\n\t\t}) &&\n\t\t// Only track the event when the form has passed validation\n\t\t(!$element.data('validator') ||\n\t\t\t$element.data('validator').checkValidity())\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_GETDIRECTIONS,\n\t\t\teventData: {\n\t\t\t\tlinkText: $element.find('button[type=\"submit\"]').text().trim(),\n\t\t\t\telement\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default getDirections;\n","import { eventHasRun } from '../../utils/eventTracker';\nimport findWidgetName from '../../utils/findWidgetName';\nimport findVehicleByProperty from '../../utils/findVehicleByProperty';\n\nexport const DDC_LINK_HPRODUCTCLICK = 'ddc.link.hproductClick';\n\nfunction hproduct(\n\t{\n\t\tDDC: {\n\t\t\tdataLayer: { vehicles }\n\t\t}\n\t},\n\tdoc,\n\t{ currentTarget: element, timeStamp },\n\toriginalEvent\n) {\n\tlet eventObject;\n\tif (\n\t\t!eventHasRun(DDC_LINK_HPRODUCTCLICK, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\tlet $element;\n\t\tconst eventData = {};\n\n\t\t// if element is document then click originates from a $document.trigger('hproductClick')\n\t\tif (element === doc) {\n\t\t\t$element = $(originalEvent.target);\n\t\t} else {\n\t\t\t// element is DOM object of the clicked element\n\t\t\t$element = $(element);\n\t\t}\n\n\t\teventData.text = $element.text().trim();\n\t\teventData.element = $element.get(0);\n\n\t\tconst isSRP = findWidgetName($element[0]) === 'ws-inv-listing';\n\n\t\tif (isSRP) {\n\t\t\tconst vehicle = findVehicleByProperty(\n\t\t\t\t'uuid',\n\t\t\t\t$element.parents('.vehicle-card-detailed').data('uuid'),\n\t\t\t\tvehicles\n\t\t\t);\n\n\t\t\teventData.vin = vehicle.vin;\n\t\t\teventData.stockNumber = vehicle.stockNumber;\n\t\t\teventData.make = vehicle.make;\n\t\t\teventData.model = vehicle.model;\n\t\t\teventData.year = vehicle.modelYear;\n\t\t\teventData.bodyStyle = vehicle.bodyStyle;\n\t\t\teventData.trim = vehicle.trim;\n\t\t\teventData.exteriorColor = vehicle.exteriorColor;\n\t\t\teventData.position = vehicle.indexPosition;\n\t\t\teventData.type = vehicle.inventoryType;\n\t\t\teventData.internetPrice = vehicle.internetPrice;\n\t\t\teventData.msrp = vehicle.msrp;\n\t\t\teventData.url = vehicle.link;\n\t\t} else {\n\t\t\tlet hproductInternetPrice;\n\t\t\tlet hproductMsrpValue;\n\n\t\t\tif (!$element.hasClass('hproduct')) {\n\t\t\t\tconst $parents = $element.parents('.hproduct');\n\n\t\t\t\tif ($parents.length > 0) {\n\t\t\t\t\t$element = $parents;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\thproductInternetPrice = atob($element.data('internetprice'));\n\t\t\t\thproductMsrpValue = atob($element.data('msrp'));\n\t\t\t} catch (error) {\n\t\t\t\thproductInternetPrice = $element.data('internetprice');\n\t\t\t\thproductMsrpValue = $element.data('msrp');\n\t\t\t}\n\n\t\t\teventData.vin = $element.data('vin');\n\t\t\teventData.stockNumber = $element.data('stockNumber');\n\t\t\teventData.make = $element.data('make');\n\t\t\teventData.model = $element.data('model');\n\t\t\teventData.year = $element.data('year');\n\t\t\teventData.bodyStyle = $element.data('bodystyle');\n\t\t\teventData.trim = $element.data('trim');\n\t\t\teventData.exteriorColor = $element.data('exteriorcolor');\n\t\t\teventData.position = $element.data('index-position');\n\t\t\teventData.type = $element.data('type');\n\t\t\teventData.internetPrice = hproductInternetPrice;\n\t\t\teventData.msrp = hproductMsrpValue;\n\t\t\teventData.url = $element.find('.media a').attr('href');\n\t\t}\n\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_HPRODUCTCLICK,\n\t\t\teventData\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default hproduct;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_LINK_OFFERCLICK = 'ddc.link.offerClick';\n\nfunction incentive(\n\t{\n\t\tDDC: {\n\t\t\tmodules: { dialog }\n\t\t}\n\t},\n\tdoc,\n\t{ currentTarget: element, timeStamp }\n) {\n\tlet eventObject;\n\tconst $element = $(element);\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_OFFERCLICK, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\t// Set up the dialog link clicks\n\t\tif ($element.hasClass('dialog')) {\n\t\t\t$(doc).trigger('modulesRefresh', {\n\t\t\t\tmodules: {\n\t\t\t\t\tdialog\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst offerId = $element.data('incentive-id');\n\t\tconst offerName = $element.data('incentive-name');\n\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_OFFERCLICK,\n\t\t\teventData: {\n\t\t\t\tofferId,\n\t\t\t\tofferName,\n\t\t\t\telement,\n\t\t\t\tisIncentiveModal:\n\t\t\t\t\t$(element).closest('.multi-incentive-modal').length > 0 ||\n\t\t\t\t\t$(element).closest('.single-incentive-modal').length > 0\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default incentive;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_LINK_NAVCLICK = 'ddc.link.navClick';\n\nfunction navigationClick(\n\t{\n\t\tDDC: {\n\t\t\tclient: { isMobile }\n\t\t}\n\t},\n\t{ currentTarget: element, timeStamp }\n) {\n\tlet eventObject;\n\tconst $element = $(element);\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_NAVCLICK, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\tlet isParentLink;\n\t\tlet isChildLink;\n\t\tlet isHeadingLink;\n\t\tconst navigationPosition =\n\t\t\t$element.parents('.ddc-footer').length > 0 ? 'bottomNav' : 'topNav';\n\t\tlet menuLinkText;\n\n\t\tif (isMobile) {\n\t\t\tisParentLink =\n\t\t\t\t$element.hasClass('accordion-faux') &&\n\t\t\t\t$element.not('.heading-tier2').length > 0;\n\t\t\tisChildLink = $element.hasClass('tier3');\n\t\t\tisHeadingLink = $element.hasClass('heading-tier2');\n\t\t} else {\n\t\t\tisParentLink =\n\t\t\t\t$element.parent().parent('.navbar-nav').length > 0 &&\n\t\t\t\t$element.parent().hasClass('nav-no-children');\n\t\t\tisChildLink = $element.hasClass('child');\n\t\t\tisHeadingLink = $element.parent('h4').length > 0;\n\t\t}\n\n\t\tif (navigationPosition === 'topNav' && isChildLink) {\n\t\t\tmenuLinkText =\n\t\t\t\t$element\n\t\t\t\t\t.closest('.dropdown')\n\t\t\t\t\t.find('.nav-with-children')\n\t\t\t\t\t.first()\n\t\t\t\t\t.text() ||\n\t\t\t\t$element.parents('.panel').find('.panel-title').text().trim();\n\t\t}\n\n\t\tif (isParentLink || isChildLink || isHeadingLink) {\n\t\t\teventObject = {\n\t\t\t\teventType: DDC_LINK_NAVCLICK,\n\t\t\t\teventData: {\n\t\t\t\t\telement,\n\t\t\t\t\t// If we find a ddc.link.navClick where hasChildren is true we should make a unit test using that data\n\t\t\t\t\t// so far due to the selectors used and logic in this file navigations clicks never fire with this being true\n\t\t\t\t\thasChildren: !!element.dataset.toggle,\n\t\t\t\t\tisChildLink,\n\t\t\t\t\tlinkText: $element.text().trim(),\n\t\t\t\t\tmegaMenu: $element.parents('.non-mega-menu').length === 0,\n\t\t\t\t\tmenuLinkText,\n\t\t\t\t\tposition: navigationPosition,\n\t\t\t\t\turl: $element.attr('href')\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t}\n\treturn eventObject;\n}\n\nexport default navigationClick;\n","import { eventHasRun } from '../../utils/eventTracker';\nimport getLinkText from '../../utils/getLinkText';\n\nexport const DDC_LINK_RECOMMENDEDVEHICLE = 'ddc.link.recommendedVehicle';\n\nfunction recommendedVehicle(win, { timeStamp, element }) {\n\tconst {\n\t\tDDC: {\n\t\t\tdataLayer: {\n\t\t\t\tpage: {\n\t\t\t\t\tpageInfo: { pageName }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} = win;\n\tlet eventObject;\n\tif (\n\t\t!eventHasRun(DDC_LINK_RECOMMENDEDVEHICLE, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_RECOMMENDEDVEHICLE,\n\t\t\teventData: {\n\t\t\t\ttext: getLinkText(element, win) || '',\n\t\t\t\turl: element.getAttribute('data-vdp-href') || '',\n\t\t\t\tpageName,\n\t\t\t\telement\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default recommendedVehicle;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_LINK_SOCIALSHARE = 'ddc.link.socialShare';\n\nfunction share({ currentTarget: element, timeStamp }) {\n\tlet eventObject;\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_SOCIALSHARE, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_SOCIALSHARE,\n\t\t\teventData: {\n\t\t\t\tservice:\n\t\t\t\t\telement.getAttribute('title') ||\n\t\t\t\t\telement.getAttribute('data-links-share-link-id'),\n\t\t\t\turl: element.getAttribute('href'),\n\t\t\t\telement\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default share;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_LINK_SOCIALHEADER = 'ddc.link.socialHeaderClick';\n\nfunction socialHeader({ currentTarget: element, timeStamp }) {\n\tlet eventObject;\n\n\tif (\n\t\t!eventHasRun(DDC_LINK_SOCIALHEADER, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_SOCIALHEADER,\n\t\t\teventData: {\n\t\t\t\tservice: element.getAttribute('title'),\n\t\t\t\turl: element.getAttribute('href'),\n\t\t\t\telement\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default socialHeader;\n","import widgetIsPresent from '../../utils/widgetIsPresent';\nimport getElementAttributes from '../../utils/getElementAttributes';\n\nexport const DDC_LINK_VEHICLECOMPARECHECK = 'ddc.link.vehicleCompareCheck';\n\n/**\n * jQuery Event Object\n * @external Event\n * @see {@link https://api.jquery.com/category/events/event-object/} *\n * @param {Window} win The Window object in the browser.\n * @param {external:Event} event jQuery Event Object\n * @returns\n */\nfunction vehicleCompare(\n\t{\n\t\tDDC: {\n\t\t\tdataLayer: {\n\t\t\t\tpage: {\n\t\t\t\t\tpageInfo: { pageWidgets }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t{ target: element }\n) {\n\tlet eventObject;\n\tif (!widgetIsPresent(/ws-inv-listing/, pageWidgets)) {\n\t\tconst checked = !!element.checked;\n\t\tconst eventData = {\n\t\t\tchecked,\n\t\t\telement\n\t\t};\n\n\t\tconst container = element.closest('.inventoryList .item');\n\t\tconst hproduct =\n\t\t\tcontainer &&\n\t\t\tcontainer.querySelector('.hproduct, .vehicle-card[data-uuid]');\n\n\t\tif (hproduct) {\n\t\t\tconst attributes = getElementAttributes(hproduct);\n\t\t\t({\n\t\t\t\t'data-vin': eventData.vin = '',\n\t\t\t\t'data-make': eventData.make = '',\n\t\t\t\t'data-model': eventData.model = '',\n\t\t\t\t'data-year': eventData.year = '',\n\t\t\t\t'data-bodystyle': eventData.bodyStyle = '',\n\t\t\t\t'data-trim': eventData.trim = '',\n\t\t\t\t'data-exteriorcolor': eventData.exteriorColor = '',\n\t\t\t\t'data-index-position': eventData.position = '',\n\t\t\t\t'data-type': eventData.type = ''\n\t\t\t} = attributes);\n\n\t\t\ttry {\n\t\t\t\teventData.internetPrice = atob(\n\t\t\t\t\tattributes['data-internetprice']\n\t\t\t\t);\n\t\t\t\teventData.msrp = atob(attributes['data-msrp']);\n\t\t\t} catch (error) {\n\t\t\t\teventData.internetPrice = '';\n\t\t\t\teventData.msrp = '';\n\t\t\t}\n\t\t}\n\n\t\teventObject = {\n\t\t\teventType: DDC_LINK_VEHICLECOMPARECHECK,\n\t\t\teventData\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default vehicleCompare;\n","export const DDC_MAPS = 'ddc.maps';\n\nfunction maps() {\n\t// empty eventData below {} left in place as to not break any funky code relying on eventData to be defined for this event\n\treturn {\n\t\teventType: DDC_MAPS,\n\t\teventData: {}\n\t};\n}\n\nexport default maps;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_MAP_PIN = 'ddc.map.pin';\n\nfunction pin(win, doc, { timeStamp }, infoClass) {\n\tlet eventObject;\n\n\tif (\n\t\t!eventHasRun(DDC_MAP_PIN, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_MAP_PIN,\n\t\t\teventData: {\n\t\t\t\telement: doc.querySelector(infoClass)\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default pin;\n","import isEmpty from '../../utils/isEmpty';\nimport widgetIsPresent from '../../utils/widgetIsPresent';\n\nexport const DDC_INVENTORY_FILTERSEARCH = 'ddc.inventory.filterSearch';\n\nfunction filterSearch({\n\tDDC: {\n\t\tdataLayer: {\n\t\t\tpage: {\n\t\t\t\tattributes: { vehicleResultCount } = {},\n\t\t\t\tpageInfo: { isVlp, pageName, pageWidgets } = {},\n\t\t\t\tqueryFacets = {}\n\t\t\t}\n\t\t}\n\t}\n}) {\n\tlet eventObject;\n\tconst isNoResults = pageName?.indexOf('NO_RESULTS') > -1;\n\tconst isShowroom = pageName === 'SHOWROOM';\n\tconst isSRP = widgetIsPresent(/ws-inv-listing/, pageWidgets);\n\n\tif (\n\t\tvehicleResultCount !== null && // legacy vlp has this as null when the widget hidden\n\t\t!isSRP &&\n\t\t!isShowroom &&\n\t\t(isVlp ||\n\t\t\tisNoResults ||\n\t\t\t// When checking for the inventory listing widget, exclude the 'blank' version\n\t\t\twidgetIsPresent(\n\t\t\t\t/\\.inventory-listing\\.(?!blank|sitemap)/,\n\t\t\t\tpageWidgets\n\t\t\t) ||\n\t\t\t!isEmpty(queryFacets))\n\t) {\n\t\tconst resultCount = isNoResults ? '0' : vehicleResultCount;\n\t\teventObject = {\n\t\t\teventType: DDC_INVENTORY_FILTERSEARCH,\n\t\t\teventData: {\n\t\t\t\tresultCount,\n\t\t\t\tqueryFacets\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default filterSearch;\n","const getNameAndValueFromSlider = (el) => {\n\tconst chart = el.querySelector(\n\t\t'.facet-user-range-chart[data-range-chart-min-val][data-range-chart-max-val]'\n\t);\n\tconst sliderInput = el.querySelector(\n\t\t'.facet-user-range-submit-values[name][value]'\n\t);\n\tlet defaultValue = '';\n\tlet maxVal = '0';\n\tlet minVal = 'any';\n\tlet name = '';\n\tlet value = '';\n\n\tif (chart) {\n\t\tminVal = chart.getAttribute('data-range-chart-min-val') || minVal;\n\t\tmaxVal = chart.getAttribute('data-range-chart-max-val') || maxVal;\n\t\tdefaultValue = `${minVal}-${maxVal}`;\n\t\tvalue = defaultValue;\n\t}\n\n\tif (sliderInput) {\n\t\tname = sliderInput.getAttribute('name');\n\t\tconst selectedValuesArr = sliderInput.getAttribute('value').split('-');\n\t\tvalue = `${selectedValuesArr[0] || minVal}-${\n\t\t\tselectedValuesArr[1] || maxVal\n\t\t}`;\n\t}\n\n\treturn {\n\t\tname,\n\t\tvalue,\n\t\tdefaultValue\n\t};\n};\n\nexport default getNameAndValueFromSlider;\n","/**\n *\n * @param {boolean} isBreadcrumb Are the facets related to a breadcrumb click?\n * @param {boolean} checked Is the element checked that was clicked to get here?\n * @param {object} facets The current facets selected on the page.\n * @param {string} name The name of the facet related to the clicked breadcrumb.\n * @param {string} value The value of the facet related to the clicked breadcrumb.\n * @description The reason for this being broken out into a function is so that we can more easily unit test it.\n * We can't find any sites that have HTML set up that allows the logic in this function to even run.\n *\n * It appears the goal here is to update the facet state based on the removal via breadcrumb click. So if Audi, BMW, Toyota are selected\n * and Toyota is removed then the resulting facets should just have make of Audi, BMW.\n */\nconst getFacetsForBreadcrumbs = (\n\tisBreadcrumb,\n\tchecked,\n\tfacets,\n\tname,\n\tvalue\n) => {\n\tconst facetsCopy = JSON.parse(JSON.stringify(facets));\n\tif (isBreadcrumb && !checked && facets[name]) {\n\t\t// delete facet entry if unchecked\n\t\tconst valArr = facets[name].split(',');\n\t\tconst valIndex = valArr.indexOf(value);\n\n\t\tif (valIndex > -1) {\n\t\t\tvalArr.splice(valIndex, 1);\n\t\t}\n\n\t\tif (valArr.length > 0) {\n\t\t\tfacetsCopy[name] = valArr.join();\n\t\t} else {\n\t\t\tdelete facetsCopy[name];\n\t\t}\n\t}\n\n\treturn facetsCopy;\n};\n\nexport default getFacetsForBreadcrumbs;\n","import getNameAndValueFromSlider from '../../utils/getNameAndValueFromSlider';\nimport getFacetsForBreadcrumbs from '../../utils/getFacetsForBreadcrumbs';\n\nexport const DDC_INVENTORY_FILTERSEARCH_CLICK =\n\t'ddc.inventory.filterSearch.click';\n\nexport const DDC_INCENTIVE_FILTERSEARCH = 'ddc.incentive.filterSearch';\n\nfunction filterSearchClick(\n\teventType = DDC_INVENTORY_FILTERSEARCH_CLICK,\n\t{ currentTarget: element } = {},\n\t_range\n) {\n\tconst checked = !!element?.checked;\n\tlet facets = {};\n\n\tconst facetContainer =\n\t\telement?.closest?.('.facetmulti, .facets-container') ||\n\t\tdocument.querySelector('.facetmulti');\n\tconst getNameAndValue = (el) => ({\n\t\tname: el.getAttribute('name'),\n\t\tvalue: el.getAttribute('value')\n\t});\n\tconst isBreadcrumb = !!element?.closest?.('.facet-breadcrumb-list');\n\tconst isSlider = !!element?.closest?.('.facet-user-range-input-slider');\n\n\tif (facetContainer) {\n\t\t// get selected checkbox values\n\t\tconst checkedInputs = facetContainer.querySelectorAll(\n\t\t\t'input[type=\"checkbox\"]:checked'\n\t\t);\n\n\t\tfor (let i = 0; i < checkedInputs.length; i++) {\n\t\t\tconst { name, value } = getNameAndValue(checkedInputs[i]);\n\t\t\tfacets[name] = facets[name] ? `${facets[name]},${value}` : value;\n\t\t}\n\n\t\t// get slider values\n\t\tconst sliders = facetContainer.querySelectorAll('.facet-user-range');\n\n\t\tfor (let i = 0; i < sliders.length; i++) {\n\t\t\tconst { name, value, defaultValue } = getNameAndValueFromSlider(\n\t\t\t\tsliders[i]\n\t\t\t);\n\n\t\t\t// only apply slider value to facets if user has adjusted\n\t\t\tif (value !== defaultValue) {\n\t\t\t\tfacets[name] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\t// get name and value from checkbox\n\tlet name = element?.getAttribute?.('name');\n\tlet value = element?.getAttribute?.('value');\n\n\t// get name and value from slider input\n\tif (!name && !value) {\n\t\tconst elementRange = element?.closest?.('.facet-user-range');\n\t\tif (elementRange) {\n\t\t\tconst sliderData = getNameAndValueFromSlider(elementRange);\n\t\t\tname = sliderData.name;\n\t\t\tvalue = sliderData.value;\n\t\t}\n\t}\n\n\tfacets = getFacetsForBreadcrumbs(\n\t\tisBreadcrumb,\n\t\tchecked,\n\t\tfacets,\n\t\tname,\n\t\tvalue\n\t);\n\n\treturn {\n\t\teventType,\n\t\teventData: {\n\t\t\telement,\n\t\t\tchecked,\n\t\t\tclickedFacetName: name || '',\n\t\t\tclickedFacetValue: value || '',\n\t\t\tfacets,\n\t\t\tisBreadcrumb,\n\t\t\tisSlider\n\t\t}\n\t};\n}\n\nexport default filterSearchClick;\n","import widgetIsPresent from '../../utils/widgetIsPresent';\n\nexport const DDC_INVENTORY_TYPEDSEARCH = 'ddc.inventory.typedSearch';\n\nfunction typedSearch(\n\t{\n\t\tDDC: {\n\t\t\tdataLayer: {\n\t\t\t\tpage,\n\t\t\t\tpage: {\n\t\t\t\t\tattributes: { vehicleResultCount },\n\t\t\t\t\tpageInfo: { isVlp, pageName, pageWidgets }\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetUrlParams\n\t\t}\n\t},\n\t{ currentTarget: element } = {}\n) {\n\tlet eventObject;\n\tlet { queryFacets } = page;\n\tlet search = queryFacets?.search ? queryFacets.search : null;\n\tconst isNoResults = pageName?.indexOf('NO_RESULTS') > -1;\n\tconst resultCount = isNoResults ? '0' : vehicleResultCount;\n\n\t// If 'search' is not in queryFacets, we may be on a NO_RESULTS page. In that case, try to get the search\n\t// string from the request's query parameters (which are already in the data layer object).\n\tif (!search && isNoResults) {\n\t\tqueryFacets = queryFacets || {};\n\t\tsearch = getUrlParams()?.search;\n\t\tqueryFacets.search = getUrlParams()?.search;\n\t}\n\n\tif (\n\t\tsearch &&\n\t\t(isVlp ||\n\t\t\tisNoResults ||\n\t\t\t// When checking for the inventory listing widget, exclude the 'blank' version\n\t\t\twidgetIsPresent(/\\.inventory-listing\\.(?!blank)/, pageWidgets))\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_INVENTORY_TYPEDSEARCH,\n\t\t\teventData: {\n\t\t\t\telement,\n\t\t\t\tresultCount,\n\t\t\t\tqueryFacets\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default typedSearch;\n","export const DDC_INVENTORY_TYPEDSEARCH_INIT = 'ddc.inventory.typedSearch.init';\n\nconst typedSearchInitiated = [];\n\nfunction typedSearchInit({\n\tcurrentTarget: element,\n\tcurrentTarget: { tagName, value: elementValue }\n}) {\n\tlet eventObject;\n\tif (tagName !== 'INPUT' || typedSearchInitiated.indexOf(element) === -1) {\n\t\tlet value;\n\n\t\t// push to array so text input event fires once per element\n\t\tif (tagName === 'INPUT') {\n\t\t\ttypedSearchInitiated.push(element);\n\t\t\tvalue = elementValue;\n\t\t} else {\n\t\t\tconst field = element.closest('.facetlist-keyword');\n\t\t\tconst input = field && field.querySelector('input[name=\"search\"]');\n\t\t\tvalue = input && input.value;\n\t\t}\n\n\t\teventObject = {\n\t\t\teventType: DDC_INVENTORY_TYPEDSEARCH_INIT,\n\t\t\teventData: {\n\t\t\t\telement,\n\t\t\t\tsearch: value || ''\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default typedSearchInit;\n","export const DDC_PAGE_VEHICLEDETAILVIEW = 'ddc.page.vehicleDetailView';\n\nfunction vehicleDetailView({\n\tDDC: {\n\t\tdataLayer: {\n\t\t\tpage: {\n\t\t\t\tpageInfo: { isVdp, pageName }\n\t\t\t}\n\t\t}\n\t}\n}) {\n\treturn isVdp\n\t\t? {\n\t\t\t\teventType: DDC_PAGE_VEHICLEDETAILVIEW,\n\t\t\t\teventData: {\n\t\t\t\t\talias: pageName\n\t\t\t\t}\n\t\t }\n\t\t: undefined;\n}\n\nexport default vehicleDetailView;\n","export const DDC_PAGE_VIEW = 'ddc.page.view';\n\nfunction view({\n\tDDC: {\n\t\tdataLayer: {\n\t\t\tpage: {\n\t\t\t\tpageInfo: { pageName: alias }\n\t\t\t}\n\t\t}\n\t}\n}) {\n\treturn {\n\t\teventType: DDC_PAGE_VIEW,\n\t\teventData: {\n\t\t\talias\n\t\t}\n\t};\n}\n\nexport default view;\n","import { eventHasRun } from '../../utils/eventTracker';\n\nexport const DDC_SLIDESHOW_CLICK = 'ddc.slideshow.click';\n\nfunction click({ currentTarget: element, timeStamp }) {\n\tlet eventObject;\n\tconst $element = $(element);\n\n\tif (\n\t\t!eventHasRun(DDC_SLIDESHOW_CLICK, {\n\t\t\ttimeStamp\n\t\t})\n\t) {\n\t\teventObject = {\n\t\t\teventType: DDC_SLIDESHOW_CLICK,\n\t\t\teventData: {\n\t\t\t\telement,\n\t\t\t\tname: $element.data('slide-label'),\n\t\t\t\tposition: $element.data('slide-position'),\n\t\t\t\ttype: $element.data('slide-type')\n\t\t\t}\n\t\t};\n\t}\n\n\treturn eventObject;\n}\n\nexport default click;\n","export const DDC_SLIDESHOW_PAGERCLICK = 'ddc.slideshow.pagerClick';\n\nfunction pagerClick(\n\t{\n\t\tDDC: {\n\t\t\tdataLayer: {\n\t\t\t\tpage: {\n\t\t\t\t\tpageInfo: { pageName }\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\t_event,\n\teventData\n) {\n\treturn {\n\t\teventType: DDC_SLIDESHOW_PAGERCLICK,\n\t\teventData: {\n\t\t\t...eventData,\n\t\t\tpageName\n\t\t}\n\t};\n}\n\nexport default pagerClick;\n","export const DDC_VIDEO_MILESTONE = 'ddc.video.milestone';\nexport const VIDEO_PLAY_MILESTONE = 'video-play-milestone';\n\nfunction milestonesReport(videoMilestone = '', element) {\n\tconst fileType = element.currentSrc?.split('.')?.pop() || '';\n\tconst autoplay = !!element.hasAttribute?.('autoplay');\n\n\treturn {\n\t\teventType: DDC_VIDEO_MILESTONE,\n\t\teventData: {\n\t\t\tautoplay,\n\t\t\telement,\n\t\t\tvideoSource: element.currentSrc,\n\t\t\tvideoDuration: element.duration,\n\t\t\tvideoMilestone,\n\t\t\tfileType\n\t\t},\n\t\toverrides: {\n\t\t\teventType: VIDEO_PLAY_MILESTONE\n\t\t}\n\t};\n}\n\nexport default milestonesReport;\n","/** Returns hash code value of string\n *\n * @param inputValue String value to be hashed.\n * @returns {string} hash value\n */\nconst getHashCode = (inputValue) => {\n\tlet hash = 0;\n\tlet i;\n\tlet chr;\n\tlet len;\n\tif (inputValue.length === 0) {\n\t\treturn hash;\n\t} else {\n\t\tfor (i = 0, len = inputValue.length; i < len; i++) {\n\t\t\tchr = inputValue.charCodeAt(i);\n\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\thash = (hash << 5) - hash + chr;\n\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\thash |= 0;\n\t\t}\n\t}\n\treturn Math.abs(hash);\n};\n\nexport default getHashCode;\n","export const DDC_VIDEO_PLAY = 'ddc.video.play';\nexport const VIDEO_PLAY = 'video-play';\n\nfunction play(event, autoplay = false) {\n\tconst {\n\t\tcurrentTarget: element,\n\t\tcurrentTarget: {\n\t\t\tduration: videoDuration = '',\n\t\t\tcurrentSrc: videoSource\n\t\t} = {}\n\t} = event;\n\t// TODO: Does currentSrc work instead?\n\t// const videoSource = $(this).find('source').attr('src');\n\n\treturn {\n\t\teventType: DDC_VIDEO_PLAY,\n\t\teventData: {\n\t\t\tautoplay,\n\t\t\telement,\n\t\t\tvideoSource,\n\t\t\tvideoDuration,\n\t\t\tfileType:\n\t\t\t\ttypeof videoSource === 'string'\n\t\t\t\t\t? videoSource.split('.').pop()\n\t\t\t\t\t: ''\n\t\t},\n\t\toverrides: {\n\t\t\teventType: VIDEO_PLAY\n\t\t}\n\t};\n}\n\nexport default play;\n","import getHashCode from '../../utils/getHashCode';\nimport videoMilestonesReport from './milestonesReport';\nimport play from './play';\n\nfunction milestonesTrack({ DDC }, event) {\n\tconst {\n\t\tcurrentTarget: element,\n\t\tcurrentTarget: { currentSrc, currentTime, duration }\n\t} = event;\n\tconst eventObjects = [];\n\tconst id = getHashCode(currentSrc);\n\tconst progress = currentTime / duration;\n\tconst milestones = {\n\t\t0: false,\n\t\t25: false,\n\t\t50: false,\n\t\t75: false,\n\t\t95: false\n\t};\n\n\tconst {\n\t\tdataLayer,\n\t\tdataLayer: { video = {} }\n\t} = DDC;\n\tdataLayer.video = video;\n\n\tvideo[id] = video[id] || milestones;\n\n\tif (!video[id]['0']) {\n\t\tvideo[id]['0'] = true;\n\t\tconst autoplay = element.hasAttribute?.('autoplay');\n\t\teventObjects.push(play(event, autoplay));\n\t}\n\n\tif (progress >= 0.25 && !video[id]['25']) {\n\t\tvideo[id]['25'] = true;\n\t\teventObjects.push(videoMilestonesReport('25', element));\n\t} else if (progress >= 0.5 && !video[id]['50']) {\n\t\tvideo[id]['50'] = true;\n\t\teventObjects.push(videoMilestonesReport('50', element));\n\t} else if (progress >= 0.75 && !video[id]['75']) {\n\t\tvideo[id]['75'] = true;\n\t\teventObjects.push(videoMilestonesReport('75', element));\n\t} else if (progress >= 0.95 && !video[id]['95']) {\n\t\tvideo[id]['95'] = true;\n\t\teventObjects.push(videoMilestonesReport('95', element));\n\t}\n\n\treturn eventObjects;\n}\n\nexport default milestonesTrack;\n","const selectorsToHandle = {\n\tclickToCall: '[data-click-to-call] a[href*=\"tel:\"]',\n\tcompareId: '[data-compare-id]',\n\tgetDirectionsForm: \"[data-widget-name='directions-form'] form\",\n\tgetDirections: \"[data-widget-name='ws-contact'] .direction-link a\",\n\tformInitiation: `[data-form-tracking-id] input,\n\t[data-form-tracking-id] select,\n\t[data-form-tracking-id] textarea`,\n\tformOnPage: \"[data-form-tracking-id], form input[name='userSessionId']\",\n\tformPaymentCalc: \"[data-widget-name='calculator-payment'] form\",\n\tformSubmission: `[data-form-tracking-id]:not([data-form-tracking-id=\"SMS_SHARE\"],[data-form-tracking-name=\"inventory-search-lead\"]) [type=submit],\n\t[data-form-tracking-id=\"PREQUAL\"] .finance-prequal-submit`,\n\tincentiveId: '[data-incentive-id]',\n\tincentiveLabel: '.vehicle-card dl.pricing-detail [role=\"button\"]',\n\tlinkClick: `a[href],\n\ta[data-href],\n\ta.facetmulti-collapse-toggle,\n\tbutton`,\n\tlinksShareId: '[data-links-share-link-id]',\n\tmapTypeId: '[data-map-type-id]',\n\tnavigationId: '[data-navigation-id]',\n\tspecialsIncentiveId: `[data-widget-name='specials-listing'] .special .ddc-link-primary.dialog,\n\t[data-widget-name='specials-listing'] .special .ddc-nav-inline .dialog`,\n\t// See v9/media/js/ddc-promotions/tracking.js. This is just for storing the selectors used there as a reference.\n\tspecialsEvents: `.promotion-body [data-promo-tracking-action],\n\t.promotion-details-content[data-promo-id] [data-promo-tracking-action]`,\n\tslideType: '[data-slide-type]',\n\tsocialHeaderButtonId: '[data-social-header-button-id]',\n\ttypedSearchInit: `.facetmulti input[type=\"search\"],\n.facetmulti button.facetmulti-freeform-search-submit`,\n\tvehicleCompare:\n\t\t'.vlp .item-compare input[type=\"checkbox\"], .vehicle-card-footer input[type=\"checkbox\"]',\n\tvin: `[data-showroom-listing-vehicle-id],\n\t[data-modelselector-vehicle-id],\n\t.inventoryList .hproduct .photo,\n\t.inventoryList .hproduct .url,\n\t.inventoryList .hproduct .video,\n\t.inventory-similar-default .hproduct .media a,\n\t.inventory-similar-default .hproduct .url,\n\t.inventory-similar-default .hproduct .view-link,\n\t.srp .ws-inv-listing .img-container img,\n\t.srp .ws-inv-listing .vehicle-card-title a,\n\t.srp .ws-inv-listing .more-details-link`,\n\tvideo: 'video',\n\tincentiveFacet: '.incentives-search-default .facets-container input',\n\tsearchFacet: `.facetmulti input[type=\"checkbox\"],\n\t.facet-breadcrumb-list input[type=\"checkbox\"],\n\t.facetmulti-item input[type=\"radio\"]`,\n\tsearchFacetVlpSlider: '.facet-user-range-input-slider.noUi-target'\n};\n\nconst getSelectorsToHandle = (win) => {\n\t// extra safe as this property should always be defined\n\tconst formChangeTypes = win?.DDC?.WidgetData?.['ws-tracking']\n\t\t?.formChangeTypes || ['select'];\n\n\treturn {\n\t\t...selectorsToHandle,\n\t\t...(typeof win !== 'undefined' && {\n\t\t\tformChange: formChangeTypes\n\t\t\t\t?.map?.((type) => `form ${type}`)\n\t\t\t\t.join(',')\n\t\t})\n\t};\n};\n\nexport default getSelectorsToHandle;\n","// TODO: Now that old MyCars is gone the stuff in this file may be able to b moved to getDocumentOnHandlers\n// We intentionally did not use event delegation here to get around stopPropagation() due to an old MyCars thing\n\n/*\n\tThis section is for handling:\n\t$(selectors[selector]).on(events,handler);\n*/\nconst getSelectorOnHandlers = ({ link, video }) => [\n\t{\n\t\t// US358331: handle ws-contact 'get directions' button as a get directions link event\n\t\t// TODO: This can probably go in getDocumentOnHandlers but we should test\n\t\t// Perhaps it was set up like this due to some OSIRIS thing or something.\n\t\t// Maybe the eventDelegation won't work. Not sure.\n\t\tevent: 'submit',\n\t\tselector: 'getDirectionsForm',\n\t\thandler: link.getDirections\n\t},\n\t// TODO: The three below video events can probably go in getDocumentOnHandlers\n\t{\n\t\t// Fires when play is clicked on HTML5 video\n\t\tevent: 'play',\n\t\tselector: 'video',\n\t\thandler: video.play\n\t},\n\t{\n\t\tevent: 'timeupdate',\n\t\tselector: 'video',\n\t\thandler: video.milestones.track\n\t},\n\t{\n\t\tevent: 'ended',\n\t\tselector: 'video',\n\t\thandler: video.milestones.complete\n\t}\n];\n\nexport default getSelectorOnHandlers;\n","import getSelectorsToHandle from './selectorsToHandle';\nimport onPage from '../../events/form/onPage';\n\nconst handleDynamicForms = (win, e) => {\n\tconst eventObjects = [];\n\t// arrow function okay here as form.onPage does not use 'this'\n\tconst $content = $(e.target);\n\t$content\n\t\t.find(getSelectorsToHandle(win).formOnPage)\n\t\t.each((_index, element) => {\n\t\t\tconst eventObject = onPage(win, element);\n\t\t\tif (eventObject) {\n\t\t\t\teventObjects.push(eventObject);\n\t\t\t}\n\t\t});\n\t// return undefined to indicate no eventObjects were found\n\treturn eventObjects.length > 0 ? eventObjects : undefined;\n};\n\nexport default handleDynamicForms;\n","const trackEventIgnoreWidgetNames = ['DR_finance_standalone'];\nconst trackEventIgnoreEventNames = [\n\t'Web: VDP > Inventory Detail Pricing Box > SMS Share Form > Clicked Submit Button'\n];\n\nconst handleTrackEvent = async ({ DDC }, _event, eventData, additionalData) => {\n\tlet eventObject;\n\tconst {\n\t\tdataLayer,\n\t\tdataLayer: { events }\n\t} = DDC;\n\tif (eventData) {\n\t\tconst { eventName, widgetName } = eventData;\n\t\tif (\n\t\t\teventName &&\n\t\t\twidgetName &&\n\t\t\t!trackEventIgnoreWidgetNames.includes(widgetName) &&\n\t\t\t!trackEventIgnoreEventNames.includes(eventName)\n\t\t) {\n\t\t\tconst { data } = eventData;\n\t\t\tif (additionalData) {\n\t\t\t\tdataLayer.confirmation = dataLayer.confirmation || {};\n\n\t\t\t\t// Check for element in the additionalData and use that if it exists\n\t\t\t\t// This preserves legacy behavior where a DOM element is expected in additionalData and not an object\n\t\t\t\tdataLayer.confirmation.element =\n\t\t\t\t\tadditionalData?.element || additionalData;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\teventName.toLowerCase().includes('submit') &&\n\t\t\t\twidgetName !== 'facetmulti' &&\n\t\t\t\twidgetName !== 'digital-retailing-cox'\n\t\t\t) {\n\t\t\t\teventObject = await events.form.confirmation(\n\t\t\t\t\tundefined,\n\t\t\t\t\twidgetName\n\t\t\t\t);\n\t\t\t} else if (eventName.toLowerCase().includes('confirm')) {\n\t\t\t\t// protection-driver 'confirm' events are not actually form confirms so we need special-case handling around that widget\n\t\t\t\tif (widgetName.includes('protect')) {\n\t\t\t\t\teventObject = await events.form.confirmation(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tdata\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\teventObject = await events.form.confirmation(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\twidgetName\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (widgetName.includes('KBB')) {\n\t\t\t\tif (\n\t\t\t\t\tdata === 'submit_calculate_trade_integrated' ||\n\t\t\t\t\tdata === 'send_update_calculate_trade_integrated'\n\t\t\t\t) {\n\t\t\t\t\teventObject = await events.form.confirmation(\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\twidgetName\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else if (widgetName.includes('recommended_vehicles')) {\n\t\t\t\tif (\n\t\t\t\t\t(DDC.client.isDesktop && data === 'list_clicked') ||\n\t\t\t\t\t(DDC.client.isMobile && data === 'list_hovered')\n\t\t\t\t) {\n\t\t\t\t\t// Fires clicked event handler on recommended_vehicles widget list_clicked trackEvent.\n\t\t\t\t\teventObject = events.link.recommendedVehicle(eventData);\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\ttypeof data === 'string' &&\n\t\t\t\tdata.includes('Submitted Instant ePrice')\n\t\t\t) {\n\t\t\t\teventObject = await events.form.confirmation(undefined, data);\n\t\t\t}\n\t\t}\n\t}\n\treturn eventObject;\n};\n\nexport default handleTrackEvent;\n","const handleDDCEvent = (event, ddcEventData) => {\n\tlet eventObject;\n\tif (ddcEventData?.eventType) {\n\t\teventObject = ddcEventData.eventType(event);\n\t}\n\treturn eventObject;\n};\n\nexport default handleDDCEvent;\n","import filterSearchClick, {\n\tDDC_INCENTIVE_FILTERSEARCH,\n\tDDC_INVENTORY_FILTERSEARCH_CLICK\n} from '../../events/page/filterSearchClick';\nimport handleDynamicForms from './handleDynamicForms';\nimport getSelectorsToHandle from './selectorsToHandle';\nimport pushEvent from '../pushEvent';\nimport handleTrackEvent from './handleTrackEvent';\nimport handleDDCEvent from './handleDDCEvent';\n\n/*\n\tThis section is for handling:\n\t$('body').on(event,selectors[selector],handler);\n*/\nconst getDocumentOnHandlers = (\n\twin,\n\t{ dialog, form, link, page, slideshow }\n) => ({\n\tclick: [\n\t\t{\n\t\t\tselectorKey: 'formInitiation',\n\t\t\thandler: form.initiation\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'formPaymentCalc',\n\t\t\thandler: form.paymentCalcInit\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'formSubmission',\n\t\t\thandler: form.submission\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'clickToCall',\n\t\t\thandler: link.clickToCall\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'compareId',\n\t\t\thandler: link.compare\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'incentiveId',\n\t\t\thandler: link.incentive\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'getDirections',\n\t\t\thandler: link.getDirections\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'linkClick',\n\t\t\thandler: link.clicked\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'incentiveLabel',\n\t\t\thandler: link.clicked\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'linksShareId',\n\t\t\thandler: link.share\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'navigationId',\n\t\t\thandler: link.navigationClick\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'vehicleCompare',\n\t\t\thandler: link.vehicleCompare\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'slideType',\n\t\t\thandler: slideshow.click\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'socialHeaderButtonId',\n\t\t\thandler: link.socialHeader\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'vin',\n\t\t\thandler: link.hproduct\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'typedSearchInit',\n\t\t\thandler: page.typedSearchInit\n\t\t},\n\t\t{\n\t\t\t// When global incentives facets are used\n\t\t\tselectorKey: 'incentiveFacet',\n\t\t\thandler: filterSearchClick.bind(\n\t\t\t\tundefined,\n\t\t\t\tDDC_INCENTIVE_FILTERSEARCH\n\t\t\t)\n\t\t},\n\t\t{\n\t\t\t// When vehicle search facets are used\n\t\t\tselectorKey: 'searchFacet',\n\t\t\thandler: filterSearchClick.bind(\n\t\t\t\tundefined,\n\t\t\t\tDDC_INVENTORY_FILTERSEARCH_CLICK\n\t\t\t)\n\t\t}\n\t],\n\tmousedown: [\n\t\t{\n\t\t\tselectorKey: 'linkClick',\n\t\t\thandler: link.centerClicked\n\t\t}\n\t],\n\tinput: [\n\t\t{\n\t\t\tselectorKey: 'formInitiation',\n\t\t\thandler: form.initiation\n\t\t},\n\t\t{\n\t\t\tselectorKey: 'typedSearchInit',\n\t\t\thandler: page.typedSearchInit\n\t\t}\n\t],\n\tchange: [\n\t\t{\n\t\t\tselectorKey: 'formChange',\n\t\t\thandler: form.change\n\t\t}\n\t],\n\tfocusin: [\n\t\t{\n\t\t\tselectorKey: 'formPaymentCalc',\n\t\t\thandler: form.paymentCalcInit\n\t\t}\n\t],\n\tsubmit: [\n\t\t{\n\t\t\tselectorKey: 'formSubmission',\n\t\t\thandler: form.submission\n\t\t}\n\t],\n\tdialogopen: [\n\t\t{\n\t\t\thandler: dialog.opened\n\t\t}\n\t],\n\t'show.bs.modal': [\n\t\t{\n\t\t\thandler: dialog.opened\n\t\t}\n\t],\n\tslideOpen: [\n\t\t{\n\t\t\thandler: dialog.opened\n\t\t},\n\t\t{\n\t\t\t// When dialog/slidein is open and ready to interact with\n\t\t\thandler: dialog.ajaxContentLoaded\n\t\t},\n\t\t{\n\t\t\t// Capture forms on dynamically loaded content\n\t\t\t// ajaxDialogShown: htdocs/v9/media/js/ddc/v1/modules/dialog.js\n\t\t\thandler: handleDynamicForms.bind(undefined, win)\n\t\t}\n\t],\n\tdialogclose: [\n\t\t{\n\t\t\thandler: dialog.closed\n\t\t},\n\t\t{\n\t\t\t// // Strip out the `initiatingClickText` when a dialog is closed without being submitted\n\t\t\thandler: () =>\n\t\t\t\tlocalStorage?.removeItem('ddc_data_layer-initiatingClickText')\n\t\t}\n\t],\n\t'hide.bs.modal': [\n\t\t{\n\t\t\thandler: dialog.closed\n\t\t}\n\t],\n\tslideClose: [\n\t\t{\n\t\t\thandler: dialog.closed\n\t\t}\n\t],\n\tslidechange: [\n\t\t{\n\t\t\thandler: form.slideChange\n\t\t}\n\t],\n\ttabsshow: [\n\t\t{\n\t\t\t// Handle click events for jquery-ui tabs, because it doesn't bubble the normal event.\n\t\t\thandler: function handler(e, ui) {\n\t\t\t\tlet eventObject;\n\t\t\t\t// import to note using regular function here and not arrow function as link.clicked needs 'this'\n\t\t\t\tif (ui?.tab) {\n\t\t\t\t\teventObject = link.clicked.call(this, ui.tab, e);\n\t\t\t\t}\n\t\t\t\treturn eventObject;\n\t\t\t}\n\t\t}\n\t],\n\tset: [\n\t\t{\n\t\t\tselectorKey: 'searchFacetVlpSlider',\n\t\t\thandler: filterSearchClick.bind(\n\t\t\t\tundefined,\n\t\t\t\tDDC_INVENTORY_FILTERSEARCH_CLICK\n\t\t\t)\n\t\t}\n\t],\n\tajaxDialogComplete: [\n\t\t{\n\t\t\t// When dialog/slidein is open and ready to interact with\n\t\t\thandler: dialog.ajaxContentLoaded\n\t\t},\n\t\t{\n\t\t\t// Capture forms on dynamically loaded content\n\t\t\t// ajaxDialogShown: htdocs/v9/media/js/ddc/v1/modules/dialog.js\n\t\t\thandler: handleDynamicForms.bind(undefined, win)\n\t\t}\n\t],\n\thproductClick: [\n\t\t{\n\t\t\thandler: link.hproduct\n\t\t}\n\t],\n\tslideshowPagerClick: [\n\t\t{\n\t\t\thandler: slideshow.pagerClick\n\t\t}\n\t],\n\tvideoGalleryFacetBrowseChange: [\n\t\t{\n\t\t\t// this handles video gallery facet browse changes coming from v9/widgets/video/gallery/v2/js/widget.js\n\t\t\t// not sure why the $pageBody.on('change'... below is not noticing the DOM element changes\n\t\t\thandler: (_event, originalEvent) => form.change(originalEvent)\n\t\t}\n\t],\n\t'ddc-mega-menu-nav-ajax-load-complete': [\n\t\t{\n\t\t\t// Capture forms on dynamically loaded content\n\t\t\t// ajaxDialogShown: htdocs/v9/media/js/ddc/v1/modules/dialog.js\n\t\t\thandler: handleDynamicForms.bind(undefined, win)\n\t\t},\n\t\t{\n\t\t\t// \"Temporary\" (5 year old) solution for skipping event.preventDefault which sometime triggers from the\n\t\t\t// Adobe Tag Manager script causing mega menu forms to be submitted twice. :-(\n\t\t\thandler: ({ target }) => {\n\t\t\t\t$(target).on(\n\t\t\t\t\t'click submit',\n\t\t\t\t\tgetSelectorsToHandle(win).formSubmission,\n\t\t\t\t\tasync (event) => {\n\t\t\t\t\t\tconst eventObjects = await form.submission(event);\n\t\t\t\t\t\teventObjects?.forEach((eventObject) => {\n\t\t\t\t\t\t\tpushEvent(win, eventObject);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t],\n\tajaxDialogShown: [\n\t\t{\n\t\t\t// Capture forms on dynamically loaded content\n\t\t\t// ajaxDialogShown: htdocs/v9/media/js/ddc/v1/modules/dialog.js\n\t\t\thandler: handleDynamicForms.bind(undefined, win)\n\t\t}\n\t],\n\tddcEvent: [\n\t\t{\n\t\t\t/*\n\t\t\tGeneric listener so we can call DDC Events from other places.\n\t\t\tMust provide the eventType in the ddcEventData object.\n\t\t\tex.\n\t\t\t{\n\t\t\t\teventType: DDC.dataLayer.events.form.confirmation\n\t\t\t}\n\n\t\t\twe probably want to update this so that additional arguments can be\n\t\t\tpassed to the called functions\n\t\t*/\n\t\t\thandler: handleDDCEvent\n\t\t}\n\t],\n\ttrackEvent: [\n\t\t{\n\t\t\t// handles trackEvent triggers so that we can use that data for generating DDC events\n\t\t\thandler: handleTrackEvent.bind(undefined, win)\n\t\t}\n\t]\n});\n\nexport default getDocumentOnHandlers;\n","/**\n *\n * @param {fn} handler The event handler function to call\n * @param {*} target The HTMLElement that was interacted with to trigger the event\n * @param {*} e The event object from the triggered event\n * @param {*} args Additional arguments triggered with the event\n * @returns An object containing eventObjects and eventTypes for the called event.\n * @example\n * // return value\n * {\n *\t\teventObjects: [eventObject,eventObject],\n *\t\t// Set of eventTypes for the handled event.\n *\t\t// Most like this will only have one thing...but support is there for multiple to be returned.\n *\t\teventTypes: ['ddc.link.generic']\n * }\n * // What is an eventObject?\n * {\n * \teventType: 'ddc.link.generic',\n * \teventData: {\n * \t\titem1: 'item1'\n * \t}\n * }\n */\nconst getEventObjects = async (handler, args) => {\n\tconst eventObjects = [];\n\tconst eventObject = await handler(...args);\n\n\tif (eventObject) {\n\t\tif (Array.isArray(eventObject)) {\n\t\t\t// form onPage returns an array\n\t\t\teventObject.forEach((eventObj) => {\n\t\t\t\teventObjects.push(eventObj);\n\t\t\t});\n\t\t} else {\n\t\t\teventObjects.push(eventObject);\n\t\t}\n\t}\n\n\treturn eventObjects;\n};\n\nexport default getEventObjects;\n","import pushEvent from '../pushEvent';\nimport getEventObjects from './getEventObjects';\n\nconst handleDocumentOnEvent = async (win, args, selector, handler) => {\n\tconst eventObjectsToPush = [];\n\tconst eventObjects = await getEventObjects(handler, args);\n\teventObjects.forEach((eventObject) => {\n\t\teventObjectsToPush.push(eventObject);\n\t});\n\n\teventObjectsToPush.forEach((eventObject) => {\n\t\tpushEvent(win, eventObject);\n\t});\n};\n\nexport default handleDocumentOnEvent;\n","import getSelectorsToHandle from './selectorsToHandle';\nimport getSelectorOnHandlers from './getSelectorOnHandlers';\nimport getDocumentOnHandlers from './getDocumentOnHandlers';\nimport handleDocumentOnEvent from './handleDocumentOnEvent';\nimport pushEvent from '../pushEvent';\nimport getEventObjects from './getEventObjects';\n\n/**\n * Attach a handler.handler on the $attachPoint for the handler.event\n * Calls pushEvent with the returned eventObject from the handler\n *\n * @param {jQuery object} $attachPoint Where to attach the handlers\n * @param {object} handler A object with an event and handler property.\n * @example\n * hander = {\n * \tevent: 'click', // string\n * \thandler: win.DDC.dataLayer.events.form.initiation // function\n * }\n */\nconst attach = ($attachPoint, { event, handler }, win) => {\n\t$attachPoint.on(event, async (...args) => {\n\t\tconst eventObjects = await getEventObjects(handler, args);\n\t\teventObjects.forEach((eventObject) => {\n\t\t\tpushEvent(win, eventObject);\n\t\t});\n\t});\n};\n\nconst attachDocumentOnHandlers = (win, document, events) => {\n\tconst pageBodyOnHandlers = getDocumentOnHandlers(win, events);\n\n\tObject.entries(pageBodyOnHandlers).forEach(([eventType, handlers]) => {\n\t\thandlers.forEach(({ selectorKey, handler }) => {\n\t\t\tconst selector = getSelectorsToHandle(win)[selectorKey];\n\t\t\tconst onArgs = selector ? [eventType, selector] : [eventType];\n\n\t\t\t$(document).on(...onArgs, (...args) => {\n\t\t\t\thandleDocumentOnEvent(win, args, selector, handler);\n\t\t\t});\n\t\t});\n\t});\n};\n\nconst attachHandlers = (win, document) => {\n\tconst { DDC } = win;\n\tconst { events } = DDC.dataLayer;\n\n\tattachDocumentOnHandlers(win, document, events);\n\n\tgetSelectorOnHandlers(events).forEach(({ event, selector, handler }) => {\n\t\tattach(\n\t\t\t$(getSelectorsToHandle(win)[selector]),\n\t\t\t{\n\t\t\t\tevent,\n\t\t\t\thandler\n\t\t\t},\n\t\t\twin\n\t\t);\n\t});\n};\n\nexport default attachHandlers;\n","import pushEvent from '../pushEvent';\n\n/**\n *\n * @param {*} win The window object\n * @param {*} document The document object\n * @param {*} events The event functions that return a payload that gets passed to pushEvent\n *\n * This function handles a special case where event.stopPropagation is used in ws-navigation and\n * ws-tracking is unable to see events from the widget.\n * ws-navigation fires a special ws-tracking-nav-event which we can use to invoke ws-tracking events\n */\nconst handleWsTrackingEventListener = (win, document, events) => {\n\tconst wsTrackingNavEvents = {\n\t\tlinkClick: 'a[href],a[data-href],button',\n\t\thproductClick:\n\t\t\t'[data-showroom-listing-vehicle-id],[data-modelselector-vehicle-id]',\n\t\tnavClick: '[data-navigation-id]'\n\t};\n\tdocument.addEventListener('ws-tracking-nav-event', ({ detail }) => {\n\t\tconst { event: { nativeEvent, nativeEvent: { target } = {} } = {} } =\n\t\t\tdetail;\n\n\t\tObject.entries(wsTrackingNavEvents).forEach(([type, test]) => {\n\t\t\tconst el = target.querySelector(test) || target.closest(test);\n\t\t\tif (el) {\n\t\t\t\tconst event = {\n\t\t\t\t\t// link.clicked uses currentTarget and we need the element that matches the selectors above\n\t\t\t\t\tcurrentTarget: el,\n\t\t\t\t\toriginalEvent: nativeEvent,\n\t\t\t\t\ttimeStamp: nativeEvent.timeStamp\n\t\t\t\t};\n\n\t\t\t\tif (type === 'linkClick') {\n\t\t\t\t\tpushEvent(win, events.link.clicked(event));\n\t\t\t\t} else if (type === 'hproductClick') {\n\t\t\t\t\tpushEvent(win, events.link.hproduct(event));\n\t\t\t\t} else if (type === 'navClick') {\n\t\t\t\t\tpushEvent(win, events.link.navigationClick(event));\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n};\n\nexport default handleWsTrackingEventListener;\n","/* eslint-disable max-len */\n\nimport { namespace } from 'wsm-tagging-utils';\nimport dialogAjaxContentLoaded from '../../events/dialog/ajaxContentLoaded';\nimport dialogPublishDialogAction, {\n\tCLOSED,\n\tOPENED\n} from '../../events/dialog/publishDialogAction';\nimport formChange from '../../events/form/change';\nimport formConfirmation from '../../events/form/confirmation';\nimport formInitiation from '../../events/form/initiation';\nimport formOnPage from '../../events/form/onPage';\nimport formPaymentCalcInit from '../../events/form/paymentCalcInit';\nimport formSlideChange from '../../events/form/slideChange';\nimport formSubmission from '../../events/form/submission';\nimport linkClickToCall from '../../events/link/clickToCall';\nimport linkClicked from '../../events/link/clicked';\nimport linkCenterClicked from '../../events/link/centerClicked';\nimport linkCompare from '../../events/link/compare';\nimport linkGetDirections from '../../events/link/getDirections';\nimport linkHproduct from '../../events/link/hproduct';\nimport linkIncentive from '../../events/link/incentive';\nimport linkNavigationClick from '../../events/link/navigationClick';\nimport linkRecommendedVehicle from '../../events/link/recommendedVehicle';\nimport linkShare from '../../events/link/share';\nimport linkSocialHeader from '../../events/link/socialHeader';\nimport linkVehicleCompare from '../../events/link/vehicleCompare';\nimport maps from '../../events/maps/maps';\nimport pin from '../../events/map/pin';\nimport pageFilterSearch from '../../events/page/filterSearch';\nimport pageFilterSearchClick from '../../events/page/filterSearchClick';\nimport pageTypedSearch from '../../events/page/typedSearch';\nimport pageTypedSearchInit from '../../events/page/typedSearchInit';\nimport pageVehicleDetailView from '../../events/page/vehicleDetailView';\nimport pageView from '../../events/page/view';\nimport slideshowClick from '../../events/slideshow/click';\nimport slideshowPagerClick from '../../events/slideshow/pagerClick';\nimport videoMilestonesReport from '../../events/video/milestonesReport';\nimport videoMilestonesTrack from '../../events/video/milestonesTrack';\nimport getSelectorsToHandle from './selectorsToHandle';\nimport attachHandlers from './attachHandlers';\nimport pushEvent from '../pushEvent';\nimport handleWsTrackingEventListener from './handleWsTrackingEventListener';\n\nconst initDataLayerEvents = async (win) => {\n\tnamespace(win, 'DDC.dataLayer.events');\n\n\tconst {\n\t\tDDC,\n\t\tDDC: {\n\t\t\tdataLayer,\n\t\t\tdataLayer: { events }\n\t\t}\n\t} = win;\n\n\tevents.wsTracking = true;\n\n\tif (win.$) {\n\t\tconst $pageBody = $('body');\n\n\t\tnamespace(win, 'confirmation', dataLayer);\n\t\tnamespace(win, 'events', dataLayer);\n\t\tnamespace(win, 'form', events);\n\t\tnamespace(win, 'slideshow', events);\n\t\tnamespace(win, 'link', events);\n\t\tnamespace(win, 'dialog', events);\n\t\tnamespace(win, 'page', events);\n\t\tnamespace(win, 'video', events);\n\t\tnamespace(win, 'map', events);\n\t\tnamespace(win, 'milestones', events.video);\n\t\tnamespace(win, 'video', dataLayer);\n\n\t\t// prettier-ignore\n\t\t(function prettierIgnore(){\n\t\t\tevents.dialog.ajaxContentLoaded = dialogAjaxContentLoaded.bind(undefined,win);\n\t\t\tevents.dialog.closed = dialogPublishDialogAction.bind(undefined, win, CLOSED);\n\t\t\tevents.dialog.opened = dialogPublishDialogAction.bind(undefined, win, OPENED);\n\t\t\tevents.dialog.publishDialogAction = dialogPublishDialogAction;\n\t\t\tevents.form.change = formChange.bind(undefined, win);\n\t\t\tevents.form.confirmation = formConfirmation.bind(undefined, win, document);\n\t\t\tevents.form.onPage = formOnPage.bind(undefined, win);\n\t\t\tevents.form.slideChange = formSlideChange;\n\t\t\tevents.link.recommendedVehicle = linkRecommendedVehicle.bind(undefined, win);\n\t\t\tevents.link.vehicleCompare = linkVehicleCompare.bind(undefined, win);\n\t\t\tevents.maps = maps;\n\t\t\tevents.map.pin = pin.bind(undefined, win, document);\n\t\t\tevents.page.filterSearch = pageFilterSearch.bind(undefined, win);\n\t\t\tevents.page.filterSearchClick = pageFilterSearchClick;\n\t\t\tevents.page.vehicleDetailView = pageVehicleDetailView.bind(undefined, win);\n\t\t\tevents.page.view = pageView.bind(undefined, win);\n\t\t\tevents.slideshow.pagerClick = slideshowPagerClick.bind(undefined, win);\n\t\t\tevents.video.milestones.complete = videoMilestonesReport.bind(undefined, 'complete');\n\t\t\tevents.video.milestones.report = videoMilestonesReport;\n\t\t\tevents.form.initiation = formInitiation.bind(undefined, win);\n\t\t\tevents.form.paymentCalcInit = formPaymentCalcInit;\n\t\t\tevents.form.submission = formSubmission.bind(undefined, win);\n\t\t\tevents.link.clickToCall = linkClickToCall;\n\t\t\tevents.link.clicked = linkClicked.bind(undefined, win);\n\t\t\tevents.link.centerClicked = linkCenterClicked.bind(undefined, win);\n\t\t\tevents.link.compare = linkCompare.bind(undefined, win);\n\t\t\tevents.link.getDirections = linkGetDirections;\n\t\t\tevents.link.hproduct = linkHproduct.bind(undefined, win, document);\n\t\t\tevents.link.incentive = linkIncentive.bind(undefined, win, document);\n\t\t\tevents.link.navigationClick = linkNavigationClick.bind(undefined, win);\n\t\t\tevents.link.share = linkShare;\n\t\t\tevents.link.socialHeader = linkSocialHeader;\n\t\t\tevents.page.typedSearch = pageTypedSearch.bind(undefined, win);\n\t\t\tevents.page.typedSearchInit = pageTypedSearchInit;\n\t\t\tevents.slideshow.click = slideshowClick;\n\t\t\tevents.video.milestones.track = videoMilestonesTrack.bind(undefined, win);\n\t\t\tevents.video.play = videoMilestonesTrack.bind(undefined,win);\n\t\t})();\n\n\t\t// this creates win.DDC.dataLayer.events.selectors = {} if it doesn't exist\n\t\t// if it does exist then it is left as is\n\t\tnamespace(win, 'selectors', events);\n\n\t\t// update win.DDC.dataLayer.events.selectors with the selectorsToHandle\n\t\tevents.selectors = {\n\t\t\t...win.DDC.dataLayer.events.selectors,\n\t\t\t...getSelectorsToHandle(win)\n\t\t};\n\n\t\t// just a shortcut for selectors.xxxx you will see below\n\t\tconst { selectors } = events;\n\n\t\thandleWsTrackingEventListener(win, document, events);\n\n\t\t$(document).on('marker-clicked-google-maps', (e, marker) => {\n\t\t\tpushEvent(win, events.map.pin(e, marker.infoClass));\n\t\t});\n\n\t\tattachHandlers(win, document);\n\n\t\t// Page view events should fire on page document ready.\n\t\tpushEvent(win, events.page.view());\n\n\t\t// the setTimeout pattern you see here is a technique to break up long running tasks\n\t\tsetTimeout(() => {\n\t\t\tpushEvent(win, events.page.vehicleDetailView());\n\t\t}, 0);\n\t\tsetTimeout(() => {\n\t\t\tpushEvent(win, events.page.filterSearch());\n\t\t}, 0);\n\t\tsetTimeout(() => {\n\t\t\tpushEvent(win, events.page.typedSearch());\n\t\t}, 0);\n\n\t\tsetTimeout(async () => {\n\t\t\tif (DDC.dataLayer.page.pageInfo.isConfirm) {\n\t\t\t\tconst confirmationObject = await events.form.confirmation(\n\t\t\t\t\tundefined,\n\t\t\t\t\tDDC.dataLayer.page.pageInfo.pageName\n\t\t\t\t);\n\t\t\t\tpushEvent(win, confirmationObject);\n\t\t\t}\n\t\t}, 0);\n\n\t\tsetTimeout(() => {\n\t\t\tif ($pageBody.find(selectors.mapTypeId).length > 0) {\n\t\t\t\tpushEvent(win, events.maps());\n\t\t\t}\n\t\t}, 0);\n\n\t\tsetTimeout(() => {\n\t\t\t// Page Has Form On Load\n\t\t\t$pageBody.find(selectors.formOnPage).each((_index, element) => {\n\t\t\t\tpushEvent(win, events.form.onPage(element));\n\t\t\t});\n\t\t}, 0);\n\t}\n};\n\nexport default initDataLayerEvents;\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t((e=\"undefined\"!=typeof globalThis?globalThis:e||self).WsmTaggingUtils={})}(this,(function(e){\"use strict\";const t=e=>e.trim().replace(/ {2}|[\\t\\n\\r]/gm,\"\"),n=(e,t,o,r,i)=>{const s=[...e];return Object.entries(o).forEach((e=>{let[o,a]=e;const l=a,c=(e=>null==e||!e.trim())(t)?o:`${t}.${o}`;\"function\"==typeof l?(void 0===i||i(c,l))&&s.push(l):r&&n(s,c,l,r,i)})),s},o=Object.freeze({SPECIALS_EVENT:\"specialsEvent\",THIRD_PARTY_USER_EVENT:\"thirdPartyUserEvent\",TRACK_EVENT:\"trackEvent\",WIDGET_USER_EVENT:\"widgetUserEvent\"}),r=(e,t,n)=>{if(void 0===t)throw new Error(\"Invalid class name\");const o=t.split(\".\");if(\"\"===o[0])throw new Error(\"Invalid class name\");for(void 0===n&&(n=e);o.length>0;){if(void 0===(n=n[o.shift()]))break}if(void 0!==n&&\"function\"!=typeof n)throw new Error(`${t} is not a class definition`);return n};e.createElement=e=>{const n=document.createElement(\"template\");return n.innerHTML=t(e),n.content.firstChild},e.enumerate=(e,t,o,r)=>{let i,s;if(void 0===t)throw new Error(\"Invalid namespace\");const a=t.split(\".\");if(\"\"===a[0])throw new Error(\"Invalid namespace\");void 0===r&&(i=e);const l=(d=\"*\",-1!==(c=t).indexOf(d,c.length-d.length));var c,d;if(l){if(a.pop(),0===a.length&&i===e)throw new Error(\"Wildcard enumeration window scope not allowed\");s=a.join(\".\")}for(;a.length>0;){const e=a.shift();if(i=i[e],void 0===i)throw new Error(`Invalid namespace: ${e} not found in ${s}`)}return n([],s,i,l,o)},e.extend=(e,t)=>{e.prototype=Object.create(t.prototype),e.prototype.constructor=e},e.globalConstants=o,e.lookup=r,e.namespace=(e,t,n,o)=>{let r=n,i=o;if(void 0===t)throw new Error(\"Invalid namespace name\");void 0===r&&(r=e),void 0===o&&\"function\"==typeof r&&(i=r,r=e);const s=t.split(\".\");if(\"\"===s[0])return void 0!==i&&i.call(i,r),r;for(;s.length>0;){const e=s.shift();void 0===r[e]&&(r[e]={}),r=r[e]}return void 0!==i&&i.call(i,r),r},e.pushToFirehose=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;if(Math.ceil(100*Math.random())<=t){const{element:t,...n}=(null==e?void 0:e.eventData)||{},o=\"/api/widget/ws-tagging/firehose\",r={method:\"POST\",headers:{\"Content-Type\":\"application/json\"},body:JSON.stringify({...e,...Object.keys(n).length&&{eventData:n}})};fetch(o,r).then((e=>e.json())).then((e=>{})).catch((e=>{}))}},e.readyHTMLForParse=t,e.resolve=(e,t,n)=>{const o=r(e,t,n);if(void 0===o)throw new Error(`${t} not found`);return o},Object.defineProperty(e,\"__esModule\",{value:!0})}));\n//# sourceMappingURL=umd.js.map\n"],"names":["form","hiddenFieldName","field","defaultValue","additionalAttributes","querySelector","attrs","Object","entries","map","key","value","join","createElement","appendChild","eventMap","eventHasRun","event","timeStamp","generateKey","getEventHasRun","setEventHasRun","url","parser","document","href","pathname","match","obj","Array","includes","constructor","length","DDC_DIALOG_AJAXCONTENTLOADED","name","path","$content","eventObject","DDC","dialogs","$element","hasForm","find","isValidUrlPath","isEmpty","attr","eventType","eventData","element","CLOSED","OPENED","win","action","target","querySelectorAll","forEach","dialog","removeAttribute","closest","setAttribute","pageName","dataLayer","page","pageInfo","dialogTitle","findDialogTitle","trackingId","dataset","formTrackingId","label","nodeName","$","siblings","text","vehicles","vehicle","getTextContent","childNodes","item","textContent","previousElementSibling","firstElementChild","trim","regex","pageWidgets","undefined","pageWidget","test","getFieldValue","fieldName","formTrackingName","uuid","initiatingClickText","localStorage","getItem","currentTime","Date","getTime","customFormId","formTitle","getFormTitle","isSRP","widgetIsPresent","trackingTags","findVehicleByProperty","isLead","isModal","modal","type","classList","contains","isFacetBrowse","isSearchLeadForm","isSelect","tagName","toUpperCase","isValidTag","WidgetData","formChangeTypes","formEventId","linkType","getFormEventData","section","getSection","customLinkLabel","getLinkLabel","trackingSection","selectedOption","options","selectedIndex","selectedText","firstOptionText","selectedValue","visibleSelects","filter","each","_index","val","labels","confirmation","fields","info","lookup","replace","prop","formFieldHasValue","elements","CAIWalletConfigValue","window","getSiteProperty","CAIWalletConfig","JSON","parse","interactions","hasUpdatedWallet","hasOpenedWallet","pageAliasMapping","matcher","data","pageType","pageAliasIn","mapping","pageAlias","DDC_FORM_CONFIRMATION","getInputFieldValue","$form","attrVal","async","doc","eventCategory","dataLayerConfirmation","submissionTimestamp","getUrlParams","piiData","Promise","resolve","interval","timeout","setTimeout","clearInterval","setInterval","confirmationData","fieldsTrimmedLowerCase","clearTimeout","elapsedTime","parseInt","keys","fromVdp","fromVlp","params","preferredContact","pixallPageType","mapPageAlias","userSessionId","validate","zip","getPIIExistence","flags","id","formEventIds","indexOf","hasStoredFormEventId","wsTrackNrBlockedFormConfirmation","push","stringify","setItem","storeFormEventId","sessionStorage","formVehicleModel","removeItem","vehicleObj","clickPathString","split","clickPath","wsTrackNrClickPathMissing","mywallet","hasMyWalletInteraction","newrelic","addPageAction","confirmationPageAlias","confirmationPagePath","pagePath","dealershipName","dealership","formLocation","formPageAlias","formPagePath","referrerPageAlias","referrerPagePath","referrer","referrerPixallPageType","source","DDC_FORM_INITIATION","currentTarget","formEventData","eventMapId","formTrackingType","formInitiationTime","activeElement","getAttribute","activeElementTag","toLowerCase","randomUUID","crypto","bind","getRandomValues","rnds8","Uint8Array","rng","Error","byteToHex","i","toString","slice","unsafeStringify","arr","offset","buf","rnds","random","enableLogs","URLSearchParams","location","search","get","console","log","formEventIdField","uuidv4","actionURL","formActionUrl","formActionParams","set","str","innerHTML","readyHTMLForParse","content","firstChild","sessionId","TrackedInfo","USER_SESSION_ID","sessionReferer","SESSION_REFERRER","userSessionIdFormField","walletData","parseCurrency","n","num","currencyOptions","style","currency","minimumFractionDigits","maximumFractionDigits","parseFloat","toLocaleString","creditRange","a","b","c","d","e","budget","creditType","dealType","downPayment","loanTerm","monthlyBudget","tradeIn","format","concat","walletConfigKey","createOrUpdateHiddenField","formatCAIWallet","cookiesForExtraInfo","paramsForExtraInfo","cookieNames","getKeysForExtraInfo","paramNames","mappedCookieName","cookieName","cookieValue","Cookies","param","paramValue","formatMyCars","stockNumber","vehicleTitle","myCarsKey","trackedCount","savedCount","myCarsUserData","tracked","newSave","customFieldKey","customFieldValue","DDC_FORM_ONPAGE","setFormSessionId","offsetParent","generateUuid","injectCAIWalletConfig","injectMyCars","injectExtraInfo","widgetId","handle","values","toISOString","fieldLabel","parents","$elements","invalidFields","$errors","next","cleanFieldLabel","getFieldLabel","hasClass","validationMessage","fieldVal","piiFields","standardize","shaHash","message","msgUint8","TextEncoder","encode","hashBuffer","subtle","digest","from","padStart","parameterMap","pii","piiTrimmedLowerCase","vals","valsTrimmedLowerCase","fieldValue","piiField","startsWith","getHashedPii","all","then","resolvedVals","index","trackedData","getTrackedAttributesString","FormData","ssnField","hasShortSsnField","pattern","setCustomAttribute","shiftSessionId","correlationId","isVdp","isVlp","eventObjects","fromTrackingType","site","siteInfo","dealerId","default","hertzDefault","maxClickpathCount","clickPathValue","click","viewType","timestamp","injectClickPath","maxClickPathCount","injectFormTrackingAttributes","setFinanceFormSsnFieldLogging","getSubmissionTimestamp","ctaText","validator","fieldsToUpdateOrCreate","typedSearchContent","checkValidity","getInvalidFields","getInputs","getInvalidFieldsHTML5","injectShiftSessionId","injectUniteCorrelationId","createOrUpdateHiddenFields","formData","hashPii","hashedPii","formConfirmation","firstName","lastName","email","street","firstNameLowerCase","lastNameLowerCase","emailLowerCase","streetLowerCase","confirmationEvent","DDC_LINK_CLICKTOCALL","clickToCallDepartment","phoneNumber","getHexBackgroundColor","backgroundColor","Element","getComputedStyle","hexValue","Math","round","rgba","getCtaIndex","ctaElement","ctaClass","Number","pop","delimiterString","result","findTextNodes","current","child","isTextNode","nodeType","isString","nodeValue","isEmptyString","isNewLineCharacter","isHiddenText","parentNode","className","getPropertyValue","linkText","getAllDescendantTextNodeValues","$img","hasImageSrcText","DDC_LINK_GENERIC","originalEvent","some","el","department","departmentId","containsImage","dataClickToCall","clickToCall","dataClickToCallId","clickToCallId","dataTrackingDept","wsTrackingDepartment","dataPhoneRef","phoneRef","getLinkText","ctaIndex","isIncentivePanel","isSrpVehicleCta","dataIncentiveId","dataIncentiveName","isHamburgerMenu","button","clicked","clickType","DDC_LINK_COMPAREPAGECLICK","vin","bodyStyle","exteriorColor","make","model","modelYear","position","containedImg","year","altText","DDC_LINK_GETDIRECTIONS","DDC_LINK_HPRODUCTCLICK","findWidgetName","indexPosition","inventoryType","internetPrice","msrp","link","hproductInternetPrice","hproductMsrpValue","$parents","atob","error","DDC_LINK_OFFERCLICK","modules","trigger","offerId","offerName","isIncentiveModal","DDC_LINK_NAVCLICK","client","isMobile","isParentLink","isChildLink","isHeadingLink","navigationPosition","menuLinkText","not","parent","first","hasChildren","toggle","megaMenu","DDC_LINK_RECOMMENDEDVEHICLE","DDC_LINK_SOCIALSHARE","service","DDC_LINK_SOCIALHEADER","checked","container","hproduct","attributes","getElementAttributes","DDC_MAP_PIN","infoClass","vehicleResultCount","queryFacets","isNoResults","isShowroom","resultCount","chart","sliderInput","maxVal","minVal","selectedValuesArr","isBreadcrumb","facets","facetsCopy","valArr","valIndex","splice","DDC_INVENTORY_FILTERSEARCH_CLICK","facetContainer","isSlider","checkedInputs","sliders","getNameAndValueFromSlider","elementRange","sliderData","getFacetsForBreadcrumbs","clickedFacetName","clickedFacetValue","typedSearchInitiated","elementValue","input","alias","DDC_SLIDESHOW_CLICK","_event","videoMilestone","fileType","currentSrc","autoplay","hasAttribute","videoSource","videoDuration","duration","overrides","inputValue","chr","len","hash","charCodeAt","abs","getHashCode","progress","video","play","videoMilestonesReport","selectorsToHandle","compareId","getDirectionsForm","getDirections","formInitiation","formOnPage","formPaymentCalc","formSubmission","incentiveId","incentiveLabel","linkClick","linksShareId","mapTypeId","navigationId","specialsIncentiveId","specialsEvents","slideType","socialHeaderButtonId","typedSearchInit","vehicleCompare","incentiveFacet","searchFacet","searchFacetVlpSlider","formChange","selector","handler","milestones","track","complete","getSelectorsToHandle","onPage","trackEventIgnoreWidgetNames","trackEventIgnoreEventNames","additionalData","events","eventName","widgetName","isDesktop","recommendedVehicle","ddcEventData","slideshow","selectorKey","initiation","paymentCalcInit","submission","compare","incentive","share","navigationClick","socialHeader","filterSearchClick","mousedown","centerClicked","change","focusin","submit","dialogopen","opened","slideOpen","ajaxContentLoaded","handleDynamicForms","dialogclose","closed","slideClose","slidechange","slideChange","tabsshow","ui","tab","call","this","ajaxDialogComplete","hproductClick","slideshowPagerClick","pagerClick","videoGalleryFacetBrowseChange","on","pushEvent","ajaxDialogShown","ddcEvent","handleDDCEvent","trackEvent","handleTrackEvent","args","isArray","eventObj","eventObjectsToPush","getEventObjects","pageBodyOnHandlers","getDocumentOnHandlers","handlers","onArgs","handleDocumentOnEvent","attachDocumentOnHandlers","getSelectorOnHandlers","$attachPoint","attach","wsTrackingNavEvents","navClick","addEventListener","detail","nativeEvent","namespace","wsTracking","$pageBody","dialogAjaxContentLoaded","dialogPublishDialogAction","publishDialogAction","formSlideChange","linkRecommendedVehicle","linkVehicleCompare","maps","pin","filterSearch","pageFilterSearch","pageFilterSearchClick","vehicleDetailView","pageVehicleDetailView","view","pageView","report","formPaymentCalcInit","linkClickToCall","linkClicked","linkCenterClicked","linkCompare","linkGetDirections","linkHproduct","linkIncentive","linkNavigationClick","linkShare","linkSocialHeader","typedSearch","pageTypedSearch","pageTypedSearchInit","slideshowClick","videoMilestonesTrack","selectors","handleWsTrackingEventListener","marker","attachHandlers","isConfirm","confirmationObject","t","o","r","s","l","freeze","SPECIALS_EVENT","THIRD_PARTY_USER_EVENT","TRACK_EVENT","WIDGET_USER_EVENT","shift","enumerate","extend","prototype","create","globalConstants","pushToFirehose","arguments","ceil","method","headers","body","fetch","json","catch","defineProperty","exports"],"sourceRoot":""}