{"version":3,"file":"bundle.884.5c237e5989d4e22af18f7d5f24c3e57f.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/injectExtraInfoParams.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<input type=\"hidden\" name=\"${hiddenFieldName}\" ${attrs}/>\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`<input type='hidden' name='userSessionId' class='hidden' data-id value=${sessionId}>`\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`<input type='hidden' name='userSessionReferrer' class='hidden' data-id value=${sessionReferer}>`\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 getParamsForExtraInfo from './getParamsForExtraInfo';\n\n/**\n *\n * @param {Object} win\n * @param {HTMLFormElement} form\n * @param {Object} prefParams\n */\nconst injectExtraInfoParams = (win, form, prefParams, isSubmission = false) => {\n\tconst paramNames = getParamsForExtraInfo(win, prefParams);\n\tconst params = {};\n\tparamNames.forEach((paramName) => {\n\t\tconst paramValue = win.sessionStorage.getItem(\n\t\t\t`extra-info-param-${paramName}`\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=${paramName.toUpperCase()}=1=${paramName}`,\n\t\t\t\tparamValue\n\t\t\t);\n\t\t\tparams[paramName] = paramValue;\n\t\t}\n\t});\n\twindow?.newrelic?.addPageAction('utm_url_params_injected', {\n\t\tsource: 'ws-tracking',\n\t\teventName: 'utm_url_params_injected',\n\t\tparamsForExtraInfo: params,\n\t\twhy: 'paramsForExtraInfo pref',\n\t\tisSubmission\n\t});\n};\nexport default injectExtraInfoParams;\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 injectExtraInfoParams from '../../utils/injectExtraInfoParams';\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': { 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 & injectExtraInfoParams 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\tinjectExtraInfoParams(win, form, paramsForExtraInfo);\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 * // <input name='example' value=''></input> // field will be created or updated\n * data: {\n * \t'example': 'exampleval'\n * }\n * // <input name='example' value='exampleval'></input> // 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 injectExtraInfoParams from '../../utils/injectExtraInfoParams';\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': { 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 & injectExtraInfoParams 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\tinjectExtraInfoParams(win, form, paramsForExtraInfo, true);\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","prefParams","isSubmission","paramNames","getParamsForExtraInfo","paramName","paramValue","eventName","paramsForExtraInfo","why","formatMyCars","stockNumber","vehicleTitle","myCarsKey","trackedCount","savedCount","myCarsUserData","tracked","newSave","customFieldKey","customFieldValue","DDC_FORM_ONPAGE","setFormSessionId","offsetParent","generateUuid","injectCAIWalletConfig","injectMyCars","injectExtraInfoParams","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","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":""}