{"version":3,"sources":["vanilla-masker.js","jQuery.LazyLoad.js","GoogleAnalitycsHelper.js","schedulerHandler.js","modalBackground.js","event.js","fullImageViewerOpener.js","dateSlider.js","googlemapapi.b1.js","GoogleMapApiAutoComplite.js","gallery.b1.js","imagesGalleryHandler.js","thumbnailHelper.js","arrowHandler.js","stickyBarScrollHandler.js","initialLoadModalHandler.js","homedetailxp.b1.js","LeadForm.common.js","BasicContactModal.js","thankYouModal.js","webStorageHandler.js","mortgage-detail.b1.js","mpcEventsHelper.js","handlerTrustedForm.js","leadEvents.js","handlerOnPageForm.js","handlerFivTemplateForm.js","recommendedCommunitiesDesktopPaid.js","thankYouModalDesktopPaid.js","trackerRecommendedCommunities.js","common.b1.js","promotionFlyerHandler.js","stickyNavBarButton.b1.js","GooglePropertyMap.b1.js","DetailPageLogging.js","MapsAndDirections.b1.js","ajaxHelper.js","guidedTourInitializer.js","SectionLazyLoad.js","getPreApprovedLoader.js","GoogleMapsDownloader.js","a11ydialog.js","elementToggler.js","communityAndNeighBorhoodHandler.b1.js","modalFocus.js","setupBasicInheritedProperties.js","recommendationEvents.js"],"names":["root","factory","define","amd","exports","module","VMasker","this","mergeMoneyOptions","opts","delimiter","lastOutput","precision","hasOwnProperty","separator","showSignal","suffixUnit","replace","unit","zeroCents","moneyPrecision","addPlaceholdersToOutput","output","index","placeholder","length","VanillaMasker","elements","prototype","unbindElementToMask","i","len","oninput","value","bindElementToMask","maskFunction","that","onInput","e","source","window","event","target","srcElement","setTimeout","setSelectionRange","maskMoney","maskNumber","maskAlphaNum","maskPattern","pattern","unMask","el","Error","toMoney","zeroMatcher","zeroRegExp","RegExp","digitsLength","toString","lastDigitLength","slice","number","separatorIndex","indexOf","missingZeros","clearDelimiter","clearSeparator","money","substr","masked","cents","Array","join","signal","startsWith","beginCents","Math","max","centsValue","centsLength","centsSliced","toPattern","inputValue","patternChars","split","values","charsValues","outputLength","undefined","match","toNumber","toAlphaNumeric","removeByKey","key","some","item","splice","bind","jQuery","extend","LazyLoadAttachedEvents","LazyLoad","options","defaultOptions","Offset","AppendScroll","ElementVisibleId","UpdateAction","isVisible","Name","defaultOptiosTemp","configuration","callbackAction","EventHandlerName","visibleY","document","getElementById","offsetHeight","top","getBoundingClientRect","parentNode","body","bottom","documentElement","clientHeight","on","push","global","NewHomeSource","previousAnalitycsHelper","AnalitycsHelper","getGoogleAnalitycsIdentifier","id","ga","getAll","allGa","filter","element","get","noConflict","SchedulerHandler","triggerGaEvent","googleAnalyticsTracker","trackers","elem","getGoogleAnalyticsTracker","toggleMobileDateSliderForCustomScheduler","display","appointmentDateSlider","querySelector","selfGuidedDateSlider","removeAttribute","setAttribute","openSchedulerTab","schedulerUrl","dataset","open","previousModalBackground","ModalBackground","createBackground","backgroundColor","zIndex","createElement","style","position","left","width","height","appendChild","background","overflow","destroyBackground","parentElement","removeChild","previousEvent","Event","addEvent","name","callback","addEventListener","processCallbacks","callbacks","forEach","processEvents","events","processConfiguration","property","setter","querySelectorAll","Object","keys","clickElement","click","call","ActiveXObject","previousFullImageViewerOpener","FullImageViewerOpener","template","generateHtml","content","cloneNode","container","focus","preventScroll","openFullImageViewer","preventDefault","requestAnimationFrame","eventsConfiguration","openEvent","registerLogInformation","logger","logInfo","performanceLogger","selector","favorites","setUpFullImageViewerSaveOption","performanceEvents","DateSlider","culture","lang","day","available","ariaSelected","ariaAttribute","ariaHidden","dateSliderDay","dateSliderAttribute","dateSliderSelected","dateAvailable","selectedAttributes","atWord","dayAsNumberFormatter","Intl","DateTimeFormat","dayFormatter","weekday","monthFormatter","month","monthAsNumberFormatter","yearFormatter","year","cardTemplate","titleTemplate","dateSliderConfiguration","cardOutside","NaN","cardSize","firstDay","isClick","totalCards","touchStart","touchNow","x","noAvailable","parameters","_","today","Date","parse","toDateString","config","queryAlertNoAvailable","phone","numberDayNotAvailable","firstDate","latestDay","initialSelected","initialTotalCards","onSetDay","initialDay","notAvailableAlertElem","innerText","fillAttribute","fillStringAttribute","fillElement","onClick","onNext","onPrevious","onKeyDown","onTouchStart","onTouchMove","passive","onTouchEnd","pleaseSetTheDate","watchForStylesRecalculation","setHidden","cardTotalSize","createDayCard","card","replaceTemplate","createDayObject","isHidden","isAvailable","currentDay","titleButton","tomorrow","aria","selected","hidden","format","toUpperCase","getDate","px","title","isScrolling","datePicker","observer","IntersectionObserver","entries","intersectionObserver","entry","isIntersecting","recalculateSize","observe","word","ariaPrefix","calculateSize","daysWrapper","offsetWidth","margin","border","cards","daysContainer","bindAttribute","attribute","dateSliderPrefix","handler","passiveOption","eventName","getAttribute","searchElement","role","haveANiceDay","paintCards","daysHtml","cardsCreated","numberOfCards","insertAdjacentHTML","movementX","changedTouches","clientX","matches","setDay","indexDay","tagName","keyCode","difference","abs","milliseconds","move","selectedDay","selectedWord","translate","updateMonth","totalMovement","round","translation","handlerAlertNotAvailable","type","data","selectedDate","days","setMonth","obj","prefix","instance","query","lastVisibleCard","previousSelectedElement","selectedElement","date","innerHTML","third","prev","availableCards","tomorrowNeverKnows","indexDate","NHS","Scripts","Maps","existingMaps","getMap","maps","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","coordinatesElement","Number","lat","lng","mcOptions","mapOptions","zoom","center","LatLng","zoomControlOptions","ControlPosition","draggable","scrollwheel","disableDoubleClickZoom","overviewMapControl","minZoom","createMapWrap","Map","clearOverlays","isFunction","addListener","dataLayer","mapCoordinates","markerCluster","MarkerClusterer","getMarkerPointAsyn","CreateOverlay","addListenerOnce","cluster","repaint","bounds_","getCenter","getZoom","RemoveGoogleInfo","trigger","hideLoading","append","showLoading","hide","attr","aux","eq","remove","removeAttr","show","setMap","clearMarkers","optionsMpa","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","text","Marker","set","setContent","Center","setCenter","ReDrawMap","fitBounds","panToBounds","ourOverlay","OverlayView","draw","GetInfowindowOffset","iwWidth","iwHeight","xOffset","yOffset","location","getProjection","fromLatLngToContainerPixel","getPosition","nep","y","Size","GetPixelFromLatLng","latLng","fromLatLngToPoint","WaitGoogleScript","functionToExecute","timeToLoad","loadGoogleMapsCode","url","loadJs","initializeAutoComplete","control","createControles","field","val","autocomplete","places","initializeAutoCompleteControles","bindTo","placeChangedProcess","close","setVisible","place","getPlace","geometry","viewport","setZoom","iconAutoComplite","setIcon","setPosition","address","address_components","short_name","size","origin","Point","anchor","scaledSize","newNode","insertBefore","nextSibling","change","setTypes","input","types","controls","TOP_LEFT","galleryInit","context","images","gallery","setAttr","elm","getAttr","hasClass","className","classList","contains","insertAt","nElm","pos","ref","insertAdjacentElement","fn","isArray","getTouch","touches","getTouchId","touch","identifier","getTouchX","screenX","setImgX","img","transform","getImgX","parseFloat","isUndefined","variable","getUndefined","setAnimationTime","seconds","transition","setXAnimationTime","isImage","Image","tryToggleImageType","imgElm","newImage","getAssociatedImage","replaceChild","setSrc","src","setSrcset","srcset","setSizes","sizes","setCollection","collection","setImgId","setAlt","alt","setFloorPlanClass","isNext","imageIndex","nextImg","isPortraitImage","naturalHeight","naturalWidth","imagesArray","newActiveImage","isFloorPlan","add","goNext","prevImg","activeImg","newNextIndex","Srcset","positionImageCollection","collectionName","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","previousImg","imageElems","imageElements","newX","diff","activeWidth","prevX","activeX","nextX","tDiff","bindEvents","Function","Gallery","firstImage","handlerVerticalImages","complete","previousThumbnailHelper","ThumbnailHelper","defaultThumbs","JSON","validate","CollectionName","ThumbnailUrl","Modules","eventTrigger","ArrowHandler","[object Object]","arrowRight","arrowLeft","firstCollection","lastCollection","scrollElement","limitRight","limitLeft","arrowsReference","arrowReferenceSelector","collectionsReference","collectionsReferenceSelector","bindedCalculateMoveCallback","bindedCalculateMove","bindedOnChangeCallback","getLimits","observeVisibility","calculateMove","showArrows","floor","right","changeLimits","closest","moveArrow","scrollBy","scrolledCarousel","removeEventListener","previousStickyBarScrollModule","stickyBarScrollHandler","StickyBarScrollHandler","moveStickyBarScroll","rightPoint","scrollLeft","elementPoints","scrollTo","behavior","previousInitialLoadModalHandler","InitialLoadModalHandler","configHiddenInput","queryString","autoOpenModalQueryString","DisplayModal","querySelectorModal","targetElement","currentUrl","href","URL","params","URLSearchParams","search","delete","newUrl","history","pushState","removeQueryStringFromUrl","HomeDetailXp","saveHomeMethod","galleryIndex","Globals","EventLogger","parentCommunityId","siteRoot","fromPage","partnerID","partnerId","partnerName","performanceLogUrl","marketId","favs","Favorites","urlBase","PartnerId","MarketId","initialize","attributeParameters","mapParameters","init","mapsContainer","googlePropertyMap","GooglePropertyMap","SetUpdate","loadInteractiveMap","propertyId","isSpec","specId","planId","downLoadFloorPlanOptionsModule","jsInput","checkBox","floorPlanOptionsContainer","appoinmentButtons","googlepush","tabsContainer","attachTrackingEvents","animate","scrollTop","showfloorsection","floorPlanActionUrl","ajax","stringify","floorplanOptionsViewModel","contentType","success","checkBoxesElements","mapButton","neighborhoodStickyButton","_updateAdsPosition","nearbyWrapper","performLazyLoad","ratingsFlagElement","microModalInput","RatingsAndReviews","loadDetailSection","loadReviews","setUpGalleryXp","post","removeHomeMethod","builderId","json","ShowSuccessMessage","removeClass","SaveToFavoritesText","is","SaveHome","stopImmediatePropagation","trackReadMoreOfferEvent","readMoreButtonText","googleAnalyticsEvent","click_target","readOffersContainer","showMoreElement","collapsibleContentElement","offerBubblesCollection","currentReadMoreText","hasAttribute","counter","textContent","currentEventReadMoreText","eventCurrentText","currentEventReadMoreToggleText","eventToggleText","googleAnalyticsBindings","scrollToBarItems","scrollBehavior","scroll","selectedTab","scrollIntoView","itemActive","similarHomesContainer","selectFloorPlanType","MediaData","mediaResult","setupNewOnPageGallery","RemoveParametersFromUrl","parameter","RemoveResizingParametersFromQueryString","image","imageUrl","isVimeoVideo","getVimeoSourceSetUrl","commTitle","breakpoints","breakpoint","breakpointLength","resizedMediaImages","mediaImages","IsRichMedia","cleanUrl","VideoType","VideoId","Is360Image","srcsetUrl","videoIcon","countInterior","countExterior","countFloor","countVideo","detailGallery","elementPosition","Id","AltText","Type","toLowerCase","addClass","getCaptionToDisplay","idOfVisibleElement","dataForAjax","urlForAjax","successAjaxFunction","lazyLoadReady","visibleElement","dataLazyLoadMapAndDirections","childNodes","Helper","createCookie","isNextStepsSaveClick","SavedText","replaceWith","logEventWithParameters","NextStepsClickSave","NextStepsSaveHome","message","saveMessage","SavedToYourProfileText","redirectUrl","detailInfo","adCol","MutationObserver","updateHandler","detailInfoHeight","containerHeight","totalHeightDetail","clientWidth","resultsObserver","subtree","childList","setInterval","replacedText","replaceObjetive","readyState","loadCss","ElementToggler","Init","CommunityAndNeighBorhoodHandler","formObserver","takeATourFloatingButton","floatingFormContainerHide","trustBuilderReviewsSection","builderSection","formValidator","previousBasicContactModal","BasicContactModal","CheckPhoneMask","phoneInput","CloseError","async","getRecommendedCommunities","recommendedCommand","listingId","command","CommunityId","ListingId","MailAddress","SpecId","PlanId","getRecommendedCommunitiesCommand","fetch","method","credentials","leadCommand","headers","Content-Type","then","response","toggleModal","modal","toggleAttribute","getSelectedRecommendedCommunities","recommendation","checked","onRecommendationChecked","submitButton","disabled","dispatchOnRecommendationSend","form","recommendationsModal","inputRecommended","skipButton","closeButton","recommendationsSubmissionCommand","firstName","lastName","recoComms","FromPage","Zip","Phone","BuilderId","Email","FirstName","LastName","RecoComms","getRecommendedCommunitiesSubmissionCommand","handleBasicForm","basicForm","bundle","validateForm","FormData","action","recommended","ga4IdentityPosition","ga4IdentityButton_name","templateElement","createRange","createContextualFragment","ModalLoader","createModal","ga4Event","button_name","showRecomendationsModal","eventForSegment","button_action","community_id","community","card_id","commonProperties","assign","getProperties","sentErrorElement","resetIsModalLoadedFlag","SubmitButtonClicked","submitForm","TrustedForm","functionToPerform","load","sendBasicLead","thankYouModal","createAccountButton","auth0Dom","signIn","previousModule","WebStorageHandler","CONFIGURATION","constants","localStorage","sessionStorage","setItemInStorage","maxAgeInSeconds","storageType","creationDate","getTime","setItem","removeItemFromStorage","removeItem","getItemFromStorage","getItem","string","parseToJson","currentDate","setLocalStorageItem","setSessionStorageItem","removeSessionStorageItem","removeLocalStorageItem","getLocalStorageItem","getSessionStorageItem","intersectionRatio","detailItem","homeDetail","commDetail","showMortgage","detailPriceElm","price2","price3","postalCodeElm","detailCardTemplate","detailCard","mortgageContainer","test","pathname","nearbyHomesContent","homeCarousel","refElm","disconnect","observeElement","MpcEventsHelper","setVisitedMpc","mpcIdElement","mpcId","parseInt","visitedMpcIds","isVisitedMpc","eventToAttach","executeMethod","mutations","mutation","addedNodes","attributes","characterData","tf","protocol","escape","random","head","trustedForm","onPageLeadButton","setAttributesToDataLayer","leadButtonClicked","leadEvents","ButtonNameClicked","ClickTarget","leadClickTarget","Position","leadPosition","GenerateLeadFrom","leadGenerateFrom","ButtonNameSource","leadButtonNameSource","tagManager","setDataLayerValue","formData","emailAddress","phoneNumber","postalCode","livesOutside","preferredContactMethod","contactMethod","realtorQuestionAnswer","realtorAnswer","sendAlerts","fivFormTemplate","fieldsMap","isCustomLocation","isBasic","isComingSoon","formValuesToQueryString","keyValuePair","substring","showThankYouPageForExternalLeads","getFreeBrochureData","showModal","onChangeToggleZipInput","checkboxElem","zipInput","openScheduler","component","onClickSendForm","currentForm","sendButton","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","contactMethodInput","selectedIndex","getRealtorQuestionAnswerId","realtorAnswerInput","getPreferredBuilder","preferredBuilderElem","getValidatedMpcId","triggerElement","userPhone","thisForm","formParent","phoneField","dateSelected","includeSimilarCheckbox","isLimitedAvailability","getFromDataLayer","sendFormButton","Comments","PreferredBuilder","PreferredContactDetail","PreferredContactMethod","RealtorQuestionAnswerId","LiveOutside","UserPhoneNumber","UserPostalCode","ZipCode","BuilderName","BrandName","CreditScoreText","IsAskQuestion","IgnoreComingSoonValidation","IsAddMeToInterestList","IsBuilderShowcase","IsComingSoon","IsComunityDetailV2","IsModalToSendEmail","IsGalleryXp","IsFullImageViewerLead","IsLimitedAvailability","LeadAction","UseNewCommentFormat","IsMPCommunity","IsPageCommDetail","IsPlan","NewSearchRCC","NewUser","ParentCommunityId","PartnerUsesMatchmaker","SendAlerts","HasUserOptedIntoRecommendationEmail","ShowCreditScoreSection","ShowSaveToAccount","ShowUserPhoneNumber","find","IsOnPageForm","getAskQuestionData","LivesOutside","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","fragment","cleanOpenFormButtons","tour_type","preferred_contact_method","realtor_question","topicList","checkboxElement","lead_form_topics","fillInputsOnPageForm","dataType","error","console","log","onChangeContactMethod","selectedOption","selectedValue","selectedOptions","onChangeRealtorAnswer","setupFormTabsEvents","selfGuidedTab","nonSelfGuidedTabs","selfGuidedTourTabHandler","setupLeadForms","internationalCheckbox","onchange","onclick","methodOfContactInput","realtorQuestionAnswerInput","changeLeadAction","radioOptions","option","parametersElement","leadAction","initDatepickerGallery","alertText","Datepicker","queryElement","attachEventsToNotAvailableDay","tourInPersonVideoHandler","createNewSlider","containerDatePicker","monthSlider","startDate","nextStepModal","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","submitRecommendedCommunitiesLead","getLeadType","email","previousModals","previousBackgrounds","FullImageViewer","MoreInfoPanel","closePanelActions","clearPreviousModals","skipButtonClickHandler","getSkipSubmissionCommand","submitButtonClickHandler","lazyLoadCss","handleCreateAccountClick","isPriced","price","trackDiscoverCommunitySegmentEvent","processed","segmentAttributes","getOwnPropertyNames","propertyName","includes","trackDiscoverCommunityGA4Event","ga4Processed","city","stateName","marketName","stateAbbreviation","event_type","currency_value","trustbuilder_reviews","HasBuilderReviews","price_reduction","PriceReductionLabel","min_price","PriceLow","max_price","PriceHigh","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","builder_id","builder_name","ga4EventPosition","org_button_name","ga4EventOrg_button_name","checkedCommunities","nextStepsSaveButton","gallerySaveButton","saveToFavoritesLoginButton","nextStepsUnsaveButton","galleryUnsaveButton","initSaveToFavorites","eventCategory","eventAction","eventLabel","nodeName","isMapDirectionsTab","tabsElements","showMapDirections","travelModeElement","travelMode","loadEmailSuggestions","Mailcheck","EmailDomainValidator","hideSection","displaySection","hidePhones","showPhones","SetDataLayerPair","rootMargin","threshold","sectionDetails","sectionsToObserve","userHeight","innerHeight","calculateSection","mainEntry","topSection","stickyBar","activeElement","sectionIndex","observerMainStickyBar","openFlyer","promoFlyerUrl","screen","dimentionsSetting","flyerUrl","previousStickyNavBarButton","StickyNavBarButton","stickyNav","buttonCtaContainer","barItems","containerItems","boundingClientRect","unobserve","observerStickyNavBar","alreadyClicked","reDrawMap","disableShowButton","InitMap","OptionsForMap","googleApi","NearbyComms","mapExpanded","HideLoading","CreateMap","isBasicListing","logBasicListingEvent","communityId","googleMapScript","SetUpGoogleApi","result","MarketPoints","iconNearByCommMulti","iconNearByComm","commIds","getCommunityMapCards","basicIds","isGalleryXp","children","getPropertyMapSides","css","InitDrivingDirection","isPreview","isMpc","isMPCommunity","GetPropertyMapRightSide","isMPC","mapWidth","mapHeight","isBasicCommunity","logMultiEvent","toggle","$buildderTabMap","toggleClass","readCookie","setDate","currentMonth","getMonth","currentYear","getFullYear","datepicker","minDate","mousedown","initTrigger","dateValue","actualDate","TrackShowRouteEvents","search_value","currency","inputWrapper","trim","drivingDirectionAction","eventForTdv","builder","market","Geocoder","geocode","status","GeocoderStatus","OK","Loggin","_parameters","ShowPhoneNumber","LogClick","print","lnkPhoneNumber","$","buttonSection","numberSection","dataPost","commId","logActionMethodUrl","directionsContainer","mapSection","onCommuteCalculatorScriptLoad","CommuteCalculator","initDrivingDirections","commuteCalculatorScript","trackDrivingDirectionEvent","drivingDirectionStatus","elementsToDisplay","showDirections","elementsToHide","switchElements","salesOfficeTabExists","builderMapButton","builderMap","currentActive","newActive","switchActive","showMap","displayMap","switchContent","recalculateRoutes","titleContainer","switchTitle","switchAddress","switchStaticMap","AjaxHelper","requestsQueue","partnerElement","getElementsByClassName","browserAcceptTypes","partnerUrl","executeCallbacks","req","succeded","always","failed","queueIndex","HTMLFieldSetElement","serialize","l","notSerializableTypes","s","j","encodeURIComponent","objectToQueryString","objectToConvert","baseQueryString","getAcceptTypes","getRequest","parametersToSend","optionalCallbacks","xhr","XMLHttpRequest","onreadystatechange","succededStatus","responseText","setRequestHeader","send","err","postRequest","abort","requestHeaders","noJsonStringify","request","requestToAbort","r","requestForQueue","getAbsolutePathRequest","siteUrl","convertToQueryString","require","domHelper","previousGuidedTourInitializer","GuidedTourInitializer","desktopConfiguration","mobileConfiguration","downloadGuidedTourHandler","mobileConfig","scriptTag","SectionLazyLoad","rootMarginObserver","hostname","preventLazyLoadSectionDefaultBehavior","responseFragment","lazyLoadSection","lazyLoadSections","initLazyLoad","configurationElement","previousGetPreApprovedLoader","GetPreApprovedLoader","iframeConfiguration","getPreApprovedElement","alreadyLoadedScript","CloseElement","JavascriptHandler","IframePresenter","bindGetPreApprovedFunction","previousGoogleMapsDownloader","GoogleMapsDownloader","state","loaded","loading","sendAckAboutGoogleScriptLoaded","loadGoogleScript","googleScript","sendAcknowledgmentAboutGoogleScriptLoaded","globalThis","A11yDialog","focusableSelectors","_show","_hide","_maintainFocus","_bindKeypress","$el","shown","_id","_previouslyFocused","_listeners","create","$$","moveFocusToDialog","node","instantiateDialogs","_openers","opener","_closers","concat","closer","_fire","destroy","off","listeners","domEvent","listener","which","focusableChildren","child","getClientRects","getFocusableChildren","focusedItemIndex","shiftKey","trapTabKey","previousElementTogglerModule","elementsToShow","toggleElement","callForDetailSelector","ToggleElements","ElementSwitcher","previousCommunityAndNeighBorhoodHandler","removeTabFocus","performClickOnATab","selectedItem","subMenuItems","setActiveTab","showASection","subMenuName","tab","neighborhoodEvent","neighborhoodClickTarget","neighborhoodPosition","click_target1","neighborhoodClickTarget1","isIPhone","navigator","platform","qaIsAutoFocus","basicBlueForm","basicBottomBlueForm","basicStickyButtom","basicCTATopPopup","positionAttribute","dataLayerResult","queryElementWithEvents","onRecommendationSend","onRecommendationUnCheck","getAttributes","cleanProperty","charAt","triggerRecommendationEvents","eventGa4","RecommendationEvents"],"mappings":"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","file":"../homedetailxpbundle-6653a070aa.b1.min.js","sourceRoot":"..","sourcesContent":["// 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}));","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 schedulerHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n /**\r\n * @constructs NewHomeSource.SchedulerHandler\r\n */\r\n function SchedulerHandler() { }\r\n\r\n /**\r\n * Gets the google analytics tracker with the NHS id.\r\n */\r\n function getGoogleAnalyticsTracker() {\r\n if (typeof global.ga !== 'function' || typeof global.ga.getAll !== 'function') {\r\n return null;\r\n }\r\n\r\n let trackers = global.ga.getAll().filter(function (elem) {\r\n return elem.get('trackingId') === 'UA-40843711-4';\r\n });\r\n\r\n let googleAnalyticsTracker = trackers[0] ? trackers[0] : null;\r\n\r\n return googleAnalyticsTracker;\r\n }\r\n\r\n /**\r\n * Opens the modal with the custom scheduler\r\n * @param {any} element The html element that cointains the data attributes with the scheduler data.\r\n */\r\n const triggerGaEvent = function () {\r\n let googleAnalyticsTracker = getGoogleAnalyticsTracker();\r\n let id = null;\r\n\r\n if (googleAnalyticsTracker) {\r\n id = googleAnalyticsTracker.get('name');\r\n }\r\n\r\n global.ga && global.ga(id + '.send', 'event', 'Lead Events', 'TM Schedule Appt', 'Open Form');\r\n };\r\n\r\n /**\r\n * Hides or displays the date slider.\r\n * @param {boolean} display If the data slider should display or not.\r\n */\r\n SchedulerHandler.toggleMobileDateSliderForCustomScheduler = function (display) {\r\n const appointmentDateSlider = document.querySelector('[data-appointment-date-slider]');\r\n const selfGuidedDateSlider = document.querySelector('[data-self-guided-slider]');\r\n\r\n if (display) {\r\n selfGuidedDateSlider.removeAttribute('hidden');\r\n } else {\r\n appointmentDateSlider.setAttribute('hidden', '');\r\n }\r\n };\r\n\r\n /**\r\n * Opens a new tab with the scheduler url.\r\n * @param {any} element The html element that cointains the data attributes with the scheduler data.\r\n */\r\n SchedulerHandler.openSchedulerTab = function (element) {\r\n const schedulerUrl = element.dataset.schedulerUrl;\r\n\r\n triggerGaEvent();\r\n global.open(schedulerUrl, '_blank', 'noopener,noreferrer');\r\n };\r\n\r\n global.NewHomeSource.SchedulerHandler = SchedulerHandler;\r\n\r\n return SchedulerHandler;\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","(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","; (function (root, factory) {\r\n if (typeof define === \"function\" && define.amd) {\r\n define([], function () {\r\n return (root.DateSlider = factory());\r\n });\r\n } else {\r\n root.DateSlider = factory();\r\n }\r\n})(window, function () {\r\n \"use strict\";\r\n\r\n var ariaPrefix = \"aria\";\r\n var beforeend = \"beforeend\";\r\n var culture = document.documentElement.lang || \"en\";\r\n var dateSliderPrefix = \"date-slider\";\r\n var day = \"day\";\r\n var pixel = \"px\";\r\n var role = \"role\";\r\n var selectedWord = \"selected\";\r\n var available = \"available\";\r\n var transitionDuration = \"transitionDuration\";\r\n var numberDayNotAvailable = 1;\r\n var queryAlertNotAvailable = \"[data-alert-not-available]\";\r\n var ariaSelected = ariaAttribute(selectedWord);\r\n var ariaHidden = ariaAttribute(\"hidden\");\r\n var dateSliderDay = dateSliderAttribute(day);\r\n var dateSliderSelected = dateSliderAttribute(selectedWord);\r\n var dateAvailable = dateSliderAttribute(available);\r\n var selectedAttributes = [dateSliderSelected, ariaSelected];\r\n var atWord = culture === \"en\" ? \"at\" : \"al\";\r\n\r\n /*\r\n * Default configuration constants.\r\n */\r\n var configuration = {\r\n day: 86400000,\r\n dayAsNumberFormatter: new Intl.DateTimeFormat(culture, { day: \"numeric\" }),\r\n dayFormatter: new Intl.DateTimeFormat(culture, { weekday: \"short\" }),\r\n monthFormatter: new Intl.DateTimeFormat(culture, { month: \"long\" }),\r\n monthAsNumberFormatter: new Intl.DateTimeFormat(culture, { month: \"numeric\" }),\r\n yearFormatter: new Intl.DateTimeFormat('en', { year: \"numeric\" })\r\n };\r\n\r\n /**\r\n * HTML where a given day is displayed.\r\n */\r\n var cardTemplate =\r\n \"\";\r\n\r\n var titleTemplate = \"titleButton\";\r\n\r\n /**\r\n * Default properties of the date slider object.\r\n */\r\n var dateSliderConfiguration = {\r\n cardOutside: NaN,\r\n cardSize: NaN,\r\n container: undefined,\r\n firstDay: NaN,\r\n index: 0,\r\n isClick: false,\r\n month: undefined,\r\n totalCards: 0,\r\n touchStart: NaN,\r\n touchNow: NaN,\r\n x: 0,\r\n noAvailable: undefined\r\n };\r\n\r\n /**\r\n * Constructor of the dateSlider component\r\n * @param {object} parameters A json object with the parameters to initialize the dateSlider\r\n */\r\n var DateSlider = function (parameters) {\r\n var _ = this;\r\n var key = undefined;\r\n var today = Date.parse(new Date().toDateString());\r\n\r\n _.config = {};\r\n\r\n for (key in dateSliderConfiguration) {\r\n if (dateSliderConfiguration.hasOwnProperty(key)) {\r\n _.config[key] = dateSliderConfiguration[key];\r\n }\r\n }\r\n\r\n _.config.container = parameters.container;\r\n _.config.queryAlertNoAvailable = queryAlertNotAvailable;\r\n _.config.phone = parameters.phone !== undefined ? parameters.phone : \"\";\r\n _.config.numberDayNotAvailable = numberDayNotAvailable;\r\n\r\n // ToDo: make the '/' the default separator and remove the separator option from constructor\r\n _.config.separator = parameters.separator && parameters.separator.length === 1\r\n ? parameters.separator\r\n : '-';\r\n _.firstDay = (parameters.firstDate - configuration.day) || today;\r\n _.latestDay = parameters.latestDay || today;\r\n _.initialSelected = parameters.firstDate || today;\r\n _.initialTotalCards = parameters.initialTotalCards || 0;\r\n _.onSetDay = null;\r\n _.config.index = parameters.firstDate !== undefined\r\n ? ((parameters.firstDate - today) / configuration.day) - 1\r\n : 0;\r\n _.initialDay = parameters.firstDate !== undefined\r\n ? today\r\n : _.firstDay;\r\n\r\n if (_.config.phone) {\r\n var notAvailableAlertElem = _.config.container.querySelector(queryAlertNotAvailable);\r\n notAvailableAlertElem.innerText = notAvailableAlertElem.innerText + \" \" + atWord + \" \" + _.config.phone;\r\n }\r\n\r\n [\"border\", \"cards\", \"margin\"].forEach(fillAttribute.bind(_));\r\n [\"today\", \"tomorrow\"].forEach(fillStringAttribute.bind(_));\r\n [\"daysContainer\", \"daysWrapper\", \"month\", \"next\", \"prev\"].forEach(fillElement.bind(_));\r\n [\"click\"].forEach(event.bind(_, onClick, \"daysContainer\", false));\r\n [\"click\"].forEach(event.bind(_, onNext, \"next\", false));\r\n [\"click\"].forEach(event.bind(_, onPrevious, \"prev\", false));\r\n [\"keydown\"].forEach(event.bind(_, onKeyDown, \"daysContainer\", false));\r\n [\"mousedown\"].forEach(event.bind(_, onTouchStart, \"daysContainer\", false));\r\n [\"mousemove\"].forEach(event.bind(_, onTouchMove, \"daysContainer\", false));\r\n [\"touchstart\"].forEach(event.bind(_, onTouchStart, \"daysContainer\", { passive: true }));\r\n [\"touchmove\"].forEach(event.bind(_, onTouchMove, \"daysContainer\", { passive: true }));\r\n [\"mouseup\", \"mouseleave\", \"touchend\"].forEach(event.bind(_, onTouchEnd, \"daysContainer\", false));\r\n\r\n requestAnimationFrame(pleaseSetTheDate.bind(undefined, _));\r\n\r\n watchForStylesRecalculation(this);\r\n\r\n setHidden(_);\r\n };\r\n\r\n /**\r\n * public\r\n * cardTotalSize: returns the size of the card including the margin.\r\n */\r\n DateSlider.prototype.cardTotalSize = function () {\r\n return this.config.cardSize + this.config.cardOutside;\r\n };\r\n\r\n /**\r\n * public\r\n * createDayCard: returns the HTML as string that represents a card with a date in the date slider.\r\n *\r\n * @param {object} card object containing the date information that is going to be displayed in the card.\r\n */\r\n DateSlider.prototype.createDayCard = function (card) {\r\n var _ = this;\r\n\r\n _.latestDay += configuration.day;\r\n _.config.totalCards += 1;\r\n\r\n return replaceTemplate(card, cardTemplate);\r\n };\r\n\r\n /**\r\n * public\r\n * createDayObject: returns an object with the information needed to generated the card HTML.\r\n *\r\n * @param {boolean} isHidden true if the card is not visible when added to the DOM, otherwise false.\r\n */\r\n DateSlider.prototype.createDayObject = function (isHidden, isAvailable) {\r\n var _ = this;\r\n var currentDay = new Date(_.latestDay);\r\n var titleButton = \"\";\r\n var today = Date.parse(new Date().toDateString());\r\n\r\n if (_.latestDay === today) {\r\n titleButton = titleTemplate.replace(\"titleButton\", _.today);\r\n } else if (_.latestDay - configuration.day === today) {\r\n titleButton = titleTemplate.replace(\"titleButton\", _.tomorrow);\r\n }\r\n var card = {\r\n aria: {\r\n selected: false,\r\n hidden: isHidden\r\n },\r\n name: configuration.dayFormatter\r\n .format(currentDay)\r\n .toUpperCase()\r\n .replace(\".\", \"\"),\r\n number: currentDay.getDate(),\r\n px: _.config.cardSize + pixel,\r\n title: titleButton\r\n };\r\n\r\n card[dateSliderPrefix] = {\r\n day: Date.parse(currentDay),\r\n selected: false,\r\n available: isAvailable\r\n };\r\n\r\n return card;\r\n };\r\n\r\n /**\r\n * public\r\n * isScrolling: returns true if a touchStart event has been triggered, otherwise false.\r\n */\r\n DateSlider.prototype.isScrolling = function () {\r\n return this.config.touchStart || this.config.touchStart === 0;\r\n };\r\n\r\n /**\r\n * public\r\n * Watch the element until it's visible, and recalculates the styles.\r\n */\r\n let watchForStylesRecalculation = function (datePicker) {\r\n let config = {\r\n root: datePicker.config.container.parentElement\r\n };\r\n\r\n /**\r\n * Watch for the visibility of the container, we need to do this because initializing a Date Slider\r\n * While it's hidden causes a lot of issues with the component\r\n */\r\n let observer = new IntersectionObserver(function (entries, intersectionObserver) {\r\n entries.forEach(function (entry) {\r\n if (entry.isIntersecting) {\r\n datePicker.recalculateSize();\r\n }\r\n });\r\n }, config);\r\n\r\n let element = datePicker.config.container;\r\n\r\n observer.observe(element);\r\n }\r\n\r\n /**\r\n * public\r\n * recalculateSize: sets the cardOutside and cardSize values.\r\n *\r\n * @param {function} callback function to execute after the recalculation.\r\n */\r\n DateSlider.prototype.recalculateSize = function (callback) {\r\n var _ = this;\r\n\r\n requestAnimationFrame(calculateSize.bind(undefined, _, callback));\r\n }\r\n \r\n /**\r\n * public\r\n * setDay: sets the day from the given milliseconds as selected.\r\n *\r\n * @param {number} milliseconds date represented as milliseconds that will be used to populate the title.\r\n */\r\n DateSlider.prototype.setDay = function (milliseconds) {\r\n milliseconds = new Date(new Date(milliseconds * 1).toDateString()) * 1;\r\n var _ = this;\r\n var separator = _.config.separator;\r\n var previousSelectedElement = undefined;\r\n var selectedElement = undefined;\r\n var date = configuration.monthAsNumberFormatter.format(milliseconds) + separator +\r\n configuration.dayAsNumberFormatter.format(milliseconds) + separator +\r\n configuration.yearFormatter.format(milliseconds);\r\n\r\n previousSelectedElement = searchElement(_, selectedWord + \"='true'\");\r\n selectedElement = searchElement(_, day + \"='\" + milliseconds + \"'\");\r\n selectedAttributes.forEach(\r\n bindAttribute.bind(previousSelectedElement, false)\r\n );\r\n selectedAttributes.forEach(bindAttribute.bind(selectedElement, true));\r\n\r\n if (typeof _.onSetDay === \"function\") {\r\n _.onSetDay(date);\r\n }\r\n };\r\n\r\n /**\r\n * public\r\n * setMonth: sets the month from the give date as title in the HTML.\r\n *\r\n * @param {date} date any date that will be used to populate the title.\r\n */\r\n DateSlider.prototype.setMonth = function (date) {\r\n var _ = this;\r\n var month = undefined;\r\n\r\n date = date || _.latestDay;\r\n month = configuration.monthFormatter.format(date);\r\n _.config.month = month;\r\n _.month.innerHTML = month;\r\n };\r\n\r\n /**\r\n * public\r\n * translate: moves the daysContainer in X axis the amount of pixels indicated.\r\n *\r\n * @param {number} translation amount of pixels to move the container in X axis.\r\n */\r\n DateSlider.prototype.translate = function (translation) {\r\n var _ = this;\r\n var third = _.config.cardSize / 3;\r\n\r\n _.config.x += translation;\r\n _.daysContainer.style[\"transform\"] =\r\n \"translateX(\" + _.config.x + pixel + \")\";\r\n\r\n if (Math.abs(_.config.x) > third) {\r\n _.prev.removeAttribute(\"disabled\");\r\n } else {\r\n _.prev.setAttribute(\"disabled\", \"true\");\r\n }\r\n\r\n tomorrowNeverKnows(_);\r\n };\r\n\r\n /**\r\n * public\r\n * updateMonth: sets the month name according to the object index.\r\n *\r\n * @param {object} _ instance that is being updated.\r\n */\r\n DateSlider.prototype.updateMonth = function () {\r\n var _ = this;\r\n var indexDate = _.initialDay + configuration.day * _.config.index;\r\n\r\n if (configuration.monthFormatter.format(indexDate) !== _.config.month) {\r\n _.setMonth(indexDate);\r\n }\r\n };\r\n\r\n /**\r\n * private\r\n * ariaAttribute: returns the name of an attribute with the aria prefix;\r\n *\r\n * @param {string} word name of the attribute.\r\n */\r\n function ariaAttribute(word) {\r\n return ariaPrefix + \"-\" + word;\r\n }\r\n\r\n /**\r\n * private\r\n * calculateSize: calculates the value of the cardOutside and cardSize, and then updates the width of the days.\r\n *\r\n * @param {object} _ instance where the amount of cards configured are going to be added as days.\r\n * @param {function} callback function to execute after the recalculation.\r\n */\r\n function calculateSize(_, callback) {\r\n var width = _.daysWrapper.offsetWidth;\r\n var days = null;\r\n\r\n _.config.cardOutside = _.margin + _.border;\r\n _.config.cardSize = width / _.cards - _.config.cardOutside;\r\n\r\n days = [].slice.call(_.daysContainer.querySelectorAll(\"[date-slider-day]\"));\r\n days.forEach(function (day) {\r\n day.style[\"width\"] = _.config.cardSize + pixel;\r\n });\r\n\r\n if (typeof callback === \"function\") {\r\n callback(_);\r\n }\r\n }\r\n\r\n /**\r\n * private\r\n * bindAttribute: sets the value of the given attribute in the DOM element.\r\n *\r\n * @param {any} value value to be set for the attribute.\r\n * @param {string} attribute name of the attribute.\r\n */\r\n function bindAttribute(value, attribute) {\r\n var _ = this;\r\n\r\n if (!_) {\r\n return;\r\n }\r\n\r\n _.setAttribute(attribute, value);\r\n }\r\n\r\n /**\r\n * private\r\n * dateSliderAttribute: returns the name of an attribute with the date-slider prefix;\r\n *\r\n * @param {string} word name of the attribute.\r\n */\r\n function dateSliderAttribute(word) {\r\n return dateSliderPrefix + \"-\" + word;\r\n }\r\n\r\n /**\r\n * private\r\n * event: adds an event listener to the give eventName point to the given handler.\r\n *\r\n * @param {function} handler function to be executed when the event is triggered.\r\n * @param {string} element name of the property that references the node element that will trigger the event.\r\n * @param {string} eventName name of the event to be add to the current node element.\r\n */\r\n function event(handler, element, passiveOption, eventName) {\r\n this[element].addEventListener(eventName, handler.bind(this), passiveOption);\r\n }\r\n\r\n /**\r\n * private\r\n * fillAttribute: creates a property on the caller with the attribute from the given DOM node.\r\n *\r\n * @param {string} attribute name of the attribute without the date-slider prefix.\r\n */\r\n function fillAttribute(attribute) {\r\n this[attribute] = +this.config.container.getAttribute(\r\n dateSliderAttribute(attribute)\r\n );\r\n }\r\n\r\n /**\r\n * private\r\n * fillStringAttribute: creates a property on the caller with the attribute from the given DOM node.\r\n *\r\n * @param {string} attribute name of the attribute without the date-slider prefix.\r\n */\r\n function fillStringAttribute(attribute) {\r\n this[attribute] = this.config.container.getAttribute(\r\n dateSliderAttribute(attribute)\r\n );\r\n }\r\n\r\n /**\r\n * private\r\n * fillElement: creates a property on the caller with the DOM node that matches the given role.\r\n *\r\n * @param {string} element name of the role.\r\n */\r\n function fillElement(element) {\r\n this[element] = searchElement(this, role + \"='\" + element + \"'\");\r\n }\r\n\r\n /**\r\n * private\r\n * haveANiceDay: shining like a diamond, rolling with the dice.\r\n *\r\n * @param {object} _ instance where the amount of cards configured are going to be added as days.\r\n * @param {boolean} isHidden true if the card is not visible when append to the DOM, otherwise false.\r\n */\r\n function haveANiceDay(_, isHidden, isAvailable, paintCards) {\r\n var card = undefined;\r\n var daysHtml = \"\";\r\n var cardsCreated = undefined;\r\n var numberOfCards = paintCards ? paintCards : _.cards;\r\n\r\n for (cardsCreated = 0; cardsCreated < numberOfCards; cardsCreated += 1) {\r\n card = _.createDayObject(isHidden, isAvailable);\r\n daysHtml += _.createDayCard(card);\r\n }\r\n\r\n _.daysContainer.insertAdjacentHTML(beforeend, daysHtml);\r\n\r\n return cardsCreated;\r\n }\r\n\r\n /**\r\n * private\r\n * movementX: returns the clientX coordinate of the mouse or touch event.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function movementX(event) {\r\n return event.changedTouches\r\n ? event.changedTouches[0].clientX\r\n : event.clientX;\r\n }\r\n\r\n /**\r\n * private\r\n * onClick: handler of the click or touch events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onClick(event) {\r\n var _ = this;\r\n var filter = undefined;\r\n var target = undefined;\r\n\r\n if (!_.config.isClick) {\r\n return;\r\n }\r\n\r\n filter = \"[\" + dateSliderDay + \"]\";\r\n available = \"[\" + dateAvailable + \"='true']\";\r\n\r\n for (\r\n target = event.target;\r\n target && target != _.config.container;\r\n target = target.parentNode\r\n ) {\r\n if (target.matches(filter) && target.matches(available)) {\r\n _.setDay(target.getAttribute(dateSliderDay));\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * private\r\n * onKeyDown: handler of the key press event.\r\n * \r\n * @param {event} event with the key press information.\r\n */\r\n function onKeyDown(event) {\r\n var _ = this;\r\n var indexDate = undefined;\r\n var indexDay = undefined;\r\n\r\n if (!event.target.tagName.match(\"TEXTAREA|INPUT|SELECT\")) {\r\n if (event.keyCode === 37) {\r\n onPrevious.call(_);\r\n } else if (event.keyCode === 39) {\r\n onNext.call(_);\r\n } else if (event.keyCode === 13) {\r\n indexDate = _.firstDay + configuration.day * _.config.index;\r\n indexDay = +searchElement(_, day + \"='\" + indexDate + \"'\").getAttribute(dateSliderDay);\r\n _.setDay(indexDay);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * private\r\n * onNext: handler of the next button click .\r\n */\r\n function onNext() {\r\n var _ = this;\r\n var cardSize = _.cardTotalSize();\r\n var difference = Math.abs(_.config.x) - _.config.index * cardSize;\r\n var indexDate = _.initialDay + configuration.day * _.config.index;\r\n var indexDay = +searchElement(_, day + \"='\" + indexDate + \"'\").getAttribute(\r\n dateSliderDay\r\n );\r\n var milliseconds = undefined;\r\n var move = cardSize * -1;\r\n var selectedDay = +searchElement(_, selectedWord + \"='true'\").getAttribute(\r\n dateSliderDay\r\n );\r\n\r\n if (Math.abs(difference) < 1) {\r\n difference = 0;\r\n }\r\n\r\n if (difference) {\r\n difference = (cardSize - difference) * -1;\r\n\r\n if (Math.abs(difference) > cardSize) {\r\n difference += cardSize;\r\n }\r\n }\r\n\r\n if (indexDay > selectedDay) {\r\n milliseconds = indexDay + configuration.day;\r\n } else {\r\n milliseconds = selectedDay + configuration.day;\r\n }\r\n\r\n _.daysContainer.style[transitionDuration] = \"0.3s\";\r\n _.config.index += 1;\r\n _.translate(difference || move);\r\n _.updateMonth();\r\n _.setDay(milliseconds);\r\n\r\n setHidden(_);\r\n }\r\n\r\n /**\r\n * private\r\n * onPrevious: handler of the previous button click.\r\n */\r\n function onPrevious() {\r\n var _ = this;\r\n var cardSize = _.cardTotalSize();\r\n var difference = Math.abs(_.config.x) - _.config.index * cardSize;\r\n var indexDate = _.initialDay + configuration.day * _.config.index;\r\n var indexDay = +searchElement(_, day + \"='\" + indexDate + \"'\").getAttribute(\r\n dateSliderDay\r\n );\r\n var milliseconds = undefined;\r\n var move = cardSize;\r\n var selectedDay = +searchElement(_, selectedWord + \"='true'\").getAttribute(\r\n dateSliderDay\r\n );\r\n\r\n if (Math.abs(difference) < 1) {\r\n difference = 0;\r\n }\r\n\r\n if (difference) {\r\n difference = cardSize + difference;\r\n\r\n if (Math.abs(difference) > cardSize) {\r\n difference -= cardSize;\r\n }\r\n }\r\n\r\n if (indexDay > selectedDay) {\r\n milliseconds = indexDay - configuration.day;\r\n } else {\r\n milliseconds = selectedDay - configuration.day;\r\n }\r\n\r\n _.daysContainer.style[transitionDuration] = \"0.3s\";\r\n _.translate(difference || move);\r\n\r\n if (_.config.numberDayNotAvailable === 0 || searchElement(_, day + \"='\" + milliseconds + \"'\").getAttribute(dateAvailable) !== \"false\") {\r\n _.config.index -= 1;\r\n _.updateMonth();\r\n _.setDay(milliseconds);\r\n }\r\n\r\n setHidden(_);\r\n }\r\n\r\n /**\r\n * private\r\n * onTouchEnd: handler of mouse up and touch end events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchEnd(event) {\r\n var _ = this;\r\n var totalMovement = Math.abs(movementX(event) - _.config.touchStart);\r\n _.config.container.querySelector(_.config.queryAlertNoAvailable).setAttribute(\"hidden\", \"\");\r\n\r\n _.config.isClick = totalMovement < 10;\r\n\r\n if (!_.isScrolling()) {\r\n return;\r\n }\r\n\r\n _.config.touchNow = null;\r\n _.config.touchStart = null;\r\n\r\n if (_.config.x > 0) {\r\n _.daysContainer.style[transitionDuration] = \"0.7s\";\r\n _.translate(-_.config.x);\r\n return;\r\n }\r\n\r\n _.config.index = Math.abs(Math.round(_.config.x / _.cardTotalSize()));\r\n\r\n setHidden(_);\r\n }\r\n\r\n /**\r\n * private\r\n * onTouchMove: handler of mouse and touch move events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchMove(event) {\r\n var _ = this;\r\n var clientX = undefined;\r\n var translation = undefined;\r\n\r\n if (!_.isScrolling()) {\r\n return;\r\n }\r\n\r\n clientX = movementX(event);\r\n translation = clientX - _.config.touchNow;\r\n\r\n _.config.touchNow = clientX;\r\n _.config.index = Math.abs(Math.round(_.config.x / _.cardTotalSize())) || 0;\r\n _.translate(translation);\r\n _.updateMonth();\r\n }\r\n\r\n /**\r\n * private\r\n * onMouseOver: handler of on mouse over.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function handlerAlertNotAvailable(event) {\r\n var config = this;\r\n var element = config.container.querySelector(config.queryAlertNoAvailable);\r\n if (event.type === \"mouseenter\" || event.type === \"click\" || event.type === \"touchend\") {\r\n element.removeAttribute(\"hidden\");\r\n }\r\n else {\r\n element.setAttribute(\"hidden\", \"\");\r\n }\r\n }\r\n\r\n /**\r\n * private\r\n * onTouchStart: handler of mouse down and touch start events.\r\n *\r\n * @param {event} event\r\n */\r\n function onTouchStart(event) {\r\n var _ = this;\r\n var clientX = movementX(event);\r\n _.config.container.querySelector(_.config.queryAlertNoAvailable).setAttribute(\"hidden\", \"\");\r\n _.daysContainer.style[transitionDuration] = \"\";\r\n _.config.touchStart = clientX;\r\n _.config.touchNow = clientX;\r\n _.config.isClick = true;\r\n }\r\n\r\n /**\r\n * private\r\n * pleaseSetTheDate: well, don't say tomorrow 'cause tomorrow is too far away.\r\n *\r\n * @param {object} _ instance setting the date.\r\n */\r\n function pleaseSetTheDate(_) {\r\n _.recalculateSize(function (data) {\r\n var today = Date.parse(new Date().toDateString());\r\n var selectedDate = new Date(_.firstDay);\r\n var days = Math.round(Math.abs((today - selectedDate) / configuration.day));\r\n\r\n days += data.config.numberDayNotAvailable;\r\n data.translate(data.cardTotalSize() * days * -1);\r\n });\r\n\r\n if (_.config.numberDayNotAvailable > 0) {\r\n _.initialTotalCards -= haveANiceDay(_, true, false, _.config.numberDayNotAvailable);\r\n }\r\n\r\n _.initialTotalCards -= haveANiceDay(_, false, true);\r\n _.initialTotalCards -= haveANiceDay(_, true, true);\r\n\r\n if (_.initialTotalCards > 0) {\r\n _.initialTotalCards -= haveANiceDay(_, true, true, _.initialTotalCards);\r\n }\r\n\r\n _.setMonth(_.firstDay + (configuration.day * _.config.numberDayNotAvailable));\r\n _.setDay(_.firstDay + (configuration.day * _.config.numberDayNotAvailable));\r\n _.config.index += _.config.numberDayNotAvailable;\r\n _.config.noAvailable = _.config.container.querySelector(\"[\" + dateAvailable + \"='false']\");\r\n [\"mouseenter\", \"click\", \"mouseleave\", \"touchend\"].forEach(event.bind(_.config, handlerAlertNotAvailable, \"noAvailable\", false));\r\n\r\n setHidden(_);\r\n }\r\n\r\n /**\r\n * private\r\n * replaceTemplate: function to replace the configurable values from the cardTemplate.\r\n *\r\n * @param {object} obj values to be replaced in the template.\r\n * @param {string} template template to be replaced.\r\n * @param {string} prefix nested properties refers to their parents as a prefix.\r\n */\r\n function replaceTemplate(obj, template, prefix) {\r\n var attribute = undefined;\r\n var key = undefined;\r\n var value = undefined;\r\n\r\n prefix = prefix || \"\";\r\n\r\n for (key in obj) {\r\n if (typeof obj[key] === \"object\") {\r\n template = replaceTemplate(obj[key], template, key + \"-\");\r\n } else {\r\n attribute = prefix + key;\r\n value = prefix ? attribute + \"='\" + obj[key] + \"'\" : obj[key];\r\n template = template.replace(attribute, value);\r\n }\r\n }\r\n\r\n return template;\r\n }\r\n\r\n /**\r\n * private\r\n * searchAllElements: searches all the DOM nodes that belongs to the given instance and matches the given query.\r\n *\r\n * @param {object} instance where the search is going to be executed.\r\n * @param {string} query filter the elements by a given criteria.\r\n */\r\n function searchAllElements(instance, query) {\r\n var filter = dateSliderAttribute(query);\r\n return instance.config.container.querySelectorAll(\"[\" + filter + \"]\");\r\n }\r\n\r\n /**\r\n * private\r\n * searchElement: search for the first DOM nodes that belongs to the given instance and matches the given query.\r\n *\r\n * @param {object} instance where the search is going to be executed.\r\n * @param {string} query filter the elements by a given criteria.\r\n */\r\n function searchElement(instance, query) {\r\n var filter = dateSliderAttribute(query);\r\n return instance.config.container.querySelector(\"[\" + filter + \"]\");\r\n }\r\n\r\n /**\r\n * private\r\n * setHidden: updates the aria-hidden attribute to reflect what is visible on the screen.\r\n *\r\n * @param {object} _ instance where the aria-hidden attribute is going to be updated.\r\n */\r\n function setHidden(_) {\r\n var cards = [].slice.call(searchAllElements(_, day));\r\n var isHidden = undefined;\r\n var lastVisibleCard = _.config.index + _.cards;\r\n var x = undefined;\r\n\r\n for (x = 0; x < _.config.totalCards; x += 1) {\r\n const card = cards[x];\r\n isHidden = x < _.config.index || x >= lastVisibleCard;\r\n card.setAttribute(ariaHidden, isHidden);\r\n\r\n if(isHidden){\r\n card.setAttribute('tabindex', '-1');\r\n }\r\n else{\r\n card.removeAttribute('tabindex');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * private\r\n * tomorrowNeverKnows: turn off your mind, relax and float down stream.\r\n *\r\n * @param {object} _ instance where the new days are going to be added.\r\n */\r\n function tomorrowNeverKnows(_) {\r\n var availableCards = _.config.totalCards - _.config.index * 2;\r\n var card = undefined;\r\n\r\n if (availableCards < _.cards) {\r\n card = _.createDayObject(true, true);\r\n _.daysContainer.insertAdjacentHTML(beforeend, _.createDayCard(card));\r\n }\r\n }\r\n\r\n return DateSlider;\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('
');\r\n jQuery('#nhs_mapwrap').append('
');\r\n jQuery('#nhs_mapwrap').append('

Updating

');\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"," //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('
' + place.name + '
' + 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('
' +\r\n '
' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '' +\r\n '
')[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 * 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","/**\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","/*\r\n * summary: this module is to load a modal on the initial load\r\n * hidden input data:\r\n * data-auto-open-modal-query-string=\"queryString from url\"\r\n * button with the modal functionality:\r\n * data-auto-open-modal-(name of the modal, example: request-appointment)\r\n */\r\n(function initialLoadModalHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousInitialLoadModalHandler = global.NewHomeSource.InitialLoadModalHandler;\r\n const queySelectorHiddenInput = '[data-auto-open-modal-query-string]';\r\n const configHiddenInput = document.querySelector(queySelectorHiddenInput);\r\n const queryString = configHiddenInput.dataset.autoOpenModalQueryString;\r\n\r\n if (!configHiddenInput || !queryString) {\r\n return null;\r\n }\r\n\r\n /**\r\n * @private\r\n * removeQueryStringFromUrl: function to remove the queryString from the url\r\n */\r\n function removeQueryStringFromUrl() {\r\n const currentUrl = global.location.href;\r\n\r\n const url = new URL(currentUrl);\r\n const params = new URLSearchParams(url.search);\r\n params.delete('autoopenmodal');\r\n url.search = params.toString();\r\n const newUrl = url.toString();\r\n\r\n global.history.pushState({}, null, newUrl);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.InitialLoadModalHandler\r\n */\r\n function InitialLoadModalHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * DisplayModal: function to display the modal from the url in the target element\r\n * @param {string} querySelectorForData query selector to get the needed data\r\n */\r\n InitialLoadModalHandler.DisplayModal = function DisplayModal() {\r\n const querySelectorModal = `[data-auto-open-modal-${queryString}]`;\r\n const targetElement = document.querySelector(querySelectorModal);\r\n\r\n if (targetElement) {\r\n removeQueryStringFromUrl();\r\n targetElement.click();\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.InitialLoadModalHandler to the previous script.\r\n */\r\n InitialLoadModalHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.InitialLoadModalHandler = previousInitialLoadModalHandler;\r\n return InitialLoadModalHandler;\r\n };\r\n\r\n global.NewHomeSource.InitialLoadModalHandler = InitialLoadModalHandler;\r\n\r\n return InitialLoadModalHandler;\r\n}(window));\r\n","NHS.Scripts.HomeDetailXp = function (parameters) {\r\n\r\n //Initializing parameters\r\n this.parameters = parameters;\r\n this.saveHomeMethod = parameters.saveHomeMethod;\r\n this.gallery = new Array();\r\n this.galleryIndex = 0;\r\n this.logger = new NHS.Scripts.Globals.EventLogger({\r\n parentCommunityId: parameters.parentCommunityId,\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 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.HomeDetailXp.prototype = {\r\n initialize: function () {\r\n var self = this;\r\n\r\n /**\r\n * Lazy loads ratings and reviews component, and only if the builder has reviews\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 self.favs.init();\r\n\r\n // Create the interactive map\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 var propertyId = self.parameters.isSpec ? self.parameters.specId : self.parameters.planId;\r\n function attachTrackingEvents() {\r\n\r\n // Request and appointment\r\n var appoinmentButtons = document.querySelectorAll(\"#btn_NhsMapSend\");\r\n for (var i = 0; i < appoinmentButtons.length; i++) {\r\n var button = appoinmentButtons[i];\r\n\r\n button.addEventListener(\"click\", function () {\r\n jQuery.googlepush('Home Detail Events', 'Request An Appointment button', propertyId, 2, false);\r\n });\r\n }\r\n\r\n // Tab switching\r\n var tabsContainer = document.querySelector(\".map__tabs\");\r\n if (tabsContainer) {\r\n tabsContainer.addEventListener(\"click\", function () {\r\n jQuery.googlepush('Home Detail Events', 'Map - Tab', propertyId, 2, false);\r\n });\r\n }\r\n }\r\n\r\n attachTrackingEvents();\r\n\r\n jQuery(\"body\").on(\"click\", \"a[href=#top]\", function () {\r\n jQuery(\"html, body\").animate({\r\n scrollTop: 0\r\n }, \"slow\");\r\n return false;\r\n });\r\n\r\n function downLoadFloorPlanOptionsModule() {\r\n const jsInput = document.getElementById('floorPlanOptionsJavascriptUrl');\r\n const checkBox = this;\r\n if (jsInput) {\r\n NHS.loadJs(jsInput.value, 'floorPlanOptionsScript', function () {\r\n const floorPlanOptionsContainer = document.querySelector('[data-floor-plan-options-container]');\r\n if (floorPlanOptionsContainer) {\r\n floorPlanOptionsContainer.setAttribute('data-floor-plan-container', true);\r\n checkBox.dispatchEvent(new Event('click'));\r\n }\r\n });\r\n jsInput.remove();\r\n }\r\n }\r\n\r\n // Floorplan Options Section\r\n if (this.parameters.showfloorsection) {\r\n var url;\r\n if (this.parameters.floorPlanActionUrl.indexOf(\"planid\") !== -1) {\r\n url = this.parameters.floorPlanActionUrl.replace(\"{planid}\", this.parameters.planId);\r\n } else {\r\n url = this.parameters.floorPlanActionUrl.replace(\"{specid}\", this.parameters.specId);\r\n }\r\n jQuery.ajax({\r\n type: \"POST\",\r\n url: url,\r\n data: JSON.stringify(self.parameters.floorplanOptionsViewModel),\r\n contentType: 'application/json',\r\n success: function (data) {\r\n jQuery(\"#nhs_FloorPlanAreaSection\").html(data);\r\n const checkBoxesElements = document.querySelectorAll('[data-floor-plan-option=\"true\"]');\r\n for (let i = 0; i < checkBoxesElements.length; i += 1) {\r\n checkBoxesElements[i].addEventListener('click', downLoadFloorPlanOptionsModule);\r\n }\r\n }\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._updateAdsPosition();\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 });\r\n }\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 //Click for Saving Home\r\n jQuery(document).on(\"click\", \"span#nhs_SaveThisItem, span.nhs_Save.nhs_Saved, a.nhs_ItemSaved\", function () {\r\n jQuery.post(self.parameters.removeHomeMethod, {\r\n builderId: self.parameters.builderId\r\n }, (function (json) {\r\n self.ShowSuccessMessage(json);\r\n jQuery(\"p #nhs_NextStepsSaveThisItem\").removeClass(\"nhs_ItemSaved\").text(self.parameters.SaveToFavoritesText);\r\n jQuery(\"#nhs_NextStepsSaveThisItem\").on(\"click\", function (event) {\r\n if (!jQuery(this).is(\".nhs_ItemSaved\")) {\r\n self.SaveHome(true);\r\n event.stopImmediatePropagation();\r\n }\r\n });\r\n }).bind(this), \"json\");\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 //Offers Click Listener\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 self.googleAnalyticsBindings();\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 const 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 const similarHomesContainer = document.querySelector('#nhs_HomeCarousel');\r\n if (similarHomesContainer) {\r\n similarHomesContainer.addEventListener('sectionLazyLoaded', (event) => {\r\n self.favs.init();\r\n });\r\n }\r\n },\r\n selectFloorPlanType: function (elem) {\r\n if (elem.classList.contains(\"nhs_ViewFloorPlan\")) {\r\n document.querySelector(\".bxslider li [data-type='FLP']\").click();\r\n }\r\n if (elem.classList.contains(\"nhs_ViewInteractiveFloorPlan\")) {\r\n document.querySelector(\".bxslider li [data-type='IFP']\").click();\r\n }\r\n },\r\n setUpGalleryXp: function () {\r\n var self = this;\r\n self.MediaData = self.parameters.gallery.mediaResult;\r\n\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 * 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\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\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 return image;\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 const videoIcon = document.querySelector('[data-video-icon-second]');\r\n\r\n self.galleryIndex = 0;\r\n\r\n if (self.gallery.length === 0) {\r\n return;\r\n }\r\n\r\n if (typeof bindEvents === \"undefined\" || !!bindEvents) {\r\n var countInterior = 0;\r\n var countExterior = 0;\r\n var countFloor = 0;\r\n var countVideo = 0;\r\n self.detailGallery = new NHS.Scripts.Gallery(document.querySelector(\"#gallery\"), self.gallery.map(function (img) {\r\n var collection = img.CollectionName;\r\n\r\n var elementPosition = 0;\r\n if (collection === \"Interior\") {\r\n elementPosition = countInterior;\r\n countInterior++;\r\n } else if (collection === \"Exterior\") {\r\n elementPosition = countExterior;\r\n countExterior++;\r\n } else if (collection === \"FloorPlan\") {\r\n elementPosition = countFloor;\r\n countFloor++;\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 isFloorPlan: img.Type === \"FLP\",\r\n position: elementPosition,\r\n };\r\n }));\r\n self.detailGallery.onChange = function (index) {\r\n self.galleryIndex = index;\r\n videoIcon.setAttribute('hidden', '');\r\n if (self.gallery[self.galleryIndex].CollectionName.toLowerCase() === \"video\") {\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Community\").addClass(\"Video\");\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(\"Community Video\");\r\n videoIcon.removeAttribute('hidden');\r\n } else {\r\n commTitle = self.getCaptionToDisplay(self.gallery[self.galleryIndex].AltText);\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_DetailGalleryMain .nhs_DetailTileBottom span:eq(1)\").text((self.galleryIndex + 1) + \"/\" + self.gallery.length);\r\n }\r\n }\r\n\r\n videoIcon.setAttribute('hidden', '');\r\n\r\n if (self.gallery[0].CollectionName.toLowerCase() === \"video\") {\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(\"Community Video\");\r\n videoIcon.removeAttribute('hidden');\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Community\").addClass(\"Video\");\r\n } else {\r\n commTitle = self.getCaptionToDisplay(self.gallery[self.galleryIndex].AltText);\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\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 performLazyLoad: function (idOfVisibleElement, dataForAjax, urlForAjax, successAjaxFunction) {\r\n var lazyLoadReady = false;\r\n var visibleElement = document.querySelector(\"#\" + idOfVisibleElement);\r\n var dataLazyLoadMapAndDirections = {\r\n ElementVisibleId: idOfVisibleElement,\r\n UpdateAction: function () {\r\n var isVisible = false;\r\n\r\n if (visibleElement) {\r\n isVisible = visibleElement.childNodes.length > 0;\r\n }\r\n\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 jQuery.LazyLoad(dataLazyLoadMapAndDirections);\r\n },\r\n\r\n googleAnalyticsBindings: function () {\r\n jQuery(document).on('mousedown', 'a.btn_MoreInfo', function (event) {\r\n NHS.Scripts.Helper.createCookie(\"CTAName\", \"Home - Request More Information - CTA - Submit\");\r\n\r\n jQuery.googlepush(\"Lead Events\", 'Home - Request More Information - CTA - Modal Open', \"Request More Info\");\r\n });\r\n },\r\n\r\n SaveHome: function (isNextStepsSaveClick) {\r\n var self = this;\r\n\r\n jQuery.post(self.saveHomeMethod, {\r\n builderId: self.parameters.builderId\r\n }, (function (json) {\r\n self.ShowSuccessMessage(json);\r\n if (json.data) {\r\n jQuery(\"#nhs_NextStepsSaveThisItem\").removeAttr(\"onclick\");\r\n jQuery(\"#nhs_NextStepsSaveThisItem\").removeAttr(\"href\");\r\n jQuery(\"#liSaveToPlanner\").html('' + self.parameters.SavedText + \"\");\r\n jQuery(\"a#nhs_Saved\").replaceWith(\"\" + self.parameters.SavedText + \"\");\r\n jQuery(\"p #nhs_NextStepsSaveThisItem\").addClass(\"nhs_ItemSaved\").text(self.parameters.SavedText).removeAttr(\"onclick\").removeAttr(\"href\");\r\n\r\n }\r\n }).bind(this), \"json\");\r\n logger.logEventWithParameters((isNextStepsSaveClick ? self.parameters.NextStepsClickSave : \"HOMSTC\"), self.parameters.logInfo);\r\n },\r\n NextStepsSaveHome: function () {\r\n var self = this;\r\n if (!jQuery(this).is(\".nhs_ItemSaved\"))\r\n self.SaveHome(true);\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(\"\" + self.parameters.SavedToYourProfileText + \"\");\r\n jQuery(\"#SuccessMessage\").show();\r\n //RemoveHome();\r\n } else {\r\n self = this;\r\n jQuery(\"span#nhs_SaveThisItem\").replaceWith(\"\" + self.parameters.SaveToFavoritesText + \"\");\r\n jQuery(\"span.nhs_Save.nhs_Saved\").replaceWith(\"Save\");\r\n jQuery(\"a#nhs_SaveThisItem, a.nhs_Save\").on(\"click\", function () {\r\n self.SaveHome();\r\n });\r\n }\r\n }\r\n },\r\n\r\n _updateAdsPosition: function () {\r\n var detailInfo = document.querySelector(\".nhs_DetailMain:not(.nhs_First)\");\r\n var adCol = document.querySelector(\"#nhs_AdColumn\");\r\n var 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 var updateHandler = function () {\r\n detailInfo.style.height = \"\"; // Make sure height values are as default before calculating the real heights \r\n\r\n var detailInfoHeight = detailInfo.getBoundingClientRect().height;\r\n var containerHeight = container.getBoundingClientRect().height;\r\n\r\n if (detailInfoHeight > containerHeight) {\r\n var totalHeightDetail = detailInfoHeight - 250;\r\n adCol.style.height = totalHeightDetail + \"px\";\r\n } else {\r\n containerHeight += 30;\r\n adCol.style.height = containerHeight + \"px\";\r\n detailInfo.style.height = containerHeight + \"px\";\r\n }\r\n\r\n if (document.documentElement.clientWidth > 976) {\r\n adCol.style.display = \"block\";\r\n } else if (adCol.style.display === \"block\") {\r\n adCol.style.display = \"none\";\r\n }\r\n };\r\n\r\n try {\r\n var resultsObserver = new MutationObserver(updateHandler);\r\n addEventListener(\"orientationchange\", updateHandler);\r\n addEventListener(\"resize\", updateHandler);\r\n resultsObserver.observe(detailInfo, {\r\n subtree: true,\r\n childList: true\r\n });\r\n } catch (e) {\r\n setInterval(updateHandler, 3000);\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 getCaptionToDisplay: function (text) {\r\n var replacedText = text;\r\n var replaceObjetive = text.match(/\\w:\\w/i);\r\n\r\n if (replaceObjetive !== null)\r\n replacedText = text.replace(replaceObjetive[0], replaceObjetive[0][0] + \": \" + replaceObjetive[0][2]);\r\n\r\n return replacedText;\r\n }\r\n}\r\n\r\ndocument.addEventListener(\"readystatechange\", function () {\r\n if (document.readyState === \"complete\") {\r\n NHS.loadCss(document.getElementById(\"detailsXpNonCriticalCss\").value);\r\n\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/*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(function () {\r\n const trustBuilderReviewsSection = document.querySelector('[data-detail-reviews-section]');\r\n const builderSection = document.getElementById('builderInfoSection');\r\n\r\n if (trustBuilderReviewsSection && builderSection) {\r\n trustBuilderReviewsSection.addEventListener('touchend', 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 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 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' 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});","/*\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} - 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","/**\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 = `
\r\n
\r\n

Mortgage rates & offers

\r\n \r\n
\r\n
`;\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})();","// The purpose of this module is to keep a list of visited MPCs in the session storage,\r\n// in order to send the parentCommunityId for events only if the mpc parent of a listing\r\n// was already visited during the current session.\r\n\r\n(function mpcEventsHelper(global) {\r\n 'use strict';\r\n\r\n // dependencies\r\n if (!global.NewHomeSource && !global.NewHomeSource.WebStorageHandler) {\r\n return false;\r\n }\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousModule = global.NewHomeSource.MpcEventsHelper;\r\n\r\n /**\r\n * @constructs NewHomeSource.MpcEventsHelper\r\n */\r\n function MpcEventsHelper() {\r\n }\r\n\r\n /**\r\n * @public\r\n * Adds the mpc id to a list of visited mpcs in the session storage\r\n */\r\n MpcEventsHelper.setVisitedMpc = function () {\r\n const mpcIdElement = document.querySelector('[data-mpc-id]');\r\n\r\n if (mpcIdElement) {\r\n let mpcId = parseInt(mpcIdElement.value, 10);\r\n\r\n // adds the mpcId to a list of visited MPCs in the session storage,\r\n // if the list exists, checks if the id is not already in the list\r\n let visitedMpcIds = global.NewHomeSource.WebStorageHandler.getSessionStorageItem('visitedMpcIds');\r\n\r\n if (!visitedMpcIds) {\r\n visitedMpcIds = [mpcId];\r\n global.NewHomeSource.WebStorageHandler.setSessionStorageItem('visitedMpcIds', visitedMpcIds);\r\n } else if (visitedMpcIds.indexOf(mpcId) === -1) {\r\n visitedMpcIds.push(mpcId);\r\n global.NewHomeSource.WebStorageHandler.setSessionStorageItem('visitedMpcIds', visitedMpcIds);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * Checks if a mpc id is already in the visited list in the session storage\r\n * @param {number} mpcId\r\n * @returns True if the mpcId was visited, false otherwise.\r\n */\r\n MpcEventsHelper.isVisitedMpc = function (mpcId) {\r\n let id = mpcId;\r\n\r\n // in case of receiving a number as a string, converts it to number\r\n if (typeof id === 'string' && !window.isNaN(id)) {\r\n id = parseInt(mpcId, 10);\r\n }\r\n\r\n const visitedMpcIds = global.NewHomeSource.WebStorageHandler.getSessionStorageItem('visitedMpcIds');\r\n\r\n if (visitedMpcIds && visitedMpcIds.indexOf(id) !== -1) {\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n MpcEventsHelper.noConflict = function noConflict() {\r\n global.NewHomeSource.MpcEventsHelper = previousModule;\r\n return MpcEventsHelper;\r\n };\r\n\r\n global.NewHomeSource.MpcEventsHelper = MpcEventsHelper;\r\n\r\n MpcEventsHelper.setVisitedMpc();\r\n\r\n return MpcEventsHelper;\r\n}(window));\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","(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}());","(function recommendedCommunitiesDesktopPaid() {\r\n 'use strict';\r\n\r\n function lazyLoadCss() {\r\n const bundle = document.getElementById('detailsXpRecosCss').value;\r\n\r\n if (bundle && window.NHS && window.NHS.loadCss) {\r\n window.NHS.loadCss(bundle);\r\n }\r\n }\r\n\r\n /**\r\n * Submits the recommended communities lead data to the server.\r\n * @param {Object} command - The command object containing the lead data.\r\n */\r\n async function submitRecommendedCommunitiesLead(command) {\r\n // we use a shoot and forget request to send the recommended lead data to the server\r\n const response = await fetch('/ajax/leads/recommendedcommunitysubmission/', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n ...command,\r\n }),\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n\r\n // append the trackers to the DOM to trigger analytics events, segment event and trackers.\r\n const trackers = await response.text();\r\n\r\n const container = document.querySelector('[data-trackers-container]');\r\n if (container) {\r\n const fragment = document.createRange().createContextualFragment(trackers);\r\n container.innerHTML = '';\r\n container.appendChild(fragment);\r\n container.style.display = 'none';\r\n }\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 the lead type based on the provided planId and SpecId.\r\n * If either SpecId or planId is provided, it returns 'postHomeBrochure'.\r\n * Otherwise, it returns 'postCommunityBrochure'.\r\n *\r\n * @param {string} planId - The plan ID.\r\n * @param {string} SpecId - The Spec ID.\r\n * @returns {string} The lead type.\r\n */\r\n function getLeadType(planId, SpecId) {\r\n if (Number(SpecId) || Number(planId)) {\r\n return 'postHomeBrochure';\r\n }\r\n\r\n return 'postCommunityBrochure';\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.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.CommunityId,\r\n FromPage: data.FromPage,\r\n Zip: data.ZipCode || data.UserPostalCode,\r\n Phone: data.UserPhoneNumber || data.Phone,\r\n BuilderId: data.BuilderId,\r\n Email: data.MailAddress || data.email || '',\r\n MarketId: data.MarketId,\r\n Type: getLeadType(data.PlanId, data.SpecId),\r\n FirstName: firstName,\r\n LastName: lastName,\r\n RecoComms: recoComms,\r\n };\r\n }\r\n\r\n /**\r\n * Returns a command object to be used to submit the skip action.\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 getSkipSubmissionCommand(data) {\r\n const name = data.Name || '';\r\n const firstName = name.split(' ')[0] || '';\r\n const lastName = name.split(' ')[1] || '';\r\n const recoComms = [];\r\n\r\n return {\r\n CommunityId: data.CommunityId,\r\n FromPage: data.FromPage,\r\n Zip: data.ZipCode,\r\n Phone: data.UserPhoneNumber,\r\n BuilderId: data.BuilderId,\r\n Email: data.MailAddress || data.email || '',\r\n MarketId: data.MarketId,\r\n Type: getLeadType(data.PlanId, data.SpecId),\r\n FirstName: firstName,\r\n LastName: lastName,\r\n RecoComms: recoComms,\r\n };\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 * Clears previous modals and performs additional actions.\r\n */\r\n function clearPreviousModals() {\r\n const previousModals = document.querySelectorAll('#modal-content');\r\n const previousBackgrounds = document.querySelectorAll('#modal');\r\n\r\n previousModals.forEach((modal) => {\r\n modal.remove();\r\n });\r\n\r\n previousBackgrounds.forEach((background) => {\r\n background.remove();\r\n });\r\n\r\n if (window.NewHomeSource.FullImageViewer && window.NewHomeSource.FullImageViewer.MoreInfoPanel) {\r\n window.NewHomeSource.FullImageViewer.MoreInfoPanel.closePanelActions();\r\n }\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 */\r\n function showRecomendationsModal(recommended, data) {\r\n const templateElement = document.querySelector('[data-recommendations-template]');\r\n const template = document.createRange().createContextualFragment(templateElement.innerHTML);\r\n\r\n clearPreviousModals();\r\n\r\n if (window.NewHomeSource.ModalLoader) {\r\n window.NewHomeSource.ModalLoader.createModal(template);\r\n }\r\n\r\n const recommendationsModal = document.getElementById('nhs_ModalRecommendations');\r\n\r\n if (recommended !== '') {\r\n const container = recommendationsModal.querySelector('.recommendations__container');\r\n\r\n recommendationsModal.removeAttribute('hidden');\r\n container.innerHTML = recommended;\r\n\r\n const ga4Event = {\r\n eventName: 'direc_section_view',\r\n eventType: 'GA4Event',\r\n params: {\r\n position: data.GenerateLeadFrom,\r\n button_name: data.ButtonNameSource,\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 // 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('showPaidThankYouModal'));\r\n\r\n const command = getRecommendedCommunitiesSubmissionCommand(data);\r\n submitRecommendedCommunitiesLead(command);\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves the recommended communities command based on the provided data.\r\n * @param {Object} data - The data object containing the necessary properties.\r\n * @param {string} data.SpecId - The ID of the specification.\r\n * @param {string} data.PlanId - The ID of the plan.\r\n * @param {string} data.CommunityId - The ID of the community.\r\n * @param {string} data.MailAddress - The email address.\r\n * @returns {Object} - The recommended communities command object.\r\n */\r\n function getRecommendedCommunitiesCommand(data) {\r\n const {\r\n SpecId, PlanId, CommunityId, MailAddress, Name, UserPostalCode\r\n } = data;\r\n return {\r\n CommunityId,\r\n PlanId,\r\n SpecId,\r\n MailAddress,\r\n Name,\r\n UserPostalCode,\r\n Type: getLeadType(PlanId, SpecId),\r\n };\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} - 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: recommendedCommand,\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 * Attaches event listeners to the recommendations modal.\r\n * @function\r\n * @returns {void}\r\n */\r\n async function skipButtonClickHandler() {\r\n const recommendationsModal = document.querySelector('[data-recommendations-modal]');\r\n const command = getSkipSubmissionCommand(this.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('showPaidThankYouModal'));\r\n submitRecommendedCommunitiesLead(command);\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 async function submitButtonClickHandler() {\r\n const recommendationsModal = document.querySelector('[data-recommendations-modal]');\r\n const command = getRecommendedCommunitiesSubmissionCommand(this.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('showPaidThankYouModal'));\r\n submitRecommendedCommunitiesLead(command);\r\n }\r\n\r\n function bindEvents(data) {\r\n const recommendationsModal = document.querySelector('[data-recommendations-modal]');\r\n const submitButton = recommendationsModal.querySelector('[data-recommended-button]');\r\n\r\n const closeButton = recommendationsModal.querySelector('[data-modal-close-element]');\r\n closeButton.setAttribute('data-ga4-event-position', data.GenerateLeadFrom);\r\n closeButton.setAttribute('data-ga4-event-button_name', data.ButtonNameSource);\r\n\r\n const skipButton = recommendationsModal.querySelector('[data-skip-button]');\r\n skipButton.addEventListener('click', skipButtonClickHandler.bind({ data }));\r\n skipButton.setAttribute('data-ga4-event-position', data.GenerateLeadFrom);\r\n skipButton.setAttribute('data-ga4-event-button_name', data.ButtonNameSource);\r\n\r\n // bind the data emmited by the event to the event handler.\r\n submitButton.addEventListener('click', submitButtonClickHandler.bind({ data }));\r\n submitButton.setAttribute('data-ga4-event-position', data.GenerateLeadFrom);\r\n\r\n const recommendedElements = document.querySelectorAll('[data-recommendation-check]');\r\n recommendedElements.forEach((elem) => {\r\n elem.setAttribute('data-ga4-event-position', data.GenerateLeadFrom);\r\n elem.setAttribute('data-ga4-event-org_button_name', data.ButtonNameSource);\r\n elem.addEventListener('click', onRecommendationChecked.bind({ data }));\r\n });\r\n }\r\n document.addEventListener('openRecommendedModal', async (event) => {\r\n const data = event.detail.data;\r\n lazyLoadCss();\r\n const recommended = await getRecommendedCommunities(data);\r\n showRecomendationsModal(recommended, data);\r\n bindEvents(data, event);\r\n });\r\n}());\r\n","(function ThankYouModalDesktopPaid() {\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 * Handles the click event for creating an account.\r\n */\r\n function handleCreateAccountClick() {\r\n if (window.auth0Dom) {\r\n window.auth0Dom.signIn();\r\n }\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-thank-you-modal-paid]');\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', handleCreateAccountClick);\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-thank-you-modal-paid]');\r\n const closeButton = thankYouModal.querySelector('[data-modal-close-element]');\r\n\r\n bindEvents();\r\n toggleModal(thankYouModal);\r\n closeButton.focus();\r\n }\r\n\r\n document.body.addEventListener('showPaidThankYouModal', showThankYouModal);\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 () {\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})();","/*\r\n * summary: this module is to handle the promo flyer functionality\r\n * we need to set the data-promo-flyer-url to the promo that contain a flyer value\r\n */\r\n(function (global) {\r\n const flyerButtons = document.querySelectorAll('[data-promo-flyer-url]');\r\n\r\n function openFlyer(event) {\r\n const url = event.target.dataset.promoFlyerUrl;\r\n const left = (global.screen.width - 840) / 2;\r\n const top = (global.screen.height - 600) / 2;\r\n const dimentionsSetting = `width=840,height=600,top=${top},left=${left},menubar=yes,status=no,\r\n location=no,toolbar=no,scrollbars=yes`;\r\n\r\n global.open(url, '_blank', dimentionsSetting);\r\n }\r\n\r\n flyerButtons.forEach((flyerUrl) => {\r\n flyerUrl.addEventListener('click', openFlyer);\r\n });\r\n})(window);","(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","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","NHS.Scripts.Loggin = function (parameters) {\r\n this._parameters = parameters;\r\n this.type = (parameters.specId == 0 && parameters.planId == 0) ? \"comm\" : \"home\";\r\n this.name = (this.type == \"comm\" ? \"Community\" : \"Home\");\r\n};\r\n\r\nNHS.Scripts.Loggin.prototype =\r\n {\r\n initialize: function () {\r\n var self = this;\r\n \r\n jQuery(\"body\").on(\"click\", \"#btnFreeBrochure\", function () {\r\n jQuery.googlepush(\"Lead Events\", this.name + \" - Gallery CTA Main Form\", \"Submit Form - Free Brochure\");\r\n });\r\n\r\n jQuery(\"#btn_NhsScheduleAppointment\").click(function () {\r\n jQuery.googlepush(\"Lead Events\", self.name + \" - CTA Next Steps Appointment\", \"Open Form - Free Brochure\");\r\n });\r\n\r\n jQuery(\"#btnUpdate\").click(function () {\r\n jQuery.googlepush((self.type == \"comm\" ? \"Community\" : \"Home\") + \" Detail Events\", self.name + \" - Map\", \"Show Route\");\r\n });\r\n\r\n jQuery(\"#btn_NhsMapSend\").click(function () {\r\n jQuery.googlepush(\"Lead Events\", self.name + \" - CTA Request Appointment\", \"Open Form - Free Brochure\");\r\n });\r\n\r\n jQuery(\"body\").on('click', '#nhs_PhoneLink', function () { \r\n jQuery.googlepush(self.name + \" Detail Events\", self.name + \" - Gallery\", \"See Phone Numbers\");\r\n\r\n self.ShowPhoneNumber(\"nhs_PhoneLink\", \"nhs_FormPhone\");\r\n\r\n logger.logEventWithParameters((self.type == \"comm\" ? \"BUILDPHCM\" : \"BUILDPH\"), self._parameters);\r\n\r\n return false;\r\n });\r\n\r\n jQuery(\"#nhs_FormIPhone a, .Iphone_number a\").click(function () {\r\n //self.LogClick('LogIPhoneNumber');\r\n\r\n logger.logEventWithParameters(\"PhoneClick\", self._parameters);\r\n\r\n });\r\n\r\n jQuery(\"#nhs_PhoneNumHeaderLink\").click(function () {\r\n self.ShowPhoneNumber(\"nhs_LnkPhoneNumHeader\", \"nhs_FormPhoneHeader\");\r\n return false;\r\n });\r\n\r\n jQuery(\".MortgageRates\").click(function () {\r\n jQuery.googlepush(\"Community Detail Events\", \"Community - Gallery\", \"Get Mortgage Rates\");\r\n self.LogClick(\"LogMortgageRates\");\r\n });\r\n\r\n jQuery(\"#MortgageMatch\").click(function () {\r\n self.LogClick(\"LogMortgageMatch\");\r\n });\r\n\r\n jQuery(\".nhs_FormMapLink li a\").click(function () {\r\n jQuery(\"#nhs_propertyMapCollapsibleOpen\").click();\r\n });\r\n\r\n jQuery(\"#nhs_StepsPrintLink\").click(function () {\r\n logger.logEventWithParameters((self.type == \"comm\" ? \"CDNSPRN\" : \"HDNSPRN\"), self._parameters);\r\n window.print();\r\n self.LogClick(\"LogNextStepsPrint\");\r\n });\r\n\r\n jQuery(\".LogNextStepsBrochure\").click(function () {\r\n self.LogClick(\"LogNextStepsBrochure\");\r\n });\r\n\r\n jQuery(\"#nhs_LnkNextStepsPhoneNum2\").click(function () {\r\n logger.logEventWithParameters((self.type == \"comm\" ? \"CDNSSPH\" : \"HDNSSPH\"), self._parameters);\r\n\r\n var lnkPhoneNumber = jQuery(\"#nhs_LnkNextStepsPhoneNum\");\r\n if (lnkPhoneNumber === null) return;\r\n lnkPhoneNumber.hide();\r\n jQuery.googlepush(\"Community Detail Events\", \"Community - Next Steps\", \"See Phone Numbers\");\r\n jQuery(\"#nhs_NextStepsFormPhone\").show();\r\n jQuery.SetDataLayerPair(\"sitePhoneNumV\");\r\n //self.LogClick('LogNextStepsSeePhone');\r\n });\r\n\r\n jQuery(\"body\").on(\"click\", \"td.estaradefaultstyle a\", function () {\r\n var img = $(this).find(\"img\");\r\n if (img.length == 1) {\r\n if (img.attr(\"src\") == \" http: //as00.estara.com/OneCC/200106300209/float_button.gif\")\r\n jQuery.googlepush(\"Chat Links\", \"Tab\", \"Chat Now\");\r\n }\r\n });\r\n },\r\n ShowPhoneNumber: function (buttonSection, numberSection) {\r\n var lnkPhoneNumber = jQuery(\".nhs_CallTrakingNumber #\" + buttonSection);\r\n if (lnkPhoneNumber === null) return;\r\n lnkPhoneNumber.hide();\r\n jQuery(\".nhs_CallTrakingNumber #\" + numberSection).show();\r\n jQuery.SetDataLayerPair(\"sitePhoneNumV\");\r\n //this.LogClick('LogPhoneNumber');\r\n },\r\n LogClick: function (method) {\r\n var self = this;\r\n var dataPost = {\r\n communityId: self._parameters.commId,\r\n builderId: self._parameters.builderId,\r\n planId: self._parameters.planId,\r\n specId: self._parameters.specId\r\n };\r\n jQuery.ajax({\r\n type: \"POST\",\r\n url: self._parameters.logActionMethodUrl + method,\r\n data: dataPost,\r\n dataType: \"json\"\r\n });\r\n }\r\n };\r\n","(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","(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 });","/* summary: Class for serving the JS resources for guided tour providers that needs they own JS.\r\nThis module is shared between mobile and desktop, and is in charge of lazy loading\r\nthe JS resource of the self guided tour provider by looking at a hidden input that will contain\r\nthe JS path downloading the resource. That way, after opening a modal a lazy request\r\nwill take place for loading the given resource based on the guided tour provider. */\r\n(function guidedTourInitializer(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const guidedTourConfiguration = global.document.querySelector('[data-guided-tour-configuration]');\r\n const previousGuidedTourInitializer = global.NewHomeSource.GuidedTourInitializer;\r\n\r\n if (!guidedTourConfiguration) {\r\n return;\r\n }\r\n\r\n const desktopConfiguration = guidedTourConfiguration.getAttribute('data-desktop-value');\r\n const mobileConfiguration = guidedTourConfiguration.getAttribute('data-mobile-value');\r\n\r\n /**\r\n * @private\r\n * downloadGuidedTourHandler: download the Javascript Handler for the guided tour provider.\r\n *\r\n * @param {object} event with the information about the target that the user interacted with.\r\n */\r\n function downloadGuidedTourHandler() {\r\n if (global.define) {\r\n require([mobileConfiguration], (mobileConfig) => mobileConfig);\r\n } else {\r\n const scriptTag = document.createElement('script');\r\n scriptTag.src = desktopConfiguration;\r\n scriptTag.type = 'text/javascript';\r\n scriptTag.async = true;\r\n document.documentElement.appendChild(scriptTag);\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.GuidedTourInitializer\r\n */\r\n function GuidedTourInitializer() {\r\n if (document.readyState === 'complete') {\r\n downloadGuidedTourHandler();\r\n } else {\r\n window.addEventListener('load', downloadGuidedTourHandler);\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.NterNowInitializer to the previous script.\r\n */\r\n GuidedTourInitializer.noConflict = function noConflict() {\r\n global.NewHomeSource.GuidedTourInitializer = previousGuidedTourInitializer;\r\n return GuidedTourInitializer;\r\n };\r\n\r\n global.NewHomeSource.GuidedTourInitializer = GuidedTourInitializer;\r\n GuidedTourInitializer();\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","/*\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 (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}\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}\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}\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 * 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","(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 setupBasicInheritedProperties(global) {\r\n 'use strict';\r\n\r\n const basicBlueForm = document.querySelector('[data-basic-blue-form]');\r\n const basicBottomBlueForm = document.querySelector('[data-basic-bottom-blue-form]');\r\n const basicStickyButtom = document.querySelector('[data-sticky-basic-lead]');\r\n const basicCTATopPopup = document.querySelector('[data-cta-top-popup]');\r\n const positionAttribute = ['data-ga4-event-position', 'data-ga4-position'];\r\n\r\n const setAttribute = (attribute, value, container) => container.querySelectorAll(`[${attribute}]`)\r\n .forEach((element) => {\r\n element.setAttribute(attribute, value);\r\n });\r\n\r\n /**\r\n * Sets a data layer value for recommendation properties with a position of 'bottom blue form' in mobile.\r\n */\r\n const setInheritedBasicBottomBlueFormProperties = () => {\r\n if (!global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.Modules.tagManager.setDataLayerValue('recommendationProperties', {\r\n position: 'bottom blue form'\r\n });\r\n };\r\n\r\n /**\r\n * Sets a data layer value for recommendation properties with a position of 'right blue form'.\r\n */\r\n const setInheritedBasicBlueFormProperties = () => {\r\n if (!global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.Modules.tagManager.setDataLayerValue('recommendationProperties', {\r\n position: 'right blue form'\r\n });\r\n };\r\n\r\n /**\r\n * Sets a data layer value for recommendation properties with a position of 'sticky nav button'.\r\n */\r\n const setInheritedBasicStickyProperties = () => {\r\n if (!global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.Modules.tagManager.setDataLayerValue('recommendationProperties', {\r\n position: 'stickyheader'\r\n });\r\n };\r\n\r\n /**\r\n * Sets a data layer value for recommendation properties with a position of 'CTA Top Popup' in mobile.\r\n */\r\n const setInheritedBasicCTATopPopupProperties = () => {\r\n if (!global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.Modules.tagManager.setDataLayerValue('recommendationProperties', {\r\n position: 'Fixed CTAs Mob Top Popup'\r\n });\r\n };\r\n\r\n /**\r\n * ` updates data attributes in a modal based on specific position value retrieved from the tag manager.\r\n * @param event - is an object that contains details about the event that triggered the function.\r\n */\r\n const addRecommendationModalCustomProperties = (event) => {\r\n const { modal } = event.detail;\r\n if (!modal || !global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n const dataLayerResult = global.NewHomeSource.Modules.tagManager.getFromDataLayer('recommendationProperties');\r\n\r\n if (dataLayerResult && dataLayerResult.position) {\r\n const { position } = dataLayerResult;\r\n positionAttribute.forEach((attribute) => setAttribute(attribute, position, modal));\r\n }\r\n };\r\n\r\n const config = [\r\n { element: basicBlueForm, listener: setInheritedBasicBlueFormProperties },\r\n { element: basicBottomBlueForm, listener: setInheritedBasicBottomBlueFormProperties },\r\n { element: basicStickyButtom, listener: setInheritedBasicStickyProperties },\r\n { element: basicCTATopPopup, listener: setInheritedBasicCTATopPopupProperties },\r\n ];\r\n config.forEach(({ element, listener }) => {\r\n if (element) {\r\n element.addEventListener('click', listener);\r\n }\r\n });\r\n document.body.addEventListener('recommededModalReady', addRecommendationModalCustomProperties);\r\n}(window));\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"]}