{"version":3,"sources":["jQuery.LazyLoad.js","GoogleAnalitycsHelper.js","modalBackground.js","event.js","googlemapapi.b1.js","gallery.b1.js","imagesGalleryHandler.js","thumbnailHelper.js","commdetailxp.b1.js","LeadForm.common.js","moreCommunitiesSection.js","handlerTrustedForm.js","webStorageHandler.js","mortgage-detail.b1.js","vanilla-masker.js","leadEvents.js","handlerOnPageForm.js","handlerFivTemplateForm.js","GooglePropertyMap.b1.js","common.b1.js","ajaxHelper.js","LeadFormEventsHandler.js","getPreApprovedLoader.js","GoogleMapsDownloader.js","fullImageViewerOpener.js","elementToggler.js","GoogleMapApiAutoComplite.js","arrowHandler.js","stickyBarScrollHandler.js","stickyNavBarButton.b1.js","availableLots.js","MapsAndDirections.b1.js","BasicContactModal.js","thankYouModal.js","MapPopup.js","builderFiltersHandler.js","SectionLazyLoad.js","trackerRecommendedCommunities.js","a11ydialog.js","IframeModalOpener.js","communityAndNeighBorhoodHandler.b1.js","modalFocus.js","recommendationEvents.js"],"names":["Array","prototype","removeByKey","key","value","this","some","item","index","splice","bind","jQuery","extend","LazyLoadAttachedEvents","LazyLoad","options","defaultOptions","Offset","AppendScroll","window","ElementVisibleId","UpdateAction","isVisible","Name","defaultOptiosTemp","configuration","callbackAction","EventHandlerName","visibleY","el","document","getElementById","offsetHeight","top","getBoundingClientRect","parentNode","body","bottom","documentElement","clientHeight","on","indexOf","push","global","NewHomeSource","previousAnalitycsHelper","AnalitycsHelper","getGoogleAnalitycsIdentifier","id","ga","getAll","allGa","filter","element","get","noConflict","previousModalBackground","ModalBackground","createBackground","backgroundColor","zIndex","createElement","style","position","left","width","height","setAttribute","appendChild","background","overflow","destroyBackground","parentElement","removeChild","previousEvent","Event","addEvent","name","callback","addEventListener","processCallbacks","callbacks","forEach","processEvents","events","processConfiguration","property","setter","querySelectorAll","elements","Object","keys","clickElement","click","NHS","Scripts","Maps","existingMaps","getMap","selector","maps","i","length","GoogleMapApi","defaultOptios","markersArray","map","UseClusterer","isMapCreate","MapOptions","Latitude","Longitude","Zoom","ContainerName","zoomControl","ZoomControlStyle","zoomControlPosition","disableDefaultUI","Draggable","Scrollwheel","DisableDoubleClickZoom","panControl","overviewControl","streetViewControl","styles","featureType","stylers","visibility","CreateMapWrap","DirectionsDisplayPanel","MarkerPointOptions","optimized","Loader","MinZoom","MaxZoom","MarkerClustererOptions","gridSize","maxZoom","cssName","imagePath","zoomOnClick","minimumClusterSize","InfoWindowOptions","disableAutoPan","MarkerPointAsynOptions","Listener","UrlServer","ProcessResultOptions","Events","OnMapCreate","OnMarkersCreate","OnMarkersRemove","OnGetMarkerPointAsyn","opt","MarkerClickCallBack","IdleCallBack","MarkerMouseOverCallBack","MarkerMouseOutCallBack","ZoomChangesCallBack","MarkerClusterClickCallBack","DragChangesCallBack","ClickCallBack","InfowindowTooltipReadyCallBack","InfowindowCloseCallBack","InfowindowTooltipCloseCallBack","InfowindowReadyCallBack","tInfowindowOffsetCallBack","OnBoundsChanged","Autocomplete","CreateControl","BindToBound","Autocompletecontrol","pOIIcons","school","church","park","university","_default","createMap","self","infowindow","google","InfoWindow","infowindowTooltip","bounds","LatLngBounds","intMapOptions","salesOfficeTab","querySelector","coordinatesElement","Number","dataset","lat","lng","mcOptions","mapOptions","zoom","center","LatLng","zoomControlOptions","ControlPosition","draggable","scrollwheel","disableDoubleClickZoom","overviewMapControl","minZoom","createMapWrap","container","Map","clearOverlays","isFunction","event","addListener","call","dataLayer","mapCoordinates","markerCluster","MarkerClusterer","getMarkerPointAsyn","CreateOverlay","addListenerOnce","cluster","repaint","bounds_","getCenter","getZoom","RemoveGoogleInfo","trigger","hideLoading","append","showLoading","hide","attr","setTimeout","aux","len","eq","remove","removeAttr","show","setMap","clearMarkers","optionsMpa","data","getBoundsFromMap","getJSON","results","processResult","getBounds","ne","getNorthEast","sw","getSouthWest","minLat","minLng","maxLat","maxLng","prOptions","html","getHtmlInfowindow","icon","getIconMarkerPoint","getNameMarkerPoint","createMarkerPoint","addMultipleMarkers","markers","latitude","longitude","AutoFit","sources","info","label","marker","_createMarkerPoint","addMarker","markerPointOptions","title","text","Marker","set","setContent","open","Center","setCenter","ReDrawMap","fitBounds","panToBounds","ourOverlay","OverlayView","draw","GetInfowindowOffset","iwWidth","iwHeight","xOffset","yOffset","location","getProjection","fromLatLngToContainerPixel","getPosition","nep","x","y","Size","GetPixelFromLatLng","latLng","fromLatLngToPoint","WaitGoogleScript","functionToExecute","timeToLoad","loadGoogleMapsCode","url","loadJs","galleryInit","context","images","gallery","passive","setAttr","elm","getAttr","getAttribute","removeAttribute","hasClass","className","classList","contains","insertAt","nElm","pos","ref","insertAdjacentElement","eventName","fn","isArray","getTouch","touches","changedTouches","getTouchId","touch","identifier","getTouchX","screenX","setImgX","img","transform","getImgX","match","parseFloat","isUndefined","variable","getUndefined","setAnimationTime","seconds","transition","setXAnimationTime","isImage","Image","tryToggleImageType","imgElm","newImage","getAssociatedImage","replaceChild","setSrc","src","setSrcset","srcset","setSizes","sizes","setPosition","setCollection","collection","setImgId","setAlt","alt","setFloorPlanClass","isNext","imageIndex","nextImg","isPortraitImage","naturalHeight","naturalWidth","imagesArray","newActiveImage","isFloorPlan","add","goNext","prevImg","activeImg","newNextIndex","Srcset","positionImageCollection","collectionName","replace","segmentEvent","segmentEventEvent","segmentEventMedia_type","iscomm","ga4EventName","ga4EventClick_target","eventType","media_type","image_url","image_sequence","image_type","dispatchEvent","CustomEvent","detail","onChange","goPrev","newPrevIndex","registerTouch","touchId","lastX","changeRunning","go","goFn","times","isNaN","previous","active","next","defineProp","propName","getter","defineProperty","cleanStyles","arguments","setCssVar","cssVarName","setProperty","nextIndex","prevIndex","currentSrc","collectionNameNext","positionImageCollectionNext","idImageNext","collectionNamePrev","positionImageCollectionPrev","idImagePrev","from","control","previousImg","requestAnimationFrame","imageElems","imageElements","preventDefault","newX","diff","activeWidth","offsetWidth","prevX","activeX","nextX","tDiff","Math","abs","bindEvents","Function","define","amd","exports","module","Gallery","firstImage","handlerVerticalImages","complete","previousThumbnailHelper","ThumbnailHelper","defaultThumbs","JSON","parse","innerHTML","validate","CollectionName","split","ThumbnailUrl","CommunityDetailXp","parameters","_tabsControlId","tabsControlId","_searchParameters","searchParameters","_getHomeResultsByCommunityFromApi","getHomeResultsByCommunityFromApi","selectedTab","SelectedTab","_communityId","communityId","_builderId","builderId","player","numberOfCards","galleryIndex","communityDetailContainerHigh","undefined","logger","Globals","EventLogger","siteRoot","logInfo","fromPage","partnerID","partnerId","partnerName","performanceLogUrl","marketId","favs","Favorites","urlBase","PartnerId","MarketId","get_commId","get_builderId","initialize","setUpControls","init","attributeParameters","mapParameters","defaultTargetForLazyLoad","mapsContainer","googlePropertyMap","GooglePropertyMap","SetUpdate","loadInteractiveMap","removeEventListener","isBilled","isNearbyShowed","params","URLSearchParams","brandId","brandName","BrandName","commLat","commLon","pricelow","PriceLow","priceHigh","PriceHigh","fromPageForNearby","fetch","getNearbyCommunitiesActionUrl","toString","then","response","ok","nearbyContainer","testimonialsModel","isMpCommunity","isPreview","PreviewMode","nearbyWrapper","performLazyLoad","getCommunityTestimonialsUrl","testimonialsData","Testimonials","testimonialsCards","testimonialContainer","cloneTestimonialCard","cloneNode","Description","Citation","display","_updateAdsPosition","ratingsFlagElement","microModalInput","RatingsAndReviews","loadDetailSection","loadReviews","setUpGalleryXp","favorites","performanceEvents","FullImageViewerOpener","Modules","ArrowHandler","mapButton","neighborhoodStickyButton","googleAnalyticsBindings","performanceEventsBindings","formSubmitButton","closest","addFreeBrochureSubmitEventAttributes","trackReadMoreOfferEvent","readMoreButtonText","googleAnalyticsEvent","click_target","readOffersContainer","showMoreElement","collapsibleContentElement","offerBubblesCollection","currentReadMoreText","target","hasAttribute","counter","textContent","currentEventReadMoreText","eventCurrentText","currentEventReadMoreToggleText","eventToggleText","scrollToBarItems","scrollBehavior","scroll","scrollIntoView","behavior","targetElement","itemActive","MediaData","mediaResult","setupNewOnPageGallery","RemoveParametersFromUrl","parameter","RegExp","RemoveResizingParametersFromQueryString","image","imageUrl","isVimeoVideo","getVimeoSourceSetUrl","commTitle","breakpoints","breakpoint","breakpointLength","resizedMediaImages","mediaImages","IsRichMedia","cleanUrl","VideoType","VideoId","separator","format","Is360Image","srcsetUrl","countComm","countVideo","videoIcon","videoOverlay","galleryMap","elementPosition","Id","AltText","detailGallery","galleryItem","toLowerCase","videoTitle","Type","TestimonialVideo","CommunityVideo","Title","removeClass","addClass","firstGalleryItem","idOfVisibleElement","dataForAjax","urlForAjax","successAjaxFunction","lazyLoadReady","ajax","type","contentType","stringify","success","homesAndPlansJs","backToTop","SetupNearbyCommunities","googleApi","NearbyComms","SaveCommunity","dataForPost","post","addCommunityToPlanerMethod","json","ShowSuccessMessage","replaceWith","SavedText","SavedToYourProfileText","message","saveMessage","SaveToFavoritesText","SaveText","href","redirectUrl","submitButton","Analytics","GoogleAnalyticsTracker","buildTagWithEvent","Helper","readCookie","createCookie","loadCss","link","TdvTracker","CommunityDetailSocialMediaShare","commDetail","detailInfo","adCol","salesoffice","homeToolsBuyingSection","merchandizedSection","merchandizedSectionHeigth","homeToolsBuyingSectionHeight","salesOfficeHeight","MutationObserver","takeATourFloatingButton","floatingFormContainerHide","inPersonRequestLabel","commentsInput","formObserver","commentInput","VirtualTourRequestLabel","readyState","ElementToggler","Init","CommunityAndNeighBorhoodHandler","InitialLoadModalHandler","DisplayModal","targetElementId","alernateTargetElementId","alternateTargetElement","priceReductionLabel","trustBuilderReviewsSection","homesAndPlansSection","builderSection","handlerMoreCommunityClick","cardElement","card","eventToAttach","hasOwnProperty","TrustedForm","executeMethod","observer","mutations","mutation","addedNodes","disconnect","observe","childList","subtree","attributes","characterData","load","tf","async","protocol","escape","Date","getTime","random","head","trustedForm","previousModule","WebStorageHandler","CONFIGURATION","constants","localStorage","sessionStorage","setItemInStorage","maxAgeInSeconds","storageType","creationDate","setItem","removeItemFromStorage","removeItem","getItemFromStorage","getItem","string","e","parseToJson","currentDate","floor","setLocalStorageItem","setSessionStorageItem","removeSessionStorageItem","removeLocalStorageItem","getLocalStorageItem","getSessionStorageItem","IntersectionObserver","entries","entry","intersectionRatio","detailItem","homeDetail","showMortgage","detailPriceElm","price2","price3","postalCodeElm","detailCardTemplate","detailCard","createRange","createContextualFragment","mortgageContainer","test","pathname","nearbyHomesContent","insertBefore","homeCarousel","refElm","observeElement","root","factory","VMasker","mergeMoneyOptions","opts","delimiter","lastOutput","precision","showSignal","suffixUnit","unit","zeroCents","moneyPrecision","addPlaceholdersToOutput","output","placeholder","VanillaMasker","unbindElementToMask","oninput","bindElementToMask","maskFunction","that","onInput","source","srcElement","setSelectionRange","maskMoney","maskNumber","maskAlphaNum","maskPattern","pattern","unMask","Error","toMoney","zeroMatcher","zeroRegExp","digitsLength","lastDigitLength","slice","number","separatorIndex","missingZeros","clearDelimiter","clearSeparator","money","substr","masked","cents","join","signal","startsWith","beginCents","max","centsValue","centsLength","centsSliced","toPattern","inputValue","patternChars","values","charsValues","outputLength","toNumber","toAlphaNumeric","onPageLeadButton","setAttributesToDataLayer","leadButtonClicked","leadEvents","ButtonNameClicked","ClickTarget","leadClickTarget","Position","leadPosition","GenerateLeadFrom","leadGenerateFrom","ButtonNameSource","leadButtonNameSource","tagManager","setDataLayerValue","formData","emailAddress","phoneNumber","postalCode","livesOutside","checked","disabled","preferredContactMethod","contactMethod","realtorQuestionAnswer","realtorAnswer","sendAlerts","fivFormTemplate","fieldsMap","content","isCustomLocation","isBasic","isComingSoon","formValuesToQueryString","queryString","keyValuePair","substring","showThankYouPageForExternalLeads","getFreeBrochureData","ModalLoader","showModal","onChangeToggleZipInput","checkboxElem","zipInput","openScheduler","component","SchedulerHandler","openSchedulerTab","onClickSendForm","currentForm","sendButton","formValidator","validateForm","sendAskQuestionLead","sendFreeBrochureLead","addDataInComment","formElem","commentElem","comment","isOnPageForm","isRegularLeadForm","isAskQuestionForm","isFullImageViewer","commentData","getOnPageFormCommentData","getTourFormCommentData","getLeadAction","formTriggeredElement","leadActionType","isFullImageContactBuilder","isAskQuestion","formOptions","formText","currentOption","formElement","virtualTourElement","isVirtualTour","selectedDateElement","finalDate","getPreferredContactMethod","form","contactMethodInput","selectedIndex","getRealtorQuestionAnswerId","realtorAnswerInput","getPreferredBuilder","preferredBuilderElem","getValidatedMpcId","mpcId","MpcEventsHelper","isVisitedMpc","triggerElement","userPhone","thisForm","formParent","phoneField","dateSelected","includeSimilarCheckbox","isLimitedAvailability","getFromDataLayer","sendFormButton","Comments","PreferredBuilder","PreferredContactDetail","PreferredContactMethod","RealtorQuestionAnswerId","LiveOutside","MailAddress","UserPhoneNumber","UserPostalCode","ZipCode","BuilderId","BuilderName","CommunityId","CreditScoreText","IsAskQuestion","IgnoreComingSoonValidation","IsAddMeToInterestList","IsBuilderShowcase","IsComingSoon","IsComunityDetailV2","IsModalToSendEmail","IsGalleryXp","IsFullImageViewerLead","IsLimitedAvailability","LeadAction","UseNewCommentFormat","IsMPCommunity","IsPageCommDetail","IsPlan","NewSearchRCC","NewUser","ParentCommunityId","PartnerUsesMatchmaker","PlanId","SendAlerts","HasUserOptedIntoRecommendationEmail","ShowCreditScoreSection","ShowSaveToAccount","ShowUserPhoneNumber","find","is","SpecId","IsOnPageForm","FromPage","getAskQuestionData","Email","LivesOutside","Phone","Postal","AppointmentDateTime","BuilderList","CommunityList","IsAppointment","IsCustomLocation","LeadFormType","LeadType","PlanList","RequestedFromGallery","ShowCalendar","SpecList","sendSegmentEventFavorites","UserCredentials","isUserLogged","getRealtorQuestionAnswerText","realtorSelect","realtorQuestionAnswerText","requestUrl","leadButtonClickedText","segmentButton_action","isSchedulerParticipant","currentTarget","onPageForm","method","fragment","cleanOpenFormButtons","eventForSegment","date","tour_type","button_action","preferred_contact_method","realtor_question","topicList","checkboxElement","lead_form_topics","focus","fillInputsOnPageForm","resetIsModalLoadedFlag","dataType","error","console","log","onChangeContactMethod","selectedOption","selectedValue","selectedOptions","phoneInput","onChangeRealtorAnswer","setupFormTabsEvents","selfGuidedTab","nonSelfGuidedTabs","selfGuidedTourTabHandler","setupLeadForms","internationalCheckbox","onchange","onclick","methodOfContactInput","realtorQuestionAnswerInput","changeLeadAction","radioOptions","option","parametersElement","leadAction","initDatepickerGallery","alertText","innerText","datePicker","Datepicker","queryElement","attachEventsToNotAvailableDay","tourInPersonVideoHandler","createNewSlider","containerDatePicker","monthSlider","startDate","nextStepModal","phone","DateSlider","firstDate","onSetDay","showSelfGuidedTour","formTourSections","externalTourSection","toggleGuidedTourTriggerAttributeToModalOpener","guidedTourCta","updateLegalConsentText","section","lazyLoad","regularTourCta","buttonText","currentLegalConsentSection","clonedFirstLegalConsentSection","updatedtLegalConsentText","isGoingToShowSelfGuidedContent","guidedTourConfiguration","modalTrigger","dataGuideTourSelector","initDatePicker","inPersonRadio","viaVideoRadio","phoneElement","buttonUrl","modalUrl","dateParam","attachFormEvents","$jq","ready","alreadyClicked","reDrawMap","disableShowButton","InitMap","OptionsForMap","mapExpanded","HideLoading","initializeAutoComplete","CreateMap","isBasicListing","logBasicListingEvent","googleMapScript","SetUpGoogleApi","result","MarketPoints","iconNearByCommMulti","iconNearByComm","commIds","getCommunityMapCards","basicIds","placeChangedProcess","autocomplete","place","getPlace","geometry","isGalleryXp","children","getPropertyMapSides","logEventWithParameters","css","InitDrivingDirection","isMpc","isMPCommunity","GetPropertyMapRightSide","isMPC","mapWidth","mapHeight","isBasicCommunity","logMultiEvent","googlepush","toggle","$buildderTabMap","toggleClass","specId","planId","setDate","getDate","currentMonth","getMonth","currentYear","getFullYear","datepicker","minDate","mousedown","initTrigger","dateValue","actualDate","TrackShowRouteEvents","event_type","search_value","currency","inputWrapper","address","val","trim","screen","drivingDirectionAction","SetDataLayerPair","eventForTdv","builder","community","market","Geocoder","geocode","status","GeocoderStatus","OK","nextStepsSaveButton","gallerySaveButton","saveToFavoritesLoginButton","nextStepsUnsaveButton","galleryUnsaveButton","initSaveToFavorites","eventCategory","eventAction","eventLabel","nodeName","isMapDirectionsTab","tabsElements","showMapDirections","travelModeElement","travelMode","loadEmailSuggestions","Mailcheck","EmailDomainValidator","hideSection","displaySection","hidePhones","showPhones","rootMargin","threshold","sectionDetails","sectionsToObserve","userHeight","innerHeight","calculateSection","mainEntry","topSection","stickyBar","activeElement","stickyBarScrollHandler","moveStickyBarScroll","sectionIndex","observerMainStickyBar","AjaxHelper","requestsQueue","partnerElement","getElementsByClassName","browserAcceptTypes","partnerUrl","executeCallbacks","req","succeded","always","failed","queueIndex","HTMLFieldSetElement","serialize","field","l","notSerializableTypes","s","includes","j","selected","encodeURIComponent","objectToQueryString","objectToConvert","baseQueryString","getAcceptTypes","getRequest","parametersToSend","optionalCallbacks","xhr","XMLHttpRequest","onreadystatechange","succededStatus","responseText","setRequestHeader","send","err","postRequest","abort","requestHeaders","noJsonStringify","request","requestToAbort","r","requestForQueue","toUpperCase","getAbsolutePathRequest","siteUrl","convertToQueryString","require","domHelper","LeadFormEventsHandler","basicLeadTopics","getSegmentEvent","segmentEventName","submittedEvent","segmentEventButtonAction","segmentEventButton_action","segmentRecipient","submittedRecipient","leadTopics","topics","FormData","object","getLeadTopics","card_id","commonProperties","assign","getProperties","recipient","builder_id","builderName","builder_name","community_id","targetEvent","configurationElement","previousGetPreApprovedLoader","GetPreApprovedLoader","iframeConfiguration","getPreApprovedElement","alreadyLoadedScript","CloseElement","JavascriptHandler","IframePresenter","bindGetPreApprovedFunction","previousGoogleMapsDownloader","GoogleMapsDownloader","state","loaded","loading","sendAckAboutGoogleScriptLoaded","loadGoogleScript","googleScript","sendAcknowledgmentAboutGoogleScriptLoaded","ActiveXObject","previousFullImageViewerOpener","template","generateHtml","preventScroll","openFullImageViewer","eventsConfiguration","openEvent","registerLogInformation","performanceLogger","setUpFullImageViewerSaveOption","previousElementTogglerModule","elementsToShow","toggleElement","callForDetailSelector","ToggleElements","ElementSwitcher","createControles","places","initializeAutoCompleteControles","bindTo","close","setVisible","viewport","setZoom","iconAutoComplite","setIcon","address_components","short_name","size","origin","Point","anchor","scaledSize","newNode","nextSibling","change","setTypes","input","types","controls","TOP_LEFT","eventTrigger","[object Object]","arrowRight","arrowLeft","firstCollection","lastCollection","scrollElement","move","limitRight","limitLeft","arrowsReference","arrowReferenceSelector","collectionsReference","collectionsReferenceSelector","bindedCalculateMoveCallback","bindedCalculateMove","bindedOnChangeCallback","getLimits","observeVisibility","calculateMove","isIntersecting","showArrows","right","changeLimits","moveArrow","scrollBy","scrolledCarousel","previousStickyBarScrollModule","StickyBarScrollHandler","rightPoint","scrollLeft","elementPoints","scrollTo","previousStickyNavBarButton","StickyNavBarButton","stickyNav","buttonCtaContainer","barItems","containerItems","boundingClientRect","unobserve","observerStickyNavBar","triggerButton","availableButton","directionsContainer","mapSection","onCommuteCalculatorScriptLoad","CommuteCalculator","initDrivingDirections","commuteCalculatorScript","trackDrivingDirectionEvent","drivingDirectionStatus","elementsToDisplay","showDirections","elementsToHide","switchElements","attribute","salesOfficeTabExists","builderMapButton","builderMap","currentActive","newActive","switchActive","showMap","displayMap","switchContent","recalculateRoutes","titleContainer","switchTitle","switchAddress","switchStaticMap","previousBasicContactModal","BasicContactModal","CheckPhoneMask","CloseError","getRecommendedCommunities","recommendedCommand","listingId","command","ListingId","getRecommendedCommunitiesCommand","credentials","leadCommand","headers","Content-Type","toggleModal","modal","toggleAttribute","getSelectedRecommendedCommunities","recommendation","onRecommendationChecked","dispatchOnRecommendationSend","recommendationsModal","inputRecommended","skipButton","closeButton","elem","recommendationsSubmissionCommand","firstName","lastName","recoComms","Zip","FirstName","LastName","RecoComms","getRecommendedCommunitiesSubmissionCommand","handleBasicForm","basicForm","bundle","action","recommended","ga4IdentityPosition","ga4IdentityButton_name","templateElement","createModal","ga4Event","button_name","showRecomendationsModal","sentErrorElement","SubmitButtonClicked","submitForm","functionToPerform","sendBasicLead","thankYouModal","createAccountButton","auth0Dom","signIn","CommunityResults","MapPopup","GetHtmlPoints","point","communityName","PriceRange","priceRange","BuilderFiltersHandler","homesContainer","nodeListToArray","nodeList","filterHomesByBuilder","selectedBuilderFilterIds","selectedBuilderIds","builderFilters","selectedBuilders","filterElements","getSelectedBuilderFilterIds","allHomeCards","updateFilterTabs","tabFilterContainers","customFilterValue","homeStatusFilter","tabLabel","tabInput","homesByTypeCount","counterText","hideAllHomeCards","cardsToDisable","setBuilderFiltersEvents","builderFilterElements","SectionLazyLoad","rootMarginObserver","hostname","preventLazyLoadSectionDefaultBehavior","responseFragment","lazyLoadSection","lazyLoadSections","initLazyLoad","isPriced","price","trackDiscoverCommunitySegmentEvent","processed","segmentAttributes","getOwnPropertyNames","propertyName","trackDiscoverCommunityGA4Event","ga4Processed","city","stateName","marketName","stateAbbreviation","currency_value","trustbuilder_reviews","HasBuilderReviews","price_reduction","PriceReductionLabel","min_price","max_price","market_id","market_name","MarketName","market_session","StateAbbreviation","City","StateName","community_name","CommunityName","community_status","MarketingStatusLabel","is_limited_availability","HasLimitedInformation","is_priced","is_paid","zip_code","ga4EventPosition","org_button_name","ga4EventOrg_button_name","checkedCommunities","globalThis","A11yDialog","focusableSelectors","_show","_hide","_maintainFocus","_bindKeypress","$el","shown","_id","_previouslyFocused","_listeners","create","$$","moveFocusToDialog","node","instantiateDialogs","_openers","opener","_closers","concat","closer","_fire","destroy","handler","off","listeners","domEvent","listener","which","focusableChildren","child","getClientRects","getFocusableChildren","focusedItemIndex","shiftKey","trapTabKey","openModal","dialogOpener","dialogPolyfill","registerDialog","iframe","closeModalForm","handleModalInteraction","HTMLDialogElement","polyfill","previousCommunityAndNeighBorhoodHandler","removeTabFocus","performClickOnATab","selectedItem","subMenuItems","setActiveTab","showASection","subMenuName","tab","matches","neighborhoodEvent","neighborhoodClickTarget","neighborhoodPosition","click_target1","neighborhoodClickTarget1","isIPhone","navigator","platform","qaIsAutoFocus","queryElementWithEvents","onRecommendationSend","onRecommendationUnCheck","getAttributes","prefix","cleanProperty","charAt","triggerRecommendationEvents","eventGa4","RecommendationEvents"],"mappings":"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","file":"../basiccommdetailxpbundle-44397b52ff.min.js","sourceRoot":"..","sourcesContent":["Array.prototype.removeByKey = function (key, value) {\r\n  this.some((function (item, index) {\r\n    return (this[index][key] === value) ? !!(this.splice(index, 1)) : false;\r\n  }).bind(this));\r\n  return this;\r\n}\r\n\r\njQuery.extend({\r\n    LazyLoadAttachedEvents: [],\r\n    LazyLoad: function (options) {\r\n\r\n        var defaultOptions = {\r\n            Offset: 0,\r\n            AppendScroll: window,\r\n            ElementVisibleId: \"\",\r\n            UpdateAction: function (isVisible) { },\r\n            Name: \"\"\r\n        }\r\n\r\n        var defaultOptiosTemp = {};\r\n        jQuery.extend(true, defaultOptiosTemp, defaultOptions);\r\n        var configuration = jQuery.extend(true, defaultOptiosTemp, options);\r\n\r\n\r\n        var callbackAction = function () {\r\n            var EventHandlerName = configuration.UpdateAction(visibleY());\r\n\r\n            if (EventHandlerName) {\r\n                jQuery.LazyLoadAttachedEvents.removeByKey(EventHandlerName)\r\n            }\r\n\r\n        };\r\n\r\n        var visibleY = function () {\r\n            el = document.getElementById(configuration.ElementVisibleId);\r\n            if (!el || el.offsetHeight === 0) {\r\n                return false;\r\n            }\r\n\r\n            var top = el.getBoundingClientRect().top, rect, el = el.parentNode;\r\n\r\n            while (el != document.body) {\r\n                rect = el.getBoundingClientRect();\r\n                if (top <= rect.bottom === false)\r\n                    return false;\r\n                el = el.parentNode;\r\n            };\r\n\r\n            // Check its within the document viewport\r\n            var isVisible = top - configuration.Offset <= document.documentElement.clientHeight;\r\n            return isVisible;\r\n\r\n        };\r\n\r\n        if (configuration.Name === \"\") {\r\n            jQuery(configuration.AppendScroll).on(\"scroll\", callbackAction);\r\n        }\r\n        else if (configuration.Name !== \"\" && jQuery.LazyLoadAttachedEvents.indexOf(configuration.Name) < 0 ){\r\n            jQuery.LazyLoadAttachedEvents.push(configuration.Name);\r\n            jQuery(configuration.AppendScroll).on(\"scroll\", callbackAction);\r\n        }\r\n        \r\n        jQuery(window).on(\"resize\", callbackAction);\r\n\r\n        callbackAction();\r\n    }\r\n});\r\n","(function googleAnalitycsHelper(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  const previousAnalitycsHelper = global.NewHomeSource.AnalitycsHelper;\r\n\r\n  /**\r\n   * @constructs NewHomeSource.AnalitycsHelper\r\n   */\r\n  function AnalitycsHelper() {}\r\n\r\n  AnalitycsHelper.getGoogleAnalitycsIdentifier = function getGoogleAnalitycsIdentifier() {\r\n    let id = null;\r\n\r\n    if (typeof global.ga !== 'function' || (typeof global.ga.getAll !== 'function' && global.ga)) {\r\n      return id;\r\n    }\r\n\r\n    const allGa = global.ga.getAll().filter((element) => element.get('trackingId') === 'UA-40843711-4');\r\n\r\n    if (allGa[0]) {\r\n      id = allGa[0].get('name');\r\n    }\r\n\r\n    return id;\r\n  };\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.AnalitycsHelper to the previous script.\r\n   */\r\n  AnalitycsHelper.noConflict = function noConflict() {\r\n    global.NewHomeSource.AnalitycsHelper = previousAnalitycsHelper;\r\n    return AnalitycsHelper;\r\n  };\r\n\r\n  global.NewHomeSource.AnalitycsHelper = AnalitycsHelper;\r\n}(window));\r\n","(function modalBackground(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  const previousModalBackground = global.NewHomeSource.ModalBackground;\r\n\r\n  /**\r\n  * @constructs NewHomeSource.ModalBackground\r\n  */\r\n  function ModalBackground() {\r\n  }\r\n\r\n  /**\r\n  * @public\r\n  * createBackground: creates a modal background.\r\n  * \r\n  * @param {string} backgroundColor background color of the overlay.\r\n  */\r\n  ModalBackground.createBackground = function createBackground(backgroundColor, zIndex) {\r\n    const element = document.createElement('div');\r\n\r\n    element.style['background-color'] = backgroundColor || 'rgba(0,0,0,.5)';\r\n    element.style['z-index'] = zIndex || 100000;\r\n    element.style.position = 'fixed';\r\n    element.style.top = 0;\r\n    element.style.left = 0;\r\n    element.style.width = '100%';\r\n    element.style.height = '100%';\r\n    element.setAttribute('data-modal-background', '');\r\n    document.body.appendChild(element);\r\n    this.background = element;\r\n    global.document.body.style.overflow = 'hidden';\r\n  };\r\n\r\n  /**\r\n  * @public\r\n  * destroyBackground: destroys a modal background.\r\n  */\r\n  ModalBackground.destroyBackground = function destroyBackground() {\r\n    if (!this.background) {\r\n      return;\r\n    }\r\n\r\n    global.document.body.style.overflow = '';\r\n    this.background.parentElement.removeChild(this.background);\r\n  };\r\n\r\n  /**\r\n  * @public\r\n  *\r\n  * noConflict: Returns control of NewHomeSource.ModalBackground to the previous script.\r\n  */\r\n  ModalBackground.noConflict = function noConflict() {\r\n    global.NewHomeSource.ModalBackground = previousModalBackground;\r\n    return ModalBackground;\r\n  };\r\n\r\n  global.NewHomeSource.ModalBackground = ModalBackground;\r\n}(window));\r\n","(function event(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  const previousEvent = global.NewHomeSource.Event;\r\n\r\n  /**\r\n   * private\r\n   * addEvent: appends a event listener to the given element.\r\n   *\r\n   * @param {string} name of the event being added.\r\n   * @param {function} callback that is going to be executed.\r\n   */\r\n  function addEvent(name, callback) {\r\n    this.addEventListener(name, callback, false);\r\n  }\r\n\r\n  /**\r\n   * private\r\n   * processCallbacks: loops through the callbacks that are going to be append.\r\n   *\r\n   * @param {HTMLElement} element that is going to listen for the event.\r\n   * @param {string} name of the event being added.\r\n   */\r\n  function processCallbacks(element, name) {\r\n    this.callbacks.forEach(addEvent.bind(element, name));\r\n  }\r\n\r\n  /**\r\n   * private\r\n   * processEvents: loops through the events that are going to be appended.\r\n   *\r\n   * @param {HTMLElement} element that is going to listen for the event.\r\n   */\r\n  function processEvents(element) {\r\n    this.events.forEach(processCallbacks.bind(this, element));\r\n  }\r\n\r\n  /**\r\n   * private\r\n   * processConfiguration: loops through the configuration object in order to append the events.\r\n   *\r\n   * @param {string} property being processed.\r\n   */\r\n  function processConfiguration(property) {\r\n    const setter = this[property];\r\n    const elements = global.document.querySelectorAll(setter.elements);\r\n\r\n    elements.forEach(processEvents.bind(setter));\r\n  }\r\n\r\n  /**\r\n   * @constructs NewHomeSource.Event\r\n   *\r\n   * @param {object} configuration events that are going to be attached.\r\n   */\r\n  function Event(configuration) {\r\n    Object.keys(configuration).forEach(processConfiguration.bind(configuration));\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * clickElement: trigger click element on the document\r\n   *\r\n   * @param {object} element to click.\r\n   */\r\n  Event.clickElement = function clickElement (element) {\r\n    if (element) {\r\n      element.click();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.FullImageViewer to the previous script.\r\n   */\r\n  Event.noConflict = function noConflict() {\r\n    global.NewHomeSource.Event = previousEvent;\r\n    return Event;\r\n  };\r\n\r\n  global.NewHomeSource.Event = Event;\r\n}(window));\r\n","if (typeof NHS == \"undefined\") {\r\n  NHS = {};\r\n  NHS.Scripts = {};\r\n}\r\n\r\nNHS.Maps = {};\r\nNHS.Maps.existingMaps = [];\r\n\r\nNHS.Maps.getMap = function (selector) {\r\n  var maps = this.existingMaps;\r\n\r\n  for (var i = 0; i < maps.length; i++) {\r\n    var element = maps[i];\r\n\r\n    if (element.selector === selector) {\r\n      return element;\r\n    }\r\n  }\r\n}\r\n\r\nNHS.Scripts.GoogleMapApi = function (options) {\r\n  var defaultOptiosTemp = {};\r\n  jQuery.extend(true, defaultOptiosTemp, this.defaultOptios);\r\n  this.options = jQuery.extend(true, defaultOptiosTemp, options);\r\n  this.markersArray = [];\r\n  this.map = null;\r\n  this.UseClusterer = options.UseClusterer;\r\n  this.isMapCreate = false;\r\n};\r\n\r\nNHS.Scripts.GoogleMapApi.prototype =\r\n  {\r\n    defaultOptios: {\r\n      MapOptions: {\r\n        Latitude: null,\r\n        Longitude: null,\r\n        Zoom: 8,\r\n        ContainerName: 'map-canvas',\r\n        zoomControl: true,\r\n        ZoomControlStyle: 'LARGE',\r\n        zoomControlPosition: null,\r\n        disableDefaultUI: false,\r\n        Draggable: true,\r\n        Scrollwheel: true,\r\n        DisableDoubleClickZoom: false,\r\n        panControl: false,\r\n        overviewControl: false,\r\n        streetViewControl: false,\r\n        styles: [\r\n          {\r\n            featureType: 'poi.business',\r\n            stylers: [{ visibility: 'off' }]\r\n          }\r\n        ]\r\n      },\r\n      CreateMapWrap: true,\r\n      DirectionsDisplayPanel: null,\r\n      MarkerPointOptions: {\r\n        optimized: true\r\n      },\r\n      Loader: \"\",\r\n      MinZoom: 3,\r\n      MaxZoom: 18,\r\n      MarkerClustererOptions: {\r\n        gridSize: 50,\r\n        maxZoom: 15,\r\n        cssName: null,\r\n        imagePath: null,\r\n        zoomOnClick: true,\r\n        minimumClusterSize: null\r\n      },\r\n      UseClusterer: false,\r\n      InfoWindowOptions: {\r\n        disableAutoPan: false\r\n      },\r\n      MarkerPointAsynOptions: {\r\n        Listener: 'idle',\r\n        UrlServer: null\r\n      },\r\n      ProcessResultOptions: {\r\n        Latitude: '',\r\n        Longitude: '',\r\n        Name: ''\r\n      },\r\n      Events: {\r\n        OnMapCreate: null, //Triggers when the maps was created\r\n        OnMarkersCreate: null,\r\n        OnMarkersRemove: function () {\r\n        }, //Triggers when the marks was remove for the map\r\n        OnGetMarkerPointAsyn: function (opt) {\r\n        },\r\n        MarkerClickCallBack: null,\r\n        IdleCallBack: null,\r\n        MarkerMouseOverCallBack: null,\r\n        MarkerMouseOutCallBack: null,\r\n        ZoomChangesCallBack: null,\r\n        MarkerClusterClickCallBack: null,\r\n        DragChangesCallBack: null,\r\n        ClickCallBack: null,\r\n        InfowindowTooltipReadyCallBack: null,\r\n        InfowindowCloseCallBack: null,\r\n        InfowindowTooltipCloseCallBack: null,\r\n        InfowindowReadyCallBack: null,\r\n        tInfowindowOffsetCallBack: null,\r\n        OnBoundsChanged: null\r\n      },\r\n      Autocomplete: {\r\n        CreateControl: false,\r\n        BindToBound: false,\r\n        Autocompletecontrol: 'pac-input'\r\n      },\r\n      pOIIcons: {\r\n        school: \"http://maps.google.com/mapfiles/kml/pal2/icon2.png\",\r\n        church: \"http://maps.google.com/mapfiles/kml/pal2/icon11.png\",\r\n        park: \"http://maps.google.com/mapfiles/kml/pal2/icon12.png\",\r\n        university: \"http://maps.google.com/mapfiles/kml/pal2/icon14.png\",\r\n        _default: \"http://maps.google.com/mapfiles/kml/pal4/icon39.png\"\r\n      }\r\n    },\r\n    //Create the map in the html\r\n    createMap: function () {\r\n      var self = this;\r\n      self.infowindow = new google.maps.InfoWindow(this.options.InfoWindowOptions);\r\n      self.infowindowTooltip = new google.maps.InfoWindow(this.options.InfoWindowOptions);\r\n      self.bounds = new google.maps.LatLngBounds();\r\n\r\n      var intMapOptions = self.options.MapOptions;\r\n\r\n      let salesOfficeTab = document.querySelector('[data-type=\"sales-office\"]');\r\n      let coordinatesElement = document.querySelector('#nhs_MapTabs [data-active]');\r\n\r\n      if(salesOfficeTab && coordinatesElement){\r\n        intMapOptions.Latitude = Number(coordinatesElement.dataset.lat);\r\n        intMapOptions.Longitude = Number(coordinatesElement.dataset.lng);\r\n      }\r\n\r\n      var mcOptions = self.options.MarkerClustererOptions;\r\n      var mapOptions = {\r\n        zoom: intMapOptions.Zoom,\r\n        center: new google.maps.LatLng(intMapOptions.Latitude, intMapOptions.Longitude),\r\n        zoomControl: intMapOptions.zoomControl,\r\n        zoomControlOptions: {\r\n          style: google.maps.ZoomControlStyle[intMapOptions.ZoomControlStyle],\r\n          position: google.maps.ControlPosition[intMapOptions.zoomControlPosition]\r\n        },\r\n        disableDefaultUI: intMapOptions.disableDefaultUI,\r\n        draggable: intMapOptions.Draggable,\r\n        scrollwheel: intMapOptions.Scrollwheel,\r\n        disableDoubleClickZoom: intMapOptions.DisableDoubleClickZoom,\r\n        panControl: intMapOptions.panControl,\r\n        streetViewControl: intMapOptions.streetViewControl,\r\n        overviewMapControl: intMapOptions.overviewMapControl,\r\n        maxZoom: self.options.MaxZoom,\r\n        minZoom: self.options.MinZoom,\r\n        styles: intMapOptions.styles\r\n      };\r\n\r\n      if (self.options.CreateMapWrap)\r\n        self.createMapWrap();\r\n      var container = document.getElementById(intMapOptions.ContainerName);\r\n      if (!container) {\r\n        return;\r\n      }\r\n      self.map = new google.maps.Map(container, mapOptions);\r\n\r\n      if (NHS.Maps) {\r\n        NHS.Maps.existingMaps.push({\r\n          selector: intMapOptions.ContainerName,\r\n          map: self.map\r\n        });\r\n      }\r\n\r\n      google.maps.Map.prototype.clearOverlays = function () {\r\n        self.clearOverlays();\r\n      };\r\n\r\n      if (jQuery.isFunction(self.options.Events.ClickCallBack)) {\r\n        google.maps.event.addListener(self.map, 'click', function () {\r\n          self.options.Events.ClickCallBack.call(self);\r\n        });\r\n      }\r\n\r\n      google.maps.event.addListener(self.map, 'dragend', function () {\r\n        if (jQuery.isFunction(self.options.Events.DragChangesCallBack))\r\n          self.options.Events.DragChangesCallBack.call(self);\r\n        dataLayer.push({ \"mapCoordinates\": \"m|\" + self.map.center.lat() + \"|\" + self.map.center.lng() });\r\n      });\r\n\r\n      if (jQuery.isFunction(self.options.Events.OnBoundsChanged))\r\n        google.maps.event.addListener(self.map, 'bounds_changed', function () {\r\n          self.options.Events.OnBoundsChanged.call(self);\r\n        });\r\n\r\n      if (window['MarkerClusterer'])\r\n        self.markerCluster = new MarkerClusterer(self.map, [], mcOptions);\r\n\r\n      self.getMarkerPointAsyn();\r\n      self.CreateOverlay();\r\n\r\n      if (jQuery.isFunction(self.options.Events.InfowindowTooltipReadyCallBack)) {\r\n        google.maps.event.addListenerOnce(self.infowindowTooltip, 'idle', function () {\r\n          self.options.Events.InfowindowTooltipReadyCallBack.call(self);\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.InfowindowReadyCallBack)) {\r\n        google.maps.event.addListener(self.infowindow, 'domready', function () {\r\n          self.options.Events.InfowindowReadyCallBack.call(self);\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.InfowindowTooltipCloseCallBack)) {\r\n        google.maps.event.addListener(self.infowindowTooltip, 'closeclick', function () {\r\n          self.options.Events.InfowindowTooltipCloseCallBack.call(self);\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.InfowindowCloseCallBack)) {\r\n        google.maps.event.addListener(self.infowindow, 'closeclick', function () {\r\n          self.options.Events.InfowindowCloseCallBack.call(self);\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.MarkerClusterClickCallBack)) {\r\n        google.maps.event.addListener(self.markerCluster, 'clusterclick', function (cluster) {\r\n          self.markerCluster.repaint();\r\n          self.options.Events.MarkerClusterClickCallBack.call(self, cluster);\r\n          dataLayer.push({ \"mapCoordinates\": \"c|\" + cluster.bounds_.getCenter().lat() + \"|\" + cluster.bounds_.getCenter().lng() });\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.ZoomChangesCallBack)) {\r\n        google.maps.event.addListener(self.map, 'zoom_changed', function () {\r\n          self.options.Events.ZoomChangesCallBack.call(self, self.map.getZoom());\r\n        });\r\n      }\r\n\r\n\r\n      google.maps.event.addListener(self.map, 'idle', function () {\r\n        self.RemoveGoogleInfo();\r\n        if (jQuery.isFunction(self.options.Events.IdleCallBack))\r\n          self.options.Events.IdleCallBack.call(self);\r\n\r\n        if (jQuery.isFunction(self.options.Events.OnMapCreate) && !self.isMapCreate) {\r\n          self.options.Events.OnMapCreate();\r\n        }\r\n\r\n        google.maps.event.trigger(self.map, 'resize');\r\n        self.isMapCreate = true;\r\n      });\r\n      google.maps.event.addListenerOnce(self.map, 'tilesloaded', self.RemoveGoogleInfo);\r\n      self.hideLoading();\r\n    },\r\n    createMapWrap: function () {\r\n      var self = this;\r\n      var intMapOptions = self.options.MapOptions;\r\n      jQuery('#' + intMapOptions.ContainerName).append('<div id=\"nhs_mapwrap\" style=\"position:relative;\" ></div>');\r\n      jQuery('#nhs_mapwrap').append('<div id=\"nhs_OverlayMap\" style=\"position: absolute;z-index:99999;top: 0px;left: 0px;height:100%;width:100%;background-color: #000;filter: alpha(opacity=35);-moz-opacity: 0.35;opacity: 0.35;\"></div>');\r\n      jQuery('#nhs_mapwrap').append('<div id=\"nhs_LoadingMap\" class=\"nhs_Loading\" style=\"position:absolute;\"><p>Updating</p></div>');\r\n      self.showLoading();\r\n    },\r\n\r\n    hideLoading: function () {\r\n      jQuery(\"#nhs_LoadingMap, #nhs_OverlayMap\").hide();\r\n      if (jQuery(\".gm-style > div > a\").attr(\"href\")) {\r\n        setTimeout(function () {\r\n          var aux;\r\n          var len = jQuery('.gm-style-cc').length;\r\n          for (aux = 1; aux < len; aux += 1) {\r\n            jQuery('.gm-style-cc').eq('-1').remove();\r\n          }\r\n          jQuery(\".gm-style > div > a\").removeAttr(\"href\").removeAttr(\"title\");\r\n        }, 800);\r\n      }\r\n    },\r\n\r\n    showLoading: function () {\r\n      jQuery(\"#nhs_LoadingMap, #nhs_OverlayMap\").show();\r\n    },\r\n\r\n    //Remove the Marker Points\r\n    clearOverlays: function () {\r\n      var self = this;\r\n      for (var i = 0; i < self.markersArray.length; i++) {\r\n        self.markersArray[i].setMap(null);\r\n      }\r\n      self.markersArray = [];\r\n      self.bounds = new google.maps.LatLngBounds();\r\n      if (self.markerCluster)\r\n        self.markerCluster.clearMarkers();\r\n\r\n      self.options.Events.OnMarkersRemove();\r\n    },\r\n\r\n    //Get the information for the Markers from the server\r\n    getMarkerPointAsyn: function () {\r\n      var self = this;\r\n      var optionsMpa = self.options.MarkerPointAsynOptions;\r\n      if (optionsMpa.Listener && optionsMpa.UrlServer) {\r\n        self.options.Events.OnGetMarkerPointAsyn(optionsMpa);\r\n        google.maps.event.addListener(self.map, optionsMpa.Listener, function () {\r\n          self.showLoading();\r\n          var data = self.getBoundsFromMap();\r\n          self.map.clearOverlays();\r\n          jQuery.getJSON(optionsMpa.UrlServer, data, function (results) {\r\n            self.processResult(results);\r\n          });\r\n        });\r\n      } else {\r\n        self.hideLoading();\r\n      }\r\n    },\r\n\r\n    // Get the Bounds from the map\r\n    getBoundsFromMap: function () {\r\n      var self = this;\r\n      var bounds = self.map.getBounds();\r\n      var ne = bounds.getNorthEast();\r\n      var sw = bounds.getSouthWest();\r\n      var data = {\r\n        minLat: sw.lat(),\r\n        minLng: sw.lng(),\r\n        maxLat: ne.lat(),\r\n        maxLng: ne.lng()\r\n      };\r\n      return data;\r\n    },\r\n\r\n    processResult: function (results) {\r\n      var self = this;\r\n      self.showLoading();\r\n      var prOptions = self.options.ProcessResultOptions;\r\n      if (results !== null) {\r\n        for (var i = 0; i < results.length; i++) {\r\n          var html = self.getHtmlInfowindow(results, results[i]);\r\n          var icon = self.getIconMarkerPoint(results, results[i]);\r\n          var name = self.getNameMarkerPoint(results, results[i]);\r\n          self.createMarkerPoint(results[i][prOptions.Latitude], results[i][prOptions.Longitude], name, html, icon, results[i]);\r\n        }\r\n      }\r\n      self.hideLoading();\r\n    },\r\n    addMultipleMarkers: function (markers) {\r\n      var self = this;\r\n      self.showLoading();\r\n      if (markers !== null) {\r\n        for (var i = 0; i < markers.length; i++) {\r\n          self.createMarkerPoint(markers[i].latitude, markers[i].longitude, markers[i].name, markers[i].html, markers[i].icon, markers[i], markers[i].id, markers[i].callback);\r\n        }\r\n      }\r\n      self.AutoFit();\r\n      google.maps.event.trigger(self.map, 'resize')\r\n\r\n      self.hideLoading();\r\n    },\r\n\r\n    getHtmlInfowindow: function (sources, data) {\r\n      return null;\r\n    },\r\n\r\n    getIconMarkerPoint: function (sources, data) {\r\n      return null;\r\n    },\r\n\r\n    getNameMarkerPoint: function (sources, data) {\r\n      var self = this;\r\n      var prOptions = self.options.ProcessResultOptions;\r\n      return data[prOptions.Name];\r\n    },\r\n\r\n    // A function to create the marker and set up the event window\r\n  createMarkerPoint: function (lat, lng, name, html, icon, info, id, callback, label) {\r\n      var self = this;\r\n    var marker = self._createMarkerPoint(lat, lng, name, html, icon, info, id, callback, label);\r\n      if (self.options.UseClusterer == false)\r\n        marker.setMap(self.map);\r\n      else if (self.markerCluster)\r\n        self.markerCluster.addMarker(marker);\r\n    },\r\n\r\n  _createMarkerPoint: function (lat, lng, name, html, icon, info, id, callback, label) {\r\n      var self = this;\r\n      var position = new google.maps.LatLng(lat, lng);\r\n      var markerPointOptions = self.options.MarkerPointOptions;\r\n      var options = {\r\n        position: position,\r\n        icon: icon,\r\n        title: name,\r\n        label: label && label.text !== \"\" ? label : null,\r\n        optimized: markerPointOptions.optimized,\r\n        zIndex: 99\r\n      };\r\n      if (self.bounds) {\r\n        self.bounds.extend(position);\r\n      } else {\r\n        self.bounds = new google.maps.LatLngBounds();\r\n        self.bounds.extend(position);\r\n      }\r\n   \r\n      var marker = new google.maps.Marker(options);\r\n      if (typeof id !== 'undefined') {\r\n        marker.set(\"id\", id); \r\n      }\r\n      if (typeof callback === 'function') {\r\n        callback(marker);\r\n      }\r\n      if (jQuery.isFunction(self.options.Events.OnMarkersCreate))\r\n        self.options.Events.OnMarkersCreate(info, self.infowindow, marker);\r\n\r\n      if (typeof (html) == \"string\") {\r\n        google.maps.event.addListener(marker, 'click', function () {\r\n          //self.marker = marker;\r\n          self.infowindow.setContent(html);\r\n          self.infowindow.open(self.map, marker);\r\n          if (jQuery.isFunction(self.options.Events.MarkerClickCallBack)) {\r\n            self.options.Events.MarkerClickCallBack.call(self, info, self.infowindow, self.infowindowTooltip, marker);\r\n          }\r\n        });\r\n      }\r\n\r\n      if (typeof (html) != \"string\" && jQuery.isFunction(self.options.Events.MarkerClickCallBack)) {\r\n        google.maps.event.addListener(marker, 'click', function () {\r\n          self.options.Events.MarkerClickCallBack.call(self, info, self.infowindow, self.infowindowTooltip, marker);\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.MarkerMouseOverCallBack)) {\r\n        google.maps.event.addListener(marker, 'mouseover', function () {\r\n          self.options.Events.MarkerMouseOverCallBack.call(self, info, self.infowindow, self.infowindowTooltip, marker);\r\n        });\r\n      }\r\n\r\n      if (jQuery.isFunction(self.options.Events.MarkerMouseOutCallBack)) {\r\n        google.maps.event.addListener(marker, 'mouseout', function () {\r\n          self.options.Events.MarkerMouseOutCallBack.call(self, info, self.infowindow, self.infowindowTooltip, marker);\r\n        });\r\n      }\r\n      self.markersArray.push(marker);\r\n      return marker;\r\n    },\r\n    Center: function () {\r\n      var self = this;\r\n      var intMapOptions = self.options.MapOptions;\r\n      var position = new google.maps.LatLng(intMapOptions.Latitude, intMapOptions.Longitude);\r\n      self.map.setCenter(position);\r\n    },\r\n    ReDrawMap: function () {\r\n      var self = this;\r\n      google.maps.event.trigger(self.map, \"resize\");\r\n      self.Center();\r\n    },\r\n\r\n\r\n    AutoFit: function () {\r\n      var self = this;\r\n      self.map.fitBounds(self.bounds);\r\n      self.map.panToBounds(self.bounds);\r\n    },\r\n    CreateOverlay: function () {\r\n      this.ourOverlay = new google.maps.OverlayView();\r\n      this.ourOverlay.draw = function () {\r\n      };\r\n      this.ourOverlay.setMap(this.map);\r\n    },\r\n    GetInfowindowOffset: function (iwWidth, iwHeight, map, marker) {\r\n      var xOffset = 0;\r\n      var yOffset = 0;\r\n      // Our point of interest\r\n      var location = this.ourOverlay.getProjection().fromLatLngToContainerPixel(marker.getPosition());\r\n\r\n      // Get Edges of map in pixels: Sout West corner and North East corner\r\n      var swp = this.ourOverlay.getProjection().fromLatLngToContainerPixel(map.getBounds().getSouthWest());\r\n      var nep = this.ourOverlay.getProjection().fromLatLngToContainerPixel(map.getBounds().getNorthEast());\r\n\r\n      // Horizontal Adjustment\r\n      if (location.x < iwWidth / 2) {\r\n        xOffset = iwWidth / 2 - location.x;\r\n      } else if (location.x > nep.x - iwWidth / 2) {\r\n        xOffset = (nep.x - iwWidth / 2) - location.x;\r\n      }\r\n\r\n      // Vertical Adjustment\r\n      if (location.y < iwHeight) {\r\n        yOffset = location.y + iwHeight - (location.y - nep.y);\r\n      } else {\r\n        yOffset = location.y + 20 - (location.y - nep.y);\r\n      }\r\n      // Return it\r\n      return new google.maps.Size(xOffset, yOffset);\r\n\r\n    },\r\n\r\n    GetPixelFromLatLng: function (latLng) {\r\n      var projection = this.map.getProjection();\r\n      var point = projection.fromLatLngToPoint(latLng);\r\n      return point;\r\n    },\r\n\r\n    RemoveGoogleInfo: function () {\r\n      if (jQuery(\".gm-style > div > a\").attr(\"href\")) {\r\n        var aux;\r\n        var len = jQuery('.gm-style-cc').length;\r\n        for (aux = 1; aux < len; aux += 1) {\r\n          jQuery('.gm-style-cc').eq('-1').remove();\r\n        }\r\n        //jQuery(\".gm-style > .gmnoprint\").css(\"right\", \" 0\");\r\n        jQuery(\".gm-style > div > a\").removeAttr(\"href\").removeAttr(\"title\");\r\n      }\r\n    },\r\n\r\n    WaitGoogleScript: function (functionToExecute, timeToLoad, self) {\r\n\r\n      setTimeout(function () {\r\n        timeToLoad--;\r\n        if (typeof google !== 'undefined') {\r\n          functionToExecute();\r\n        } else if (timeToLoad > 0) {\r\n          self.WaitGoogleScript(functionToExecute, timeToLoad, self);\r\n        } else {\r\n          return \"Script failed to load.\";\r\n        }\r\n      }, 100);\r\n    },\r\n    loadGoogleMapsCode: function (url) {\r\n      if (document.getElementById(\"nhs_GoogleMapScript\")) return;\r\n      NHS.loadJs(url, \"nhs_GoogleMapScript\");\r\n    }\r\n  };\r\n","/**\r\n * Gallery prototype definition\r\n *\r\n * @public\r\n * @param {Element} context Gallery context Element\r\n * @param {String[]} images Images URLs\r\n */\r\n\r\ngalleryInit = function (context, images) {\r\n    \"use strict\";\r\n\r\n    var gallery = this,\r\n        passive = {\r\n            passive: true\r\n        },\r\n\r\n\r\n        /*** Methods ***/\r\n\r\n        /**\r\n         * Sets a value to an Attribute of an Element\r\n         * \r\n         * @private\r\n         * @param {Element} elm Element\r\n         * @param {String} attr Attribute's name\r\n         * @param {String} value Value to set\r\n         */\r\n        setAttr = function(elm, attr, value) {\r\n            elm.setAttribute(attr, value);\r\n        },\r\n\r\n        /**\r\n         * Gets an Attribute value from an Element\r\n         * \r\n         * @private\r\n         * @param {Element} elm Element\r\n         * @param {String} attr Attribute's name\r\n         * @return {Any} Attribute's value\r\n         */\r\n        getAttr = function(elm, attr) {\r\n            return elm.getAttribute(attr);\r\n        },\r\n\r\n        /**\r\n         * Removes the value of an Element's Attribute\r\n         * \r\n         * @private\r\n         * @param {Element} elm Element\r\n         * @param {String} attr Attribute's name\r\n         */\r\n        removeAttr = function(elm, attr) {\r\n            elm.removeAttribute(attr);\r\n        },\r\n\r\n        /**\r\n         * Checks if a given element contains a class\r\n         * \r\n         * @private\r\n         * @param {Element} elm Element\r\n         * @param {String} className Class name to find\r\n         * @return {Boolean} Result\r\n         */\r\n        hasClass = function(elm, className) {\r\n            return elm.classList.contains(className);\r\n        },\r\n\r\n        /**\r\n         * Inserts an Element relative to another using a given position\r\n         * \r\n         * @private\r\n         * @param {Element} nElm Element to insert\r\n         * @param {String} pos Position to use\r\n         * @param {Element} ref Reference Element\r\n         */\r\n        insertAt = function(nElm, pos, ref) {\r\n            ref.insertAdjacentElement(pos, nElm);\r\n        },\r\n\r\n\r\n        /**\r\n         * Adds a Event Listener to an Element\r\n         * \r\n         * @private\r\n         * @param {Element | Element[]} elm Element\r\n         * @param {String} eventName Event's name\r\n         * @param {Function} fn Function to execute each time the event is triggered\r\n         * @param {any} options Add Event Listener method available options (See Mozilla Developers Documentation for more info.)\r\n         */\r\n        addEvent = function(elm, eventName, fn, options) {\r\n            if (!Array.isArray(elm)) {\r\n                elm.addEventListener(eventName, fn, options);\r\n                return;\r\n            }\r\n\r\n            for (var i = 0; i < elm.length; ++i) {\r\n                elm[i].addEventListener(eventName, fn, options);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Gets the Touch object from a TouchEvent object\r\n         * \r\n         * @private\r\n         * @param {TouchEvent} event TouchEvent\r\n         * @return {Touch} Touch\r\n         */\r\n        getTouch = function(event) {\r\n            return event.touches[0] || event.changedTouches[0];\r\n        },\r\n\r\n        /**\r\n         * Gets the Id of a Touch\r\n         * \r\n         * @private\r\n         * @param {Touch} touch Touch\r\n         * @return {Number} Id\r\n         */\r\n        getTouchId = function(touch) {\r\n            return touch.identifier;\r\n        },\r\n\r\n        /**\r\n         * Gets the Touch's X value\r\n         * \r\n         * @private\r\n         * @param {Touch} touch Touch\r\n         * @return {Number} X value\r\n         */\r\n        getTouchX = function(touch) {\r\n            return touch.screenX;\r\n        },\r\n\r\n        /**\r\n         * Sets an X value to an Image\r\n         * \r\n         * @private\r\n         * @param {Image} img Image\r\n         * @param {Number} x X value\r\n         */\r\n        setImgX = function(img, x) {\r\n            img.style.transform = \"translateX(\" + x + \"px) translateY(-50%)\";\r\n        },\r\n\r\n        /**\r\n         * Gets the X value of an Image\r\n         * \r\n         * @private\r\n         * @param {Image} img Image\r\n         * @return {Number} X value\r\n         */\r\n        getImgX = function(img) {\r\n            if (img.style.transform) {\r\n                var match = img.style.transform.match(/-?\\d+/);\r\n                return match[0] ? parseFloat(match[0]) : 0;\r\n            }\r\n            return 0;\r\n        },\r\n\r\n\r\n        /**\r\n         * Gets the undefined literal value\r\n         * \r\n         * @private\r\n         * @return {undefined} undefined\r\n         */\r\n        getUndefined = function() {\r\n            return void 0;\r\n        },\r\n\r\n        /**\r\n         * Checks if a given variable is undefined\r\n         * \r\n         * @private\r\n         * @param {Any} variable Variable to check\r\n         * @return {Boolean} Result\r\n         */\r\n        isUndefined = function(variable) {\r\n            return variable === getUndefined();\r\n        },\r\n\r\n        /**\r\n         * Sets the animation time of an Image\r\n         * \r\n         * @private\r\n         * @param {Image} img Image\r\n         * @param {String} attr Attribute to animate\r\n         * @param {Number} seconds Time in seconds\r\n         */\r\n        setAnimationTime = function(img, attr, seconds) {\r\n            img.style.transition = attr + \" \" + seconds + \"s\";\r\n        },\r\n\r\n        /**\r\n         * Sets the X movement animation time of the Gallery images\r\n         * \r\n         * @private\r\n         * @param {Number} seconds Time in Seconds         \r\n         */\r\n        setXAnimationTime = function(seconds) {\r\n            setAnimationTime(context.querySelector(\".previous\"), \"transform\", seconds);\r\n            setAnimationTime(context.querySelector(\".active\"), \"transform\", seconds);\r\n            setAnimationTime(context.querySelector(\".next\"), \"transform\", seconds);\r\n        },\r\n\r\n        /**\r\n         * Checks if the given image element is instance of the native Image prototype\r\n         *\r\n         * @param  {Image | HTMLDivElement} img Image Element\r\n         * @return {Boolean} Result\r\n         */\r\n        isImage = function(img) {\r\n            return (img instanceof Image);\r\n        },\r\n\r\n        /**\r\n         * Gets the associated image of an image\r\n         *\r\n         * @param {Image | HTMLDivElement} imgElm Image Element\r\n         * @return {Image | HTMLDivElement} Associated Image\r\n         */\r\n        getAssociatedImage = function(imgElm) {\r\n            return imgElm[(isImage(imgElm) ? \"\" : \"regular\") + \"Image\"];\r\n        },\r\n\r\n        /**\r\n         * Check is the Gallery image in the index\r\n         * is of the needed type in order to change it\r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} imgElm Image Element\r\n         * @param {Number} index Gallery Index to check\r\n         * @return {Image | HTMLDivElement} Image Element\r\n         */\r\n        tryToggleImageType = function(imgElm, index) {\r\n            var image = gallery.images[index];\r\n            if (isImage(imgElm)) {\r\n                return imgElm;\r\n            } else {\r\n                var newImage = getAssociatedImage(imgElm);\r\n                imgElm.parentNode.replaceChild(newImage, imgElm);\r\n                return newImage;\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Sets the source to a regular Image\r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} imgElm Image Element\r\n         * @param {String} src Source\r\n         */\r\n        setSrc = function(imgElm, src) {\r\n            if (imgElm && src) {\r\n                setAttr(imgElm, (isImage(imgElm) ? \"\" : \"data-\") + \"src\", src);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Sets the sourceset to a regular Image \r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} imgElm Image Element\r\n         * @param {String} srcset Source set\r\n         */\r\n        setSrcset = function (imgElm, srcset) {\r\n            if (imgElm && srcset) {\r\n                setAttr(imgElm, (isImage(imgElm) ? \"\" : \"data-\") + \"srcset\", srcset);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Sets the size to a regular Image \r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} imgElm Image Element\r\n         * @param {String} srcset Source set\r\n         */\r\n        setSizes = function (imgElm, sizes) {\r\n            if (imgElm && sizes) {\r\n                setAttr(imgElm, \"sizes\", sizes);\r\n            }\r\n        },\r\n\r\n        setPosition = function (imgElm, position) {\r\n            if (imgElm && position) {\r\n                setAttr(imgElm, \"data-position\", position);\r\n            }\r\n        },\r\n\r\n        setCollection = function (imgElm, collection) {\r\n            if (imgElm && collection) {\r\n                setAttr(imgElm, \"data-collection\", collection);\r\n            }\r\n        },\r\n\r\n        setImgId = function (imgElm, id) {\r\n          if (imgElm && id) {\r\n            setAttr(imgElm, \"data-image-id\", id);\r\n          }\r\n        },\r\n\r\n        /**\r\n         * Sets the alternative text or title to a regular Image\r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} imgElm Image Element\r\n         * @param {String} alt Alt text\r\n         */\r\n        setAlt = function(imgElm, alt) {\r\n            if (imgElm && alt) {\r\n                setAttr(imgElm, (isImage(imgElm) ? \"alt\" : \"title\"), alt);\r\n            }\r\n        },\r\n\r\n\r\n        /**\r\n         * If the image to show its a floor plan, we apply a class that fits it in the given container | BDXNHS-3125\r\n         * \r\n         * @private\r\n        \r\n         * @param {Boolean} isNext if the user clicked the right arrow > in the home detail\r\n         * @param {Number} imageIndex represents the index of the next image to show in the image array\r\n         * @param {HTMLImageElement} nextImg represents the next image in the gallery \r\n         */\r\n        setFloorPlanClass = function (isNext, imageIndex, nextImg) {\r\n            var isPortraitImage = nextImg.naturalHeight > nextImg.naturalWidth;\r\n            var selector = isNext ? \".next\" : \".previous\";\r\n            var imagesArray = gallery.images;\r\n            var newActiveImage = document.querySelector(\"#gallery \" + selector);\r\n\r\n            if (!newActiveImage) return;\r\n\r\n            if (imagesArray[imageIndex].isFloorPlan && !newActiveImage.classList.contains(\"nhs_floorPlanFit\") || isPortraitImage) {\r\n                newActiveImage.classList.add(\"nhs-c-image--vertical\");\r\n            }\r\n\r\n        },\r\n\r\n \r\n        /**\r\n         * Moves the Gallery to the Next image\r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} prevImg Previous Image\r\n         * @param {Image | HTMLDivElement} activeImg Active Image         \r\n         * @param {Image | HTMLDivElement} nextImg Next Image\r\n         */\r\n        goNext = function(prevImg, activeImg, nextImg) {\r\n            var images = gallery.images;\r\n            index = ((index + 1) === images.length) ? 0 : (index + 1); // Update Index\r\n\r\n            /**\r\n             * Clean Previous image src since it will become the Next image\r\n             * else when changing it to Next image it won't update\r\n             * its look until the new image has been loaded\r\n             */\r\n            if (isImage(prevImg)) {\r\n                setAttr(prevImg, \"srcset\", \"\");\r\n                setAttr(prevImg, \"src\", \"\");\r\n            }\r\n\r\n            /**\r\n             * Change the Previous image to become the Next image\r\n             */\r\n            var newNextIndex = ((index + 1) === images.length) ? 0 : (index + 1);\r\n\r\n            prevImg = tryToggleImageType(prevImg, newNextIndex);\r\n\r\n            setSizes(prevImg, images[newNextIndex].sizes);\r\n            setSrcset(prevImg, images[newNextIndex].Srcset);\r\n            setSrc(prevImg, images[newNextIndex].url);\r\n            setAlt(prevImg, images[newNextIndex].alt);\r\n            var positionImageCollection = images[newNextIndex].position;\r\n            var collectionName = images[newNextIndex].collection;\r\n            var id = images[newNextIndex].id;\r\n\r\n            if (collectionName && typeof positionImageCollection != \"undefined\") {\r\n                setPosition(prevImg, positionImageCollection);\r\n                setCollection(prevImg, collectionName);\r\n                setImgId(prevImg, id);\r\n            }\r\n\r\n            setFloorPlanClass(true, index, nextImg);\r\n\r\n            /**\r\n             * Update images relations\r\n             * Current Next -> New Active\r\n             * Current Active -> New Previous\r\n             * Current Previous -> New Next\r\n             */\r\n\r\n            setAttr(nextImg, \"class\", getAttr(nextImg, \"class\").replace(\"next\", \"active\").replace('nhs-u-opacity-0', ''));\r\n            setAttr(activeImg, \"class\", getAttr(activeImg, \"class\").replace(\"active\", \"previous nhs-u-opacity-0\"));\r\n            setAttr(prevImg, \"class\", getAttr(prevImg, \"class\").replace(\"previous\", \"next\"));\r\n            setAttr(prevImg, \"class\", getAttr(prevImg, \"class\").replace(\"active\", \"next\"));\r\n\r\n            nextImg.dataset.segmentEvent = \"true\";\r\n            nextImg.dataset.segmentEventEvent = \"Gallery Viewer Opened\";\r\n            nextImg.dataset.segmentEventMedia_type = images[index].collection;\r\n            nextImg.dataset.event = \"true\";\r\n            nextImg.dataset.iscomm = activeImg.dataset.iscomm;\r\n            nextImg.dataset.ga4EventName = 'gallery_detail_pages';\r\n            nextImg.dataset.ga4EventClick_target = 'Gallery Popup Open';\r\n\r\n            var segmentEvent = {\r\n              eventType: 'segmentEvent',\r\n              media_type: nextImg.dataset.segmentEventMedia_type,\r\n              image_url: nextImg.src,\r\n              image_sequence: images[index].position + 1,\r\n              image_type: nextImg.dataset.segmentEventMedia_type,\r\n              event: nextImg.dataset.iscomm === \"False\"\r\n                ? 'Home Image Displayed'\r\n                : 'Community Image Displayed',\r\n            };\r\n\r\n            document.body.dispatchEvent &&\r\n              document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n              detail: { data: segmentEvent }\r\n            }));\r\n\r\n            onChange(index, images[index]); // Run onChange event\r\n        },\r\n\r\n        /**\r\n         * Moves the Gallery to the Previous image\r\n         * \r\n         * @private\r\n         * @param {Image | HTMLDivElement} prevImg Previous Image\r\n         * @param {Image | HTMLDivElement} activeImg Active Image         \r\n         * @param {Image | HTMLDivElement} nextImg Next Image\r\n         */\r\n        goPrev = function(prevImg, activeImg, nextImg) {\r\n            var images = gallery.images;\r\n            index = index - 1 < 0 ? images.length - 1 : index - 1; // Update Index\r\n\r\n            /**\r\n             * Clean Next image src since it will become the Previous image\r\n             * else when changing it to Previous image it won't update\r\n             * its look until the new image has been loaded\r\n             */\r\n            if (isImage(prevImg)) {\r\n                setAttr(nextImg, \"srcset\", \"\");\r\n                setAttr(nextImg, \"src\", \"\");\r\n            }\r\n\r\n            /**\r\n             * Change the Next image to become the Previous image\r\n             */\r\n            var newPrevIndex = index - 1 < 0 ? images.length - 1 : index - 1;\r\n\r\n            nextImg = tryToggleImageType(nextImg, newPrevIndex);\r\n\r\n            setSizes(nextImg, images[newPrevIndex].sizes);\r\n            setSrcset(nextImg, images[newPrevIndex].Srcset);\r\n            setSrc(nextImg, images[newPrevIndex].url);\r\n            setAlt(nextImg, images[newPrevIndex].alt);\r\n            var positionImageCollection = images[newPrevIndex].position;\r\n            var collectionName = images[newPrevIndex].collection;\r\n            var id = images[newPrevIndex].id;\r\n\r\n            if (typeof positionImageCollection != \"undefined\" && collectionName) {\r\n                setPosition(nextImg, images[newPrevIndex].position);\r\n                setCollection(nextImg, images[newPrevIndex].collection);\r\n                setImgId(nextImg, id);\r\n            }\r\n\r\n            setFloorPlanClass(false, index, nextImg);\r\n\r\n            /*\r\n             * Update images relations\r\n             * Current Previous -> New Active\r\n             * Current Active ->New Next\r\n             * Current Next -> New Previous\r\n             */\r\n            setAttr(prevImg, \"class\", getAttr(prevImg, \"class\").replace(\"previous\", \"active\").replace('nhs-u-opacity-0', '') );\r\n            setAttr(activeImg, \"class\", getAttr(activeImg, \"class\").replace(\"active\", \"next nhs-u-opacity-0\") );\r\n            setAttr(nextImg, \"class\", getAttr(nextImg, \"class\").replace(\"next\", \"previous\") );\r\n            setAttr(nextImg, \"class\", getAttr(nextImg, \"class\").replace(\"active\", \"previous\"));\r\n\r\n            prevImg.dataset.segmentEvent = \"true\";\r\n            prevImg.dataset.segmentEventEvent = \"Gallery Viewer Opened\";\r\n            prevImg.dataset.segmentEventMedia_type = images[index].collection;\r\n            prevImg.dataset.event = \"true\";\r\n            prevImg.dataset.iscomm = activeImg.dataset.iscomm;\r\n            prevImg.dataset.ga4EventName = 'gallery_detail_pages';\r\n            prevImg.dataset.ga4EventClick_target = 'Gallery Popup Open';\r\n\r\n            var segmentEvent = {\r\n              eventType: 'segmentEvent',\r\n              media_type: prevImg.dataset.segmentEventMedia_type,\r\n              image_url: prevImg.src,\r\n              image_sequence: images[index].position + 1,\r\n              image_type: prevImg.dataset.segmentEventMedia_type,\r\n              event: prevImg.dataset.iscomm === \"False\"\r\n                ? 'Home Image Displayed'\r\n                : 'Community Image Displayed',\r\n            };\r\n\r\n            document.body.dispatchEvent &&\r\n              document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n              detail: { data: segmentEvent }\r\n            }));\r\n\r\n            onChange(index, images[index]); // Run onChange event\r\n        },\r\n\r\n        /**\r\n         * Sets the touchId property if this is undefined\r\n         * using the Touch of a TouchEvent and reduces\r\n         * the animation time of the Gallery to the minimum possible value\r\n         * \r\n         * @private\r\n         * @param {TouchEvent} event TouchEvent         \r\n         */\r\n        registerTouch = function(event) {\r\n            if (!(isUndefined(touchId) && isUndefined(lastX) && touches === 0) || changeRunning) return;\r\n            touches++;\r\n            var touch = getTouch(event);\r\n            touchId = getTouchId(touch);\r\n            lastX = getTouchX(touch);\r\n            setXAnimationTime(0);\r\n        },\r\n\r\n        /**\r\n         * Executes a go Function a certain amount of times\r\n         * \r\n         * @private         \r\n         * @param {Function} goFn Go Function\r\n         * @param {Number} times Times to repeat\r\n         */\r\n        go = function(goFn, times) {\r\n            if (isUndefined(times) || isNaN(times)) {\r\n                times = 1;\r\n            }\r\n\r\n            var previous = context.querySelector(\".previous\");\r\n            var active = context.querySelector(\".active\");\r\n            var next = context.querySelector(\".next\");\r\n\r\n            goFn(previous, active, next);\r\n            times--;\r\n            if (times) {\r\n                setTimeout(function() {\r\n                        go(goFn, times);\r\n                    },\r\n                    500);\r\n            }\r\n        },\r\n\r\n        /**\r\n         * Defines a property to an Object\r\n         * \r\n         * @private         \r\n         * @param {String} propName Property name\r\n         * @param {Function} getter Getter function\r\n         * @param {Function} setter Setter function\r\n         */\r\n        defineProp = function(propName, getter, setter) {\r\n            Object.defineProperty(gallery,\r\n                propName,\r\n                {\r\n                    get: getter,\r\n                    set: setter\r\n                });\r\n        },\r\n\r\n        cleanStyles = function() {\r\n            for (var i = 0; i < arguments.length; i++) {\r\n                removeAttr(arguments[i], \"style\");\r\n            }\r\n        },\r\n        setCssVar = function(cssVarName, value) {\r\n            document.documentElement.style.setProperty(cssVarName, value);\r\n        };\r\n\r\n\r\n    var index = 0,        \r\n        touches = 0,\r\n        touchId = getUndefined(),\r\n        changeRunning = !1,\r\n        lastX = getUndefined(),\r\n        onChange = function(){};\r\n\r\n    gallery.images = images;\r\n\r\n    (function () {\r\n\r\n        /*** Events Binding ***/\r\n        var bindEvents = function () {\r\n            \r\n            /*** Controls Events Binding ***/\r\n            var controls = Array.from(context.querySelectorAll(\".control\"));\r\n\r\n            controls.forEach(function(control) {\r\n              addEvent(control, \"click\", function () {\r\n                /**\r\n                 * If There's any touch hold or a image change running do nothing\r\n                 */\r\n                if (!isUndefined(touchId) || changeRunning) return;\r\n                var previousImg = context.querySelector(\".previous\"),\r\n                  activeImg = context.querySelector(\".active\"),\r\n                  nextImg = context.querySelector(\".next\");\r\n\r\n                /**\r\n                 * Change Visual properties in a Request Animation Frame callback\r\n                 * to wait until all the visual properties has been changed to\r\n                 * let the browser perform a paint\r\n                 */\r\n                requestAnimationFrame(function () {\r\n                  removeAttr(previousImg, \"style\");\r\n                  removeAttr(activeImg, \"style\");\r\n                  removeAttr(nextImg, \"style\");\r\n                  if (hasClass(control, \"next\")) {\r\n                      goNext(previousImg, activeImg, nextImg);\r\n                  } else if (hasClass(control, \"previous\")) {\r\n                      goPrev(previousImg, activeImg, nextImg);\r\n                  }\r\n\r\n                  var newPreviousImg = context.querySelector(\".previous\");\r\n                  var newNextImg = context.querySelector(\".next\");\r\n\r\n                });\r\n\r\n                /**\r\n                 * Block change execution while the animation is being performed\r\n                 * so that the images do not overlap each other\r\n                 */\r\n                changeRunning = true;\r\n                setTimeout(function () {\r\n                  changeRunning = false;\r\n                  activeImg.classList.remove(\"nhs_floorPlanFitTransitionNext\");\r\n                  activeImg.classList.remove(\"nhs_floorPlanFitTransitionPrev\");\r\n                }, 500);\r\n\r\n              });\r\n            });\r\n\r\n            /*** Touch Events Binding ***/\r\n\r\n            var imageElems = context.querySelectorAll(\"img.active,img.previous,img.next,.o-viewer.active,.o-viewer.previous,.o-viewer.next\");\r\n\r\n            for (var i = 0; i < imageElems.length; ++i) {\r\n                var img = imageElems[i];\r\n\r\n                var imageElements = [img];\r\n\r\n                /*** Touch Registration Handler ***/\r\n                addEvent(imageElements, \"touchstart\", registerTouch, passive);\r\n\r\n                /*** Touch Movement Handler ***/\r\n                addEvent(imageElements, \"touchmove\", function (event) {\r\n                    event.preventDefault();\r\n                    if (changeRunning) return;\r\n                    /**                  \r\n                     * If the \"touchmove\" event is triggered before the \"touchstart\"\r\n                     * register the event's touch\r\n                     */\r\n                    if (isUndefined(touchId) || isUndefined(lastX)) return registerTouch(event);\r\n\r\n                    var touch = getTouch(event);\r\n\r\n                    /**\r\n                     * Check for the touch Id to avoid multitouch issues\r\n                     */\r\n                    if (touchId !== getTouchId(touch)) return;\r\n\r\n                    /**\r\n                     * Calculate touch move measure\r\n                     */\r\n                    var newX = getTouchX(touch),\r\n                        diff = lastX - newX,\r\n                        prevImg = context.querySelector(\".previous\"),\r\n                        activeImg = context.querySelector(\".active\"),\r\n                        nextImg = context.querySelector(\".next\"),\r\n                        activeWidth = activeImg.width || activeImg.offsetWidth,\r\n                        prevX = getImgX(prevImg) || activeWidth * -1,\r\n                        activeX = getImgX(activeImg),\r\n                        nextX = getImgX(nextImg) || activeWidth,\r\n                        tDiff = activeX - diff; // Total difference: Total movement of the left image edge\r\n\r\n                    lastX = newX; // Overwrite Last X value with the Nex X value\r\n\r\n                    /**\r\n                     * If the Total difference is greater the the width of the\r\n                     * active image, using 25px as margin, lock the gallery movement\r\n                     */\r\n                    if (Math.abs(tDiff) > (activeWidth - 25)) return;\r\n\r\n                    /**\r\n                     * Perform the follow touch movement, await until the X values of\r\n                     * the images has been updated to let the browser paint the screen                 \r\n                     */\r\n                    requestAnimationFrame(function () {\r\n                        setImgX(prevImg, prevX - diff);\r\n                        setImgX(activeImg, tDiff);\r\n                        setImgX(nextImg, nextX - diff);\r\n                        //addClass(context, \"swiping\");\r\n                    });\r\n\r\n                }, { passive: false });\r\n\r\n                /*** Touch End Handler ***/\r\n                addEvent(imageElements, \"touchend\", function (event) {\r\n                    if (changeRunning) return;\r\n                    touches--;\r\n\r\n                    var touch = getTouch(event);\r\n\r\n                    /**\r\n                     * If the touch Id of the leaving touch is the\r\n                     * same of the registered touch, continue.\r\n                     * If the touches are greater than 0 do nothing.\r\n                     */\r\n                    if (touchId !== getTouchId(touch) || touches > 0) return;\r\n\r\n                    /**\r\n                     * Clean the variables\r\n                     */\r\n                    touchId = getUndefined();\r\n                    lastX = getUndefined();\r\n\r\n                    var prevImg = context.querySelector(\".previous\"),\r\n                        activeImg = context.querySelector(\".active\"),\r\n                        nextImg = context.querySelector(\".next\"),\r\n                        activeX = getImgX(activeImg),\r\n                        prevX = getImgX(prevImg),\r\n                        nextX = getImgX(nextImg),\r\n                        activeWidth = activeImg.width || activeImg.offsetWidth;\r\n\r\n                    /**\r\n                     * Perform the animation after touch left, but await until the Functions\r\n                     * has been executed to let the browser paint the screen again\r\n                     */\r\n                    requestAnimationFrame(function () {\r\n                        /**\r\n                         * If the X value of the active image is greater than\r\n                         * the eighth part of the full active image width, perform the change\r\n                         * according to the symbol(+/-) of the active image's X value\r\n                         */\r\n                        setCssVar(\"--active-x\", activeX + \"px\");\r\n                        setCssVar(\"--previous-x\", prevX + \"px\");\r\n                        setCssVar(\"--next-x\", nextX + \"px\");\r\n\r\n                        if (Math.abs(activeX) > (activeWidth / 8)) {\r\n                            setXAnimationTime(0.5);\r\n                            if (activeX < 0) {\r\n                                setImgX(nextImg, 0);\r\n                                setImgX(activeImg, activeWidth * -1);\r\n                                setAnimationTime(prevImg, \"transform\", 0);\r\n                                setImgX(prevImg, activeWidth);\r\n                                setTimeout(function () {\r\n                                    goNext(prevImg, activeImg, nextImg);\r\n                                    cleanStyles(prevImg, activeImg, nextImg);\r\n                                }, 500);\r\n                            } else {\r\n                                setImgX(prevImg, 0);\r\n                                setImgX(activeImg, activeWidth);\r\n                                setAnimationTime(nextImg, \"transform\", 0);\r\n                                setImgX(nextImg, activeWidth * -1);\r\n                                setTimeout(function () {\r\n                                    goPrev(prevImg, activeImg, nextImg);\r\n                                    cleanStyles(prevImg, activeImg, nextImg);\r\n                                }, 500);\r\n                            }\r\n                        } else {\r\n                            setXAnimationTime(0.3);\r\n                            setImgX(nextImg, activeWidth);\r\n                            setImgX(activeImg, 0);\r\n                            setImgX(prevImg, activeWidth * -1);\r\n                            setTimeout(function () {\r\n                                cleanStyles(prevImg, activeImg, nextImg);\r\n                            }, 300);\r\n                        }\r\n\r\n                        setCssVar(\"--active-x\", \"0%\");\r\n                        setCssVar(\"--previous-x\", \"-100%\");\r\n                        setCssVar(\"--next-x\", \"100%\");\r\n\r\n                    });\r\n\r\n                    changeRunning = true;\r\n                    setTimeout(function () {\r\n                        changeRunning = false;\r\n                    }, 500);\r\n\r\n                }, passive);\r\n            }\r\n        };\r\n\r\n        /*** Gallery Initialization ***/\r\n        (function () {\r\n            var images = gallery.images,\r\n                active = context.querySelector(\"img\"),\r\n                /*** Creation of the Auxiliary images ***/\r\n                previous = document.createElement(\"img\"),\r\n                next = document.createElement(\"img\"),\r\n                currentSrc = getAttr(active, \"src\");\r\n\r\n            var nextIndex;\r\n            var prevIndex;\r\n\r\n            /*** Images Set Up ***/\r\n            active.classList.add(\"active\");\r\n            previous.classList.add(\"previous\", \"nhs-u-absolute-centered\", \"nhs-c-wrapper__hero-image-slide--desktop\", \"nhs-u-opacity-0\");\r\n            previous.setAttribute(\"data-full-image-viewer-opener\", \"true\");\r\n            next.classList.add(\"next\", \"nhs-u-absolute-centered\", \"nhs-c-wrapper__hero-image-slide--desktop\", \"nhs-u-opacity-0\");\r\n            next.setAttribute(\"data-full-image-viewer-opener\", \"true\");\r\n\r\n            /*** Index initialization is based on the image already loaded ***/\r\n            for (var i = 0; i < images.length; ++i) {\r\n                if (images[i].url === currentSrc) {\r\n                    index = i;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (images.length > 2) {\r\n                nextIndex = index + 1 === images.length ? 0 : index + 1;\r\n                prevIndex = index - 1 < 0 ? images.length - 1 : index - 1;\r\n            } else {\r\n                nextIndex = images.length === 1 ? 0 : 1;\r\n                prevIndex = images.length === 1 ? 0 : 1;\r\n            }\r\n\r\n            /*** Images DOM Insertion ***/\r\n            setSizes(next, images[nextIndex].sizes);\r\n            setSrcset(next, images[nextIndex].Srcset);\r\n            setSrc(next, images[nextIndex].url);\r\n            setAlt(next, images[nextIndex].alt);\r\n            var collectionNameNext = images[nextIndex].collection;\r\n            var positionImageCollectionNext = images[nextIndex].position;\r\n            var idImageNext = images[nextIndex].id;\r\n\r\n            if (collectionNameNext && typeof positionImageCollectionNext !== \"undefined\") {\r\n                setPosition(next, positionImageCollectionNext);\r\n                setCollection(next, collectionNameNext);\r\n                setImgId(next, idImageNext);\r\n            }\r\n\r\n            setSizes(previous, images[prevIndex].sizes);\r\n            setSrcset(previous, images[prevIndex].Srcset);\r\n            setSrc(previous, images[prevIndex].url);\r\n            setAlt(previous, images[prevIndex].alt);\r\n            var collectionNamePrev = images[prevIndex].collection;\r\n            var positionImageCollectionPrev = images[prevIndex].position;\r\n            var idImagePrev = images[prevIndex].id;\r\n\r\n            if (collectionNamePrev && typeof positionImageCollectionPrev !== \"undefined\") {\r\n                setImgId(previous, idImagePrev);\r\n                setCollection(previous, images[prevIndex].collection);\r\n                setPosition(previous, positionImageCollectionPrev);\r\n            }\r\n\r\n            insertAt(previous, \"beforebegin\", active);\r\n            insertAt(next, \"afterend\", active);\r\n\r\n            bindEvents();\r\n\r\n            if (images.length > 1) {\r\n            var segmentEvent = {\r\n              eventType: 'segmentEvent',\r\n              media_type: active.dataset.segmentEventMedia_type,\r\n              image_url: active.src, \r\n              image_sequence: 1,\r\n              image_type: active.dataset.segmentEventMedia_type,\r\n              event: active.dataset.iscomm === \"False\"\r\n                ? 'Home Image Displayed'\r\n                : 'Community Image Displayed',\r\n            };\r\n\r\n            document.body.dispatchEvent &&\r\n              document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n              detail: { data: segmentEvent }\r\n            }));\r\n          }\r\n\r\n        })();\r\n    })();\r\n\r\n    /**\r\n     * Goes to the next image\r\n     * \r\n     * @public\r\n     * @readonly          \r\n     * @param {Number} times Times to repeat\r\n     */\r\n    defineProp(\"goNext\", function () {\r\n        return function (times) {\r\n            go(goNext, times);\r\n        };\r\n    });\r\n\r\n    /**\r\n     * Goes to the previous Image\r\n     * \r\n     * @public\r\n     * @readonly\r\n     * @param {Number} times Times to repeat\r\n     */\r\n    defineProp(\"goPrev\", function () {\r\n        return function (times) {\r\n            go(goPrev, times);\r\n        };\r\n    });\r\n\r\n    /**\r\n     * Gets the index of the Gallery\r\n     * \r\n     * @public\r\n     * @readonly\r\n     */\r\n    defineProp(\"index\", function () {\r\n        return index;\r\n    });\r\n\r\n    /**\r\n     * Function to trigger each time the Gallery changes\r\n     * \r\n     * @public\r\n     */\r\n    defineProp(\"onChange\",\r\n        function () {\r\n            return onChange;\r\n        },\r\n        function (value) {\r\n            if (value instanceof Function) {\r\n                onChange = value;\r\n            }\r\n        }\r\n    );\r\n};\r\n\r\n(function(){\r\n    \"use strict\";\r\n\r\n    if (\"function\" === typeof define && define.amd) {\r\n        // If supports for AMD is available return the value to the AMD Loader\r\n        // and to the global (window) object in case any JS module is expecting\r\n        // the lazyLoad to exists on the window object.\r\n        define([], function () {\r\n            return galleryInit;\r\n        });\r\n    } else if (\"object\" === typeof exports) {\r\n        // If supports for Common JS is available export the module\r\n        // and pass is value to the global (window) object in case non Common JS code \r\n        // is expected to work with this lazyLoad.\r\n        module.exports = galleryInit;\r\n    } else {\r\n        // If not support for AMD or Common JS is available register the module in the global scope.\r\n        \r\n        if (\"undefined\" === typeof NHS || null === NHS) {\r\n            NHS = {};\r\n        }\r\n        if (\"undefined\" === typeof NHS.Scripts || null === NHS.Scripts) {\r\n            NHS.Scripts = {};\r\n        }\r\n\r\n        NHS.Scripts.Gallery = galleryInit;\r\n    }\r\n\r\n\r\n}());","(function imagesGalleryHandler() {\r\n  'use strict';\r\n\r\n  const firstImage = document.querySelector('[data-active-image]');\r\n  if (!firstImage) {\r\n    return;\r\n  }\r\n\r\n  /**\r\n   * This function checks if the first image is in portrait orientation and adds\r\n   * a specific class if it is.\r\n   */\r\n  function handlerVerticalImages() {\r\n    const isPortraitImage = firstImage.naturalHeight > firstImage.naturalWidth;\r\n    if (isPortraitImage) {\r\n      firstImage.classList.add('nhs-c-image--vertical');\r\n    }\r\n  }\r\n\r\n  if (firstImage.complete && firstImage.naturalHeight !== 0) {\r\n    handlerVerticalImages();\r\n    return;\r\n  }\r\n\r\n  firstImage.addEventListener('load', handlerVerticalImages);\r\n}());\r\n","(function thumbnailHelper(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  const previousThumbnailHelper = global.NewHomeSource.ThumbnailHelper;\r\n\r\n  /**\r\n   * @constructs NewHomeSource.ThumbnailHelper\r\n   */\r\n  function ThumbnailHelper() {\r\n  }\r\n\r\n  ThumbnailHelper.defaultThumbs = JSON.parse(document.querySelector('[data-component=\"defaultThumbnails\"]').innerHTML);\r\n\r\n  /**\r\n   * @public\r\n   * validate: return thumbnail url valid.\r\n   */\r\n  ThumbnailHelper.validate = function validate(data) {\r\n    const collection = data.CollectionName.split(' ');\r\n    const imageUrl = data.ThumbnailUrl || ThumbnailHelper.defaultThumbs[collection[0]];\r\n    return imageUrl;\r\n  };\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.ThumbnailHelper to the previous script.\r\n   */\r\n  ThumbnailHelper.noConflict = function noConflict() {\r\n    global.NewHomeSource.ThumbnailHelper = previousThumbnailHelper;\r\n    return ThumbnailHelper;\r\n  };\r\n\r\n  global.NewHomeSource.ThumbnailHelper = ThumbnailHelper;\r\n}(window));\r\n","//Class Constructor\r\n//This call usually is made in the Views, and there are the parameters specified.\r\nNHS.Scripts.CommunityDetailXp = function (parameters) {\r\n  //Initializing parameters\r\n  this.parameters = parameters;\r\n  this._tabsControlId = parameters.tabsControlId;\r\n  this._searchParameters = parameters.searchParameters;\r\n  this._getHomeResultsByCommunityFromApi = parameters.getHomeResultsByCommunityFromApi;\r\n  this.selectedTab = parameters.SelectedTab;\r\n  this._communityId = parameters.communityId;\r\n  this._builderId = parameters.builderId;\r\n  this.player = null;\r\n  this.numberOfCards = 9;\r\n  this.gallery = new Array();\r\n  this.galleryIndex = 0;\r\n  this.communityDetailContainerHigh = undefined;\r\n  this.logger = new NHS.Scripts.Globals.EventLogger({\r\n    siteRoot: parameters.logInfo.siteRoot,\r\n    fromPage: parameters.logInfo.fromPage,\r\n    partnerID: parameters.logInfo.partnerId,\r\n    partnerName: parameters.logInfo.partnerName,\r\n    performanceLogUrl: parameters.logInfo.performanceLogUrl,\r\n    marketId: parameters.marketId\r\n  });\r\n\r\n  this.favs = new NHS.Scripts.Favorites({\r\n    urlBase: parameters.urlBase,\r\n    partnerId: parameters.PartnerId,\r\n    marketId: parameters.MarketId,\r\n    logInfo: parameters.logInfo\r\n  });\r\n};\r\n\r\nNHS.Scripts.CommunityDetailXp.prototype = {\r\n  get_commId: function () {\r\n    return this._communityId;\r\n  },\r\n  get_builderId: function () {\r\n    return this._builderId;\r\n  },\r\n  initialize: function () {\r\n    var self = this;\r\n    self.setUpControls();\r\n    self.favs.init();\r\n\r\n    const loadReviews = function() {\r\n      const ratingsFlagElement = document.querySelector('#IsReviewsAvailable');\r\n      const hasReviews = ratingsFlagElement && ratingsFlagElement.value === 'True';\r\n\r\n      if (hasReviews) {\r\n        const microModalInput = document.querySelector('#ratings-bundle');\r\n\r\n        NHS.loadJs(microModalInput.value, \"ratings-script\", function () {\r\n          RatingsAndReviews.loadDetailSection();\r\n        });\r\n      }\r\n    }\r\n\r\n    var attributeParameters = self.parameters;\r\n    if (attributeParameters.mapParameters) {\r\n      attributeParameters.mapParameters.logger = new NHS.Scripts.Globals.EventLogger({\r\n        siteRoot: self.parameters.logInfo.siteRoot,\r\n        partnerId: self.parameters.logInfo.partnerId,\r\n        partnerName: self.parameters.logInfo.partnerName,\r\n        marketId: self.parameters.logInfo.marketId,\r\n        performanceLogUrl: self.parameters.logInfo.performanceLogUrl\r\n      });\r\n    }\r\n\r\n\r\n    if (document.querySelectorAll(\"#HomesAndPlans\").length !== 0) {\r\n      defaultTargetForLazyLoad = \"HomesAndPlans\";\r\n    } else {\r\n      defaultTargetForLazyLoad = \"CommunityInfo\";\r\n    }\r\n\r\n    var mapsContainer = document.querySelector(\"#nhs_PropertyMap\");\r\n    self.googlePropertyMap = new NHS.Scripts.GooglePropertyMap(attributeParameters.mapParameters);\r\n    self.googlePropertyMap.SetUpdate();\r\n\r\n    function loadInteractiveMap(event) {\r\n      self.googlePropertyMap.init();\r\n      mapsContainer.removeEventListener(\"click\", loadInteractiveMap);\r\n    }\r\n\r\n    if (mapsContainer) {\r\n      mapsContainer.addEventListener(\"click\", loadInteractiveMap);\r\n    }\r\n\r\n    // lazyload the Near By Communities Section\r\n    if (self.parameters.isBilled) {\r\n      var isNearbyShowed = false;\r\n      var defaultOptions = {\r\n        ElementVisibleId: \"SchoolsAndAmenities\",\r\n        UpdateAction: function (isVisible) {\r\n          if (isVisible && isNearbyShowed === false) {\r\n            isNearbyShowed = true;\r\n            const params = new URLSearchParams({\r\n              communityId: self.parameters.communityId,\r\n              builderId: self.parameters.builderId,\r\n              marketId: self.parameters.marketId,\r\n              brandId: self.parameters.brandId,\r\n              brandName: self.parameters.BrandName,\r\n              latitude: self.parameters.commLat,\r\n              longitude: self.parameters.commLon,\r\n              pricelow: self.parameters.PriceLow,\r\n              priceHigh: self.parameters.PriceHigh,\r\n              fromPage: self.parameters.fromPageForNearby\r\n            });\r\n            fetch(self.parameters.getNearbyCommunitiesActionUrl + '?' + params.toString())\r\n              .then((response) => {\r\n                if (response.ok) {\r\n                  response.text().then((data) => {\r\n                    if (data === '') {\r\n                      return;\r\n                    }\r\n                    const nearbyContainer = document.getElementById(\"nhs_NearbyHomesContent\");\r\n                    if(nearbyContainer) {\r\n                      nearbyContainer.innerHTML = data;\r\n                      nearbyContainer.removeAttribute('hidden');\r\n                      document.body.dispatchEvent(new CustomEvent('moreCommunitiesLoaded'));\r\n                    }\r\n                  });\r\n                }\r\n              });\r\n          }\r\n        }\r\n      };\r\n      jQuery.LazyLoad(defaultOptions);\r\n    }\r\n\r\n    var testimonialsModel = {\r\n      communityId: self.parameters.communityId,\r\n      builderId: self.parameters.builderId,\r\n      isMpCommunity: false,\r\n      isPreview: self.parameters.PreviewMode === \"True\"\r\n    };\r\n    const nearbyWrapper = document.querySelector('[data-nearby-wrapper]');\r\n    if (nearbyWrapper !== null) {\r\n      self.performLazyLoad('nhs_nearbyHomesSection', null, nearbyWrapper.dataset.url, function (data) {\r\n        if (!data) {\r\n          const nearbySection = document.querySelector('[data-nearby-section]');\r\n          nearbySection.setAttribute('hidden', '');\r\n          return;\r\n        }\r\n\r\n        document.querySelector('[data-nearby-wrapper]').innerHTML = data;\r\n        self.favs.init();\r\n        document.body.dispatchEvent(new CustomEvent('moreCommunitiesLoaded'));\r\n      });\r\n    }\r\n    self.performLazyLoad(defaultTargetForLazyLoad, testimonialsModel, self.parameters.getCommunityTestimonialsUrl, function (data) {\r\n      var container = document.createElement(\"div\");\r\n      var testimonialsData = data.Testimonials;\r\n      var testimonialsCards = document.querySelector(\".card__testimonials\");\r\n      var testimonialContainer = document.querySelector(\".section__testimonials\");\r\n      if (testimonialsData.length > 0) {\r\n        if (testimonialsCards && testimonialContainer) {\r\n          for (var i = 0; i < testimonialsData.length; i++) {\r\n            var cloneTestimonialCard = testimonialsCards.cloneNode(true);\r\n            cloneTestimonialCard.querySelector(\".testimonial__text\").innerHTML =\r\n              testimonialsData[i].Description;\r\n            cloneTestimonialCard.querySelector(\".testimonial__citation\").innerHTML =\r\n              testimonialsData[i].Citation;\r\n            container.appendChild(cloneTestimonialCard);\r\n          }\r\n          testimonialContainer.innerHTML = container.innerHTML;\r\n          document.querySelector(\".testimonial__section\").style.display = 'block';\r\n        }\r\n      }\r\n    });\r\n\r\n    self._updateAdsPosition();\r\n\r\n    loadReviews();\r\n\r\n    // Gallery Initialization\r\n    self.setUpGalleryXp();\r\n    var elements = {\r\n      'selector': '[data-full-image-viewer-opener=\"true\"]',\r\n      'favorites': self.favs,\r\n      'performanceEvents': self.logger,\r\n      'logInfo': self.parameters.logInfo\r\n    };\r\n\r\n    window.NewHomeSource.FullImageViewerOpener && window.NewHomeSource.FullImageViewerOpener(elements);\r\n    new window.NewHomeSource.Modules.ArrowHandler({\r\n      container: document.querySelector('[data-toolbar]')\r\n    });\r\n\r\n    // Arrow Handler for Sticky Bar\r\n    new window.NewHomeSource.Modules.ArrowHandler({\r\n      container: document.querySelector('[data-sticky-bar]')\r\n    });\r\n\r\n\r\n    const mapButton = document.querySelector('.nhs_FormMapLink');\r\n    if (mapButton) {\r\n      mapButton.addEventListener('click', (event) => {\r\n        event.preventDefault();\r\n        const neighborhoodStickyButton = document.querySelector('[data-id=\"nhs_MapsAndDirections\"]');\r\n        if (neighborhoodStickyButton) {\r\n          neighborhoodStickyButton.click();\r\n        }\r\n      });\r\n    }\r\n\r\n    self.googleAnalyticsBindings();\r\n    self.performanceEventsBindings();\r\n\r\n    const formSubmitButton = document.querySelector('[data-on-page-button]');\r\n    const shouldAddFreeBrochureSubmitEventAttributes = formSubmitButton ? !formSubmitButton.closest('[data-coming-soon]') : false;\r\n    if (shouldAddFreeBrochureSubmitEventAttributes) {\r\n      self.addFreeBrochureSubmitEventAttributes(formSubmitButton);\r\n    }\r\n\r\n    var container = document.querySelector(\"#nhs_DetailSalesOffice [data-slider-component]\");\r\n\r\n    /**\r\n     * trackReadMoreOfferEvent: tracks the event when the read more button is clicked.\r\n     * @param {string} readMoreButtonText word that is used on the read more button.\r\n     */\r\n    function trackReadMoreOfferEvent(readMoreButtonText){\r\n      const googleAnalyticsEvent = {\r\n        eventType: 'GA4Event',\r\n        eventName: 'builder_deals',\r\n        params: {\r\n          click_target: readMoreButtonText\r\n        }\r\n      };\r\n      document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n        detail: { data: googleAnalyticsEvent }\r\n      }));\r\n    }\r\n\r\n    var readOffersContainer = document.querySelector(\"[data-offersContainer]\");\r\n    if (readOffersContainer) {\r\n      var offerBubblesCollection = document.querySelectorAll(\"[data-offerBubble]\");\r\n      var currentReadMoreText = \"\";\r\n      var showHiddenContentClass = \"offer__show\";\r\n      var showMoreElement;\r\n      var collapsibleContentElement;\r\n      readOffersContainer.addEventListener(\"click\", function (event) {\r\n        //If read more, we should change the text\r\n        if (event.target.hasAttribute(\"data-readMoreOffer\")) {\r\n          for (var counter = 0; counter < offerBubblesCollection.length; counter++) {\r\n            collapsibleContentElement = offerBubblesCollection[counter].querySelector(\"[data-collapsedContent]\");\r\n            if (collapsibleContentElement) {\r\n              if (collapsibleContentElement.classList.contains(showHiddenContentClass)) {\r\n                collapsibleContentElement.classList.remove(showHiddenContentClass);\r\n              } else {\r\n                collapsibleContentElement.classList.add(showHiddenContentClass);\r\n              }\r\n            }\r\n\r\n            showMoreElement = offerBubblesCollection[counter].querySelector(\"[data-readMoreOffer]\");\r\n            if (showMoreElement) {\r\n              currentReadMoreText = showMoreElement.textContent;\r\n              showMoreElement.textContent = showMoreElement.getAttribute(\"data-toggleText\");\r\n              showMoreElement.setAttribute(\"data-toggleText\", currentReadMoreText);\r\n\r\n              const currentEventReadMoreText = showMoreElement.dataset.eventCurrentText;\r\n              const currentEventReadMoreToggleText = showMoreElement.dataset.eventToggleText;\r\n              showMoreElement.dataset.eventCurrentText = currentEventReadMoreToggleText;\r\n              showMoreElement.dataset.eventToggleText = currentEventReadMoreText;\r\n              trackReadMoreOfferEvent(currentEventReadMoreText);\r\n            }\r\n\r\n          }\r\n        }\r\n      });\r\n    }\r\n\r\n    //sticky bar detail pages scroll\r\n    var scrollToBarItems = document.querySelectorAll('[page-scroller]');\r\n    var scrollBehavior = 'scrollBehavior' in document.documentElement.style;\r\n    for (var i = 0; i < scrollToBarItems.length; i++) {\r\n      scrollToBarItems[i].addEventListener(\"click\", function (event) {\r\n        if (window.scroll) {\r\n          event.preventDefault();\r\n          var target = document.getElementById(this.getAttribute(\"data-target\"));\r\n          var selectedTab = document.querySelector(\"[class*=nhs-c-button--tap-light-active]\");\r\n          if (target) {\r\n            if (scrollBehavior) {\r\n              target.scrollIntoView({ behavior: \"smooth\"});\r\n            } else {\r\n              target.scrollIntoView();\r\n            }\r\n            var targetElement = event.target;\r\n            if (selectedTab && targetElement.hasAttribute(\"data-sticky-tab\")) {\r\n              selectedTab.classList.remove(\"nhs-c-button--tap-light-active\");\r\n              delete selectedTab.dataset.itemActive;\r\n              targetElement.classList.add(\"nhs-c-button--tap-light-active\");\r\n              targetElement.dataset.itemActive = 'true';\r\n            }\r\n          }\r\n\r\n        }\r\n      });\r\n    }\r\n  },\r\n\r\n  \r\n\r\n  setUpGalleryXp: function () {\r\n    var self = this;\r\n    self.MediaData = self.parameters.gallery.mediaResult;\r\n    self.setupNewOnPageGallery();\r\n  },\r\n\r\n  RemoveParametersFromUrl: function (url, parameters) {\r\n    for (var i = 0; i < parameters.length; i++) {\r\n      var parameter = parameters[i];\r\n\r\n      url = url.replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1').replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');\r\n    }\r\n    return url;\r\n  },\r\n\r\n  RemoveResizingParametersFromQueryString: function (image) {\r\n    var self = this;\r\n    var imageUrl = NewHomeSource.ThumbnailHelper.validate(image);\r\n    return self.RemoveParametersFromUrl(imageUrl, [\"width\", \"height\", \"w\", \"h\", \"maxwidth\", \"maxheight\"]);\r\n\r\n  },\r\n\r\n  /**\r\n   * Verifies that the given url contains vimeo.\r\n   *\r\n   * @private\r\n   * @param {url} string url from vimeo \r\n   */\r\n  isVimeoVideo: function (url) {\r\n    return url.indexOf(\"vimeocdn.com\") !== -1;\r\n  },\r\n\r\n\r\n  /**\r\n  * Replaces in the vimeo URL the sizes with the width passed as parameter.\r\n  * The vimeo format CDN is: https://www.vimeo.com/video/{id}_{width}x{height}\r\n  * @private\r\n  * @param {url} string url from vimeo\r\n  * @param {width} string new width value\r\n  */\r\n  getVimeoSourceSetUrl: function (url, width) {\r\n    return url.replace(/_\\d+(x\\d+)?/, \"_\" + width);\r\n  },\r\n  setupNewOnPageGallery: function (bindEvents) {\r\n    var self = this;\r\n    var commTitle = \"\";\r\n\r\n    var breakpoints = [\r\n      {\r\n        width: 404,\r\n        breakpoint: \"404w\"\r\n      },\r\n      {\r\n        width: 808,\r\n        breakpoint: \"808w\"\r\n      },\r\n      {\r\n        width: 966,\r\n        breakpoint: \"966w\"\r\n      },\r\n      {\r\n        width: 1932,\r\n        breakpoint: \"1932w\"\r\n      }\r\n    ];\r\n    var breakpointLength = breakpoints.length;\r\n    var resizedMediaImages = self.parameters.gallery.mediaImages.map(function (image) {\r\n      if (image.IsRichMedia) {\r\n        return;\r\n      }\r\n\r\n      var cleanUrl = image.VideoType !== \"youtube\" ? self.RemoveResizingParametersFromQueryString(image) : \"https://img.youtube.com/vi/\" + image.VideoId + \"/hqdefault.jpg\";\r\n      var separator = cleanUrl.indexOf(\"?\") > -1 ? \"&\" : \"?\";\r\n      var format = \"\";\r\n\r\n      if (image.Is360Image) {\r\n        cleanUrl = cleanUrl + separator + \"format=jpg\";\r\n        image.Srcset = cleanUrl + \" \" + breakpoints[breakpointLength - 1].breakpoint;\r\n        image.ThumbnailUrl = image.Srcset;\r\n\r\n        return image;\r\n\r\n      } else {\r\n\r\n        if (!(cleanUrl.indexOf(\"format=\") > -1)) {\r\n          format = \"&format=jpg\";\r\n        }\r\n\r\n        image.ThumbnailUrl = image.VideoType != \"youtube\" ? cleanUrl + separator + \"maxwidth=\" + breakpoints[breakpointLength - 1].width + format + \"&quality=90 \" : cleanUrl;\r\n\r\n        var srcsetUrl = \"\";\r\n        for (var i = 0; i < breakpointLength; i++) {\r\n          if (self.isVimeoVideo(cleanUrl)) {\r\n            cleanUrl = self.getVimeoSourceSetUrl(cleanUrl, breakpoints[i].width);\r\n          }\r\n          if (i + 1 === breakpointLength) {\r\n            srcsetUrl += cleanUrl + separator + \"maxwidth=\" + breakpoints[i].width + format + \"&quality=90 \" + breakpoints[i].breakpoint;\r\n          }\r\n          else {\r\n            srcsetUrl += cleanUrl + separator + \"maxwidth=\" + breakpoints[i].width + format + \"&quality=90 \" + breakpoints[i].breakpoint + \", \";\r\n          }\r\n        }\r\n\r\n        if (image.VideoType !== \"youtube\") {\r\n          image.Srcset = srcsetUrl;\r\n          image.sizes = \"(max-width: 768px) 404px, 966px\";\r\n        } else {\r\n          image.Srcset = image.ThumbnailUrl;\r\n        }\r\n\r\n        return image;\r\n\r\n      }\r\n    }).filter(function (element) {\r\n      return element !== undefined;\r\n    });\r\n\r\n    self.gallery = resizedMediaImages;\r\n\r\n    if (self.gallery.length > 0) {\r\n      var index;\r\n      self.galleryIndex = 0;\r\n      if (self.gallery.length === 0) {\r\n        return;\r\n      }\r\n\r\n      var countComm = 0;\r\n      var countVideo = 0;\r\n      const videoIcon = document.querySelector('[data-video-icon-second]');\r\n      const videoOverlay = document.querySelector('[data-video-icon-first]');\r\n      if (typeof bindEvents === \"undefined\" || !!bindEvents) {\r\n        var galleryMap = self.gallery.map(function (img) {\r\n\r\n          var collection = img.CollectionName;\r\n          var elementPosition = 0;\r\n          if (collection === \"Community\") {\r\n            elementPosition = countComm;\r\n            countComm++;\r\n          } else if (collection === \"Video\") {\r\n            elementPosition = countVideo;\r\n            countVideo++;\r\n          }\r\n\r\n          return {\r\n            id: img.Id,\r\n            url: img.ThumbnailUrl,\r\n            alt: img.AltText,\r\n            Srcset: img.Srcset,\r\n            sizes: img.sizes,\r\n            collection: collection,\r\n            position: elementPosition\r\n          };\r\n        });\r\n        self.detailGallery = new NHS.Scripts.Gallery(document.querySelector(\"#gallery\"), galleryMap);\r\n        self.detailGallery.onChange = function (index) {\r\n          self.galleryIndex = index;\r\n          videoIcon.setAttribute('hidden', '');\r\n          videoOverlay.setAttribute('hidden', '');\r\n          var galleryItem = self.gallery[self.galleryIndex];\r\n          if (galleryItem.CollectionName.toLowerCase() === \"video\") {\r\n            //We must look for the type of video in order to change the title. Currently we have BVT for testimonial at Division Level and VID for Regular community Video.\r\n            var videoTitle = galleryItem.Type !== undefined && galleryItem.Type !== \"\" && galleryItem.Type === \"BVT\" ? self.parameters.TestimonialVideo : self.parameters.CommunityVideo;\r\n            jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(videoTitle);\r\n            videoIcon.removeAttribute('hidden');\r\n            videoOverlay.removeAttribute('hidden');\r\n          } else {\r\n            commTitle = self.gallery[self.galleryIndex].Title !== null ? self.gallery[self.galleryIndex].Title : self.gallery[self.galleryIndex].Description !== null ? self.gallery[self.galleryIndex].Description : \"\";\r\n            jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(commTitle);\r\n            jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Video\").addClass(\"Community\");\r\n          }\r\n          jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileBottom span:eq(1)\").text((self.galleryIndex + 1) + \"/\" + self.gallery.length);\r\n        };\r\n      }\r\n      videoIcon.setAttribute('hidden', '');\r\n      videoOverlay.setAttribute('hidden', '');\r\n      var firstGalleryItem = self.gallery[0];\r\n      if (firstGalleryItem !== null && firstGalleryItem !== undefined && firstGalleryItem.CollectionName.toLowerCase() === \"video\") {\r\n        //We must look for the type of video in order to change the title. Currently we have BVT for testimonial at Division Level and VID for Regular community Video.\r\n        var videoTitle = firstGalleryItem.Type !== undefined && firstGalleryItem.Type !== \"\" && firstGalleryItem.Type === \"BVT\" ? self.parameters.TestimonialVideo : self.parameters.CommunityVideo;\r\n        jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(videoTitle);\r\n        videoIcon.removeAttribute('hidden');\r\n        videoOverlay.removeAttribute('hidden');\r\n        jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Community\").addClass(\"Video\");\r\n      } else {\r\n        commTitle = self.gallery[self.galleryIndex].Title !== null ? self.gallery[self.galleryIndex].Title : self.gallery[self.galleryIndex].Description !== null ? self.gallery[self.galleryIndex].Description : \"\";\r\n        jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(commTitle);\r\n        jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Video\").addClass(\"Community\");\r\n      }\r\n\r\n      jQuery(\".nhs_DetailTileBottom span:eq(1)\").text(\"1/\" + self.gallery.length);\r\n      if (self.gallery.length === 1) {\r\n        jQuery(\"#nhs_GalleryPrev\").remove();\r\n        jQuery(\"#nhs_GalleryNext\").remove();\r\n      }\r\n    }\r\n  },\r\n\r\n  /**\r\n   * Performs a Lazy load on a specific element and it will perform an ajax also.\r\n   * @param {Number} idOfVisibleElement Id of the element that is present and also the one that will be the target to load.\r\n   * @param {Any} dataForAjax Data that will be Stringified to a JSON on the AJAX call.\r\n   * @param {String} urlForAjax Url where the AJAX call will hit.\r\n   * @param {Function} successAjaxFunction Function that will be executed once the AJAX is success.\r\n   */\r\n  performLazyLoad: function (idOfVisibleElement, dataForAjax, urlForAjax, successAjaxFunction) {\r\n    var lazyLoadReady = false;\r\n    jQuery.LazyLoad({\r\n      ElementVisibleId: idOfVisibleElement,\r\n      UpdateAction: function (isVisible) {\r\n        if (isVisible && lazyLoadReady === false) {\r\n          lazyLoadReady = true;\r\n          jQuery.ajax({\r\n            url: urlForAjax,\r\n            type: dataForAjax !== null ? \"POST\" : \"GET\",\r\n            contentType: 'application/json',\r\n            data: JSON.stringify(dataForAjax),\r\n            success: successAjaxFunction\r\n          });\r\n        }\r\n      }\r\n    });\r\n  },\r\n\r\n  setUpControls: function () {\r\n    const homesAndPlansJs = document.querySelector('#nhs_HomesAndPlans');\r\n\r\n    if (homesAndPlansJs) {\r\n      NHS.loadJs(homesAndPlansJs.value, 'homeAndPlans');\r\n    }\r\n\r\n    function backToTop(event) {\r\n      event.preventDefault();\r\n      document.body.scrollIntoView({behavior: \"smooth\"});\r\n    }\r\n\r\n    const topLinks = document.querySelectorAll('a[href=\"#top\"]');\r\n    topLinks.forEach(element => {\r\n      element.addEventListener('click', backToTop);\r\n    });\r\n  },\r\n\r\n  SetupNearbyCommunities: function (parameters) {\r\n    if (this.googlePropertyMap.isMapCreate) {\r\n      this.googlePropertyMap.googleApi.processResult(parameters);\r\n      //this.googlePropertyMap.googleApi.AutoFit();\r\n    } else {\r\n      this.googlePropertyMap.parameters.NearbyComms = parameters;\r\n    }\r\n    this.favs.init();\r\n  },\r\n\r\n  SaveCommunity: function () {\r\n    var self = this;\r\n    var dataForPost = {\r\n      communityId: self.parameters.communityId,\r\n      builderId: self.parameters.builderId\r\n    };\r\n    jQuery.post(self.parameters.addCommunityToPlanerMethod, dataForPost, (function (json) {\r\n      self.ShowSuccessMessage(json);\r\n      if (json.data) {\r\n        jQuery(\"a#nhs_SaveThisItem\").replaceWith('<span id=\"nhs_SaveThisItem\">' + self.parameters.SavedText + \"</span>\");\r\n        //jQuery(\"#pSaveThisItem\").html('<span class=\"nhs_ItemSaved\" id=\"nhs_NextStepsSaveThisItem\">' + self.parameters.SavedToYourProfileText + \"</span>\");\r\n        jQuery(\"p #nhs_NextStepsSaveThisItem\").addClass(\"nhs_ItemSaved\").text(self.parameters.SavedText).removeAttr(\"onclick\").removeAttr(\"href\");\r\n        jQuery(\"#pSaveThisItemMpc\").html(\"<a class='nhs_Saved'><i class='fa fa-heart'></i><strong>\" + self.parameters.SavedToYourProfileText + \"</strong> <br /> Create an account and save your favorite homes, communities and developments</a>\");\r\n        jQuery(\"a#nhs_Saved\").replaceWith(\"<span class='nhs_Save nhs_Saved'>\" + self.parameters.SavedText + \"</span>\");\r\n      }\r\n    }).bind(this), \"json\");\r\n  },\r\n\r\n  ShowSuccessMessage: function (json) {\r\n    var self = this;\r\n    if (!json.data) {\r\n      window.location.href = json.redirectUrl;\r\n    } else {\r\n      if (json.message === self.parameters.saveMessage) {\r\n        //jQuery(\"#nhs_SaveThisItem\").hide();\r\n        jQuery(\"a#nhs_SaveThisItem\").replaceWith(\"<a><span id='nhs_SaveThisItem'></span></a>\");\r\n        jQuery(\"#SuccessMessage\").show();\r\n\r\n      } else {\r\n        jQuery(\"span#nhs_SaveThisItem\").replaceWith(\"<a id='nhs_SaveThisItem'>\" + self.parameters.SaveToFavoritesText + \"</a>\");\r\n        jQuery(\"span.nhs_Save.nhs_Saved\").replaceWith(\"<a id='nhs_Saved' class='nhs_Save'>\" + self.parameters.SaveText + \"</a>\");\r\n        jQuery(\"a#nhs_SaveThisItem, a#nhs_Saved\").on(\"click\", function () {\r\n          self.SaveCommunity();\r\n        });\r\n      }\r\n    }\r\n  },\r\n\r\n  addFreeBrochureSubmitEventAttributes: function (submitButton) {\r\n    window.NewHomeSource.Analytics.GoogleAnalyticsTracker.buildTagWithEvent(submitButton, \"Lead Events\",\r\n      NHS.Scripts.Helper.readCookie(\"CTAName\"),\r\n      \"Submit Form - Free Brochure\");\r\n  },\r\n\r\n  googleAnalyticsBindings: function () {\r\n    NHS.Scripts.Helper.createCookie(\"CTAName\", \"Community – CTA On Page Lead Form\");\r\n    const mainCta = document.querySelector('#nhs_GetBrochure');\r\n    mainCta.addEventListener('click', function() {\r\n      NHS.loadCss(document.getElementById(\"detailsXpRecosCss\").value);\r\n    });\r\n  },\r\n  performanceEventsBindings: function () {\r\n    var self = this;\r\n    const socialLinks = document.querySelectorAll('[data-share-link]');\r\n    socialLinks.forEach(link => {\r\n      window.NewHomeSource.Analytics.TdvTracker.buildTagWithEvent(link,\r\n        'bcSocialShare,'+self.parameters.CommunityDetailSocialMediaShare,\r\n        [\r\n          {\r\n            name: 'data-community',\r\n            value: commDetail.get_commId()\r\n          },\r\n          {\r\n            name: 'data-builder',\r\n            value: commDetail.get_builderId()\r\n          },\r\n          {\r\n            name: 'data-market',\r\n            value: self.parameters.marketId\r\n          },\r\n      ])\r\n    });\r\n  },\r\n\r\n  _updateAdsPosition: function () {\r\n    var container;\r\n    var detailInfo = document.querySelector(\".nhs_DetailMain:not(.nhs_First)\");\r\n    var adCol = document.querySelector(\"#nhs_AdColumn\");\r\n    var salesoffice = document.getElementById(\"nhs_DetailSalesOffice\");\r\n    var homeToolsBuyingSection = document.querySelector(\".nhs_ResToolsSection\");\r\n    var merchandizedSection = document.querySelector(\"#nhs_Merchandized_Reviews\");\r\n    var merchandizedSectionHeigth = 0;\r\n    var homeToolsBuyingSectionHeight = 0;\r\n    var salesOfficeHeight = 0;\r\n    var heightToMinus = 0;\r\n\r\n    if (salesoffice) {\r\n      salesOfficeHeight = salesoffice.getBoundingClientRect().height;\r\n    }\r\n    if (homeToolsBuyingSection) {\r\n      homeToolsBuyingSectionHeight = homeToolsBuyingSection.getBoundingClientRect().height;\r\n    }\r\n    if (merchandizedSection) {\r\n      merchandizedSectionHeigth = merchandizedSection.getBoundingClientRect().height;\r\n    }\r\n\r\n    heightToMinus = salesOfficeHeight + homeToolsBuyingSectionHeight + merchandizedSectionHeigth;\r\n\r\n    if (adCol) {\r\n      container = adCol.querySelector(\"div\");\r\n    }\r\n    if (!detailInfo || !adCol || !container || typeof window.MutationObserver === \"undefined\") return;\r\n\r\n    container.setAttribute(\"style\", \"position: -webkit-sticky; position: sticky; top: 0; right: 0;\");\r\n\r\n    // The Height of the nhs_ResAdCol will change according to the height of the results\r\n    // and the function above will be executed anytime the results change\r\n  },\r\n};\r\n\r\n/*Show floating form when is collapse*/\r\nvar takeATourFloatingButton = document.querySelector(\"[data-take-tour]\");\r\nvar floatingFormContainerHide = \" \";\r\nif (takeATourFloatingButton) {\r\n  takeATourFloatingButton.addEventListener(\"click\", function () {\r\n    floatingFormContainerHide = document.querySelector(\"[data-floating-form-container]\");\r\n    if (floatingFormContainerHide) {\r\n      floatingFormContainerHide.classList.remove(\"minimize\");\r\n    }\r\n  });\r\n}\r\n\r\n/*Clean commentFloatingform when user request a In Person lead*/\r\nvar inPersonRequestLabel = document.querySelector(\"[data-text-in-person]\");\r\nif (inPersonRequestLabel) {\r\n  inPersonRequestLabel.addEventListener(\"click\",\r\n    function () {\r\n      var commentsInput = document.querySelector(\"#Comments_2\");\r\n      if (commentsInput)\r\n        commentsInput.value = \"\";\r\n    });\r\n}\r\n\r\nvar commentInput = document.querySelector(\"#Comments_2\");\r\nif (commentInput) {\r\n  var VirtualTourRequestLabel = document.querySelector(\"[data-is-virtual-tour]\");\r\n  if (VirtualTourRequestLabel) {\r\n    VirtualTourRequestLabel.addEventListener(\"click\",\r\n      function () {\r\n        var commentsInput = document.querySelector(\"#Comments_2\");\r\n        if (commentsInput)\r\n          commentsInput.value = commentInput.value;\r\n      });\r\n  }\r\n}\r\n\r\ndocument.addEventListener(\"readystatechange\", function () {\r\n  if (document.readyState === \"complete\") {\r\n    if (window.NewHomeSource.ElementToggler) {\r\n      window.NewHomeSource.ElementToggler.Init();\r\n    }\r\n\r\n    if (window.NewHomeSource.CommunityAndNeighBorhoodHandler) {\r\n      window.NewHomeSource.CommunityAndNeighBorhoodHandler.init();\r\n    }\r\n\r\n    if (window.NewHomeSource.InitialLoadModalHandler) {\r\n      window.NewHomeSource.InitialLoadModalHandler.DisplayModal();\r\n    }\r\n  }\r\n});\r\n\r\n/*\r\n * When clicking in the header links that navigate to the different available homes tabs\r\n * we need to make sure the user sees the correct tab, we get this done by adding the data-available-homes\r\n * attribute to the header link with the value being the element ID of the correct tab in the \r\n * available homes section.\r\n*/\r\n(function () {\r\n  document.addEventListener('click', function (event) {\r\n    if (event.target.hasAttribute('data-available-homes')) {\r\n      const targetElementId = event.target.getAttribute('data-available-homes');\r\n      const targetElement = document.getElementById(targetElementId);\r\n\r\n      if (targetElement) {\r\n        targetElement.click();\r\n      } else {\r\n        const alernateTargetElementId = event.target.getAttribute('data-available-homes-alternate');\r\n        const alternateTargetElement = document.getElementById(alernateTargetElementId);\r\n\r\n        if (alternateTargetElement) {\r\n          alternateTargetElement.click();\r\n        }\r\n      }\r\n    }\r\n  })\r\n}());\r\n\r\n/*\r\n * When clicking in the price reduction label on the top of the page, that action should take the\r\n * user to the homes and plans section. We can't do this via an anchor targeting an #id in the page\r\n * since we have a base tag pointing to the homepage (not the detail page itself), so creating an\r\n * anchor tag with href=\"#id\" will take you to the homepage and look for the #id there.\r\n*/\r\n(function () {\r\n  const priceReductionLabel = document.getElementById('nhs_priceReductionLabel');\r\n  const trustBuilderReviewsSection = document.querySelector('[data-detail-reviews-section]');\r\n\r\n  const homesAndPlansSection = document.getElementById('HomesAndPlans');\r\n  const builderSection = document.getElementById('builderInfoSection');\r\n\r\n  if (priceReductionLabel && homesAndPlansSection) {\r\n    priceReductionLabel.addEventListener('click', function () {\r\n      homesAndPlansSection.scrollIntoView();\r\n    });\r\n  }\r\n\r\n  if (trustBuilderReviewsSection && builderSection) {\r\n    trustBuilderReviewsSection.addEventListener('click', function (event) {\r\n       event.preventDefault();\r\n       builderSection.scrollIntoView();\r\n    });\r\n  }\r\n}());","var formObserver;\r\nvar isCustomLocation = document.getElementById(\"IsCustomLocation\");\r\nvar isBasic = document.getElementById(\"IsBasic\");\r\nisBasic = isBasic && isBasic.value === \"True\";\r\nisCustomLocation = isCustomLocation && isCustomLocation.value === \"True\";\r\nvar isComingSoon = document.querySelector(\"[data-is-coming-soon]\")\r\n  ? document.querySelector(\"[data-is-coming-soon]\").value === \"True\"\r\n  : false;\r\n\r\nfunction formValuesToQueryString(data) {\r\n  var queryString = \"\";\r\n  var keyValuePair = Object.entries(data);\r\n  if (keyValuePair && keyValuePair.length > 0) {\r\n    for (var i = 0; i < keyValuePair.length; i++) {\r\n      if (typeof keyValuePair[i][1] !== \"undefined\") {\r\n        queryString += keyValuePair[i][0] + \"=\" + keyValuePair[i][1] + \"&\";\r\n      }\r\n    }\r\n  }\r\n  queryString = queryString.substring(0, queryString.length - 1);\r\n\r\n  return queryString;\r\n};\r\n\r\nfunction showThankYouPageForExternalLeads(event) {\r\n  var data = getFreeBrochureData(event);\r\n  var url = \"/getthankyoupageafterexternallead?\" + formValuesToQueryString(data);\r\n  window.NewHomeSource.ModalLoader.showModal(url);\r\n}\r\n\r\nfunction onChangeToggleZipInput(checkboxElem) {\r\n  var form = checkboxElem.closest(\"form\");\r\n  var zipInput = form.querySelector(\"[name='postal']\");\r\n\r\n  if (checkboxElem.checked) {\r\n    zipInput.disabled = true;\r\n    zipInput.value = \"\";\r\n  } else {\r\n    zipInput.disabled = false;\r\n  }\r\n}\r\n\r\n/**\r\n * Opens the custom scheduler, if the community is part of the scheduler program.\r\n * @param {HTMLElement} element The element triggering the form sending.\r\n */\r\nfunction openScheduler(element) {\r\n  const isCustomScheduler = element.dataset.component === 'lead-by-iframe';\r\n\r\n  if (isCustomScheduler && window.NewHomeSource.SchedulerHandler) {\r\n    window.NewHomeSource.SchedulerHandler.openSchedulerTab(element);\r\n  }\r\n}\r\n\r\nfunction onClickSendForm(event, callback) {\r\n  event.preventDefault();\r\n  NHS.loadCss(document.getElementById(\"detailsXpRecosCss\").value);\r\n\r\n  var currentForm = event.target.closest(\"form\");\r\n  var sendButton = currentForm.querySelector(\"[data-send-form]\");\r\n\r\n  var valid = formValidator.validateForm(currentForm, true);\r\n\r\n  if (valid) {\r\n    sendButton.setAttribute(\"disabled\", \"disabled\");\r\n\r\n    if (isCustomLocation) {\r\n      sendAskQuestionLead(event, callback);\r\n    } else if (!isBasic){\r\n      openScheduler(event.target);\r\n      sendFreeBrochureLead(event, event.target, callback);\r\n    }\r\n  }\r\n}\r\n\r\nfunction addDataInComment(formElem) {\r\n  const commentElem = formElem.querySelector(\"textarea\")\r\n  let comment = commentElem ? commentElem.value : '';\r\n  var isOnPageForm = formElem.getAttribute(\"data-onpage-form\") === \"\";\r\n  const isRegularLeadForm = formElem.getAttribute('data-regular-lead-form') === '';\r\n  const isAskQuestionForm = formElem.getAttribute('data-is-ask-question-form') === '';\r\n  var isFullImageViewer = formElem.parentElement.getAttribute(\"data-panel-form-type\") === \"scheduleTour\";\r\n  var commentData = \"\";\r\n\r\n  if (isAskQuestionForm ||\r\n    (isFullImageViewer && isComingSoon)) {\r\n    return comment;\r\n  }\r\n\r\n  if (isOnPageForm) {\r\n    commentData = getOnPageFormCommentData(formElem);\r\n  } else if (isRegularLeadForm || isFullImageViewer) {\r\n    commentData = getTourFormCommentData(formElem);\r\n  }\r\n\r\n  // if there is a users comment, appends the commentData at the end\r\n  if (commentData !== \"\") {\r\n    comment += comment === \"\"\r\n      ? commentData\r\n      : \" - \" + commentData;\r\n  }\r\n\r\n  return comment;\r\n}\r\n\r\nfunction getLeadAction(formTriggeredElement) {\r\n  const isOnPageForm = formTriggeredElement.hasAttribute(\"data-onpage-form\");\r\n  let leadActionType = isOnPageForm ? \" \" : null;\r\n  const isFullImageContactBuilder = formTriggeredElement.parentElement.getAttribute('data-panel-form-type') === 'contactBuilder';\r\n  const isAskQuestion = formTriggeredElement.hasAttribute(\"data-is-ask-question-form\");\r\n\r\n  if (isFullImageContactBuilder || isAskQuestion) {\r\n    return leadActionType;\r\n  }\r\n\r\n  if (!isOnPageForm) {\r\n    const virtualTourElement = formTriggeredElement.querySelector(\"[data-is-virtual-tour]\");\r\n\r\n    if (virtualTourElement) {\r\n      leadActionType = formTriggeredElement.querySelector(\"[data-is-virtual-tour]\").checked ? \"rva\" : \"ra\";\r\n    }\r\n    else {\r\n      leadActionType = \"ra\";\r\n    }\r\n  }\r\n  \r\n  return leadActionType;\r\n}\r\n\r\n/**\r\n * Gets the additional information that should be included in the comment field for the on page form.\r\n * @param {element} formElem The floating form element.\r\n * @returns The information that should be appended to the comment field.\r\n */\r\nfunction getOnPageFormCommentData(formElem) {\r\n  var formOptions = formElem.querySelectorAll(\"[name='form-options']:checked\");\r\n  var formText = \"\";\r\n\r\n  for (var i = 0; i < formOptions.length; ++i) {\r\n    var currentOption = formOptions[i];\r\n    formText += formText === \"\"\r\n      ? currentOption.getAttribute(\"data-comment\") + \",\"\r\n      : \" \" + currentOption.getAttribute(\"data-comment\") + \",\";\r\n  }\r\n\r\n  if (formText !== \"\") {\r\n    formText = \"Interested in: \" + formText.slice(0, -1) + \".\";\r\n  }\r\n\r\n  return formText;\r\n}\r\n\r\n\r\n/**\r\n * Get the data that should be appended to the comment field of the 'tour' forms.\r\n * This logic applies for the floating form tour form and the tour form in next steps section.\r\n * @param {any} formElement The form to handle.\r\n * @returns A string indicating if date and if the lead is a virtual tour or a 1 on 1 meeting.\r\n */\r\nfunction getTourFormCommentData(formElement) {\r\n  const virtualTourElement = formElement.querySelector(\"[data-is-virtual-tour]\");\r\n  const isVirtualTour = !!virtualTourElement && virtualTourElement.checked;\r\n  let selectedDateElement = formElement.querySelector(\"[data-date]\");\r\n  let finalDate = '';\r\n\r\n  if (selectedDateElement) {\r\n    const selectedDate = selectedDateElement.getAttribute(\"data-date\");\r\n    finalDate = selectedDate.replace(/[^ -~]/g, '');\r\n  }\r\n  else {\r\n    return '';\r\n  }\r\n\r\n  if (isVirtualTour) {\r\n    return formElement.querySelector(\"[data-text-video-chat]\").value + \" \" + finalDate;\r\n  } else {\r\n    return formElement.querySelector(\"[data-text-in-person]\").value + \" \" + finalDate;\r\n  }\r\n}\r\n\r\n/**\r\n * Gets the preferred method of contact selected in the form <select>, if any\r\n * @param {any} form Form element\r\n * @returns {string} The value of the selected dropdown, empty if the <select> doesn't exists.\r\n */\r\nfunction getPreferredContactMethod(form) {\r\n  const contactMethodInput = form.querySelector('[data-contact-method]');\r\n  const selectedOption = contactMethodInput\r\n    ? contactMethodInput.options[contactMethodInput.selectedIndex].value\r\n    : '';\r\n\r\n  return selectedOption;\r\n}\r\n\r\n/**\r\n * Gets the realtor question answer selected in the form <select>, if any\r\n * @param {any} form Form element\r\n * @returns {string} The value of the selected dropdown, empty if the <select> doesn't exists.\r\n */\r\nfunction getRealtorQuestionAnswerId(form) {\r\n  const realtorAnswerInput = form.querySelector('[data-realtor-answer]');\r\n  const selectedOption = realtorAnswerInput\r\n    ? realtorAnswerInput.options[realtorAnswerInput.selectedIndex].value\r\n    : '';\r\n\r\n  return selectedOption;\r\n}\r\n\r\n/**\r\n * Gets the preferred builder selected from the 'Preferred Builder' <select>, if any\r\n * @param {any} form The form element\r\n * @returns {string} The value of the selected builder, empty if the <select> doesn't exists\r\n * or nothing was selected.\r\n */\r\nfunction getPreferredBuilder(form) {\r\n  const preferredBuilderElem = form.querySelector('[data-preferred-builder]');\r\n  const selectedBuilder = preferredBuilderElem\r\n    ? preferredBuilderElem.options[preferredBuilderElem.selectedIndex].value\r\n    : '';\r\n\r\n  return selectedBuilder;\r\n}\r\n\r\nfunction getValidatedMpcId(mpcId) {\r\n  return window.NewHomeSource.MpcEventsHelper.isVisitedMpc(mpcId)\r\n    ? mpcId\r\n    : 0;\r\n}\r\n\r\nfunction getFreeBrochureData(event, triggerElement) {\r\n  var thisForm = event.target.classList.contains(\"getBrochureMinBtn\")\r\n    ? document.querySelector(\".nhs_LeadForm\")\r\n    : event.target.closest(\"form\");\r\n  var formParent = jQuery(thisForm);\r\n  var phoneField = thisForm.querySelector(\"[name='phone']\");\r\n  var dateSelected = thisForm.querySelector(\"[data-date]\");\r\n  var userPhone;\r\n\r\n  if (phoneField) {\r\n    userPhone = phoneField.length === 0\r\n      ? \"\"\r\n      : phoneField.value;\r\n  }\r\n\r\n  var parameters = JSON.parse(thisForm.querySelector(\"[data-form-parameters]\").innerHTML);\r\n  var includeSimilarCheckbox = thisForm.querySelector(\"[data-include-similar]\");\r\n  const isLimitedAvailability = !!document.querySelector('[data-limited-availability-banner]');\r\n  const leadEvents = window.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n  const sendFormButton = thisForm.querySelector('[data-send-form]');\r\n\r\n  var data = {\r\n    ...leadEvents,\r\n    // input fields\r\n    Comments: addDataInComment(thisForm),\r\n    Date: dateSelected ? dateSelected.getAttribute(\"data-date\") : undefined,\r\n    PreferredBuilder: getPreferredBuilder(thisForm),\r\n    PreferredContactDetail: '',\r\n    PreferredContactMethod: getPreferredContactMethod(thisForm),\r\n    RealtorQuestionAnswerId: getRealtorQuestionAnswerId(thisForm),\r\n    LiveOutside: thisForm.querySelector(\"[name='live-outside']\").checked,\r\n    MailAddress: thisForm.querySelector(\"[name='email']\").value,\r\n    Name: thisForm.querySelector(\"[name='name']\").value,\r\n    UserPhoneNumber: userPhone,\r\n    UserPostalCode: thisForm.querySelector(\"[name='postal']\").value,\r\n    ZipCode: thisForm.querySelector(\"[name='postal']\").value,\r\n    // form parameters\r\n    BuilderId: parameters.BuilderId,\r\n    BuilderName: parameters.BrandName || parameters.BuilderName,\r\n    CommunityId: parameters.CommunityId,\r\n    CreditScoreText: parameters.CreditScoreText,\r\n    IsAskQuestion: parameters.IsAskQuestion || thisForm.parentElement.getAttribute(\"data-panel-form-type\") === 'contactBuilder',\r\n    IgnoreComingSoonValidation: document.getElementById(\"IgnoreComingSoonValidation\")\r\n      ? document.getElementById(\"IgnoreComingSoonValidation\").value === \"True\"\r\n      : false,\r\n    IsAddMeToInterestList: thisForm.querySelector(\"#IsAddMeToInterestList\") ? thisForm.querySelector(\"#IsAddMeToInterestList\").value : false,\r\n    IsBuilderShowcase: false,\r\n    IsComingSoon : parameters.IsComingSoon,\r\n    IsComunityDetailV2: true,\r\n    IsModalToSendEmail: thisForm.hasAttribute(\"data-onpage-form\") !== true,\r\n    IsGalleryXp: parameters.IsGalleryXp === \"True\",\r\n    IsFullImageViewerLead: thisForm.parentElement.getAttribute(\"data-panel-form\") !== null,\r\n    IsLimitedAvailability: isLimitedAvailability,\r\n    LeadAction: parameters.LeadAction || getLeadAction(thisForm),\r\n    UseNewCommentFormat: true,\r\n    IsMPCommunity: parameters.IsMPCommunity,\r\n    IsPageCommDetail: parameters.IsPageCommDetail,\r\n    IsPlan: parameters.IsPlan,\r\n    MarketId: parameters.MarketId,\r\n    NewSearchRCC: parameters.NewSearchRCC,\r\n    NewUser: parameters.NewUser,\r\n    ParentCommunityId: getValidatedMpcId(parameters.ParentCommunityId),\r\n    PartnerUsesMatchmaker: parameters.PartnerUsesMatchmaker,\r\n    PlanId: parameters.PlanId,\r\n    SendAlerts: includeSimilarCheckbox &&\r\n      includeSimilarCheckbox.checked,\r\n    HasUserOptedIntoRecommendationEmail: includeSimilarCheckbox\r\n      ? includeSimilarCheckbox.checked\r\n      : null,\r\n    ShowCreditScoreSection: parameters.ShowCreditScoreSection,\r\n    ShowSaveToAccount: parameters.ShowSaveToAccount,\r\n    ShowUserPhoneNumber: formParent.find(\"#nhs_ShowPhoneNumber\").is(':visible'),\r\n    SpecId: parameters.SpecId,\r\n    IsOnPageForm: thisForm.hasAttribute(\"data-onpage-form\"),\r\n    GenerateLeadFrom: parameters.GenerateLeadFrom,\r\n    FromPage: parameters.FromPage,\r\n    ButtonNameSource: sendFormButton.getAttribute(\"data-ga4-identity-button_name\") || undefined,\r\n  };\r\n\r\n  return data;\r\n}\r\n\r\nfunction getAskQuestionData(event) {\r\n  var thisForm = event.target.closest('form');\r\n  const isLimitedAvailability = !!document.querySelector('[data-limited-availability-banner]');\r\n  var parameters = JSON.parse(thisForm.querySelector(\"[data-form-parameters]\").innerHTML);\r\n  const leadEvents = window.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n\r\n  var data = {\r\n    // input fields\r\n    Comments: thisForm.querySelector(\"textarea\").value,\r\n    Email: thisForm.querySelector(\"[name='email']\").value,\r\n    MailAddress: thisForm.querySelector(\"[name='email']\").value,\r\n    LivesOutside: thisForm.querySelector(\"[name='live-outside']\").checked,\r\n    Name: thisForm.querySelector(\"[name='name']\").value,\r\n    Phone: thisForm.querySelector('[name=phone i]').value,\r\n    UserPhoneNumber: thisForm.querySelector('[name=phone i]').value,\r\n    PreferredBuilder: getPreferredBuilder(thisForm),\r\n    RealtorQuestionAnswerId: getRealtorQuestionAnswerId(thisForm),\r\n    Postal: thisForm.querySelector(\"[name='postal']\").value,\r\n    ZipCode: thisForm.querySelector(\"[name='postal']\").value,\r\n    // form parameters\r\n    AppointmentDateTime: \"\",\r\n    BuilderId: parameters.BuilderId,\r\n    BuilderList: \"\",\r\n    BuilderName: parameters.BuilderName,\r\n    CommunityId: parameters.CommunityId,\r\n    CommunityList: parameters.CommunityId,\r\n    FromPage: parameters.FromPage,\r\n    IsAddMeToInterestList: false,\r\n    IsAppointment: false,\r\n    IsAskQuestion: true,\r\n    IsBuilderShowcase: false,\r\n    IsCustomLocation: isCustomLocation,\r\n    IsGalleryXp: parameters.IsGalleryXp === \"True\",\r\n    IsFullImageViewerLead: thisForm.parentElement.getAttribute(\"data-panel-form\") !== null,\r\n    IsLimitedAvailability: isLimitedAvailability,\r\n    IsMPCommunity: parameters.IsMPCommunity === \"True\",\r\n    IsPageCommDetail: document.getElementById(\"LeadType\").value === \"com\",\r\n    IsPlan: parameters.IsPlan === \"true\",\r\n    LeadAction: parameters.LeadAction,\r\n    LeadFormType: \"\",\r\n    LeadType: document.getElementById(\"LeadType\").value,\r\n    MarketId: parameters.MarketId,\r\n    ParentCommunityId: getValidatedMpcId(parameters.ParentCommunityId),\r\n    PlanId: parameters.PlanId,\r\n    PlanList: \"\",\r\n    RequestedFromGallery: false,\r\n    ShowCalendar: false,\r\n    ShowSaveToAccount: parameters.ShowSaveToAccount,\r\n    SpecId: parameters.SpecId,\r\n    SpecList: \"\",\r\n    IsOnPageForm: thisForm.hasAttribute(\"data-onpage-form\"),\r\n    ...leadEvents\r\n  }\r\n\r\n  return data;\r\n}\r\n\r\n/**\r\n  * throw the event to persona.js\r\n  * @param {object} element Dom element with the data attributes required\r\n*/\r\nfunction sendSegmentEventFavorites(element) {\r\n  if (!element || !window.NewHomeSource.UserCredentials) {\r\n    return;\r\n  }\r\n  // if user is logged and if is free brochure, send the segment event\r\n  const userSession = window.NewHomeSource.UserCredentials.isUserLogged() || false;\r\n\r\n  if (userSession) {\r\n    document.body.dispatchEvent &&\r\n      document.body.dispatchEvent(new CustomEvent(\"trackIdentifySaveItems\", {\r\n        detail: { data: element }\r\n      }));\r\n  }\r\n}\r\n\r\n/**\r\n* trackRealtorQuestionAnswerEvent: Tracks the sorted event for the realtor dropdown.\r\n*/\r\nfunction getRealtorQuestionAnswerText(event) {\r\n  const form = event.target.classList.contains(\"getBrochureMinBtn\")\r\n    ? document.querySelector(\".nhs_LeadForm\")\r\n    : event.target.closest(\"form\");\r\n  const realtorSelect = form.querySelector('[name=\"realtorquestion\"]');\r\n  let realtorQuestionAnswerText = '';\r\n  if (realtorSelect && realtorSelect.selectedIndex > 0) {\r\n    realtorQuestionAnswerText = realtorSelect.options[realtorSelect.selectedIndex].text;\r\n  }\r\n  return realtorQuestionAnswerText;\r\n}\r\n\r\nfunction sendFreeBrochureLead(event, formTriggeredElement, callback) {\r\n \r\n  const data = getFreeBrochureData(event, formTriggeredElement);\r\n\r\n  let requestUrl = document.getElementById(\"LeadUrl\").value;\r\n  let leadButtonClickedText = event.target.dataset.segmentButton_action;\r\n  const isSchedulerParticipant = event.target.dataset.component === 'lead-by-iframe';\r\n  const element = event.currentTarget;\r\n  const onPageForm = formTriggeredElement.closest('[data-onpage-form]');\r\n\r\n  jQuery.ajax(requestUrl, {\r\n    method: 'GET',\r\n    data: data,\r\n    success: function (response) {\r\n      if (typeof callback === 'function') {\r\n        callback(data);\r\n      }\r\n\r\n      const container = document.querySelector('[data-trackers-container]');\r\n\r\n      if (container) {\r\n        const fragment = document.createRange().createContextualFragment(response);\r\n        container.innerHTML = '';\r\n        container.append(fragment);\r\n        container.style.display = 'none';\r\n      }\r\n\r\n\r\n      if(onPageForm) {\r\n        // hide the onpage brochure form to prevent duplicated leads for the same community.\r\n        onPageForm.setAttribute('hidden', 'true');\r\n      }\r\n    }\r\n  })\r\n\r\n  cleanOpenFormButtons();\r\n  const eventForSegment = {\r\n    event: 'Lead Modal Form Submitted',\r\n    eventType: 'segmentEvent',\r\n    date: data.Date,\r\n    tour_type: isSchedulerParticipant ? 'builder scheduled' : data.LeadAction,\r\n    button_action: leadButtonClickedText,\r\n    preferred_contact_method: data.PreferredContactMethod,\r\n    realtor_question: getRealtorQuestionAnswerText(event),\r\n  };\r\n\r\n  if (onPageForm) {\r\n    const activeTopicCheckedBoxes = formTriggeredElement.form\r\n      ? Array.from(formTriggeredElement.form.querySelectorAll('[data-segment-topic]:checked'))\r\n      : [];\r\n    const topicList = activeTopicCheckedBoxes.map(checkboxElement => checkboxElement.dataset.comment);\r\n    eventForSegment.lead_form_topics = topicList.join(', ');\r\n    eventForSegment.event = 'On Page Lead Form Submitted';\r\n    delete eventForSegment.tour_type;\r\n  }\r\n\r\n  document.body.dispatchEvent &&\r\n    document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n      detail: { data: eventForSegment }\r\n    }));\r\n\r\n  sendSegmentEventFavorites(element);\r\n    \r\n  // emit a new event with the response from the server.\r\n  document.dispatchEvent(new CustomEvent(\"openRecommendedModal\", {\r\n    detail: { data: data }\r\n  }));\r\n\r\n  // check if the form exists, then focus it to have something to \r\n  // return the focus back into.\r\n  if(formTriggeredElement && formTriggeredElement.form){\r\n    formTriggeredElement.form.focus();\r\n  }\r\n\r\n  const formData = {\r\n    name: data.Name,\r\n    emailAddress: data.MailAddress,\r\n    phoneNumber: data.UserPhoneNumber,\r\n    postalCode: data.UserPostalCode,\r\n    livesOutside: data.LiveOutside,\r\n    preferredContactMethod: data.PreferredContactMethod,\r\n    realtorQuestionAnswer: data.RealtorQuestionAnswerId\r\n  };\r\n  fillInputsOnPageForm(formData);\r\n}\r\n\r\nfunction cleanOpenFormButtons() {\r\n  if (window.NewHomeSource.ModalLoader) {\r\n    window.NewHomeSource.ModalLoader.resetIsModalLoadedFlag();\r\n  }\r\n}\r\n\r\nfunction sendAskQuestionLead(event, callback) {\r\n  var data = getAskQuestionData(event);\r\n  var leadButtonClickedText = event.target.dataset.segmentButton_action;\r\n  const target = event.target;\r\n  const onPageForm = target.closest('[data-onpage-form]');\r\n\r\n  jQuery.ajax({\r\n    type: \"GET\",\r\n    url: document.getElementById(\"LeadUrl\").value,\r\n    data: data,\r\n    dataType: \"html\",\r\n    success: function (response) {\r\n      cleanOpenFormButtons();\r\n      const eventForSegment = {\r\n        event: 'Lead Modal Form Submitted',\r\n        date: data.Date,\r\n        eventType: 'segmentEvent',\r\n        button_action: leadButtonClickedText,\r\n        realtor_question: getRealtorQuestionAnswerText(event),\r\n      };\r\n\r\n      document.body.dispatchEvent &&\r\n        document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n          detail: { data: eventForSegment }\r\n        }));\r\n\r\n      sendSegmentEventFavorites(event.target);\r\n\r\n      // emit a new event with the response from the server.\r\n      document.dispatchEvent(new CustomEvent(\"openRecommendedModal\", {\r\n        detail: { data: data }\r\n      }));\r\n\r\n      if (typeof callback === 'function') {\r\n        callback();\r\n      }\r\n\r\n      if(onPageForm) {\r\n        // hide the onpage brochure form to prevent duplicated leads for the same community.\r\n        onPageForm.setAttribute('hidden', 'true');\r\n      }\r\n    },\r\n    error: function (error) {\r\n      console.log(error);\r\n    }\r\n  });\r\n\r\n  const formData = {\r\n    name: data.Name,\r\n    emailAddress: data.Email,\r\n    phoneNumber: data.Phone,\r\n    postalCode: data.Postal,\r\n    livesOutside: data.LivesOutside,\r\n    realtorQuestionAnswer: data.RealtorQuestionAnswerId\r\n  }; \r\n  fillInputsOnPageForm(formData);\r\n}\r\n\r\nfunction fillInputsOnPageForm(formData) {\r\n  document.body.dispatchEvent(new CustomEvent('onLeadPosted', {\r\n    detail: formData\r\n  }));\r\n}\r\n\r\n/**\r\n * Toggles the required attribute from the phone input when the preferred contact method is Phone or Text Message.\r\n * @param {object} event The event object after changing the preferred contact method dropdown.\r\n */\r\nfunction onChangeContactMethod(event) {\r\n  var selectedOption = event.target.options ? event.target.options[event.target.selectedIndex] : event.target;\r\n  var selectedValue = selectedOption.value;\r\n  var form = event.target.closest(\"form\");\r\n  var selectedOptions = form.querySelectorAll(\"#nhs-contact-method option:checked\");\r\n  var phoneInput = form.querySelector(\"[name='phone']\");\r\n\r\n  for (var i = 0; i < selectedOptions.length; i++) {\r\n    selectedOptions[i].removeAttribute(\"selected\");\r\n    selectedOptions[i].removeAttribute(\"data-segment-identity-data\");\r\n  }\r\n\r\n  selectedOption.setAttribute(\"selected\", \"\");\r\n  selectedOption.setAttribute(\"data-segment-event-preferred_contact_method\", selectedValue);\r\n\r\n  if ((selectedValue === \"Phone\" || selectedValue === \"Text Message\") &&\r\n    !phoneInput.hasAttribute(\"required\")) {\r\n    phoneInput.setAttribute(\"required\", \"\");\r\n    phoneInput.placeholder = phoneInput.placeholder.replace(\" (Optional)\", \"*\");\r\n    phoneInput.focus();\r\n  }\r\n  else if ((selectedValue !== \"Phone\" && selectedValue !== \"Text Message\") &&\r\n    phoneInput.hasAttribute(\"required\")) {\r\n    phoneInput.removeAttribute(\"required\");\r\n    phoneInput.placeholder = phoneInput.placeholder.replace(\"*\", \" (Optional)\");\r\n  }\r\n}\r\n\r\nfunction onChangeRealtorAnswer(event) {\r\n  let selectedOption = event.target.options ? event.target.options[event.target.selectedIndex] : event.target;\r\n  if (event.target.options) {\r\n    for (let element of event.target.options) {\r\n      element.removeAttribute(\"selected\");\r\n    }  \r\n  }\r\n\r\n  selectedOption.setAttribute(\"selected\", \"\");\r\n}\r\n\r\n/**\r\n * Sets the events for the tabs in the form.\r\n */\r\nfunction setupFormTabsEvents() {\r\n  var selfGuidedTab = document.querySelectorAll(\"[data-nextStepModal] [data-selfGuidedTab]\");\r\n  var nonSelfGuidedTabs = document.querySelectorAll(\"[data-nextStepModal] [data-text-in-person], [data-nextStepModal] [data-is-virtual-tour]\");\r\n\r\n  if (nonSelfGuidedTabs) {\r\n    for (var i = 0; i < nonSelfGuidedTabs.length; i++) {\r\n      nonSelfGuidedTabs[i].addEventListener(\"click\", function () {\r\n        selfGuidedTourTabHandler(false, this.closest(\"[data-nextStepModal]\"));\r\n      });\r\n    }\r\n  }\r\n\r\n  if (selfGuidedTab) {\r\n    for (var i = 0; i < selfGuidedTab.length; i++) {\r\n      selfGuidedTab[i].addEventListener(\"click\", function () {\r\n        selfGuidedTourTabHandler(true, this.closest(\"[data-nextStepModal]\"));\r\n      });\r\n\r\n      if (selfGuidedTab[i].checked) {\r\n        selfGuidedTourTabHandler(true, selfGuidedTab[i].closest(\"[data-nextStepModal]\"));\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Sets the events for the form.\r\n * @param {HTMLElement} form The form element.\r\n */\r\nfunction setupLeadForms(form) {\r\n  const phoneInput = form.querySelector('[name=\"phone\"], [data-phone-input]');\r\n  VMasker(phoneInput).maskPattern('(999) 999-9999');\r\n\r\n  var internationalCheckbox = form.querySelector(\"[name=live-outside]\");\r\n\r\n  if (internationalCheckbox) {\r\n    internationalCheckbox.onchange = onChangeToggleZipInput.bind(this, internationalCheckbox);\r\n  }\r\n\r\n  var sendFormButton = form.querySelector(\"[data-send-form]\");\r\n  \r\n  if(sendFormButton) {\r\n    sendFormButton.onclick = onClickSendForm;\r\n  }\r\n\r\n  var methodOfContactInput = form.querySelector(\"[data-contact-method]\");\r\n  let realtorQuestionAnswerInput = form.querySelector(\"[data-realtor-answer]\");\r\n\r\n  if (methodOfContactInput) {\r\n    methodOfContactInput.addEventListener(\"change\", function (event) {\r\n      onChangeContactMethod(event);\r\n    });\r\n  }\r\n\r\n  if (realtorQuestionAnswerInput) {\r\n    realtorQuestionAnswerInput.addEventListener(\"change\", function (event) {\r\n      onChangeRealtorAnswer(event);\r\n    });\r\n  }\r\n\r\n  setupFormTabsEvents();\r\n}\r\n\r\nfunction changeLeadAction(container){\r\n  const radioOptions = container.querySelectorAll('input[type=\"radio\"][name=\"radio-appointment\"]');\r\n  const target = Array.from(radioOptions).find(option => option.checked);\r\n\r\n  const thisForm = target.classList.contains(\"getBrochureMinBtn\")\r\n    ? document.querySelector(\".nhs_LeadForm\")\r\n    : target.closest(\"form\");\r\n\r\n  if (thisForm) {\r\n    const parametersElement = thisForm.querySelector(\"[data-form-parameters]\")\r\n    const parameters = JSON.parse(parametersElement.innerHTML);\r\n\r\n    parameters.LeadAction = target.dataset.leadAction;\r\n    parametersElement.innerHTML = JSON.stringify(parameters);\r\n  }\r\n}\r\n\r\nfunction initDatepickerGallery() {\r\n  var phoneElement = document.getElementById(\"TrackingPhoneNumber\");\r\n  if (phoneElement) {\r\n    var alertText = document.querySelector(\"[data-alert-not-available]\").innerText;\r\n    var container = document.getElementById(\"ui-datepicker-div\");\r\n    var datePicker = new Datepicker({\r\n      queryElement: \".ui-datepicker-today\",\r\n      alertText: alertText\r\n    });\r\n    container.addEventListener(\"click\", function () {\r\n      datePicker.attachEventsToNotAvailableDay();\r\n    });\r\n    datePicker.attachEventsToNotAvailableDay();\r\n  }\r\n}\r\n\r\nvar tourInPersonVideoHandler = function (event) {\r\n  selfGuidedTourTabHandler(false, document.querySelector(\"[data-sales-office-section]\"));\r\n};\r\n\r\nvar createNewSlider = function(container) {\r\n  var containerDatePicker = container.querySelector(\"[data-nextStepModal] [data-slider-component]\");\r\n  if (!containerDatePicker) {\r\n    return;\r\n  }\r\n\r\n  let monthSlider = containerDatePicker.querySelector('[date-slider-role=\"month\"]');\r\n  if (monthSlider && monthSlider.innerHTML === \"\") {\r\n    var startDate = window.startDate;\r\n    var nextStepModal = document.querySelector(\"[data-nextStepModal]\");\r\n    var phone = document.querySelector(\"#TrackingPhoneNumber\").value;\r\n    if (DateSlider && nextStepModal) {\r\n      var dayPicker = new DateSlider({\r\n        container: containerDatePicker,\r\n        firstDate: Date.parse(new Date(startDate)),\r\n        phone: phone,\r\n        separator: '/'\r\n      });\r\n\r\n      dayPicker.onSetDay = function (date) {\r\n        containerDatePicker.setAttribute(\"data-date\", date);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * selfGuidedTourTabHandler will update the modal to show the content the user is interested.\r\n * This content could be 1 on 1 form, remote video call form, or self guided tour form.\r\n *\r\n * @param {Boolean} showSelfGuidedTour a flag indicating if self guided tour needs to be shown.\r\n * @param {HTML} container offering the 3 distinct form options.\r\n\r\n */\r\nconst selfGuidedTourTabHandler = (showSelfGuidedTour, container) => {\r\n    const formTourSections = container.querySelectorAll(\"[data-requestTourSection]\");\r\n    const externalTourSection = container.querySelector(\"[data-selfGuidedTourSection]\");\r\n\r\n    changeLeadAction(container);\r\n    toggleGuidedTourTriggerAttributeToModalOpener(container, showSelfGuidedTour);\r\n\r\n    if (!formTourSections || !externalTourSection) {\r\n        createNewSlider(container);\r\n        return;\r\n    }\r\n\r\n    if (showSelfGuidedTour) {\r\n        externalTourSection.removeAttribute('hidden');\r\n        const guidedTourCta = externalTourSection.querySelector('[data-utourlink]');\r\n        const guidedTourCtaText = guidedTourCta ? guidedTourCta.innerText : \"\";\r\n        updateLegalConsentText(container, guidedTourCtaText);\r\n\r\n        formTourSections.forEach(section => section.setAttribute('hidden', ''));\r\n\r\n        if (window.lazyLoad) {\r\n            window.lazyLoad.init();\r\n        }\r\n    } else {\r\n        externalTourSection.setAttribute('hidden', '');\r\n        const regularTourCta = container.querySelector('[data-send-form]');\r\n        const regularTourCtaText = regularTourCta ? regularTourCta.innerText : \"\";\r\n        updateLegalConsentText(container, regularTourCtaText);\r\n\r\n        formTourSections.forEach(section => section.removeAttribute('hidden'));\r\n        createNewSlider(container);\r\n    }\r\n};\r\n\r\n/**\r\n * updateLegalConsentText will update the legal consent text by providing the right button\r\n * text of the form the user is interested in submitting.\r\n * @param {HTML} container where the legal consent text is placed.\r\n * @param {string} buttonText to be read in the legal consent text.\r\n */\r\nfunction updateLegalConsentText(container, buttonText) {\r\n    const currentLegalConsentSection = container.querySelector('[data-first-legal-consent-section]');\r\n    if (!currentLegalConsentSection) {\r\n        return;\r\n    }\r\n\r\n    const template = document.querySelector('[data-first-legal-consent-section-template]');\r\n    const clone = template.content.cloneNode(true);\r\n    const clonedFirstLegalConsentSection = clone.querySelector('[data-first-legal-consent-section]');\r\n    const updatedtLegalConsentText =\r\n        clonedFirstLegalConsentSection.innerHTML.replace('the button', `the ${buttonText} button`);\r\n\r\n    clonedFirstLegalConsentSection.innerHTML = updatedtLegalConsentText;\r\n    currentLegalConsentSection.replaceWith(clonedFirstLegalConsentSection);\r\n}\r\n\r\n/**\r\n * @private\r\n *\r\n * toggleGuidedTourTriggerAttributeToModalOpener: supports the action of closing the form.\r\n * @param {HTML} container of the content that is going to be shown.\r\n * @param {boolean} isGoingToShowSelfGuidedContent true is self guided content is going to be shown, false otherwise.\r\n */\r\nfunction toggleGuidedTourTriggerAttributeToModalOpener(container, isGoingToShowSelfGuidedContent) {\r\n  const guidedTourConfiguration = document.querySelector('[data-guided-tour-configuration]');\r\n  const modalTrigger = document.querySelector('[data-right-rails-modal]');\r\n  if (!guidedTourConfiguration || !modalTrigger) {\r\n    return;\r\n  }\r\n  const dataGuideTourSelector = guidedTourConfiguration.getAttribute('data-guided-tour-trigger');\r\n  modalTrigger.removeAttribute(dataGuideTourSelector);\r\n  if (dataGuideTourSelector !== '' && isGoingToShowSelfGuidedContent) {\r\n    modalTrigger.setAttribute(dataGuideTourSelector, '');\r\n  }\r\n}\r\n\r\nfunction initDatePicker(container) {\r\n  var inPersonRadio = document.querySelector(\"#radio-in-person\");\r\n  var viaVideoRadio = document.querySelector(\"#radio-video\");\r\n  var phoneElement = document.querySelector(\"#TrackingPhoneNumber\");\r\n  var selfGuidedTab = document.querySelector(\"[data-sales-office-section] [data-selfGuidedTab]\");\r\n  var phone = phoneElement ? phoneElement.value : \"\";\r\n\r\n  if (container) {\r\n    var datePicker = new DateSlider({\r\n      container: container,\r\n      phone: phone,\r\n      separator: '/'\r\n    });\r\n    datePicker.onSetDay = function (date) {\r\n      container.setAttribute('data-date', date);\r\n      var element = document.getElementById(\"nhs_RequestTour\");\r\n\r\n      if (element) {\r\n        var buttonUrl = element.dataset.modalUrl;\r\n        var dateParam = buttonUrl.indexOf(\"&date=\");\r\n\r\n        if (dateParam > 0) {\r\n          element.dataset.modalUrl = buttonUrl.substring(0, dateParam);\r\n        }\r\n\r\n        element.dataset.modalUrl += \"&date=\" + date;\r\n      }\r\n    }\r\n  }\r\n\r\n  if (inPersonRadio) {\r\n    inPersonRadio.addEventListener(\"change\", tourInPersonVideoHandler);\r\n  }\r\n\r\n  if (viaVideoRadio) {\r\n    viaVideoRadio.addEventListener(\"change\", tourInPersonVideoHandler);\r\n  }\r\n\r\n  if (selfGuidedTab) {\r\n    selfGuidedTab.addEventListener(\"click\", function () {\r\n      selfGuidedTourTabHandler(true, document.querySelector(\"[data-sales-office-section]\"));\r\n    });\r\n  }\r\n}\r\n\r\nfunction attachFormEvents() {\r\n  // ToDo: use mutation observer instead of jQuery to assign this dinamic element's events\r\n  jQuery(document).on(\"click\", \"[data-utourlink]\", function (event) {\r\n    showThankYouPageForExternalLeads(event);\r\n    cleanOpenFormButtons();\r\n  });\r\n}\r\n\r\n$jq(document).ready(function () {\r\n  const onPageForm = document.querySelector('[data-onpage-form]');\r\n  setupLeadForms(onPageForm);\r\n  attachFormEvents();\r\n});","(function moreCommunitiesSection() {\r\n  'use strict';\r\n\r\n  const nearbyContainer = document.querySelector('[data-nearby-section]');\r\n  function handlerMoreCommunityClick(event) {\r\n    const target = event.target;\r\n    const cardElement = target.closest('[data-card-element]');\r\n    const card = target.closest('[data-card]');\r\n    const link = card.querySelector('[data-link]');\r\n\r\n    if (!card) {\r\n      return;\r\n    }\r\n\r\n    if (cardElement &&\r\n      (cardElement.dataset.cardElement === 'favoriteButton' || cardElement.dataset.cardElement === 'priceReduction')) {\r\n      return;\r\n    }\r\n\r\n    link.click();\r\n  }\r\n\r\n  document.body.addEventListener(\r\n    'moreCommunitiesLoaded',\r\n    () => nearbyContainer.addEventListener('click', handlerMoreCommunityClick)\r\n  );\r\n}());\r\n","/*\r\n * This module will call the form certifier 3rd party\r\n * called ActiveProspect. For details:\r\n * https://developers.activeprospect.com/docs/trustedform/overview/.\r\n * When executed, a set of inputs will be submitted in every\r\n * lead, so we can post a secret token that confirms the\r\n * authenticity of the lead in terms of the 3rd party.\r\n * These inputs will contain Ids that are used to give\r\n * traceability to the leads requested from NHS and make sure\r\n * they come from a real user.\r\n */\r\n(function handlerTrustedForm(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  const queryScript = 'nhs_scriptTrustedForm';\r\n  const eventToAttach = Object.prototype.hasOwnProperty.call(global, 'ontouchstart') ? 'touchend' : 'mousedown';\r\n\r\n  /**\r\n   * @constructs NewHomeSource.TrustedForm\r\n   */\r\n  function TrustedForm() {\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * attachEvent: attach event to load script.\r\n   *\r\n   * @param {Event} event with the information of current target.\r\n   */\r\n  function attachEvent(event) {\r\n    if (event.target.dataset.trustedForm) {\r\n      TrustedForm.load();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * executeMethod: observe when input on form is already in the DOM to make the request.\r\n   *\r\n   * @param {Function} callback to be executed when  trusted form is ready.\r\n   */\r\n  function executeMethod(callback) {\r\n    const xxTrustedFormCertUrl = document.querySelector(\"[name='xxTrustedFormCertUrl']\");\r\n    if (xxTrustedFormCertUrl) {\r\n      callback();\r\n    } else {\r\n      const observer = new MutationObserver((mutations) => {\r\n        mutations.forEach((mutation) => {\r\n          if (!mutation.addedNodes) { return; }\r\n\r\n          for (let i = 0; i < mutation.addedNodes.length; i += 1) {\r\n            if (mutation.addedNodes[i].id === 'xxTrustedFormCertUrl_0') {\r\n              observer.disconnect();\r\n              callback();\r\n              break;\r\n            }\r\n          }\r\n        });\r\n      });\r\n      observer.observe(document.body, {\r\n        childList: true,\r\n        subtree: true,\r\n        attributes: false,\r\n        characterData: false\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * load: download the script of trusted form\r\n   *\r\n   * @param {Function} callback to be executed after all is ready.\r\n   */\r\n  TrustedForm.load = function (callback) {\r\n    if (document.querySelector('#' + queryScript)) {\r\n      if (typeof callback === 'function') {\r\n        callback();\r\n      }\r\n      return;\r\n    }\r\n    const field = 'xxTrustedFormCertUrl';\r\n    const provideReferrer = false;\r\n    const invertFieldSensitivity = false;\r\n    const tf = document.createElement('script');\r\n    tf.type = 'text/javascript';\r\n    tf.async = true;\r\n    tf.id = queryScript;\r\n    tf.src = document.location.protocol + '//api.trustedform.com/trustedform.js?provide_referrer=' +\r\n      escape(provideReferrer) + '&field=' + escape(field) + '&l=' + new Date().getTime() + Math.random() +\r\n      '&invert_field_sensitivity=' + invertFieldSensitivity;\r\n    document.head.appendChild(tf);\r\n\r\n    if (typeof callback === 'function') {\r\n      tf.addEventListener('load', executeMethod.bind(this, callback));\r\n    }\r\n  };\r\n\r\n  global.NewHomeSource.TrustedForm = TrustedForm;\r\n  document.addEventListener(eventToAttach, attachEvent);\r\n\r\n  return TrustedForm;\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","(function () {\r\n    var onDomComplete = function (fn) { document.addEventListener(\"readystatechange\", function (e) { if (document.readyState === \"complete\") { fn(e); } }); };\r\n    var getDetailItem = function () {\r\n        if (typeof homeDetail !== \"undefined\") {\r\n            return homeDetail;\r\n        } else if (typeof commDetail !== \"undefined\") {\r\n            return commDetail;\r\n        }\r\n        return null; // Basic :p\r\n    };\r\n    onDomComplete(function () {\r\n        var observer = null;\r\n        var onIntersection = function (entries, observer) {\r\n            entries.forEach(function (entry) {\r\n                if (!(entry.intersectionRatio > 0)) return;\r\n\r\n                var detailItem = getDetailItem();\r\n                if (detailItem === null || detailItem.parameters.showMortgage) {\r\n                    var detailPriceElm = document.querySelector(\".nhs_DetailsPrice\");\r\n                    var price1 = detailPriceElm ? detailPriceElm.textContent : \"\";\r\n                    var price2 = price1.split(\"-\")[0];\r\n                    var price3 = parseFloat(price2.replace(/[^0-9-.]/g, ''));\r\n                    var postalCodeElm = document.querySelector(\"#nhs_FormAddress > span:nth-child(4)\");\r\n                    var postalCode = postalCodeElm ? postalCodeElm.textContent : \"\";\r\n                    var detailCardTemplate = `<section class=\"nhs-c-wrapper__section\">\r\n                                                <div class=\"nhs-c-wrapper__section-container nhs-mq-wrapper__section-container--medium nhs-u-gap--500\">\r\n                                                  <h3 class=\"nhs-c-heading--black-1000-subhead-3-large-light\">Mortgage rates & offers</h3>\r\n                                                  <iframe aria-label=\"Mortgage rates & offers\" class=\"nhs-c-wrapper__mortgage-iframe\" src='https://widgets.icanbuy.com/c/standard/us/en/mortgage/tables/Mortgage.aspx?siteid=206f35c4e7ee1a32&amp;searchbtnbgcolor=ffce34&amp;searchbtntextcolor=2c2c2c&amp;listingbtnbgcolor=0079d2&amp;loan_type=PURCH&amp;zip=${postalCode}&amp;property_value=${price3}' width='665' height='710'></iframe>\r\n                                                </div>\r\n                                              </section>`;\r\n                    var detailCard = document.createRange().createContextualFragment(detailCardTemplate).querySelector(\"*\");\r\n\r\n                    if (entry.target && entry.target.id === \"nhs_reviewsInfo\") {\r\n                        var mortgageContainer = document.getElementById(\"nhs_MortgageContainer\");\r\n\r\n                        if (mortgageContainer) {\r\n                            detailCard.classList.remove(\"nhs_DetailCard\");\r\n                            mortgageContainer.appendChild(detailCard);\r\n                        }\r\n                    } else if (/\\/community(detail)?\\//.test(location.pathname)) { // Community Detail\r\n                        var nearbyHomesContent = document.querySelector(\".nhs_DetailMain > #nhs_NearbyHomesContent\");\r\n                        if (nearbyHomesContent) {\r\n                            nearbyHomesContent.parentElement.insertBefore(detailCard, nearbyHomesContent);\r\n                        }\r\n                    } else if (/\\/basiccommunity\\//.test(location.pathname)) { // Basic Community Detail\r\n                        var mortgageContainer = document.getElementById(\"nhs_MortgageContainer\");\r\n                        if (mortgageContainer) {\r\n                            detailCard.classList.remove(\"nhs_DetailCard\")\r\n                            mortgageContainer.appendChild(detailCard);\r\n                      }\r\n                    } else if (/\\/plandetail|specdetail|homedetail|sold\\//.test(location.pathname)) { // Home Detail\r\n                        var homeCarousel = document.getElementById(\"nhs_HomeCarousel\");\r\n                        if (homeCarousel) {\r\n                            homeCarousel.parentElement.insertBefore(detailCard, homeCarousel);\r\n                        }\r\n                    } else if (/\\/basicdetail\\//.test(location.pathname)) {\r\n                        var refElm = document.querySelector(\"#nhs_DetailsMain > :last-child\"); // Basic Home Detail\r\n                        if (refElm) {\r\n                            refElm.parentElement.insertBefore(detailCard, refElm);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                observer.disconnect();\r\n            });\r\n        };\r\n        observer = new IntersectionObserver(onIntersection);\r\n        if (document.querySelector(\"#nhs_DetailsMain,#map-directions-container,#nhs_reviewsInfo\") == null) {\r\n            var observeElement = document.querySelector(\"#nhs_DetailsMain,#nhs_nearbyHomesSection,#next-steps-container,#SchoolsAndAmenities\");\r\n            if (observeElement) {\r\n                observer.observe(observeElement);\r\n            }\r\n        } else {\r\n            observer.observe(document.querySelector(\"#nhs_DetailsMain,#map-directions-container,#nhs_reviewsInfo\"));\r\n        }\r\n    });\r\n})();","// v1.1.1\r\n// This was taken from https://github.com/vanilla-masker/vanilla-masker\r\n// but we modify it\r\n\r\n(function (root, factory) {\r\n  if (typeof define === 'function' && define.amd) {\r\n    define(factory);\r\n  } else if (typeof exports === 'object') {\r\n    module.exports = factory();\r\n  } else {\r\n    root.VMasker = factory();\r\n  }\r\n}(this, function() {\r\n  var DIGIT = \"9\",\r\n    ALPHA = \"A\",\r\n    ALPHANUM = \"S\",\r\n    BY_PASS_KEYS = [9, 16, 17, 18, 36, 37, 38, 39, 40, 91, 92, 93],\r\n    mergeMoneyOptions = function(opts) {\r\n      opts = opts || {};\r\n      opts = {\r\n        delimiter: opts.delimiter || \".\",\r\n        lastOutput: opts.lastOutput,\r\n        precision: opts.hasOwnProperty(\"precision\") ? opts.precision : 2,\r\n        separator: opts.separator || \",\",\r\n        showSignal: opts.showSignal,\r\n        suffixUnit: opts.suffixUnit && (\" \" + opts.suffixUnit.replace(/[\\s]/g,'')) || \"\",\r\n        unit: opts.unit && (opts.unit.replace(/[\\s]/g,'') + \" \") || \"\",\r\n        zeroCents: opts.zeroCents\r\n      };\r\n      opts.moneyPrecision = opts.zeroCents ? 0 : opts.precision;\r\n      return opts;\r\n    },\r\n    // Fill wildcards past index in output with placeholder\r\n    addPlaceholdersToOutput = function(output, index, placeholder) {\r\n      for (; index < output.length; index++) {\r\n        if(output[index] === DIGIT || output[index] === ALPHA || output[index] === ALPHANUM) {\r\n          output[index] = placeholder;\r\n        }\r\n      }\r\n      return output;\r\n    }\r\n    ;\r\n\r\n  var VanillaMasker = function(elements) {\r\n    this.elements = elements;\r\n  };\r\n\r\n  VanillaMasker.prototype.unbindElementToMask = function() {\r\n    for (var i = 0, len = this.elements.length; i < len; i++) {\r\n      this.elements[i].lastOutput = \"\";\r\n      this.elements[i].oninput = false;\r\n\r\n      if (this.elements[i].value.length) {\r\n        this.elements[i].value = this.elements[i].value.replace(/\\D/g, '');\r\n      }\r\n    }\r\n  };\r\n\r\n  VanillaMasker.prototype.bindElementToMask = function(maskFunction) {\r\n    var that = this,\r\n      onInput = function(e) {\r\n        e = e || window.event;\r\n        var source = e.target || e.srcElement;\r\n\r\n        setTimeout(function() {\r\n          that.opts.lastOutput = source.lastOutput;\r\n          source.value = VMasker[maskFunction](source.value, that.opts);\r\n          source.lastOutput = source.value;\r\n          if (source.setSelectionRange && that.opts.suffixUnit) {\r\n            source.setSelectionRange(source.value.length, (source.value.length - that.opts.suffixUnit.length));\r\n          }\r\n        }, 0);\r\n      }\r\n      ;\r\n    for (var i = 0, len = this.elements.length; i < len; i++) {\r\n      this.elements[i].lastOutput = \"\";\r\n      this.elements[i].oninput = onInput;\r\n      if (this.elements[i].value.length) {\r\n        this.elements[i].value = VMasker[maskFunction](this.elements[i].value, this.opts);\r\n      }\r\n    }\r\n  };\r\n\r\n  VanillaMasker.prototype.maskMoney = function(opts) {\r\n    this.opts = mergeMoneyOptions(opts);\r\n    this.bindElementToMask(\"toMoney\");\r\n  };\r\n\r\n  VanillaMasker.prototype.maskNumber = function() {\r\n    this.opts = {};\r\n    this.bindElementToMask(\"toNumber\");\r\n  };\r\n\r\n  VanillaMasker.prototype.maskAlphaNum = function() {\r\n    this.opts = {};\r\n    this.bindElementToMask(\"toAlphaNumeric\");\r\n  };\r\n\r\n  VanillaMasker.prototype.maskPattern = function(pattern) {\r\n    this.opts = {pattern: pattern};\r\n    this.bindElementToMask(\"toPattern\");\r\n  };\r\n\r\n  VanillaMasker.prototype.unMask = function() {\r\n    this.unbindElementToMask();\r\n  };\r\n\r\n  var VMasker = function(el) {\r\n    if (!el) {\r\n      throw new Error(\"VanillaMasker: There is no element to bind.\");\r\n    }\r\n    var elements = (\"length\" in el) ? (el.length ? el : []) : [el];\r\n    return new VanillaMasker(elements);\r\n  };\r\n\r\n  VMasker.toMoney = function(value, opts) {\r\n    opts = mergeMoneyOptions(opts);\r\n    if (opts.zeroCents) {\r\n      opts.lastOutput = opts.lastOutput || \"\";\r\n      var zeroMatcher = (\"(\"+ opts.separator +\"[0]{0,\"+ opts.precision +\"})\"),\r\n        zeroRegExp = new RegExp(zeroMatcher, \"g\"),\r\n        digitsLength = value.toString().replace(/[\\D]/g, \"\").length || 0,\r\n        lastDigitLength = opts.lastOutput.toString().replace(/[\\D]/g, \"\").length || 0\r\n        ;\r\n      value = value.toString().replace(zeroRegExp, \"\");\r\n      if (digitsLength < lastDigitLength) {\r\n        value = value.slice(0, value.length - 1);\r\n      }\r\n    }\r\n\r\n    var number = value.toString();\r\n    // if separator is in string, make sure we zero-pad to respect it\r\n    var separatorIndex = number.indexOf(opts.separator),\r\n      missingZeros = (opts.precision - (number.length - separatorIndex - 1));\r\n\r\n    if (separatorIndex !== -1 && (missingZeros > 0) ) {\r\n      number = number + ('0' * missingZeros);\r\n    }\r\n\r\n    number = number.replace(/[\\D]/g, \"\");\r\n\r\n    var clearDelimiter = new RegExp(\"^(0|\\\\\"+ opts.delimiter +\")\"),\r\n      clearSeparator = new RegExp(\"(\\\\\"+ opts.separator +\")$\"),\r\n      money = number.substr(0, number.length - opts.moneyPrecision),\r\n      masked = money.substr(0, money.length % 3),\r\n      cents = new Array(opts.precision + 1).join(\"0\")\r\n      ;\r\n\r\n    money = money.substr(money.length % 3, money.length);\r\n    for (var i = 0, len = money.length; i < len; i++) {\r\n      if (i % 3 === 0) {\r\n        masked += opts.delimiter;\r\n      }\r\n      masked += money[i];\r\n    }\r\n    masked = masked.replace(clearDelimiter, \"\");\r\n    masked = masked.length ? masked : \"0\";\r\n    var signal = \"\";\r\n    if(opts.showSignal === true) {\r\n      signal = value < 0 || (value.startsWith && value.startsWith('-')) ? \"-\" : \"\";\r\n    }\r\n    if (!opts.zeroCents) {\r\n      var beginCents = Math.max(0, number.length - opts.precision),\r\n        centsValue = number.substr(beginCents, opts.precision),\r\n        centsLength = centsValue.length,\r\n        centsSliced = (opts.precision > centsLength) ? opts.precision : centsLength\r\n        ;\r\n      cents = (cents + centsValue).slice(-centsSliced);\r\n    }\r\n    var output = opts.unit + signal + masked + opts.separator + cents;\r\n    return output.replace(clearSeparator, \"\") + opts.suffixUnit;\r\n  };\r\n\r\n  VMasker.toPattern = function (inputValue, opts) {\r\n    // fixes problem when mask is triggered by the autocomplete\r\n    // with a phone number that starts with a +1 country code,\r\n    // i.e: avoids +1 (555) 333-7777 becoming (155) 533- 3777\r\n    // causing we lost the phone lead truncating the last number.\r\n    const value = inputValue.replace('+1', '');\r\n\r\n    var pattern = (typeof opts === 'object' ? opts.pattern : opts),\r\n      patternChars = pattern.replace(/\\W/g, ''),\r\n      output = pattern.split(\"\"),\r\n      values = value.toString().replace(/\\W/g, \"\"),\r\n      charsValues = values.replace(/\\W/g, ''),\r\n      index = 0,\r\n      i,\r\n      outputLength = output.length,\r\n      placeholder = (typeof opts === 'object' ? opts.placeholder : undefined)\r\n      ;\r\n\r\n    for (i = 0; i < outputLength; i++) {\r\n      // Reached the end of input\r\n      if (index >= values.length) {\r\n        if (patternChars.length == charsValues.length) {\r\n          return output.join(\"\");\r\n        }\r\n        else if ((placeholder !== undefined) && (patternChars.length > charsValues.length)) {\r\n          return addPlaceholdersToOutput(output, i, placeholder).join(\"\");\r\n        }\r\n        else {\r\n          break;\r\n        }\r\n      }\r\n      // Remaining chars in input\r\n      else{\r\n        if ((output[i] === DIGIT && values[index].match(/[0-9]/)) ||\r\n          (output[i] === ALPHA && values[index].match(/[a-zA-Z]/)) ||\r\n          (output[i] === ALPHANUM && values[index].match(/[0-9a-zA-Z]/))) {\r\n          output[i] = values[index++];\r\n        } else if (output[i] === DIGIT || output[i] === ALPHA || output[i] === ALPHANUM) {\r\n          if(placeholder !== undefined){\r\n            return addPlaceholdersToOutput(output, i, placeholder).join(\"\");\r\n          }\r\n          else{\r\n            return output.slice(0, i).join(\"\");\r\n          }\r\n          // exact match for a non-magic character\r\n        } else if (output[i] === values[index]) {\r\n          index++;\r\n        }\r\n\r\n      }\r\n    }\r\n    return output.join(\"\").substr(0, i);\r\n  };\r\n\r\n  VMasker.toNumber = function(value) {\r\n    return value.toString().replace(/(?!^-)[^0-9]/g, \"\");\r\n  };\r\n\r\n  VMasker.toAlphaNumeric = function(value) {\r\n    return value.toString().replace(/[^a-z0-9 ]+/i, \"\");\r\n  };\r\n\r\n  return VMasker;\r\n}));","(function leadModalEvents(global) {\r\n  'use strict';\r\n\r\n  const isTouchScreen = Object.prototype.hasOwnProperty.call(global, 'ontouchstart');\r\n  const eventToAttach = isTouchScreen ? 'touchend' : 'click';\r\n  const onPageLeadButton = document.querySelector('[data-on-page-button]');\r\n\r\n  function setAttributesToDataLayer(event) {\r\n    const target = event.target;\r\n    if (!target.dataset.leadButtonClicked) {\r\n      return;\r\n    }\r\n    const dataset = target.dataset;\r\n    const leadEvents = {\r\n      ButtonNameClicked: dataset.leadButtonClicked,\r\n      ClickTarget: dataset.leadClickTarget,\r\n      Position: dataset.leadPosition,\r\n      GenerateLeadFrom: dataset.leadGenerateFrom,\r\n      ButtonNameSource: dataset.leadButtonNameSource\r\n    };\r\n\r\n    if (!global.NewHomeSource ||\r\n      !global.NewHomeSource.Modules ||\r\n      !global.NewHomeSource.Modules.tagManager) {\r\n      return;\r\n    }\r\n    global.NewHomeSource.Modules.tagManager.setDataLayerValue('leadEvents', leadEvents);\r\n  }\r\n\r\n  document.addEventListener(eventToAttach, setAttributesToDataLayer);\r\n  if (onPageLeadButton) {\r\n    onPageLeadButton.addEventListener(eventToAttach, setAttributesToDataLayer);\r\n  }\r\n}(window));\r\n","(function handlerOnPageForm() {\r\n  'use strict';\r\n\r\n  const fillInputsOnPageForm = (event) => {\r\n    const formData = event.detail;\r\n    if (formData.name) {\r\n      const name = document.querySelector('#Name');\r\n      if (name) {\r\n        name.value = formData.name;\r\n      }\r\n    }\r\n    if (formData.emailAddress) {\r\n      const emailAddress = document.querySelector('#MailAddress');\r\n      if (emailAddress) {\r\n        emailAddress.value = formData.emailAddress;\r\n      }\r\n    }\r\n    if (formData.phoneNumber) {\r\n      const phoneNumber = document.querySelector('#UserPhoneNumber');\r\n      if (phoneNumber) {\r\n        phoneNumber.value = formData.phoneNumber;\r\n      }\r\n    }\r\n    if (formData.postalCode) {\r\n      const postalCode = document.querySelector('#UserPostalCode');\r\n      if (postalCode) {\r\n        postalCode.value = formData.postalCode;\r\n      }\r\n    }\r\n    if (formData.livesOutside != null)\r\n    {\r\n      const livesOutside = document.querySelector('#lives-outside');\r\n      if (livesOutside) {\r\n        livesOutside.checked = formData.livesOutside;\r\n      }\r\n      const postalCode = document.querySelector('#UserPostalCode');\r\n      if (postalCode) {\r\n        if (formData.livesOutside) {\r\n          postalCode.value = '';\r\n        }\r\n        postalCode.disabled = formData.livesOutside;\r\n      }\r\n    }\r\n    if (formData.preferredContactMethod) {\r\n      const contactMethod = document.querySelector('#nhs-contact-method');\r\n      if (contactMethod) {\r\n        contactMethod.value = formData.preferredContactMethod;\r\n      }\r\n    }\r\n    if (formData.realtorQuestionAnswer) {\r\n      const realtorAnswer = document.querySelector('#nhs-real-agent');\r\n      if (realtorAnswer) {\r\n        realtorAnswer.value = formData.realtorQuestionAnswer;\r\n      }\r\n    }\r\n    if (formData.sendAlerts != null) {\r\n      const sendAlerts = document.querySelector('#SendAlerts');\r\n      if (sendAlerts) {\r\n        sendAlerts.checked = formData.sendAlerts;\r\n      }\r\n    }\r\n  };\r\n\r\n  document.body.addEventListener('onLeadPosted', fillInputsOnPageForm);\r\n}());\r\n","(function handlerFullImageViewerTemplateForm() {\r\n  'use strict';\r\n\r\n  /**\r\n     * Fills the inputs of the Full Image Viewer Schedule Tour form template with the provided data.\r\n     * Iterates over each field defined in fieldsMap and updates the corresponding DOM element.\r\n     * @param {Event} event - The event containing the form data.\r\n    */\r\n  const fillFullImageViewerTemplateInputs = (event) => {\r\n    const formData = event.detail;\r\n    const fivFormTemplate = document.querySelector('[data-component=\"full-image-viewer-scheduleTour-template\"]');\r\n\r\n    const fieldsMap = {\r\n      name: '#Name',\r\n      emailAddress: '#MailAddress',\r\n      phoneNumber: '#UserPhoneNumber',\r\n      postalCode: '#UserPostalCode',\r\n      preferredContactMethod: '#nhs-contact-method',\r\n      sendAlerts: '#SendAlerts',\r\n    };\r\n\r\n    /**\r\n     * Use Object.keys(fieldsMap).forEach to iterate over each field defined in fieldsMap.\r\n     * - For each field:\r\n     *   - Selects the corresponding element in the DOM.\r\n     *   - Checks if the corresponding value in formData is not undefined.\r\n     *   - Sets the field value (element.checked or element.value).\r\n    */\r\n    Object.keys(fieldsMap).forEach((key) => {\r\n      const element = fivFormTemplate.content.querySelector(fieldsMap[key]);\r\n      if (element) {\r\n        if (typeof formData[key] !== 'undefined') {\r\n          if (element.type === 'checkbox') {\r\n            element.checked = formData[key];\r\n          } else {\r\n            element.value = formData[key];\r\n          }\r\n        }\r\n      }\r\n    });\r\n\r\n    /**\r\n     * Additionally, handles the special case for the livesOutside field:\r\n     * - If livesOutside is not null:\r\n     *   - Selects the international gallery checkbox and updates its checked property.\r\n     *   - Selects the postal code field and:\r\n     *     - Clears the postal code value if livesOutside is true.\r\n     *     - Disables the postal code field if livesOutside is true.\r\n    */\r\n    if (formData.livesOutside != null) {\r\n      const livesOutside = fivFormTemplate.content.querySelector('#international-gallery');\r\n      if (livesOutside) {\r\n        livesOutside.checked = formData.livesOutside;\r\n      }\r\n      const postalCode = fivFormTemplate.content.querySelector('#UserPostalCode');\r\n      if (postalCode) {\r\n        if (formData.livesOutside) {\r\n          postalCode.value = '';\r\n        }\r\n        postalCode.disabled = formData.livesOutside;\r\n      }\r\n    }\r\n  };\r\n\r\n  document.body.addEventListener('onLeadPosted', fillFullImageViewerTemplateInputs);\r\n}());","jQuery(document).ready(function () {\r\n\r\n});\r\nNHS.Scripts.GooglePropertyMap = function (parameters) {\r\n  this.parameters = parameters;\r\n  this.isMapCreate = false;\r\n  this.alreadyClicked = false;\r\n  this.reDrawMap = true;\r\n  this.disableShowButton = parameters.disableShowButton;\r\n};\r\n\r\nNHS.Scripts.GooglePropertyMap.prototype =\r\n  {\r\n    InitMap: function () {\r\n      var self = this;\r\n      var mapOptions = self.parameters.OptionsForMap;\r\n\r\n      let salesOfficeTab = document.querySelector('[data-type=\"sales-office\"]');\r\n      let coordinatesElement = document.querySelector('#nhs_MapTabs [data-active]');\r\n\r\n      if(salesOfficeTab && coordinatesElement){\r\n        mapOptions.MapOptions.Latitude = Number(coordinatesElement.dataset.lat);\r\n        mapOptions.MapOptions.Longitude = Number(coordinatesElement.dataset.lng);\r\n      }\r\n\r\n      self.isMapCreate = true;\r\n      self.googleApi.createMap();\r\n      self.googleApi.createMarkerPoint(mapOptions.MapOptions.Latitude, mapOptions.MapOptions.Longitude, null, null, self.parameters.icon, null, null, null, mapOptions.MapOptions.label);\r\n\r\n      if (self.parameters.NearbyComms) {\r\n        self.googleApi.processResult(self.parameters.NearbyComms);\r\n      }\r\n\r\n      self.mapExpanded();\r\n      if (!self.disableShowButton) {\r\n        self.SetUpdate();\r\n      }\r\n      if (!self.googleApi.map) {\r\n        return;\r\n      }\r\n      google.maps.event.addListener(self.googleApi.map, 'idle', self.RemoveGoogleInfo);\r\n      jQuery.HideLoading();\r\n      if (typeof self.googleApi.initializeAutoComplete === 'function') {\r\n        self.googleApi.initializeAutoComplete();\r\n      }\r\n    },\r\n\r\n    CreateMap: function () {\r\n      var self = this;\r\n      if (self.isMapCreate) {\r\n        if (self.parameters.isBasicListing) {\r\n          self.parameters.logger.logBasicListingEvent('BLMAPV', self.parameters.communityId);\r\n        }\r\n        if (jQuery('#tabBuilderMap a').length > 0 && self.reDrawMap) {\r\n          self.reDrawMap = false;\r\n          self.googleApi.ReDrawMap();\r\n        }\r\n      }\r\n\r\n      if (!self.isMapCreate) {\r\n        if (jQuery(\"#nhs_GoogleMapScript\").length === 0) {\r\n          NHS.Scripts.GoogleMapApi.prototype.loadGoogleMapsCode(self.parameters.googleMapScript +\r\n            '&callback=initializeDP');\r\n        } else {\r\n          self.googleApi.WaitGoogleScript(function () {\r\n            self.InitMap();\r\n          }, 100, self.googleApi);\r\n        }\r\n      }\r\n      dataLayer.push({ \"mapCoordinates\": \"o|\" + self.parameters.OptionsForMap.MapOptions.Latitude + \"|\" + self.parameters.OptionsForMap.MapOptions.Longitude });\r\n    },\r\n\r\n    SetUpGoogleApi: function () {\r\n\r\n      var self = this;\r\n      var parameters = self.parameters;\r\n\r\n      var mapOptions = this.parameters.OptionsForMap;\r\n      var googleApi = new NHS.Scripts.GoogleMapApi(mapOptions);\r\n\r\n      googleApi.getIconMarkerPoint = function (results, result) {\r\n        if (result.MarketPoints.length > 1)\r\n          return parameters.iconNearByCommMulti;\r\n        return parameters.iconNearByComm;\r\n      };\r\n\r\n      googleApi.options.Events.MarkerClickCallBack = function (info, infowindow, infowindowTooltip, marker) {\r\n        if (info && info.MarketPoints) {\r\n          var commIds = [];\r\n          for (var i = 0; i < info.MarketPoints.length; i++) {\r\n            commIds.push(info.MarketPoints[i]['CommunityId'] + \"|\" + 0);\r\n          }\r\n\r\n          jQuery.ajax({\r\n            url: parameters.getCommunityMapCards,\r\n            type: \"GET\",\r\n            data: {\r\n              commIds: commIds.join(),\r\n              basicIds: \"\"\r\n            },\r\n            success: function (html) {\r\n              if (html) {\r\n                infowindow.setContent(html);\r\n                infowindow.open(googleApi.map, marker);\r\n              }\r\n            }\r\n          });\r\n        }\r\n      };\r\n\r\n      googleApi.placeChangedProcess = function (marker, autocomplete) {\r\n        var place = autocomplete.getPlace();\r\n        self.location = place.geometry.location;\r\n      };\r\n\r\n      return googleApi;\r\n    },\r\n\r\n    init: function () {\r\n      var self = this;\r\n      var parameters = self.parameters;\r\n      self.googleApi = self.SetUpGoogleApi();\r\n      jQuery('#dd-collapsible').hide();\r\n      jQuery('#nhs_propertyMapCollapsibleClose').hide();\r\n\r\n      var newMapsContainer = document.querySelectorAll(\"#nhs_MapsAndDirections\");\r\n      if (newMapsContainer) {\r\n        self.CreateMap();\r\n      }\r\n\r\n      if (parameters.isGalleryXp) {\r\n        jQuery(\"#nhs_propertyMapCollapsibleOpen\").click(function () {\r\n          self.googleApi.loadGoogleMapsCode(self.parameters.googleMapScript);\r\n          var mapContainer = document.getElementById(\"nhs_PropertyMap\");\r\n          if (mapContainer.children.length > 0) return;\r\n          self.getPropertyMapSides(self, false);\r\n          self.reDrawMap = false;\r\n        });\r\n      }\r\n\r\n      jQuery('#nhs_propertyMapCollapsibleOpen, #nhs_mapTab').click(function (event) {\r\n        if (parameters.isGalleryXp !== true) {\r\n          self.getPropertyMapSides(self, window.location.pathname.indexOf(\"preview\") > 0);\r\n        }\r\n\r\n        self.parameters.logger.logEventWithParameters(\"Drive_Dir_Reveal\", self.parameters.logInfo);\r\n        if (jQuery(\"#dd-collapsible\").css('display') === 'none') {\r\n          jQuery('#dd-collapsible').show();\r\n          if (self.parameters.isGalleryXp === true && self.reDrawMap && self.isMapCreate) {\r\n            self.reDrawMap = false;\r\n            self.googleApi.ReDrawMap();\r\n          }\r\n        }\r\n        jQuery('#nhs_propertyMapCollapsibleOpen').hide();\r\n        jQuery('#nhs_propertyMapCollapsibleClose').show();\r\n\r\n        NHS.loadCss(document.getElementById(\"detailsXpMapCss\").value);\r\n      });\r\n\r\n      jQuery('#nhs_propertyMapCollapsibleClose').click(function (event) {\r\n        jQuery('#dd-collapsible').hide();\r\n        jQuery('#nhs_propertyMapCollapsibleClose').hide();\r\n        jQuery('#nhs_propertyMapCollapsibleOpen').show();\r\n      });\r\n\r\n      self.InitDrivingDirection();\r\n    },\r\n\r\n    getPropertyMapSides: function (self, isPreview) {\r\n      var parameters = self.parameters;\r\n      var isMpc = (typeof parameters.isMPCommunity != 'undefined') ? parameters.isMPCommunity : false;\r\n      if (typeof parameters.GetPropertyMapRightSide != 'undefined') {\r\n        jQuery.ajax({\r\n          url: parameters.GetPropertyMapRightSide,\r\n          data: {\r\n            \"communityId\": parameters.communityId,\r\n            \"isMPC\": isMpc,\r\n            \"isPreview\": isPreview\r\n          },\r\n          type: \"POST\",\r\n          success: function (data) {\r\n            jQuery(\"#nhs_MapRightSide\").html(data);\r\n            jQuery('#nhs_PropertyMap').width(parameters.mapWidth).height(parameters.mapHeight);\r\n            if (jQuery(\"#nhs_mapTypeMenu\")) {\r\n              self.isMapCreate = false;\r\n              var buildderTabMap = jQuery('#tabBuilderMap');\r\n              buildderTabMap.click();\r\n              self.CreateMap();\r\n            }\r\n          }\r\n        });\r\n      } else {\r\n        jQuery('#nhs_PropertyMap').width(parameters.mapWidth).height(parameters.mapHeight);\r\n        self.CreateMap();\r\n      }\r\n    },\r\n\r\n    mapExpanded: function () {\r\n      var self = this;\r\n\r\n      if (!this.alreadyClicked) {\r\n\r\n        if (self.parameters.isBasicCommunity) {\r\n          self.parameters.logger.logMultiEvent('bcMapSectionReveal', self.parameters.communityId, self.parameters.builderId, 0, 0);\r\n          jQuery.googlepush('Basic Listing', 'Driving Directions', self.parameters.communityId, 2, false);\r\n        }\r\n\r\n        this.alreadyClicked = true;\r\n      }\r\n    },\r\n\r\n    InitDrivingDirection: function () {\r\n      var self = this;\r\n      jQuery('#nhs_drivingDirections').show();\r\n\r\n      jQuery('#nhs_CommMapTab1').addClass(\"nhs_Active\");\r\n\r\n      jQuery('#nhs_CommMapTabs a').click(function () {\r\n        if (jQuery(this).is('.GoogleMap') && jQuery('#nhs_CommunityMapTab').is(':visible')) {\r\n          self.parameters.logger.logEventWithParameters(\"Drive_Dir_Reveal\", self.parameters.logInfo);\r\n\r\n          jQuery('#nhs_CommunityMapTab').toggle();\r\n          jQuery('#nhs_GoogleMapTab').toggle();\r\n          jQuery('#nhs_CommMapTab1').removeClass(\"nhs_Active\");\r\n          jQuery('#nhs_CommMapTab2').addClass(\"nhs_Active\");\r\n          self.CreateMap();\r\n\r\n          var $buildderTabMap = jQuery('#tabBuilderMap a');\r\n          if ($buildderTabMap.length > 0) {\r\n            self.isMapCreate = false;\r\n            $buildderTabMap.click();\r\n          }\r\n        } else if (jQuery(this).is('.CommMap') && jQuery('#nhs_GoogleMapTab').is(':visible')) {\r\n          jQuery('#nhs_CommunityMapTab').toggle();\r\n          jQuery('#nhs_GoogleMapTab').toggle();\r\n          jQuery('#nhs_CommMapTab2').removeClass(\"nhs_Active\");\r\n          jQuery('#nhs_CommMapTab1').addClass(\"nhs_Active\");\r\n        }\r\n\r\n        return false;\r\n      });\r\n\r\n      jQuery('#Maps').on(\"click\", \"#tabMQMap\", function () {\r\n        if (!jQuery('#nhs_PropertyMap').is(':visible')) {\r\n          jQuery('#nhs_PropertyMap').toggle();\r\n          jQuery('#tabBuilderMap').find('a').toggleClass('On');\r\n          jQuery('#tabMQMap').find('a').toggleClass('On');\r\n          jQuery('#nhs_BuilderPropertyMap').toggle();\r\n          jQuery('#nhs_drivingDirections').hide();\r\n          jQuery('#nhs_GetDirections').show();\r\n          jQuery('#nhs_drivingDirections').show();\r\n        }\r\n        self.CreateMap();\r\n\r\n        return false;\r\n      }\r\n      );\r\n\r\n      jQuery('#Maps').on(\"click\", \"#tabBuilderMap\", function () {\r\n\r\n        if (!jQuery('#nhs_BuilderPropertyMap').is(':visible')) {\r\n          jQuery('#nhs_BuilderPropertyMap').toggle();\r\n          jQuery('#tabBuilderMap').find('a').toggleClass('On');\r\n          jQuery('#tabMQMap').find('a').toggleClass('On');\r\n          jQuery('#nhs_PropertyMap').toggle();\r\n          jQuery('#nhs_drivingDirections').show();\r\n          jQuery('#nhs_GetDirections').hide();\r\n          jQuery('#nhs_drivingDirections').show();\r\n        }\r\n\r\n        var alreadyBuilderMapClicked = NHS.Scripts.Helper.readCookie('drivingDirectionsBuilderMapClicked');\r\n\r\n        if (!alreadyBuilderMapClicked) {\r\n          if (!self.parameters.isBasicListing || !self.parameters.isBasicCommunity) {\r\n            if (self.parameters.specId > 0 || self.parameters.planId > 0) {\r\n              self.parameters.logger.logEventWithParameters('HDSDD', self.parameters.logInfo);\r\n            } else {\r\n              self.parameters.logger.logEventWithParameters('CDSDD', self.parameters.logInfo);\r\n            }\r\n          }\r\n\r\n          NHS.Scripts.Helper.createCookie('drivingDirectionsBuilderMapClicked', 1, 0);\r\n        }\r\n\r\n        return false;\r\n      });\r\n      var date = new Date();\r\n      date.setDate(date.getDate() + 1);\r\n      var currentMonth = date.getMonth();\r\n      var currentDate = date.getDate();\r\n      var currentYear = date.getFullYear();\r\n      jQuery(\"#nhsTxtDate\").datepicker({\r\n        minDate: new Date(currentYear, currentMonth, currentDate)\r\n      });\r\n      jQuery(\"#nhsTxtDate\").attr(\"disabled\", \"disabled\");\r\n      jQuery('.nhs_PickerIconContainer').click(function () {\r\n        jQuery('#nhsTxtDate').datepicker(\"show\");\r\n        initDatepickerGallery();\r\n      });\r\n      jQuery(\".btn_NhsMapSend\").mousedown(function () {\r\n        window.NewHomeSource.ModalLoader.initTrigger('.btn_NhsMapSend',\r\n          function () {\r\n            var dateValue = jQuery(\"#nhsTxtDate\").datepicker('getDate');\r\n            setTimeout(function () {\r\n              if (dateValue != null) {\r\n                var actualDate = new Date(dateValue);\r\n                jQuery(\"#RequestBrochureDate\").datepicker({\r\n                  minDate: new Date(currentYear, currentMonth, currentDate)\r\n                }).datepicker(\"setDate\", actualDate);\r\n              } else {\r\n                jQuery(\"#RequestBrochureDate\").datepicker({\r\n                  minDate: new Date(currentYear, currentMonth, currentDate)\r\n                });\r\n              }\r\n              jQuery(\"#RequestBrochureDate\").attr(\"disabled\", \"disabled\");\r\n              jQuery('.nhs_PickerIconModal').click(function () {\r\n                jQuery('#RequestBrochureDate').datepicker(\"show\");\r\n                initDatepickerGallery();\r\n              });\r\n            }, 1000);\r\n          });\r\n      });\r\n  },\r\n\r\n    /**\r\n     * TrackShowRouteEvents: tracks the events for the show routes button.\r\n     */\r\n    TrackShowRouteEvents: function () {\r\n      const routeInput = document.querySelector('[data-map-route-input]');\r\n      const routeInputText = routeInput.value;\r\n\r\n      const event = {\r\n        eventType: 'GA4Event',\r\n        eventName: 'driving_routes',\r\n        params: {\r\n          click_target: 'show route',\r\n          event_type: 'TDV Events',\r\n          search_value: routeInputText,\r\n          currency: 'USD',\r\n          value: 10\r\n        }\r\n      }\r\n\r\n      document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n        detail: { data: event }\r\n      }));\r\n    },\r\n\r\n    SetUpdate: function () {\r\n      var self = this;\r\n      jQuery('#btnUpdate').click(function () {\r\n        const inputWrapper = document.querySelector('[data-direction-wrapper-input]');\r\n        if (self.parameters.isBasicCommunity) {\r\n          self.parameters.logger.logMultiEvent('bcRoute', self.parameters.communityId, self.parameters.builderId, self.parameters.planId, self.parameters.specId);\r\n          jQuery.googlepush('Basic Listing', 'Driving Route', self.parameters.communityId, 4, false);\r\n        }\r\n\r\n        var address = jQuery(\"#nhsTxtStreeAddress\").val();\r\n\r\n        if (address) {\r\n          jQuery('#nhsWrongAddress').hide();\r\n          inputWrapper.classList.remove('nhs-c-input__wrapper--error');\r\n        }\r\n        if (self.location && address && address.trim() !== \"\") {\r\n          var left = (screen.width - 840) / 2;\r\n          var top = (screen.height - 600) / 2;\r\n          jQuery('#nhsWrongAddress').hide();\r\n          inputWrapper.classList.remove('nhs-c-input__wrapper--error');\r\n          //self.parameters\r\n          var url = self.parameters.drivingDirectionAction + '?communityId=' + self.parameters.communityId +\r\n            \"&lat=\" + self.location.lat() + \"&lng=\" + self.location.lng() + '&check=false' + '&isBasicListing=' + self.parameters.isBasicListing + '&startingPoint=' + address;\r\n          jQuery.SetDataLayerPair('siteDrivingRoute');\r\n          self.TrackShowRouteEvents();\r\n          window.open(url, '_blank', 'width=840,height=600,top=' + top + ',left=' + left + ',menubar=yes,status=no,location=no,toolbar=no,scrollbars=yes');\r\n        } else {\r\n          if (address && address.trim() !== \"\") {\r\n            let eventForTdv = {\r\n              builder: self.parameters.builderId,\r\n              community: self.parameters.communityId.toString(),\r\n              market: self.parameters.marketId,\r\n              label: 'Drive_Route_Req',\r\n              eventType: 'tdvEvent'\r\n            };\r\n            document.body.dispatchEvent && document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n              detail: { data: eventForTdv }\r\n            }));\r\n            var geocoder = new google.maps.Geocoder();\r\n            geocoder.geocode({ 'address': address }, function (results, status) {\r\n              if (status == google.maps.GeocoderStatus.OK) {\r\n                var url = self.parameters.drivingDirectionAction + '?communityId=' + self.parameters.communityId +\r\n                  \"&lat=\" + results[0].geometry.location.lat()\r\n                  + \"&lng=\" + results[0].geometry.location.lng() + '&check=false' + '&isBasicListing=' + self.parameters.isBasicListing + '&startingPoint=' + address;\r\n                jQuery.SetDataLayerPair('siteDrivingRoute');\r\n                self.TrackShowRouteEvents();\r\n                window.open(url, '_blank', 'width=840,height=600,top=' + top + ',left=' + left + ',menubar=yes,status=no,location=no,toolbar=no,scrollbars=yes');\r\n              } else {\r\n                jQuery('#nhsWrongAddress').show();\r\n                inputWrapper.classList.add('nhs-c-input__wrapper--error');\r\n              }\r\n            });\r\n          } else {\r\n            jQuery('#nhsWrongAddress').show();\r\n            inputWrapper.classList.add('nhs-c-input__wrapper--error');\r\n          }\r\n        }\r\n      });\r\n    },\r\n\r\n    RemoveGoogleInfo: function () {\r\n      if (jQuery(\".gm-style > div > a\").attr(\"href\")) {\r\n        var aux;\r\n        var len = jQuery('.gm-style-cc').length;\r\n        for (aux = 1; aux < len; aux += 1) {\r\n          jQuery('.gm-style-cc').eq('-1').remove();\r\n        }\r\n        jQuery(\".gm-style > div > a\").removeAttr(\"href\").removeAttr(\"title\");\r\n      }\r\n    }\r\n  };\r\n","(function () {\r\n\r\n  /**\r\n   *  Initialize the save/unsaved buttons displayed in the next steps redesigned section\r\n   */\r\n  var initSaveToFavorites = function () {\r\n    var nextStepsSaveButton = document.querySelector(\"[data-favorites-save]\");\r\n    var gallerySaveButton = document.querySelector(\"#gallery .nhs_favUnsave\");\r\n    var saveToFavoritesLoginButton = document.querySelector(\"#gallery .nhs_favLogin\");\r\n    if (nextStepsSaveButton !== null) {\r\n      nextStepsSaveButton.addEventListener(\"click\", function () {\r\n        if (saveToFavoritesLoginButton && !saveToFavoritesLoginButton.classList.contains(\"nhs_favLogin\")) {\r\n          saveToFavoritesLoginButton.click();\r\n        } else if (!gallerySaveButton.classList.contains(\"nhs_favLogin\")) {\r\n          gallerySaveButton.click();\r\n        }\r\n\r\n      });\r\n    }\r\n    var nextStepsUnsaveButton = document.querySelector(\"[data-favorites-unsave]\");\r\n    var galleryUnsaveButton = document.querySelector(\"#gallery .nhs_favSaved\");\r\n    if (nextStepsUnsaveButton !== null) {\r\n      nextStepsUnsaveButton.addEventListener(\"click\", function () {\r\n        galleryUnsaveButton.click();\r\n      });\r\n    }\r\n  }\r\n\r\n  //Events to Track Google Analytics, uses the ga function declared globally by Analytics.js\r\n  var bindGoogleAnalyticsEvents = function () {\r\n    document.addEventListener(\"click\", function (event) {\r\n      var eventCategory = \"Gallery Detail Pages\";\r\n      var eventAction = null;\r\n      var id = null;\r\n      var eventLabel = null;\r\n\r\n      if (!event.target || \"function\" !== typeof ga || (ga && \"function\" !== typeof ga.getAll)) {\r\n        return;\r\n      }\r\n\r\n      var allGa = ga.getAll().filter(function (element) {\r\n        return element.get(\"trackingId\") === \"UA-40843711-4\";\r\n      });\r\n\r\n      if (allGa[0]) {\r\n        id = allGa[0].get(\"name\");\r\n      }\r\n\r\n      if (event.target.classList.value === \"media-tabs__icon\") {\r\n        event.target.id = event.target.parentElement.id;\r\n      }\r\n\r\n      if (\"img\" === event.target.nodeName.toLowerCase() && event.target.getAttribute('data-full-image-viewer-opener') === 'true' && event.target.classList && event.target.classList.contains(\"active\")) {\r\n        eventAction = \"FWIV open - image click\";\r\n        eventLabel = \"Image click to open FWIV\";\r\n      }\r\n\r\n      if (\"nhs_GalleryPrev\" === event.target.id) {\r\n        eventAction = \"On-page Gallery forward-back\";\r\n        eventLabel = \"Back\";\r\n      }\r\n\r\n      if (\"nhs_GalleryNext\" === event.target.id) {\r\n        eventAction = \"On-page Gallery forward-back\";\r\n        eventLabel = \"Forward\";\r\n      }\r\n\r\n      if (event.target.classList.contains(\"nhs_Close\")) {\r\n        eventAction = \"Gallery Navigation\";\r\n        eventLabel = \"Close button clicks\";\r\n      }\r\n\r\n      //Additional Details Label\r\n      if (\"nhs_additionalDetailsLabel\" === event.target.id) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Clicks to additional com details\";\r\n        eventLabel = \"Additional com details\";\r\n      }\r\n\r\n      //Add to NHS App - From Map\r\n      if (\"nhs_addToNhsAppOnMap\" === event.target.id) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Misc Click Events\";\r\n        eventLabel = \"Add to NHS App - from map area\";\r\n      }\r\n\r\n      //Tabs on Map Section\r\n      if (\"object\" === typeof event.target.dataset && event.target.dataset.isMapDirectionsTab) {\r\n        var tabsElements = document.querySelectorAll(\"[data-is-map-directions-tab]\");\r\n        if (tabsElements && tabsElements.length > 1) {\r\n          eventCategory = \"Detail Page Events\";\r\n          eventAction = \"Insert Map Navigation\";\r\n          eventLabel = \"Tab click - \" + event.target.textContent;\r\n        }\r\n      }\r\n\r\n      //Inset map - Map Section\r\n      if (\"nhs_PropertyMapImage\" === event.target.id) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Inset Map Navigation\";\r\n        eventLabel = \"Clicks map to make interactive\";\r\n      }\r\n\r\n      //View Builder Driving Directions\r\n      if (\"nhs_viewDrivingDirections\" === event.target.id) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Driving Directions Views\";\r\n        eventLabel = \"Clicks to see driving directions\";\r\n      }\r\n\r\n      //Route widget\r\n      if (\"object\" === typeof event.target.dataset && event.target.dataset.showMapDirections) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Routes Generated\";\r\n        eventLabel = \"Route generated\";\r\n      }\r\n\r\n      //Add Link for Commute Calculator\r\n      if (\"nhs_mapAddRoute\" === event.target.id) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Commute Calc Events\";\r\n        eventLabel = \"Adds additional commute destination\";\r\n      }\r\n\r\n      //Commute Calculator\r\n      if (\"nhs_calculateCommute\" === event.target.id) {\r\n        eventCategory = \"Detail Page Events\";\r\n        eventAction = \"Commute Calc Events\";\r\n        eventLabel = \"Commute time generated\";\r\n        var travelModeElement = document.querySelector(\"[data-travel-mode].active\");\r\n\r\n        if (travelModeElement &&\r\n          \"object\" === typeof travelModeElement.dataset &&\r\n          travelModeElement.dataset.travelMode) {\r\n          eventLabel += \" - \" + travelModeElement.dataset.travelMode.toLowerCase();\r\n        } else { //By Default is driving\r\n          eventLabel += \" - driving\";\r\n        }\r\n      }\r\n\r\n      if (eventAction && eventLabel && id && window.ga) {\r\n        ga(id + \".send\", \"event\", eventCategory, eventAction, eventLabel);\r\n      }\r\n    });\r\n  }\r\n\r\n  var phone = document.querySelector(\"#TrackingPhoneNumber\").value;\r\n  var container = document.querySelector(\"#nhs_DetailSalesOffice [data-slider-component]\") ||\r\n    document.querySelector(\"[data-slider-component]\");\r\n  initDatePicker(container, phone, \"/\");\r\n  initSaveToFavorites();\r\n  bindGoogleAnalyticsEvents();\r\n\r\n  var loadEmailSuggestions = function (event) {\r\n    if (!window.Mailcheck && typeof NHS.loadJs === \"function\") {\r\n      NHS.loadJs(document.getElementById(\"CtaDependencies\").value);\r\n    } else if (window.NewHomeSource && window.NewHomeSource.EmailDomainValidator) {\r\n      window.NewHomeSource.EmailDomainValidator();\r\n    }\r\n    this.removeEventListener(\"focusin\", loadEmailSuggestions);\r\n  }\r\n\r\n  function showPhoneNumber(hideSection, displaySection) {\r\n    var hidePhones = document.querySelectorAll(hideSection);\r\n    var showPhones = document.querySelectorAll(displaySection);\r\n    if (hidePhones.length === 0 || showPhones.length === 0) {\r\n      return;\r\n    }\r\n    hidePhones.forEach(element => element.setAttribute('hidden', ''));\r\n    showPhones.forEach(element => element.style.display = 'block');\r\n    jQuery.SetDataLayerPair(\"sitePhoneNumV\");\r\n  }\r\n\r\n  function showPhone(event) {\r\n    if (event.target.closest('[data-phone-reveal-text]')) {\r\n      showPhoneNumber(\"[data-phone-reveal-text]\", \"[data-phone-reveal-number]\");\r\n    }\r\n  }\r\n\r\n  document.body.addEventListener('click', showPhone);\r\n  var onPageForm = document.querySelector(\"[data-onpage-form]\");\r\n  onPageForm.addEventListener(\"focusin\", loadEmailSuggestions);\r\n})();\r\n\r\n(function () {\r\n  /*\r\n  *  This intersectionObserver is used to get the viewport of the sections of the details\r\n  */\r\n  var options = {\r\n    rootMargin: '10px',\r\n    threshold: 0.05\r\n  }\r\n\r\n  const headerHeight = 180;\r\n\r\n  var observerMainStickyBar = function () {\r\n    var sectionDetails = document.querySelector(\"[data-details-container]\");\r\n    var sectionsToObserve = null;\r\n    var userHeight = window.innerHeight;\r\n\r\n    var observer = new IntersectionObserver(function (entries) {\r\n      requestAnimationFrame(calculateSection);\r\n    }, options);\r\n\r\n    /**\r\n     * calculateSection : method to check what is the section that is visible on the viewport to fix issues with scroll animation\r\n     *\r\n     */\r\n    function calculateSection() {\r\n      setTimeout(function () {\r\n        var mainEntry = null;\r\n\r\n        for (var i = 0; i < sectionsToObserve.length; i++) {\r\n          var topSection = sectionsToObserve[i].getBoundingClientRect().top;\r\n          if (topSection > headerHeight) {\r\n            if (topSection > userHeight) {\r\n              mainEntry = sectionsToObserve[i - 1];\r\n            } else {\r\n              mainEntry = sectionsToObserve[i];\r\n            }\r\n            break;\r\n          }\r\n        }\r\n        if (mainEntry) {\r\n          var stickyBar = document.querySelector(\"[data-sticky-nav-bar]\");\r\n          const activeElement = stickyBar.querySelector(\"[data-item-active]\");\r\n          if (stickyBar && activeElement) {\r\n            delete activeElement.dataset.itemActive;\r\n            activeElement.classList.remove(\"nhs-c-button--tap-light-active\");\r\n          }\r\n          var entry = document.querySelector(\"a[data-id=\\\"\" + mainEntry.id + \"\\\"]\");\r\n          if (entry) {\r\n            entry.dataset.itemActive = 'true';\r\n            entry.classList.add(\"nhs-c-button--tap-light-active\");\r\n            requestAnimationFrame(window.NewHomeSource.Modules.stickyBarScrollHandler.moveStickyBarScroll.bind(null, entry, '[data-scroll]'));\r\n          }\r\n        }\r\n      },\r\n        200);\r\n    }\r\n\r\n    /*\r\n     *  Track all sections that have an `id` applied\r\n     */\r\n\r\n    if (sectionDetails) {\r\n      sectionsToObserve = sectionDetails.querySelectorAll(\"[data-detail-section]\");\r\n    }\r\n      \r\n    if (sectionsToObserve) {\r\n      for (var sectionIndex = 0; sectionIndex < sectionsToObserve.length; sectionIndex++) {\r\n        observer.observe(sectionsToObserve[sectionIndex]);\r\n      }\r\n    }\r\n  }\r\n  observerMainStickyBar();\r\n})();","(function(global, factory) {\r\n    \"use strict\";\r\n    if (\"function\" === typeof define && define.amd) {\r\n        // If AMD is supported and the global object (window) in case any JS module is expecting\r\n        // the AjaxHelper to exists on the window object.\r\n        define([],\r\n            function() {\r\n                return (global.AjaxHelper = factory(global));\r\n            });\r\n    } else if (\"object\" === typeof exports) {\r\n        // If supports for Common JS is available export the module\r\n        // and pass is value to the global (window) object in case non Common JS code \r\n        // is expected to work with this AjaxHelper.\r\n        module.exports = (global.AjaxHelper = factory(global));\r\n    } else {\r\n        // If not support for AMD or Common JS is available register the module in the global scope.\r\n        global.AjaxHelper = factory(global);\r\n    }\r\n})(\"undefined\" !== typeof window ? window : {}, function(root) {\r\n\r\n        var requestsQueue = [];\r\n        var partnerElement = document.getElementsByClassName(\"brand-logo\");\r\n        var siteRoot = document.getElementById(\"nhs_siteRoot\");\r\n        let browserAcceptTypes = null;\r\n        var partnerUrl;\r\n        if (partnerElement && partnerElement.length > 0) {\r\n            partnerUrl = partnerElement[0].href;\r\n            partnerUrl = partnerUrl.replace(\"http:\", window.location.protocol);\r\n        } else {\r\n            partnerUrl = \"\";\r\n        }\r\n\r\n        if (siteRoot) {\r\n            siteRoot = siteRoot.value;\r\n        } else {\r\n            siteRoot = \"\";\r\n        }\r\n\r\n        var executeCallbacks = function(req, options, succeded, data) {\r\n            if (typeof options === \"undefined\" || options === null) {\r\n                options = {};\r\n            }\r\n\r\n            // Always\r\n            if (typeof options.always === \"function\") {\r\n                options.always(data);\r\n            }\r\n            // Success\r\n            if (succeded && typeof options.success === \"function\") {\r\n                options.success(data);\r\n            } else if (typeof options.failed === \"function\") { // Failed\r\n                options.failed(data);\r\n            }\r\n\r\n            var queueIndex = requestsQueue.indexOf(req);\r\n            if (queueIndex > -1) {\r\n                requestsQueue.splice(queueIndex, 1);\r\n            }\r\n\r\n        };\r\n        var getRequest = function(url, contentType, parametersToSend, optionalCallbacks) {\r\n            var xhr = new XMLHttpRequest();\r\n            var req = {\r\n                url: url,\r\n                type: \"GET\",\r\n                xhr: xhr\r\n            };\r\n            requestsQueue.push(req);\r\n\r\n            xhr.open(\"GET\", url, true);\r\n            xhr.onreadystatechange = function() {\r\n                if (xhr.readyState !== 4) {\r\n                    return;\r\n                }\r\n\r\n                var succededStatus = xhr.status === 200;\r\n                executeCallbacks(req, optionalCallbacks, succededStatus, xhr.responseText);\r\n            };\r\n            xhr.setRequestHeader(\"Content-type\", contentType);\r\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n            xhr.setRequestHeader(\"Accept\", getAcceptTypes());\r\n\r\n\r\n            try {\r\n                xhr.send(parametersToSend);\r\n            } catch (err) {\r\n                executeCallbacks(req, optionalCallbacks, false, err);\r\n            }\r\n\r\n\r\n        };\r\n\r\n        var postRequest = function(url, options) {\r\n            var xhr = new XMLHttpRequest();\r\n            if (options.abort) {\r\n                for (var i = 0; i < requestsQueue.length; i += 1) {\r\n                    if (requestsQueue[i].url === url) {\r\n                        requestsQueue[i].xhr.abort();\r\n                        requestsQueue.splice(i, 1);\r\n                    }\r\n                }\r\n            }\r\n\r\n            var req = {\r\n                url: url,\r\n                type: \"POST\",\r\n                xhr: xhr\r\n            };\r\n\r\n            requestsQueue.push(req);\r\n\r\n            if (typeof options === \"object\") {\r\n\r\n                xhr.open(\"POST\", url, options.async ? options.async : true);\r\n                xhr.setRequestHeader(\"Accept\", getAcceptTypes());\r\n\r\n                if (options.success || options.always || options.failed) {\r\n                    xhr.onreadystatechange = function() {\r\n                        if (xhr.readyState !== 4) {\r\n                            return;\r\n                        }\r\n\r\n                        var succededStatus = xhr.status === 200;\r\n                        executeCallbacks(req, options, succededStatus, xhr.responseText);\r\n                    };\r\n                }\r\n                var formatJson = true;\r\n                if (options.requestHeaders && options.requestHeaders.length > 0) {\r\n                    for (var i = 0; i < options.requestHeaders.length; i += 1) {\r\n                        xhr.setRequestHeader(options.requestHeaders[i].name, options.requestHeaders[i].value);\r\n                    }\r\n                }\r\n\r\n                if (options.data) {\r\n                  var data = null;\r\n                  \r\n                  if (options.noJsonStringify) {\r\n                    data = options.data;\r\n                  } else {\r\n                    data = JSON.stringify(options.data);\r\n                  }\r\n                  \r\n\r\n                    try {\r\n                        xhr.send(data);\r\n                    } catch (err) {\r\n                        executeCallbacks(req, options, false, err);\r\n                    }\r\n\r\n                } else {\r\n                    try {\r\n                        xhr.send();\r\n                    } catch (err) {\r\n                        executeCallbacks(req, options, false, err);\r\n                    }\r\n                }\r\n            }\r\n\r\n        };\r\n\r\n\r\n        var request = function(options) {\r\n            // Basic validation\r\n            if (!options ||\r\n                typeof options !== \"object\" ||\r\n                !options.url ||\r\n                typeof options.url !== \"string\" ||\r\n                !options.type ||\r\n                typeof options.type !== \"string\") {\r\n                throw new Error(\"Invalid request options\");\r\n            }\r\n            var xhr = new XMLHttpRequest();\r\n            if (options.abort) {\r\n                var requestToAbort = requestsQueue.find(function(r) {\r\n                    return r.url === options.url;\r\n                });\r\n\r\n                if (requestToAbort) {\r\n                    requestToAbort.xhr.abort();\r\n                    requestsQueue.splice(requestToAbort.indexOf(requestToAbort, 1));\r\n                }\r\n            }\r\n\r\n            var requestForQueue = {\r\n                url: options.url,\r\n                type: options.type,\r\n                xhr: xhr\r\n            };\r\n\r\n            requestsQueue.push(requestForQueue);\r\n\r\n            xhr.open(options.type.toUpperCase(), options.url, true);\r\n\r\n\r\n            if (typeof options.success === \"function\" ||\r\n                typeof options.failed === \"function\" ||\r\n                typeof options.always === \"function\") {\r\n                xhr.onreadystatechange = function() {\r\n                    if (xhr.readyState !== 4) return;\r\n\r\n                    requestsQueue.splice(requestsQueue.indexOf(requestForQueue), 1);\r\n\r\n                    var response;\r\n\r\n                    try {\r\n                        response = JSON.parse(xhr.responseText);\r\n                    } catch (e) {\r\n                        response = xhr.responseText;\r\n                    }\r\n\r\n                    if (xhr.status === 200 && typeof options.success === \"function\") {\r\n                        options.success(response);\r\n                    } else if (typeof options.failed === \"function\") {\r\n                        options.failed(response);\r\n                    }\r\n                    if (typeof options.always === \"function\") {\r\n                        options.always(response);\r\n                    }\r\n                };\r\n            }\r\n\r\n            if (options.type.toUpperCase() !== \"GET\" && options.data && typeof options.data === \"object\") {\r\n                xhr.setRequestHeader(\"Content-type\", \"application/json\");\r\n            }\r\n\r\n            xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n            xhr.setRequestHeader(\"Accept\", getAcceptTypes());\r\n\r\n            xhr.send(options.data && typeof options.data === \"object\"\r\n                ? JSON.stringify(options.data)\r\n                : options.data\r\n                ? options.data\r\n                : void (0));\r\n\r\n            return xhr;\r\n        };\r\n\r\n        HTMLFieldSetElement.prototype.serialize = function() {\r\n            var notSerializableTypes = [\"file\", \"reset\", \"submit\", \"button\"];\r\n            var field, l, s = [];\r\n\r\n            if (typeof this === \"object\" && this.nodeName === \"FIELDSET\") {\r\n                var len = this.elements.length;\r\n\r\n                for (var i = 0; i < len; i += 1) {\r\n                    field = this.elements[i];\r\n\r\n                    if (!field.name || field.disabled || notSerializableTypes.includes(field.type)) {\r\n                        continue;\r\n                    }\r\n                    if (field.type === \"select-multiple\") {\r\n                        l = this.elements[i].options.length;\r\n\r\n                        for (var j = 0; j < l; j += 1) {\r\n                            if (field.options[j].selected) {\r\n                                s[s.length] =\r\n                                    encodeURIComponent(field.name) + \"=\" + encodeURIComponent(field.options[j].value);\r\n                            }\r\n                        }\r\n                    } else if ((field.type !== \"checkbox\" && field.type !== \"radio\") || field.checked) {\r\n                        s[s.length] = encodeURIComponent(field.name) +\r\n                            \"=\" +\r\n                            encodeURIComponent(field.value || field.checked);\r\n                    }\r\n                }\r\n            }\r\n            return s.join(\"&\").replace(/%20/g, \"+\");\r\n        };\r\n\r\n        var getAbsolutePathRequest = function(url) {\r\n            var siteUrl = siteRoot.slice(0, -1);\r\n            if (siteUrl && url.indexOf(siteUrl) >= 0 && url.indexOf(partnerUrl) < 0) {\r\n                url = url.replace(siteUrl, partnerUrl);\r\n            } else if (url.indexOf(partnerUrl) < 0) {\r\n                url = partnerUrl + url;\r\n            }\r\n            return url;\r\n    };\r\n\r\n    /**\r\n     * Will return the Javascript Object as query string (e.g ?property1=value1&property2=value2)\r\n     * @param {any} objectToConvert a Javascript Object that will follow the format of query string for each property.\r\n     */\r\n        var objectToQueryString = function (objectToConvert, baseQueryString) {\r\n            var keyValuePair = Object.entries(objectToConvert);\r\n            if (keyValuePair && keyValuePair.length > 0) {\r\n                for (var i = 0; i < keyValuePair.length; i++) {\r\n                    if (typeof keyValuePair[i][1] !== \"undefined\") {\r\n                        baseQueryString += encodeURIComponent(keyValuePair[i][0]) + \"=\" + encodeURIComponent(keyValuePair[i][1]) + \"&\";\r\n                    }\r\n                }\r\n            }\r\n            baseQueryString = baseQueryString.substring(0, baseQueryString.length - 1);\r\n            return baseQueryString;\r\n        }\r\n\r\n        /**\r\n         * Will return a string based on the object passed. It begins with ? as query string.\r\n         * @param {any} objectToConvert a Javascript Object that will follow the format of query string for each property.\r\n         */\r\n        var convertToQueryString = function(objectToConvert)\r\n        {\r\n            var queryString = \"?\";\r\n            if (objectToConvert) {\r\n                if (!Object.entries) {\r\n                    //Including the polyfills from NHS.\r\n                    require([\"domHelper\"], function(domHelper) {\r\n                        return objectToQueryString(objectToConvert, queryString);\r\n                    });\r\n                } else {\r\n                    return objectToQueryString(objectToConvert, queryString);\r\n                }\r\n            }\r\n            return objectToConvert;\r\n        }\r\n\r\n        /**\r\n         * @private\r\n         * getAcceptTypes: get the accept types header for Ajax request.\r\n         * \r\n         * @returns {@String} with the mime types supported.\r\n         */\r\n        function getAcceptTypes() {\r\n            if(browserAcceptTypes) {\r\n                return browserAcceptTypes;\r\n            }\r\n\r\n            browserAcceptTypes = localStorage.getItem('browserAcceptTypes');\r\n\r\n            return browserAcceptTypes || '*/*';\r\n        }\r\n\r\n        return {\r\n            getRequest: getRequest,\r\n            postRequest: postRequest,\r\n            request: request,\r\n            getAbsolutePathRequest: getAbsolutePathRequest,\r\n            convertToQueryString: convertToQueryString\r\n        };\r\n    });","/**\r\n * This module is a helper to be used on the lead actions to send on demand events to Ga / Segment\r\n * This will create the event object to be sent by retrieving the respective data-values from the event.target\r\n  */\r\n(function leadFormEventsHandler(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  const previousModule = global.NewHomeSource.LeadFormEventsHandler;\r\n\r\n  const basicLeadTopics = [\r\n    'IDoNotHaveAnAgent'\r\n  ];\r\n\r\n  /**\r\n   * @constructs NewHomeSource.LeadFormEventsHandler\r\n   */\r\n  function LeadFormEventsHandler() {\r\n  }\r\n\r\n  /**\r\n   * This method will invoke the custom event \"trackOnDemandEvent\" located on eventTracker.js\r\n   * Attach a given segment/ga event object.\r\n   * @param {object} event\r\n   */\r\n  function triggerOnDemandEvent(event) {\r\n    if (document.body.dispatchEvent) {\r\n      document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent',\r\n        {\r\n          detail: { data: event }\r\n        }));\r\n    }\r\n  }\r\n\r\n  /**\r\n   * This method will extract the lead topics from the data of the form.\r\n   * the object basicLeadTopics will contains a list of possible topics options.\r\n   * the formData will come in 2 different forms, as an object and as a FormData object.\r\n   * So if the info comes as a FormData, then it is parsed as an object to then extract the topics.\r\n   * @param {object} formData\r\n   */\r\n  function getLeadTopics(formData) {\r\n    var topics = '';\r\n\r\n    if (!formData) {\r\n      return topics;\r\n    }\r\n\r\n    if (formData instanceof FormData) {\r\n      var object = {};\r\n      formData.forEach(function (value, key) {\r\n        object[key] = value;\r\n      });\r\n      formData = object;\r\n    }\r\n\r\n    basicLeadTopics.forEach(item => {\r\n      if (formData.hasOwnProperty(item) && (formData[item] === true || formData[item] === 'true')) {\r\n        topics += (topics === '')\r\n          ? item\r\n          : ', '+item;\r\n      }\r\n    });\r\n    \r\n    return topics;\r\n  }\r\n\r\n  /**\r\n   * This method will extract the necessary properties for the event in the SRP.\r\n   */\r\n  function getProperties(event, eventForSegment) {\r\n    const commonProperties = document.querySelector('#data-commonProperties_' + event.target.dataset.card_id);\r\n    if (!commonProperties || !commonProperties.dataset) {\r\n      return eventForSegment;\r\n    }\r\n    const propertiesForSegment = Object.assign({}, eventForSegment, commonProperties.dataset);\r\n    return propertiesForSegment;\r\n  }\r\n\r\n  /**\r\n   * This method will built the event for segment object\r\n   * by retrieving the required data values when the lead is submitted.\r\n   * @param {object} event event element that triggered the action\r\n   */\r\n  function getSegmentEvent(event, formData) {\r\n    let segmentEventName = event.target.dataset.submittedEvent;\r\n    let segmentEventButtonAction = event.target.dataset.segmentEventButton_action;\r\n    let segmentRecipient = event.target.dataset.submittedRecipient;\r\n    let leadTopics = getLeadTopics(formData);\r\n    let eventForSegment = {\r\n      event: 'Lead Modal Form Submitted',\r\n      eventType: 'segmentEvent',\r\n      button_action: ''\r\n    };\r\n\r\n    if (event.target.dataset.card_id) {\r\n      eventForSegment = getProperties(event, eventForSegment);\r\n    }\r\n\r\n    if (segmentEventName) {\r\n      eventForSegment.event = segmentEventName;\r\n    }\r\n\r\n    if (segmentEventButtonAction) {\r\n      eventForSegment.button_action = segmentEventButtonAction;\r\n    }\r\n\r\n    if (segmentRecipient) {\r\n      eventForSegment.recipient = segmentRecipient;\r\n    }\r\n\r\n    if (leadTopics) {\r\n      eventForSegment.lead_form_topics = leadTopics;\r\n    }\r\n\r\n    if (event.target.dataset.builder) {\r\n      eventForSegment.builder_id = event.target.dataset.builder;\r\n    }\r\n\r\n    if (event.target.dataset.builderName) {\r\n      eventForSegment.builder_name = event.target.dataset.builderName;\r\n    }\r\n\r\n    if (event.target.dataset.community) {\r\n      eventForSegment.community_id = event.target.dataset.community;\r\n    }\r\n\r\n    return eventForSegment;\r\n  }\r\n\r\n  /**\r\n   * This method is called when the lead is already submitted, it calls a segmentEvent object to be built\r\n   * and pass the event object to the custom event call.\r\n   * @param {object} targetEvent event element that triggered the action.\r\n   */\r\n    document.body.addEventListener('sendLeadSubmittedSegmentEvent',\r\n      function (e) {\r\n      let eventForSegment = getSegmentEvent(e.detail.targetEvent, e.detail.formData);\r\n      triggerOnDemandEvent(eventForSegment);\r\n    });\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.LeadFormEventsHandler to the previous script.\r\n   */\r\n  LeadFormEventsHandler.noConflict = function noConflict() {\r\n    global.NewHomeSource.LeadFormEventsHandler = previousModule;\r\n    return LeadFormEventsHandler;\r\n  };\r\n\r\n  global.NewHomeSource.LeadFormEventsHandler = LeadFormEventsHandler;\r\n\r\n  return LeadFormEventsHandler;\r\n}(window));\r\n","/*\r\n SUMMARY:\r\n This module binds the events to the DOM elements, either mobile or desktop;\r\n for opening up the get pre approved modal\r\n*/\r\n(function getPreApprovedLoader(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  const configurationElement = global.document.querySelector('[data-component=\"getPreApprovedIframeInformation\"]');\r\n  const previousGetPreApprovedLoader = global.NewHomeSource.GetPreApprovedLoader;\r\n\r\n  if (!configurationElement) {\r\n    return;\r\n  }\r\n\r\n  const iframeConfiguration = JSON.parse(configurationElement.innerHTML);\r\n\r\n  /**\r\n  * @private\r\n  * bindGetPreApprovedFunction: binds the get pre approved elements with the respective JS handler.\r\n  */\r\n  function bindGetPreApprovedFunction() {\r\n    const getPreApprovedElement = document.querySelector('[data-get-pre-approved-link]');\r\n    if (!getPreApprovedElement) {\r\n      return;\r\n    }\r\n\r\n    const onClickFunction = function () {\r\n      const alreadyLoadedScript = document.getElementById('getPreApprovedModalPresenter');\r\n      iframeConfiguration.CloseElement = global.document\r\n        .querySelector('[data-component=\"close-button\"]').content.cloneNode(true);\r\n\r\n      if (global.define) {\r\n        global.require([iframeConfiguration.JavascriptHandler], function () {\r\n          window.NewHomeSource.IframePresenter.showModal(iframeConfiguration);\r\n        });\r\n      } else {\r\n\r\n        if (alreadyLoadedScript) {\r\n          window.NewHomeSource.IframePresenter.showModal(iframeConfiguration);\r\n          return;\r\n        }\r\n\r\n        if (!iframeConfiguration.JavascriptHandler) {\r\n          return;\r\n        }\r\n\r\n        NHS.loadJs(iframeConfiguration.JavascriptHandler, 'getPreApprovedModalPresenter', function () {\r\n          window.NewHomeSource.IframePresenter.showModal(iframeConfiguration);\r\n        });\r\n\r\n        delete iframeConfiguration['JavascriptHandler'];\r\n      }\r\n    }\r\n\r\n    getPreApprovedElement.addEventListener('click', onClickFunction);\r\n  };\r\n\r\n  /**\r\n   * @constructs NewHomeSource.GetPreApprovedLoader\r\n   */\r\n  function GetPreApprovedLoader() {\r\n    bindGetPreApprovedFunction();\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.GetPreApprovedLoader to the previous script.\r\n   */\r\n  GetPreApprovedLoader.noConflict = function noConflict() {\r\n    global.NewHomeSource.GetPreApprovedLoader = previousGetPreApprovedLoader;\r\n    return GetPreApprovedLoader;\r\n  };\r\n\r\n  global.NewHomeSource.GetPreApprovedLoader = GetPreApprovedLoader;\r\n  GetPreApprovedLoader();\r\n}(window));\r\n","/*\r\n * This scripts loads Google Maps and Fires a function that alerts anyone interested\r\n * in the event \"googleScriptLoadedAcknowledgement\" about google maps installed in\r\n * the window and ready to be used in whatever needed for particular modules waiting\r\n * for it existence.\r\n */\r\n(function googleMapsDownloader(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  const previousGoogleMapsDownloader = global.NewHomeSource.GoogleMapsDownloader;\r\n  const state = {\r\n    loaded: false,\r\n    loading: false\r\n  };\r\n\r\n  /**\r\n  * @public\r\n  *\r\n  * sendAckAboutGoogleScriptLoaded: alerts anyone interested about Google Maps loaded and\r\n  * ready to be used.\r\n  */\r\n  function sendAckAboutGoogleScriptLoaded() {\r\n    state.loaded = true;\r\n    state.loading = false;\r\n    document.body.dispatchEvent(new CustomEvent('googleScriptLoadedAcknowledgement'));\r\n  }\r\n\r\n  /**\r\n  * @private\r\n  *\r\n  * loadGoogleScript: loads Google Maps script\r\n  */\r\n  function loadGoogleScript() {\r\n    if (global.google && state.loaded) {\r\n      sendAckAboutGoogleScriptLoaded();\r\n      return;\r\n    }\r\n\r\n    if (state.loading) {\r\n      return;\r\n    }\r\n\r\n    if (global.define) {\r\n      state.loading = true;\r\n      require(['googlemaps!'], sendAckAboutGoogleScriptLoaded);\r\n      return;\r\n    }\r\n\r\n    const googleScript = global.document.querySelector('[data-maps-script]');\r\n\r\n    if (!googleScript) {\r\n      return;\r\n    }\r\n\r\n    state.loading = true;\r\n    googleScript.value += '&callback=sendAcknowledgmentAboutGoogleScriptLoaded';\r\n    global.NHS.loadJs(googleScript.value, 'nhs_GoogleMapScript', null);\r\n  }\r\n\r\n  /**\r\n   * @constructs NewHomeSource.GoogleMapsDownloader\r\n   */\r\n  function GoogleMapsDownloader() {\r\n    document.body.addEventListener('askForGoogleScript', () => {\r\n      if (global.google && state.loaded) {\r\n        sendAckAboutGoogleScriptLoaded();\r\n        return;\r\n      }\r\n\r\n      if (state.loading) {\r\n        return;\r\n      }\r\n\r\n      if (document.readyState === 'complete') {\r\n        loadGoogleScript();\r\n      } else {\r\n        window.addEventListener('load', loadGoogleScript);\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.GoogleMapsDownloader to the previous script.\r\n   */\r\n  GoogleMapsDownloader.noConflict = function noConflict() {\r\n    global.NewHomeSource.GoogleMapsDownloader = previousGoogleMapsDownloader;\r\n    return GoogleMapsDownloader;\r\n  };\r\n\r\n  global.sendAcknowledgmentAboutGoogleScriptLoaded = sendAckAboutGoogleScriptLoaded;\r\n  GoogleMapsDownloader();\r\n}(window));\r\n","(function fullImageViewerOpener(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  if (Object.hasOwnProperty.call(window, \"ActiveXObject\") && !window.ActiveXObject) {\r\n    return;\r\n  }\r\n\r\n  const previousFullImageViewerOpener = global.NewHomeSource.FullImageViewerOpener;\r\n  const template = document.querySelector('[data-component=\"full-image-viewer-template\"]');\r\n\r\n  /**\r\n   * @private\r\n   * generateHtml: creates the Full Image Viewer HTML and appends it to the DOM.\r\n   *\r\n   * @param {function} callback function to execute after the HTML has been appended.\r\n   */\r\n  function generateHtml(callback) {\r\n    global.NewHomeSource.ModalBackground.createBackground('rgba(0,0,0,.82)');\r\n    document.body.appendChild(template.content.cloneNode(true));\r\n\r\n    const container = global.document.querySelector('[data-component=\"full-image-viewer\"]');\r\n\r\n    if (container) {\r\n      container.focus({ preventScroll: true });\r\n    }\r\n\r\n    if (typeof callback === 'function') {\r\n      callback(callback.prototype);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * openFullImageViewer: creates the HTML needed to display the Full Image Viewer.\r\n   *\r\n   * @param {function} callback to execute after the HTML has been added to the DOM.\r\n   * @param {Event} event with the information associated to the opener event.\r\n   */\r\n  function openFullImageViewer(callback, event) {\r\n    event.preventDefault();\r\n    if (!template) {\r\n      return;\r\n    }\r\n\r\n    requestAnimationFrame(generateHtml.bind(this, callback));\r\n    event.target.setAttribute('data-full-image-viewer-trigger', 'true');\r\n  }\r\n\r\n  const eventsConfiguration = {\r\n    openEvent: {\r\n      callbacks: [],\r\n      events: ['click', 'touchend'],\r\n    },\r\n  };\r\n\r\n  /**\r\n  * @private\r\n  * registerLogInformation: register in the global object the information for loging events.\r\n  *\r\n  * @param {logger} object contains the logic in charge of logging events.\r\n  * @param {logInfo} object with the listing information necessary for log events.\r\n  */\r\n  function registerLogInformation(logger, logInfo) {\r\n    global.performanceLogger = logger;\r\n    global.logInfo = logInfo;\r\n  }\r\n\r\n  /**\r\n   * @constructs NewHomeSource.FullImageViewerOpener\r\n   *\r\n   * @param {object} options configurations to indicate how to open the Full Image Viewer.\r\n   */\r\n  function FullImageViewerOpener(options) {\r\n    this.FullImageViewerOpener.options = options || {};\r\n    eventsConfiguration.openEvent.elements = this.FullImageViewerOpener.options.selector;\r\n    eventsConfiguration.openEvent.callbacks.push(\r\n      openFullImageViewer.bind(null, options.favorites.setUpFullImageViewerSaveOption)\r\n    );\r\n    eventsConfiguration.openEvent.callbacks.push(registerLogInformation.bind(null,\r\n      options.performanceEvents, options.logInfo)\r\n    );\r\n    global.NewHomeSource.Event(eventsConfiguration);\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.FullImageViewerOpener to the previous script.\r\n   */\r\n  FullImageViewerOpener.noConflict = function noConflict() {\r\n    global.NewHomeSource.FullImageViewerOpener = previousFullImageViewerOpener;\r\n    return FullImageViewerOpener;\r\n  };\r\n\r\n  global.NewHomeSource.FullImageViewerOpener = FullImageViewerOpener;\r\n}(window));\r\n","/**\r\n * summary: Module to toggle elements in the dom when the displayed element is clicked\r\n * the event will be added to the document to set an event delegation\r\n * \r\n * Example hidden elements:\r\n        data-listing-MyElement\r\n\r\n * Example displayed element:\r\n        data-toggle-element=\"[data-listing-MyElement]\"\r\n *\r\n * Make sure to add some value to the hidden elements to show\r\n */\r\n(function elementToggler(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  global.NewHomeSource.ElementToggler = global.NewHomeSource.ElementToggler || {};\r\n  const previousElementTogglerModule = global.NewHomeSource.ElementToggler;\r\n\r\n  /**\r\n  * @constructs ElementToggler\r\n  */\r\n  function ElementToggler() {\r\n  }\r\n\r\n  /**\r\n  * @public\r\n  * SwitchElements: function to turn off the target element and turn on a hidden element\r\n  * @param {HTMLElement} target DOM Element\r\n  */\r\n  function ToggleElements(target) {\r\n    const elementsToShow = target && target.dataset.toggleElement\r\n      ? document.querySelectorAll(target.dataset.toggleElement)\r\n      : null;\r\n\r\n    if (elementsToShow && elementsToShow.length > 0) {\r\n      for (let i = 0; i < elementsToShow.length; i += 1) {\r\n        elementsToShow[i].removeAttribute('hidden');\r\n        const callForDetailSelector = `[data-toggle-element=\"${target.dataset.toggleElement}\"]`;\r\n        const callForDetailsButton = elementsToShow[i].parentElement.querySelector(callForDetailSelector);\r\n        callForDetailsButton.setAttribute('hidden', '');\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n  * @public\r\n  * SwitchButtonByText: set the listener to the event on the document element\r\n  */\r\n  ElementToggler.Init = function Init() {\r\n    document.addEventListener('click', (e) => {\r\n      ToggleElements(e.target);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.ElementToggler to the previous script.\r\n   */\r\n  ElementToggler.noConflict = function noConflict() {\r\n    global.NewHomeSource.ElementSwitcher = previousElementTogglerModule;\r\n    return ElementToggler;\r\n  };\r\n\r\n  global.NewHomeSource.ElementToggler = ElementToggler;\r\n\r\n  return ElementToggler;\r\n\r\n}(window));\r\n"," //Start AutoComplite\r\nNHS.Scripts.GoogleMapApi.prototype.initializeAutoComplete = function() {\r\n    var self = this;\r\n    var control;\r\n    if (self.options.Autocomplete.CreateControl) {\r\n        control = self.createControles();\r\n    } else {\r\n        control = document.getElementById(self.options.Autocomplete.Autocompletecontrol);\r\n    }\r\n\r\n\r\n    if (control) {\r\n        jQuery(control).on(\"paste\", function () {\r\n            return setTimeout(function () {\r\n                var field, val;\r\n                field = jQuery(control);\r\n                val = field.val();\r\n                field.focus();\r\n                field.val(val);\r\n                return field.focus();\r\n            }, 1);\r\n        });\r\n\r\n        var autocomplete = new google.maps.places.Autocomplete(control);\r\n\r\n        if (self.options.Autocomplete.CreateControl)\r\n            self.initializeAutoCompleteControles(autocomplete);\r\n        if (self.options.Autocomplete.BindToBound)\r\n            autocomplete.bindTo('bounds', self.map);\r\n\r\n        var marker = new google.maps.Marker({\r\n            map: self.map\r\n        });\r\n\r\n        google.maps.event.addListener(autocomplete, 'place_changed', function () {\r\n            self.placeChangedProcess(marker, autocomplete);\r\n        });\r\n    }\r\n};\r\n\r\nNHS.Scripts.GoogleMapApi.prototype.placeChangedProcess = function(marker, autocomplete) {\r\n    var self = this;\r\n    self.infowindow.close();\r\n    marker.setVisible(false);\r\n    var place = autocomplete.getPlace();\r\n    if (!place.geometry) {\r\n        return;\r\n    }\r\n\r\n    // If the place has a geometry, then present it on a map.\r\n    if (place.geometry.viewport) {\r\n        self.map.fitBounds(place.geometry.viewport);\r\n    } else {\r\n        self.map.setCenter(place.geometry.location);\r\n        self.map.setZoom(17); // Why 17? Because it looks good.\r\n    }\r\n\r\n    var icon = self.iconAutoComplite(place);\r\n    marker.setIcon(icon);\r\n    marker.setPosition(place.geometry.location);\r\n    marker.setVisible(true);\r\n\r\n    var address = '';\r\n    if (place.address_components) {\r\n        address = [\r\n            (place.address_components[0] && place.address_components[0].short_name || ''),\r\n            (place.address_components[1] && place.address_components[1].short_name || ''),\r\n            (place.address_components[2] && place.address_components[2].short_name || '')\r\n        ].join(' ');\r\n    }\r\n\r\n    self.infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address);\r\n    self.infowindow.open(self.map, marker);\r\n};\r\n\r\nNHS.Scripts.GoogleMapApi.prototype.iconAutoComplite = function(place) {\r\n    var icon = {\r\n        url: place.icon,\r\n        size: new google.maps.Size(71, 71),\r\n        origin: new google.maps.Point(0, 0),\r\n        anchor: new google.maps.Point(17, 34),\r\n        scaledSize: new google.maps.Size(35, 35)\r\n    };\r\n    return icon;\r\n};\r\n\r\nNHS.Scripts.GoogleMapApi.prototype.createControles = function() {\r\n    var self = this;\r\n    var map = document.getElementById(self.options.MapOptions.ContainerName);\r\n    var newNode = jQuery('<div><input id=\"pac-input\" class=\"controls\" type=\"text\" placeholder=\"Enter a location\" / >' +\r\n        '<div id=\"type-selector\" class=\"controls\">' +\r\n        '<input type=\"radio\" name=\"type\" id=\"changetype-all\" checked=\"checked\">' +\r\n        '<label for=\"changetype-all\">All</label>' +\r\n        '<input type=\"radio\" name=\"type\" id=\"changetype-establishment\">' +\r\n        '<label for=\"changetype-establishment\">Establishments</label>' +\r\n        '<input type=\"radio\" name=\"type\" id=\"changetype-geocode\">' +\r\n        '<label for=\"changetype-geocode\">Geocodes</label>' +\r\n        '</div></div>')[0];\r\n    map.parentNode.insertBefore(newNode, map.nextSibling);\r\n    return document.getElementById('pac-input');\r\n};\r\n\r\n    // Sets a listener on a radio button to change the filter type on Places\r\n    // Autocomplete.\r\nNHS.Scripts.GoogleMapApi.prototype.initializeAutoCompleteControles = function(autocomplete) {\r\n    var self = this;\r\n    jQuery(\"#changetype-all\").change(function() {\r\n        autocomplete.setTypes([]);\r\n    });\r\n\r\n    jQuery(\"#changetype-establishment\").change(function() {\r\n        autocomplete.setTypes(['establishment']);\r\n    });\r\n\r\n    jQuery(\"#changetype-geocode\").change(function() {\r\n        autocomplete.setTypes(['geocode']);\r\n    });\r\n    var input = document.getElementById('pac-input');\r\n    var types = document.getElementById('type-selector');\r\n    self.map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);\r\n    self.map.controls[google.maps.ControlPosition.TOP_LEFT].push(types);\r\n};","/**\r\n * Module to move by the scroll using arrows.\r\n *\r\n * Need to add the following attributes:\r\n * data-scroll: to the element scrolled\r\n * data-arrow-right: to the arrow right button\r\n * data-arrow-left: to the arrow left button\r\n * data-move-arrow: to the arrows with the number of pixels to be move.\r\n * data-element-scrolled: all elements that are inside the container\r\n * need to have the property to get the first and last element in the collection.\r\n */\r\n(function arrowHandler(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n  const isTouchScreen = Object.prototype.hasOwnProperty.call(global, 'ontouchstart');\r\n  const eventTrigger = isTouchScreen ? 'touchend' : 'click';\r\n\r\n  class ArrowHandler {\r\n    constructor(parameters) {\r\n      if (!parameters.container) {\r\n        return;\r\n      }\r\n      this.container = null;\r\n      this.arrowRight = null;\r\n      this.arrowLeft = null;\r\n      this.firstCollection = null;\r\n      this.lastCollection = null;\r\n      this.scrollElement = null;\r\n      this.move = 0;\r\n      this.limitRight = 0;\r\n      this.limitLeft = 0;\r\n      this.arrowsReference =\r\n        parameters.arrowReferenceSelector ? parameters.arrowReferenceSelector : '';\r\n      this.collectionsReference =\r\n        parameters.collectionsReferenceSelector ? parameters.collectionsReferenceSelector : '';\r\n      this.container = parameters.container;\r\n      this.arrowRight = this.container.querySelector(`${this.arrowsReference}[data-arrow-right]`);\r\n      this.arrowLeft = this.container.querySelector(`${this.arrowsReference}[data-arrow-left]`);\r\n      this.scrollElement = this.container.querySelector('[data-scroll]') || this.container;\r\n      this.firstCollection =\r\n        this.container.querySelector(`${this.collectionsReference}[data-element-scrolled]`);\r\n      this.lastCollection =\r\n        this.container.querySelector(`${this.collectionsReference}[data-element-scrolled]:last-child`);\r\n      if (!this.arrowRight || !this.arrowLeft || !this.scrollElement) {\r\n        return;\r\n      }\r\n\r\n      this.bindedCalculateMoveCallback = this.bindedCalculateMove.bind(this);\r\n      this.bindedOnChangeCallback = this.onChange.bind(this);\r\n\r\n      this.container.addEventListener(eventTrigger, this.bindedCalculateMoveCallback);\r\n      this.container.addEventListener('recalculateLimits', this.bindedOnChangeCallback);\r\n      global.addEventListener('orientationchange', this.bindedOnChangeCallback);\r\n      this.getLimits();\r\n      this.observeVisibility();\r\n    }\r\n\r\n    bindedCalculateMove(event) {\r\n      requestAnimationFrame(this.calculateMove.bind(this, event));\r\n    }\r\n\r\n    /** Used to show the arrows after a container is set as visible after being hidden */\r\n    observeVisibility() {\r\n      const observer = new IntersectionObserver((entries) => {\r\n        entries.forEach((entry) => {\r\n          if (entry.isIntersecting) {\r\n            this.showArrows();\r\n          }\r\n        });\r\n      });\r\n\r\n      observer.observe(this.container);\r\n    }\r\n\r\n    changeLimits() {\r\n      this.limitLeft = Math.floor(this.container.getBoundingClientRect().left);\r\n      this.limitRight = Math.floor(this.container.getBoundingClientRect().right);\r\n      this.showArrows();\r\n    }\r\n\r\n    getLimits() {\r\n      requestAnimationFrame(this.changeLimits.bind(this));\r\n    }\r\n\r\n    onChange() {\r\n      requestAnimationFrame(this.getLimits.bind(this));\r\n    }\r\n\r\n    showArrows() {\r\n      requestAnimationFrame(() => {\r\n        if (Math.floor(this.firstCollection.getBoundingClientRect().left) < this.limitLeft) {\r\n          this.arrowLeft.style.display = 'block';\r\n          this.container.classList.add('tab-shadow--left');\r\n        } else {\r\n          this.arrowLeft.style.display = 'none';\r\n          this.container.classList.remove('tab-shadow--left');\r\n        }\r\n\r\n        if (Math.floor(this.lastCollection.getBoundingClientRect().right) > this.limitRight) {\r\n          this.arrowRight.style.display = 'block';\r\n          this.container.classList.add('tab-shadow--right');\r\n        } else {\r\n          this.arrowRight.style.display = 'none';\r\n          this.container.classList.remove('tab-shadow--right');\r\n        }\r\n      });\r\n    }\r\n\r\n    calculateMove(event) {\r\n      this.limitLeft = Math.floor(this.container.getBoundingClientRect().left);\r\n      this.limitRight = Math.floor(this.container.getBoundingClientRect().right);\r\n      const element = event && event.target.closest(`${this.arrowsReference}[data-move-arrow]`);\r\n      if (element) {\r\n        this.move = +element.dataset.moveArrow;\r\n        this.scrollElement.scrollBy(this.move, 0);\r\n        const self = this;\r\n        requestAnimationFrame(() => {\r\n          self.showArrows(self);\r\n          const scrolledCarousels = this.container.querySelectorAll('[data-scroll]');\r\n\r\n          scrolledCarousels.forEach((scrolledCarousel) => {\r\n            if (scrolledCarousel && scrolledCarousel.parentElement) {\r\n              scrolledCarousel.parentElement.dispatchEvent(new Event('recalculateLimits'));\r\n            }\r\n          });\r\n        });\r\n      } else {\r\n        requestAnimationFrame(() => {\r\n          this.showArrows(this);\r\n        });\r\n      }\r\n    }\r\n\r\n    dispose() {\r\n      this.container.removeEventListener(eventTrigger, this.bindedCalculateMoveCallback);\r\n      this.container.removeEventListener('recalculateLimits', this.bindedOnChangeCallback);\r\n      global.removeEventListener('orientationchange', this.bindedOnChangeCallback);\r\n    }\r\n  }\r\n\r\n  global.NewHomeSource.Modules.ArrowHandler = ArrowHandler;\r\n}(window));\r\n","/**\r\n * Module to handle the scroll implemented for the Sticky Nav Bar.\r\n *\r\n * This functionality is in the Sticky Bar located in the detail pages, community detail for now.\r\n * Is the responsible to do the scroll at the Right or Left when you scroll down or up in the page.\r\n *\r\n */\r\n(function stickyBarScrollHandler(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  /*\r\n   * Dependencies as\r\n   * if (!global.NewHomeSource.MyDependency) {\r\n   *   return;\r\n   * }\r\n   */\r\n  const previousStickyBarScrollModule = global.NewHomeSource.stickyBarScrollHandler;\r\n\r\n  /**\r\n   * @constructs NewHomeSource.StickyBarScrollHandler\r\n   */\r\n  function StickyBarScrollHandler() {}\r\n\r\n  /**\r\n   * Scrolls the Sticky Bar when we scroll the page.\r\n   * @param {any} entry\r\n   */\r\n  StickyBarScrollHandler.moveStickyBarScroll = function moveStickyBarScroll(entry, element) {\r\n    const container = document.querySelector('div[data-sticky-bar]');\r\n\r\n    if (!container) {\r\n      return;\r\n    }\r\n\r\n    const scrollElement = container.querySelector('.bar__item-active');    \r\n    const rightPoint = container.getBoundingClientRect().right;\r\n    const scrollLeft = container.scrollLeft;\r\n\r\n    // Scroll to the active element.\r\n    if (scrollElement) {\r\n      const elementPoints = scrollElement.getBoundingClientRect();\r\n      const elementRight = elementPoints.right;\r\n      const elementWidth = elementPoints.width;\r\n\r\n      const value = elementRight - rightPoint + elementWidth + scrollLeft;\r\n      container.scrollTo({\r\n        left: value,\r\n        behavior: 'smooth',\r\n      });\r\n    }\r\n  };\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.StickyBarScrollHandler to the previous script.\r\n   */\r\n  StickyBarScrollHandler.noConflict = function noConflict() {\r\n    global.NewHomeSource.Modules.stickyBarScrollHandler = previousStickyBarScrollModule;\r\n    return StickyBarScrollHandler;\r\n  };\r\n\r\n  global.NewHomeSource.Modules.stickyBarScrollHandler = StickyBarScrollHandler;\r\n})(window);\r\n","(function stickyNavBarButton(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  const previousStickyNavBarButton = global.NewHomeSource.StickyNavBarButton;\r\n  const stickyNav = document.querySelector('[data-details-container] [data-sticky-nav-bar]');\r\n  const buttonCtaContainer = document.querySelector('[data-sticky-button-container]');\r\n  const barItems = document.querySelector('[sticky-bar-scroll]');\r\n  const containerItems = document.querySelector('[data-sticky-bar],[data-stickybar]');\r\n  const moveArrow = document.querySelector('[sticky-arrow-right]');\r\n\r\n  function observerStickyNavBar() {\r\n    const options = {\r\n      root: null,\r\n      rootMargin: '0%',\r\n      threshold: 0\r\n    };\r\n\r\n    const observer = new IntersectionObserver(((entries) => {\r\n      if (!entries[0].isIntersecting && entries[0].boundingClientRect.top <= 0) {\r\n        if (buttonCtaContainer) {\r\n          buttonCtaContainer.removeAttribute('hidden');\r\n        }\r\n        stickyNav.classList.add('nhs-u-sticky');\r\n\r\n        // Validations added to avoid issues in Plans/Specs Detail pages since\r\n        // the scroll functionality is not used there.\r\n        if (!barItems) {\r\n          return;\r\n        }\r\n\r\n        if (moveArrow) {\r\n          moveArrow.style.right = '194px';\r\n        }\r\n\r\n        if (moveArrow) {\r\n          moveArrow.style.right = '150px';\r\n        }\r\n\r\n        if (containerItems) {\r\n          containerItems.dispatchEvent(new Event('recalculateLimits'));\r\n          observer.unobserve(stickyNav);\r\n        }\r\n      }\r\n    }),\r\n    options\r\n    );\r\n    observer.observe(stickyNav);\r\n  }\r\n  /**\r\n   * @constructs NewHomeSource.StickyNavBarButton\r\n   */\r\n  function StickyNavBarButton() {\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.StickyNavBarButton to the previous script.\r\n   */\r\n  StickyNavBarButton.noConflict = function noConflict() {\r\n    global.NewHomeSource.StickyNavBarButton = previousStickyNavBarButton;\r\n    return StickyNavBarButton;\r\n  };\r\n  if (stickyNav !== null) {\r\n    observerStickyNavBar();\r\n  }\r\n  global.NewHomeSource.StickyNavBarButton = StickyNavBarButton;\r\n}(window));\r\n","(function availableLots(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  if (!global.NewHomeSource.Event ||\r\n    Object.hasOwnProperty.call(window, \"ActiveXObject\")\r\n    && !window.ActiveXObject) {\r\n    return;\r\n  }\r\n\r\n  const queryLotSectionOpeners = '[data-open-lot-gallery]';\r\n  const triggerButton = global.document.getElementById('nhs_map');\r\n\r\n  const eventsConfiguration = {\r\n    availableButton: {\r\n      callbacks: [global.NewHomeSource.Event.clickElement.bind(null, triggerButton)],\r\n      events: ['click', 'touchend'],\r\n      elements: queryLotSectionOpeners,\r\n    },\r\n  };\r\n\r\n  global.NewHomeSource.Event(eventsConfiguration);\r\n}(window));","(function MapsAndDirections(global) {\r\n  'use strict';\r\n\r\n  const directionsContainer = document.getElementById('nhs_DrivingDirections');\r\n  const mapSection = document.getElementById('nhs_MapsAndDirections');\r\n  const options = {\r\n    rootMargin: '100px 0px'\r\n  };\r\n\r\n  /**\r\n   * Initializes the CommuteCalculator module from the NewHomeSource global object.\r\n   */\r\n  function onCommuteCalculatorScriptLoad() {\r\n    global.NewHomeSource.CommuteCalculator.init();\r\n  }\r\n\r\n  /**\r\n   * Initializes a Google Maps autocomplete feature and loads a\r\n   * commute calculator script if available.\r\n   */\r\n  function initDrivingDirections() {\r\n    document.body.removeEventListener('googleScriptLoadedAcknowledgement', initDrivingDirections);\r\n    const commuteCalculatorScript = document.querySelector('#CommuteCalculatorBundlejs');\r\n    (() => new google.maps.places.Autocomplete(document.querySelector('#nhsTxtStreeAddress')))();\r\n\r\n    if (commuteCalculatorScript) {\r\n      global.NHS.loadJs(commuteCalculatorScript.value, 'nhs_CommuteCalculatorScript', onCommuteCalculatorScriptLoad);\r\n    }\r\n  }\r\n\r\n  /**\r\n  * loadGoogleMapsScript: Load GoogleMapsScript.\r\n  */\r\n  function loadScripts(entries, observer) {\r\n    for (let i = 0; i < entries.length; i += 1) {\r\n      const entry = entries[i];\r\n\r\n      if (entry.intersectionRatio > 0 && entry.isIntersecting) {\r\n        document.body.addEventListener('googleScriptLoadedAcknowledgement', initDrivingDirections);\r\n        document.body.dispatchEvent(new CustomEvent('askForGoogleScript'));\r\n        observer.unobserve(mapSection);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * trackDrivingDirectionEvent: tracks the click event for the driving direction button.\r\n   * @param {string} drivingDirectionStatus the string with the status value that the driving direction button has.\r\n   */\r\n  function trackDrivingDirectionEvent(drivingDirectionStatus) {\r\n    const googleAnalyticsEvent = {\r\n      eventType: 'GA4Event',\r\n      eventName: 'driving_directions',\r\n      params: {\r\n        click_target: drivingDirectionStatus,\r\n        event_type: 'TDV Events',\r\n        currency: 'USD',\r\n        value: 4\r\n      }\r\n    };\r\n    document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n      detail: { data: googleAnalyticsEvent }\r\n    }));\r\n  }\r\n\r\n  if (directionsContainer) {\r\n    directionsContainer.addEventListener('click',\r\n      function (event) {\r\n        if (event.target.id === 'showDrivingDirections' || event.target.closest('#showDrivingDirections')) {\r\n          const elementsToDisplay = document.querySelectorAll('#map_directions,#hideDrivingDirections');\r\n          const drivingDirectionStatusForEvent = 'view driving directions';\r\n          trackDrivingDirectionEvent(drivingDirectionStatusForEvent);\r\n\r\n          for (let i = 0; i < elementsToDisplay.length; i++) {\r\n            let element = elementsToDisplay[i];\r\n\r\n            element.removeAttribute('hidden');\r\n          }\r\n\r\n          const showDirections = document.getElementById('showDrivingDirections');\r\n\r\n          if (showDirections) {\r\n            showDirections.setAttribute('hidden', '');\r\n          }\r\n        } else if (event.target.id === 'hideDrivingDirections' || event.target.closest('#hideDrivingDirections')) {\r\n          const elementsToHide = document.querySelectorAll('#map_directions, #hideDrivingDirections');\r\n          const drivingDirectionStatusForEvent = 'hide driving directions';\r\n          trackDrivingDirectionEvent(drivingDirectionStatusForEvent);\r\n\r\n          for (let i = 0; i < elementsToHide.length; i++) {\r\n            const element = elementsToHide[i];\r\n            element.setAttribute('hidden', '');\r\n          }\r\n\r\n          const showDirections = document.getElementById('showDrivingDirections');\r\n\r\n          if (showDirections) {\r\n            showDirections.removeAttribute('hidden');\r\n          }\r\n        }\r\n      });\r\n  }\r\n\r\n  const observer = new IntersectionObserver(loadScripts, options);\r\n\r\n  if (mapSection) {\r\n    observer.observe(mapSection);\r\n  }\r\n\r\n  /**\r\n   * Switches the title for the address section\r\n   * @param {Event} event\r\n   */\r\n  function switchTitle(event) {\r\n    let target = event.target;\r\n    let title = target.dataset.title;\r\n\r\n    let titleContainer = document.querySelector('[data-location-title]');\r\n\r\n    if (titleContainer && title) {\r\n      titleContainer.textContent = title;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * A generic function that can be used to switch between\r\n   * multiple elements, using a data-type attribute\r\n   * @param {Array} elements\r\n   * @param {String} attribute\r\n   */\r\n  function switchElements(elements, attribute) {\r\n    elements.forEach(function (element) {\r\n      if (element.dataset.type === attribute) {\r\n        element.removeAttribute('hidden');\r\n      } else {\r\n        element.setAttribute('hidden', '');\r\n      }\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Used to recalculate all routes\r\n   */\r\n  function recalculateRoutes() {\r\n    if (global.NewHomeSource && global.NewHomeSource.CommuteCalculator) {\r\n      global.NewHomeSource.CommuteCalculator.recalculateRoutes();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Switches the active tab\r\n   * @param {Event} event\r\n   */\r\n  function switchActive(event) {\r\n    const currentActive = document.querySelector('[data-map-label][data-active]');\r\n    currentActive.classList.remove('nhs-c-button--tap-light-active');\r\n    currentActive.removeAttribute('data-active');\r\n\r\n    const newActive = event.target;\r\n    newActive.classList.add('nhs-c-button--tap-light-active');\r\n    newActive.setAttribute('data-active', '');\r\n  }\r\n\r\n  /**\r\n   * Switches the address, in the address section\r\n   * @param {Event} event\r\n   */\r\n  function switchAddress(event) {\r\n    let address = event.target.dataset.type;\r\n    let directions = document.querySelectorAll('[data-map-address]');\r\n    switchElements(directions, address);\r\n  }\r\n\r\n  /**\r\n   * Switches the whole content section in the maps and directions section\r\n   * @param {Event} event\r\n   */\r\n  function switchContent(event) {\r\n    let showMap = event.target.dataset.displayMap === 'true';\r\n    let container = document.querySelector('#nhs_PropertyMap');\r\n\r\n    if (!showMap) {\r\n      container.setAttribute('hidden', '');\r\n    } else {\r\n      container.removeAttribute('hidden');\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Switches between the community and sales office static maps\r\n   * @param {any} event\r\n   */\r\n  function switchStaticMap(event) {\r\n    let type = event.target.dataset.type;\r\n    let maps = document.querySelectorAll('[data-static-map]');\r\n\r\n    switchElements(maps, type);\r\n  }\r\n\r\n  const salesOfficeTabExists = !!document.querySelector('button[data-type=\"sales-office\"]');\r\n\r\n  const builderMapButton = document.querySelector('#builderMap');\r\n  const builderMap = document.querySelector('[data-map=\"builder\"]');\r\n\r\n  const labels = document.querySelectorAll('#nhs_MapTabs [data-map-label]');\r\n\r\n  labels.forEach(function (label) {\r\n    label.addEventListener('click', function (event) {\r\n      switchActive(event);\r\n      switchContent(event);\r\n      recalculateRoutes();\r\n\r\n      if (salesOfficeTabExists) {\r\n        switchTitle(event);\r\n        switchAddress(event);\r\n        switchStaticMap(event);\r\n      }\r\n\r\n      if (builderMapButton) {\r\n        if (event.target === builderMapButton) {\r\n          builderMap.removeAttribute('hidden');\r\n        }\r\n        else {\r\n          builderMap.setAttribute('hidden', '');\r\n        }\r\n      }\r\n    });\r\n  });\r\n}(window));\r\n","/*\r\n * Basic contact modal is in charge of all the process of\r\n * validating and sending the basic contact form to the server.\r\n * Additionally, it loads correctly the modals that should be\r\n * loaded after sending the form.\r\n * This file requires VMasker and formValidator to work properly.\r\n */\r\n(function basicContactModal(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  if (!global.VMasker || !global.formValidator) {\r\n    return;\r\n  }\r\n\r\n  const previousBasicContactModal = global.NewHomeSource.BasicContactModal;\r\n\r\n  /**\r\n   * @constructs NewHomeSource.BasicContactModal\r\n   */\r\n  function BasicContactModal() {\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * CheckPhoneMask: Checks the phone input is following the mask pattern.\r\n   */\r\n  function CheckPhoneMask(phoneInput) {\r\n    global.VMasker(phoneInput).maskPattern('(999) 999-9999');\r\n  }\r\n\r\n  /**\r\n   * CloseError: Manages the closing of the error message on screen.\r\n   * @param {Object} event result of the click on the page.\r\n   */\r\n  function CloseError(event) {\r\n    const target = event.target;\r\n    target.textContent = '';\r\n    target.classList.remove('basic-summary-errors');\r\n  }\r\n\r\n  /**\r\n   * This method will extract the necessary properties for the event in the SRP.\r\n   */\r\n  function getProperties(event, eventForSegment) {\r\n    const commonProperties = document.querySelector('#data-commonProperties_' + event.dataset.card_id);\r\n    if (!commonProperties || !commonProperties.dataset) {\r\n      return eventForSegment;\r\n    }\r\n    const propertiesForSegment = Object.assign({}, eventForSegment, commonProperties.dataset);\r\n    return propertiesForSegment;\r\n  }\r\n\r\n  /**\r\n   * Returns a command object to be used to get the recommended communities.\r\n   * @param {FormData} data - The form data containing the necessary fields.\r\n   * @returns {Object} - The recommended command object.\r\n   */\r\n  function getRecommendedCommunitiesCommand(data) {\r\n    const planId = Number(data.get('PlanId'));\r\n    const specId = Number(data.get('SpecId'));\r\n    const listingId = Number(data.get('ListingId'));\r\n    const communityId = Number(data.get('CommunityId'));\r\n    const mailAddress = data.get('MailAddress') || data.get('email');\r\n    const leadType = data.get('Type');\r\n\r\n    const command = {\r\n      CommunityId: communityId,\r\n      ListingId: listingId,\r\n      MailAddress: mailAddress,\r\n      Type: leadType,\r\n    };\r\n\r\n    if (specId) {\r\n      command.SpecId = specId;\r\n    } else if (planId) {\r\n      command.PlanId = planId;\r\n    }\r\n\r\n    return command;\r\n  }\r\n\r\n  /**\r\n   * Retrieves recommended communities based on the provided data.\r\n   * @param {Object} data - The data used to generate the recommended communities.\r\n   * @returns {Promise<string>} - A promise that resolves with the recommended communities.\r\n   */\r\n  async function getRecommendedCommunities(data) {\r\n    const recommendedCommand = getRecommendedCommunitiesCommand(data);\r\n\r\n    const recommended = await fetch('/ajax/leads/getrecommendedcommunities', {\r\n      method: 'POST',\r\n      credentials: 'include',\r\n      body: JSON.stringify({\r\n        leadCommand: {\r\n          ...recommendedCommand,\r\n        },\r\n      }),\r\n      headers: {\r\n        'Content-Type': 'application/json',\r\n      },\r\n    }).then((response) => response.text());\r\n\r\n    return recommended;\r\n  }\r\n\r\n  /**\r\n   * Shows the recommendations modal.\r\n   * @param {string} recommended - The recommended content to display in the modal.\r\n   * @param {HTMLElement} basicForm - The basic form element that triggered the lead.\r\n   */\r\n  function showRecomendationsModal(recommended, basicForm) {\r\n    const modalExists = document.getElementById('#modal-content');\r\n\r\n    if (!modalExists) {\r\n      const templateElement = document.querySelector('[data-recommendations-template]');\r\n      const template = document.createRange().createContextualFragment(templateElement.innerHTML);\r\n\r\n      if (window.NewHomeSource.ModalLoader) {\r\n        window.NewHomeSource.ModalLoader.createModal(template);\r\n      }\r\n    } else {\r\n      const formContainer = basicForm.closest('.basic__form-wrapper');\r\n      formContainer.setAttribute('hidden', 'hidden');\r\n    }\r\n\r\n    if (recommended !== '') {\r\n      // if the lead was requested from the on-page brochure, create the modal.\r\n\r\n      const recommendationsModal = document.getElementById('nhs_BasicModalRecommendations');\r\n      const container = recommendationsModal.querySelector('.recommendations__container');\r\n      const submitButton = basicForm.querySelector('[data-submit-form]');\r\n\r\n      recommendationsModal.removeAttribute('hidden');\r\n      container.innerHTML = recommended;\r\n      document.body.dispatchEvent(new CustomEvent('recommededModalReady', {\r\n        detail: {\r\n          modal: recommendationsModal\r\n        }\r\n      }));\r\n\r\n      const ga4Event = {\r\n        eventName: 'direc_section_view',\r\n        eventType: 'GA4Event',\r\n        params: {\r\n          position: submitButton.dataset.ga4IdentityPosition,\r\n          button_name: submitButton.dataset.ga4IdentityButton_name,\r\n        }\r\n      };\r\n\r\n      document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n        detail: {\r\n          data: ga4Event,\r\n        }\r\n      }));\r\n    } else {\r\n      // emit a custom event to show the thank you modal\r\n      document.body.dispatchEvent(new CustomEvent('showThankYouModal'));\r\n    }\r\n\r\n    const modalBackground = document.querySelector('.modal_background');\r\n    modalBackground.classList.add('modal__background-dark');\r\n\r\n    const modalContainer = document.querySelector('#modal-content');\r\n    modalContainer.classList.add('modal__container--recommendations');\r\n  }\r\n\r\n  /**\r\n   * Toggles the visibility of a modal element by adding or removing the 'hidden' attribute.\r\n   * @param {HTMLElement} modal - The modal element to toggle.\r\n   */\r\n  function toggleModal(modal) {\r\n    modal.toggleAttribute('hidden');\r\n  }\r\n\r\n  /**\r\n   * Gets an array with the recommended communities information selected by the user.\r\n   * @param {Object} formData with the form inputs to be submited.\r\n   */\r\n  function getSelectedRecommendedCommunities() {\r\n    return Array.from(document.querySelectorAll('[data-recommendation-check]'))\r\n      .filter((recommendation) => recommendation.checked)\r\n      .map((recommendation) => JSON.parse(recommendation.value));\r\n  }\r\n\r\n  /**\r\n   *\r\n   * Validates if there's at least 1 recommendation selected. If that's not the case,\r\n   * disables the brochure button.\r\n   */\r\n  function onRecommendationChecked() {\r\n    const submitButton = document.querySelector('[data-recommended-button]');\r\n    const checkedRecos = document.querySelectorAll('[data-recommendation-check]:checked');\r\n    if (checkedRecos.length === 0) {\r\n      submitButton.disabled = true;\r\n      return;\r\n    }\r\n\r\n    submitButton.disabled = false;\r\n  }\r\n\r\n  /**\r\n   * Returns a command object to be used to get the recommended communities.\r\n   * @param {FormData} data - The form data containing the necessary fields.\r\n   * @returns {Object} - The recommended command object.\r\n   */\r\n  function getRecommendedCommunitiesSubmissionCommand(data) {\r\n    const name = data.get('Name') || '';\r\n    const firstName = name.split(' ')[0] || '';\r\n    const lastName = name.split(' ')[1] || '';\r\n    const recoComms = getSelectedRecommendedCommunities();\r\n\r\n    return {\r\n      CommunityId: data.get('CommunityId'),\r\n      FromPage: data.get('FromPage'),\r\n      Zip: data.get('ZipCode'),\r\n      Phone: data.get('UserPhoneNumber'),\r\n      BuilderId: data.get('BuilderId'),\r\n      Email: data.get('MailAddress') || data.get('email') || '',\r\n      MarketId: data.get('MarketId'),\r\n      Type: 'postCommunityBrochureBasic',\r\n      FirstName: firstName,\r\n      LastName: lastName,\r\n      RecoComms: recoComms,\r\n    };\r\n  }\r\n\r\n  /**\r\n   * The function dispatches a custom event named 'onRecommendationSend' with the form data as detail.\r\n   * @param form - The `form` parameter in the `dispatchOnRecommendationSend` function is an object\r\n   * that contains data related to a form.\r\n   */\r\n  function dispatchOnRecommendationSend(form) {\r\n    document.body.dispatchEvent(new CustomEvent('onRecommendationSend', {\r\n      detail: { form }\r\n    }));\r\n  }\r\n\r\n  /**\r\n   * Attaches event listeners to the recommendations modal.\r\n   * @function\r\n   * @returns {void}\r\n   */\r\n  function bindEvents(data) {\r\n    const recommendationsModal = document.querySelector('[data-basic-recommendations-modal]');\r\n    const inputRecommended = recommendationsModal.querySelector('[data-direct-lead-recommendation]');\r\n\r\n    const skipButton = recommendationsModal.querySelector('[data-skip-button]');\r\n    skipButton.setAttribute('data-ga4-event-position', data.get('GenerateLeadFrom'));\r\n    skipButton.setAttribute('data-ga4-event-button_name', data.get('ButtonNameSource'));\r\n    skipButton.addEventListener('click', () => {\r\n      // hide the recommendations modal\r\n      toggleModal(recommendationsModal);\r\n\r\n      // emit a custom event to show the thank you modal\r\n      document.body.dispatchEvent(new CustomEvent('showThankYouModal'));\r\n    });\r\n\r\n    const closeButton = recommendationsModal.querySelector('[data-modal-close-element]');\r\n    closeButton.setAttribute('data-ga4-event-position', data.get('GenerateLeadFrom'));\r\n    closeButton.setAttribute('data-ga4-event-button_name', data.get('ButtonNameSource'));\r\n\r\n    const recommendedElements = document.querySelectorAll('[data-recommendation-check]');\r\n    recommendedElements.forEach((elem) => elem.addEventListener('click', onRecommendationChecked.bind(data)));\r\n\r\n    if (inputRecommended) {\r\n      inputRecommended.setAttribute('data-ga4-position', data.get('GenerateLeadFrom'));\r\n      inputRecommended.setAttribute('data-ga4-org_button_name', data.get('ButtonNameSource'));\r\n    }\r\n\r\n    const submitButton = recommendationsModal.querySelector('[data-recommended-button]');\r\n    submitButton.addEventListener('click', async () => {\r\n      const recommendationsSubmissionCommand = getRecommendedCommunitiesSubmissionCommand(data);\r\n\r\n      // hide the recommendations modal\r\n      toggleModal(recommendationsModal);\r\n\r\n      // emit a custom event to show the thank you modal\r\n      document.body.dispatchEvent(new CustomEvent('showThankYouModal'));\r\n      const communititesChecked = getSelectedRecommendedCommunities();\r\n      communititesChecked.forEach(dispatchOnRecommendationSend.bind(null, recommendationsModal));\r\n\r\n      // we use a shoot and forget request to send the recommended lead data to the server\r\n      fetch('/ajax/leads/recommendedcommunitysubmission/', {\r\n        method: 'POST',\r\n        body: JSON.stringify({\r\n          ...recommendationsSubmissionCommand,\r\n        }),\r\n        headers: {\r\n          'Content-Type': 'application/json',\r\n        },\r\n      });\r\n    });\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * handleBasicForm: Sends the basic form information.\r\n   * @param {object} event result of the click on the page.\r\n   */\r\n  async function handleBasicForm(basicForm) {\r\n    // lazy load the modals bundle.\r\n    const bundle = document.querySelector('#basicModalsBundle').value;\r\n\r\n    if (bundle && window.NHS && window.NHS.loadCss) {\r\n      window.NHS.loadCss(bundle);\r\n    }\r\n\r\n    if (global.formValidator.validateForm(basicForm)) {\r\n      const submitButton = basicForm.querySelector('[data-submit-form]');\r\n      submitButton.setAttribute('disabled', 'disabled');\r\n\r\n      const data = new FormData(basicForm);\r\n\r\n      // we use a shoot and forget request to send the lead data to the server\r\n      fetch(basicForm.action, {\r\n        method: 'POST',\r\n        body: data\r\n      });\r\n\r\n      const recommended = await getRecommendedCommunities(data);\r\n      data.append('GenerateLeadFrom', submitButton.dataset.ga4IdentityPosition);\r\n      data.append('ButtonNameSource', submitButton.dataset.ga4IdentityButton_name);\r\n      showRecomendationsModal(recommended, basicForm);\r\n      bindEvents(data);\r\n\r\n      // allow users to submit the form again if possible.\r\n      submitButton.removeAttribute('disabled');\r\n\r\n      let eventForSegment = {\r\n        event: 'Lead Modal Form Submitted',\r\n        eventType: 'segmentEvent',\r\n        button_action: submitButton.dataset.button_action,\r\n        community_id: submitButton.dataset.community,\r\n      };\r\n\r\n      if (submitButton.dataset.card_id) {\r\n        eventForSegment = getProperties(submitButton, eventForSegment);\r\n      }\r\n\r\n      document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n        detail: { data: eventForSegment }\r\n      }));\r\n\r\n      const sentErrorElement = document.querySelector('[data-sent-error-message]');\r\n      if (sentErrorElement) {\r\n        sentErrorElement.textContent = sentErrorElement.getAttribute('data-sent-error-message');\r\n        sentErrorElement.classList.add('basic-summary-errors');\r\n        submitButton.removeAttribute('disabled');\r\n        sentErrorElement.addEventListener('click', CloseError);\r\n      }\r\n\r\n      // reset the modal loader flag to prevent the recommendations or thank you modal from being loaded again.\r\n      // we need to reset the flag here to allow the form to be refetched from the backend.\r\n      if (window.NewHomeSource.ModalLoader) {\r\n        window.NewHomeSource.ModalLoader.resetIsModalLoadedFlag();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * sendBasicLead: function to send any basic lead.\r\n   * @param {Event} event The click or touch event.\r\n  */\r\n  function sendBasicLead(event) {\r\n    event.preventDefault();\r\n    if (!global.NewHomeSource.TrustedForm) {\r\n      return;\r\n    }\r\n    const form = event.target.closest('[data-form]') || document.querySelector('[data-form]');\r\n    const validations = form ? global.formValidator.validateForm(form) : false;\r\n\r\n    if (validations) {\r\n      const functionToPerform = handleBasicForm;\r\n\r\n      global.NewHomeSource.TrustedForm.load(() => {\r\n        functionToPerform(form);\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * SubmitButtonClicked: tracks the click event when form submit button is clicked.\r\n   * @param {object} event result of the click on the page.\r\n   */\r\n  function SubmitButtonClicked(event) {\r\n    if (event.target && event.target.dataset.submitForm !== undefined) {\r\n      CheckPhoneMask(event.target.form.querySelector('[data-phone-input]'));\r\n      sendBasicLead(event);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * HandleClicksEvent: Checks the click event on the document body and executes its respective method.\r\n   * @param {object} event result of the click on the page.\r\n   */\r\n  function HandleClicksEvent(event) {\r\n    if (event.target && event.target.dataset.submitForm !== undefined) {\r\n      SubmitButtonClicked(event);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @private\r\n   * HandleFocusInEvent: Checks the focus in events on the document body and executes its respective method.\r\n   * @param {object} event result of the click on the page.\r\n   */\r\n  function HandleFocusInEvent(event) {\r\n    if (event.target && event.target.getAttribute('name') === 'UserPhoneNumber') {\r\n      CheckPhoneMask(event.target);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.BasicContactModal to the previous script.\r\n   */\r\n  BasicContactModal.noConflict = function noConflict() {\r\n    global.NewHomeSource.BasicContactModal = previousBasicContactModal;\r\n    return BasicContactModal;\r\n  };\r\n\r\n  global.NewHomeSource.BasicContactModal = BasicContactModal;\r\n  document.body.addEventListener('click', HandleClicksEvent);\r\n  document.body.addEventListener('focusin', HandleFocusInEvent);\r\n}(window));\r\n","(function basicThankYouModal() {\r\n  'use strict';\r\n\r\n  /**\r\n   * Toggles the visibility of a modal element by adding or removing the 'hidden' attribute.\r\n   * @param {HTMLElement} modal - The modal element to toggle.\r\n   */\r\n  function toggleModal(modal) {\r\n    modal.toggleAttribute('hidden');\r\n  }\r\n\r\n  /**\r\n   * Attaches events to the thank you modal element.\r\n   * @function\r\n   * @returns {void}\r\n   */\r\n  function bindEvents() {\r\n    const thankYouModal = document.querySelector('[data-basic-thank-you-modal]');\r\n    const createAccountButton = thankYouModal.querySelector('[data-create-account]');\r\n\r\n    if (createAccountButton) {\r\n      // if the user clicks the create account button, trigger the Auth0 sign in.\r\n      createAccountButton.addEventListener('click', () => {\r\n        if (window.auth0Dom) {\r\n          window.auth0Dom.signIn();\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Shows the thank you modal and binds its events.\r\n   */\r\n  function showThankYouModal() {\r\n    const thankYouModal = document.querySelector('[data-basic-thank-you-modal]');\r\n\r\n    bindEvents();\r\n    toggleModal(thankYouModal);\r\n  }\r\n\r\n  document.body.addEventListener('showThankYouModal', showThankYouModal);\r\n}());\r\n","NHS.Scripts.CommunityResults.MapPopup = function (parameters) {\r\n    this.parameters = parameters;\r\n};\r\n\r\nNHS.Scripts.CommunityResults.MapPopup.prototype = {\r\n    init: function () {\r\n        var self = this;\r\n        var mapOptions = this.parameters.OptionsForMap;\r\n        var googleApi = new NHS.Scripts.GoogleMapApi(mapOptions);\r\n\r\n        googleApi.getIconMarkerPoint = function (results, result) {\r\n            return self.parameters.icon;\r\n        };\r\n\r\n        googleApi.createMap();\r\n        googleApi.options.Events.OnMarkersCreate = function (info, infowindow, marker) {\r\n            infowindow.setContent(self.GetHtmlPoints(info));\r\n            infowindow.open(googleApi.map, marker);\r\n        };\r\n\r\n        var point = [{\r\n            Latitude: self.parameters.latitude,\r\n            Longitude: self.parameters.longitude,\r\n            Name: self.parameters.communityName,\r\n            PriceRange: self.parameters.priceRange\r\n        }];\r\n\r\n        googleApi.options.Events.MarkerClickCallBack = function (info, infowindow, infowindowTooltip, marker) {\r\n            infowindow.setContent(self.GetHtmlPoints(info));\r\n            infowindow.open(googleApi.map, marker);\r\n        };\r\n\r\n        google.maps.event.addListener(googleApi.map, 'idle', self.RemoveGoogleInfo);\r\n        googleApi.processResult(point);\r\n    },\r\n\r\n    GetHtmlPoints: function (info) {\r\n        var html = \"<div class=\\\"nhs_MapHoverCard\\\"><a class=\\\"nhs_commDetail\\\" target='_top' href='\" + this.parameters.url + \"'\\\">\";\r\n        html += \"<h2>\" + info.Name + \"</h2><p class=\\\"nhs_Price\\\">\" + info.PriceRange + \"</p>\";\r\n        html += \"</a></div>\";\r\n        return html;\r\n    },\r\n\r\n    RemoveGoogleInfo: function () {\r\n            if (jQuery(\".gm-style > div > a\").attr(\"href\")) {\r\n                var aux;\r\n                var len = jQuery('.gm-style-cc').length;\r\n                for (aux = 1; aux < len; aux += 1) {\r\n                    jQuery('.gm-style-cc').eq('-1').remove();\r\n                }\r\n                jQuery(\".gm-style > div > a\").removeAttr(\"href\").removeAttr(\"title\");\r\n            }\r\n    }\r\n};","// The purpose of this module is to handle the builder filters in the\r\n// Homes and Plans section for MPC\r\n\r\n(function builderFiltersHandler(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n  const previousModule = global.NewHomeSource.BuilderFiltersHandler;\r\n\r\n  const homesContainer = document.querySelector('[data-homes-container]');\r\n\r\n  /**\r\n   * @constructs NewHomeSource.MpcEventsHelper\r\n   */\r\n  function BuilderFiltersHandler() {\r\n  }\r\n\r\n  /**\r\n   * Converts a nodeList to array type in order to use\r\n   * array.prototype.forEach instead of nodeList.prototype.foreach\r\n   * @param {nodeList} nodeList A nodeList\r\n   * @returns {array} The nodeList converted to array\r\n   */\r\n  function nodeListToArray(nodeList) {\r\n    return Array.prototype.slice.call(nodeList);\r\n  }\r\n\r\n  /**\r\n   * Gets a list of the builder ids selected as filters.\r\n   * If no filters was selected, returns all builder ids, since we want to display all results in that case.\r\n   */\r\n  function getSelectedBuilderFilterIds() {\r\n    let selectedBuilderIds = [];\r\n    const builderFilters = document.querySelectorAll('[data-builder-filter]');\r\n\r\n    if (builderFilters) {\r\n      const selectedBuilders = document.querySelectorAll('[data-builder-filter]:checked');\r\n      let filterElements;\r\n\r\n      if (selectedBuilders.length === 0) {\r\n        filterElements = builderFilters;\r\n      } else {\r\n        filterElements = selectedBuilders;\r\n      }\r\n\r\n      for (let i = 0; i < filterElements.length; i += 1) {\r\n        selectedBuilderIds.push(filterElements[i].getAttribute('data-builder-id'));\r\n      }\r\n    }\r\n\r\n    return selectedBuilderIds;\r\n  }\r\n\r\n  /**\r\n   * Display or hides the home cards depending if the filter active or not.\r\n   * @param {any} event\r\n   */\r\n  function filterHomesByBuilder() {\r\n    const selectedBuilderFilterIds = getSelectedBuilderFilterIds();\r\n    let allHomeCards = document.querySelectorAll('[data-home-section-item]');\r\n    allHomeCards = nodeListToArray(allHomeCards);\r\n\r\n    allHomeCards.forEach(function (element) {\r\n      if (selectedBuilderFilterIds.indexOf(element.getAttribute('data-builder-id')) > -1) {\r\n        element.style.display = 'block';\r\n      } else {\r\n        element.style.display = 'none';\r\n      }\r\n    });\r\n  }\r\n  \r\n  /**\r\n   * Updates the counters in the tabs after applying a builder filter.\r\n   */\r\n  function updateFilterTabs() {\r\n    let tabFilterContainers = document.querySelectorAll('[data-tab-filter]');\r\n    tabFilterContainers = nodeListToArray(tabFilterContainers);\r\n\r\n    tabFilterContainers.forEach(function (element) {\r\n      const customFilterValue = element.getAttribute('data-custom-filter-type');\r\n      const homeStatusFilter = element.getAttribute('data-home-status-type');\r\n      const tabLabel = element.querySelector('label');\r\n      const tabInput = element.querySelector('input');\r\n      let homesByTypeCount = '';\r\n\r\n      if (customFilterValue === 'all') {\r\n        homesByTypeCount = document.querySelectorAll('[data-home-section-item][style=\"display: block;\"]').length;\r\n      }\r\n      else if (customFilterValue === 'luxury') {\r\n        homesByTypeCount = homesContainer.querySelectorAll('[data-luxury=\"1\"][style=\"display: block;\"]').length;\r\n      }\r\n      else if (customFilterValue === 'matching-home') {\r\n        homesByTypeCount = homesContainer.querySelectorAll('[data-is-matching-home=\"true\"][style=\"display: block;\"]').length;\r\n      }\r\n      else if (homeStatusFilter) {\r\n        homesByTypeCount = homesContainer.querySelectorAll('[data-home-status-type=\"' + homeStatusFilter + '\"][style=\"display: block;\"]').length;\r\n      }\r\n      tabInput.setAttribute(\"data-cards\", homesByTypeCount);\r\n      let counterText = element.getAttribute('data-tab-title') + ' (' + homesByTypeCount + ')';\r\n      tabLabel.textContent = counterText;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * Hides all home cards\r\n   */\r\n  function hideAllHomeCards(event) {\r\n    let cardsToDisable = document.querySelectorAll('[data-home-section-item]');\r\n    cardsToDisable = nodeListToArray(cardsToDisable);\r\n\r\n    cardsToDisable.forEach(function (element) {\r\n      element.style.display = 'none';\r\n    });\r\n  }\r\n\r\n  function filterByCurrentTab() {\r\n    const selectedTab = document.querySelector('[data-tab-filter] input:checked');\r\n    selectedTab.click();\r\n  }\r\n\r\n  /**\r\n   * @public\r\n   * \r\n   */\r\n  BuilderFiltersHandler.setBuilderFiltersEvents = function () {\r\n    const builderFilterElements = document.querySelectorAll('[data-builder-filter]');\r\n\r\n    for (let i = 0; i < builderFilterElements.length; ++i) {\r\n      const builderFilter = builderFilterElements[i];\r\n      builderFilter.addEventListener('change', function (event) {\r\n        hideAllHomeCards();\r\n        filterHomesByBuilder(event);\r\n        updateFilterTabs();\r\n        filterByCurrentTab();\r\n      });\r\n    }\r\n  };\r\n\r\n  BuilderFiltersHandler.init = function() {\r\n    BuilderFiltersHandler.setBuilderFiltersEvents();\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  BuilderFiltersHandler.noConflict = function noConflict() {\r\n    global.NewHomeSource.BuilderFiltersHandler = previousModule;\r\n    return BuilderFiltersHandler;\r\n  };\r\n\r\n  global.NewHomeSource.BuilderFiltersHandler = BuilderFiltersHandler;\r\n\r\n  BuilderFiltersHandler.init();\r\n\r\n  return BuilderFiltersHandler;\r\n}(window));\r\n","(function (global, factory) {\r\n  'use strict';\r\n\r\n  if (typeof define === 'function' && define.amd) {\r\n    // If AMD is supported and the global object (window) in case any JS module is expecting\r\n    // the SectionLazyLoad to exists on the window object.\r\n    define([], () => {\r\n      global.SectionLazyLoad = factory(global);\r\n    });\r\n  } else if (typeof exports === 'object') {\r\n    // If supports for Common JS is available export the module\r\n    // and pass is value to the global (window) object in case non Common JS code\r\n    // is expected to work with this SectionLazyLoad Module.\r\n    global.SectionLazyLoad = factory(global);\r\n    module.exports = global.SectionLazyLoad;\r\n  } else {\r\n    // If not support for AMD or Common JS is available register the module in the global scope.\r\n    global.SectionLazyLoad = factory(global);\r\n  }\r\n}(typeof window !== 'undefined' ? window : {}, (root) => {\r\n  'use strict';\r\n\r\n  // Lazy Loading\r\n  function lazyLoadSection(entry) {\r\n    if (entry.getAttribute('data-url')) {\r\n      const url = root.location.protocol + '//' + root.location.hostname + entry.getAttribute('data-url');\r\n\r\n      fetch(url).then((response) => {\r\n        response.text().then((data) => {\r\n          // Now the dispatched event contains the raw data that the url returns\r\n          const event = new CustomEvent('sectionLazyLoaded', {\r\n            detail: {\r\n              data,\r\n            }\r\n          });\r\n\r\n          // Add the data-prevent-lazy-load-section-default-behavior=\"true\" attribute to prevent the script.\r\n          // from appending the data to the DOM this should only be used if you don't need the response.\r\n          // added to the target element.\r\n          if (!entry.dataset.preventLazyLoadSectionDefaultBehavior) {\r\n            const responseFragment = document.createRange().createContextualFragment(data);\r\n            entry.appendChild(responseFragment);\r\n          }\r\n\r\n          entry.dispatchEvent(event);\r\n        });\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Callback function used with the intersection observer.\r\n   * @param {*} entries\r\n   * @param {*} observer\r\n   */\r\n  function callback(entries, observer) {\r\n    entries.forEach((entry) => {\r\n      if (entry.isIntersecting && entry.intersectionRatio > 0) {\r\n        lazyLoadSection(entry.target);\r\n        observer.unobserve(entry.target);\r\n      }\r\n    });\r\n  }\r\n\r\n  const options = {\r\n    root: null,\r\n    rootMargin: '100px 0px'\r\n  };\r\n\r\n  const rootMarginObserver = new IntersectionObserver(callback, options);\r\n\r\n  /**\r\n   * Function used to get all the lazyloaded sections on initial load\r\n   */\r\n  function initLazyLoad() {\r\n    const lazyLoadSections = document.querySelectorAll(\"[data-component='lazyLoad']\");\r\n\r\n    // lazy load the sections\r\n    for (let i = 0; i < lazyLoadSections.length; i += 1) {\r\n      rootMarginObserver.observe(lazyLoadSections[i]);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Used to observe a dynamically created element that doesn't exist\r\n   * on initial load (or re-observe an already unobserved element)\r\n   * @param {Element} target the element that will be observed\r\n   */\r\n  function observe(target) {\r\n    rootMarginObserver.observe(target);\r\n  }\r\n\r\n  initLazyLoad();\r\n\r\n  return {\r\n    observe\r\n  };\r\n}));\r\n","(function trackerRecommendedCommunities(global) {\r\n  'use strict';\r\n\r\n  const isPriced = (price) => price && price !== '0';\r\n  const isBasic = document.querySelector('#IsBasic') && document.querySelector('#IsBasic').value === 'True';\r\n  const getMarketSession = (marketId, marketName, stateAbbreviation) => {\r\n    if (marketId && marketName) {\r\n      return `${marketName}, ${stateAbbreviation} - ${marketId}`;\r\n    }\r\n    return null;\r\n  };\r\n  const getLocation = (city, stateName) => {\r\n    if (city) {\r\n      return `${city}, ${stateName}`;\r\n    }\r\n    return stateName;\r\n  };\r\n\r\n  /**\r\n   * trackDiscoverCommunitySegmentEvent: Gets the information of the communtity and\r\n   * track the event related to the discover community on Segment.\r\n   * @param {Element} element Html element related to the community on the discover community section.\r\n   */\r\n  function trackDiscoverCommunitySegmentEvent(element) {\r\n    if (!element) {\r\n      return;\r\n    }\r\n\r\n    if (element.dataset.processed === 'true') {\r\n      return;\r\n    }\r\n\r\n    const segmentPrefix = 'segmentEvent';\r\n    const datasetPropertyNames = Object.getOwnPropertyNames(element.dataset);\r\n    const segmentAttributes = datasetPropertyNames.filter((propertyName) => propertyName.includes(segmentPrefix));\r\n\r\n    if (segmentAttributes.length < 1) {\r\n      return;\r\n    }\r\n\r\n    const segmentEvent = {\r\n      eventType: 'segmentEvent'\r\n    };\r\n    for (let index = 0; index < segmentAttributes.length; index += 1) {\r\n      const segmentEventAttribute = segmentAttributes[index].replace(segmentPrefix, '');\r\n      segmentEvent[segmentEventAttribute.toLowerCase()] = element.dataset[segmentAttributes[index]];\r\n    }\r\n\r\n    document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n      detail: {\r\n        data: segmentEvent\r\n      }\r\n    }));\r\n\r\n    element.setAttribute('data-processed', true);\r\n  }\r\n\r\n  /**\r\n   * trackDiscoverCommunityGA4Event: Gets the information of the communtity and\r\n   * track the event related to the discover community on GA4.\r\n   * @param {Element} element Html element related to the community on the discover community section.\r\n   */\r\n  function trackDiscoverCommunityGA4Event(element) {\r\n    if (!element) {\r\n      return;\r\n    }\r\n\r\n    if (element.dataset.ga4Processed === 'true') {\r\n      return;\r\n    }\r\n\r\n    if (element.value === 'true') {\r\n      return;\r\n    }\r\n\r\n    const values = JSON.parse(element.value);\r\n\r\n    if (isBasic) {\r\n      return;\r\n    }\r\n\r\n    const params = {\r\n      click_target: 'direct rec modal',\r\n      button_name: 'Get More Info',\r\n      event_type: 'TDV Events',\r\n      currency_value: 'USD',\r\n      value: 30,\r\n      trustbuilder_reviews: values.HasBuilderReviews,\r\n      price_reduction: values.PriceReductionLabel,\r\n      min_price: values.PriceLow,\r\n      max_price: values.PriceHigh,\r\n      market_id: values.MarketId,\r\n      market_name: values.MarketName,\r\n      market_session: getMarketSession(values.MarketId, values.MarketName, values.StateAbbreviation),\r\n      location: getLocation(values.City, values.StateName),\r\n      community_name: values.CommunityName,\r\n      community_status: values.MarketingStatusLabel || 'Normal',\r\n      community_id: values.CommunityId,\r\n      is_limited_availability: values.HasLimitedInformation,\r\n      is_priced: isPriced(values.PriceLow) || isPriced(values.PriceHigh) ? 'True' : 'False',\r\n      is_paid: 'True',\r\n      zip_code: values.Zip,\r\n      builder_id: values.BuilderId,\r\n      builder_name: values.BrandName,\r\n      position: element.dataset.ga4EventPosition,\r\n      org_button_name: element.dataset.ga4EventOrg_button_name,\r\n    };\r\n\r\n    const ga4Event = {\r\n      eventName: 'direct_rec_lead',\r\n      params,\r\n      eventType: 'GA4Event'\r\n    };\r\n\r\n    document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n      detail: {\r\n        data: ga4Event\r\n      }\r\n    }));\r\n\r\n    element.setAttribute('data-ga4-processed', true);\r\n  }\r\n\r\n  /**\r\n   * trackDiscoverCommunitiesEventsHandler: Manages and handles the events\r\n   * when the Get More Info button is clicked.\r\n   * @param {Event} event object related to the event.\r\n   */\r\n  function trackDiscoverCommunitiesEventsHandler(event) {\r\n    if (!event || !event.target || !event.target.closest('[data-get-brochure]')) {\r\n      return;\r\n    }\r\n\r\n    const checkedCommunities = document.querySelectorAll('[data-recommended-checkbox]:checked');\r\n    checkedCommunities.forEach(trackDiscoverCommunitySegmentEvent);\r\n    checkedCommunities.forEach(trackDiscoverCommunityGA4Event);\r\n  }\r\n\r\n  global.document.addEventListener('click', trackDiscoverCommunitiesEventsHandler);\r\n}(window));\r\n","(function (global, factory) {\r\n  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\r\n  typeof define === 'function' && define.amd ? define(factory) :\r\n  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.A11yDialog = factory());\r\n}(this, (function () { 'use strict';\r\n\r\n  var focusableSelectors = [\r\n    'a[href]:not([tabindex^=\"-\"])',\r\n    'area[href]:not([tabindex^=\"-\"])',\r\n    'input:not([type=\"hidden\"]):not([type=\"radio\"]):not([disabled]):not([tabindex^=\"-\"])',\r\n    'input[type=\"radio\"]:not([disabled]):not([tabindex^=\"-\"])',\r\n    'select:not([disabled]):not([tabindex^=\"-\"])',\r\n    'textarea:not([disabled]):not([tabindex^=\"-\"])',\r\n    'button:not([disabled]):not([tabindex^=\"-\"])',\r\n    'iframe:not([tabindex^=\"-\"])',\r\n    'audio[controls]:not([tabindex^=\"-\"])',\r\n    'video[controls]:not([tabindex^=\"-\"])',\r\n    '[contenteditable]:not([tabindex^=\"-\"])',\r\n    '[tabindex]:not([tabindex^=\"-\"])',\r\n  ];\r\n\r\n  var TAB_KEY = 9;\r\n  var ESCAPE_KEY = 27;\r\n\r\n  /**\r\n   * Define the constructor to instantiate a dialog\r\n   *\r\n   * @constructor\r\n   * @param {Element} element\r\n   */\r\n  function A11yDialog(element) {\r\n    // Prebind the functions that will be bound in addEventListener and\r\n    // removeEventListener to avoid losing references\r\n    this._show = this.show.bind(this);\r\n    this._hide = this.hide.bind(this);\r\n    this._maintainFocus = this._maintainFocus.bind(this);\r\n    this._bindKeypress = this._bindKeypress.bind(this);\r\n\r\n    this.$el = element;\r\n    this.shown = false;\r\n    this._id = this.$el.getAttribute('data-a11y-dialog') || this.$el.id;\r\n    this._previouslyFocused = null;\r\n    this._listeners = {};\r\n\r\n    // Initialise everything needed for the dialog to work properly\r\n    this.create();\r\n  }\r\n\r\n  /**\r\n   * Set up everything necessary for the dialog to be functioning\r\n   *\r\n   * @param {(NodeList | Element | string)} targets\r\n   * @return {this}\r\n   */\r\n  A11yDialog.prototype.create = function () {\r\n    this.$el.setAttribute('aria-hidden', true);\r\n    this.$el.setAttribute('aria-modal', true);\r\n    this.$el.setAttribute('tabindex', -1);\r\n\r\n    if (!this.$el.hasAttribute('role')) {\r\n      this.$el.setAttribute('role', 'dialog');\r\n    }\r\n\r\n    // Keep a collection of dialog openers, each of which will be bound a click\r\n    // event listener to open the dialog\r\n    this._openers = $$('[data-a11y-dialog-show=\"' + this._id + '\"]');\r\n    this._openers.forEach(\r\n      function (opener) {\r\n        opener.addEventListener('click', this._show);\r\n      }.bind(this)\r\n    );\r\n\r\n    // Keep a collection of dialog closers, each of which will be bound a click\r\n    // event listener to close the dialog\r\n    this._closers = $$('[data-a11y-dialog-hide]', this.$el).concat(\r\n      $$('[data-a11y-dialog-hide=\"' + this._id + '\"]')\r\n    );\r\n    this._closers.forEach(\r\n      function (closer) {\r\n        closer.addEventListener('click', this._hide);\r\n      }.bind(this)\r\n    );\r\n\r\n    // Execute all callbacks registered for the `create` event\r\n    this._fire('create');\r\n\r\n    return this\r\n  };\r\n\r\n  /**\r\n   * Show the dialog element, disable all the targets (siblings), trap the\r\n   * current focus within it, listen for some specific key presses and fire all\r\n   * registered callbacks for `show` event\r\n   *\r\n   * @param {Event} event\r\n   * @return {this}\r\n   */\r\n  A11yDialog.prototype.show = function (event) {\r\n    // If the dialog is already open, abort\r\n    if (this.shown) {\r\n      return this\r\n    }\r\n\r\n    // Keep a reference to the currently focused element to be able to restore\r\n    // it later\r\n    this._previouslyFocused = document.activeElement;\r\n    this.$el.removeAttribute('aria-hidden');\r\n    this.shown = true;\r\n\r\n    // Set the focus to the dialog element\r\n    moveFocusToDialog(this.$el);\r\n\r\n    // Bind a focus event listener to the body element to make sure the focus\r\n    // stays trapped inside the dialog while open, and start listening for some\r\n    // specific key presses (TAB and ESC)\r\n    document.body.addEventListener('focus', this._maintainFocus, true);\r\n    document.addEventListener('keydown', this._bindKeypress);\r\n\r\n    // Execute all callbacks registered for the `show` event\r\n    this._fire('show', event);\r\n\r\n    return this\r\n  };\r\n\r\n  /**\r\n   * Hide the dialog element, enable all the targets (siblings), restore the\r\n   * focus to the previously active element, stop listening for some specific\r\n   * key presses and fire all registered callbacks for `hide` event\r\n   *\r\n   * @param {Event} event\r\n   * @return {this}\r\n   */\r\n  A11yDialog.prototype.hide = function (event) {\r\n    // If the dialog is already closed, abort\r\n    if (!this.shown) {\r\n      return this\r\n    }\r\n\r\n    this.shown = false;\r\n    this.$el.setAttribute('aria-hidden', 'true');\r\n\r\n    // If there was a focused element before the dialog was opened (and it has a\r\n    // `focus` method), restore the focus back to it\r\n    // See: https://github.com/KittyGiraudel/a11y-dialog/issues/108\r\n    if (this._previouslyFocused && this._previouslyFocused.focus) {\r\n      this._previouslyFocused.focus();\r\n    }\r\n\r\n    // Remove the focus event listener to the body element and stop listening\r\n    // for specific key presses\r\n    document.body.removeEventListener('focus', this._maintainFocus, true);\r\n    document.removeEventListener('keydown', this._bindKeypress);\r\n\r\n    // Execute all callbacks registered for the `hide` event\r\n    this._fire('hide', event);\r\n\r\n    return this\r\n  };\r\n\r\n  /**\r\n   * Destroy the current instance (after making sure the dialog has been hidden)\r\n   * and remove all associated listeners from dialog openers and closers\r\n   *\r\n   * @return {this}\r\n   */\r\n  A11yDialog.prototype.destroy = function () {\r\n    // Hide the dialog to avoid destroying an open instance\r\n    this.hide();\r\n\r\n    // Remove the click event listener from all dialog openers\r\n    this._openers.forEach(\r\n      function (opener) {\r\n        opener.removeEventListener('click', this._show);\r\n      }.bind(this)\r\n    );\r\n\r\n    // Remove the click event listener from all dialog closers\r\n    this._closers.forEach(\r\n      function (closer) {\r\n        closer.removeEventListener('click', this._hide);\r\n      }.bind(this)\r\n    );\r\n\r\n    // Execute all callbacks registered for the `destroy` event\r\n    this._fire('destroy');\r\n\r\n    // Keep an object of listener types mapped to callback functions\r\n    this._listeners = {};\r\n\r\n    return this\r\n  };\r\n\r\n  /**\r\n   * Register a new callback for the given event type\r\n   *\r\n   * @param {string} type\r\n   * @param {Function} handler\r\n   */\r\n  A11yDialog.prototype.on = function (type, handler) {\r\n    if (typeof this._listeners[type] === 'undefined') {\r\n      this._listeners[type] = [];\r\n    }\r\n\r\n    this._listeners[type].push(handler);\r\n\r\n    return this\r\n  };\r\n\r\n  /**\r\n   * Unregister an existing callback for the given event type\r\n   *\r\n   * @param {string} type\r\n   * @param {Function} handler\r\n   */\r\n  A11yDialog.prototype.off = function (type, handler) {\r\n    var index = (this._listeners[type] || []).indexOf(handler);\r\n\r\n    if (index > -1) {\r\n      this._listeners[type].splice(index, 1);\r\n    }\r\n\r\n    return this\r\n  };\r\n\r\n  /**\r\n   * Iterate over all registered handlers for given type and call them all with\r\n   * the dialog element as first argument, event as second argument (if any). Also\r\n   * dispatch a custom event on the DOM element itself to make it possible to\r\n   * react to the lifecycle of auto-instantiated dialogs.\r\n   *\r\n   * @access private\r\n   * @param {string} type\r\n   * @param {Event} event\r\n   */\r\n  A11yDialog.prototype._fire = function (type, event) {\r\n    var listeners = this._listeners[type] || [];\r\n    var domEvent = new CustomEvent(type, { detail: event });\r\n\r\n    this.$el.dispatchEvent(domEvent);\r\n\r\n    listeners.forEach(\r\n      function (listener) {\r\n        listener(this.$el, event);\r\n      }.bind(this)\r\n    );\r\n  };\r\n\r\n  /**\r\n   * Private event handler used when listening to some specific key presses\r\n   * (namely ESCAPE and TAB)\r\n   *\r\n   * @access private\r\n   * @param {Event} event\r\n   */\r\n  A11yDialog.prototype._bindKeypress = function (event) {\r\n    // This is an escape hatch in case there are nested dialogs, so the keypresses\r\n    // are only reacted to for the most recent one\r\n    if (!this.$el.contains(document.activeElement)) return\r\n\r\n    // If the dialog is shown and the ESCAPE key is being pressed, prevent any\r\n    // further effects from the ESCAPE key and hide the dialog, unless its role\r\n    // is 'alertdialog', which should be modal\r\n    if (\r\n      this.shown &&\r\n      event.which === ESCAPE_KEY &&\r\n      this.$el.getAttribute('role') !== 'alertdialog'\r\n    ) {\r\n      event.preventDefault();\r\n      this.hide(event);\r\n    }\r\n\r\n    // If the dialog is shown and the TAB key is being pressed, make sure the\r\n    // focus stays trapped within the dialog element\r\n    if (this.shown && event.which === TAB_KEY) {\r\n      trapTabKey(this.$el, event);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Private event handler used when making sure the focus stays within the\r\n   * currently open dialog\r\n   *\r\n   * @access private\r\n   * @param {Event} event\r\n   */\r\n  A11yDialog.prototype._maintainFocus = function (event) {\r\n    // If the dialog is shown and the focus is not within a dialog element (either\r\n    // this one or another one in case of nested dialogs) or within an element\r\n    // with the `data-a11y-dialog-focus-trap-ignore` attribute, move it back to\r\n    // its first focusable child.\r\n    // See: https://github.com/KittyGiraudel/a11y-dialog/issues/177\r\n    if (\r\n      this.shown &&\r\n      !event.target.closest('[aria-modal=\"true\"]') &&\r\n      !event.target.closest('[data-a11y-dialog-ignore-focus-trap]')\r\n    ) {\r\n      moveFocusToDialog(this.$el);\r\n    }\r\n  };\r\n\r\n  /**\r\n   * Convert a NodeList into an array\r\n   *\r\n   * @param {NodeList} collection\r\n   * @return {Array<Element>}\r\n   */\r\n  function toArray(collection) {\r\n    return Array.prototype.slice.call(collection)\r\n  }\r\n\r\n  /**\r\n   * Query the DOM for nodes matching the given selector, scoped to context (or\r\n   * the whole document)\r\n   *\r\n   * @param {String} selector\r\n   * @param {Element} [context = document]\r\n   * @return {Array<Element>}\r\n   */\r\n  function $$(selector, context) {\r\n    return toArray((context || document).querySelectorAll(selector))\r\n  }\r\n\r\n  /**\r\n   * Set the focus to the first element with `autofocus` with the element or the\r\n   * element itself\r\n   *\r\n   * @param {Element} node\r\n   */\r\n  function moveFocusToDialog(node) {\r\n    var focused = node.querySelector('[autofocus]') || node;\r\n\r\n    focused.focus();\r\n  }\r\n\r\n  /**\r\n   * Get the focusable children of the given element\r\n   *\r\n   * @param {Element} node\r\n   * @return {Array<Element>}\r\n   */\r\n  function getFocusableChildren(node) {\r\n    return $$(focusableSelectors.join(','), node).filter(function (child) {\r\n      return !!(\r\n        child.offsetWidth ||\r\n        child.offsetHeight ||\r\n        child.getClientRects().length\r\n      )\r\n    })\r\n  }\r\n\r\n  /**\r\n   * Trap the focus inside the given element\r\n   *\r\n   * @param {Element} node\r\n   * @param {Event} event\r\n   */\r\n  function trapTabKey(node, event) {\r\n    var focusableChildren = getFocusableChildren(node);\r\n    var focusedItemIndex = focusableChildren.indexOf(document.activeElement);\r\n\r\n    // If the SHIFT key is being pressed while tabbing (moving backwards) and\r\n    // the currently focused item is the first one, move the focus to the last\r\n    // focusable item from the dialog element\r\n    if (event.shiftKey && focusedItemIndex === 0) {\r\n      focusableChildren[focusableChildren.length - 1].focus();\r\n      event.preventDefault();\r\n      // If the SHIFT key is not being pressed (moving forwards) and the currently\r\n      // focused item is the last one, move the focus to the first focusable item\r\n      // from the dialog element\r\n    } else if (\r\n      !event.shiftKey &&\r\n      focusedItemIndex === focusableChildren.length - 1\r\n    ) {\r\n      focusableChildren[0].focus();\r\n      event.preventDefault();\r\n    }\r\n  }\r\n\r\n  function instantiateDialogs() {\r\n    $$('[data-a11y-dialog]').forEach(function (node) {\r\n      new A11yDialog(node);\r\n    });\r\n  }\r\n\r\n  if (typeof document !== 'undefined') {\r\n    if (document.readyState === 'loading') {\r\n      document.addEventListener('DOMContentLoaded', instantiateDialogs);\r\n    } else {\r\n      if (window.requestAnimationFrame) {\r\n        window.requestAnimationFrame(instantiateDialogs);\r\n      } else {\r\n        window.setTimeout(instantiateDialogs, 16);\r\n      }\r\n    }\r\n  }\r\n\r\n  return A11yDialog;\r\n\r\n})));\r\n","/**\r\n * This multiplatform component can be used to open modal windows that contain an iframe.\r\n  */\r\n(function iframeModalOpener(global) {\r\n  'use strict';\r\n\r\n  function openModal(event) {\r\n    const target = event.target.closest('[data-dialog-opener]') || event.target.querySelector('[data-dialog-opener]');\r\n    const id = target.dataset.dialogOpener;\r\n    const modal = document.getElementById(id);\r\n\r\n    if (modal) {\r\n      // if the polyfill exists, we need to register the dialog element.\r\n      if (global.dialogPolyfill) {\r\n        global.dialogPolyfill.registerDialog(modal);\r\n      }\r\n\r\n      modal.showModal();\r\n      const iframe = modal.querySelector('iframe');\r\n\r\n      if (!iframe.src) {\r\n        iframe.src = iframe.dataset.src;\r\n        iframe.removeAttribute('data-src');\r\n      }\r\n\r\n      // event listener to close the modal.\r\n      // event closeIspModal is added in order to close the Interactive Site Plan modal\r\n      // when the user clicks the Request a Tour button to show the form for Available Lots. Ticket BDXNHS-8316.\r\n      modal.addEventListener('click', (e) => {\r\n        if (e.target === modal || e.target.dataset.closeModalForm !== undefined) {\r\n          modal.close();\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  function handleModalInteraction(event) {\r\n    // Check if native support for the dialog element\r\n    if (typeof HTMLDialogElement === 'function') {\r\n      openModal(event);\r\n\r\n      // if not, check if require support.\r\n    } else if (typeof define === 'function' && define.amd) {\r\n      require(['dialogPolyfill'], (polyfill) => {\r\n        // store the polyfill in the window.\r\n        global.dialogPolyfill = polyfill;\r\n        openModal(event);\r\n      });\r\n\r\n      // if not, load via the loadJs script\r\n    } else {\r\n      const url = document.querySelector('#dialogPolyfillBundle');\r\n      if (url) {\r\n        global.NHS.loadJs(url.value, 'dialogPolyfill', () => {\r\n          openModal(event);\r\n        });\r\n      }\r\n    }\r\n  }\r\n\r\n  const openers = document.querySelectorAll('[data-dialog-opener]');\r\n\r\n  openers.forEach((opener) => {\r\n    const container = opener.closest('[data-interactive-siteplan-container]');\r\n    container.addEventListener('click', handleModalInteraction);\r\n  });\r\n}(window));\r\n","(function communityAndNeighBorhoodHandler(global) {\r\n  'use strict';\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  const previousCommunityAndNeighBorhoodHandler = global.NewHomeSource.CommunityAndNeighBorhoodHandler;\r\n\r\n  /**\r\n   * @constructs NewHomeSource.CommunityAndNeighBorhoodHandler\r\n   */\r\n  function CommunityAndNeighBorhoodHandler() {\r\n  }\r\n\r\n  /** \r\n   *  hideAllSections: function to hide all tabs of the sub menu\r\n   */\r\n  function hideAllSections() {\r\n    const arraySections = document.querySelectorAll('[data-sub-menu-element]');\r\n    arraySections.forEach((section) => {\r\n      section.setAttribute('hidden', '');\r\n    });\r\n  }\r\n\r\n  /**\r\n   * turnOnASection: function to show a specific section\r\n   * @param {string} name data parameter with the name of the section\r\n   */\r\n  function showASection(name) {\r\n    const section = document.querySelector('[data-sub-menu-element=\"' + name + '\"]');\r\n    if (section) {\r\n      section.removeAttribute('hidden');\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Removes the element focus.\r\n  * @param {any} element\r\n  */\r\n  function removeTabFocus(element) {\r\n      element.classList.remove('bar__item-active', 'nhs-c-button--tap-light-active');\r\n  }\r\n\r\n  /**\r\n   * Toggles the active element tab.\r\n   * @param {any} target\r\n   */\r\n  function setActiveTab(target) {\r\n    const selectedItem = target;\r\n    const subMenuItems = document.querySelectorAll('[data-subnav-items] [data-item-list]');\r\n\r\n    if (selectedItem) {\r\n      subMenuItems.forEach(removeTabFocus);\r\n        selectedItem.classList.add('bar__item-active', 'nhs-c-button--tap-light-active');\r\n    }\r\n  }\r\n\r\n  /**\r\n   *  performClickOnATab: function to control the event click on the tab events\r\n   */\r\n  function performClickOnATab(event) {\r\n    const target = event.target.closest('[data-sub-menu-name]') || event.target;\r\n    if (target) {\r\n      setActiveTab(target);\r\n      hideAllSections();\r\n      showASection(target.dataset.subMenuName);\r\n    }\r\n  }\r\n\r\n  /**\r\n   *  setEventsToTabs: function to set the event call back to the tabs\r\n   */\r\n  function setEventsToTabs() {\r\n    const arrayTabs = document.querySelectorAll('[data-sub-menu-name]');\r\n    arrayTabs.forEach((tab) => {\r\n      tab.addEventListener('click', performClickOnATab)\r\n    });\r\n  }\r\n\r\n  /**\r\n   *  init: function to start events\r\n   */\r\n  CommunityAndNeighBorhoodHandler.init = function Init() {\r\n    setEventsToTabs();\r\n  };\r\n\r\n\r\n  /**\r\n   * @public\r\n   *\r\n   * noConflict: Returns control of NewHomeSource.CommunityAndNeighBorhoodHandler to the previous script.\r\n   */\r\n  CommunityAndNeighBorhoodHandler.noConflict = function noConflict() {\r\n    global.NewHomeSource.CommunityAndNeighBorhoodHandler = previousCommunityAndNeighBorhoodHandler;\r\n    return CommunityAndNeighBorhoodHandler;\r\n  };\r\n\r\n  /**\r\n   * @private\r\n   * trackGA4Event: tracks the event when the tools list is expanded.\r\n   * @param {object} event result of the click on the page.\r\n   */\r\n   const trackGA4CollapseEvent = function (event) {\r\n    if (!event || !event.target || !event.target.matches('[data-neighborhood-event]')) {\r\n      return;\r\n    }\r\n\r\n    const ga4Event = {\r\n      eventType: 'GA4Event',\r\n      eventName: event.target.dataset.neighborhoodEvent,\r\n      params: {\r\n        click_target: event.target.dataset.neighborhoodClickTarget,\r\n        position: event.target.dataset.neighborhoodPosition,\r\n        click_target1: event.target.dataset.neighborhoodClickTarget1\r\n      }\r\n    };\r\n\r\n    document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n      detail: {\r\n        data: ga4Event\r\n      }\r\n    }));\r\n  };\r\n\r\n  global.document.body.addEventListener('click', trackGA4CollapseEvent);\r\n\r\n  global.NewHomeSource.CommunityAndNeighBorhoodHandler = CommunityAndNeighBorhoodHandler;\r\n\r\n  return CommunityAndNeighBorhoodHandler;\r\n}(window));\r\n","(() => {\r\n  'use strict';\r\n\r\n  document.addEventListener('modalOpened', (event) => {\r\n    const modal = event.detail.modal;\r\n    const isIPhone = !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform);\r\n\r\n    const input = modal && modal.querySelector('input[type=\"text\"]');\r\n\r\n    if (!input) {\r\n      return;\r\n    }\r\n\r\n    if (input && input.value === '') {\r\n      input.dataset.qaIsAutoFocus = 'true';\r\n      input.focus();\r\n\r\n      // this is required because on iPhone, when the keyboard is displayed, it pushes the modal up when\r\n      // the input is focused, window.scroll(0,0) brings it back to its original position.\r\n      if (isIPhone) {\r\n        setTimeout(() => window.scrollTo(0, 0), 50);\r\n      }\r\n      return;\r\n    }\r\n\r\n    input.dataset.qaIsAutoFocus = 'false';\r\n  });\r\n})();\r\n","(function recommendationEvents(global) {\r\n  'use strict';\r\n\r\n  const queryElementWithEvents = {\r\n    onRecommendationSend: '[data-direct-lead-recommendation]',\r\n    onRecommendationUnCheck: '[data-direct-lead-recommendation-uncheck]'\r\n  };\r\n\r\n  global.NewHomeSource = global.NewHomeSource || {};\r\n  const previousRecommendationEvents = global.NewHomeSource.RecommendationEvents;\r\n\r\n  if (previousRecommendationEvents) {\r\n    return;\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    if (!cleanProperty) {\r\n      return;\r\n    }\r\n\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   * triggerRecommendationEvents: when user send a recommendation lead,\r\n   * we have the possiblity to send two events certain one condition\r\n   * If we have at least one community we use the data in the element [data-direct-lead-recommendation]\r\n   * otherwise it means the user uncheck all the communities or use skip button, and use the data in\r\n   * [data-direct-lead-recommendation-uncheck].\r\n   *\r\n   * @param {Event} event with the informationa bout how many communities the user check.\r\n   */\r\n  function triggerRecommendationEvents(event) {\r\n    const selector = queryElementWithEvents[event.type];\r\n    const detail = event.detail || {};\r\n    if (!selector) {\r\n      return;\r\n    }\r\n    const elementToSelect = detail.form || global.document;\r\n    const element = elementToSelect.querySelector(selector);\r\n    if (element) {\r\n      const dataset = element.dataset;\r\n      const params = {};\r\n      Object.keys(dataset).forEach(getAttributes.bind(params, dataset, 'ga4'));\r\n      if (Object.keys(params).length > 0) {\r\n        const eventName = params.eventName;\r\n        const eventGa4 = {\r\n          eventName,\r\n          params,\r\n          eventType: 'GA4Event'\r\n        };\r\n\r\n        document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n          detail: { data: eventGa4 }\r\n        }));\r\n      }\r\n    }\r\n  }\r\n\r\n  function RecommendationEvents() {\r\n  }\r\n\r\n  RecommendationEvents.triggerRecommendationEvents = triggerRecommendationEvents;\r\n\r\n  global.NewHomeSource.RecommendationEvents = RecommendationEvents;\r\n\r\n  document.body.addEventListener('onRecommendationSend', triggerRecommendationEvents);\r\n  document.body.addEventListener('onRecommendationUnCheck', triggerRecommendationEvents);\r\n}(window));\r\n"]}