{"version":3,"sources":["cookieHandler.js","idleDeadline.js","requestIdleCallback.js","tagManager.js","dataLayer.js","googleAnalyticsTracker.js","adWordsTracker.js","bingTracker.js","dotTracker.js","pandoraTracker.js","enhancedConversionTracker.js","listHubTracker.js","ga4Configuration.js","ga4Tracker.js","sitespeedTracker.js","segment.js","webStorageHandler.js","tdvTracker.js","idleValue.js","idleQueue.js","eventTracker.js","identityTracker.js","impressionTracker.js","onDemandTracker.js","navigationTiming.js","userCredentials.js","index.js","persona.js","identify.js","deviceCapabilities.js"],"names":["global","NewHomeSource","Modules","previousCookieHandler","cookieHandler","partnerElement","document","getElementById","CookieHandler","createCookie","name","value","days","isPartnerCookie","expires","cookieName","date","Date","setTime","getTime","toGMTString","cookie","eraseCookie","readCookie","searchText","items","split","length","nameLength","cookieFound","index","trim","indexOf","substring","noConflict","window","previousIdleDeadline","IdleDeadline","this","startTime","now","prototype","didTimeout","timeRemaining","Math","max","previousRequestIdleCallback","requestIdleCallback","isRequestIdleCallbackSupported","RequestIdleCallback","cIC","handle","cancelIdleCallback","clearTimeout","cancelIdleCallbackShim","rIC","callback","timeout","deadline","setTimeout","requestIdleCallbackShim","previousTagManager","tagManager","id","documentElement","lang","gtmObject","google_tag_manager","getValue","TagManager","getFromDataLayer","attribute","dataLayer","get","setDataLayerValue","set","dataLayerPush","push","isFromEuropeanCountry","querySelector","eventsType","isCna","isDirectLead","product","getProductsTransactionComplete","data","products","ecommerce","purchase","Array","isArray","event","isDirectLeadTrasactionComplete","some","isDirectRecommendedLead","isDirectRecommendedLeadTrasactionComplete","GoogleAnalyticsObject","params","forEach","eventType","body","dispatchEvent","CustomEvent","detail","triggerOnDemandTracker","Analytics","isNhs","configurations","customDimensionsAttribute","previousModule","GoogleAnalyticsTracker","globalValues","pushToDataLayer","getAttributes","dataset","prefix","startsWith","cleanProperty","replace","charAt","toLowerCase","slice","googlePush","eventCategory","eventAction","eventLabel","eventNoInteraction","eventValue","undefined","nonInteraction","gaTrack","onDemandTracker","self","Object","assign","eventTracker","gaLabelFullUrl","gaEventLabel","location","href","setFullUrlsAsEventLabel","gaEventCategory","gaEventAction","customDimensions","keys","bind","getCustomDimension","gaEventNoInteraction","gaEventLabelEmpty","textContent","cleanCustomDimensions","dimensions","cleanDimensions","dimension","ctaDetail","impressionTrackerSelector","impressionTracker","gaImpressionEventCategory","gaImpressionEventAction","gaImpressionEventLabel","isImpressionGa","gaImpression","identityTracker","form","gaIdentityCategory","gaIdentityAction","gaIdentityLabel","eventTrackerValidator","dataSet","gaEventTracker","onDemandTrackerValidator","identityTrackerValidator","buildTagWithEvent","element","category","action","label","setAttribute","newUserGa","ga_newUser","logNewUser","impressionPrefix","AdWordsTracker","sharedPrefix","google_trackConversion","ids","adWordsImpressionGoogle_conversion_id","labels","adWordsImpressionGoogle_conversion_label","impressionCustomAtributes","i","trackEvent","google_conversion_id","google_conversion_label","google_custom_params","google_remarketing_only","scriptTag","createElement","src","async","type","appendChild","loadTrackConversion","uetq","BingTracker","ec","dotq","DotTracker","projectId","properties","pixelId","qstrings","et","ea","el","imgTemplate","pandoraElementConfig","isPandoraEnable","PandoraTracker","keyAction","requestPixel","image","fragment","createRange","createContextualFragment","remove","pandoraImpressionEvent","pandoraImpressionCategory","pandoraImpressionAction","pandoraImpressionLabel","caller","pandoraIdentity","pandoraIdentityCategory","pandoraIdentityAction","pandoraIdentityLabel","pandoraCategory","pandoraAction","pandoraLabel","pandoraEvent","pandoraEventCategory","pandoraEventAction","pandoraEventLabel","EnhancedConversionTracker","ecData","querySelectorAll","ecIdentityData","ecIdentity","ListHubTracker","loadScriptListHub","logEvent","listHubProviderId","providerId","testkey","testLogging","listingKey","listingNumber","provider","test","submit","eventLh","impresionLhEvent","Ga4Configuration","HomePage","brandPartnerName","brand_partner_name","pageType","page_type","partnerId","partner_id","partnerName","partner_name","userMarketId","userStatus","userZipCode","user","userId","brandPartnerNamePartnerName","gaUserId","googleAnalyticsUserId","time","neustarResponse","referCode","SearchResults","market_id","marketId","market_name","marketName","market_session","marketSession","Details","community_status","communityType","min_price","community_low_price","max_price","community_high_price","trustbuilder_reviews","trustBuilderReviews","is_priced","isPriced","has_isp","hasIsp","is_limited_availability","isLimitedAvailability","primary_image","primary_image_url","brand_name","zip_code","zip","brand_id","builder_corp","builder_name","community_id","communityId","builder_id","community_name","amenities","has_ifp","hasIfp","off_market","offMarket","home_price","home_status","home_type","plan_id","plan_name","county","builder_division","spec_id","price_reduction","BuilderShowcase","getGlobalConfiguration","configurationObj","key","Ga4Tracker","globalConfigurationElement","globalConfiguration","ga4GlobalConfiguration","eventTrackerAttribute","identityTrackerAttribute","impressionTrackerAttribute","shareInfoAttribute","identityUserDataAttribute","identityCheckboxAttribute","identityCheckboxDataAttribute","identityDropdownAttribute","ga4Configuration","eventName","getParameters","parameters","getSharedParameters","shareInfoElement","closest","setCheckboxParamters","parameter","checked","setUserData","setDropdownParameters","selectedIndex","options","text","setDateSliderParameters","ga4IdentityDateSlider","paramsFromHtml","sharedParameters","ga4EventName","identityData","identityCheckboxElements","identityDropdownElements","identityElements","call","ga4ImpressionEventName","ga4IdentityEventName","SitespeedTracker","markStart","LUX","mark","markEnd","measureName","markNameStart","markNameEnd","measure","handler","segment","previousSegment","eventPrefix","identityPrefix","append","entry","setDataAttributeTraits","configurationObject","setAnonymousId","segmentAnonymousId","analytics","anonymousId","cleanEmptyOrNullTraitsBeforeSend","traits","currentTraits","propNames","getOwnPropertyNames","propName","createGlobalTraits","status","globalTraits","timeLapsed","current_page_number","response_version","city","state","code_version","codeBuildeVersion","test_version","abTestsOnThisPage","result_count","Segment","createGlobalIdentifyTraits","globalIdentifyTraits","NeustarSegment","neustar","NeustarZip","z","NeustarYear","y","s","NeustarGender","g","g_client_id","googleAnalyticsClientId","user_id","i_uid","n_zip","n_year","n_gender","n_segment","getTraits","track","propertyName","JSON","parse","stringify","entries","segmentEvent","identityTraits","segmentIdentityData","Name","fullName","first_name","last_name","join","last_event","segmentIdentityEvent","segmentEventEvent","identify","segmentIdentity","impressionTypes","listingTraits","segmentImpressionEvent","segmentImpressionType","Type","filters_applied","includefilters","isNeustarDefined","trackingGlobalTraits","identifyGlobalTraits","isIdentifyEvent","isIdentifyOnly","isNeustarRequired","WebStorageHandler","CONFIGURATION","constants","localStorage","sessionStorage","setItemInStorage","maxAgeInSeconds","storageType","creationDate","setItem","removeItemFromStorage","removeItem","getItemFromStorage","getItem","string","json","e","parseToJson","currentDate","floor","setLocalStorageItem","setSessionStorageItem","removeSessionStorageItem","removeLocalStorageItem","getLocalStorageItem","getSessionStorageItem","tdvTracker","isBasic","TdvTracker","inputSiteRoot","siteRoot","baseUrl","googleEcommercePushUrl","paramsEventLogger","parametersEventMapper","paramsByQueryString","basicListingParameters","getBasicListingParameters","basicParams","param","getParamsToUse","isBasicListing","getTdvAttributeName","datasetAttributeName","createUrl","url","getUrl","parameterSeparator","keysParameters","cleanParameter","replaceAll","position","map","postRequest","successCallback","xhr","XMLHttpRequest","open","setRequestHeader","send","onreadystatechange","readyState","response","logGoogleEcommerceEvent","isMpc","parentCommunity","community","specId","spec","planId","plan","builderName","communitiesIdsList","buildercommunitylist","homesIdsList","homeList","result","eval","eventCode","urlToRequest","getValidParentCommunityId","parentCommunityId","isVisitedMpc","visitedMpcIds","getTdvEventDataset","eventTarget","parentTdvContainer","mergedDataset","tdvEventDatasetAttributesList","fromEntries","getAttribute","tdvDataset","tdvEventLabel","elementIdentity","tdvIdentity","attributes","attr","previousIdleValue","IdleValue","cancelIdleCallbackFunction","requestIdleCallbackFunction","initVariable","init","cancelIdleInit","retryIfNull","setValue","previousIdleQueue","idleQueue","isSafari","safari","pushNotification","shouldYield","minimumTaskTime","scheduleTasksToRun","retry","idleCallbackHandle","runTasks","isDomCompleted","cancelScheduledRun","isProcessing","hasPendingTasks","taskQueue","minTaskTime","taskToRun","shift","isExecuted","task","pushTask","addEventListener","onVisibilityChange","visibilityState","runTasksImmediately","IdleQueue","previousEventTracker","hasBeenAttached","onTouchProperties","startX","startY","distX","distY","inspectEvent","target","inspectedElement","parentElement","tagName","totalHandlers","handlers","validator","queue","eventForget","onTouchStartEvent","changedTouches","pageX","pageY","onTouchEndEvent","abs","onChangeEvent","nodeName","EventTracker","eventsQueue","passive","composed","useCapture","previousIdentityTracker","closestForm","identity","button","reportValidity","cloneNode","IdentityTracker","previousImpressionTracker","mutationObserverOptions","childList","subtree","intersectionObserverOptions","threshold","walkNodeTree","node","elementsAdded","nodeType","impression","childNodesLength","childNodes","childElements","concat","handleMutationsOnViewPort","mutations","elements","currentMutation","isIntersecting","noUnobserve","intersectionObserver","unobserve","trackertElements","selector","count","handleMutationsAsync","mutationsLength","mutation","totalElementsAdded","addedNodes","elementIndex","impressionNodes","currentElement","observe","handleDomMutations","ImpressionTracker","MutationObserver","mutationObserver","IntersectionObserver","previousOnDemandTracker","OnDemandTracker","root","isValidMetricTime","Number","isNaN","schema","dns_lookup","dom_complete","dom_content_loaded","dom_interactive","page_load","render_time","tcp","ttfb","requestAnimationFrame","performanceTiming","performance","getEntriesByType","eventForSegment","domainLookupEnd","domainLookupStart","domComplete","responseStart","domContentLoadedEventEnd","fetchStart","domInteractive","loadEventEnd","connectEnd","connectStart","filter","previousUserCredentialsModule","UserCredentials","isUserLogged","getPartnerName","getBrandPartnerName","getMarketId","getMarketName","getNeustarResponse","startTracking","browsertTimeZone","getTimezoneOffset","utc","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","filtersApplied","filters","googleAnalyticsId","ga","getAll","URLSearchParams","search","userAgent","navigator","language","userCity","userState","userCountry","previousPersonaModule","Persona","pendingEvent","shouldAddEventToQueue","isRequestToSegmentApiEnded","getLocalStorageKeyValue","homespec","homeplan","builder","getItemsToBeSaved","isRemove","elementSaveItem","device","format","number","objectToSave","builderId","source","date_saved","createSaveItemObject","keyLocalStorage","localSavedItems","arrayObjectsUpdated","arrayObjects","elementToFind","consult","getIndexIfExist","exist","splice","updateArrayObject","getLastEvent","lastEvent","saveItems","updatedItem","itemsToUpdate","removeLocalStorage","updateLocalStorage","shouldGetSegmentProfile","lastItemSavedTime","actualDate","handlerQueue","trackIdentifySaveItems","getUserId","urlForSegmentApi","fetch","method","headers","Content-Type","ok","getSegmentProfile","personaInformation","removeEventListener","persona","saved_communities","saved_homes","saved_builders","savedCommunities","savedHomes","savedBuilders","lastLoggedInData","match","getLastLoggedInData","host","toString","savePreferencesInLocalStorage","onPageLoad","formats","webP","mimeType","verifyFormat","elem","getContext","toDataURL","supportedFormats"],"mappings":"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","file":"../segmentbundle-74bc227d39.min.js","sourceRoot":"..","sourcesContent":["(function cookieHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n const previousCookieHandler = global.NewHomeSource.Modules.cookieHandler;\r\n const partnerElement = global.document.getElementById('nhs_partnerID');\r\n\r\n /**\r\n * @constructs NewHomeSource.Modules.cookieHandler\r\n */\r\n function CookieHandler() {\r\n }\r\n\r\n /**\r\n * @public\r\n * createCookie: creates a new cookie for the *.newhomesource.com domain.\r\n *\r\n * @param {string} name of the cookie.\r\n * @param {any} value that will be stored in the cookie.\r\n * @param {number} days of expiration time for the cookie.\r\n * @param {boolean} isPartnerCookie true if the cookie name should include the partner ID information,\r\n * otherwise false.\r\n */\r\n CookieHandler.createCookie = function createCookie(name, value, days, isPartnerCookie) {\r\n let expires = '';\r\n let cookieName = name;\r\n\r\n if (isPartnerCookie && partnerElement) {\r\n cookieName += '_' + partnerElement.value;\r\n }\r\n\r\n if (days) {\r\n const date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n expires = '; expires=' + date.toGMTString();\r\n }\r\n\r\n document.cookie = `${cookieName}=${value}${expires}; path=/;`;\r\n };\r\n\r\n /**\r\n * @public\r\n * eraseCookie: deletes a cookie.\r\n *\r\n * @param {string} name of the cookie to delete.\r\n * @param {boolean} isPartnerCookie true if the cookie name should include the partner ID information,\r\n * otherwise false.\r\n */\r\n CookieHandler.eraseCookie = function eraseCookie(name, isPartnerCookie) {\r\n CookieHandler.createCookie(name, null, -1, isPartnerCookie);\r\n };\r\n\r\n /**\r\n * @public\r\n * readCookie: searches for a cookie and returns its value.\r\n *\r\n * @param {string} name of the cookie to be retrieved.\r\n * @param {boolean} isPartnerCookie true if the cookie name should include the partner ID information,\r\n * otherwise false.\r\n */\r\n CookieHandler.readCookie = function readCookie(name, isPartnerCookie) {\r\n let searchText = name;\r\n\r\n if (isPartnerCookie && partnerElement) {\r\n searchText += '_' + partnerElement.value;\r\n }\r\n\r\n searchText += '=';\r\n\r\n const items = document.cookie.split(';');\r\n const length = items.length;\r\n const nameLength = searchText.length;\r\n let cookieFound = null;\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n if (items[index].trim().indexOf(searchText) === 0) {\r\n cookieFound = items[index];\r\n break;\r\n }\r\n }\r\n\r\n if (!cookieFound) {\r\n return null;\r\n }\r\n\r\n return cookieFound.trim().substring(nameLength);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Modules.cookieHandler to the previous script.\r\n */\r\n CookieHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.cookieHandler = previousCookieHandler;\r\n return CookieHandler;\r\n };\r\n\r\n global.NewHomeSource.Modules.cookieHandler = CookieHandler;\r\n}(window));\r\n","(function idleDeadline(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n const previousIdleDeadline = global.NewHomeSource.Modules.IdleDeadline;\r\n\r\n /**\r\n * @constructs NewHomeSource.Modules.idleDeadline\r\n */\r\n function IdleDeadline() {\r\n this.startTime = Date.now();\r\n }\r\n\r\n /**\r\n * @public\r\n * didTimeout: always false. Method exists to support the interface.\r\n */\r\n IdleDeadline.prototype.didTimeout = function didTimeout() {\r\n return false;\r\n };\r\n\r\n /**\r\n * @public\r\n * timeRemaining: amount of time available after the IdleDeadline was instanced.\r\n */\r\n IdleDeadline.prototype.timeRemaining = function timeRemaining() {\r\n return Math.max(0, 50 - (Date.now() - this.startTime));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n IdleDeadline.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.IdleDeadline = previousIdleDeadline;\r\n return IdleDeadline;\r\n };\r\n\r\n global.NewHomeSource.Modules.IdleDeadline = IdleDeadline;\r\n}(window));\r\n","(function requestIdleCallback(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n if (!global.NewHomeSource.Modules.IdleDeadline) {\r\n return;\r\n }\r\n\r\n const previousRequestIdleCallback = global.NewHomeSource.Modules.requestIdleCallback;\r\n const isRequestIdleCallbackSupported = typeof global.requestIdleCallback === 'function';\r\n\r\n /**\r\n * @private\r\n * cancelIdleCallbackShim: polyfills the cancelIdleCallback.\r\n *\r\n * @param {number} of the ID of the timeout function to cancel.\r\n */\r\n function cancelIdleCallbackShim(handle) {\r\n clearTimeout(handle);\r\n }\r\n\r\n /**\r\n * @private\r\n * requestIdleCallbackShim: polyfills the requestIdleCallback.\r\n *\r\n * @param {function} callback that will run in the next idle period.\r\n */\r\n function requestIdleCallbackShim(callback) {\r\n const deadline = new global.NewHomeSource.Modules.IdleDeadline();\r\n return setTimeout(() => {\r\n callback(deadline);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Modules.requestIdleCallback\r\n */\r\n function RequestIdleCallback() {\r\n }\r\n\r\n /**\r\n * @public\r\n * cIC: returns a cancelIdleCallback function.\r\n *\r\n * @param {any} handle that references the requestIdleCallback.\r\n */\r\n RequestIdleCallback.cIC = function cIC(handle) {\r\n return isRequestIdleCallbackSupported ? global.cancelIdleCallback(handle) : cancelIdleCallbackShim(handle);\r\n };\r\n\r\n /**\r\n * @public\r\n * rIC: returns a requestIdleCallback function.\r\n *\r\n * @param {function} callback to execute in an idle period.\r\n * @param {number} timeout max time to wait before running the callback.\r\n */\r\n RequestIdleCallback.rIC = function rIC(callback, timeout) {\r\n return isRequestIdleCallbackSupported\r\n ? global.requestIdleCallback(callback, timeout)\r\n : requestIdleCallbackShim(callback);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n RequestIdleCallback.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.requestIdleCallback = previousRequestIdleCallback;\r\n return RequestIdleCallback;\r\n };\r\n\r\n global.NewHomeSource.Modules.requestIdleCallback = RequestIdleCallback;\r\n}(window));\r\n","(function tagManager(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n const previousTagManager = global.NewHomeSource.tagManager;\r\n\r\n const id = document.documentElement.lang === 'en' ? 'GTM-9SD7' : 'GTM-KWLWXZ';\r\n\r\n const gtmObject = {\r\n value: global.google_tag_manager && global.google_tag_manager[id],\r\n get getValue() {\r\n this.value = this.value || (global.google_tag_manager && global.google_tag_manager[id]);\r\n return this.value;\r\n }\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.Modules.tagManager\r\n */\r\n function TagManager() {\r\n }\r\n\r\n /**\r\n * @public\r\n * getFromDataLayer: queries the Google Tag Manager data layer and returns the value associated.\r\n *\r\n * @param {string} attribute name of the value being queried.\r\n */\r\n TagManager.getFromDataLayer = function getFromDataLayer(attribute) {\r\n return gtmObject.getValue && gtmObject.value.dataLayer.get(attribute);\r\n };\r\n\r\n /**\r\n * @public\r\n * setDataLayerValue: sets the dataLayer value you are providing.\r\n *\r\n * @param {string} attribute name of the value being set.\r\n * @param {string} value to be set.\r\n */\r\n TagManager.setDataLayerValue = function setDataLayerValue(attribute, value) {\r\n if (gtmObject.getValue) {\r\n gtmObject.value.dataLayer.set(attribute, value);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Modules.tagManager to the previous script.\r\n */\r\n TagManager.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.tagManager = previousTagManager;\r\n return TagManager;\r\n };\r\n\r\n global.NewHomeSource.Modules.tagManager = TagManager;\r\n}(window));\r\n","(function handlerDataLayer(global) {\r\n 'use strict';\r\n\r\n if (!global.dataLayer) {\r\n return;\r\n }\r\n\r\n const dataLayerPush = global.dataLayer.push;\r\n const isFromEuropeanCountry = !!document.querySelector('[data-is-europan-country]');\r\n const eventsType = ['BingEvent', 'DotEvent'];\r\n const culture = document.documentElement.lang || 'en';\r\n const isCna = culture === 'es';\r\n\r\n /**\r\n * @private\r\n * isDirectLead: check if product is Direct Lead.\r\n *\r\n * @param {object} product send in ecomerce dataLayer.\r\n * @returns true if have a property name equal to Direct Leads, otherwise false.\r\n */\r\n function isDirectLead(product) {\r\n return product.name === 'Direct Leads';\r\n }\r\n\r\n /**\r\n * @private\r\n * getProductsTransactionComplete:\r\n *\r\n * @param {object} data send to dataLayer.\r\n * @returns Array of products if exist otherwise return an empty array.\r\n */\r\n function getProductsTransactionComplete(data) {\r\n const products = data && data.ecommerce && data.ecommerce.purchase && data.ecommerce.purchase.products;\r\n if (Array.isArray(products) && data.event === 'transactionComplete') {\r\n return products;\r\n }\r\n return [];\r\n }\r\n\r\n /**\r\n * @private\r\n * isDirectLeadTrasactionComplete: verify if the data send to dataLayer contains the:\r\n * event Name: transactionComplete\r\n * product Name: Direct Leads.\r\n * Don't execute in European countries.\r\n *\r\n * @param {object} data send to dataLayer.\r\n * @returns true if the event Name is transactionComplete and have an item in product array\r\n * that cotains the name Direct Leads, otherwise false.\r\n */\r\n function isDirectLeadTrasactionComplete(data) {\r\n const products = getProductsTransactionComplete(data);\r\n if (products.some(isDirectLead)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * isDirectRecommendedLead: check if is Direct Recommended Lead.\r\n *\r\n * @param {object} product send in ecomerce dataLayer.\r\n * @returns true if have a property name equal to Recommended Community Leads, otherwise false.\r\n */\r\n function isDirectRecommendedLead(product) {\r\n return product.name === 'Recommended Community Leads';\r\n }\r\n\r\n /**\r\n * @private\r\n * isDirectLeadTrasactionComplete: verify if the data send to dataLayer contains the:\r\n * event Name: transactionComplete\r\n * product Name: Direct Leads.\r\n * Don't execute in European countries.\r\n *\r\n * @param {object} data send to dataLayer.\r\n * @returns true if the event Name is transactionComplete and have an item in product array\r\n * that cotains the name Direct Leads, otherwise false.\r\n */\r\n function isDirectRecommendedLeadTrasactionComplete(data) {\r\n const products = getProductsTransactionComplete(data);\r\n if (products.some(isDirectRecommendedLead)) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * triggerOnDemandTracker: dispatch the event trackOnDemandEvent\r\n *\r\n * @param {object} event object to be log in dataLayer.\r\n */\r\n function triggerOnDemandTracker(event) {\r\n if (document.body.dispatchEvent) {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: event\r\n }\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * overridePush: override global dataLayer.push.\r\n *\r\n * @param {object} data send to dataLayer.\r\n */\r\n function overridePush(data) {\r\n // GoogleAnalyticsObject is not defined for some ad blockers\r\n if (dataLayerPush && typeof GoogleAnalyticsObject !== 'undefined') {\r\n dataLayerPush(data);\r\n dataLayerPush({\r\n params: null\r\n });\r\n const event = {\r\n isFromEuropeanCountry,\r\n isDirectLead: isDirectLeadTrasactionComplete(data),\r\n isDirectRecommendedLead: isDirectRecommendedLeadTrasactionComplete(data)\r\n };\r\n\r\n if (isCna) {\r\n return;\r\n }\r\n\r\n if (event.isDirectLead || event.isDirectRecommendedLead) {\r\n eventsType.forEach((eventType) => {\r\n event.eventType = eventType;\r\n triggerOnDemandTracker(event);\r\n });\r\n }\r\n }\r\n }\r\n\r\n global.dataLayer.push = overridePush;\r\n}(window));\r\n","/* This module should be the one we keep using for google analytics events\r\n * It uses the logic created by Carlos to handle the events in a performant way.\r\n *\r\n * How to use it: dev should add four data attributes to the element it wants to track:\r\n * data-event='true'\r\n * data-ga-event-category='my event category'\r\n * data-ga-event-action='my event action'\r\n * data-ga-event-label='my event label'\r\n * The data-ga-event-label is optional, if not included, it will use the text of the element.\r\n *\r\n * Data Values for impression tracker:\r\n * data-impression=\"true\"\r\n * data-ga-impression=\"true\"\r\n * data-ga-impression-event-category='event category'\r\n * data-ga-impression-event-action='event action'\r\n * data-ga-impression-event-label= 'event label'\r\n *\r\n * The event tracker listens for the click function,\r\n * if for some reason there's an event.preventDefault that prevents tracking your event,\r\n * add a data-event-type=\"mousedown\" for desktop or data-event-type=\"touchend\" for mobile.\r\n *\r\n * If you need to track a event programatically instead of when clicking an element,\r\n * use the onDemandTracker method instead. Example:\r\n *\r\n * if (global.NewHomeSource.Analytics.onDemandTracker) {\r\n * const myEvent = {\r\n * event: 'GAEvent',\r\n * eventCategory: 'my event category',\r\n * eventAction: 'my event action',\r\n * eventLabel: 'my event label',\r\n * };\r\n *\r\n * global.NewHomeSource.Analytics.onDemandTracker.push(myEvent);\r\n*/\r\n\r\n(function googleAnalyticsTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n /**\r\n * Constant flag to avoid log new user event in wordpress pages.\r\n */\r\n const isNhs = !!global.NewHomeSource.Modules.cookieHandler;\r\n\r\n const configurations = {\r\n customDimensionsAttribute: 'gaDimension'\r\n };\r\n\r\n /*\r\n * Dependencies as\r\n * if (!global.NewHomeSource.MyDependency) {\r\n * return;\r\n * }\r\n */\r\n\r\n const previousModule = global.NewHomeSource.Analytics.GoogleAnalyticsTracker;\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.GoogleAnalyticsTracker\r\n */\r\n function GoogleAnalyticsTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n function pushToDataLayer(data) {\r\n const dataLayer = window.dataLayer;\r\n\r\n if (dataLayer) {\r\n dataLayer.push(data);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * getAttributes: get the attributes that starts with data-ga-dimension\r\n *\r\n * @param {DOMStringMap} dataset properties of the object.\r\n * @param {*} prefix to evaluate the properties we want to retrieve.\r\n * @param {*} attribute being evaluated.\r\n * @returns object with the property.\r\n */\r\n function getAttributes(dataset, prefix, attribute) {\r\n if (!attribute.startsWith(prefix)) {\r\n return;\r\n }\r\n\r\n const cleanProperty = attribute.replace(prefix, '');\r\n const name = cleanProperty.charAt(0).toLowerCase() + cleanProperty.slice(1);\r\n\r\n if (!name) {\r\n return;\r\n }\r\n\r\n this[name] = dataset[attribute];\r\n }\r\n\r\n /**\r\n * @private\r\n * getCustomDimension: gets a custom dimensions object based on data-ga-dimension attributes\r\n *\r\n * @param {DOMStringMap} dataset properties of the object.\r\n */\r\n function getCustomDimension(dataset) {\r\n const customDimensions = {};\r\n Object.keys(dataset)\r\n .forEach(getAttributes.bind(customDimensions, dataset, configurations.customDimensionsAttribute));\r\n\r\n return customDimensions;\r\n }\r\n\r\n /**\r\n * Pushes the google analytics event to the dataLayer.\r\n * @param {*} eventCategory Google analytics category name for the event.\r\n * @param {*} eventAction Google analytics action name for the event.\r\n * @param {*} eventLabel Google analytics label name for the event.\r\n * @param {*} eventNoInteraction Google analytics label name for the event.\r\n */\r\n function googlePush(eventCategory, eventAction, eventLabel, eventNoInteraction) {\r\n const dataLayer = window.dataLayer;\r\n\r\n if (dataLayer) {\r\n dataLayer.push({\r\n event: 'GAEvent',\r\n eventCategory,\r\n eventAction,\r\n eventLabel,\r\n eventValue: undefined,\r\n nonInteraction: eventNoInteraction || 0\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * gaTrack: log google analytics event with google analytics object.\r\n *\r\n * @param {*} eventCategory Google analytics category name for the event.\r\n * @param {*} eventAction Google analytics action name for the event.\r\n * @param {*} eventLabel Google analytics label name for the event.\r\n */\r\n function gaTrack(eventCategory, eventAction, eventLabel) {\r\n pushToDataLayer({\r\n event: 'GAEvent',\r\n eventCategory,\r\n eventAction,\r\n eventLabel,\r\n eventValue: undefined,\r\n nonInteraction: 1\r\n });\r\n }\r\n\r\n function logNewUser() {\r\n const newUserGa = global.NewHomeSource.Modules.cookieHandler.readCookie('_ga');\r\n if (global.dataLayer && !newUserGa) {\r\n global.dataLayer.push({\r\n event: 'newUser',\r\n ga_newUser: 'true'\r\n });\r\n }\r\n }\r\n\r\n function setFullUrlsAsEventLabel(data) {\r\n const dataset = data;\r\n if (dataset.gaLabelFullUrl === 'true') {\r\n dataset.gaEventLabel = global.location.href;\r\n }\r\n return dataset;\r\n }\r\n\r\n /**\r\n * cleanCustomDimensions: pushes to the data layer the default values for all custom dimensions\r\n * recently pushed in an event. We need this for scenarios like Search Results Pages where\r\n * we don't want to keep in the data layer specific values like listing Ids recently clicked since\r\n * not all of the upcoming events are going to be bound to this particular Id.\r\n *\r\n * @param {*} dimensions is the custom dimensions for an event recently pushed.\r\n */\r\n function cleanCustomDimensions(dimensions) {\r\n const cleanDimensions = Object.assign({}, dimensions);\r\n Object.keys(cleanDimensions).forEach((dimension) => { cleanDimensions[dimension] = null; });\r\n\r\n pushToDataLayer(cleanDimensions);\r\n }\r\n\r\n GoogleAnalyticsTracker.onDemandTracker = function () {\r\n const dataLayer = window.dataLayer;\r\n const self = Object.assign({}, this);\r\n\r\n if (dataLayer) {\r\n dataLayer.push(self);\r\n }\r\n\r\n return true;\r\n };\r\n\r\n GoogleAnalyticsTracker.eventTracker = function () {\r\n const dataset = setFullUrlsAsEventLabel(this.dataset);\r\n const eventCategory = dataset.gaEventCategory;\r\n const eventAction = dataset.gaEventAction;\r\n\r\n const customDimensions = getCustomDimension(dataset);\r\n pushToDataLayer(customDimensions);\r\n\r\n if (eventCategory && eventAction) {\r\n let eventLabel = dataset.gaEventLabel;\r\n const eventNoInteraction = +dataset.gaEventNoInteraction || 0;\r\n\r\n if (!eventLabel && dataset.gaEventLabelEmpty !== 'true') {\r\n eventLabel = this.textContent.trim() + ' Clicks';\r\n }\r\n\r\n googlePush(eventCategory, eventAction, eventLabel, eventNoInteraction);\r\n\r\n if (this.dataset.cleanCustomDimensions) {\r\n cleanCustomDimensions(customDimensions);\r\n }\r\n }\r\n\r\n if (this.dataset.ctaDetail) {\r\n this.dataset.ctaDetail.split(',').forEach((data) => pushToDataLayer({ ctaDetail: data }));\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTrackerSelector: returns the expression that can be used to query the DOM for impression events.\r\n */\r\n GoogleAnalyticsTracker.impressionTrackerSelector = function () {\r\n return 'data-ga-impression';\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTracker: send data related to display events.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n GoogleAnalyticsTracker.impressionTracker = function () {\r\n const length = this.length;\r\n for (let index = 0; index < length; index += 1) {\r\n const data = this[index].dataset;\r\n const eventCategory = data.gaImpressionEventCategory;\r\n const eventAction = data.gaImpressionEventAction;\r\n const eventLabel = data.gaImpressionEventLabel;\r\n const isImpressionGa = data.gaImpression;\r\n\r\n if (eventCategory && isImpressionGa && eventAction) {\r\n gaTrack(eventCategory, eventAction, eventLabel || null);\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTracker: send data related when user send the form.\r\n *\r\n */\r\n GoogleAnalyticsTracker.identityTracker = function identityTracker() {\r\n const dataset = this.form.querySelector('[data-ga-identity-category]').dataset;\r\n googlePush(dataset.gaIdentityCategory, dataset.gaIdentityAction, dataset.gaIdentityLabel || '');\r\n return true;\r\n };\r\n\r\n GoogleAnalyticsTracker.eventTrackerValidator = function (dataSet) {\r\n if ((dataSet.gaEventCategory && dataSet.gaEventAction) || dataSet.gaEventTracker) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n GoogleAnalyticsTracker.onDemandTrackerValidator = function (data) {\r\n return data && data.eventType === 'GAEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTrackerValidator: validates if the dataset passed as parameter represents a google analytics identity\r\n * being tracked.\r\n */\r\n GoogleAnalyticsTracker.identityTrackerValidator = function identityTrackerValidator(dataset) {\r\n return !!dataset.gaIdentityCategory && !!dataset.gaIdentityAction;\r\n };\r\n\r\n /**\r\n * @public\r\n * buildTagWithEvent: build tag to have the attributes to log analytics event.\r\n *\r\n * @param {Element} element to add the attributes.\r\n * @param {String} category Google analytics category name for the event.\r\n * @param {String} action Google analytics action name for the event.\r\n * @param {String} label Google analytics label name for the event.\r\n */\r\n GoogleAnalyticsTracker.buildTagWithEvent = function (element, category, action, label) {\r\n if (element) {\r\n element.setAttribute('data-event', 'true');\r\n element.setAttribute('data-ga-event-category', category);\r\n element.setAttribute('data-ga-event-action', action);\r\n element.setAttribute('data-ga-event-label', label);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n GoogleAnalyticsTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.GoogleAnalyticsTracker = previousModule;\r\n return GoogleAnalyticsTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.GoogleAnalyticsTracker = GoogleAnalyticsTracker;\r\n if (isNhs) {\r\n logNewUser();\r\n }\r\n\r\n return GoogleAnalyticsTracker;\r\n}(window));\r\n","(function adwordsTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n const configurations = {\r\n impressionPrefix: 'adWordsImpressionCustom',\r\n };\r\n\r\n const culture = document.documentElement.lang || 'en';\r\n const isCna = culture === 'es';\r\n const previousModule = global.NewHomeSource.Analytics.AdWordsTracker;\r\n const isFromEuropeanCountry = !!document.querySelector('[data-is-europan-country]');\r\n const trackConversionSrc = '//www.googleadservices.com/pagead/conversion_async.js';\r\n\r\n if (isCna || isFromEuropeanCountry) {\r\n global.NewHomeSource.Analytics.AdWordsTracker = () => { };\r\n return global.NewHomeSource.Analytics.AdWordsTracker;\r\n }\r\n\r\n /**\r\n * @private\r\n * getData: gets the data from the DOM Node that will be send to AdWords.\r\n *\r\n * @param {DOMStringMap} dataset properties of the object.\r\n * @param {*} prefix to evaluate the properties we want to retrieve.\r\n * @param {*} attribute being evaluated.\r\n */\r\n function getAttributes(dataset, prefix, attribute) {\r\n const sharedPrefix = configurations.sharedPrefix;\r\n if (!attribute.startsWith(prefix) && !attribute.startsWith(sharedPrefix)) {\r\n return;\r\n }\r\n\r\n const name = attribute.replace(prefix, '').replace(sharedPrefix, '').toLowerCase();\r\n\r\n if (!name) {\r\n return;\r\n }\r\n\r\n this[name] = dataset[attribute];\r\n }\r\n\r\n function loadTrackConversion() {\r\n const isTrackConversionLoaded = document.querySelector(`[src=\"${trackConversionSrc}\"]`);\r\n\r\n if (isTrackConversionLoaded) {\r\n return;\r\n }\r\n\r\n const scriptTag = document.createElement('script');\r\n scriptTag.src = trackConversionSrc;\r\n scriptTag.async = 'true';\r\n scriptTag.type = 'text/javascript';\r\n document.documentElement.appendChild(scriptTag);\r\n }\r\n\r\n function AdWordsTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n /**\r\n * @public\r\n * impressionTracker: send data related to display events.\r\n *\r\n */\r\n AdWordsTracker.impressionTracker = function impressionTracker() {\r\n if (!global.google_trackConversion) {\r\n loadTrackConversion();\r\n return false;\r\n }\r\n\r\n if (!this || !this.length) {\r\n return true;\r\n }\r\n\r\n this.forEach((element) => {\r\n const data = element.dataset;\r\n const ids = data.adWordsImpressionGoogle_conversion_id.split(',');\r\n const labels = data.adWordsImpressionGoogle_conversion_label.split(',');\r\n const impressionCustomAtributes = {};\r\n Object.keys(data).forEach(getAttributes.bind(impressionCustomAtributes, data, configurations.impressionPrefix));\r\n const length = ids.length;\r\n for (let i = 0; i < length; i += 1) {\r\n const id = ids[i] || '';\r\n const label = labels[i] || undefined;\r\n const trackEvent = {\r\n google_conversion_id: id,\r\n google_conversion_label: label,\r\n google_custom_params: impressionCustomAtributes,\r\n google_remarketing_only: true\r\n };\r\n global.google_trackConversion(trackEvent);\r\n }\r\n });\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTrackerSelector: returns the expression that can be used to query the DOM.\r\n */\r\n AdWordsTracker.impressionTrackerSelector = function impressionTrackerSelector() {\r\n return 'data-ad-words-impression';\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.Analytics.AdWordsTracker to the previous script.\r\n */\r\n AdWordsTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.AdWordsTracker = previousModule;\r\n return AdWordsTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.AdWordsTracker = AdWordsTracker;\r\n\r\n return AdWordsTracker;\r\n}(window));\r\n","(function bingTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n global.uetq = global.uetq || [];\r\n const configurations = {};\r\n\r\n const previousModule = global.NewHomeSource.Analytics.BingTracker;\r\n\r\n /**\r\n * @private\r\n * conversionBingYahoo: track event to bing yahoo object.\r\n *\r\n */\r\n function conversionBingYahoo() {\r\n global.uetq.push({ ec: 'submit' });\r\n }\r\n\r\n function BingTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n BingTracker.onDemandTracker = function () {\r\n if (this.isDirectLead && !this.isFromEuropeanCountry) {\r\n conversionBingYahoo();\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTrackerValidator: validates if this track need to be fired.\r\n *\r\n * @param {string} data with the specific event type.\r\n * @returns true if the eventType is a BingEvent\r\n */\r\n BingTracker.onDemandTrackerValidator = function (data) {\r\n return data && data.eventType === 'BingEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.Analytics.BingTracker to the previous script.\r\n */\r\n BingTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.BingTracker = previousModule;\r\n return BingTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.BingTracker = BingTracker;\r\n\r\n return BingTracker;\r\n}(window));\r\n","(function dotTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n global.dotq = global.dotq || [];\r\n const configurations = {};\r\n\r\n const previousModule = global.NewHomeSource.Analytics.DotTracker;\r\n\r\n /**\r\n * @private\r\n * conversionDotGeminiYahoo: track event to DOT Gemeni yahoo object.\r\n *\r\n */\r\n function conversionDotGeminiYahoo() {\r\n global.dotq.push({\r\n projectId: '10000',\r\n properties: {\r\n pixelId: '21869',\r\n qstrings: {\r\n et: 'custom',\r\n ec: 'submit',\r\n ea: 'direct lead',\r\n el: 'source'\r\n }\r\n }\r\n });\r\n }\r\n\r\n function DotTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n DotTracker.onDemandTracker = function () {\r\n if (!this.isFromEuropeanCountry && this.isDirectLead) {\r\n conversionDotGeminiYahoo();\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTrackerValidator: validates if this track need to be fired.\r\n *\r\n * @param {string} data with the specific event type.\r\n * @returns true if the eventType is a DotEvent\r\n */\r\n DotTracker.onDemandTrackerValidator = function (data) {\r\n return data && data.eventType === 'DotEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.Analytics.DotTracker to the previous script.\r\n */\r\n DotTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.DotTracker = previousModule;\r\n return DotTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.DotTracker = DotTracker;\r\n\r\n return DotTracker;\r\n}(window));\r\n","/**\r\n * Pandora tracker\r\n * Pandora is a IA from https://artsai.com/ to help ad partners with campaign.\r\n *\r\n * How it works?\r\n * PandoraTracker creates a pixel (image tag not visible to user) that send a request to artsai.com\r\n * to start tracking the information.\r\n *\r\n * How to use it?\r\n * Data Values for impression tracker:\r\n * data-impression=\"true\"\r\n * data-pandora-impression-event='event pandora'\r\n * data-pandora-impression-category='event category'\r\n * data-pandora-impression-action='event action'\r\n * data-pandora-impression-label='event label'\r\n *\r\n */\r\n(function pandoraTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n const imgTemplate = ``;\r\n\r\n const pandoraElementConfig = document.querySelector('#isPandoraActive');\r\n const isPandoraEnable = pandoraElementConfig && pandoraElementConfig.value === 'True';\r\n const previousModule = global.NewHomeSource.Analytics.PandoraTracker;\r\n const configurations = {\r\n keyAction: '{action}'\r\n };\r\n\r\n if (!isPandoraEnable) {\r\n global.NewHomeSource.Analytics.PandoraTracker = () => { };\r\n return global.NewHomeSource.Analytics.PandoraTracker;\r\n }\r\n\r\n /**\r\n * Pushes the google analytics event to the dataLayer.\r\n * @param {*} eventCategory Google analytics category name for the event.\r\n * @param {*} eventAction Google analytics action name for the event.\r\n * @param {*} eventLabel Google analytics label name for the event.\r\n * @param {*} eventNoInteraction Google analytics label name for the event.\r\n */\r\n function googlePush(eventCategory, eventAction, eventLabel) {\r\n const dataLayer = window.dataLayer;\r\n\r\n if (dataLayer) {\r\n dataLayer.push({\r\n event: 'GAEvent',\r\n eventCategory,\r\n eventAction,\r\n eventLabel,\r\n eventValue: undefined,\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * requestPixel: create a image to be logged.\r\n *\r\n * @param {string} image to be logged.\r\n */\r\n function requestPixel(image) {\r\n const fragment = document.createRange().createContextualFragment(image);\r\n document.body.appendChild(fragment);\r\n document.querySelector('[data-pandora-pixel]').remove();\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.PandoraTracker\r\n */\r\n function PandoraTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n /**\r\n * @public\r\n * impressionTracker: send data related to display events.\r\n *\r\n */\r\n PandoraTracker.impressionTracker = function impressionTracker() {\r\n this.forEach((element) => {\r\n const data = element.dataset;\r\n const event = data.pandoraImpressionEvent;\r\n if (event) {\r\n const pixelImage = imgTemplate.replace(configurations.keyAction, event);\r\n requestPixel(pixelImage);\r\n const category = data.pandoraImpressionCategory || undefined;\r\n const action = data.pandoraImpressionAction || undefined;\r\n const label = data.pandoraImpressionLabel || undefined;\r\n if (category && action) {\r\n googlePush(category, action, label);\r\n }\r\n }\r\n });\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTracker: send data related to user identification events.\r\n *\r\n */\r\n PandoraTracker.identityTracker = function identityTracker() {\r\n const data = this.caller.dataset;\r\n const pixelImage = imgTemplate.replace(configurations.keyAction, data.pandoraIdentity);\r\n requestPixel(pixelImage);\r\n const category = data.pandoraIdentityCategory || undefined;\r\n const action = data.pandoraIdentityAction || undefined;\r\n const label = data.pandoraIdentityLabel || undefined;\r\n if (category && action) {\r\n googlePush(category, action, label);\r\n }\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTracker: send data related to events that cannot be mapped to the HTML.\r\n *\r\n */\r\n PandoraTracker.onDemandTracker = function () {\r\n const data = Object.assign({}, this);\r\n\r\n if (data.event) {\r\n const pixelImage = imgTemplate.replace(configurations.keyAction, data.event);\r\n requestPixel(pixelImage);\r\n const category = data.pandoraCategory || undefined;\r\n const action = data.pandoraAction || undefined;\r\n const label = data.pandoraLabel || undefined;\r\n if (category && action) {\r\n googlePush(category, action, label);\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTracker: send data related to events that cannot be mapped to the HTML.\r\n *\r\n */\r\n PandoraTracker.eventTracker = function () {\r\n const data = this.dataset;\r\n if (data.pandoraEvent) {\r\n const pixelImage = imgTemplate.replace(configurations.keyAction, data.pandoraEvent);\r\n requestPixel(pixelImage);\r\n const category = data.pandoraEventCategory || undefined;\r\n const action = data.pandoraEventAction || undefined;\r\n const label = data.pandoraEventLabel || undefined;\r\n if (category && action) {\r\n googlePush(category, action, label);\r\n }\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTrackerSelector: returns the expression that can be used to query the DOM.\r\n */\r\n PandoraTracker.impressionTrackerSelector = function impressionTrackerSelector() {\r\n return 'data-pandora-impression-event';\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTrackerValidator: validates if the dataset passed as parameter represents a segment pandora being tracked.\r\n */\r\n PandoraTracker.identityTrackerValidator = function identityTrackerValidator(dataset) {\r\n return !!dataset.pandoraIdentity;\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTrackerValidator: validates if the data passed as parameter represents a pandora event being tracked.\r\n */\r\n PandoraTracker.onDemandTrackerValidator = function (data) {\r\n return data && data.eventType === 'PandoraEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * eventTrackerValidator: validates if the dataSet passed as parameter represents a pandora event being tracked.\r\n */\r\n PandoraTracker.eventTrackerValidator = function (dataSet) {\r\n if (dataSet.pandoraEvent) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.Analytics.PandoraTracker to the previous script.\r\n */\r\n PandoraTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.PandoraTracker = previousModule;\r\n return PandoraTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.PandoraTracker = PandoraTracker;\r\n\r\n return PandoraTracker;\r\n}(window));\r\n","/**\r\n * enhancedConversionTracker: The objective of this module is to update the global object ecData\r\n * and push to dataLayer.\r\n *\r\n * The reason of this change is related to the implmentation of Enhanced Conversion in Google Ads.\r\n * Read more at: https://support.google.com/google-ads/answer/9888656?hl=en-GB.\r\n * ecData is a variable in the dataLayer that have the user attributes when lead is requested, and via\r\n * GTM we get that data to send to Google Ads.\r\n *\r\n * Use identityTracker to update this object.\r\n */\r\n(function enhancedConversionTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n const previousModule = global.NewHomeSource.Analytics.EnhancedConversionTracker;\r\n global.ecData = global.ecData || {};\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.EnhancedConversionTracker\r\n */\r\n function EnhancedConversionTracker() {\r\n }\r\n\r\n /**\r\n * @public\r\n * identityTracker: send data related to user identification events.\r\n *\r\n */\r\n EnhancedConversionTracker.identityTracker = function identityTracker() {\r\n const identityData = this.form.querySelectorAll('[data-ec-identity-data]');\r\n identityData.forEach((element) => {\r\n if (element.dataset.ecIdentityData) {\r\n global.ecData[element.dataset.ecIdentityData] = element.value;\r\n }\r\n });\r\n\r\n window.dataLayer.push({\r\n event: 'formSubmitted',\r\n ecData: global.ecData\r\n });\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTrackerValidator: validates if the dataset passed as parameter represents a being tracked.\r\n */\r\n EnhancedConversionTracker.identityTrackerValidator = function identityTrackerValidator(dataset) {\r\n return !!dataset.ecIdentity;\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Analytics.EnhancedConversionTracker to the previous script.\r\n */\r\n EnhancedConversionTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.EnhancedConversionTracker = previousModule;\r\n return EnhancedConversionTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.EnhancedConversionTracker = EnhancedConversionTracker;\r\n\r\n return EnhancedConversionTracker;\r\n}(window));\r\n","(function listHubTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const configurations = {\r\n };\r\n\r\n const previousModule = global.NewHomeSource.Analytics.ListHubTracker;\r\n const trackListHubSrc = '//tracking.listhub.net/scripts/la.min.js';\r\n /**\r\n ** load the trackListHub file if it hasn't been loaded before.\r\n */\r\n function loadScriptListHub() {\r\n const isTrackListHubLoaded = document.querySelector(`[src=\"${trackListHubSrc}\"]`);\r\n\r\n if (isTrackListHubLoaded) {\r\n return;\r\n }\r\n\r\n const scriptTag = document.createElement('script');\r\n scriptTag.src = trackListHubSrc;\r\n scriptTag.async = 'true';\r\n scriptTag.type = 'text/javascript';\r\n document.documentElement.appendChild(scriptTag);\r\n }\r\n\r\n /**\r\n * log event for listHubTracker\r\n */\r\n function logEvent(event, element) {\r\n const listHubProviderId = element.dataset.providerId;\r\n const testkey = element.dataset.testLogging;\r\n const listingKey = element.dataset.listingNumber;\r\n const lh = new global.ListHubTracker({\r\n provider: listHubProviderId,\r\n test: testkey\r\n });\r\n lh.submit(event, listingKey);\r\n }\r\n\r\n /**\r\n ** @constructs NewHomeSource.Analytics.ListHubTracker\r\n */\r\n function ListHubTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n /**\r\n * send the received event.\r\n * @returns false if the event has not been loaded or true if already.\r\n */\r\n ListHubTracker.eventTracker = function () {\r\n if (!global.ListHubTracker) {\r\n loadScriptListHub();\r\n return false;\r\n }\r\n const event = this.dataset.eventLh;\r\n logEvent(event, this);\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTrackerSelector: returns the expression that can be used to query the DOM for impression events.\r\n */\r\n ListHubTracker.impressionTrackerSelector = function () {\r\n return 'data-impresion-lh-event';\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTracker: send data related to display events.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n ListHubTracker.impressionTracker = function () {\r\n if (!global.ListHubTracker) {\r\n loadScriptListHub();\r\n return false;\r\n }\r\n this.forEach((element) => {\r\n const data = element.dataset;\r\n const event = data.impresionLhEvent;\r\n logEvent(event, element);\r\n });\r\n return true;\r\n };\r\n\r\n ListHubTracker.eventTrackerValidator = function (dataSet) {\r\n if (dataSet.eventLh) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n ListHubTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.ListHubTracker = previousModule;\r\n return ListHubTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.ListHubTracker = ListHubTracker;\r\n return ListHubTracker;\r\n}(window));\r\n","/**\r\n * Module that represents the global parameters value to specifc page type.\r\n *\r\n * Use getGlobalConfiguration and set the specifc page type.\r\n * Valid page types:\r\n * - HomePage\r\n */\r\n(function ga4Tracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const previousModule = global.NewHomeSource.Analytics.Ga4Configuration;\r\n let configurations = null;\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.Ga4Configuration\r\n */\r\n function Ga4Configuration(globalValues) {\r\n configurations = {\r\n HomePage: {\r\n brandPartnerName: globalValues.brand_partner_name,\r\n pageType: globalValues.page_type,\r\n partnerId: globalValues.partner_id,\r\n partnerName: globalValues.partner_name,\r\n userMarketId: globalValues.userMarketId,\r\n userStatus: globalValues.userStatus,\r\n userZipCode: globalValues.userZipCode,\r\n user: globalValues.userId,\r\n brandPartnerNamePartnerName: globalValues.brandPartnerNamePartnerName,\r\n gaUserId: globalValues.googleAnalyticsUserId,\r\n time: globalValues.time,\r\n neustarResponse: globalValues.neustarResponse,\r\n referCode: globalValues.referCode,\r\n },\r\n SearchResults: {\r\n brandPartnerName: globalValues.brand_partner_name,\r\n pageType: globalValues.page_type,\r\n partnerId: globalValues.partner_id,\r\n partnerName: globalValues.partner_name,\r\n userMarketId: globalValues.userMarketId,\r\n userStatus: globalValues.userStatus,\r\n userZipCode: globalValues.userZipCode,\r\n user: globalValues.userId,\r\n brandPartnerNamePartnerName: globalValues.brandPartnerNamePartnerName,\r\n gaUserId: globalValues.googleAnalyticsUserId,\r\n time: globalValues.time,\r\n neustarResponse: globalValues.neustarResponse,\r\n referCode: globalValues.referCode,\r\n market_id: globalValues.marketId,\r\n market_name: globalValues.marketName,\r\n market_session: globalValues.marketSession,\r\n location: globalValues.location\r\n },\r\n Details: {\r\n brandPartnerName: globalValues.brand_partner_name,\r\n pageType: globalValues.page_type,\r\n partnerId: globalValues.partner_id,\r\n partnerName: globalValues.partner_name,\r\n userMarketId: globalValues.userMarketId,\r\n userStatus: globalValues.userStatus,\r\n userZipCode: globalValues.userZipCode,\r\n user: globalValues.userId,\r\n brandPartnerNamePartnerName: globalValues.brandPartnerNamePartnerName,\r\n gaUserId: globalValues.googleAnalyticsUserId,\r\n time: globalValues.time,\r\n neustarResponse: globalValues.neustarResponse,\r\n referCode: globalValues.referCode,\r\n community_status: globalValues.communityType,\r\n min_price: globalValues.community_low_price,\r\n max_price: globalValues.community_high_price,\r\n trustbuilder_reviews: globalValues.trustBuilderReviews,\r\n location: globalValues.location,\r\n is_priced: globalValues.isPriced,\r\n has_isp: globalValues.hasIsp,\r\n is_limited_availability: globalValues.isLimitedAvailability,\r\n market_id: globalValues.marketId,\r\n market_name: globalValues.marketName,\r\n primary_image: globalValues.primary_image_url,\r\n brand_name: globalValues.brand_name,\r\n zip_code: globalValues.zip,\r\n brand_id: globalValues.brand_id,\r\n builder_corp: globalValues.builder_name,\r\n community_id: globalValues.communityId,\r\n builder_id: globalValues.builder_id,\r\n community_name: globalValues.community_name,\r\n amenities: globalValues.amenities,\r\n market_session: globalValues.marketSession,\r\n // is_paid: '',\r\n has_ifp: globalValues.hasIfp,\r\n builder_name: globalValues.builder_name,\r\n off_market: globalValues.offMarket,\r\n home_price: globalValues.home_price,\r\n home_status: globalValues.home_type,\r\n plan_id: globalValues.plan_id,\r\n plan_name: globalValues.plan_name,\r\n county: globalValues.county,\r\n builder_division: globalValues.builder_division,\r\n spec_id: globalValues.spec_id,\r\n price_reduction: globalValues.price_reduction\r\n },\r\n BuilderShowcase: {\r\n referCode: globalValues.referCode,\r\n pageType: globalValues.page_type,\r\n off_market: globalValues.offMarket,\r\n market_session: globalValues.marketSession,\r\n market_id: globalValues.marketId,\r\n partnerName: globalValues.partner_name,\r\n user: globalValues.userId,\r\n builder_name: globalValues.builder_name,\r\n brandPartnerNamePartnerName: globalValues.brandPartnerNamePartnerName,\r\n partnerId: globalValues.partner_id,\r\n gaUserId: globalValues.googleAnalyticsUserId,\r\n userStatus: globalValues.userStatus,\r\n time: globalValues.time,\r\n brand_id: globalValues.brand_id,\r\n brand_name: globalValues.brand_name,\r\n trustbuilder_reviews: globalValues.trustBuilderReviews,\r\n brandPartnerName: globalValues.brand_partner_name\r\n }\r\n };\r\n }\r\n\r\n Ga4Configuration.getGlobalConfiguration = function globalConfiguration(pageType) {\r\n const configurationObj = (pageType && configurations[pageType]) || configurations.HomePage;\r\n\r\n const params = {};\r\n Object.keys(configurationObj).forEach((key) => {\r\n params[key] = configurationObj[key];\r\n\r\n if (configurationObj[key] && typeof configurationObj[key].getValue === 'function') {\r\n configurationObj[key] = configurationObj[key].getValue(true);\r\n params[key] = configurationObj[key];\r\n }\r\n\r\n if (typeof configurationObj[key] === 'function') {\r\n params[key] = configurationObj[key]();\r\n }\r\n });\r\n return params;\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.Ga4Configuration to the previous script.\r\n */\r\n Ga4Configuration.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.Ga4Configuration = previousModule;\r\n return Ga4Configuration;\r\n };\r\n\r\n global.NewHomeSource.Analytics.Ga4Configuration = Ga4Configuration;\r\n\r\n return Ga4Configuration;\r\n}(window));\r\n","/**\r\n * This module should be the one we keep using for google analytics 4 events\r\n *\r\n * How to use it: dev should add four data attributes to the element it wants to track:\r\n *\r\n * To avoid duplicate global values (parameters that will be fired in all the page type)\r\n * Check @module NewHomeSource.Analytics.Ga4Configuration\r\n * This have all the default parameters shared by all events of certain page type.\r\n * Add data-ga4-global-configuration=\"PageType\" to some element in the DOM.\r\n * If you want to set a specific configuration to specifc event use data-ga4-configuration=\"PageType\"\r\n *\r\n * Event Tracker\r\n * data-event=\"true\"\r\n * data-ga4-event-name='my event name'\r\n * data-ga4-event-parameterName='my parameter value'\r\n * The most important thing is to start with the data-ga4-event name.\r\n *\r\n * Impression\r\n * data-event='true'\r\n * data-ga4-impression-event-name='my event name'\r\n * data-ga4-impression-event-parameterName='my parameter value'\r\n * The most important thing is to start with the data-ga4-impression-event-name name.\r\n *\r\n * On demand tracker\r\n * const myEvent = {\r\n * eventType: \"GA4Event\",\r\n * eventName: 'My Event Name',\r\n * params: {\r\n * parameterName: \"ParameterValue\"\r\n * }\r\n * }\r\n */\r\n(function ga4Tracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const previousModule = global.NewHomeSource.Analytics.Ga4Tracker;\r\n const globalConfigurationElement = document.querySelector('[data-ga4-global-configuration]');\r\n const globalConfiguration = (globalConfigurationElement && globalConfigurationElement.dataset.ga4GlobalConfiguration);\r\n const ga4ImpressionNameAttribute = 'data-ga4-impression-event-name';\r\n const configurations = {\r\n eventTrackerAttribute: 'ga4Event',\r\n identityTrackerAttribute: 'ga4Identity',\r\n impressionTrackerAttribute: 'ga4ImpressionEvent',\r\n shareInfoAttribute: 'ga4Info',\r\n identityUserDataAttribute: 'ga4IdentityUserData',\r\n identityCheckboxAttribute: 'ga4IdentityCheckbox',\r\n identityCheckboxDataAttribute: 'ga4IdentityCheckboxData',\r\n identityDropdownAttribute: 'ga4IdentityDropdown',\r\n };\r\n\r\n if (!global.NewHomeSource.Analytics.Ga4Configuration) {\r\n global.NewHomeSource.Analytics.Ga4Tracker = () => { };\r\n return global.NewHomeSource.Analytics.Ga4Tracker;\r\n }\r\n\r\n const ga4Configuration = global.NewHomeSource.Analytics.Ga4Configuration;\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.Ga4Tracker\r\n */\r\n function Ga4Tracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n function pushToDataLayer(data) {\r\n const dataLayer = global.dataLayer;\r\n\r\n if (dataLayer) {\r\n dataLayer.push(data);\r\n }\r\n }\r\n\r\n function googlePush(eventName, params) {\r\n pushToDataLayer({\r\n event: 'GA4Event',\r\n eventName,\r\n params\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * getAttributes: get the attributes that starts with @var{attribute}\r\n *\r\n * @param {DOMStringMap} dataset properties of the object.\r\n * @param {*} prefix to evaluate the properties we want to retrieve.\r\n * @param {*} attribute being evaluated.\r\n * @returns object with the property.\r\n */\r\n function getAttributes(dataset, prefix, attribute) {\r\n if (!attribute.startsWith(prefix)) {\r\n return;\r\n }\r\n\r\n const cleanProperty = attribute.replace(prefix, '');\r\n const name = cleanProperty.charAt(0).toLowerCase() + cleanProperty.slice(1);\r\n\r\n if (!name) {\r\n return;\r\n }\r\n\r\n this[name] = dataset[attribute];\r\n }\r\n\r\n function getParameters(dataset, attribute) {\r\n const parameters = {};\r\n Object.keys(dataset)\r\n .forEach(getAttributes.bind(parameters, dataset, attribute));\r\n return parameters;\r\n }\r\n\r\n /**\r\n * @private getSharedParameters: when some data is duplicated in some specific section and events\r\n * you can add the data-ga4-info=\"true\" to get the the element that contains the information.\r\n * For example Search results cards.\r\n * The properties structure: data-ga4-info-parameterName=\"Paramater Value\"\r\n *\r\n * @param {Element} element to track.\r\n * @returns {object} with the share parameters.\r\n */\r\n function getSharedParameters(element) {\r\n const shareInfoElement = element.closest('[data-ga4-info=\"true\"]');\r\n if (shareInfoElement) {\r\n return getParameters(shareInfoElement.dataset, configurations.shareInfoAttribute);\r\n }\r\n\r\n return {};\r\n }\r\n\r\n function setCheckboxParamters(element) {\r\n const parameter = element.dataset[configurations.identityCheckboxAttribute];\r\n const value = element.dataset[configurations.identityCheckboxDataAttribute];\r\n if (element.checked) {\r\n if (this[parameter]) {\r\n this[parameter] += `, ${value}`;\r\n } else {\r\n this[parameter] = value;\r\n }\r\n }\r\n }\r\n\r\n function setUserData(element) {\r\n this[element.dataset[configurations.identityUserDataAttribute]] = element.value;\r\n }\r\n\r\n function setDropdownParameters(element) {\r\n if (element.selectedIndex > 0) {\r\n this[element.dataset[configurations.identityDropdownAttribute]] = element.options[element.selectedIndex].text;\r\n }\r\n }\r\n\r\n function setDateSliderParameters(form) {\r\n const date = form.querySelector('[data-date]');\r\n if (!form.dataset.ga4IdentityDateSlider ||\r\n !date) {\r\n return;\r\n }\r\n\r\n if (this[form.dataset.ga4IdentityDateSlider]) {\r\n this[form.dataset.ga4IdentityDateSlider] += `, ${date.dataset.date}`;\r\n return;\r\n }\r\n\r\n this[form.dataset.ga4IdentityDateSlider] = date.dataset.date;\r\n }\r\n\r\n Ga4Tracker.eventTracker = function () {\r\n const paramsFromHtml = getParameters(this.dataset, configurations.eventTrackerAttribute);\r\n delete paramsFromHtml.name;\r\n const sharedParameters = getSharedParameters(this);\r\n const globalValues = ga4Configuration.getGlobalConfiguration(this.dataset.ga4Configuration || globalConfiguration);\r\n const params = Object.assign({}, globalValues, sharedParameters, paramsFromHtml);\r\n googlePush(this.dataset.ga4EventName, params);\r\n return true;\r\n };\r\n\r\n Ga4Tracker.onDemandTracker = function () {\r\n const globalValues = ga4Configuration.getGlobalConfiguration(this.ga4Configuration || globalConfiguration);\r\n delete this.eventType;\r\n const params = Object.assign({}, globalValues, this.params);\r\n googlePush(this.eventName, params);\r\n return true;\r\n };\r\n\r\n Ga4Tracker.identityTracker = function () {\r\n const caller = this.caller;\r\n const form = this.form;\r\n const identityData = {};\r\n const identityCheckboxElements = form.querySelectorAll('[data-ga4-identity-checkbox]');\r\n const identityDropdownElements = form.querySelectorAll('[data-ga4-identity-dropdown]');\r\n const identityElements = form.querySelectorAll('[data-ga4-identity-user-data]');\r\n const paramsFromHtml = getParameters(caller.dataset, configurations.identityTrackerAttribute);\r\n const sharedParameters = getSharedParameters(caller);\r\n const event = paramsFromHtml.eventName;\r\n const globalValues = ga4Configuration.getGlobalConfiguration(caller.ga4Configuration || globalConfiguration);\r\n identityElements.forEach(setUserData, identityData);\r\n identityCheckboxElements.forEach(setCheckboxParamters, identityData);\r\n identityDropdownElements.forEach(setDropdownParameters, identityData);\r\n setDateSliderParameters.call(identityData, form);\r\n const params = Object.assign({}, globalValues, sharedParameters, paramsFromHtml, identityData);\r\n googlePush(event, params);\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTracker: Tracks the impression events.\r\n * @returns The answer to close the task on the idle queue.\r\n */\r\n Ga4Tracker.impressionTracker = function () {\r\n this.forEach((element) => {\r\n const paramsFromHtml = getParameters(element.dataset, configurations.impressionTrackerAttribute);\r\n const globalValues = ga4Configuration.getGlobalConfiguration(element.dataset.ga4Configuration ||\r\n globalConfiguration);\r\n const params = Object.assign({}, paramsFromHtml, globalValues);\r\n googlePush(element.dataset.ga4ImpressionEventName, params);\r\n });\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTrackerSelector: Gets the main impression tracker attribute.\r\n * @returns The main impression tracker attribute.\r\n */\r\n Ga4Tracker.impressionTrackerSelector = function () {\r\n return ga4ImpressionNameAttribute;\r\n };\r\n\r\n Ga4Tracker.eventTrackerValidator = function (dataset) {\r\n if (dataset.ga4EventName) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n Ga4Tracker.onDemandTrackerValidator = function (data) {\r\n return data && data.eventType === 'GA4Event';\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTrackerValidator: validates if the dataset passed as parameter represents a google analytics 4 identity\r\n * being tracked.\r\n */\r\n Ga4Tracker.identityTrackerValidator = function identityTrackerValidator(dataset) {\r\n return !!dataset.ga4IdentityEventName;\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n Ga4Tracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.Ga4Tracker = previousModule;\r\n return Ga4Tracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.Ga4Tracker = Ga4Tracker;\r\n\r\n return Ga4Tracker;\r\n}(window));\r\n","/**\r\n * This module should be the one we keep using for speedcurve events\r\n *\r\n * How to use it: dev should add four data attributes to the element it wants to track:\r\n *\r\n * On demand tracker\r\n * const myEvent = {\r\n * eventType: \"SpeedcurveEvent\",\r\n * handler: 'markStart|markEnd',\r\n * }\r\n */\r\n(function sitespeedTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const previousModule = global.NewHomeSource.Analytics.SitespeedTracker;\r\n\r\n function markStart({ name }) {\r\n window.LUX.mark(name);\r\n }\r\n\r\n function markEnd({ measureName, markNameStart, markNameEnd }) {\r\n window.LUX.mark(markNameEnd);\r\n window.LUX.measure(measureName, markNameStart, markNameEnd);\r\n }\r\n\r\n const configurations = {\r\n markStart,\r\n markEnd,\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.SitespeedTracker\r\n */\r\n function SitespeedTracker(globalValues) {\r\n configurations.globalValues = globalValues;\r\n }\r\n\r\n SitespeedTracker.onDemandTracker = function () {\r\n if (!window.LUX) {\r\n return false;\r\n }\r\n\r\n const handler = configurations[this.handler];\r\n\r\n if (handler) {\r\n handler(this);\r\n }\r\n\r\n return true;\r\n };\r\n\r\n SitespeedTracker.onDemandTrackerValidator = function (data) {\r\n return data && data.eventType === 'SitespeedEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n SitespeedTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.SitespeedTracker = previousModule;\r\n return SitespeedTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.SitespeedTracker = SitespeedTracker;\r\n\r\n return SitespeedTracker;\r\n}(window));\r\n","(function segment(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n const culture = document.documentElement.lang || 'en';\r\n const isCna = !(culture === 'en');\r\n\r\n if (isCna) {\r\n global.NewHomeSource.Analytics.segment = function () {};\r\n return;\r\n }\r\n\r\n const previousSegment = global.NewHomeSource.Analytics.segment;\r\n const configurations = {\r\n eventPrefix: 'segmentEvent',\r\n identityPrefix: 'segmentIdentity',\r\n impressionPrefix: 'segmentImpression',\r\n sharedPrefix: 'segmentShared'\r\n };\r\n\r\n /**\r\n * @private\r\n * append: creates new properties into the reference value.\r\n *\r\n * @param {Array} entry key/value pair.\r\n */\r\n function append(entry) {\r\n this[entry[0]] = entry[1];\r\n }\r\n\r\n /**\r\n * @private\r\n * adds traits from configurations.data to the object containing the traits about to log.\r\n *\r\n * @param {object} configurationObject object with traits about to log.\r\n */\r\n function setDataAttributeTraits(configurationObject) {\r\n const configurationObj = configurationObject;\r\n Object.keys(configurations.data).forEach((key) => {\r\n const value = typeof configurations.data[key].getValue === 'function'\r\n ? configurations.data[key].getValue(true)\r\n : configurations.data[key];\r\n configurationObj[key] = value;\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * setAnonymousId: set the Anonymous id for Automation testing\r\n */\r\n function setAnonymousId(segmentAnonymousId) {\r\n if (segmentAnonymousId !== '' && window.analytics.user) {\r\n window.analytics.user().anonymousId(segmentAnonymousId);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * removes null or empty values from traits before sending them.\r\n *\r\n * @param {object} traits to be cleaned up.\r\n */\r\n function cleanEmptyOrNullTraitsBeforeSend(traits) {\r\n const currentTraits = traits;\r\n const propNames = Object.getOwnPropertyNames(currentTraits);\r\n for (let i = 0; i < propNames.length; i += 1) {\r\n const propName = propNames[i];\r\n if (currentTraits[propName] === null ||\r\n currentTraits[propName] === 0 || currentTraits[propName] === '' ||\r\n currentTraits[propName] === undefined) {\r\n delete currentTraits[propName];\r\n } else {\r\n currentTraits[propName] = typeof currentTraits[propName] === 'string'\r\n ? currentTraits[propName].replace(/['\\\\]/g, '')\r\n : currentTraits[propName];\r\n }\r\n }\r\n\r\n return currentTraits;\r\n }\r\n\r\n /**\r\n * @private\r\n * create the GlobalTratis object.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n function createGlobalTraits(status) {\r\n if (!configurations.globalTraits) {\r\n configurations.globalTraits = {};\r\n }\r\n\r\n setDataAttributeTraits(configurations.globalTraits);\r\n setAnonymousId(configurations.data.segmentAnonymousId());\r\n const timeLapsed = +new Date() - status.time;\r\n const traits = {\r\n page_type: configurations.globalTraits.page_type(),\r\n current_page_number: configurations.globalTraits.current_page_number,\r\n response_version: configurations.globalTraits.response_version,\r\n partner_id: configurations.globalTraits.partner_id,\r\n partner_name: configurations.globalTraits.partner_name,\r\n brand_partner_name: configurations.globalTraits.brand_partner_name,\r\n builder_id: configurations.globalTraits.builder_id,\r\n builder_name: configurations.globalTraits.builder_name,\r\n city: configurations.globalTraits.city,\r\n state: configurations.globalTraits.state,\r\n zip: configurations.globalTraits.zip,\r\n code_version: configurations.globalTraits.codeBuildeVersion,\r\n test_version: configurations.globalTraits.abTestsOnThisPage,\r\n community_id: configurations.globalTraits.communityId,\r\n market_id: configurations.globalTraits.marketId,\r\n market_name: configurations.globalTraits.marketName,\r\n community_high_price: configurations.globalTraits.community_high_price,\r\n community_low_price: configurations.globalTraits.community_low_price,\r\n community_name: configurations.globalTraits.community_name,\r\n primary_image_url: configurations.globalTraits.primary_image_url,\r\n home_price: configurations.globalTraits.home_price,\r\n home_type: configurations.globalTraits.home_type,\r\n spec_id: configurations.globalTraits.spec_id,\r\n plan_id: configurations.globalTraits.plan_id,\r\n result_count: configurations.globalTraits.result_count()\r\n };\r\n\r\n const propNames = Object.getOwnPropertyNames(traits);\r\n for (let i = 0; i < propNames.length; i += 1) {\r\n const propName = propNames[i];\r\n if (traits[propName] === 'undefined' || traits[propName] === null ||\r\n traits[propName] === 0 || traits[propName] === '' || traits[propName] === '0') {\r\n delete traits[propName];\r\n }\r\n }\r\n if (traits.Segment === null && timeLapsed < 10000) {\r\n configurations.globalTraits = null;\r\n return null;\r\n }\r\n return traits;\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserId: get user ID.\r\n */\r\n\r\n function getUserId() {\r\n const userIdData = configurations.data.userId() || configurations.data.i_uid.getValue(true);\r\n\r\n const userId = userIdData.replace(/[{}]/g, '');\r\n\r\n return userId;\r\n }\r\n\r\n /**\r\n * @private\r\n * create the GlobalTratis object.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n function createGlobalIdentifyTraits(status) {\r\n if (!configurations.globalIdentifyTraits) {\r\n configurations.globalIdentifyTraits = {};\r\n }\r\n\r\n if (!configurations.globalIdentifyTraits.NeustarSegment) {\r\n const neustarResponse = configurations.data.neustar.getValue(true);\r\n\r\n if (neustarResponse) {\r\n configurations.globalIdentifyTraits.NeustarZip = neustarResponse.z;\r\n configurations.globalIdentifyTraits.NeustarYear = neustarResponse.y;\r\n configurations.globalIdentifyTraits.NeustarSegment = neustarResponse.s;\r\n configurations.globalIdentifyTraits.NeustarGender = neustarResponse.g;\r\n }\r\n }\r\n\r\n configurations.globalIdentifyTraits.g_client_id = configurations.data.googleAnalyticsClientId.getValue(true);\r\n setDataAttributeTraits(configurations.globalIdentifyTraits);\r\n setAnonymousId(configurations.data.segmentAnonymousId());\r\n const timeLapsed = +new Date() - status.time;\r\n const traits = {\r\n user_id: getUserId(),\r\n n_zip: configurations.globalIdentifyTraits.NeustarZip,\r\n n_year: configurations.globalIdentifyTraits.NeustarYear,\r\n n_gender: configurations.globalIdentifyTraits.NeustarGender,\r\n g_client_id: configurations.globalIdentifyTraits.g_client_id\r\n };\r\n\r\n if (configurations.globalIdentifyTraits.NeustarSegment !== '000') {\r\n traits.n_segment = configurations.globalIdentifyTraits.NeustarSegment;\r\n }\r\n\r\n if (traits.Segment === null && timeLapsed < 10000) {\r\n configurations.globalIdentifyTraits = null;\r\n return null;\r\n }\r\n\r\n return traits;\r\n }\r\n\r\n /**\r\n * @private\r\n * getTraits: gets the data from the DOM Node that will be send to Segment.\r\n *\r\n * @param {DOMStringMap} dataset properties of the object.\r\n * @param {*} prefix to evaluate the properties we want to retrieve.\r\n * @param {*} attribute being evaluated.\r\n */\r\n function getTraits(dataset, prefix, attribute) {\r\n const sharedPrefix = configurations.sharedPrefix;\r\n if (!attribute.startsWith(prefix) && !attribute.startsWith(sharedPrefix)) {\r\n return;\r\n }\r\n\r\n const name = attribute.replace(prefix, '').replace(sharedPrefix, '').toLowerCase();\r\n\r\n if (!name) {\r\n return;\r\n }\r\n\r\n this[name] = dataset[attribute];\r\n }\r\n\r\n /**\r\n * @private\r\n * track: fires a segment track event.\r\n *\r\n * @param {object} globalTraits information that is global for the event.\r\n * @param {string} data with the information that is going to be logged.\r\n */\r\n function track(globalTraits, data) {\r\n const event = data[0];\r\n const propertyName = Object.keys(data[1])[0];\r\n let value = JSON.parse(JSON.stringify(globalTraits));\r\n\r\n if (data[1][propertyName].length === 1) {\r\n Object.entries(JSON.parse(JSON.stringify(data[1][propertyName][0]))).forEach(append.bind(value));\r\n } else {\r\n value[propertyName] = data[1][propertyName];\r\n }\r\n\r\n value = cleanEmptyOrNullTraitsBeforeSend(value);\r\n global.analytics.track(event, value);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.segment\r\n */\r\n function Segment(data) {\r\n configurations.data = data;\r\n }\r\n\r\n /**\r\n * @public\r\n * eventTracker: send data related to user action events.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n Segment.eventTracker = function eventTracker(status) {\r\n if (!global.analytics) {\r\n return false;\r\n }\r\n\r\n let traits = createGlobalTraits(status);\r\n\r\n if (!traits) {\r\n return false;\r\n }\r\n\r\n const data = this.dataset;\r\n Object.keys(data).forEach(getTraits.bind(traits, data, configurations.eventPrefix));\r\n traits = cleanEmptyOrNullTraitsBeforeSend(traits);\r\n const event = traits.event;\r\n if (!event) {\r\n return false;\r\n }\r\n delete traits.event;\r\n global.analytics.track(event, traits);\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * eventTrackerValidator: validates if the dataset passed as parameter represents a segment event being tracked.\r\n */\r\n Segment.eventTrackerValidator = function eventTrackerValidator(dataset) {\r\n return !!dataset.segmentEvent;\r\n };\r\n\r\n /**\r\n * @public\r\n * eventTrackerValidator: validates if the dataset passed as parameter represents a segment event being tracked.\r\n */\r\n Segment.onDemandTrackerValidator = function onDemandTrackerValidator(data) {\r\n return data && data.eventType === 'segmentEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTracker: send data related to user identification events.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n Segment.identityTracker = function identityTracker(status) {\r\n if (!global.analytics) {\r\n return false;\r\n }\r\n let identityTraits = createGlobalIdentifyTraits(status);\r\n\r\n if (!identityTraits) {\r\n return false;\r\n }\r\n\r\n const data = this.caller.dataset;\r\n\r\n const identityData = this.form.querySelectorAll('[data-segment-identity-data]');\r\n const length = identityData.length;\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n const name = identityData[index].dataset.segmentIdentityData;\r\n const value = identityData[index].type === 'checkbox' || identityData[index].type === 'radio'\r\n ? identityData[index].checked\r\n : identityData[index].value;\r\n\r\n if (value !== '') {\r\n identityTraits[name] = value;\r\n }\r\n }\r\n\r\n if (identityTraits.Name) {\r\n const fullName = identityTraits.Name.split(' ');\r\n identityTraits.first_name = fullName[0];\r\n identityTraits.last_name = fullName.slice(1).join(' ');\r\n delete identityTraits.Name;\r\n delete data.Name;\r\n }\r\n\r\n identityTraits.last_event = data.segmentIdentityEvent || data.segmentEventEvent;\r\n delete identityTraits.event;\r\n identityTraits = cleanEmptyOrNullTraitsBeforeSend(identityTraits);\r\n\r\n if (identityTraits.user_id) {\r\n global.analytics.identify(identityTraits.user_id, identityTraits);\r\n return true;\r\n }\r\n\r\n identityTraits = cleanEmptyOrNullTraitsBeforeSend(identityTraits);\r\n global.analytics.identify(identityTraits);\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTrackerValidator: validates if the dataset passed as parameter represents a segment identity being tracked.\r\n */\r\n Segment.identityTrackerValidator = function identityTrackerValidator(dataset) {\r\n return !!dataset.segmentIdentity;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTracker: send data related to display events.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n Segment.impressionTracker = function impressionTracker(status) {\r\n if (!global.analytics) {\r\n return false;\r\n }\r\n\r\n if (!this || !this.length) {\r\n return true;\r\n }\r\n\r\n const traits = createGlobalTraits(status);\r\n if (!traits) {\r\n return false;\r\n }\r\n\r\n const length = this.length;\r\n const impressionTypes = {};\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n let listingTraits = {};\r\n const data = this[index].dataset;\r\n const event = data.segmentImpressionEvent;\r\n const type = data.segmentImpressionType;\r\n\r\n if (event && type) {\r\n impressionTypes[event] = impressionTypes[event] || {};\r\n impressionTypes[event][type] = impressionTypes[event][type] || [];\r\n Object.keys(data).forEach(getTraits.bind(listingTraits, data, configurations.impressionPrefix));\r\n delete listingTraits.event;\r\n delete listingTraits.Type;\r\n listingTraits = cleanEmptyOrNullTraitsBeforeSend(listingTraits);\r\n if (traits.filters_applied == null && listingTraits.includefilters) {\r\n traits.filters_applied = configurations.globalTraits.filters_applied();\r\n }\r\n delete listingTraits.includefilters;\r\n impressionTypes[event][type].push(listingTraits);\r\n }\r\n }\r\n Object.entries(impressionTypes).forEach(track.bind(null, traits));\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTrackerSelector: returns the expression that can be used to query the DOM.\r\n */\r\n Segment.impressionTrackerSelector = function impressionTrackerSelector() {\r\n return 'data-segment-impression';\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTracker: send data related to events that cannot be mapped to the HTML.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n Segment.onDemandTracker = function onDemandTracker(status) {\r\n if (!global.analytics) {\r\n return false;\r\n }\r\n\r\n if (!this || !this.event) {\r\n return true;\r\n }\r\n\r\n const self = Object.assign({}, this);\r\n\r\n const isNeustarDefined = !!configurations.data.neustar.getValue(true);\r\n let trackingGlobalTraits = createGlobalTraits(status);\r\n let identifyGlobalTraits = createGlobalIdentifyTraits(status);\r\n const event = self.event;\r\n const isIdentifyEvent = self.isIdentifyEvent;\r\n const isIdentifyOnly = self.isIdentifyOnly;\r\n const isNeustarRequired = self.isNeustarRequired;\r\n\r\n if (!trackingGlobalTraits || (self.isIdentifyEvent && !identifyGlobalTraits)) {\r\n return false;\r\n }\r\n\r\n if (isNeustarRequired && !isNeustarDefined) {\r\n return false;\r\n }\r\n\r\n delete self.eventType;\r\n delete self.event;\r\n delete self.isIdentifyEvent;\r\n delete self.isIdentifyOnly;\r\n delete self.isNeustarRequired;\r\n\r\n Object.entries(JSON.parse(JSON.stringify(self))).forEach(append.bind(trackingGlobalTraits));\r\n\r\n if (isIdentifyEvent) {\r\n Object.entries(JSON.parse(JSON.stringify(self))).forEach(append.bind(identifyGlobalTraits));\r\n identifyGlobalTraits.last_event = event;\r\n identifyGlobalTraits = cleanEmptyOrNullTraitsBeforeSend(identifyGlobalTraits);\r\n\r\n if (identifyGlobalTraits.user_id) {\r\n global.analytics.identify(identifyGlobalTraits.user_id, identifyGlobalTraits);\r\n } else {\r\n global.analytics.identify(identifyGlobalTraits);\r\n }\r\n\r\n if (isIdentifyOnly) {\r\n return true;\r\n }\r\n }\r\n\r\n trackingGlobalTraits = cleanEmptyOrNullTraitsBeforeSend(trackingGlobalTraits);\r\n global.analytics.track(event, trackingGlobalTraits);\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Segment to the previous script.\r\n */\r\n Segment.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.segment = previousSegment;\r\n return Segment;\r\n };\r\n\r\n global.NewHomeSource.Analytics.segment = Segment;\r\n}(window));\r\n","/**\r\n * This module is a wrapper of the sessionStorage and localStorage APIs but with two improvements\r\n * that those APIs don't have:\r\n * 1. The APIs only allow to save strings. If you want to save any other type, you will need to\r\n * stringify the data as a json when saving it and parse it when reading it. This module handles\r\n * that automatically, you can save any type of data: numbers, booleans, object, etc.\r\n * 2. You can pass a expiry date to the data you save, so it behaves like a cookie.\r\n * For example, you can save an item with an expiry date of a day. If you try to access the item\r\n * from the storage after that time, it will return null and the item will be deleted if you try\r\n * to read it. If you don't pass an expiry date, the data won't be deleted.\r\n */\r\n(function webStorageHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousModule = global.NewHomeSource.WebStorageHandler;\r\n\r\n /**\r\n * @constructs NewHomeSource.WebStorageHandler\r\n */\r\n function WebStorageHandler() { }\r\n\r\n const CONFIGURATION = (function () {\r\n const constants = {\r\n localStorage: 'localStorage',\r\n sessionStorage: 'sessionStorage',\r\n };\r\n\r\n const get = function (key) {\r\n return constants[key];\r\n };\r\n\r\n return {\r\n get\r\n };\r\n }());\r\n\r\n /**\r\n * @private\r\n * @description Helper to parse a string to json, handles the exception if the string is not parseable.\r\n * @param {string} string The string to check if can be parsed to Json.\r\n * @returns {any} Json object if the string is parseable, null otherwise.\r\n */\r\n function parseToJson(string) {\r\n let json;\r\n\r\n try {\r\n json = JSON.parse(string);\r\n } catch (e) {\r\n json = null;\r\n }\r\n\r\n return json;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} key The name of the key.\r\n * @param {string} value The value to save for that key.\r\n * @param {number} maxAgeInSeconds The amount of time in seconds the item should be valid.\r\n * @param {string} storageType The storage api we want to use.\r\n */\r\n function setItemInStorage(key, value, maxAgeInSeconds, storageType) {\r\n if (!global.localStorage) {\r\n return;\r\n }\r\n\r\n const data = {\r\n creationDate: new Date().getTime(),\r\n maxAgeInSeconds: maxAgeInSeconds > 0\r\n ? maxAgeInSeconds\r\n : 0\r\n };\r\n\r\n // workaround for resource combiner because it doesn't allows me to do something like [key]: value\r\n // inside a json object declaration. just die already please.\r\n // ToDo remove this workaround when migrating this module to gulp.\r\n data[key] = value;\r\n\r\n if (storageType === CONFIGURATION.get('localStorage')) {\r\n global.localStorage.setItem(key, JSON.stringify(data));\r\n } else if (storageType === CONFIGURATION.get('sessionStorage')) {\r\n global.sessionStorage.setItem(key, JSON.stringify(data));\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @description Removes a value stored in the browser's api storage.\r\n * @param {any} key The key to remove from storage.\r\n * @param {any} storageType The storage api we want to use.\r\n */\r\n function removeItemFromStorage(key, storageType) {\r\n if (!global[storageType]) {\r\n return;\r\n }\r\n\r\n global[storageType].removeItem(key);\r\n }\r\n\r\n /**\r\n * @description Gets a value stored in the browser's api storage.\r\n * @param {string} key The name of the key.\r\n * @param {string} storageType The storage api we want to use.\r\n * @returns The item stored in the browser's storage.\r\n */\r\n function getItemFromStorage(key, storageType) {\r\n if (!global[storageType]) {\r\n return null;\r\n }\r\n\r\n let data = global[storageType].getItem(key);\r\n\r\n if (data === null) {\r\n return null;\r\n }\r\n\r\n data = parseToJson(data);\r\n\r\n if (data === null || data[key] === undefined) {\r\n return null;\r\n }\r\n\r\n if (data.maxAgeInSeconds === 0) {\r\n return data[key];\r\n }\r\n\r\n const currentDate = new Date().getTime();\r\n const differenceInSeconds = Math.floor((currentDate - data.creationDate) / 1000);\r\n\r\n if (differenceInSeconds > data.maxAgeInSeconds) {\r\n global[storageType].removeItem(key);\r\n return null;\r\n }\r\n\r\n return data[key];\r\n }\r\n\r\n /**\r\n * @public\r\n * @description: Saves a key/value pair in the browser's local storage,\r\n * if the browser supports the Window.localStorage api.\r\n * @param {string} key The name of the key.\r\n * @param {any} value The value to save for that key.\r\n * @param {number} maxAgeInSeconds The amount of time in seconds the item should be valid.\r\n * If not provided, the item will always be valid.\r\n */\r\n WebStorageHandler.setLocalStorageItem = function (key, value, maxAgeInSeconds) {\r\n const storageType = CONFIGURATION.get('localStorage');\r\n setItemInStorage(key, value, maxAgeInSeconds, storageType);\r\n };\r\n\r\n /**\r\n * @public\r\n * @description: Saves a key/value pair in the browser's session storage,\r\n * if the browser supports the Window.sessionStorage api.\r\n * @param {string} key The name of the key.\r\n * @param {any} value The value to save for that key.\r\n * @param {number} maxAgeInSeconds The amount of time the item should be valid, in seconds.\r\n * If not provided, the item will always be valid.\r\n */\r\n WebStorageHandler.setSessionStorageItem = function (key, value, maxAgeInSeconds) {\r\n const storageType = CONFIGURATION.get('sessionStorage');\r\n setItemInStorage(key, value, maxAgeInSeconds, storageType);\r\n };\r\n\r\n /**\r\n * @public\r\n * @description Removes a key/value stored in the browser's session storage,\r\n * if the browser supports the Window.sessionStorage api.\r\n * This method should only be used to remove data saved in the session storage\r\n * with the WebStorageHandler.setSessionStorageItem method.\r\n * @param {any} key The key to remove from session storage.\r\n */\r\n WebStorageHandler.removeSessionStorageItem = function (key) {\r\n const storageType = CONFIGURATION.get('sessionStorage');\r\n removeItemFromStorage(key, storageType);\r\n };\r\n\r\n /**\r\n * @public\r\n * @description Removes a key/value stored in the browser's local storage,\r\n * if the browser supports the Window.localStorage api.\r\n * This method should only be used to remove data saved in the local storage\r\n * with the WebStorageHandler.setLocalStorageItem method.\r\n * @param {any} key The key to remove from session storage.\r\n */\r\n WebStorageHandler.removeLocalStorageItem = function (key) {\r\n const storageType = CONFIGURATION.get('localStorage');\r\n removeItemFromStorage(key, storageType);\r\n };\r\n\r\n /**\r\n * @public\r\n * @description Gets a value stored in the browser's local storage,\r\n * if the browser supports the Window.localStorage api (returns null otherwise).\r\n * This method should only be used to retrieve data saved in the local storage\r\n * with the WebStorageHandler.setLocalStorageItem method.\r\n * @param {string} key The name of the key to retrieve from the local storage\r\n * @returns The item stored in the local storage.\r\n */\r\n WebStorageHandler.getLocalStorageItem = function (key) {\r\n const storageType = CONFIGURATION.get('localStorage');\r\n\r\n return getItemFromStorage(key, storageType);\r\n };\r\n\r\n /**\r\n * @public\r\n * @description Gets a value stored in the browser's session storage,\r\n * if the browser supports the Window.sessionStorage api (returns null otherwise).\r\n * This method should only be used to retrieve data saved in the session storage\r\n * with the WebStorageHandler.setSessionStorageItem method.\r\n * @param {string} key The name of the key to retrieve from the session storage\r\n * @returns The item stored in the local storage.\r\n */\r\n WebStorageHandler.getSessionStorageItem = function (key) {\r\n const storageType = CONFIGURATION.get('sessionStorage');\r\n\r\n return getItemFromStorage(key, storageType);\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n WebStorageHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.WebStorageHandler = previousModule;\r\n return WebStorageHandler;\r\n };\r\n\r\n global.NewHomeSource.WebStorageHandler = WebStorageHandler;\r\n\r\n return WebStorageHandler;\r\n}(window));\r\n","/*\r\n * This module is for TDV events.\r\n * To start tracking you will need to the following data attribute\r\n * data-builder='builder id value'\r\n * data-community='community id value'\r\n * data-parent-community-id='parent community id value'\r\n * data-community-list='list id of communities value'\r\n * data-market='market id value'\r\n * data-plan-id='plan id value'\r\n * data-spec-id='spec id value'\r\n * data-basic-listing-id='basic listing id value'\r\n * data-refer='refer value'\r\n * data-totalHomes='totalHomes value'\r\n * data-builder-community-list='BuilderId CommunityId ParentCommunityId MarketId,'\r\n * data-basic-listing-list='BuilderId ListingId,'\r\n * data-home-list='homeId (s||p),'\r\n */\r\n\r\n(function tdvTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n const isBasic = document.getElementById('IsBasic');\r\n const previousModule = global.NewHomeSource.Analytics.TdvTracker;\r\n const inputSiteRoot = document.querySelector('#nhs_siteRootLogger');\r\n const siteRoot = (inputSiteRoot && inputSiteRoot.value) || '/';\r\n const baseUrl = siteRoot + 'eventlogger/logevent-[EventCode]';\r\n const googleEcommercePushUrl = '/googleanalytics/getgoogleecommercepush';\r\n const paramsEventLogger = ['builder', 'community', 'parentCommunityId', 'market', 'planId', 'specId',\r\n 'basicListingId', 'refer', 'totalHomes'];\r\n const parametersEventMapper = {\r\n communityId: 'community',\r\n marketId: 'market'\r\n };\r\n const paramsByQueryString = ['communityList', 'builderCommunityList', 'basicListingList', 'homeList',\r\n 'homeImpression'];\r\n const basicListingParameters = ['market', 'basicListingId', 'basicListingList'];\r\n const configurations = {\r\n eventPrefix: 'data-tdv-event-label',\r\n impressionPrefix: 'data-tdv-impression-label',\r\n isBasic: isBasic && isBasic.value === 'True'\r\n };\r\n\r\n function getBasicListingParameters(parameters) {\r\n const basicParams = [];\r\n basicListingParameters.forEach((param) => {\r\n if (parameters[param] && parameters[param] !== '0') {\r\n basicParams[param] = parameters[param];\r\n }\r\n });\r\n\r\n return basicParams;\r\n }\r\n\r\n function getParamsToUse(parameters) {\r\n return parameters.isBasicListing === 'true' ? getBasicListingParameters(parameters) : parameters;\r\n }\r\n\r\n /**\r\n * @private\r\n * Gets rthe correct naming for the TDV events.\r\n * @returns The correct TDV parameter name.\r\n */\r\n function getTdvAttributeName(datasetAttributeName) {\r\n const tdvParameter = parametersEventMapper[datasetAttributeName] || datasetAttributeName;\r\n return tdvParameter;\r\n }\r\n\r\n /**\r\n * @private\r\n * createUrl: create the url with the parameters reviced, it will match with keys of urls object\r\n * with the keys of dataset of the element.\r\n *\r\n * @param {String} url base url to be requested.\r\n * @param {Array} parameters that match with urls object keys and use the value to replace [Id].\r\n * @returns the url to be requested for logging.\r\n */\r\n function createUrl(url, parameters) {\r\n let getUrl = url;\r\n let parameterSeparator = '?';\r\n const keysParameters = Object.keys(getParamsToUse(parameters));\r\n for (let index = 0; index < keysParameters.length; index += 1) {\r\n const parameter = keysParameters[index];\r\n const cleanParameter = parameter.replaceAll('-', '').toLowerCase();\r\n const cleanParamsEventLogger = paramsEventLogger.map((value) => value.toLowerCase());\r\n const position = cleanParamsEventLogger.indexOf(cleanParameter);\r\n if (position > -1 && parameters[parameter] && parameters[parameter] !== '0') {\r\n getUrl += '/' + paramsEventLogger[position] + '-' + parameters[parameter];\r\n }\r\n }\r\n\r\n getUrl += '/GAClientId-' + configurations.data.googleAnalyticsClientId.getValue(true) +\r\n '/GAUserId-' + configurations.data.googleAnalyticsUserId.getValue(true);\r\n\r\n keysParameters.forEach((parameter) => {\r\n const cleanParameter = parameter.replaceAll('-', '').toLowerCase();\r\n const cleanParamsEventLogger = paramsByQueryString.map((value) => value.toLowerCase());\r\n const position = cleanParamsEventLogger.indexOf(cleanParameter);\r\n if (position > -1 && parameters[parameter] && parameters[parameter] !== '0') {\r\n getUrl += parameterSeparator + paramsByQueryString[position] + '=' + parameters[parameter];\r\n parameterSeparator = '&';\r\n }\r\n });\r\n\r\n return getUrl;\r\n }\r\n\r\n /**\r\n * @private\r\n * postRequest: to create an HTTP Post request to send data.\r\n *\r\n * @param {String} url to be requested.\r\n * @param {Object} data with the information to log.\r\n * @param {Function} successCallback to be executed on request is success.\r\n */\r\n function postRequest(url, data, successCallback) {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', url, true);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.send(JSON.stringify(data));\r\n\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState !== 4) {\r\n return;\r\n }\r\n\r\n if (xhr.status === 200) {\r\n if (typeof successCallback === 'function') {\r\n successCallback(xhr.response);\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * logGoogleEcommerceEvent: log google ecommerce event and execute in datalayer.\r\n *\r\n * @param {String} eventName event to be logged on analytics\r\n * @param {Array} parameters data used to get the information from the page.\r\n */\r\n function logGoogleEcommerceEvent(eventName, parameters) {\r\n const isMpc = parameters.parentCommunity !== 0;\r\n const params = {\r\n eventName,\r\n communityId: parameters.community,\r\n specId: parameters.spec,\r\n planId: parameters.plan,\r\n builderName: parameters.builderName || '',\r\n communitiesIdsList: parameters.buildercommunitylist,\r\n homesIdsList: parameters.homeList,\r\n isMpc\r\n };\r\n postRequest(googleEcommercePushUrl, params, (result) => {\r\n // The GetDataLayerPush method of the Google Analytics Controller returns a js that needs to be executed\r\n // eslint-disable-next-line no-eval\r\n eval(result);\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * logEvent: log event related to TDV.\r\n *\r\n * @param {String} eventCode that will be tracker.\r\n * @param {Array} parameters that will be add on the url to track.\r\n */\r\n function logEvent(eventCode, parameters) {\r\n if (eventCode) {\r\n const url = baseUrl.replace('[EventCode]', eventCode);\r\n const urlToRequest = createUrl(url, parameters);\r\n logGoogleEcommerceEvent(eventCode, parameters);\r\n postRequest(urlToRequest);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * Checks if the parent community id belongs to a MPC that was already visited.\r\n * @param {number} parentCommunityId\r\n * @returns The same parent community id if the MPC was visited, 0 otherwise.\r\n */\r\n function getValidParentCommunityId(parentCommunityId) {\r\n if (parentCommunityId === 0) {\r\n return 0;\r\n }\r\n\r\n const isVisitedMpc = configurations.data.visitedMpcIds();\r\n\r\n if (!isVisitedMpc || isVisitedMpc.indexOf(parentCommunityId) === -1) {\r\n return 0;\r\n }\r\n\r\n return parentCommunityId;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.TdvTracker\r\n */\r\n function TdvTracker(globalValues) {\r\n configurations.data = globalValues;\r\n }\r\n\r\n /**\r\n * Gets the dataset information to be used for loggin the TDV Events.\r\n * @param {HTMLElement} eventTarget Element where the event was triggered.\r\n * @returns An object with the dataset to be used on the TDV events.\r\n */\r\n function getTdvEventDataset(eventTarget) {\r\n const parentTdvContainer = eventTarget.closest('[data-tdv-container]');\r\n const parentTdvDataset = parentTdvContainer ? parentTdvContainer.dataset : {};\r\n const mergedDataset = { ...parentTdvDataset, ...eventTarget.dataset };\r\n mergedDataset.parentCommunity = getValidParentCommunityId(eventTarget.dataset.parentCommunity);\r\n\r\n const datasetAttributesList = Object.entries(mergedDataset);\r\n const tdvEventDatasetAttributesList = datasetAttributesList.map(([name, value]) => {\r\n const tdvAttributeName = getTdvAttributeName(name);\r\n\r\n return [tdvAttributeName, value];\r\n });\r\n const tdvEventDataset = Object.fromEntries(tdvEventDatasetAttributesList);\r\n\r\n return tdvEventDataset;\r\n }\r\n\r\n /**\r\n * @public\r\n * eventTracker: send data related to user action events.\r\n */\r\n TdvTracker.eventTracker = function eventTracker() {\r\n const eventLabel = this.getAttribute(configurations.eventPrefix).split(',');\r\n\r\n if (!eventLabel) {\r\n return true;\r\n }\r\n\r\n const tdvDataset = getTdvEventDataset(this);\r\n eventLabel.forEach((event) => {\r\n logEvent(event, tdvDataset);\r\n });\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * impressionTracker: send data related to display events.\r\n */\r\n TdvTracker.impressionTracker = function impressionTracker() {\r\n for (let index = 0; index < this.length; index += 1) {\r\n const eventLabel = this[index].getAttribute(configurations.impressionPrefix).split(',');\r\n\r\n if (!eventLabel) {\r\n return true;\r\n }\r\n\r\n const tdvDataset = getTdvEventDataset(this[index]);\r\n eventLabel.forEach((event) => {\r\n logEvent(event, tdvDataset);\r\n });\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * eventTrackerValidator: validates if the dataset passed as parameter represents a segment event being tracked.\r\n */\r\n TdvTracker.eventTrackerValidator = function eventTrackerValidator(dataset) {\r\n if (dataset.tdvEventLabel) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTrackerValidator: validates if the dataset passed as parameter represents a segment event being tracked.\r\n */\r\n TdvTracker.onDemandTrackerValidator = function eventTrackerValidator(data) {\r\n return data && data.eventType === 'tdvEvent';\r\n };\r\n\r\n /**\r\n * @public\r\n * onDemandTracker: send data related to events that cannot be mapped to the HTML.\r\n *\r\n * @param {object} status of the scheduled idle task.\r\n */\r\n TdvTracker.onDemandTracker = function onDemandTracker() {\r\n const label = this.label;\r\n\r\n if (!label) {\r\n return true;\r\n }\r\n\r\n this.parentCommunity = getValidParentCommunityId(this.parentCommunity);\r\n logEvent(label, this);\r\n\r\n return true;\r\n };\r\n /**\r\n * @public\r\n * impressionTrackerSelector: returns the expression that can be used to query the DOM.\r\n */\r\n TdvTracker.impressionTrackerSelector = function impressionTrackerSelector() {\r\n return configurations.impressionPrefix;\r\n };\r\n\r\n TdvTracker.identityTracker = function identityTracker() {\r\n const elementIdentity = this.form.querySelector('[data-tdv-identity]');\r\n\r\n if (!elementIdentity) {\r\n return true;\r\n }\r\n\r\n const data = elementIdentity.dataset;\r\n\r\n if (!data.eventCode) {\r\n return true;\r\n }\r\n\r\n data.parentCommunity = getValidParentCommunityId(data.parentCommunity);\r\n logEvent(data.eventCode, data);\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * identityTrackerValidator: validates if the dataset passed as parameter represents a segment identity being tracked.\r\n */\r\n TdvTracker.identityTrackerValidator = function identityTrackerValidator(dataset) {\r\n return !!dataset.tdvIdentity;\r\n };\r\n\r\n TdvTracker.buildTagWithEvent = function (element, event, attributes) {\r\n element.setAttribute('data-event', 'true');\r\n element.setAttribute('data-tdv-event-label', event);\r\n attributes.forEach((attr) => {\r\n element.setAttribute(attr.name, attr.value);\r\n });\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Segment to the previous script.\r\n */\r\n TdvTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.TdvTracker = previousModule;\r\n return TdvTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.TdvTracker = TdvTracker;\r\n}(window));\r\n","(function idleValue(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n if (!global.NewHomeSource.Modules.requestIdleCallback) {\r\n return;\r\n }\r\n\r\n const previousIdleValue = global.NewHomeSource.Modules.IdleValue;\r\n const cancelIdleCallbackFunction = global.NewHomeSource.Modules.requestIdleCallback.cIC;\r\n const requestIdleCallbackFunction = global.NewHomeSource.Modules.requestIdleCallback.rIC;\r\n\r\n /**\r\n * @private\r\n *\r\n * initVariable: assign the value of the variable from the callback;\r\n */\r\n function initVariable() {\r\n this.value = this.callback();\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Modules.IdleValue\r\n *\r\n * @param {function} callback that initializes a value for a variable.\r\n */\r\n function IdleValue(callback) {\r\n this.callback = callback;\r\n this.value = undefined;\r\n this.init = requestIdleCallbackFunction(initVariable.bind(this));\r\n }\r\n\r\n /**\r\n * @public\r\n * cancelIdleInit: cancels the init of the IdleValue.\r\n */\r\n IdleValue.prototype.cancelIdleInit = function cancelIdleInit() {\r\n if (!this.init) {\r\n return;\r\n }\r\n\r\n cancelIdleCallbackFunction(this.init);\r\n this.init = null;\r\n };\r\n\r\n /**\r\n * @public\r\n * getValue: gets the value from the IdleValue.\r\n *\r\n * @param {boolean} retryIfNull take null value as wrong values and execute the callback.\r\n */\r\n IdleValue.prototype.getValue = function getValue(retryIfNull) {\r\n if (this.value === undefined || (retryIfNull && this.value === null)) {\r\n this.cancelIdleInit();\r\n this.value = this.callback();\r\n }\r\n\r\n return this.value;\r\n };\r\n\r\n /**\r\n * @public\r\n * setValue: sets a new value to the IdleValue.\r\n *\r\n * @param {any} value to be assigned.\r\n */\r\n IdleValue.prototype.setValue = function setValue(value) {\r\n this.cancelIdleInit();\r\n this.value = value;\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Modules.IdleValue to the previous script.\r\n */\r\n IdleValue.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.IdleValue = previousIdleValue;\r\n return IdleValue;\r\n };\r\n\r\n global.NewHomeSource.Modules.IdleValue = IdleValue;\r\n}(window));\r\n","(function idleQueue(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n if (!global.NewHomeSource.Modules.requestIdleCallback) {\r\n return;\r\n }\r\n\r\n const previousIdleQueue = global.NewHomeSource.idleQueue;\r\n const isSafari = !!(typeof global.safari === 'object' && global.safari.pushNotification);\r\n const minTaskTime = 10;\r\n const requestIdleCallbackFunction = global.NewHomeSource.Modules.requestIdleCallback.rIC;\r\n const cancelIdleCallbackFunction = global.NewHomeSource.Modules.requestIdleCallback.cIC;\r\n\r\n /**\r\n * @private\r\n * shouldYield: true if no deadline is defined or if the timeRemaining\r\n * is not greater than the minimumTaskTime, otherwise false.\r\n *\r\n * @param {number} deadline reamining time available from the request idle callback.\r\n * @param {number} minimumTaskTime minimum ramianing time available to execute the task.\r\n */\r\n function shouldYield(deadline, minimumTaskTime) {\r\n if (deadline <= minimumTaskTime) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * scheduleTasksToRun: schedules the task queue to be processed.\r\n *\r\n * @param {boolean} retry true if the task should be enqueue in case of error, otherwise false.\r\n */\r\n function scheduleTasksToRun(retry) {\r\n if (this.idleCallbackHandle) {\r\n return;\r\n }\r\n\r\n // eslint-disable-next-line no-use-before-define\r\n this.idleCallbackHandle = requestIdleCallbackFunction(runTasks.bind(this, retry));\r\n }\r\n\r\n /**\r\n * @private\r\n * runTasks: runs as many tasks in the queue as it can before reaching the deadline.\r\n * If no deadline is pass, it will run all tasks.\r\n *\r\n * @param {boolean} retry true if the task should be enqueue in case of error, otherwise false.\r\n * @param {IdleDeadline} deadline input parameter to idle callbacks.\r\n */\r\n function runTasks(retry, deadline) {\r\n // Do not start processing the pending tasks until the DOM has reached the ready state.\r\n const isDomCompleted = global.document.readyState === 'complete';\r\n this.cancelScheduledRun();\r\n\r\n if (this.isProcessing) {\r\n return;\r\n }\r\n\r\n this.isProcessing = true;\r\n\r\n while (this.hasPendingTasks() && isDomCompleted) {\r\n const remainingTime = deadline ? deadline.timeRemaining() : 50;\r\n\r\n if (shouldYield(remainingTime, this.taskQueue[0].minTaskTime)) {\r\n break;\r\n }\r\n\r\n const taskToRun = this.taskQueue.shift();\r\n const isExecuted = taskToRun.task(taskToRun.state);\r\n const timeLapsed = +new Date() - taskToRun.state.time;\r\n\r\n if (!isExecuted && retry && timeLapsed < 15000) {\r\n this.pushTask(taskToRun.task, taskToRun.state.time);\r\n }\r\n }\r\n\r\n if (this.hasPendingTasks()) {\r\n if (isDomCompleted) {\r\n scheduleTasksToRun.call(this, retry);\r\n } else {\r\n window.addEventListener('load', scheduleTasksToRun.bind(this, retry));\r\n }\r\n }\r\n\r\n this.isProcessing = false;\r\n }\r\n\r\n /**\r\n * @public\r\n * onVisibilityChange: exectutes the pending tasks in a sync way when the page is hidden.\r\n */\r\n function onVisibilityChange() {\r\n if (document.visibilityState !== 'hidden') {\r\n return;\r\n }\r\n\r\n this.runTasksImmediately();\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Modules.IdleQueue\r\n */\r\n function IdleQueue(name) {\r\n this.idleCallbackHandle = null;\r\n this.taskQueue = [];\r\n this.isProcessing = false;\r\n this.id = name;\r\n\r\n if (isSafari) {\r\n global.addEventListener('beforeunload', IdleQueue.prototype.runTasksImmediately.bind(this), true);\r\n }\r\n\r\n global.addEventListener('visibilitychange', onVisibilityChange.bind(this), true);\r\n }\r\n\r\n /**\r\n * @public\r\n * cancelScheduledRun: cancels any scheduled idle callback and removes the handler.\r\n */\r\n IdleQueue.prototype.cancelScheduledRun = function cancelScheduledRun() {\r\n cancelIdleCallbackFunction(this.idleCallbackHandle);\r\n this.idleCallbackHandle = null;\r\n };\r\n\r\n /**\r\n * @public\r\n * hasPendingTasks: true if the queue still has tasks pending to run, otherwise false.\r\n */\r\n IdleQueue.prototype.hasPendingTasks = function hasPendingTasks() {\r\n return this.taskQueue.length > 0;\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * pushTask: adds a new task to the idleQueue to be executed.\r\n * @param {function} task to be executed.\r\n * @param {number} time when the task was added to the queue.\r\n */\r\n IdleQueue.prototype.pushTask = function pushTask(task, time) {\r\n if (typeof task !== 'function') {\r\n return;\r\n }\r\n\r\n const taskToRun = {\r\n id: this.id,\r\n minTaskTime,\r\n task,\r\n state: {\r\n time: time || +new Date(),\r\n visibilityState: global.document.visibilityState\r\n }\r\n };\r\n\r\n this.taskQueue.push(taskToRun);\r\n scheduleTasksToRun.call(this, true);\r\n };\r\n\r\n /**\r\n * @public\r\n * runTasksImmediately: runs all the pending tasks in sync way.\r\n */\r\n IdleQueue.prototype.runTasksImmediately = function runTasksImmediately() {\r\n runTasks.call(this, false);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Modules.IdleQueue to the previous script.\r\n */\r\n IdleQueue.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.IdleQueue = previousIdleQueue;\r\n return IdleQueue;\r\n };\r\n\r\n global.NewHomeSource.Modules.IdleQueue = IdleQueue;\r\n}(window));\r\n","(function eventTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const previousEventTracker = global.NewHomeSource.Analytics.eventTracker;\r\n const configurations = {\r\n hasBeenAttached: false\r\n };\r\n const onTouchProperties = {\r\n startX: 0,\r\n startY: 0,\r\n distX: 0,\r\n distY: 0\r\n };\r\n\r\n function inspectEvent(event, target) {\r\n const inspectedElement = target || event.target;\r\n\r\n if (!inspectedElement || !inspectedElement.dataset || !inspectedElement.dataset.event) {\r\n if (inspectedElement.parentElement && inspectedElement.parentElement.tagName !== 'BODY') {\r\n inspectEvent(event, inspectedElement.parentElement);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (event.type === 'mousedown' && inspectedElement.dataset.eventType !== 'mousedown') {\r\n return;\r\n }\r\n\r\n if (event.type === 'touchend' && inspectedElement.dataset.eventType !== 'touchend') {\r\n return;\r\n }\r\n if (event.type === 'change' && inspectedElement.dataset.eventType !== 'change') {\r\n return;\r\n }\r\n\r\n const dataset = inspectedElement.dataset;\r\n\r\n for (let index = 0; index < configurations.totalHandlers; index += 1) {\r\n const handler = configurations.handlers[index].eventTracker;\r\n const validator = configurations.handlers[index].eventTrackerValidator;\r\n\r\n if (validator(dataset, inspectedElement)) {\r\n configurations.queue.pushTask(handler.bind(inspectedElement));\r\n }\r\n }\r\n\r\n if (inspectedElement.dataset.eventForget) {\r\n delete inspectedElement.dataset.event;\r\n }\r\n }\r\n\r\n /**\r\n * touchend event handler\r\n * @param {event} event The touchstart event\r\n */\r\n function onTouchStartEvent(event) {\r\n onTouchProperties.startX = event.changedTouches[0].pageX;\r\n onTouchProperties.startY = event.changedTouches[0].pageY;\r\n }\r\n\r\n /**\r\n * touchend event handler\r\n * @param {event} event The touchend event\r\n */\r\n function onTouchEndEvent(event) {\r\n onTouchProperties.distX = event.changedTouches[0].pageX - onTouchProperties.startX;\r\n onTouchProperties.distY = event.changedTouches[0].pageY - onTouchProperties.startY;\r\n\r\n if (Math.abs(onTouchProperties.distX) >= 7 || Math.abs(onTouchProperties.distY) >= 10) {\r\n return;\r\n }\r\n\r\n inspectEvent(event);\r\n }\r\n\r\n /**\r\n * on change event handler\r\n * @param {event} event The on change event\r\n */\r\n function onChangeEvent(event) {\r\n let inspectedElement = event.target;\r\n\r\n if (!inspectedElement) {\r\n return;\r\n }\r\n\r\n if (inspectedElement.nodeName === 'SELECT') {\r\n inspectedElement = inspectedElement[inspectedElement.selectedIndex];\r\n }\r\n\r\n inspectEvent(event, inspectedElement);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.EventTracker;\r\n *\r\n * @param {IdleQueue} eventsQueue that runs the tasks on idle periods.\r\n * @param {Array} handlers that will react to the impression tracking.\r\n */\r\n function EventTracker(eventsQueue, handlers) {\r\n configurations.queue = eventsQueue;\r\n configurations.handlers = [];\r\n\r\n const totalHandlers = handlers.length;\r\n\r\n for (let index = 0; index < totalHandlers; index += 1) {\r\n if (handlers[index] &&\r\n typeof handlers[index].eventTracker === 'function' &&\r\n typeof handlers[index].eventTrackerValidator === 'function') {\r\n configurations.handlers.push(handlers[index]);\r\n }\r\n }\r\n\r\n configurations.totalHandlers = configurations.handlers.length;\r\n }\r\n\r\n /**\r\n * @public\r\n * init: attaches a event listeners to the mousedown and click events.\r\n */\r\n EventTracker.init = function init() {\r\n if (configurations.hasBeenAttached) {\r\n return;\r\n }\r\n\r\n configurations.hasBeenAttached = true;\r\n\r\n // As in some places of the code developers break the bubbling behavior we listen for both events\r\n // mousedown and click. Only one of them will be handled, click as default and mousedown\r\n // when indicated as data attribute.\r\n document.addEventListener('touchstart', onTouchStartEvent, { passive: true });\r\n document.addEventListener('touchend', onTouchEndEvent, { passive: true });\r\n document.addEventListener('mousedown', inspectEvent, { composed: true, useCapture: true });\r\n document.addEventListener('click', inspectEvent, { composed: true, useCapture: true });\r\n document.addEventListener('change', onChangeEvent, { composed: true, useCapture: true });\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Analytics.eventTracker to the previous script.\r\n */\r\n EventTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.eventTracker = previousEventTracker;\r\n return EventTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.eventTracker = EventTracker;\r\n}(window));\r\n","(function identityTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const previousIdentityTracker = global.NewHomeSource.Analytics.identityTracker;\r\n const configurations = {\r\n hasBeenAttached: false\r\n };\r\n\r\n /**\r\n * @private\r\n * closestForm: finds the closes Form element that contains the given inspectedElement.\r\n *\r\n * @param {HTMLNodeElement} inspectedElement which parents are being analyzed.\r\n */\r\n function closestForm(inspectedElement) {\r\n if (inspectedElement.tagName === 'FORM') {\r\n return inspectedElement;\r\n }\r\n\r\n if (inspectedElement.parentElement && inspectedElement.parentElement.tagName !== 'BODY') {\r\n return closestForm(inspectedElement.parentElement);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n function inspectEvent(event, target) {\r\n const inspectedElement = target || event.target;\r\n\r\n if (!inspectedElement || !inspectedElement.dataset || !inspectedElement.dataset.identity || event.button !== 0) {\r\n if (inspectedElement.parentElement && inspectedElement.parentElement.tagName !== 'BODY') {\r\n inspectEvent(event, inspectedElement.parentElement);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (event.type === 'mousedown' && inspectedElement.dataset.eventType !== 'mousedown') {\r\n return;\r\n }\r\n\r\n const dataset = inspectedElement.dataset;\r\n const form = closestForm(inspectedElement);\r\n\r\n if (!form || !form.reportValidity()) {\r\n return;\r\n }\r\n\r\n const data = {\r\n caller: inspectedElement.cloneNode(true),\r\n form: form.cloneNode(true)\r\n };\r\n\r\n for (let index = 0; index < configurations.totalHandlers; index += 1) {\r\n const handler = configurations.handlers[index].identityTracker;\r\n const validator = configurations.handlers[index].identityTrackerValidator;\r\n\r\n if (validator(dataset)) {\r\n configurations.queue.pushTask(handler.bind(data));\r\n }\r\n }\r\n\r\n if (inspectedElement.dataset.eventForget) {\r\n delete inspectedElement.dataset.event;\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.IdentityTracker;\r\n *\r\n * @param {IdleQueue} eventsQueue that runs the tasks on idle periods.\r\n * @param {Array} handlers that will react to the impression tracking.\r\n */\r\n function IdentityTracker(eventsQueue, handlers) {\r\n configurations.queue = eventsQueue;\r\n configurations.handlers = [];\r\n\r\n const totalHandlers = handlers.length;\r\n\r\n for (let index = 0; index < totalHandlers; index += 1) {\r\n if (handlers[index] &&\r\n typeof handlers[index].identityTracker === 'function' &&\r\n typeof handlers[index].identityTrackerValidator === 'function') {\r\n configurations.handlers.push(handlers[index]);\r\n }\r\n }\r\n\r\n configurations.totalHandlers = configurations.handlers.length;\r\n }\r\n\r\n /**\r\n * @public\r\n * init: attaches a event listeners to the mousedown and click events.\r\n */\r\n IdentityTracker.init = function init() {\r\n if (configurations.hasBeenAttached) {\r\n return;\r\n }\r\n\r\n configurations.hasBeenAttached = true;\r\n\r\n // As in some places of the code developers break the bubbling behavior we listen for both events\r\n // mousedown and click. Only one of them will be handled, click as default and mousedown\r\n // when indicated as data attribute.\r\n document.addEventListener('mousedown', inspectEvent, { composed: true, useCapture: true });\r\n document.addEventListener('click', inspectEvent, { composed: true, useCapture: true });\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Analytics.eventTracker to the previous script.\r\n */\r\n IdentityTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.identityTracker = previousIdentityTracker;\r\n return IdentityTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.identityTracker = IdentityTracker;\r\n}(window));\r\n","(function impressionTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n const previousImpressionTracker = global.NewHomeSource.Analytics.impressionTracker;\r\n const configurations = {\r\n hasBeenAttached: false,\r\n mutationObserverOptions: {\r\n childList: true,\r\n subtree: true,\r\n },\r\n intersectionObserverOptions: {\r\n threshold: 0.5\r\n },\r\n };\r\n\r\n /**\r\n * @private\r\n * Iterates through all descends of a DOM node and pushes them to the nodes list.\r\n *\r\n * @param {Node} node The DOM node to walk.\r\n */\r\n function walkNodeTree(node) {\r\n let elementsAdded = [];\r\n\r\n if (node.nodeType === 1 && node.dataset && node.dataset.impression) {\r\n elementsAdded.push(node);\r\n }\r\n\r\n const childNodesLength = node.childNodes.length;\r\n\r\n for (let index = 0; index < childNodesLength; index += 1) {\r\n const child = node.childNodes[index];\r\n const childElements = walkNodeTree(child);\r\n\r\n if (childElements.length > 0) {\r\n elementsAdded = [].concat(elementsAdded, childElements);\r\n }\r\n }\r\n\r\n return elementsAdded;\r\n }\r\n\r\n /**\r\n * @private\r\n * handleDomMutations: callback to be execute after an element has been added to the DOM.\r\n *\r\n * @param {Array} mutations a list of MutationRecord intstances.\r\n */\r\n function handleDomMutations(mutations) {\r\n if (!mutations) {\r\n return;\r\n }\r\n\r\n let elementsAdded = [];\r\n const mutationsLength = mutations.length;\r\n\r\n for (let index = 0; index < mutationsLength; index += 1) {\r\n const mutation = mutations[index];\r\n const totalElementsAdded = mutation.addedNodes ? mutation.addedNodes.length : 0;\r\n\r\n for (let elementIndex = 0; elementIndex < totalElementsAdded; elementIndex += 1) {\r\n const addedElement = mutation.addedNodes[elementIndex];\r\n const impressionNodes = walkNodeTree(addedElement);\r\n\r\n if (impressionNodes.length > 0) {\r\n elementsAdded = [].concat(elementsAdded, impressionNodes);\r\n }\r\n }\r\n }\r\n\r\n if (elementsAdded.length === 0) {\r\n return;\r\n }\r\n\r\n for (let currentElement = 0; currentElement < elementsAdded.length; currentElement += 1) {\r\n configurations.intersectionObserver.observe(\r\n elementsAdded[currentElement],\r\n configurations.intersectionObserverOptions\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * handleDomMutations: callback to be execute after an element has been added to the DOM.\r\n *\r\n * @param {Array} mutations a list of MutationRecord intstances.\r\n */\r\n function handleMutationsOnViewPort(mutations) {\r\n if (!mutations) {\r\n return;\r\n }\r\n\r\n const elements = [];\r\n let currentMutation;\r\n for (let index = 0; index < mutations.length; index += 1) {\r\n currentMutation = mutations[index];\r\n if (currentMutation.isIntersecting) {\r\n elements.push(currentMutation.target);\r\n if (currentMutation.target.dataset.noUnobserve !== 'true') {\r\n configurations.intersectionObserver.unobserve(currentMutation.target);\r\n }\r\n }\r\n }\r\n if (elements.length > 0) {\r\n let trackertElements = [];\r\n for (let index = 0; index < configurations.totalHandlers; index += 1) {\r\n const handler = configurations.handlers[index];\r\n const selector = configurations.handlers[index].impressionTrackerSelector();\r\n for (let count = 0; count < elements.length; count += 1) {\r\n const element = elements[count];\r\n if (typeof selector === 'string' && element.getAttribute(selector) !== null) {\r\n trackertElements.push(element);\r\n }\r\n }\r\n if (trackertElements.length > 0) {\r\n configurations.queue.pushTask(handler.impressionTracker.bind(trackertElements));\r\n }\r\n trackertElements = [];\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * handleMutationsAsync: callback to be execute after an element has been added to the DOM async.\r\n *\r\n * @param {Array} mutations a list of MutationRecord intstances.\r\n */\r\n function handleMutationsAsync(mutations) {\r\n setTimeout(() => handleDomMutations(mutations), 0);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.impressionTracker\r\n *\r\n * @param {IdleQueue} eventsQueue that runs the tasks on idle periods.\r\n * @param {Array} handlers that will react to the impression tracking.\r\n */\r\n function ImpressionTracker(eventsQueue, handlers) {\r\n if (!global.MutationObserver) {\r\n return;\r\n }\r\n\r\n configurations.queue = eventsQueue;\r\n configurations.handlers = [];\r\n\r\n const totalHandlers = handlers.length;\r\n\r\n for (let index = 0; index < totalHandlers; index += 1) {\r\n if (handlers[index] &&\r\n typeof handlers[index].impressionTracker === 'function' &&\r\n typeof handlers[index].impressionTrackerSelector === 'function') {\r\n configurations.handlers.push(handlers[index]);\r\n }\r\n }\r\n\r\n configurations.totalHandlers = configurations.handlers.length;\r\n }\r\n\r\n /**\r\n * @public\r\n * init: creates a new MutationObserver to observe changes in the body of the document.\r\n */\r\n ImpressionTracker.init = function init() {\r\n if (configurations.hasBeenAttached) {\r\n return;\r\n }\r\n\r\n configurations.hasBeenAttached = true;\r\n configurations.mutationObserver = new global.MutationObserver(handleMutationsAsync);\r\n configurations.intersectionObserver = new global.IntersectionObserver(handleMutationsOnViewPort);\r\n configurations.mutationObserver.observe(global.document.body, configurations.mutationObserverOptions);\r\n\r\n for (let index = 0; index < configurations.totalHandlers; index += 1) {\r\n const handler = configurations.handlers[index];\r\n const elements = document.querySelectorAll('[' + handler.impressionTrackerSelector() + ']');\r\n for (let currentElement = 0; currentElement < elements.length; currentElement += 1) {\r\n configurations.intersectionObserver.observe(\r\n elements[currentElement],\r\n configurations.intersectionObserverOptions\r\n );\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n ImpressionTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.impressionTracker = previousImpressionTracker;\r\n return ImpressionTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.impressionTracker = ImpressionTracker;\r\n}(window));\r\n","(function onDemandTracker(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n const previousOnDemandTracker = global.NewHomeSource.Analytics.OnDemandTracker;\r\n const configurations = {\r\n hasBeenAttached: false\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.Analytics.onDemandTracker;\r\n *\r\n * @param {IdleQueue} eventsQueue that runs the tasks on idle periods.\r\n * @param {Array} handlers that will react to the impression tracking.\r\n */\r\n function OnDemandTracker(eventsQueue, handlers) {\r\n configurations.queue = eventsQueue;\r\n configurations.handlers = [];\r\n\r\n const totalHandlers = handlers.length;\r\n\r\n for (let index = 0; index < totalHandlers; index += 1) {\r\n if (handlers[index] &&\r\n typeof handlers[index].onDemandTracker === 'function') {\r\n configurations.handlers.push(handlers[index]);\r\n }\r\n }\r\n\r\n configurations.totalHandlers = configurations.handlers.length;\r\n }\r\n\r\n /**\r\n * @public\r\n * init: creates a new MutationObserver to observe changes in the body of the document.\r\n * Sets up a listener in the document.body for on demand events.\r\n */\r\n OnDemandTracker.init = function init() {\r\n if (configurations.hasBeenAttached) {\r\n return;\r\n }\r\n\r\n configurations.hasBeenAttached = true;\r\n\r\n document.body.addEventListener('trackOnDemandEvent', (event) => {\r\n for (let index = 0; index < configurations.totalHandlers; index += 1) {\r\n const handler = configurations.handlers[index].onDemandTracker;\r\n const validator = configurations.handlers[index].onDemandTrackerValidator;\r\n if (typeof validator === 'function' && validator(event.detail.data)) {\r\n configurations.queue.pushTask(handler.bind(event.detail.data));\r\n }\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Analytics.onDemandTracker to the previous script.\r\n */\r\n OnDemandTracker.noConflict = function noConflict() {\r\n global.NewHomeSource.Analytics.onDemandTracker = previousOnDemandTracker;\r\n return OnDemandTracker;\r\n };\r\n\r\n global.NewHomeSource.Analytics.onDemandTracker = OnDemandTracker;\r\n}(window));\r\n","(function navigationTiming(root) {\r\n 'use strict';\r\n\r\n /**\r\n * @private\r\n * isValidMetricTime: validates the value passed to be a number greater than 0.\r\n *\r\n * @param {object} value to be validated.\r\n * @returns true if the value is a valid number and greater or equals than zero.\r\n */\r\n function isValidMetricTime(value) {\r\n return !Number.isNaN(value) && value >= 0;\r\n }\r\n\r\n // Schema object to validate the information that is going to be send to Segment.\r\n const schema = {\r\n dns_lookup: isValidMetricTime,\r\n dom_complete: isValidMetricTime,\r\n dom_content_loaded: isValidMetricTime,\r\n dom_interactive: isValidMetricTime,\r\n page_load: isValidMetricTime,\r\n render_time: isValidMetricTime,\r\n tcp: isValidMetricTime,\r\n ttfb: isValidMetricTime\r\n };\r\n\r\n /**\r\n * @private\r\n * track: Dispatch a new trackOnDemandEvent with the data from the performance navigation.\r\n */\r\n function track() {\r\n requestAnimationFrame(() => {\r\n const performanceTiming = root.performance.getEntriesByType('navigation')[0];\r\n if (!performanceTiming) {\r\n return;\r\n }\r\n const eventForSegment = {\r\n dns_lookup: performanceTiming.domainLookupEnd - performanceTiming.domainLookupStart,\r\n dom_complete: performanceTiming.domComplete - performanceTiming.responseStart,\r\n dom_content_loaded: performanceTiming.domContentLoadedEventEnd - performanceTiming.fetchStart,\r\n dom_interactive: performanceTiming.domInteractive - performanceTiming.responseStart,\r\n event: 'Performance Metrics',\r\n eventType: 'segmentEvent',\r\n page_load: performanceTiming.loadEventEnd - performanceTiming.fetchStart,\r\n render_time: performanceTiming.domComplete - performanceTiming.domContentLoadedEventEnd,\r\n tcp: performanceTiming.connectEnd - performanceTiming.connectStart,\r\n ttfb: performanceTiming.responseStart - performanceTiming.fetchStart\r\n };\r\n\r\n Object.keys(schema).filter((key) => !schema[key](eventForSegment[key])).forEach((key) => {\r\n delete eventForSegment[key];\r\n });\r\n\r\n if (root.analytics) {\r\n root.document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: eventForSegment }\r\n }));\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * delayedTrack: creates a timeout to execute the track function,\r\n * seTimeout is needed to provide browser time to fill the domContentLoadedEventEnd timing.\r\n */\r\n function delayedTrack() {\r\n setTimeout(track, 500);\r\n }\r\n\r\n if (root.document.readyState === 'complete') {\r\n track();\r\n return;\r\n }\r\n\r\n root.addEventListener('load', delayedTrack);\r\n}(window));\r\n","(function userCredentials(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousUserCredentialsModule = global.NewHomeSource.UserCredentials;\r\n /**\r\n * @constructs NewHomeSource.userCredentials\r\n */\r\n function UserCredentials() {\r\n }\r\n\r\n /**\r\n * @public\r\n * get the status of user session\r\n */\r\n UserCredentials.isUserLogged = function () {\r\n return !!document.querySelector('[data-user-credentials]');\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.userCredentials to the previous script.\r\n */\r\n UserCredentials.noConflict = function noConflict() {\r\n global.NewHomeSource.UserCredentials = previousUserCredentialsModule;\r\n return UserCredentials;\r\n };\r\n\r\n global.NewHomeSource.UserCredentials = UserCredentials;\r\n\r\n return UserCredentials;\r\n}(window));\r\n","/**\r\n * If you need to add a new tracker check the bundles:\r\n * - SegmentBundle For NHS\r\n * - PartnerTrackersBundle for PL and CNA\r\n */\r\n(function index(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Analytics = global.NewHomeSource.Analytics || {};\r\n\r\n if (!global.NewHomeSource.Analytics.impressionTracker ||\r\n !global.NewHomeSource.Analytics.identityTracker ||\r\n !global.NewHomeSource.Analytics.eventTracker ||\r\n !global.NewHomeSource.Modules.IdleQueue ||\r\n !global.NewHomeSource.Modules.IdleValue ||\r\n !global.NewHomeSource.Modules.tagManager ||\r\n !global.NewHomeSource.Modules.cookieHandler ||\r\n !global.NewHomeSource.UserCredentials\r\n ) {\r\n return;\r\n }\r\n\r\n const nhsTrackingId = 'UA-40843711-4';\r\n\r\n /**\r\n * @private getCentralStandardTime: get Central Standard Time (Austin time).\r\n *\r\n */\r\n function getCentralStandardTime() {\r\n // Get current time\r\n const date = new Date();\r\n\r\n // The difference, in minutes, between the date as evaluated in the UTC time zone and\r\n // as evaluated in the local time zone. The actual local time algorithm is implementation-defined,\r\n // and the return value is allowed to be zero in runtimes without appropriate data.\r\n const browsertTimeZone = date.getTimezoneOffset();\r\n\r\n // convert browsertTimeZone to milliseconds\r\n // get UTC time in milliseconds\r\n const utc = date.getTime() + (browsertTimeZone * 60000);\r\n\r\n // Get the number of milliseconds of central standard time.\r\n // 3600000 is the conversion of hours to milliseconds\r\n // -5 is the GMT-5 time zone of austin. We just need to multply the value.\r\n // 3600000 * -5 = -18000000 milliseconds\r\n const centralStandardTimeZone = -18000000;\r\n\r\n // Calculate the new date with the central standard timezone.\r\n const now = new Date(utc + centralStandardTimeZone);\r\n\r\n return `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}` +\r\n `T${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}.${now.getMilliseconds()}-05:00`;\r\n }\r\n\r\n function getResultCount() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('matchingResults');\r\n }\r\n\r\n function getFiltersApplied() {\r\n const filtersApplied = global.NewHomeSource.Modules.tagManager.getFromDataLayer('filtersApplied');\r\n if (!filtersApplied) {\r\n return undefined;\r\n }\r\n\r\n const filters = JSON.parse(filtersApplied);\r\n const propNames = Object.getOwnPropertyNames(filters);\r\n for (let i = 0; i < propNames.length; i += 1) {\r\n const propName = propNames[i];\r\n if (filters[propName] === null || filters[propName] === false ||\r\n filters[propName] === 0 || filters[propName] === '') {\r\n delete filters[propName];\r\n }\r\n }\r\n return filters;\r\n }\r\n\r\n function getPageType() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('pageType');\r\n }\r\n\r\n function getSegmentAnonymousId() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('segmentAnonymousID');\r\n }\r\n\r\n function getBrandName() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('brandName');\r\n }\r\n\r\n function getBrandId() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('brandId');\r\n }\r\n\r\n function getCurrentPageNumber() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('currentPageNumber');\r\n }\r\n\r\n function getresponseVersion() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('adaptiveTemplate');\r\n }\r\n\r\n function getPartnerId() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('partnerId');\r\n }\r\n\r\n function getPartnerName() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('partnerName');\r\n }\r\n\r\n function getPriceReduction() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('priceReduction');\r\n }\r\n\r\n function getBrandPartnerName() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('brandPartnerName');\r\n }\r\n\r\n function getBrandPartnerNamePartnerName() {\r\n return `${getBrandPartnerName()}-${getPartnerName()}`;\r\n }\r\n\r\n function getCommunityId() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('communityId');\r\n }\r\n\r\n function getCommunityType() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('communityType');\r\n }\r\n\r\n /**\r\n * @private\r\n * getMarketId: get the market id of the current page.\r\n * The difference between @see {@link getUserMarketId} is that getMarketId gets the\r\n * market id depending on the page search by the user, and @see {@link getUserMarketId}\r\n * gets the market id accoding the real location (IP address) of the user.\r\n *\r\n * @returns market id from dataLayer.\r\n */\r\n function getMarketId() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('marketId') || '';\r\n }\r\n\r\n function getMarketName() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('marketName') || '';\r\n }\r\n\r\n function getCodeBuildVersion() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('buildCodeVersion');\r\n }\r\n\r\n function getAbTestsOnThePage() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('AbTestOnThisPage');\r\n }\r\n\r\n function getBuilderId() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('builderId');\r\n }\r\n\r\n function getBuilderDivision() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('builderDivision');\r\n }\r\n\r\n function getBuilderName() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('builderCorp');\r\n }\r\n\r\n function getCommunityName() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('communityName');\r\n }\r\n\r\n function getOffMarket() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('OffMarket');\r\n }\r\n\r\n function getPrimaryImageUrl() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('PrimaryImage');\r\n }\r\n\r\n function getLowPrice() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('PriceLow');\r\n }\r\n\r\n /**\r\n * @private hasIfp: get a value indicating if it has interactive floor plans images.\r\n *\r\n * @returns {boolean} indicating it has interactive floor plans images.\r\n */\r\n function hasIfp() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('hasIfp');\r\n }\r\n\r\n /**\r\n * @private hasIsp: get a value indicating if it has interactive site plans images.\r\n *\r\n * @returns {boolean} indicating it has interactive site plans images.\r\n */\r\n function hasIsp() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('hasIsp');\r\n }\r\n\r\n function getHomePrice() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('HomePrice');\r\n }\r\n\r\n function getHighPrice() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('PriceHigh');\r\n }\r\n\r\n /**\r\n * @private isLimitedAvailability: get a value indicating if it is limited availability.\r\n *\r\n * @returns {boolean} indicating it is limited availability.\r\n */\r\n function isLimitedAvailability() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('isLimitedAvailability');\r\n }\r\n\r\n /**\r\n * @private isPriced: get a value indicating if it has priced.\r\n *\r\n * @returns {boolean} indicating has priced.\r\n */\r\n function isPriced() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('isPriced');\r\n }\r\n\r\n function getCity() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('city');\r\n }\r\n\r\n function getCounty() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('County');\r\n }\r\n\r\n function getIUid() {\r\n return window.NewHomeSource.Modules.tagManager.getFromDataLayer('i_uid');\r\n }\r\n\r\n function getState() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('State');\r\n }\r\n\r\n function getZip() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('ZipCode');\r\n }\r\n\r\n function getPlanId() {\r\n if (!global.NewHomeSource.Modules.tagManager.getFromDataLayer('specId')) {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('planId');\r\n }\r\n return undefined;\r\n }\r\n\r\n function getPlanName() {\r\n if (!global.NewHomeSource.Modules.tagManager.getFromDataLayer('specId')) {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('planName');\r\n }\r\n return undefined;\r\n }\r\n\r\n function getSpecId() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('specId');\r\n }\r\n\r\n function getHomeType() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('homeStatus');\r\n }\r\n\r\n /**\r\n * @private getNeustarResponse: get the string value of neustar.\r\n *\r\n * @returns {string} neustar response.\r\n */\r\n function getNeustarResponse() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('n_response');\r\n }\r\n\r\n function getNeustar() {\r\n const value = getNeustarResponse();\r\n\r\n if (value) {\r\n return JSON.parse(value);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @private getLocation: get the the city, state.\r\n *\r\n * @returns A string that contains {City} - {State}.\r\n */\r\n function getLocation() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('location') || '';\r\n }\r\n\r\n function getUserId() {\r\n const userId = global.NewHomeSource.Modules.cookieHandler.readCookie('Profile', true);\r\n\r\n if (userId) {\r\n return userId.replace('{', '').replace('}', '');\r\n }\r\n\r\n return userId;\r\n }\r\n\r\n function getGoogleAnalyticsClientId() {\r\n let googleAnalyticsId;\r\n\r\n if (global.ga && global.ga.getAll) {\r\n const trackers = global.ga.getAll().filter((element) => element.get('trackingId') === nhsTrackingId);\r\n googleAnalyticsId = trackers[0].get('clientId');\r\n }\r\n\r\n return googleAnalyticsId;\r\n }\r\n\r\n function getGoogleAnalyticsUserId() {\r\n let googleAnalyticsUserId;\r\n\r\n if (global.ga && global.ga.getAll) {\r\n const trackers = global.ga.getAll().filter((element) => element.get('trackingId') === nhsTrackingId);\r\n googleAnalyticsUserId = trackers[0].get('userId');\r\n }\r\n\r\n return googleAnalyticsUserId;\r\n }\r\n\r\n /**\r\n * @private getMarketSession: get the market format to database team in Google Analytics.\r\n *\r\n * @returns A string that contains {Market Name} - {Market Id}.\r\n */\r\n function getMarketSession() {\r\n const marketId = getMarketId();\r\n const marketName = getMarketName();\r\n if (marketId && marketName) {\r\n return `${marketName} - ${marketId}`;\r\n }\r\n return '';\r\n }\r\n\r\n function getVisitedMpcIds() {\r\n return global.NewHomeSource.WebStorageHandler.getSessionStorageItem('visitedMpcIds');\r\n }\r\n\r\n function startTracking() {\r\n global.NewHomeSource.Analytics.eventTracker.init();\r\n global.NewHomeSource.Analytics.identityTracker.init();\r\n global.NewHomeSource.Analytics.impressionTracker.init();\r\n global.NewHomeSource.Analytics.onDemandTracker.init();\r\n }\r\n\r\n /**\r\n * @private\r\n * getAmenities: get the value the amenities of dataLayer.\r\n *\r\n * @returns amenities value from dataLayer.\r\n */\r\n function getAmenities() {\r\n const amenities = global.NewHomeSource.Modules.tagManager.getFromDataLayer('amenities');\r\n if (amenities instanceof Array) {\r\n return amenities.join(', ');\r\n }\r\n\r\n return amenities || '';\r\n }\r\n\r\n /**\r\n * @private\r\n * getLanguage: get the value the language of document language.\r\n *\r\n * @returns nhs language value from docuemnt.\r\n */\r\n function getLanguage() {\r\n return document.documentElement.lang;\r\n }\r\n\r\n /**\r\n * @private\r\n * getReferCode: get the refer code from URL.\r\n *\r\n * @returns refer parameter in the URL.\r\n */\r\n function getReferCode() {\r\n const params = new URLSearchParams(window.location.search);\r\n return params.get('refer');\r\n }\r\n\r\n /**\r\n * @private\r\n * getTrustBuilderReviews: get trust builder reviews value.\r\n *\r\n * @returns trust builder reviews value from dataLayer.\r\n */\r\n function getTrustBuilderReviews() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('trustBuilderReviews');\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserCity: get city value from IP.\r\n *\r\n * @returns city value from dataLayer.\r\n */\r\n function getUserCity() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('userCity');\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserState: get state value from IP.\r\n *\r\n * @returns state value from dataLayer.\r\n */\r\n function getUserState() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('userState');\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserCountry: get country value from IP.\r\n *\r\n * @returns country value from dataLayer.\r\n */\r\n function getUserCountry() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('userCountry');\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserMarketId: get market id from IP.\r\n *\r\n * @returns market id from dataLayer.\r\n */\r\n function getUserMarketId() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('userMarketId');\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserStatus: get status of the user.\r\n *\r\n * @returns userStatus from dataLayer.\r\n */\r\n function getUserStatus() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('userStatus');\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserZipCode: get zip code value from IP.\r\n *\r\n * @returns zip code value from dataLayer.\r\n */\r\n function getUserZipCode() {\r\n return global.NewHomeSource.Modules.tagManager.getFromDataLayer('userZipCode');\r\n }\r\n\r\n const eventsQueue = new global.NewHomeSource.Modules.IdleQueue();\r\n\r\n const handlers = [];\r\n const globalValues = {\r\n abTestsOnThisPage: new global.NewHomeSource.Modules.IdleValue(getAbTestsOnThePage),\r\n time: getCentralStandardTime,\r\n brand_id: new global.NewHomeSource.Modules.IdleValue(getBrandId),\r\n brand_name: new global.NewHomeSource.Modules.IdleValue(getBrandName),\r\n brand_partner_name: new global.NewHomeSource.Modules.IdleValue(getBrandPartnerName),\r\n builder_id: new global.NewHomeSource.Modules.IdleValue(getBuilderId),\r\n builder_division: new global.NewHomeSource.Modules.IdleValue(getBuilderDivision),\r\n builder_name: new global.NewHomeSource.Modules.IdleValue(getBuilderName),\r\n city: new global.NewHomeSource.Modules.IdleValue(getCity),\r\n county: new global.NewHomeSource.Modules.IdleValue(getCounty),\r\n codeBuildeVersion: new global.NewHomeSource.Modules.IdleValue(getCodeBuildVersion),\r\n community_high_price: new global.NewHomeSource.Modules.IdleValue(getHighPrice),\r\n community_low_price: new global.NewHomeSource.Modules.IdleValue(getLowPrice),\r\n community_name: new global.NewHomeSource.Modules.IdleValue(getCommunityName),\r\n communityId: new global.NewHomeSource.Modules.IdleValue(getCommunityId),\r\n communityType: new global.NewHomeSource.Modules.IdleValue(getCommunityType),\r\n current_page_number: new global.NewHomeSource.Modules.IdleValue(getCurrentPageNumber),\r\n filters_applied: getFiltersApplied,\r\n googleAnalyticsClientId: new global.NewHomeSource.Modules.IdleValue(getGoogleAnalyticsClientId),\r\n googleAnalyticsUserId: new global.NewHomeSource.Modules.IdleValue(getGoogleAnalyticsUserId),\r\n location: new global.NewHomeSource.Modules.IdleValue(getLocation),\r\n hasIfp: new global.NewHomeSource.Modules.IdleValue(hasIfp),\r\n hasIsp: new global.NewHomeSource.Modules.IdleValue(hasIsp),\r\n home_price: new global.NewHomeSource.Modules.IdleValue(getHomePrice),\r\n home_type: new global.NewHomeSource.Modules.IdleValue(getHomeType),\r\n isLimitedAvailability: new global.NewHomeSource.Modules.IdleValue(isLimitedAvailability),\r\n isPriced: new global.NewHomeSource.Modules.IdleValue(isPriced),\r\n i_uid: new global.NewHomeSource.Modules.IdleValue(getIUid),\r\n marketId: new global.NewHomeSource.Modules.IdleValue(getMarketId),\r\n segmentAnonymousId: getSegmentAnonymousId,\r\n marketName: new global.NewHomeSource.Modules.IdleValue(getMarketName),\r\n marketSession: new global.NewHomeSource.Modules.IdleValue(getMarketSession),\r\n neustar: new global.NewHomeSource.Modules.IdleValue(getNeustar),\r\n neustarResponse: new global.NewHomeSource.Modules.IdleValue(getNeustarResponse),\r\n page_type: getPageType,\r\n partner_id: new global.NewHomeSource.Modules.IdleValue(getPartnerId),\r\n partner_name: new global.NewHomeSource.Modules.IdleValue(getPartnerName),\r\n price_reduction: new global.NewHomeSource.Modules.IdleValue(getPriceReduction),\r\n brandPartnerNamePartnerName: new global.NewHomeSource.Modules.IdleValue(getBrandPartnerNamePartnerName),\r\n offMarket: new global.NewHomeSource.Modules.IdleValue(getOffMarket),\r\n plan_id: new global.NewHomeSource.Modules.IdleValue(getPlanId),\r\n plan_name: new global.NewHomeSource.Modules.IdleValue(getPlanName),\r\n primary_image_url: new global.NewHomeSource.Modules.IdleValue(getPrimaryImageUrl),\r\n referCode: new global.NewHomeSource.Modules.IdleValue(getReferCode),\r\n response_version: new global.NewHomeSource.Modules.IdleValue(getresponseVersion),\r\n result_count: getResultCount,\r\n spec_id: new global.NewHomeSource.Modules.IdleValue(getSpecId),\r\n state: new global.NewHomeSource.Modules.IdleValue(getState),\r\n userAgent: navigator.userAgent,\r\n userId: getUserId,\r\n visitedMpcIds: getVisitedMpcIds,\r\n zip: new global.NewHomeSource.Modules.IdleValue(getZip),\r\n amenities: new global.NewHomeSource.Modules.IdleValue(getAmenities),\r\n language: new global.NewHomeSource.Modules.IdleValue(getLanguage),\r\n trustBuilderReviews: new global.NewHomeSource.Modules.IdleValue(getTrustBuilderReviews),\r\n userCity: new global.NewHomeSource.Modules.IdleValue(getUserCity),\r\n userState: new global.NewHomeSource.Modules.IdleValue(getUserState),\r\n userCountry: new global.NewHomeSource.Modules.IdleValue(getUserCountry),\r\n userMarketId: new global.NewHomeSource.Modules.IdleValue(getUserMarketId),\r\n userStatus: new global.NewHomeSource.Modules.IdleValue(getUserStatus),\r\n userZipCode: new global.NewHomeSource.Modules.IdleValue(getUserZipCode),\r\n };\r\n\r\n if (global.NewHomeSource.Analytics.segment) {\r\n handlers.push(global.NewHomeSource.Analytics.segment);\r\n global.NewHomeSource.Analytics.segment(globalValues);\r\n }\r\n\r\n if (global.NewHomeSource.Analytics.SitespeedTracker) {\r\n handlers.push(global.NewHomeSource.Analytics.SitespeedTracker);\r\n global.NewHomeSource.Analytics.SitespeedTracker(globalValues);\r\n }\r\n\r\n global.NewHomeSource.Analytics.GoogleAnalyticsTracker(globalValues);\r\n handlers.push(global.NewHomeSource.Analytics.GoogleAnalyticsTracker);\r\n handlers.push(global.NewHomeSource.Analytics.TdvTracker);\r\n handlers.push(global.NewHomeSource.Analytics.AdWordsTracker);\r\n handlers.push(global.NewHomeSource.Analytics.BingTracker);\r\n handlers.push(global.NewHomeSource.Analytics.DotTracker);\r\n handlers.push(global.NewHomeSource.Analytics.PandoraTracker);\r\n handlers.push(global.NewHomeSource.Analytics.EnhancedConversionTracker);\r\n handlers.push(global.NewHomeSource.Analytics.ListHubTracker);\r\n handlers.push(global.NewHomeSource.Analytics.Ga4Tracker);\r\n global.NewHomeSource.Analytics.eventTracker(eventsQueue, handlers);\r\n global.NewHomeSource.Analytics.identityTracker(eventsQueue, handlers);\r\n global.NewHomeSource.Analytics.impressionTracker(eventsQueue, handlers);\r\n global.NewHomeSource.Analytics.onDemandTracker(eventsQueue, handlers);\r\n global.NewHomeSource.Analytics.TdvTracker(globalValues);\r\n global.NewHomeSource.Analytics.AdWordsTracker(globalValues);\r\n global.NewHomeSource.Analytics.BingTracker(globalValues);\r\n global.NewHomeSource.Analytics.DotTracker(globalValues);\r\n global.NewHomeSource.Analytics.PandoraTracker(globalValues);\r\n global.NewHomeSource.Analytics.EnhancedConversionTracker(globalValues);\r\n global.NewHomeSource.Analytics.ListHubTracker(globalValues);\r\n global.NewHomeSource.Analytics.Ga4Configuration(globalValues);\r\n global.NewHomeSource.Analytics.Ga4Tracker(globalValues);\r\n\r\n if (global.document.readyState === 'complete') {\r\n startTracking();\r\n } else {\r\n document.addEventListener('DOMContentLoaded', startTracking);\r\n }\r\n}(window));\r\n","(function personaModule(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousPersonaModule = global.NewHomeSource.Persona;\r\n const pendingEvent = JSON.parse(localStorage.getItem('pendingAutenticationEvent'));\r\n const idleQueue = new global.NewHomeSource.Modules.IdleQueue();\r\n\r\n /**\r\n * shouldAddEventToQueue: when lastSavedItemTime is 0, it means that is the first time\r\n * user login in the NHS.\r\n */\r\n let shouldAddEventToQueue = !(+global.localStorage.getItem('lastSavedItemTime'));\r\n /**\r\n * isRequestToSegmentApiEnded: to avoid override 5 favorites saved by the user without login\r\n * this variable tell to idleQueue is secure moment to send events to segment API.\r\n */\r\n let isRequestToSegmentApiEnded = false;\r\n\r\n /**\r\n * @private\r\n * clean the local storage data\r\n */\r\n function cleanLocalStorage() {\r\n localStorage.setItem('saved_communities', JSON.stringify({ saved_communities: [] }));\r\n localStorage.setItem('saved_builders', JSON.stringify({ saved_builders: [] }));\r\n localStorage.setItem('saved_homes', JSON.stringify({ saved_homes: [] }));\r\n global.localStorage.setItem('lastSavedItemTime', '');\r\n }\r\n\r\n /**\r\n * @private\r\n * create a object with the dataset information\r\n * @param {object} dataset data attributes from dom element\r\n */\r\n function createSaveItemObject(dataset) {\r\n const type = dataset.type;\r\n const device = window.NewHomeSource.Modules.tagManager.getFromDataLayer('adaptiveTemplate');\r\n const date = new Date();\r\n const format = function (number) { return number < 10 ? '0' + number : number; };\r\n const objectToSave = {\r\n builderId: dataset.builder,\r\n source: device !== null && device === 'M' ? 'Mobile Web' : 'Web',\r\n date_saved: format(date.getMonth() + 1) + '/' + format(date.getDate()) + '/' + date.getFullYear(),\r\n };\r\n\r\n if (type !== 'Builder') {\r\n objectToSave.communityId = dataset.community;\r\n\r\n if (type === 'HomePlan') {\r\n objectToSave.planId = dataset.planId;\r\n }\r\n if (type === 'HomeSpec') {\r\n objectToSave.specId = dataset.specId;\r\n }\r\n }\r\n\r\n return objectToSave;\r\n }\r\n\r\n /**\r\n * @private\r\n * get the key from local storage data\r\n * @param {string} type string\r\n */\r\n function getLocalStorageKeyValue(type) {\r\n const dataType = {\r\n homespec: 'saved_homes',\r\n homeplan: 'saved_homes',\r\n community: 'saved_communities',\r\n builder: 'saved_builders'\r\n };\r\n\r\n const key = dataType[type.toLowerCase()];\r\n if (!key) {\r\n return null;\r\n }\r\n\r\n return key;\r\n }\r\n\r\n /**\r\n * @private\r\n * get the index of element (object) inside to the array\r\n * @param {object} arrayObjects array of element (object)\r\n * @param {object} elementToFind object\r\n * @param {string} type string\r\n */\r\n function getIndexIfExist(arrayObjects, elementToFind, type) {\r\n if (!arrayObjects || !elementToFind || !type) {\r\n return -1;\r\n }\r\n\r\n const dataType = {\r\n homespec: 'specId',\r\n homeplan: 'planId',\r\n community: 'communityId',\r\n builder: 'builderId'\r\n };\r\n\r\n const consult = dataType[type.toLowerCase()];\r\n if (!consult) {\r\n return -1;\r\n }\r\n\r\n for (let index = 0; index < arrayObjects.length; index += 1) {\r\n if (arrayObjects[index][consult] === elementToFind[consult]) {\r\n return index;\r\n }\r\n }\r\n\r\n return -1;\r\n }\r\n\r\n /**\r\n * @private\r\n * remove or add element(object) in some array\r\n * @param {object} arrayObjects array\r\n * @param {object} elementSaveItem element to find\r\n * @param {string} isRemove string\r\n * @param {string} type string\r\n */\r\n function updateArrayObject(arrayObjects, elementSaveItem, isRemove, type) {\r\n if (!arrayObjects || !elementSaveItem || !type) {\r\n return [];\r\n }\r\n const index = getIndexIfExist(arrayObjects, elementSaveItem, type);\r\n const exist = index > -1;\r\n\r\n if (isRemove && exist) {\r\n arrayObjects.splice(index, 1);\r\n }\r\n if (!isRemove && !exist) {\r\n arrayObjects.push(elementSaveItem);\r\n }\r\n\r\n return arrayObjects;\r\n }\r\n\r\n /**\r\n * @private\r\n * get the object with the element array to save in local storage\r\n * @param {object} element Dom element with the data attributes required\r\n * @param {string} isRemove data attribute\r\n */\r\n function getItemsToBeSaved(element, isRemove) {\r\n if (!element) {\r\n return {};\r\n }\r\n\r\n const elementSaveItem = createSaveItemObject(element.dataset);\r\n const keyLocalStorage = getLocalStorageKeyValue(element.dataset.type);\r\n\r\n const localSavedItems = JSON.parse(localStorage.getItem(keyLocalStorage));\r\n\r\n if (!localSavedItems[keyLocalStorage]) {\r\n localSavedItems[keyLocalStorage] = [];\r\n }\r\n\r\n const arrayObjects = localSavedItems[keyLocalStorage];\r\n const arrayObjectsUpdated = updateArrayObject(arrayObjects, elementSaveItem, isRemove, element.dataset.type);\r\n\r\n localSavedItems[keyLocalStorage] = arrayObjectsUpdated;\r\n return localSavedItems;\r\n }\r\n\r\n /**\r\n * @private\r\n * set in local storage the favorites element list\r\n * @param {object} element Dom element with the data attributes required\r\n */\r\n function updateLocalStorage(element) {\r\n if (!element) {\r\n return {};\r\n }\r\n\r\n const keyLocalStorage = getLocalStorageKeyValue(element.dataset.type);\r\n const itemsToUpdate = getItemsToBeSaved(element, element.dataset.removeLocalStorage);\r\n\r\n localStorage.setItem(keyLocalStorage, JSON.stringify(itemsToUpdate));\r\n\r\n return itemsToUpdate;\r\n }\r\n\r\n function getLastEvent(type, isRemove) {\r\n const dataTypes = {\r\n homespec: isRemove ? 'Home Removed' : 'Home Saved',\r\n homeplan: isRemove ? 'Home Removed' : 'Home Saved',\r\n community: isRemove ? 'Community Removed' : 'Community Saved',\r\n builder: isRemove ? 'Builder Removed' : 'Builder Saved',\r\n };\r\n\r\n const lastEvent = dataTypes[type.toLowerCase()];\r\n if (!lastEvent) {\r\n return 'Save Item';\r\n }\r\n\r\n return lastEvent;\r\n }\r\n\r\n /**\r\n * saveItems: sava data in storage.\r\n *\r\n * @param {object} data to save.\r\n */\r\n function saveItems(data) {\r\n const updatedItem = updateLocalStorage(data);\r\n const eventForSegment = {\r\n event: getLastEvent(data.dataset.type, data.dataset.removeLocalStorage),\r\n eventType: 'segmentEvent',\r\n isIdentifyEvent: true,\r\n isIdentifyOnly: true,\r\n };\r\n\r\n const key = Object.keys(updatedItem)[0];\r\n eventForSegment[key] = updatedItem[key];\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: eventForSegment }\r\n }));\r\n }\r\n\r\n /**\r\n * updateLastSavedItem: update the time of last saved item in storage.\r\n */\r\n function updateLastSavedItem() {\r\n global.localStorage.setItem('lastSavedItemTime', +new Date());\r\n }\r\n\r\n /**\r\n * shouldGetSegmentProfile: should update the data with API segment profile\r\n *\r\n * @returns True when first favorite element is saved/removed, and elapsed 30s, otherwise false\r\n */\r\n function shouldGetSegmentProfile() {\r\n const lastItemSavedTime = +global.localStorage.getItem('lastSavedItemTime');\r\n updateLastSavedItem();\r\n const actualDate = +new Date();\r\n\r\n if (!lastItemSavedTime || actualDate - lastItemSavedTime > 30000) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * getSegmentProfile: get segment profile data from API.\r\n *\r\n * @param {String} id user to request the data.\r\n */\r\n async function getSegmentProfile(id) {\r\n const urlForSegmentApi = '/getsegmentprofile?userId=' + id;\r\n const response = await fetch(urlForSegmentApi, {\r\n method: 'GET',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n }\r\n });\r\n\r\n if (response.ok) {\r\n const data = await response.json();\r\n return JSON.parse(data);\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * @private\r\n * getUserId: get user id from coockies\r\n *\r\n */\r\n function getUserId() {\r\n const userId = global.NewHomeSource.Modules.cookieHandler.readCookie('Profile', true);\r\n\r\n if (userId) {\r\n return userId.replace('{', '').replace('}', '');\r\n }\r\n\r\n return userId;\r\n }\r\n\r\n /**\r\n * @private\r\n * handlerQueue: function push to idleQueue tasks\r\n * If the request to segment has ended store the value and return true to avoid loop task.\r\n * Otherwise return false to execute the task later.\r\n *\r\n * @returns {boolean} value to see if task will continue.\r\n */\r\n function handlerQueue() {\r\n if (isRequestToSegmentApiEnded) {\r\n saveItems(this);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * stopAddEventsToQueue: when the first request to server after user login we doesn't need to\r\n * add more events to queue.\r\n */\r\n function stopAddEventsToQueue() {\r\n isRequestToSegmentApiEnded = true;\r\n shouldAddEventToQueue = false;\r\n }\r\n\r\n /**\r\n * @private\r\n * trackIdentifySaveItems: track saved items for identify profile.\r\n *\r\n * @param {object} e event triggered with the on demand data to track.\r\n */\r\n async function trackIdentifySaveItems(e) {\r\n if (!e.detail.data) {\r\n return;\r\n }\r\n\r\n if (shouldGetSegmentProfile()) {\r\n const userId = getUserId();\r\n const data = await getSegmentProfile(userId);\r\n if (data) {\r\n // eslint-disable-next-line no-use-before-define\r\n savePreferencesInLocalStorage(data);\r\n }\r\n stopAddEventsToQueue();\r\n saveItems(e.detail.data);\r\n return;\r\n }\r\n\r\n if (shouldAddEventToQueue) {\r\n idleQueue.pushTask(handlerQueue.bind(e.detail.data));\r\n return;\r\n }\r\n\r\n saveItems(e.detail.data);\r\n }\r\n\r\n /**\r\n * @private\r\n * getLastLoggedInData: try gets the LastLoggedInData cookie.\r\n *\r\n */\r\n function getLastLoggedInData() {\r\n const lastLoggedInData = document.cookie.match(/LastLoggedInData_[0-9]=([^;]+)/);\r\n\r\n if (!lastLoggedInData) {\r\n return null;\r\n }\r\n\r\n return lastLoggedInData[0].split('=');\r\n }\r\n\r\n /**\r\n * @private\r\n * savePreferencesInLocalStorage: creates local storage objects for saved items.\r\n *\r\n * @param {object} personaInformation with the items to save in local storage.\r\n */\r\n function savePreferencesInLocalStorage(personaInformation) {\r\n if (!personaInformation && !pendingEvent) {\r\n document.body.removeEventListener('trackIdentifySaveItems', trackIdentifySaveItems);\r\n return;\r\n }\r\n\r\n const persona = personaInformation || {};\r\n\r\n persona.traits = persona.traits || {};\r\n persona.traits.saved_communities = persona.traits.saved_communities || [];\r\n persona.traits.saved_homes = persona.traits.saved_homes || [];\r\n persona.traits.saved_builders = persona.traits.saved_builders || [];\r\n const savedCommunities = JSON.parse(localStorage.getItem('saved_communities'));\r\n if (savedCommunities === null ||\r\n !Array.isArray(savedCommunities.saved_communities) || savedCommunities.saved_communities.length === 0 ||\r\n persona.traits.saved_communities) {\r\n localStorage.setItem('saved_communities', JSON.stringify(\r\n { saved_communities: persona.traits.saved_communities }\r\n ));\r\n }\r\n\r\n const savedHomes = JSON.parse(localStorage.getItem('saved_homes'));\r\n if (savedHomes === null ||\r\n !Array.isArray(savedHomes.saved_homes) || savedHomes.saved_homes.length === 0 ||\r\n persona.traits.saved_homes) {\r\n localStorage.setItem('saved_homes', JSON.stringify(\r\n { saved_homes: persona.traits.saved_homes }\r\n ));\r\n }\r\n\r\n const savedBuilders = JSON.parse(localStorage.getItem('saved_builders'));\r\n if (savedBuilders === null ||\r\n !Array.isArray(savedBuilders.saved_builders) || savedBuilders.saved_builders.length === 0 ||\r\n persona.traits.saved_builders) {\r\n localStorage.setItem('saved_builders', JSON.stringify(\r\n { saved_builders: persona.traits.saved_builders }\r\n ));\r\n }\r\n\r\n const lastLoggedInData = getLastLoggedInData();\r\n if (lastLoggedInData) {\r\n document.cookie = [lastLoggedInData[0], '=', 'false', '; domain=.',\r\n `${global.location.host.toString().split('.')[1]}.com`, '; path=/;'].join('');\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * postPendingAutenticationEvent: enqueues pending autentication events in local storage.\r\n */\r\n function postPendingAutenticationEvent() {\r\n if (!pendingEvent) {\r\n return;\r\n }\r\n\r\n localStorage.removeItem('pendingAutenticationEvent');\r\n\r\n document.body.dispatchEvent(new CustomEvent(\r\n 'trackOnDemandEvent',\r\n {\r\n detail: { data: pendingEvent }\r\n }\r\n ));\r\n }\r\n\r\n /**\r\n * @private\r\n * onPageLoad: function to be executed on page load event.\r\n */\r\n function onPageLoad() {\r\n if (!window.NewHomeSource.UserCredentials.isUserLogged()) {\r\n cleanLocalStorage();\r\n }\r\n\r\n postPendingAutenticationEvent();\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Persona\r\n */\r\n function Persona() {\r\n global.window.addEventListener('load', onPageLoad);\r\n document.body.addEventListener('trackIdentifySaveItems', trackIdentifySaveItems);\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Persona to the previous script.\r\n */\r\n Persona.noConflict = function noConflict() {\r\n global.NewHomeSource.Persona = previousPersonaModule;\r\n return Persona;\r\n };\r\n global.NewHomeSource.Persona = Persona;\r\n\r\n Persona();\r\n}(window));\r\n","(function identifyModule(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n /**\r\n * @private\r\n * identify: a new session created by a new visitor.\r\n */\r\n function identify() {\r\n const isNewSession = sessionStorage.getItem('isNewSession');\r\n\r\n if (isNewSession != null) {\r\n return;\r\n }\r\n\r\n sessionStorage.setItem('isNewSession', 'true');\r\n\r\n const eventForSegment = {\r\n event: 'New Session',\r\n eventType: 'segmentEvent',\r\n isIdentifyEvent: true,\r\n isIdentifyOnly: true,\r\n isNeustarRequired: true\r\n };\r\n\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: eventForSegment }\r\n }));\r\n }\r\n\r\n document.body.addEventListener('identifySegmentEventNewSession', identify);\r\n}(window));\r\n","(function deviceCapabilites(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Modules.IdleQueue &&\r\n !global.NewHomeSource.WebStorageHandler) {\r\n return;\r\n }\r\n\r\n const eventsQueue = new global.NewHomeSource.Modules.IdleQueue();\r\n let formats = {};\r\n\r\n /**\r\n * @private\r\n * canUseWebP: check if we can use WebP in NHS.\r\n *\r\n */\r\n function canUseWebP() {\r\n const elem = document.createElement('canvas');\r\n if (elem.getContext && elem.getContext('2d')) {\r\n return elem.toDataURL('image/webp').indexOf('data:image/webp') === 0;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * setAcceptTypeMimesType: set in localstorage the mime types supported by the browser.\r\n *\r\n */\r\n function setAcceptTypeMimesType() {\r\n const supportedFormats = [];\r\n Object.keys(formats).forEach((key) => {\r\n const format = formats[key];\r\n if (format.verifyFormat()) {\r\n supportedFormats.push(format.mimeType);\r\n }\r\n });\r\n\r\n global.localStorage.setItem('browserAcceptTypes', supportedFormats.join(','));\r\n return true;\r\n }\r\n\r\n formats = {\r\n webP:\r\n {\r\n mimeType: 'image/webp',\r\n verifyFormat: canUseWebP\r\n }\r\n };\r\n\r\n eventsQueue.pushTask(setAcceptTypeMimesType);\r\n}(window));\r\n"]}