{"version":3,"sources":["vanilla-masker.js","jQuery.LazyLoad.js","GoogleAnalitycsHelper.js","schedulerHandler.js","modalBackground.js","event.js","googlemapapi.b1.js","GoogleMapApiAutoComplite.js","dateSlider.js","gallery.b1.js","imagesGalleryHandler.js","thumbnailHelper.js","arrowHandler.js","stickyBarScrollHandler.js","initialLoadModalHandler.js","commdetailxp.b1.js","LeadForm.common.js","moreCommunitiesSection.js","webStorageHandler.js","mortgage-detail.b1.js","mpcEventsHelper.js","leadEvents.js","handlerOnPageForm.js","handlerFivTemplateForm.js","recommendedCommunitiesDesktopPaid.js","thankYouModalDesktopPaid.js","trackerRecommendedCommunities.js","GooglePropertyMap.b1.js","fullImageViewerOpener.js","common.b1.js","promotionFlyerHandler.js","stickyNavBarButton.b1.js","availableLots.js","MapsAndDirections.b1.js","MapPopup.js","ajaxHelper.js","builderFiltersHandler.js","SectionLazyLoad.js","getPreApprovedLoader.js","GoogleMapsDownloader.js","a11ydialog.js","IframeModalOpener.js","elementToggler.js","communityAndNeighBorhoodHandler.b1.js","modalFocus.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","NHS","Scripts","Maps","existingMaps","getMap","selector","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","container","Map","clearOverlays","isFunction","addListener","call","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","data","getBoundsFromMap","getJSON","results","processResult","getBounds","ne","getNorthEast","sw","getSouthWest","minLat","minLng","maxLat","maxLng","prOptions","html","getHtmlInfowindow","icon","getIconMarkerPoint","getNameMarkerPoint","createMarkerPoint","addMultipleMarkers","markers","latitude","longitude","AutoFit","sources","info","label","marker","_createMarkerPoint","addMarker","markerPointOptions","title","text","Marker","set","setContent","Center","setCenter","ReDrawMap","fitBounds","panToBounds","ourOverlay","OverlayView","draw","GetInfowindowOffset","iwWidth","iwHeight","xOffset","yOffset","location","getProjection","fromLatLngToContainerPixel","getPosition","nep","x","y","Size","GetPixelFromLatLng","latLng","fromLatLngToPoint","WaitGoogleScript","functionToExecute","timeToLoad","loadGoogleMapsCode","url","loadJs","initializeAutoComplete","control","createControles","field","val","focus","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","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","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","requestAnimationFrame","pleaseSetTheDate","watchForStylesRecalculation","setHidden","cardTotalSize","createDayCard","card","replaceTemplate","createDayObject","isHidden","isAvailable","currentDay","titleButton","tomorrow","aria","selected","hidden","format","toUpperCase","getDate","px","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","selectedDate","days","setMonth","obj","template","prefix","instance","query","lastVisibleCard","previousSelectedElement","selectedElement","date","innerHTML","third","prev","availableCards","tomorrowNeverKnows","indexDate","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","preventDefault","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","CommunityDetailXp","_tabsControlId","tabsControlId","_searchParameters","searchParameters","_getHomeResultsByCommunityFromApi","getHomeResultsByCommunityFromApi","selectedTab","SelectedTab","_communityId","communityId","_builderId","builderId","player","galleryIndex","communityDetailContainerHigh","logger","Globals","EventLogger","siteRoot","logInfo","fromPage","partnerID","partnerId","partnerName","performanceLogUrl","marketId","favs","Favorites","urlBase","PartnerId","MarketId","get_commId","get_builderId","initialize","setUpControls","init","attributeParameters","mapParameters","defaultTargetForLazyLoad","mapsContainer","googlePropertyMap","GooglePropertyMap","SetUpdate","loadInteractiveMap","isBilled","isNearbyShowed","brandId","brandName","BrandName","commLat","commLon","pricelow","PriceLow","priceHigh","PriceHigh","fromPageForNearby","fetch","getNearbyCommunitiesActionUrl","then","response","ok","nearbyContainer","testimonialsModel","isMpCommunity","isPreview","PreviewMode","nearbyWrapper","performLazyLoad","getCommunityTestimonialsUrl","testimonialsData","Testimonials","testimonialsCards","testimonialContainer","cloneTestimonialCard","cloneNode","Description","Citation","_updateAdsPosition","ratingsFlagElement","microModalInput","RatingsAndReviews","loadDetailSection","loadReviews","setUpGalleryXp","favorites","performanceEvents","FullImageViewerOpener","mapButton","neighborhoodStickyButton","googleAnalyticsBindings","performanceEventsBindings","formSubmitButton","addFreeBrochureSubmitEventAttributes","trackReadMoreOfferEvent","readMoreButtonText","googleAnalyticsEvent","click_target","readOffersContainer","showMoreElement","collapsibleContentElement","offerBubblesCollection","currentReadMoreText","hasAttribute","counter","textContent","currentEventReadMoreText","eventCurrentText","currentEventReadMoreToggleText","eventToggleText","scrollToBarItems","scrollBehavior","scroll","scrollIntoView","itemActive","MediaData","mediaResult","setupNewOnPageGallery","RemoveParametersFromUrl","parameter","RemoveResizingParametersFromQueryString","image","imageUrl","isVimeoVideo","getVimeoSourceSetUrl","commTitle","breakpoints","breakpoint","breakpointLength","resizedMediaImages","mediaImages","IsRichMedia","cleanUrl","VideoType","VideoId","Is360Image","srcsetUrl","countComm","countVideo","videoIcon","videoOverlay","galleryMap","elementPosition","Id","AltText","detailGallery","galleryItem","toLowerCase","videoTitle","Type","TestimonialVideo","CommunityVideo","Title","removeClass","addClass","firstGalleryItem","idOfVisibleElement","dataForAjax","urlForAjax","successAjaxFunction","lazyLoadReady","ajax","contentType","stringify","success","homesAndPlansJs","backToTop","SetupNearbyCommunities","googleApi","NearbyComms","SaveCommunity","dataForPost","post","addCommunityToPlanerMethod","json","ShowSuccessMessage","replaceWith","SavedText","SavedToYourProfileText","message","saveMessage","SaveToFavoritesText","SaveText","redirectUrl","submitButton","Analytics","GoogleAnalyticsTracker","buildTagWithEvent","Helper","readCookie","createCookie","loadCss","link","TdvTracker","CommunityDetailSocialMediaShare","commDetail","detailInfo","adCol","salesoffice","homeToolsBuyingSection","merchandizedSection","merchandizedSectionHeigth","homeToolsBuyingSectionHeight","salesOfficeHeight","MutationObserver","takeATourFloatingButton","floatingFormContainerHide","inPersonRequestLabel","commentsInput","formObserver","commentInput","VirtualTourRequestLabel","readyState","ElementToggler","Init","CommunityAndNeighBorhoodHandler","targetElementId","alernateTargetElementId","alternateTargetElement","priceReductionLabel","trustBuilderReviewsSection","homesAndPlansSection","builderSection","handlerMoreCommunityClick","cardElement","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","showMortgage","detailPriceElm","price2","price3","postalCodeElm","detailCardTemplate","detailCard","createRange","createContextualFragment","mortgageContainer","test","pathname","nearbyHomesContent","homeCarousel","refElm","disconnect","observeElement","MpcEventsHelper","setVisitedMpc","mpcIdElement","mpcId","parseInt","visitedMpcIds","isVisitedMpc","eventToAttach","onPageLeadButton","setAttributesToDataLayer","leadButtonClicked","leadEvents","ButtonNameClicked","ClickTarget","leadClickTarget","Position","leadPosition","GenerateLeadFrom","leadGenerateFrom","ButtonNameSource","leadButtonNameSource","tagManager","setDataLayerValue","formData","emailAddress","phoneNumber","postalCode","livesOutside","checked","disabled","preferredContactMethod","contactMethod","realtorQuestionAnswer","realtorAnswer","sendAlerts","fivFormTemplate","fieldsMap","content","isCustomLocation","isBasic","isComingSoon","formValuesToQueryString","keyValuePair","substring","showThankYouPageForExternalLeads","getFreeBrochureData","ModalLoader","showModal","onChangeToggleZipInput","checkboxElem","zipInput","openScheduler","component","onClickSendForm","currentForm","sendButton","formValidator","validateForm","sendAskQuestionLead","sendFreeBrochureLead","addDataInComment","formElem","commentElem","comment","isOnPageForm","isRegularLeadForm","isAskQuestionForm","isFullImageViewer","commentData","getOnPageFormCommentData","getTourFormCommentData","getLeadAction","formTriggeredElement","leadActionType","isFullImageContactBuilder","isAskQuestion","formOptions","formText","currentOption","formElement","virtualTourElement","isVirtualTour","selectedDateElement","finalDate","getPreferredContactMethod","form","contactMethodInput","selectedIndex","getRealtorQuestionAnswerId","realtorAnswerInput","getPreferredBuilder","preferredBuilderElem","getValidatedMpcId","triggerElement","userPhone","thisForm","formParent","phoneField","dateSelected","includeSimilarCheckbox","isLimitedAvailability","getFromDataLayer","sendFormButton","Comments","PreferredBuilder","PreferredContactDetail","PreferredContactMethod","RealtorQuestionAnswerId","LiveOutside","MailAddress","UserPhoneNumber","UserPostalCode","ZipCode","BuilderId","BuilderName","CommunityId","CreditScoreText","IsAskQuestion","IgnoreComingSoonValidation","IsAddMeToInterestList","IsBuilderShowcase","IsComingSoon","IsComunityDetailV2","IsModalToSendEmail","IsGalleryXp","IsFullImageViewerLead","IsLimitedAvailability","LeadAction","UseNewCommentFormat","IsMPCommunity","IsPageCommDetail","IsPlan","NewSearchRCC","NewUser","ParentCommunityId","PartnerUsesMatchmaker","PlanId","SendAlerts","HasUserOptedIntoRecommendationEmail","ShowCreditScoreSection","ShowSaveToAccount","ShowUserPhoneNumber","find","is","SpecId","IsOnPageForm","FromPage","getAskQuestionData","Email","LivesOutside","Phone","Postal","AppointmentDateTime","BuilderList","CommunityList","IsAppointment","IsCustomLocation","LeadFormType","LeadType","PlanList","RequestedFromGallery","ShowCalendar","SpecList","sendSegmentEventFavorites","UserCredentials","isUserLogged","getRealtorQuestionAnswerText","realtorSelect","realtorQuestionAnswerText","requestUrl","leadButtonClickedText","segmentButton_action","isSchedulerParticipant","currentTarget","onPageForm","method","fragment","cleanOpenFormButtons","eventForSegment","tour_type","button_action","preferred_contact_method","realtor_question","topicList","checkboxElement","lead_form_topics","fillInputsOnPageForm","resetIsModalLoadedFlag","dataType","error","console","log","onChangeContactMethod","selectedOption","selectedValue","selectedOptions","phoneInput","onChangeRealtorAnswer","setupFormTabsEvents","selfGuidedTab","nonSelfGuidedTabs","selfGuidedTourTabHandler","setupLeadForms","internationalCheckbox","onchange","onclick","methodOfContactInput","realtorQuestionAnswerInput","changeLeadAction","radioOptions","option","parametersElement","leadAction","initDatepickerGallery","alertText","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","async","submitRecommendedCommunitiesLead","command","headers","Content-Type","onRecommendationChecked","getLeadType","planId","getRecommendedCommunitiesSubmissionCommand","firstName","lastName","recoComms","recommendation","Zip","email","FirstName","LastName","RecoComms","toggleModal","modal","toggleAttribute","showRecomendationsModal","recommended","templateElement","previousModals","previousBackgrounds","FullImageViewer","MoreInfoPanel","closePanelActions","clearPreviousModals","createModal","recommendationsModal","ga4Event","button_name","getRecommendedCommunities","recommendedCommand","getRecommendedCommunitiesCommand","credentials","leadCommand","skipButtonClickHandler","getSkipSubmissionCommand","submitButtonClickHandler","closeButton","skipButton","bundle","lazyLoadCss","handleCreateAccountClick","auth0Dom","signIn","thankYouModal","createAccountButton","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","max_price","market_id","market_name","MarketName","market_session","StateAbbreviation","City","StateName","community_name","CommunityName","community_status","MarketingStatusLabel","community_id","is_limited_availability","HasLimitedInformation","is_priced","is_paid","zip_code","builder_id","builder_name","ga4EventPosition","org_button_name","ga4EventOrg_button_name","checkedCommunities","alreadyClicked","reDrawMap","disableShowButton","InitMap","OptionsForMap","mapExpanded","HideLoading","CreateMap","isBasicListing","logBasicListingEvent","googleMapScript","SetUpGoogleApi","result","MarketPoints","iconNearByCommMulti","iconNearByComm","commIds","getCommunityMapCards","basicIds","isGalleryXp","children","getPropertyMapSides","logEventWithParameters","css","InitDrivingDirection","isMpc","isMPCommunity","GetPropertyMapRightSide","isMPC","mapWidth","mapHeight","isBasicCommunity","logMultiEvent","googlepush","toggle","$buildderTabMap","toggleClass","specId","setDate","currentMonth","getMonth","currentYear","getFullYear","datepicker","minDate","mousedown","initTrigger","dateValue","actualDate","TrackShowRouteEvents","search_value","currency","inputWrapper","trim","screen","drivingDirectionAction","SetDataLayerPair","eventForTdv","builder","community","market","Geocoder","geocode","status","GeocoderStatus","OK","ActiveXObject","previousFullImageViewerOpener","generateHtml","preventScroll","openFullImageViewer","eventsConfiguration","openEvent","registerLogInformation","performanceLogger","setUpFullImageViewerSaveOption","nextStepsSaveButton","gallerySaveButton","saveToFavoritesLoginButton","nextStepsUnsaveButton","galleryUnsaveButton","initSaveToFavorites","eventCategory","eventAction","eventLabel","nodeName","isMapDirectionsTab","tabsElements","showMapDirections","travelModeElement","travelMode","loadEmailSuggestions","Mailcheck","EmailDomainValidator","hideSection","displaySection","hidePhones","showPhones","rootMargin","threshold","sectionDetails","sectionsToObserve","userHeight","innerHeight","calculateSection","mainEntry","topSection","stickyBar","activeElement","sectionIndex","observerMainStickyBar","openFlyer","promoFlyerUrl","dimentionsSetting","flyerUrl","previousStickyNavBarButton","StickyNavBarButton","stickyNav","buttonCtaContainer","barItems","containerItems","boundingClientRect","unobserve","observerStickyNavBar","triggerButton","availableButton","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","CommunityResults","MapPopup","GetHtmlPoints","point","communityName","PriceRange","priceRange","AjaxHelper","requestsQueue","partnerElement","getElementsByClassName","browserAcceptTypes","partnerUrl","protocol","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","BuilderFiltersHandler","homesContainer","nodeListToArray","nodeList","filterHomesByBuilder","selectedBuilderFilterIds","selectedBuilderIds","builderFilters","selectedBuilders","filterElements","getSelectedBuilderFilterIds","allHomeCards","updateFilterTabs","tabFilterContainers","customFilterValue","homeStatusFilter","tabLabel","tabInput","homesByTypeCount","counterText","hideAllHomeCards","cardsToDisable","setBuilderFiltersEvents","builderFilterElements","SectionLazyLoad","rootMarginObserver","hostname","preventLazyLoadSectionDefaultBehavior","responseFragment","lazyLoadSection","lazyLoadSections","initLazyLoad","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","openModal","dialogOpener","dialogPolyfill","registerDialog","iframe","closeModalForm","handleModalInteraction","HTMLDialogElement","polyfill","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"],"mappings":"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","file":"../commdetailxpbundle-823e6de182.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","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};","; (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});","/**\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","//Class Constructor\r\n//This call usually is made in the Views, and there are the parameters specified.\r\nNHS.Scripts.CommunityDetailXp = function (parameters) {\r\n //Initializing parameters\r\n this.parameters = parameters;\r\n this._tabsControlId = parameters.tabsControlId;\r\n this._searchParameters = parameters.searchParameters;\r\n this._getHomeResultsByCommunityFromApi = parameters.getHomeResultsByCommunityFromApi;\r\n this.selectedTab = parameters.SelectedTab;\r\n this._communityId = parameters.communityId;\r\n this._builderId = parameters.builderId;\r\n this.player = null;\r\n this.numberOfCards = 9;\r\n this.gallery = new Array();\r\n this.galleryIndex = 0;\r\n this.communityDetailContainerHigh = undefined;\r\n this.logger = new NHS.Scripts.Globals.EventLogger({\r\n siteRoot: parameters.logInfo.siteRoot,\r\n fromPage: parameters.logInfo.fromPage,\r\n partnerID: parameters.logInfo.partnerId,\r\n partnerName: parameters.logInfo.partnerName,\r\n performanceLogUrl: parameters.logInfo.performanceLogUrl,\r\n marketId: parameters.marketId\r\n });\r\n\r\n this.favs = new NHS.Scripts.Favorites({\r\n urlBase: parameters.urlBase,\r\n partnerId: parameters.PartnerId,\r\n marketId: parameters.MarketId,\r\n logInfo: parameters.logInfo\r\n });\r\n};\r\n\r\nNHS.Scripts.CommunityDetailXp.prototype = {\r\n get_commId: function () {\r\n return this._communityId;\r\n },\r\n get_builderId: function () {\r\n return this._builderId;\r\n },\r\n initialize: function () {\r\n var self = this;\r\n self.setUpControls();\r\n self.favs.init();\r\n\r\n const loadReviews = function() {\r\n const ratingsFlagElement = document.querySelector('#IsReviewsAvailable');\r\n const hasReviews = ratingsFlagElement && ratingsFlagElement.value === 'True';\r\n\r\n if (hasReviews) {\r\n const microModalInput = document.querySelector('#ratings-bundle');\r\n\r\n NHS.loadJs(microModalInput.value, \"ratings-script\", function () {\r\n RatingsAndReviews.loadDetailSection();\r\n });\r\n }\r\n }\r\n\r\n var attributeParameters = self.parameters;\r\n if (attributeParameters.mapParameters) {\r\n attributeParameters.mapParameters.logger = new NHS.Scripts.Globals.EventLogger({\r\n siteRoot: self.parameters.logInfo.siteRoot,\r\n partnerId: self.parameters.logInfo.partnerId,\r\n partnerName: self.parameters.logInfo.partnerName,\r\n marketId: self.parameters.logInfo.marketId,\r\n performanceLogUrl: self.parameters.logInfo.performanceLogUrl\r\n });\r\n }\r\n\r\n\r\n if (document.querySelectorAll(\"#HomesAndPlans\").length !== 0) {\r\n defaultTargetForLazyLoad = \"HomesAndPlans\";\r\n } else {\r\n defaultTargetForLazyLoad = \"CommunityInfo\";\r\n }\r\n\r\n var mapsContainer = document.querySelector(\"#nhs_PropertyMap\");\r\n self.googlePropertyMap = new NHS.Scripts.GooglePropertyMap(attributeParameters.mapParameters);\r\n self.googlePropertyMap.SetUpdate();\r\n\r\n function loadInteractiveMap(event) {\r\n self.googlePropertyMap.init();\r\n mapsContainer.removeEventListener(\"click\", loadInteractiveMap);\r\n }\r\n\r\n if (mapsContainer) {\r\n mapsContainer.addEventListener(\"click\", loadInteractiveMap);\r\n }\r\n\r\n // lazyload the Near By Communities Section\r\n if (self.parameters.isBilled) {\r\n var isNearbyShowed = false;\r\n var defaultOptions = {\r\n ElementVisibleId: \"SchoolsAndAmenities\",\r\n UpdateAction: function (isVisible) {\r\n if (isVisible && isNearbyShowed === false) {\r\n isNearbyShowed = true;\r\n const params = new URLSearchParams({\r\n communityId: self.parameters.communityId,\r\n builderId: self.parameters.builderId,\r\n marketId: self.parameters.marketId,\r\n brandId: self.parameters.brandId,\r\n brandName: self.parameters.BrandName,\r\n latitude: self.parameters.commLat,\r\n longitude: self.parameters.commLon,\r\n pricelow: self.parameters.PriceLow,\r\n priceHigh: self.parameters.PriceHigh,\r\n fromPage: self.parameters.fromPageForNearby\r\n });\r\n fetch(self.parameters.getNearbyCommunitiesActionUrl + '?' + params.toString())\r\n .then((response) => {\r\n if (response.ok) {\r\n response.text().then((data) => {\r\n if (data === '') {\r\n return;\r\n }\r\n const nearbyContainer = document.getElementById(\"nhs_NearbyHomesContent\");\r\n if(nearbyContainer) {\r\n nearbyContainer.innerHTML = data;\r\n nearbyContainer.removeAttribute('hidden');\r\n document.body.dispatchEvent(new CustomEvent('moreCommunitiesLoaded'));\r\n }\r\n });\r\n }\r\n });\r\n }\r\n }\r\n };\r\n jQuery.LazyLoad(defaultOptions);\r\n }\r\n\r\n var testimonialsModel = {\r\n communityId: self.parameters.communityId,\r\n builderId: self.parameters.builderId,\r\n isMpCommunity: false,\r\n isPreview: self.parameters.PreviewMode === \"True\"\r\n };\r\n const nearbyWrapper = document.querySelector('[data-nearby-wrapper]');\r\n if (nearbyWrapper !== null) {\r\n self.performLazyLoad('nhs_nearbyHomesSection', null, nearbyWrapper.dataset.url, function (data) {\r\n if (!data) {\r\n const nearbySection = document.querySelector('[data-nearby-section]');\r\n nearbySection.setAttribute('hidden', '');\r\n return;\r\n }\r\n\r\n document.querySelector('[data-nearby-wrapper]').innerHTML = data;\r\n self.favs.init();\r\n document.body.dispatchEvent(new CustomEvent('moreCommunitiesLoaded'));\r\n });\r\n }\r\n self.performLazyLoad(defaultTargetForLazyLoad, testimonialsModel, self.parameters.getCommunityTestimonialsUrl, function (data) {\r\n var container = document.createElement(\"div\");\r\n var testimonialsData = data.Testimonials;\r\n var testimonialsCards = document.querySelector(\".card__testimonials\");\r\n var testimonialContainer = document.querySelector(\".section__testimonials\");\r\n if (testimonialsData.length > 0) {\r\n if (testimonialsCards && testimonialContainer) {\r\n for (var i = 0; i < testimonialsData.length; i++) {\r\n var cloneTestimonialCard = testimonialsCards.cloneNode(true);\r\n cloneTestimonialCard.querySelector(\".testimonial__text\").innerHTML =\r\n testimonialsData[i].Description;\r\n cloneTestimonialCard.querySelector(\".testimonial__citation\").innerHTML =\r\n testimonialsData[i].Citation;\r\n container.appendChild(cloneTestimonialCard);\r\n }\r\n testimonialContainer.innerHTML = container.innerHTML;\r\n document.querySelector(\".testimonial__section\").style.display = 'block';\r\n }\r\n }\r\n });\r\n\r\n self._updateAdsPosition();\r\n\r\n loadReviews();\r\n\r\n // Gallery Initialization\r\n self.setUpGalleryXp();\r\n var elements = {\r\n 'selector': '[data-full-image-viewer-opener=\"true\"]',\r\n 'favorites': self.favs,\r\n 'performanceEvents': self.logger,\r\n 'logInfo': self.parameters.logInfo\r\n };\r\n\r\n window.NewHomeSource.FullImageViewerOpener && window.NewHomeSource.FullImageViewerOpener(elements);\r\n new window.NewHomeSource.Modules.ArrowHandler({\r\n container: document.querySelector('[data-toolbar]')\r\n });\r\n\r\n // Arrow Handler for Sticky Bar\r\n new window.NewHomeSource.Modules.ArrowHandler({\r\n container: document.querySelector('[data-sticky-bar]')\r\n });\r\n\r\n\r\n const mapButton = document.querySelector('.nhs_FormMapLink');\r\n if (mapButton) {\r\n mapButton.addEventListener('click', (event) => {\r\n event.preventDefault();\r\n const neighborhoodStickyButton = document.querySelector('[data-id=\"nhs_MapsAndDirections\"]');\r\n if (neighborhoodStickyButton) {\r\n neighborhoodStickyButton.click();\r\n }\r\n });\r\n }\r\n\r\n self.googleAnalyticsBindings();\r\n self.performanceEventsBindings();\r\n\r\n const formSubmitButton = document.querySelector('[data-on-page-button]');\r\n const shouldAddFreeBrochureSubmitEventAttributes = formSubmitButton ? !formSubmitButton.closest('[data-coming-soon]') : false;\r\n if (shouldAddFreeBrochureSubmitEventAttributes) {\r\n self.addFreeBrochureSubmitEventAttributes(formSubmitButton);\r\n }\r\n\r\n var container = document.querySelector(\"#nhs_DetailSalesOffice [data-slider-component]\");\r\n\r\n /**\r\n * trackReadMoreOfferEvent: tracks the event when the read more button is clicked.\r\n * @param {string} readMoreButtonText word that is used on the read more button.\r\n */\r\n function trackReadMoreOfferEvent(readMoreButtonText){\r\n const googleAnalyticsEvent = {\r\n eventType: 'GA4Event',\r\n eventName: 'builder_deals',\r\n params: {\r\n click_target: readMoreButtonText\r\n }\r\n };\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: googleAnalyticsEvent }\r\n }));\r\n }\r\n\r\n var readOffersContainer = document.querySelector(\"[data-offersContainer]\");\r\n if (readOffersContainer) {\r\n var offerBubblesCollection = document.querySelectorAll(\"[data-offerBubble]\");\r\n var currentReadMoreText = \"\";\r\n var showHiddenContentClass = \"offer__show\";\r\n var showMoreElement;\r\n var collapsibleContentElement;\r\n readOffersContainer.addEventListener(\"click\", function (event) {\r\n //If read more, we should change the text\r\n if (event.target.hasAttribute(\"data-readMoreOffer\")) {\r\n for (var counter = 0; counter < offerBubblesCollection.length; counter++) {\r\n collapsibleContentElement = offerBubblesCollection[counter].querySelector(\"[data-collapsedContent]\");\r\n if (collapsibleContentElement) {\r\n if (collapsibleContentElement.classList.contains(showHiddenContentClass)) {\r\n collapsibleContentElement.classList.remove(showHiddenContentClass);\r\n } else {\r\n collapsibleContentElement.classList.add(showHiddenContentClass);\r\n }\r\n }\r\n\r\n showMoreElement = offerBubblesCollection[counter].querySelector(\"[data-readMoreOffer]\");\r\n if (showMoreElement) {\r\n currentReadMoreText = showMoreElement.textContent;\r\n showMoreElement.textContent = showMoreElement.getAttribute(\"data-toggleText\");\r\n showMoreElement.setAttribute(\"data-toggleText\", currentReadMoreText);\r\n\r\n const currentEventReadMoreText = showMoreElement.dataset.eventCurrentText;\r\n const currentEventReadMoreToggleText = showMoreElement.dataset.eventToggleText;\r\n showMoreElement.dataset.eventCurrentText = currentEventReadMoreToggleText;\r\n showMoreElement.dataset.eventToggleText = currentEventReadMoreText;\r\n trackReadMoreOfferEvent(currentEventReadMoreText);\r\n }\r\n\r\n }\r\n }\r\n });\r\n }\r\n\r\n //sticky bar detail pages scroll\r\n var scrollToBarItems = document.querySelectorAll('[page-scroller]');\r\n var scrollBehavior = 'scrollBehavior' in document.documentElement.style;\r\n for (var i = 0; i < scrollToBarItems.length; i++) {\r\n scrollToBarItems[i].addEventListener(\"click\", function (event) {\r\n if (window.scroll) {\r\n event.preventDefault();\r\n var target = document.getElementById(this.getAttribute(\"data-target\"));\r\n var selectedTab = document.querySelector(\"[class*=nhs-c-button--tap-light-active]\");\r\n if (target) {\r\n if (scrollBehavior) {\r\n target.scrollIntoView({ behavior: \"smooth\"});\r\n } else {\r\n target.scrollIntoView();\r\n }\r\n var targetElement = event.target;\r\n if (selectedTab && targetElement.hasAttribute(\"data-sticky-tab\")) {\r\n selectedTab.classList.remove(\"nhs-c-button--tap-light-active\");\r\n delete selectedTab.dataset.itemActive;\r\n targetElement.classList.add(\"nhs-c-button--tap-light-active\");\r\n targetElement.dataset.itemActive = 'true';\r\n }\r\n }\r\n\r\n }\r\n });\r\n }\r\n },\r\n\r\n \r\n\r\n setUpGalleryXp: function () {\r\n var self = this;\r\n self.MediaData = self.parameters.gallery.mediaResult;\r\n self.setupNewOnPageGallery();\r\n },\r\n\r\n RemoveParametersFromUrl: function (url, parameters) {\r\n for (var i = 0; i < parameters.length; i++) {\r\n var parameter = parameters[i];\r\n\r\n url = url.replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1').replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');\r\n }\r\n return url;\r\n },\r\n\r\n RemoveResizingParametersFromQueryString: function (image) {\r\n var self = this;\r\n var imageUrl = NewHomeSource.ThumbnailHelper.validate(image);\r\n return self.RemoveParametersFromUrl(imageUrl, [\"width\", \"height\", \"w\", \"h\", \"maxwidth\", \"maxheight\"]);\r\n\r\n },\r\n\r\n /**\r\n * Verifies that the given url contains vimeo.\r\n *\r\n * @private\r\n * @param {url} string url from vimeo \r\n */\r\n isVimeoVideo: function (url) {\r\n return url.indexOf(\"vimeocdn.com\") !== -1;\r\n },\r\n\r\n\r\n /**\r\n * Replaces in the vimeo URL the sizes with the width passed as parameter.\r\n * The vimeo format CDN is: https://www.vimeo.com/video/{id}_{width}x{height}\r\n * @private\r\n * @param {url} string url from vimeo\r\n * @param {width} string new width value\r\n */\r\n getVimeoSourceSetUrl: function (url, width) {\r\n return url.replace(/_\\d+(x\\d+)?/, \"_\" + width);\r\n },\r\n setupNewOnPageGallery: function (bindEvents) {\r\n var self = this;\r\n var commTitle = \"\";\r\n\r\n var breakpoints = [\r\n {\r\n width: 404,\r\n breakpoint: \"404w\"\r\n },\r\n {\r\n width: 808,\r\n breakpoint: \"808w\"\r\n },\r\n {\r\n width: 966,\r\n breakpoint: \"966w\"\r\n },\r\n {\r\n width: 1932,\r\n breakpoint: \"1932w\"\r\n }\r\n ];\r\n var breakpointLength = breakpoints.length;\r\n var resizedMediaImages = self.parameters.gallery.mediaImages.map(function (image) {\r\n if (image.IsRichMedia) {\r\n return;\r\n }\r\n\r\n var cleanUrl = image.VideoType !== \"youtube\" ? self.RemoveResizingParametersFromQueryString(image) : \"https://img.youtube.com/vi/\" + image.VideoId + \"/hqdefault.jpg\";\r\n var separator = cleanUrl.indexOf(\"?\") > -1 ? \"&\" : \"?\";\r\n var format = \"\";\r\n\r\n if (image.Is360Image) {\r\n cleanUrl = cleanUrl + separator + \"format=jpg\";\r\n image.Srcset = cleanUrl + \" \" + breakpoints[breakpointLength - 1].breakpoint;\r\n image.ThumbnailUrl = image.Srcset;\r\n\r\n return image;\r\n\r\n } else {\r\n\r\n if (!(cleanUrl.indexOf(\"format=\") > -1)) {\r\n format = \"&format=jpg\";\r\n }\r\n\r\n image.ThumbnailUrl = image.VideoType != \"youtube\" ? cleanUrl + separator + \"maxwidth=\" + breakpoints[breakpointLength - 1].width + format + \"&quality=90 \" : cleanUrl;\r\n\r\n var srcsetUrl = \"\";\r\n for (var i = 0; i < breakpointLength; i++) {\r\n if (self.isVimeoVideo(cleanUrl)) {\r\n cleanUrl = self.getVimeoSourceSetUrl(cleanUrl, breakpoints[i].width);\r\n }\r\n if (i + 1 === breakpointLength) {\r\n srcsetUrl += cleanUrl + separator + \"maxwidth=\" + breakpoints[i].width + format + \"&quality=90 \" + breakpoints[i].breakpoint;\r\n }\r\n else {\r\n srcsetUrl += cleanUrl + separator + \"maxwidth=\" + breakpoints[i].width + format + \"&quality=90 \" + breakpoints[i].breakpoint + \", \";\r\n }\r\n }\r\n\r\n if (image.VideoType !== \"youtube\") {\r\n image.Srcset = srcsetUrl;\r\n image.sizes = \"(max-width: 768px) 404px, 966px\";\r\n } else {\r\n image.Srcset = image.ThumbnailUrl;\r\n }\r\n\r\n return image;\r\n\r\n }\r\n }).filter(function (element) {\r\n return element !== undefined;\r\n });\r\n\r\n self.gallery = resizedMediaImages;\r\n\r\n if (self.gallery.length > 0) {\r\n var index;\r\n self.galleryIndex = 0;\r\n if (self.gallery.length === 0) {\r\n return;\r\n }\r\n\r\n var countComm = 0;\r\n var countVideo = 0;\r\n const videoIcon = document.querySelector('[data-video-icon-second]');\r\n const videoOverlay = document.querySelector('[data-video-icon-first]');\r\n if (typeof bindEvents === \"undefined\" || !!bindEvents) {\r\n var galleryMap = self.gallery.map(function (img) {\r\n\r\n var collection = img.CollectionName;\r\n var elementPosition = 0;\r\n if (collection === \"Community\") {\r\n elementPosition = countComm;\r\n countComm++;\r\n } else if (collection === \"Video\") {\r\n elementPosition = countVideo;\r\n countVideo++;\r\n }\r\n\r\n return {\r\n id: img.Id,\r\n url: img.ThumbnailUrl,\r\n alt: img.AltText,\r\n Srcset: img.Srcset,\r\n sizes: img.sizes,\r\n collection: collection,\r\n position: elementPosition\r\n };\r\n });\r\n self.detailGallery = new NHS.Scripts.Gallery(document.querySelector(\"#gallery\"), galleryMap);\r\n self.detailGallery.onChange = function (index) {\r\n self.galleryIndex = index;\r\n videoIcon.setAttribute('hidden', '');\r\n videoOverlay.setAttribute('hidden', '');\r\n var galleryItem = self.gallery[self.galleryIndex];\r\n if (galleryItem.CollectionName.toLowerCase() === \"video\") {\r\n //We must look for the type of video in order to change the title. Currently we have BVT for testimonial at Division Level and VID for Regular community Video.\r\n var videoTitle = galleryItem.Type !== undefined && galleryItem.Type !== \"\" && galleryItem.Type === \"BVT\" ? self.parameters.TestimonialVideo : self.parameters.CommunityVideo;\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(videoTitle);\r\n videoIcon.removeAttribute('hidden');\r\n videoOverlay.removeAttribute('hidden');\r\n } else {\r\n commTitle = self.gallery[self.galleryIndex].Title !== null ? self.gallery[self.galleryIndex].Title : self.gallery[self.galleryIndex].Description !== null ? self.gallery[self.galleryIndex].Description : \"\";\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(commTitle);\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Video\").addClass(\"Community\");\r\n }\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileBottom span:eq(1)\").text((self.galleryIndex + 1) + \"/\" + self.gallery.length);\r\n };\r\n }\r\n videoIcon.setAttribute('hidden', '');\r\n videoOverlay.setAttribute('hidden', '');\r\n var firstGalleryItem = self.gallery[0];\r\n if (firstGalleryItem !== null && firstGalleryItem !== undefined && firstGalleryItem.CollectionName.toLowerCase() === \"video\") {\r\n //We must look for the type of video in order to change the title. Currently we have BVT for testimonial at Division Level and VID for Regular community Video.\r\n var videoTitle = firstGalleryItem.Type !== undefined && firstGalleryItem.Type !== \"\" && firstGalleryItem.Type === \"BVT\" ? self.parameters.TestimonialVideo : self.parameters.CommunityVideo;\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(videoTitle);\r\n videoIcon.removeAttribute('hidden');\r\n videoOverlay.removeAttribute('hidden');\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Community\").addClass(\"Video\");\r\n } else {\r\n commTitle = self.gallery[self.galleryIndex].Title !== null ? self.gallery[self.galleryIndex].Title : self.gallery[self.galleryIndex].Description !== null ? self.gallery[self.galleryIndex].Description : \"\";\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileType\").text(commTitle);\r\n jQuery(\"#nhs_DetailGalleryMain .nhs_DetailTileOverlay\").removeClass(\"Video\").addClass(\"Community\");\r\n }\r\n\r\n jQuery(\".nhs_DetailTileBottom span:eq(1)\").text(\"1/\" + self.gallery.length);\r\n if (self.gallery.length === 1) {\r\n jQuery(\"#nhs_GalleryPrev\").remove();\r\n jQuery(\"#nhs_GalleryNext\").remove();\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * Performs a Lazy load on a specific element and it will perform an ajax also.\r\n * @param {Number} idOfVisibleElement Id of the element that is present and also the one that will be the target to load.\r\n * @param {Any} dataForAjax Data that will be Stringified to a JSON on the AJAX call.\r\n * @param {String} urlForAjax Url where the AJAX call will hit.\r\n * @param {Function} successAjaxFunction Function that will be executed once the AJAX is success.\r\n */\r\n performLazyLoad: function (idOfVisibleElement, dataForAjax, urlForAjax, successAjaxFunction) {\r\n var lazyLoadReady = false;\r\n jQuery.LazyLoad({\r\n ElementVisibleId: idOfVisibleElement,\r\n UpdateAction: function (isVisible) {\r\n if (isVisible && lazyLoadReady === false) {\r\n lazyLoadReady = true;\r\n jQuery.ajax({\r\n url: urlForAjax,\r\n type: dataForAjax !== null ? \"POST\" : \"GET\",\r\n contentType: 'application/json',\r\n data: JSON.stringify(dataForAjax),\r\n success: successAjaxFunction\r\n });\r\n }\r\n }\r\n });\r\n },\r\n\r\n setUpControls: function () {\r\n const homesAndPlansJs = document.querySelector('#nhs_HomesAndPlans');\r\n\r\n if (homesAndPlansJs) {\r\n NHS.loadJs(homesAndPlansJs.value, 'homeAndPlans');\r\n }\r\n\r\n function backToTop(event) {\r\n event.preventDefault();\r\n document.body.scrollIntoView({behavior: \"smooth\"});\r\n }\r\n\r\n const topLinks = document.querySelectorAll('a[href=\"#top\"]');\r\n topLinks.forEach(element => {\r\n element.addEventListener('click', backToTop);\r\n });\r\n },\r\n\r\n SetupNearbyCommunities: function (parameters) {\r\n if (this.googlePropertyMap.isMapCreate) {\r\n this.googlePropertyMap.googleApi.processResult(parameters);\r\n //this.googlePropertyMap.googleApi.AutoFit();\r\n } else {\r\n this.googlePropertyMap.parameters.NearbyComms = parameters;\r\n }\r\n this.favs.init();\r\n },\r\n\r\n SaveCommunity: function () {\r\n var self = this;\r\n var dataForPost = {\r\n communityId: self.parameters.communityId,\r\n builderId: self.parameters.builderId\r\n };\r\n jQuery.post(self.parameters.addCommunityToPlanerMethod, dataForPost, (function (json) {\r\n self.ShowSuccessMessage(json);\r\n if (json.data) {\r\n jQuery(\"a#nhs_SaveThisItem\").replaceWith('' + self.parameters.SavedText + \"\");\r\n //jQuery(\"#pSaveThisItem\").html('' + self.parameters.SavedToYourProfileText + \"\");\r\n jQuery(\"p #nhs_NextStepsSaveThisItem\").addClass(\"nhs_ItemSaved\").text(self.parameters.SavedText).removeAttr(\"onclick\").removeAttr(\"href\");\r\n jQuery(\"#pSaveThisItemMpc\").html(\"\" + self.parameters.SavedToYourProfileText + \"
Create an account and save your favorite homes, communities and developments
\");\r\n jQuery(\"a#nhs_Saved\").replaceWith(\"\" + self.parameters.SavedText + \"\");\r\n }\r\n }).bind(this), \"json\");\r\n },\r\n\r\n ShowSuccessMessage: function (json) {\r\n var self = this;\r\n if (!json.data) {\r\n window.location.href = json.redirectUrl;\r\n } else {\r\n if (json.message === self.parameters.saveMessage) {\r\n //jQuery(\"#nhs_SaveThisItem\").hide();\r\n jQuery(\"a#nhs_SaveThisItem\").replaceWith(\"\");\r\n jQuery(\"#SuccessMessage\").show();\r\n\r\n } else {\r\n jQuery(\"span#nhs_SaveThisItem\").replaceWith(\"\" + self.parameters.SaveToFavoritesText + \"\");\r\n jQuery(\"span.nhs_Save.nhs_Saved\").replaceWith(\"\" + self.parameters.SaveText + \"\");\r\n jQuery(\"a#nhs_SaveThisItem, a#nhs_Saved\").on(\"click\", function () {\r\n self.SaveCommunity();\r\n });\r\n }\r\n }\r\n },\r\n\r\n addFreeBrochureSubmitEventAttributes: function (submitButton) {\r\n window.NewHomeSource.Analytics.GoogleAnalyticsTracker.buildTagWithEvent(submitButton, \"Lead Events\",\r\n NHS.Scripts.Helper.readCookie(\"CTAName\"),\r\n \"Submit Form - Free Brochure\");\r\n },\r\n\r\n googleAnalyticsBindings: function () {\r\n NHS.Scripts.Helper.createCookie(\"CTAName\", \"Community – CTA On Page Lead Form\");\r\n const mainCta = document.querySelector('#nhs_GetBrochure');\r\n mainCta.addEventListener('click', function() {\r\n NHS.loadCss(document.getElementById(\"detailsXpRecosCss\").value);\r\n });\r\n },\r\n performanceEventsBindings: function () {\r\n var self = this;\r\n const socialLinks = document.querySelectorAll('[data-share-link]');\r\n socialLinks.forEach(link => {\r\n window.NewHomeSource.Analytics.TdvTracker.buildTagWithEvent(link,\r\n 'bcSocialShare,'+self.parameters.CommunityDetailSocialMediaShare,\r\n [\r\n {\r\n name: 'data-community',\r\n value: commDetail.get_commId()\r\n },\r\n {\r\n name: 'data-builder',\r\n value: commDetail.get_builderId()\r\n },\r\n {\r\n name: 'data-market',\r\n value: self.parameters.marketId\r\n },\r\n ])\r\n });\r\n },\r\n\r\n _updateAdsPosition: function () {\r\n var container;\r\n var detailInfo = document.querySelector(\".nhs_DetailMain:not(.nhs_First)\");\r\n var adCol = document.querySelector(\"#nhs_AdColumn\");\r\n var salesoffice = document.getElementById(\"nhs_DetailSalesOffice\");\r\n var homeToolsBuyingSection = document.querySelector(\".nhs_ResToolsSection\");\r\n var merchandizedSection = document.querySelector(\"#nhs_Merchandized_Reviews\");\r\n var merchandizedSectionHeigth = 0;\r\n var homeToolsBuyingSectionHeight = 0;\r\n var salesOfficeHeight = 0;\r\n var heightToMinus = 0;\r\n\r\n if (salesoffice) {\r\n salesOfficeHeight = salesoffice.getBoundingClientRect().height;\r\n }\r\n if (homeToolsBuyingSection) {\r\n homeToolsBuyingSectionHeight = homeToolsBuyingSection.getBoundingClientRect().height;\r\n }\r\n if (merchandizedSection) {\r\n merchandizedSectionHeigth = merchandizedSection.getBoundingClientRect().height;\r\n }\r\n\r\n heightToMinus = salesOfficeHeight + homeToolsBuyingSectionHeight + merchandizedSectionHeigth;\r\n\r\n if (adCol) {\r\n container = adCol.querySelector(\"div\");\r\n }\r\n if (!detailInfo || !adCol || !container || typeof window.MutationObserver === \"undefined\") return;\r\n\r\n container.setAttribute(\"style\", \"position: -webkit-sticky; position: sticky; top: 0; right: 0;\");\r\n\r\n // The Height of the nhs_ResAdCol will change according to the height of the results\r\n // and the function above will be executed anytime the results change\r\n },\r\n};\r\n\r\n/*Show floating form when is collapse*/\r\nvar takeATourFloatingButton = document.querySelector(\"[data-take-tour]\");\r\nvar floatingFormContainerHide = \" \";\r\nif (takeATourFloatingButton) {\r\n takeATourFloatingButton.addEventListener(\"click\", function () {\r\n floatingFormContainerHide = document.querySelector(\"[data-floating-form-container]\");\r\n if (floatingFormContainerHide) {\r\n floatingFormContainerHide.classList.remove(\"minimize\");\r\n }\r\n });\r\n}\r\n\r\n/*Clean commentFloatingform when user request a In Person lead*/\r\nvar inPersonRequestLabel = document.querySelector(\"[data-text-in-person]\");\r\nif (inPersonRequestLabel) {\r\n inPersonRequestLabel.addEventListener(\"click\",\r\n function () {\r\n var commentsInput = document.querySelector(\"#Comments_2\");\r\n if (commentsInput)\r\n commentsInput.value = \"\";\r\n });\r\n}\r\n\r\nvar commentInput = document.querySelector(\"#Comments_2\");\r\nif (commentInput) {\r\n var VirtualTourRequestLabel = document.querySelector(\"[data-is-virtual-tour]\");\r\n if (VirtualTourRequestLabel) {\r\n VirtualTourRequestLabel.addEventListener(\"click\",\r\n function () {\r\n var commentsInput = document.querySelector(\"#Comments_2\");\r\n if (commentsInput)\r\n commentsInput.value = commentInput.value;\r\n });\r\n }\r\n}\r\n\r\ndocument.addEventListener(\"readystatechange\", function () {\r\n if (document.readyState === \"complete\") {\r\n if (window.NewHomeSource.ElementToggler) {\r\n window.NewHomeSource.ElementToggler.Init();\r\n }\r\n\r\n if (window.NewHomeSource.CommunityAndNeighBorhoodHandler) {\r\n window.NewHomeSource.CommunityAndNeighBorhoodHandler.init();\r\n }\r\n\r\n if (window.NewHomeSource.InitialLoadModalHandler) {\r\n window.NewHomeSource.InitialLoadModalHandler.DisplayModal();\r\n }\r\n }\r\n});\r\n\r\n/*\r\n * When clicking in the header links that navigate to the different available homes tabs\r\n * we need to make sure the user sees the correct tab, we get this done by adding the data-available-homes\r\n * attribute to the header link with the value being the element ID of the correct tab in the \r\n * available homes section.\r\n*/\r\n(function () {\r\n document.addEventListener('click', function (event) {\r\n if (event.target.hasAttribute('data-available-homes')) {\r\n const targetElementId = event.target.getAttribute('data-available-homes');\r\n const targetElement = document.getElementById(targetElementId);\r\n\r\n if (targetElement) {\r\n targetElement.click();\r\n } else {\r\n const alernateTargetElementId = event.target.getAttribute('data-available-homes-alternate');\r\n const alternateTargetElement = document.getElementById(alernateTargetElementId);\r\n\r\n if (alternateTargetElement) {\r\n alternateTargetElement.click();\r\n }\r\n }\r\n }\r\n })\r\n}());\r\n\r\n/*\r\n * When clicking in the price reduction label on the top of the page, that action should take the\r\n * user to the homes and plans section. We can't do this via an anchor targeting an #id in the page\r\n * since we have a base tag pointing to the homepage (not the detail page itself), so creating an\r\n * anchor tag with href=\"#id\" will take you to the homepage and look for the #id there.\r\n*/\r\n(function () {\r\n const priceReductionLabel = document.getElementById('nhs_priceReductionLabel');\r\n const trustBuilderReviewsSection = document.querySelector('[data-detail-reviews-section]');\r\n\r\n const homesAndPlansSection = document.getElementById('HomesAndPlans');\r\n const builderSection = document.getElementById('builderInfoSection');\r\n\r\n if (priceReductionLabel && homesAndPlansSection) {\r\n priceReductionLabel.addEventListener('click', function () {\r\n homesAndPlansSection.scrollIntoView();\r\n });\r\n }\r\n\r\n if (trustBuilderReviewsSection && builderSection) {\r\n trustBuilderReviewsSection.addEventListener('click', function (event) {\r\n event.preventDefault();\r\n builderSection.scrollIntoView();\r\n });\r\n }\r\n}());","var formObserver;\r\nvar isCustomLocation = document.getElementById(\"IsCustomLocation\");\r\nvar isBasic = document.getElementById(\"IsBasic\");\r\nisBasic = isBasic && isBasic.value === \"True\";\r\nisCustomLocation = isCustomLocation && isCustomLocation.value === \"True\";\r\nvar isComingSoon = document.querySelector(\"[data-is-coming-soon]\")\r\n ? document.querySelector(\"[data-is-coming-soon]\").value === \"True\"\r\n : false;\r\n\r\nfunction formValuesToQueryString(data) {\r\n var queryString = \"\";\r\n var keyValuePair = Object.entries(data);\r\n if (keyValuePair && keyValuePair.length > 0) {\r\n for (var i = 0; i < keyValuePair.length; i++) {\r\n if (typeof keyValuePair[i][1] !== \"undefined\") {\r\n queryString += keyValuePair[i][0] + \"=\" + keyValuePair[i][1] + \"&\";\r\n }\r\n }\r\n }\r\n queryString = queryString.substring(0, queryString.length - 1);\r\n\r\n return queryString;\r\n};\r\n\r\nfunction showThankYouPageForExternalLeads(event) {\r\n var data = getFreeBrochureData(event);\r\n var url = \"/getthankyoupageafterexternallead?\" + formValuesToQueryString(data);\r\n window.NewHomeSource.ModalLoader.showModal(url);\r\n}\r\n\r\nfunction onChangeToggleZipInput(checkboxElem) {\r\n var form = checkboxElem.closest(\"form\");\r\n var zipInput = form.querySelector(\"[name='postal']\");\r\n\r\n if (checkboxElem.checked) {\r\n zipInput.disabled = true;\r\n zipInput.value = \"\";\r\n } else {\r\n zipInput.disabled = false;\r\n }\r\n}\r\n\r\n/**\r\n * Opens the custom scheduler, if the community is part of the scheduler program.\r\n * @param {HTMLElement} element The element triggering the form sending.\r\n */\r\nfunction openScheduler(element) {\r\n const isCustomScheduler = element.dataset.component === 'lead-by-iframe';\r\n\r\n if (isCustomScheduler && window.NewHomeSource.SchedulerHandler) {\r\n window.NewHomeSource.SchedulerHandler.openSchedulerTab(element);\r\n }\r\n}\r\n\r\nfunction onClickSendForm(event, callback) {\r\n event.preventDefault();\r\n NHS.loadCss(document.getElementById(\"detailsXpRecosCss\").value);\r\n\r\n var currentForm = event.target.closest(\"form\");\r\n var sendButton = currentForm.querySelector(\"[data-send-form]\");\r\n\r\n var valid = formValidator.validateForm(currentForm, true);\r\n\r\n if (valid) {\r\n sendButton.setAttribute(\"disabled\", \"disabled\");\r\n\r\n if (isCustomLocation) {\r\n sendAskQuestionLead(event, callback);\r\n } else if (!isBasic){\r\n openScheduler(event.target);\r\n sendFreeBrochureLead(event, event.target, callback);\r\n }\r\n }\r\n}\r\n\r\nfunction addDataInComment(formElem) {\r\n const commentElem = formElem.querySelector(\"textarea\")\r\n let comment = commentElem ? commentElem.value : '';\r\n var isOnPageForm = formElem.getAttribute(\"data-onpage-form\") === \"\";\r\n const isRegularLeadForm = formElem.getAttribute('data-regular-lead-form') === '';\r\n const isAskQuestionForm = formElem.getAttribute('data-is-ask-question-form') === '';\r\n var isFullImageViewer = formElem.parentElement.getAttribute(\"data-panel-form-type\") === \"scheduleTour\";\r\n var commentData = \"\";\r\n\r\n if (isAskQuestionForm ||\r\n (isFullImageViewer && isComingSoon)) {\r\n return comment;\r\n }\r\n\r\n if (isOnPageForm) {\r\n commentData = getOnPageFormCommentData(formElem);\r\n } else if (isRegularLeadForm || isFullImageViewer) {\r\n commentData = getTourFormCommentData(formElem);\r\n }\r\n\r\n // if there is a users comment, appends the commentData at the end\r\n if (commentData !== \"\") {\r\n comment += comment === \"\"\r\n ? commentData\r\n : \" - \" + commentData;\r\n }\r\n\r\n return comment;\r\n}\r\n\r\nfunction getLeadAction(formTriggeredElement) {\r\n const isOnPageForm = formTriggeredElement.hasAttribute(\"data-onpage-form\");\r\n let leadActionType = isOnPageForm ? \" \" : null;\r\n const isFullImageContactBuilder = formTriggeredElement.parentElement.getAttribute('data-panel-form-type') === 'contactBuilder';\r\n const isAskQuestion = formTriggeredElement.hasAttribute(\"data-is-ask-question-form\");\r\n\r\n if (isFullImageContactBuilder || isAskQuestion) {\r\n return leadActionType;\r\n }\r\n\r\n if (!isOnPageForm) {\r\n const virtualTourElement = formTriggeredElement.querySelector(\"[data-is-virtual-tour]\");\r\n\r\n if (virtualTourElement) {\r\n leadActionType = formTriggeredElement.querySelector(\"[data-is-virtual-tour]\").checked ? \"rva\" : \"ra\";\r\n }\r\n else {\r\n leadActionType = \"ra\";\r\n }\r\n }\r\n \r\n return leadActionType;\r\n}\r\n\r\n/**\r\n * Gets the additional information that should be included in the comment field for the on page form.\r\n * @param {element} formElem The floating form element.\r\n * @returns The information that should be appended to the comment field.\r\n */\r\nfunction getOnPageFormCommentData(formElem) {\r\n var formOptions = formElem.querySelectorAll(\"[name='form-options']:checked\");\r\n var formText = \"\";\r\n\r\n for (var i = 0; i < formOptions.length; ++i) {\r\n var currentOption = formOptions[i];\r\n formText += formText === \"\"\r\n ? currentOption.getAttribute(\"data-comment\") + \",\"\r\n : \" \" + currentOption.getAttribute(\"data-comment\") + \",\";\r\n }\r\n\r\n if (formText !== \"\") {\r\n formText = \"Interested in: \" + formText.slice(0, -1) + \".\";\r\n }\r\n\r\n return formText;\r\n}\r\n\r\n\r\n/**\r\n * Get the data that should be appended to the comment field of the 'tour' forms.\r\n * This logic applies for the floating form tour form and the tour form in next steps section.\r\n * @param {any} formElement The form to handle.\r\n * @returns A string indicating if date and if the lead is a virtual tour or a 1 on 1 meeting.\r\n */\r\nfunction getTourFormCommentData(formElement) {\r\n const virtualTourElement = formElement.querySelector(\"[data-is-virtual-tour]\");\r\n const isVirtualTour = !!virtualTourElement && virtualTourElement.checked;\r\n let selectedDateElement = formElement.querySelector(\"[data-date]\");\r\n let finalDate = '';\r\n\r\n if (selectedDateElement) {\r\n const selectedDate = selectedDateElement.getAttribute(\"data-date\");\r\n finalDate = selectedDate.replace(/[^ -~]/g, '');\r\n }\r\n else {\r\n return '';\r\n }\r\n\r\n if (isVirtualTour) {\r\n return formElement.querySelector(\"[data-text-video-chat]\").value + \" \" + finalDate;\r\n } else {\r\n return formElement.querySelector(\"[data-text-in-person]\").value + \" \" + finalDate;\r\n }\r\n}\r\n\r\n/**\r\n * Gets the preferred method of contact selected in the form 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});","(function moreCommunitiesSection() {\r\n 'use strict';\r\n\r\n const nearbyContainer = document.querySelector('[data-nearby-section]');\r\n function handlerMoreCommunityClick(event) {\r\n const target = event.target;\r\n const cardElement = target.closest('[data-card-element]');\r\n const card = target.closest('[data-card]');\r\n const link = card.querySelector('[data-link]');\r\n\r\n if (!card) {\r\n return;\r\n }\r\n\r\n if (cardElement &&\r\n (cardElement.dataset.cardElement === 'favoriteButton' || cardElement.dataset.cardElement === 'priceReduction')) {\r\n return;\r\n }\r\n\r\n link.click();\r\n }\r\n\r\n document.body.addEventListener(\r\n 'moreCommunitiesLoaded',\r\n () => nearbyContainer.addEventListener('click', handlerMoreCommunityClick)\r\n );\r\n}());\r\n","/**\r\n * This module 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","(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","jQuery(document).ready(function () {\r\n\r\n});\r\nNHS.Scripts.GooglePropertyMap = function (parameters) {\r\n this.parameters = parameters;\r\n this.isMapCreate = false;\r\n this.alreadyClicked = false;\r\n this.reDrawMap = true;\r\n this.disableShowButton = parameters.disableShowButton;\r\n};\r\n\r\nNHS.Scripts.GooglePropertyMap.prototype =\r\n {\r\n InitMap: function () {\r\n var self = this;\r\n var mapOptions = self.parameters.OptionsForMap;\r\n\r\n let salesOfficeTab = document.querySelector('[data-type=\"sales-office\"]');\r\n let coordinatesElement = document.querySelector('#nhs_MapTabs [data-active]');\r\n\r\n if(salesOfficeTab && coordinatesElement){\r\n mapOptions.MapOptions.Latitude = Number(coordinatesElement.dataset.lat);\r\n mapOptions.MapOptions.Longitude = Number(coordinatesElement.dataset.lng);\r\n }\r\n\r\n self.isMapCreate = true;\r\n self.googleApi.createMap();\r\n self.googleApi.createMarkerPoint(mapOptions.MapOptions.Latitude, mapOptions.MapOptions.Longitude, null, null, self.parameters.icon, null, null, null, mapOptions.MapOptions.label);\r\n\r\n if (self.parameters.NearbyComms) {\r\n self.googleApi.processResult(self.parameters.NearbyComms);\r\n }\r\n\r\n self.mapExpanded();\r\n if (!self.disableShowButton) {\r\n self.SetUpdate();\r\n }\r\n if (!self.googleApi.map) {\r\n return;\r\n }\r\n google.maps.event.addListener(self.googleApi.map, 'idle', self.RemoveGoogleInfo);\r\n jQuery.HideLoading();\r\n if (typeof self.googleApi.initializeAutoComplete === 'function') {\r\n self.googleApi.initializeAutoComplete();\r\n }\r\n },\r\n\r\n CreateMap: function () {\r\n var self = this;\r\n if (self.isMapCreate) {\r\n if (self.parameters.isBasicListing) {\r\n self.parameters.logger.logBasicListingEvent('BLMAPV', self.parameters.communityId);\r\n }\r\n if (jQuery('#tabBuilderMap a').length > 0 && self.reDrawMap) {\r\n self.reDrawMap = false;\r\n self.googleApi.ReDrawMap();\r\n }\r\n }\r\n\r\n if (!self.isMapCreate) {\r\n if (jQuery(\"#nhs_GoogleMapScript\").length === 0) {\r\n NHS.Scripts.GoogleMapApi.prototype.loadGoogleMapsCode(self.parameters.googleMapScript +\r\n '&callback=initializeDP');\r\n } else {\r\n self.googleApi.WaitGoogleScript(function () {\r\n self.InitMap();\r\n }, 100, self.googleApi);\r\n }\r\n }\r\n dataLayer.push({ \"mapCoordinates\": \"o|\" + self.parameters.OptionsForMap.MapOptions.Latitude + \"|\" + self.parameters.OptionsForMap.MapOptions.Longitude });\r\n },\r\n\r\n SetUpGoogleApi: function () {\r\n\r\n var self = this;\r\n var parameters = self.parameters;\r\n\r\n var mapOptions = this.parameters.OptionsForMap;\r\n var googleApi = new NHS.Scripts.GoogleMapApi(mapOptions);\r\n\r\n googleApi.getIconMarkerPoint = function (results, result) {\r\n if (result.MarketPoints.length > 1)\r\n return parameters.iconNearByCommMulti;\r\n return parameters.iconNearByComm;\r\n };\r\n\r\n googleApi.options.Events.MarkerClickCallBack = function (info, infowindow, infowindowTooltip, marker) {\r\n if (info && info.MarketPoints) {\r\n var commIds = [];\r\n for (var i = 0; i < info.MarketPoints.length; i++) {\r\n commIds.push(info.MarketPoints[i]['CommunityId'] + \"|\" + 0);\r\n }\r\n\r\n jQuery.ajax({\r\n url: parameters.getCommunityMapCards,\r\n type: \"GET\",\r\n data: {\r\n commIds: commIds.join(),\r\n basicIds: \"\"\r\n },\r\n success: function (html) {\r\n if (html) {\r\n infowindow.setContent(html);\r\n infowindow.open(googleApi.map, marker);\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n googleApi.placeChangedProcess = function (marker, autocomplete) {\r\n var place = autocomplete.getPlace();\r\n self.location = place.geometry.location;\r\n };\r\n\r\n return googleApi;\r\n },\r\n\r\n init: function () {\r\n var self = this;\r\n var parameters = self.parameters;\r\n self.googleApi = self.SetUpGoogleApi();\r\n jQuery('#dd-collapsible').hide();\r\n jQuery('#nhs_propertyMapCollapsibleClose').hide();\r\n\r\n var newMapsContainer = document.querySelectorAll(\"#nhs_MapsAndDirections\");\r\n if (newMapsContainer) {\r\n self.CreateMap();\r\n }\r\n\r\n if (parameters.isGalleryXp) {\r\n jQuery(\"#nhs_propertyMapCollapsibleOpen\").click(function () {\r\n self.googleApi.loadGoogleMapsCode(self.parameters.googleMapScript);\r\n var mapContainer = document.getElementById(\"nhs_PropertyMap\");\r\n if (mapContainer.children.length > 0) return;\r\n self.getPropertyMapSides(self, false);\r\n self.reDrawMap = false;\r\n });\r\n }\r\n\r\n jQuery('#nhs_propertyMapCollapsibleOpen, #nhs_mapTab').click(function (event) {\r\n if (parameters.isGalleryXp !== true) {\r\n self.getPropertyMapSides(self, window.location.pathname.indexOf(\"preview\") > 0);\r\n }\r\n\r\n self.parameters.logger.logEventWithParameters(\"Drive_Dir_Reveal\", self.parameters.logInfo);\r\n if (jQuery(\"#dd-collapsible\").css('display') === 'none') {\r\n jQuery('#dd-collapsible').show();\r\n if (self.parameters.isGalleryXp === true && self.reDrawMap && self.isMapCreate) {\r\n self.reDrawMap = false;\r\n self.googleApi.ReDrawMap();\r\n }\r\n }\r\n jQuery('#nhs_propertyMapCollapsibleOpen').hide();\r\n jQuery('#nhs_propertyMapCollapsibleClose').show();\r\n\r\n NHS.loadCss(document.getElementById(\"detailsXpMapCss\").value);\r\n });\r\n\r\n jQuery('#nhs_propertyMapCollapsibleClose').click(function (event) {\r\n jQuery('#dd-collapsible').hide();\r\n jQuery('#nhs_propertyMapCollapsibleClose').hide();\r\n jQuery('#nhs_propertyMapCollapsibleOpen').show();\r\n });\r\n\r\n self.InitDrivingDirection();\r\n },\r\n\r\n getPropertyMapSides: function (self, isPreview) {\r\n var parameters = self.parameters;\r\n var isMpc = (typeof parameters.isMPCommunity != 'undefined') ? parameters.isMPCommunity : false;\r\n if (typeof parameters.GetPropertyMapRightSide != 'undefined') {\r\n jQuery.ajax({\r\n url: parameters.GetPropertyMapRightSide,\r\n data: {\r\n \"communityId\": parameters.communityId,\r\n \"isMPC\": isMpc,\r\n \"isPreview\": isPreview\r\n },\r\n type: \"POST\",\r\n success: function (data) {\r\n jQuery(\"#nhs_MapRightSide\").html(data);\r\n jQuery('#nhs_PropertyMap').width(parameters.mapWidth).height(parameters.mapHeight);\r\n if (jQuery(\"#nhs_mapTypeMenu\")) {\r\n self.isMapCreate = false;\r\n var buildderTabMap = jQuery('#tabBuilderMap');\r\n buildderTabMap.click();\r\n self.CreateMap();\r\n }\r\n }\r\n });\r\n } else {\r\n jQuery('#nhs_PropertyMap').width(parameters.mapWidth).height(parameters.mapHeight);\r\n self.CreateMap();\r\n }\r\n },\r\n\r\n mapExpanded: function () {\r\n var self = this;\r\n\r\n if (!this.alreadyClicked) {\r\n\r\n if (self.parameters.isBasicCommunity) {\r\n self.parameters.logger.logMultiEvent('bcMapSectionReveal', self.parameters.communityId, self.parameters.builderId, 0, 0);\r\n jQuery.googlepush('Basic Listing', 'Driving Directions', self.parameters.communityId, 2, false);\r\n }\r\n\r\n this.alreadyClicked = true;\r\n }\r\n },\r\n\r\n InitDrivingDirection: function () {\r\n var self = this;\r\n jQuery('#nhs_drivingDirections').show();\r\n\r\n jQuery('#nhs_CommMapTab1').addClass(\"nhs_Active\");\r\n\r\n jQuery('#nhs_CommMapTabs a').click(function () {\r\n if (jQuery(this).is('.GoogleMap') && jQuery('#nhs_CommunityMapTab').is(':visible')) {\r\n self.parameters.logger.logEventWithParameters(\"Drive_Dir_Reveal\", self.parameters.logInfo);\r\n\r\n jQuery('#nhs_CommunityMapTab').toggle();\r\n jQuery('#nhs_GoogleMapTab').toggle();\r\n jQuery('#nhs_CommMapTab1').removeClass(\"nhs_Active\");\r\n jQuery('#nhs_CommMapTab2').addClass(\"nhs_Active\");\r\n self.CreateMap();\r\n\r\n var $buildderTabMap = jQuery('#tabBuilderMap a');\r\n if ($buildderTabMap.length > 0) {\r\n self.isMapCreate = false;\r\n $buildderTabMap.click();\r\n }\r\n } else if (jQuery(this).is('.CommMap') && jQuery('#nhs_GoogleMapTab').is(':visible')) {\r\n jQuery('#nhs_CommunityMapTab').toggle();\r\n jQuery('#nhs_GoogleMapTab').toggle();\r\n jQuery('#nhs_CommMapTab2').removeClass(\"nhs_Active\");\r\n jQuery('#nhs_CommMapTab1').addClass(\"nhs_Active\");\r\n }\r\n\r\n return false;\r\n });\r\n\r\n jQuery('#Maps').on(\"click\", \"#tabMQMap\", function () {\r\n if (!jQuery('#nhs_PropertyMap').is(':visible')) {\r\n jQuery('#nhs_PropertyMap').toggle();\r\n jQuery('#tabBuilderMap').find('a').toggleClass('On');\r\n jQuery('#tabMQMap').find('a').toggleClass('On');\r\n jQuery('#nhs_BuilderPropertyMap').toggle();\r\n jQuery('#nhs_drivingDirections').hide();\r\n jQuery('#nhs_GetDirections').show();\r\n jQuery('#nhs_drivingDirections').show();\r\n }\r\n self.CreateMap();\r\n\r\n return false;\r\n }\r\n );\r\n\r\n jQuery('#Maps').on(\"click\", \"#tabBuilderMap\", function () {\r\n\r\n if (!jQuery('#nhs_BuilderPropertyMap').is(':visible')) {\r\n jQuery('#nhs_BuilderPropertyMap').toggle();\r\n jQuery('#tabBuilderMap').find('a').toggleClass('On');\r\n jQuery('#tabMQMap').find('a').toggleClass('On');\r\n jQuery('#nhs_PropertyMap').toggle();\r\n jQuery('#nhs_drivingDirections').show();\r\n jQuery('#nhs_GetDirections').hide();\r\n jQuery('#nhs_drivingDirections').show();\r\n }\r\n\r\n var alreadyBuilderMapClicked = NHS.Scripts.Helper.readCookie('drivingDirectionsBuilderMapClicked');\r\n\r\n if (!alreadyBuilderMapClicked) {\r\n if (!self.parameters.isBasicListing || !self.parameters.isBasicCommunity) {\r\n if (self.parameters.specId > 0 || self.parameters.planId > 0) {\r\n self.parameters.logger.logEventWithParameters('HDSDD', self.parameters.logInfo);\r\n } else {\r\n self.parameters.logger.logEventWithParameters('CDSDD', self.parameters.logInfo);\r\n }\r\n }\r\n\r\n NHS.Scripts.Helper.createCookie('drivingDirectionsBuilderMapClicked', 1, 0);\r\n }\r\n\r\n return false;\r\n });\r\n var date = new Date();\r\n date.setDate(date.getDate() + 1);\r\n var currentMonth = date.getMonth();\r\n var currentDate = date.getDate();\r\n var currentYear = date.getFullYear();\r\n jQuery(\"#nhsTxtDate\").datepicker({\r\n minDate: new Date(currentYear, currentMonth, currentDate)\r\n });\r\n jQuery(\"#nhsTxtDate\").attr(\"disabled\", \"disabled\");\r\n jQuery('.nhs_PickerIconContainer').click(function () {\r\n jQuery('#nhsTxtDate').datepicker(\"show\");\r\n initDatepickerGallery();\r\n });\r\n jQuery(\".btn_NhsMapSend\").mousedown(function () {\r\n window.NewHomeSource.ModalLoader.initTrigger('.btn_NhsMapSend',\r\n function () {\r\n var dateValue = jQuery(\"#nhsTxtDate\").datepicker('getDate');\r\n setTimeout(function () {\r\n if (dateValue != null) {\r\n var actualDate = new Date(dateValue);\r\n jQuery(\"#RequestBrochureDate\").datepicker({\r\n minDate: new Date(currentYear, currentMonth, currentDate)\r\n }).datepicker(\"setDate\", actualDate);\r\n } else {\r\n jQuery(\"#RequestBrochureDate\").datepicker({\r\n minDate: new Date(currentYear, currentMonth, currentDate)\r\n });\r\n }\r\n jQuery(\"#RequestBrochureDate\").attr(\"disabled\", \"disabled\");\r\n jQuery('.nhs_PickerIconModal').click(function () {\r\n jQuery('#RequestBrochureDate').datepicker(\"show\");\r\n initDatepickerGallery();\r\n });\r\n }, 1000);\r\n });\r\n });\r\n },\r\n\r\n /**\r\n * TrackShowRouteEvents: tracks the events for the show routes button.\r\n */\r\n TrackShowRouteEvents: function () {\r\n const routeInput = document.querySelector('[data-map-route-input]');\r\n const routeInputText = routeInput.value;\r\n\r\n const event = {\r\n eventType: 'GA4Event',\r\n eventName: 'driving_routes',\r\n params: {\r\n click_target: 'show route',\r\n event_type: 'TDV Events',\r\n search_value: routeInputText,\r\n currency: 'USD',\r\n value: 10\r\n }\r\n }\r\n\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: event }\r\n }));\r\n },\r\n\r\n SetUpdate: function () {\r\n var self = this;\r\n jQuery('#btnUpdate').click(function () {\r\n const inputWrapper = document.querySelector('[data-direction-wrapper-input]');\r\n if (self.parameters.isBasicCommunity) {\r\n self.parameters.logger.logMultiEvent('bcRoute', self.parameters.communityId, self.parameters.builderId, self.parameters.planId, self.parameters.specId);\r\n jQuery.googlepush('Basic Listing', 'Driving Route', self.parameters.communityId, 4, false);\r\n }\r\n\r\n var address = jQuery(\"#nhsTxtStreeAddress\").val();\r\n\r\n if (address) {\r\n jQuery('#nhsWrongAddress').hide();\r\n inputWrapper.classList.remove('nhs-c-input__wrapper--error');\r\n }\r\n if (self.location && address && address.trim() !== \"\") {\r\n var left = (screen.width - 840) / 2;\r\n var top = (screen.height - 600) / 2;\r\n jQuery('#nhsWrongAddress').hide();\r\n inputWrapper.classList.remove('nhs-c-input__wrapper--error');\r\n //self.parameters\r\n var url = self.parameters.drivingDirectionAction + '?communityId=' + self.parameters.communityId +\r\n \"&lat=\" + self.location.lat() + \"&lng=\" + self.location.lng() + '&check=false' + '&isBasicListing=' + self.parameters.isBasicListing + '&startingPoint=' + address;\r\n jQuery.SetDataLayerPair('siteDrivingRoute');\r\n self.TrackShowRouteEvents();\r\n window.open(url, '_blank', 'width=840,height=600,top=' + top + ',left=' + left + ',menubar=yes,status=no,location=no,toolbar=no,scrollbars=yes');\r\n } else {\r\n if (address && address.trim() !== \"\") {\r\n let eventForTdv = {\r\n builder: self.parameters.builderId,\r\n community: self.parameters.communityId.toString(),\r\n market: self.parameters.marketId,\r\n label: 'Drive_Route_Req',\r\n eventType: 'tdvEvent'\r\n };\r\n document.body.dispatchEvent && document.body.dispatchEvent(new CustomEvent(\"trackOnDemandEvent\", {\r\n detail: { data: eventForTdv }\r\n }));\r\n var geocoder = new google.maps.Geocoder();\r\n geocoder.geocode({ 'address': address }, function (results, status) {\r\n if (status == google.maps.GeocoderStatus.OK) {\r\n var url = self.parameters.drivingDirectionAction + '?communityId=' + self.parameters.communityId +\r\n \"&lat=\" + results[0].geometry.location.lat()\r\n + \"&lng=\" + results[0].geometry.location.lng() + '&check=false' + '&isBasicListing=' + self.parameters.isBasicListing + '&startingPoint=' + address;\r\n jQuery.SetDataLayerPair('siteDrivingRoute');\r\n self.TrackShowRouteEvents();\r\n window.open(url, '_blank', 'width=840,height=600,top=' + top + ',left=' + left + ',menubar=yes,status=no,location=no,toolbar=no,scrollbars=yes');\r\n } else {\r\n jQuery('#nhsWrongAddress').show();\r\n inputWrapper.classList.add('nhs-c-input__wrapper--error');\r\n }\r\n });\r\n } else {\r\n jQuery('#nhsWrongAddress').show();\r\n inputWrapper.classList.add('nhs-c-input__wrapper--error');\r\n }\r\n }\r\n });\r\n },\r\n\r\n RemoveGoogleInfo: function () {\r\n if (jQuery(\".gm-style > div > a\").attr(\"href\")) {\r\n var aux;\r\n var len = jQuery('.gm-style-cc').length;\r\n for (aux = 1; aux < len; aux += 1) {\r\n jQuery('.gm-style-cc').eq('-1').remove();\r\n }\r\n jQuery(\".gm-style > div > a\").removeAttr(\"href\").removeAttr(\"title\");\r\n }\r\n }\r\n };\r\n","(function 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 () {\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","(function availableLots(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Event ||\r\n Object.hasOwnProperty.call(window, \"ActiveXObject\")\r\n && !window.ActiveXObject) {\r\n return;\r\n }\r\n\r\n const queryLotSectionOpeners = '[data-open-lot-gallery]';\r\n const triggerButton = global.document.getElementById('nhs_map');\r\n\r\n const eventsConfiguration = {\r\n availableButton: {\r\n callbacks: [global.NewHomeSource.Event.clickElement.bind(null, triggerButton)],\r\n events: ['click', 'touchend'],\r\n elements: queryLotSectionOpeners,\r\n },\r\n };\r\n\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n}(window));","(function MapsAndDirections(global) {\r\n 'use strict';\r\n\r\n const directionsContainer = document.getElementById('nhs_DrivingDirections');\r\n const mapSection = document.getElementById('nhs_MapsAndDirections');\r\n const options = {\r\n rootMargin: '100px 0px'\r\n };\r\n\r\n /**\r\n * Initializes the CommuteCalculator module from the NewHomeSource global object.\r\n */\r\n function onCommuteCalculatorScriptLoad() {\r\n global.NewHomeSource.CommuteCalculator.init();\r\n }\r\n\r\n /**\r\n * Initializes a Google Maps autocomplete feature and loads a\r\n * commute calculator script if available.\r\n */\r\n function initDrivingDirections() {\r\n document.body.removeEventListener('googleScriptLoadedAcknowledgement', initDrivingDirections);\r\n const commuteCalculatorScript = document.querySelector('#CommuteCalculatorBundlejs');\r\n (() => new google.maps.places.Autocomplete(document.querySelector('#nhsTxtStreeAddress')))();\r\n\r\n if (commuteCalculatorScript) {\r\n global.NHS.loadJs(commuteCalculatorScript.value, 'nhs_CommuteCalculatorScript', onCommuteCalculatorScriptLoad);\r\n }\r\n }\r\n\r\n /**\r\n * loadGoogleMapsScript: Load GoogleMapsScript.\r\n */\r\n function loadScripts(entries, observer) {\r\n for (let i = 0; i < entries.length; i += 1) {\r\n const entry = entries[i];\r\n\r\n if (entry.intersectionRatio > 0 && entry.isIntersecting) {\r\n document.body.addEventListener('googleScriptLoadedAcknowledgement', initDrivingDirections);\r\n document.body.dispatchEvent(new CustomEvent('askForGoogleScript'));\r\n observer.unobserve(mapSection);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * trackDrivingDirectionEvent: tracks the click event for the driving direction button.\r\n * @param {string} drivingDirectionStatus the string with the status value that the driving direction button has.\r\n */\r\n function trackDrivingDirectionEvent(drivingDirectionStatus) {\r\n const googleAnalyticsEvent = {\r\n eventType: 'GA4Event',\r\n eventName: 'driving_directions',\r\n params: {\r\n click_target: drivingDirectionStatus,\r\n event_type: 'TDV Events',\r\n currency: 'USD',\r\n value: 4\r\n }\r\n };\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: googleAnalyticsEvent }\r\n }));\r\n }\r\n\r\n if (directionsContainer) {\r\n directionsContainer.addEventListener('click',\r\n function (event) {\r\n if (event.target.id === 'showDrivingDirections' || event.target.closest('#showDrivingDirections')) {\r\n const elementsToDisplay = document.querySelectorAll('#map_directions,#hideDrivingDirections');\r\n const drivingDirectionStatusForEvent = 'view driving directions';\r\n trackDrivingDirectionEvent(drivingDirectionStatusForEvent);\r\n\r\n for (let i = 0; i < elementsToDisplay.length; i++) {\r\n let element = elementsToDisplay[i];\r\n\r\n element.removeAttribute('hidden');\r\n }\r\n\r\n const showDirections = document.getElementById('showDrivingDirections');\r\n\r\n if (showDirections) {\r\n showDirections.setAttribute('hidden', '');\r\n }\r\n } else if (event.target.id === 'hideDrivingDirections' || event.target.closest('#hideDrivingDirections')) {\r\n const elementsToHide = document.querySelectorAll('#map_directions, #hideDrivingDirections');\r\n const drivingDirectionStatusForEvent = 'hide driving directions';\r\n trackDrivingDirectionEvent(drivingDirectionStatusForEvent);\r\n\r\n for (let i = 0; i < elementsToHide.length; i++) {\r\n const element = elementsToHide[i];\r\n element.setAttribute('hidden', '');\r\n }\r\n\r\n const showDirections = document.getElementById('showDrivingDirections');\r\n\r\n if (showDirections) {\r\n showDirections.removeAttribute('hidden');\r\n }\r\n }\r\n });\r\n }\r\n\r\n const observer = new IntersectionObserver(loadScripts, options);\r\n\r\n if (mapSection) {\r\n observer.observe(mapSection);\r\n }\r\n\r\n /**\r\n * Switches the title for the address section\r\n * @param {Event} event\r\n */\r\n function switchTitle(event) {\r\n let target = event.target;\r\n let title = target.dataset.title;\r\n\r\n let titleContainer = document.querySelector('[data-location-title]');\r\n\r\n if (titleContainer && title) {\r\n titleContainer.textContent = title;\r\n }\r\n }\r\n\r\n /**\r\n * A generic function that can be used to switch between\r\n * multiple elements, using a data-type attribute\r\n * @param {Array} elements\r\n * @param {String} attribute\r\n */\r\n function switchElements(elements, attribute) {\r\n elements.forEach(function (element) {\r\n if (element.dataset.type === attribute) {\r\n element.removeAttribute('hidden');\r\n } else {\r\n element.setAttribute('hidden', '');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Used to recalculate all routes\r\n */\r\n function recalculateRoutes() {\r\n if (global.NewHomeSource && global.NewHomeSource.CommuteCalculator) {\r\n global.NewHomeSource.CommuteCalculator.recalculateRoutes();\r\n }\r\n }\r\n\r\n /**\r\n * Switches the active tab\r\n * @param {Event} event\r\n */\r\n function switchActive(event) {\r\n const currentActive = document.querySelector('[data-map-label][data-active]');\r\n currentActive.classList.remove('nhs-c-button--tap-light-active');\r\n currentActive.removeAttribute('data-active');\r\n\r\n const newActive = event.target;\r\n newActive.classList.add('nhs-c-button--tap-light-active');\r\n newActive.setAttribute('data-active', '');\r\n }\r\n\r\n /**\r\n * Switches the address, in the address section\r\n * @param {Event} event\r\n */\r\n function switchAddress(event) {\r\n let address = event.target.dataset.type;\r\n let directions = document.querySelectorAll('[data-map-address]');\r\n switchElements(directions, address);\r\n }\r\n\r\n /**\r\n * Switches the whole content section in the maps and directions section\r\n * @param {Event} event\r\n */\r\n function switchContent(event) {\r\n let showMap = event.target.dataset.displayMap === 'true';\r\n let container = document.querySelector('#nhs_PropertyMap');\r\n\r\n if (!showMap) {\r\n container.setAttribute('hidden', '');\r\n } else {\r\n container.removeAttribute('hidden');\r\n }\r\n }\r\n\r\n /**\r\n * Switches between the community and sales office static maps\r\n * @param {any} event\r\n */\r\n function switchStaticMap(event) {\r\n let type = event.target.dataset.type;\r\n let maps = document.querySelectorAll('[data-static-map]');\r\n\r\n switchElements(maps, type);\r\n }\r\n\r\n const salesOfficeTabExists = !!document.querySelector('button[data-type=\"sales-office\"]');\r\n\r\n const builderMapButton = document.querySelector('#builderMap');\r\n const builderMap = document.querySelector('[data-map=\"builder\"]');\r\n\r\n const labels = document.querySelectorAll('#nhs_MapTabs [data-map-label]');\r\n\r\n labels.forEach(function (label) {\r\n label.addEventListener('click', function (event) {\r\n switchActive(event);\r\n switchContent(event);\r\n recalculateRoutes();\r\n\r\n if (salesOfficeTabExists) {\r\n switchTitle(event);\r\n switchAddress(event);\r\n switchStaticMap(event);\r\n }\r\n\r\n if (builderMapButton) {\r\n if (event.target === builderMapButton) {\r\n builderMap.removeAttribute('hidden');\r\n }\r\n else {\r\n builderMap.setAttribute('hidden', '');\r\n }\r\n }\r\n });\r\n });\r\n}(window));\r\n","NHS.Scripts.CommunityResults.MapPopup = function (parameters) {\r\n this.parameters = parameters;\r\n};\r\n\r\nNHS.Scripts.CommunityResults.MapPopup.prototype = {\r\n init: function () {\r\n var self = this;\r\n var mapOptions = this.parameters.OptionsForMap;\r\n var googleApi = new NHS.Scripts.GoogleMapApi(mapOptions);\r\n\r\n googleApi.getIconMarkerPoint = function (results, result) {\r\n return self.parameters.icon;\r\n };\r\n\r\n googleApi.createMap();\r\n googleApi.options.Events.OnMarkersCreate = function (info, infowindow, marker) {\r\n infowindow.setContent(self.GetHtmlPoints(info));\r\n infowindow.open(googleApi.map, marker);\r\n };\r\n\r\n var point = [{\r\n Latitude: self.parameters.latitude,\r\n Longitude: self.parameters.longitude,\r\n Name: self.parameters.communityName,\r\n PriceRange: self.parameters.priceRange\r\n }];\r\n\r\n googleApi.options.Events.MarkerClickCallBack = function (info, infowindow, infowindowTooltip, marker) {\r\n infowindow.setContent(self.GetHtmlPoints(info));\r\n infowindow.open(googleApi.map, marker);\r\n };\r\n\r\n google.maps.event.addListener(googleApi.map, 'idle', self.RemoveGoogleInfo);\r\n googleApi.processResult(point);\r\n },\r\n\r\n GetHtmlPoints: function (info) {\r\n var html = \"\";\r\n return html;\r\n },\r\n\r\n RemoveGoogleInfo: function () {\r\n if (jQuery(\".gm-style > div > a\").attr(\"href\")) {\r\n var aux;\r\n var len = jQuery('.gm-style-cc').length;\r\n for (aux = 1; aux < len; aux += 1) {\r\n jQuery('.gm-style-cc').eq('-1').remove();\r\n }\r\n jQuery(\".gm-style > div > a\").removeAttr(\"href\").removeAttr(\"title\");\r\n }\r\n }\r\n};","(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 });","// The purpose of this module is to handle the builder filters in the\r\n// Homes and Plans section for MPC\r\n\r\n(function builderFiltersHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousModule = global.NewHomeSource.BuilderFiltersHandler;\r\n\r\n const homesContainer = document.querySelector('[data-homes-container]');\r\n\r\n /**\r\n * @constructs NewHomeSource.MpcEventsHelper\r\n */\r\n function BuilderFiltersHandler() {\r\n }\r\n\r\n /**\r\n * Converts a nodeList to array type in order to use\r\n * array.prototype.forEach instead of nodeList.prototype.foreach\r\n * @param {nodeList} nodeList A nodeList\r\n * @returns {array} The nodeList converted to array\r\n */\r\n function nodeListToArray(nodeList) {\r\n return Array.prototype.slice.call(nodeList);\r\n }\r\n\r\n /**\r\n * Gets a list of the builder ids selected as filters.\r\n * If no filters was selected, returns all builder ids, since we want to display all results in that case.\r\n */\r\n function getSelectedBuilderFilterIds() {\r\n let selectedBuilderIds = [];\r\n const builderFilters = document.querySelectorAll('[data-builder-filter]');\r\n\r\n if (builderFilters) {\r\n const selectedBuilders = document.querySelectorAll('[data-builder-filter]:checked');\r\n let filterElements;\r\n\r\n if (selectedBuilders.length === 0) {\r\n filterElements = builderFilters;\r\n } else {\r\n filterElements = selectedBuilders;\r\n }\r\n\r\n for (let i = 0; i < filterElements.length; i += 1) {\r\n selectedBuilderIds.push(filterElements[i].getAttribute('data-builder-id'));\r\n }\r\n }\r\n\r\n return selectedBuilderIds;\r\n }\r\n\r\n /**\r\n * Display or hides the home cards depending if the filter active or not.\r\n * @param {any} event\r\n */\r\n function filterHomesByBuilder() {\r\n const selectedBuilderFilterIds = getSelectedBuilderFilterIds();\r\n let allHomeCards = document.querySelectorAll('[data-home-section-item]');\r\n allHomeCards = nodeListToArray(allHomeCards);\r\n\r\n allHomeCards.forEach(function (element) {\r\n if (selectedBuilderFilterIds.indexOf(element.getAttribute('data-builder-id')) > -1) {\r\n element.style.display = 'block';\r\n } else {\r\n element.style.display = 'none';\r\n }\r\n });\r\n }\r\n \r\n /**\r\n * Updates the counters in the tabs after applying a builder filter.\r\n */\r\n function updateFilterTabs() {\r\n let tabFilterContainers = document.querySelectorAll('[data-tab-filter]');\r\n tabFilterContainers = nodeListToArray(tabFilterContainers);\r\n\r\n tabFilterContainers.forEach(function (element) {\r\n const customFilterValue = element.getAttribute('data-custom-filter-type');\r\n const homeStatusFilter = element.getAttribute('data-home-status-type');\r\n const tabLabel = element.querySelector('label');\r\n const tabInput = element.querySelector('input');\r\n let homesByTypeCount = '';\r\n\r\n if (customFilterValue === 'all') {\r\n homesByTypeCount = document.querySelectorAll('[data-home-section-item][style=\"display: block;\"]').length;\r\n }\r\n else if (customFilterValue === 'luxury') {\r\n homesByTypeCount = homesContainer.querySelectorAll('[data-luxury=\"1\"][style=\"display: block;\"]').length;\r\n }\r\n else if (customFilterValue === 'matching-home') {\r\n homesByTypeCount = homesContainer.querySelectorAll('[data-is-matching-home=\"true\"][style=\"display: block;\"]').length;\r\n }\r\n else if (homeStatusFilter) {\r\n homesByTypeCount = homesContainer.querySelectorAll('[data-home-status-type=\"' + homeStatusFilter + '\"][style=\"display: block;\"]').length;\r\n }\r\n tabInput.setAttribute(\"data-cards\", homesByTypeCount);\r\n let counterText = element.getAttribute('data-tab-title') + ' (' + homesByTypeCount + ')';\r\n tabLabel.textContent = counterText;\r\n });\r\n }\r\n\r\n /**\r\n * Hides all home cards\r\n */\r\n function hideAllHomeCards(event) {\r\n let cardsToDisable = document.querySelectorAll('[data-home-section-item]');\r\n cardsToDisable = nodeListToArray(cardsToDisable);\r\n\r\n cardsToDisable.forEach(function (element) {\r\n element.style.display = 'none';\r\n });\r\n }\r\n\r\n function filterByCurrentTab() {\r\n const selectedTab = document.querySelector('[data-tab-filter] input:checked');\r\n selectedTab.click();\r\n }\r\n\r\n /**\r\n * @public\r\n * \r\n */\r\n BuilderFiltersHandler.setBuilderFiltersEvents = function () {\r\n const builderFilterElements = document.querySelectorAll('[data-builder-filter]');\r\n\r\n for (let i = 0; i < builderFilterElements.length; ++i) {\r\n const builderFilter = builderFilterElements[i];\r\n builderFilter.addEventListener('change', function (event) {\r\n hideAllHomeCards();\r\n filterHomesByBuilder(event);\r\n updateFilterTabs();\r\n filterByCurrentTab();\r\n });\r\n }\r\n };\r\n\r\n BuilderFiltersHandler.init = function() {\r\n BuilderFiltersHandler.setBuilderFiltersEvents();\r\n }\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n BuilderFiltersHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.BuilderFiltersHandler = previousModule;\r\n return BuilderFiltersHandler;\r\n };\r\n\r\n global.NewHomeSource.BuilderFiltersHandler = BuilderFiltersHandler;\r\n\r\n BuilderFiltersHandler.init();\r\n\r\n return BuilderFiltersHandler;\r\n}(window));\r\n","(function (global, factory) {\r\n 'use strict';\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n // If AMD is supported and the global object (window) in case any JS module is expecting\r\n // the SectionLazyLoad to exists on the window object.\r\n define([], () => {\r\n global.SectionLazyLoad = factory(global);\r\n });\r\n } else if (typeof exports === 'object') {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code\r\n // is expected to work with this SectionLazyLoad Module.\r\n global.SectionLazyLoad = factory(global);\r\n module.exports = global.SectionLazyLoad;\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.SectionLazyLoad = factory(global);\r\n }\r\n}(typeof window !== 'undefined' ? window : {}, (root) => {\r\n 'use strict';\r\n\r\n // Lazy Loading\r\n function lazyLoadSection(entry) {\r\n if (entry.getAttribute('data-url')) {\r\n const url = root.location.protocol + '//' + root.location.hostname + entry.getAttribute('data-url');\r\n\r\n fetch(url).then((response) => {\r\n response.text().then((data) => {\r\n // Now the dispatched event contains the raw data that the url returns\r\n const event = new CustomEvent('sectionLazyLoaded', {\r\n detail: {\r\n data,\r\n }\r\n });\r\n\r\n // Add the data-prevent-lazy-load-section-default-behavior=\"true\" attribute to prevent the script.\r\n // from appending the data to the DOM this should only be used if you don't need the response.\r\n // added to the target element.\r\n if (!entry.dataset.preventLazyLoadSectionDefaultBehavior) {\r\n const responseFragment = document.createRange().createContextualFragment(data);\r\n entry.appendChild(responseFragment);\r\n }\r\n\r\n entry.dispatchEvent(event);\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Callback function used with the intersection observer.\r\n * @param {*} entries\r\n * @param {*} observer\r\n */\r\n function callback(entries, observer) {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\r\n lazyLoadSection(entry.target);\r\n observer.unobserve(entry.target);\r\n }\r\n });\r\n }\r\n\r\n const options = {\r\n root: null,\r\n rootMargin: '100px 0px'\r\n };\r\n\r\n const rootMarginObserver = new IntersectionObserver(callback, options);\r\n\r\n /**\r\n * Function used to get all the lazyloaded sections on initial load\r\n */\r\n function initLazyLoad() {\r\n const lazyLoadSections = document.querySelectorAll(\"[data-component='lazyLoad']\");\r\n\r\n // lazy load the sections\r\n for (let i = 0; i < lazyLoadSections.length; i += 1) {\r\n rootMarginObserver.observe(lazyLoadSections[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Used to observe a dynamically created element that doesn't exist\r\n * on initial load (or re-observe an already unobserved element)\r\n * @param {Element} target the element that will be observed\r\n */\r\n function observe(target) {\r\n rootMarginObserver.observe(target);\r\n }\r\n\r\n initLazyLoad();\r\n\r\n return {\r\n observe\r\n };\r\n}));\r\n","/*\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 * This multiplatform component can be used to open modal windows that contain an iframe.\r\n */\r\n(function iframeModalOpener(global) {\r\n 'use strict';\r\n\r\n function openModal(event) {\r\n const target = event.target.closest('[data-dialog-opener]') || event.target.querySelector('[data-dialog-opener]');\r\n const id = target.dataset.dialogOpener;\r\n const modal = document.getElementById(id);\r\n\r\n if (modal) {\r\n // if the polyfill exists, we need to register the dialog element.\r\n if (global.dialogPolyfill) {\r\n global.dialogPolyfill.registerDialog(modal);\r\n }\r\n\r\n modal.showModal();\r\n const iframe = modal.querySelector('iframe');\r\n\r\n if (!iframe.src) {\r\n iframe.src = iframe.dataset.src;\r\n iframe.removeAttribute('data-src');\r\n }\r\n\r\n // event listener to close the modal.\r\n // event closeIspModal is added in order to close the Interactive Site Plan modal\r\n // when the user clicks the Request a Tour button to show the form for Available Lots. Ticket BDXNHS-8316.\r\n modal.addEventListener('click', (e) => {\r\n if (e.target === modal || e.target.dataset.closeModalForm !== undefined) {\r\n modal.close();\r\n }\r\n });\r\n }\r\n }\r\n\r\n function handleModalInteraction(event) {\r\n // Check if native support for the dialog element\r\n if (typeof HTMLDialogElement === 'function') {\r\n openModal(event);\r\n\r\n // if not, check if require support.\r\n } else if (typeof define === 'function' && define.amd) {\r\n require(['dialogPolyfill'], (polyfill) => {\r\n // store the polyfill in the window.\r\n global.dialogPolyfill = polyfill;\r\n openModal(event);\r\n });\r\n\r\n // if not, load via the loadJs script\r\n } else {\r\n const url = document.querySelector('#dialogPolyfillBundle');\r\n if (url) {\r\n global.NHS.loadJs(url.value, 'dialogPolyfill', () => {\r\n openModal(event);\r\n });\r\n }\r\n }\r\n }\r\n\r\n const openers = document.querySelectorAll('[data-dialog-opener]');\r\n\r\n openers.forEach((opener) => {\r\n const container = opener.closest('[data-interactive-siteplan-container]');\r\n container.addEventListener('click', handleModalInteraction);\r\n });\r\n}(window));\r\n","/**\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"]}