{"version":3,"sources":["pwa/component/markerClusterer.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseState.js","../../Default/js/modules/eventBus.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseObserver.js","libs/domHelper.js","libs/ajaxHelper.js","pwa/component/saveToFavorites.js","nhs/components/Favorites.js","modules/analyticsHelper.js","modules/performanceEventsQueue.js","common/eventLogger.js","nhs/views/BuilderShowcaseRedesign/Sections/favoritesInit.js","libs/fastdom.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseHelper.js","modules/Map/MapObserver.js","modules/Map/BaseMap.js","pwa/component/buildershowcaseredesign/BuilderShowcaseMapHandler.js","modules/Map/MapHelper.js","modules/Map/MapParams.js","modules/Map/InteractionHandler.js","modules/Map/PinHandler.js","../../default/js/modules/arrowHandler.js","modules/Map/ClusterHandler.js","asyncLoader.js","googlemaps.js","modules/Map/CardHandler.js","modules/Map/trackSearchMapEvents.js","pwa/component/buildershowcaseredesign/mapLocationsBuilderShowcase.js","pwa/component/builderShowcaseRedesign/mapLocationsBuilderShowCaseDesktopLoader.js"],"names":["MarkerClusterer","map","opt_markers","opt_options","this","extend","google","maps","OverlayView","map_","markers_","clusters_","sizes","styles_","ready_","options","gridSize_","minClusterSize_","maxZoom_","imagePath_","MARKER_CLUSTER_IMAGE_PATH_","cssName_","MARKER_CLUSTER_CSS_Name_","imageExtension_","MARKER_CLUSTER_IMAGE_EXTENSION_","zoomOnClick_","undefined","averageCenter_","setupStyles_","setMap","prevZoom_","getZoom","zoomDif_","zoomChanged","that","event","addListener","isFromClusterClick","isEventFromClusterClick","zoom","minZoom","maxZoom","Math","min","mapTypes","getMapTypeId","max","setZoom","isNewZoomEqualToPrevZoomDif","zoomDif","resetViewport","repaint","idleListener","removeListener","redraw","length","Object","keys","addMarkers","Cluster","markerClusterer","markerClusterer_","getMap","getGridSize","getMinClusterSize","isAverageCenter","center_","bounds_","initOptions","afterRenderCallback","clusterIcon_","ClusterIcon","getStyles","cluster","styles","opt_padding","getMarkerClusterer","padding_","cluster_","div_","sums_","visible_","define","pageData","JSON","parse","document","querySelector","innerHTML","partnerElement","builderShowcaseData","searchParameters","Adult","AgeRestricted","Bathrooms","Bedrooms","BrandId","Brands","CommName","CommunityStatus","ComingSoon","Custom","CustomResults","ExcludeBrandsFromResults","ExcludeRegularComms","Gated","GolfCourse","Green","Qmi","HomeStatus","HotDeals","IncludeMpc","LuxuryHomes","Mfr","MultiFamily","NatureAreas","NoBoyl","NumStory","OriginLat","OriginLng","PartnerId","Parks","Pool","PriceHigh","PriceLow","SchoolDistrictIds","SingleFamily","Sports","SqFtHigh","SqFtLow","SrpType","Views","Waterfront","Garages","LivingAreas","Stories","MasterBedLocation","CommId","HasRVGarage","MarketId","State","MarketName","WebApiSearchType","data","locations","LocationsSection","parterId","value","Latitude","Longitude","Zoom","ZoomLevelToUse","PreSelectedMarket","Id","Name","StateAbbr","getState","assign","getParameters","setSearchParamsAttributes","object","objectEntries","entries","i","setData","global","NewHomeSource","previousEventBus","EventBus","observers","prototype","addObserver","topic","observer","Array","isArray","push","notifyObservers","totalCallbacks","fn","update","removeObserver","index","indexOf","splice","noConflict","window","builderShowcaseState","eventBus","temporalState","onResize","commit","addEventListener","beforeMapResultsLoaded","afterMapResultsLoaded","OnSortByChanged","OnStarFilterChanged","OnPageSizeChanged","PaginationChanged","onReviewsSectionLoaded","galleryOpened","imageSelected","modalImageSelected","navigateToImage","navigateToModalImage","subscribe","setParameter","key","hasOwnProperty","call","setParameters","getParameter","state","getOriginalLatitude","parseFloat","getOriginalLongitude","getZoomLevel","onGalleryClosed","getPassiveOptions","passive","opts","attachEvent","eventName","callback","detachEvent","removeEventListener","Element","removeEventFromElement","addEventToElement","Document","hasParent","id","parentNode","body","hasClass","className","classList","contains","CustomEvent","onClassListChange","Event","bubbles","addClass","add","dispatchEvent","removeClass","remove","insertAfter","nodeToInsert","insertBefore","nextSibling","hide","style","display","show","isVisible","getComputedStyle","visibility","NodeList","forEach","DOMTokenList","TypeError","defineProperty","enumerable","configurable","writable","Node","replaceWith","currentElement","parent","arguments","removeChild","currentNode","createTextNode","replaceChild","factory","amd","AjaxHelper","exports","module","root","requestsQueue","getElementsByClassName","siteRoot","getElementById","browserAcceptTypes","partnerUrl","href","replace","location","protocol","executeCallbacks","req","succeded","always","success","failed","queueIndex","HTMLFieldSetElement","serialize","field","l","notSerializableTypes","s","nodeName","len","elements","name","disabled","includes","type","j","selected","encodeURIComponent","checked","join","objectToQueryString","objectToConvert","baseQueryString","keyValuePair","substring","getAcceptTypes","localStorage","getItem","getRequest","url","contentType","parametersToSend","optionalCallbacks","xhr","XMLHttpRequest","open","onreadystatechange","readyState","succededStatus","status","responseText","setRequestHeader","send","err","postRequest","abort","async","requestHeaders","noJsonStringify","stringify","request","Error","requestToAbort","find","r","requestForQueue","toUpperCase","response","e","getAbsolutePathRequest","siteUrl","slice","convertToQueryString","require","domHelper","routes","ajaxHelper","loadCss","modalCss","pendingItemsFromMail","cookie","match","RegExp","mailFavorites","isSignedIn","signInElement","hasAttribute","logSegmentEvent","segmentEvent","commonProperties","eventForSegment","eventType","home_id","spec_id","community_id","dataset","button_action","detail","removeFromCookie","items","itemIndex","item","host","toString","showLogInForSaveToFavorites","element","handlerAuth0","[object Object]","performSave","category","init","temporalSaveToFavorites","pendingItems","temporalSavedItems","isLoggedIn","updateStylesToUnsaved","updateStylesToSaved","saveToFavoritesElement","parsedData","sharedKey","firstElementChild","children","getAttribute","nextSharedKey","saveToFavsElements","querySelectorAll","setAttribute","twinElement","elementIndex","nextTwinElement","nextElementIndex","nextElement","ffpResult","title","favIcon","createRange","createContextualFragment","firstChild","self","currentItem","parentElement","savedIconElement","unsavedIconElement","removeAttribute","link","saveToFavoritesMobile","Type","FavoriteUrl","Title","isHtmlElement","HTMLElement","Saved","performDelete","elementId","dataToSend","parseInt","deleteFromFavoritesMobile","deleteFromFavorites","is_SignedIn","favoriteid","Number","favid","apply","saveToFavorites","properties","eventForTdv","logTdvEvent","community","market","Modules","tagManager","getFromDataLayer","label","saveToFavoritesHandler","elm","target","srcElement","tagName","elem","tryGetClosestButton","favoritesButton","updateSavesWhenLoggedIn","saveFavoritesList","saveFavoritesIds","counter","isFfplus","_saveFavoritesList","from","split","cookieFavorites","favoriteString","favoriteObject","saveElements","elementToLog","checkSaveToFavoritesMobile","listingIds","ListOfIds","_id","counterElement","ListOfSaved","updateSavesWhenLoggedOut","topSaveElement","showTemporalSaveToolTip","handleEmailFavorites","isUserSignedIn","ajax","res","Favorites","params","instance","saveToFavs","favUnsaveHandler","preventDefault","stopPropagation","favUnsave","favSavedHandler","urlBase","favSaved","mouseDownHandler","favLogin","dataLayer","adaptiveTemplate","search","toLowerCase","click","urlparts","shift","queryString","prefix","pars","lastIndexOf","history","replaceState","onResLoaded","result","_res","saveButtons","button","favUnSaved","previousElementSibling","logInfo","marketId","partnerId","planId","specificationId","communityId","logEvents","log","logger","googlepush","logEventWithParameters","homeLogInfo","specId","SetDataLayerPair","analyticsHelper","CONFIGURATION","constants","nhsTrackingId","get","getGoogleAnalyticsValues","trackers","ga","getAll","filter","values","addAnalyticsUrlParameters","urlToWork","analyticsValues","gaClientId","clientId","gaUserId","userId","performanceEventsQueue","eventsQueue","onload","urlWithGaValues","pop","indexOfQueryString","enqueueEvent","callAddThis","commIdHd","builderIdHd","_communityId","_builderId","_planId","_specId","_homeSearchViewMetricDisplayed","_homeSearchViewMetricHidden","fromPage","performanceLogUrl","performanceLog","eventLoggerUrl","isGaLoaded","handleLogEvent","isGaReady","isAsync","redirect","newWin","cancelBubble","navigator","userAgent","referLink","createElement","appendChild","setTimeout","logViewWithParameters","eventCode","parameters","builderId","commId","parentCommunityId","parentCommId","communityList","basicListingId","refer","totalHomes","builderCommunityList","basicListingList","homeList","logGoogleEcommerceEvent","logView","cid","bid","bsId","hdPage","logMetrics","logString","logsInChains","builderName","communitiesIdsList","homesIdsList","eval","EventLogger","createCookie","days","expires","date","Date","setTime","getTime","toGMTString","readCookie","nameEQ","ca","c","charAt","logListHubEvent","listHubProviderId","testkey","desckey","listingKey","ListHubTracker","provider","test","submit","logAndRedirect","pid","sid","mid","external","logEvent","logBasicListingAndRedirect","bsid","basiclistingId","logWithParametersAndRedirect","logBasicListingEvent","_timeOut","setAllowAddThis","logMultiEvent","logHomeResultsMetrics","flag","attachEventsToAddThis","addthis","evt","serviceShared","service","getLogInfo","commDetail","_parameters","homeDetail","optValue","finalUrl","tmpData","finalData","ex","events","action","eventCategory","eventAction","eventLabel","eventValue","win","raf","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","cb","FastDom","reads","writes","bind","scheduleFlush","fastdom","scheduled","flush","error","runTasks","catch","array","constructor","tasks","task","measure","ctx","mutate","clear","props","child","create","source","mixin","initialize","builderShowcaseObserver","setUpTextValueInDomElement","domObjects","text","innerText","degreeToRadius","degree","PI","changeStyleWithFastDom","performStyleChange","getImageType","address","setUpPlanDescription","info","container","PlanName","selectedItem","planName","planAmenties","Amenities","planNameElements","planAmmenitiesElements","builderLink","reviewsStars","reviewsScoreText","reviewsInformation","jsonResponse","BrandName","BuilderLink","hasBuilderReviews","ratingValue","averageRating","locationsContainer","locationsLink","planLibraryContainer","planLibraryStateTemplate","planLibraryMarketTemplate","planLibraryCommunityTemplate","IsManufactured","PlanLibraryHomes","stateListItem","content","cloneNode","StateName","Markets","marketListItem","Market","k","Communities","comm","communityListItem","anchorTag","Community","CommunityUrl","MetroAreasCount","LocationsLink","setBodyModalInformation","calculateHaversineFormula","latitude","longitude","destinationLatitude","destinationLongitude","distanceLatitude","distanceLongitude","a","sin","cos","atan2","sqrt","onMapUpdatedSuccess","html","config","configObject","infowindow","setContent","mapInstance","marker","setCursor","mapCardCtaHandler","setMapInstance","mapItem","cardsHtmlContainer","opacity","getCollectionItem","imageId","collectionCategory","getGalleryCollection","Items","x","applyActiveStyles","selectedThumbnail","activeThumbSelector","cleanActiveElements","getMapUrl","origin","Map","previousMapObserver","MapObserver","onMapCenterChanged","onMapCreated","onCircleResized","onCardLinkFollowed","onPinsCreated","onInfoWindowLoaded","onExternalFilterApplied","onCenterReset","onZoomChanged","afterMapCenterChanged","afterPinsCreated","onCardClosed","onClusterClicked","onPinClicked","previousBaseMap","BaseMap","mapInstanceConfiguration","zoomControl","disableDefaultUI","panControl","zoomControlStyle","gestureHandling","scrollwheel","disableDoubleClickZoom","mapConfiguration","featureType","stylers","setConfigurationObject","mapContainer","customEvents","addListenerOnce","shouldUpdateCards","eventFunction","func","onMapCreatedData","isMapCreated","previousBuilderShowcaseMapHandler","marketsDropDownList","builderShowcaseHelper","getProposedMarket","markets","zoomLevel","abs","shouldGuessMarket","proposedMarket","Lat","Lng","harversineValue","onSearchUpdated","mapCenter","center","lat","lng","newProposedMarket","stateProposedMarket","comesFromDragInteraction","triggerEvent","onClusterClick","srpCluster","BuilderShowcaseMapHandler","some","t","position","LatLng","setCenter","searchTypeHelper","previousMapHelper","languageResources","MapHelper","getLanguageByIndex","getResultsType","srpType","isAnyCommunitySearchType","isCustomRadiusResultsPage","MapParams","previousMapParams","commResultsHandler","IsMapVisible","comesFromExternalFilter","SortBy","previousInteractionHandler","maxRadiusLabel","mapOptions","furtherRadius","furtherRadiusElement","setMapZoom","zoomToApply","zoomOptions","setOptions","zoomLookUp","1","3","5","10","15","25","50","100","150","200","300","400","changeZoomBasedOnRadius","radius","changeMaxRadiusLabel","radiusFromParams","updateMapOptions","doDisable","forceDisable","pointerEvents","cursor","InteractionHandler","radiusToUse","setUpInitialZoom","coordinates","originLat","originLng","changeMapCenter","adjustZoom","iconsMapElement","IdleQueue","iconsMap","previousPinHandler","PinHandler","pinsOnMap","visitedPins","previousController","infoWindow","favorites","getPinsUrl","getPinUrl","lastHoveredPin","mapName","svgNonVisitedDictionary","nonVisitedPins","svgVisitedDictionary","alreadyVisitedPins","showLoading","loadingClone","prepend","hideLoading","getIconWithText","svg","getPinIcon","configPinObject","svgDictionary","resultType","srpTypeAttribute","unitsLabel","isBasicCard","basicHome","homeShort","home","basicComm","communityShort","setIcon","pin","icon","codedIcon","btoa","getAllowRegistrationFlag","allowRegistration","getSinglePin","referrerPin","pushVisitedPin","close","pageSize","comms","paramsObject","brands","Set","plans","specs","basicListings","isBasicListing","getParamsForMultipleListingsSearch","brandId","listingId","getDataForSingleListingSearch","singlePinXhr","acceptHeader","anchor","shouldFocus","getOpenPinCommunityGALabel","pinData","callForPriceLabel","getOpenPinHomeGALabel","trackOpenPinEvent","pinConfiguration","shouldTrackOpenPinGAEvent","gaEvent","selectedGALabelFunction","HomeResults","CommunityResults","getOpenPinGALabel","getCardId","geoTypeRequested","idToReturn","HomeInfo","IsSpec","IsBl","getDistinctIds","property","temporalArray","createObjectPin","mapData","getPosition","zindex","optimized","priceHigh","ceil","MarketPoints","PrHi","priceLow","PrLo","plan","spec","basic","IsBasic","Units","Label","units","mapValue","visited","svgDictionaryToUse","handlePins","defaultZIndex","drawPin","getPins","isFirstLoad","controller","AbortController","fetch","method","headers","Content-Type","signal","ok","json","Results","dataForSubscribers","commCount","Total","NoPlotted","homeCount","shouldCenterMap","pushTask","resutlToLazyLoad","pins","isSubjectChange","InfoWindow","results","CreatePin","zIndex","color","class","Marker","eventTrigger","ArrowHandler","arrowRight","arrowLeft","firstCollection","lastCollection","scrollElement","move","limitRight","limitLeft","arrowsReference","arrowReferenceSelector","collectionsReference","collectionsReferenceSelector","bindedCalculateMoveCallback","bindedCalculateMove","bindedOnChangeCallback","onChange","getLimits","observeVisibility","calculateMove","IntersectionObserver","entry","isIntersecting","showArrows","observe","floor","getBoundingClientRect","left","right","changeLimits","closest","moveArrow","scrollBy","scrolledCarousel","previousClusterHandler","clustersOnMap","clusters","firedOnMarkerClusterClick","clusterType","adjustClusterStyles","count","clusterName","svgToUse","getClusterSvg","backgroundImage","clusterResults","pinsToMakeClusterAround","clearMarkers","clusterToDelete","indexToRemove","removeClusters","clusterPin","SalesCenterId","basicId","isHomeCluster","MarkerClustererOptions","gridSize","cssName","imagePath","zoomOnClick","minimumClusterSize","createPinMethod","ClusterHandler","_uid","load","onLoad","isBuild","src","paramRegex","param","formatUrl","getElementsByTagName","googlemapsPlugin","parentRequire","opt_config","GoogleMapsLoader","googlemaps","require_","onload_","NOOP","baseUrl_","DEFAULT_BASE_URL","async_","params_","isGoogleMapsLoaded_","resolveWith_","getGlobalGoogleMaps_","loadGoogleMaps_","onAsyncLoad","resolveWithGoogleMaps_","onerror","getGoogleUrl_","serializeParams_","reject_","encodedParams","isObject","encodedParam","serializedValue","var_args","opt_error","obj1","obj2","onAdd","setReady_","draw","size","height","width","css","fitMapToMarkers","markers","getMarkers","bounds","LatLngBounds","fitBounds","setStyles","isZoomOnClick","getTotalMarkers","setMaxZoom","getMaxZoom","getClusterCount","sum","calculator_","numStyles","dv","setCalculator","calculator","getCalculator","opt_nodraw","pushMarkerTo_","isAdded","addMarker","removeMarker_","m","removeMarker","removed","removeMarkers","ready","createClusters_","setUpUniqueMarkers_","getTotalClusters","setGridSize","setMinClusterSize","getExtendedBounds","projection","getProjection","tr","getNorthEast","bl","getSouthWest","trPix","fromLatLngToDivPixel","y","blPix","ne","fromDivPixelToLatLng","sw","isMarkerInBounds_","opt_hide","oldClusters","distanceBetweenPoints_","p1","p2","getPositionPoints_","dLat","dLon","addToClosestCluster_","distance","clusterToAddTo","getCenter","d","isMarkerInClusterBounds","mapBounds","getBounds","uniqueCluster","getPin_","clusterIndex","isMarkerAlreadyAdded","calculateBounds_","updateIcon","getSize","mz","sums","setSums","triggerClusterClick","trigger","panTo","pos","getPosFromLatLng_","cssText","createCss","css_","getPanes","overlayMouseTarget","sumValue","latlng","width_","height_","top","onRemove","text_","index_","useStyle","url_","textColor_","anchor_","textSize_","backgroundPosition_","backgroundPosition","txtColor","txtSize","o","previousCardHandler","CardHandler","swipingObject","activeCarousels","setUpCarousel","carouselContainer","collectionSelector","arrowSelector","currentCarousel","disposeCarousel","carousel","dispose","onGalleryImageError","cardContainer","brokenImage","pictures","image","onErrorSrc","touchCancel","startX","curX","touchStartEvent","touches","pageX","fireScrollGalleryEvent","limits","firstCollectionLimits","lastCollectionLimits","ga4Event","click_target","touchEndEvent","touchMoveEvent","attachTouchEvents","attachOnGalleryImageErrorEvent","imagesArray","card","phoneElement","hiddenPhone","attachCallForDetailsEvent","linkToDetail","attachLinkToDetailEvent","homeCarousel","mobileGallery","attachCarouselHomeEvents","lazyLoad","desktopGalleryArrow","labels","eventsConfig","triggerOnDemand","TrackerSearchMapEvents","filter_name","search_value","favoritesMobile","favoritesDesktop","isMobileDevice","configuration","getMapResultsForBuilderShowcase","getMapCard","MinZoomLevel"],"mappings":"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","file":"../maplocationsbuildershowcasedesktoploader-30717c23ed.js","sourceRoot":"..","sourcesContent":["// ==ClosureCompiler==\r\n// @compilation_level ADVANCED_OPTIMIZATIONS\r\n// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/maps/google_maps_api_v3_3.js\r\n// ==/ClosureCompiler==\r\n\r\n/**\r\n* @name MarkerClusterer for Google Maps v3\r\n* @version version 1.0.1\r\n* @author Luke Mahe\r\n* @fileoverview\r\n* The library creates and manages per-zoom-level clusters for large amounts of\r\n* markers.\r\n*
\r\n* This is a v3 implementation of the\r\n* v2 MarkerClusterer.\r\n*/\r\n\r\n/**\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n* http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n*/\r\n\r\n\r\n/**\r\n* A Marker Clusterer that clusters markers.\r\n*\r\n* @param {google.maps.Map} map The Google map to attach to.\r\n* @param {Array.=} opt_markers Optional markers to add to\r\n* the cluster.\r\n* @param {Object=} opt_options support the following options:\r\n* 'gridSize': (number) The grid size of a cluster in pixels.\r\n* 'maxZoom': (number) The maximum zoom level that a marker can be part of a\r\n* cluster.\r\n* 'zoomOnClick': (boolean) Whether the default behaviour of clicking on a\r\n* cluster is to zoom into it.\r\n* 'averageCenter': (boolean) Wether the center of each cluster should be\r\n* the average of all markers in the cluster.\r\n* 'minimumClusterSize': (number) The minimum number of markers to be in a\r\n* cluster before the markers are hidden and a count\r\n* is shown.\r\n* 'styles': (object) An object that has style properties:\r\n* 'url': (string) The image url.\r\n* 'height': (number) The image height.\r\n* 'width': (number) The image width.\r\n* 'anchor': (Array) The anchor position of the label text.\r\n* 'textColor': (string) The text color.\r\n* 'textSize': (number) The text size.\r\n* 'backgroundPosition': (string) The position of the backgound x, y.\r\n* @constructor\r\n* @extends google.maps.OverlayView\r\n*/\r\nfunction MarkerClusterer(map, opt_markers, opt_options) {\r\n // MarkerClusterer implements google.maps.OverlayView interface. We use the\r\n // extend function to extend MarkerClusterer with google.maps.OverlayView\r\n // because it might not always be available when the code is defined so we\r\n // look for it at the last possible moment. If it doesn't exist now then\r\n // there is no point going ahead :)\r\n this.extend(MarkerClusterer, google.maps.OverlayView);\r\n this.map_ = map;\r\n\r\n /**\r\n * @type {Array.}\r\n * @private\r\n */\r\n this.markers_ = [];\r\n\r\n /**\r\n * @type {Array.}\r\n */\r\n this.clusters_ = [];\r\n\r\n this.sizes = [53, 56, 66, 78, 90];\r\n\r\n /**\r\n * @private\r\n */\r\n this.styles_ = [];\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.ready_ = false;\r\n\r\n this.options = opt_options || {};\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.gridSize_ = this.options['gridSize'] || 60;\r\n\r\n /**\r\n * @private\r\n */\r\n this.minClusterSize_ = this.options['minimumClusterSize'] || 2;\r\n\r\n\r\n /**\r\n * @type {?number}\r\n * @private\r\n */\r\n this.maxZoom_ = this.options['maxZoom'] || null;\r\n\r\n this.styles_ = this.options['styles'] || [];\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imagePath_ = this.options['imagePath'] || this.options['imagePath'] == \"\" ? this.options['imagePath'] : this.MARKER_CLUSTER_IMAGE_PATH_;\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.cssName_ = this.options['cssName'] ||\r\n this.MARKER_CLUSTER_CSS_Name_;\r\n\r\n /**\r\n * @type {string}\r\n * @private\r\n */\r\n this.imageExtension_ = this.options['imageExtension'] ||\r\n this.MARKER_CLUSTER_IMAGE_EXTENSION_;\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.zoomOnClick_ = true;\r\n\r\n if (this.options['zoomOnClick'] != undefined) {\r\n this.zoomOnClick_ = this.options['zoomOnClick'];\r\n }\r\n\r\n /**\r\n * @type {boolean}\r\n * @private\r\n */\r\n this.averageCenter_ = false;\r\n\r\n if (this.options['averageCenter'] != undefined) {\r\n this.averageCenter_ = this.options['averageCenter'];\r\n }\r\n\r\n this.setupStyles_();\r\n\r\n this.setMap(map);\r\n\r\n /**\r\n * @type {number}\r\n * @private\r\n */\r\n this.prevZoom_ = this.map_.getZoom();\r\n\r\n //Case 81403\r\n this.zoomDif_ = 0;\r\n this.zoomChanged = false;\r\n // Add the map event listeners\r\n var that = this;\r\n google.maps.event.addListener(this.map_, 'zoom_changed', function (event) {\r\n that.zoomChanged = true;\r\n var isFromClusterClick = false;\r\n\r\n if (that.map_.isEventFromClusterClick !== undefined && that.map_.isEventFromClusterClick !== null) {\r\n isFromClusterClick = that.map_.isEventFromClusterClick;\r\n }\r\n\r\n // Just modify the zoom behavior when the click comes from a cluster\r\n if (isFromClusterClick) {\r\n // Determines map type and prevent illegal zoom levels\r\n var zoom = that.map_.getZoom();\r\n var minZoom = that.map_.minZoom || 0;\r\n var maxZoom = Math.min(that.map_.maxZoom || 100,\r\n that.map_.mapTypes[that.map_.getMapTypeId()].maxZoom);\r\n zoom = Math.min(Math.max(zoom, minZoom), maxZoom);\r\n\r\n if (that.prevZoom_ != zoom) {\r\n //Var for not save the zoom when was applied the previous zoom, keep that.prevZoom_ consistent with the zoom applied.\r\n var setZoom = true;\r\n if (that.prevZoom_ < zoom) { //When is zoom-in event, save the zoom difference to check it later.\r\n that.zoomDif_ = zoom - that.prevZoom_;\r\n } else { //When is zoom-out event, check the zoom difference.\r\n const isNewZoomEqualToPrevZoomDif = (that.prevZoom_ - that.zoomDif_) === zoom;\r\n if (that.zoomDif_ > 1 && isNewZoomEqualToPrevZoomDif) { //If previous difference was greater than 1, apply same previous zoom difference value\r\n var zoomDif = that.zoomDif_; //to revert the zoom-in applied by the cluster click.\r\n that.zoomDif_ = 0;\r\n that.map.setZoom(that.prevZoom_ - zoomDif);\r\n setZoom = false; //Don't save zoom after previuos zoom was applied. This is for not give an incorrect value to prevZoom_.\r\n }\r\n }\r\n if (setZoom) {\r\n that.prevZoom_ = zoom;\r\n }\r\n that.resetViewport();\r\n }\r\n } else {\r\n that.map_.isEventFromClusterClick = false;\r\n }\r\n if (!isFromClusterClick) {\r\n var idleListener = this.addListener('idle', function () {\r\n google.maps.event.removeListener(idleListener);\r\n that.repaint();\r\n });\r\n } else {\r\n that.repaint();\r\n }\r\n \r\n });\r\n\r\n google.maps.event.addListener(this.map_, 'idle', function () {\r\n if (that.zoomChanged)\r\n that.repaint();\r\n else\r\n that.redraw();\r\n that.zoomChanged = false;\r\n });\r\n\r\n // Finally, add the markers\r\n if (opt_markers && (opt_markers.length || Object.keys(opt_markers).length)) {\r\n this.addMarkers(opt_markers, false);\r\n }\r\n}\r\n\r\n\r\n/**\r\n* The marker cluster image path.\r\n*\r\n* @type {string}\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_PATH_ =\r\n 'http://google-maps-utility-library-v3.googlecode.com/svn/trunk/markerclusterer/' +\r\n 'images/m';\r\n\r\n\r\nMarkerClusterer.prototype.MARKER_CLUSTER_CSS_Name_ = \"\";\r\n\r\n/**\r\n* The marker cluster image path.\r\n*\r\n* @type {string}\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.MARKER_CLUSTER_IMAGE_EXTENSION_ = 'png';\r\n\r\n\r\n/**\r\n* Extends a objects prototype by anothers.\r\n*\r\n* @param {Object} obj1 The object to be extended.\r\n* @param {Object} obj2 The object to extend with.\r\n* @return {Object} The new extended object.\r\n* @ignore\r\n*/\r\nMarkerClusterer.prototype.extend = function (obj1, obj2) {\r\n return (function (object) {\r\n for (var property in object.prototype) {\r\n this.prototype[property] = object.prototype[property];\r\n }\r\n return this;\r\n }).apply(obj1, [obj2]);\r\n};\r\n\r\n\r\n/**\r\n* Implementaion of the interface method.\r\n* @ignore\r\n*/\r\nMarkerClusterer.prototype.onAdd = function () {\r\n this.setReady_(true);\r\n};\r\n\r\n/**\r\n* Implementaion of the interface method.\r\n* @ignore\r\n*/\r\nMarkerClusterer.prototype.draw = function () { };\r\n\r\n/**\r\n* Sets up the styles object.\r\n*\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.setupStyles_ = function () {\r\n if (this.styles_.length) {\r\n return;\r\n }\r\n\r\n for (var i = 0, size; size = this.sizes[i]; i++) {\r\n var data = {\r\n url: \"\",\r\n height: size,\r\n width: size,\r\n css: \"\"\r\n };\r\n if (this.imagePath_)\r\n data.url = this.imagePath_ + (i + 1) + '.' + this.imageExtension_;\r\n\r\n if (this.cssName_)\r\n data.css = this.cssName_ + (i + 1);\r\n\r\n this.styles_.push(data);\r\n }\r\n};\r\n\r\n/**\r\n* Fit the map to the bounds of the markers in the clusterer.\r\n*/\r\nMarkerClusterer.prototype.fitMapToMarkers = function () {\r\n var markers = this.getMarkers();\r\n var bounds = new google.maps.LatLngBounds();\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n bounds.extend(marker.getPosition());\r\n }\r\n\r\n this.map_.fitBounds(bounds);\r\n this.repaint();\r\n};\r\n\r\n\r\n/**\r\n* Sets the styles.\r\n*\r\n* @param {Object} styles The style to set.\r\n*/\r\nMarkerClusterer.prototype.setStyles = function (styles) {\r\n this.styles_ = styles;\r\n};\r\n\r\n\r\n/**\r\n* Gets the styles.\r\n*\r\n* @return {Object} The styles object.\r\n*/\r\nMarkerClusterer.prototype.getStyles = function () {\r\n return this.styles_;\r\n};\r\n\r\n\r\n/**\r\n* Whether zoom on click is set.\r\n*\r\n* @return {boolean} True if zoomOnClick_ is set.\r\n*/\r\nMarkerClusterer.prototype.isZoomOnClick = function () {\r\n return this.zoomOnClick_;\r\n};\r\n\r\n/**\r\n* Whether average center is set.\r\n*\r\n* @return {boolean} True if averageCenter_ is set.\r\n*/\r\nMarkerClusterer.prototype.isAverageCenter = function () {\r\n return this.averageCenter_;\r\n};\r\n\r\n\r\n/**\r\n* Returns the array of markers in the clusterer.\r\n*\r\n* @return {Array.} The markers.\r\n*/\r\nMarkerClusterer.prototype.getMarkers = function () {\r\n return this.markers_;\r\n};\r\n\r\n\r\n/**\r\n* Returns the number of markers in the clusterer\r\n*\r\n* @return {Number} The number of markers.\r\n*/\r\nMarkerClusterer.prototype.getTotalMarkers = function () {\r\n return this.markers_.length;\r\n};\r\n\r\n\r\n/**\r\n* Sets the max zoom for the clusterer.\r\n*\r\n* @param {number} maxZoom The max zoom level.\r\n*/\r\nMarkerClusterer.prototype.setMaxZoom = function (maxZoom) {\r\n this.maxZoom_ = maxZoom;\r\n};\r\n\r\n\r\n/**\r\n* Gets the max zoom for the clusterer.\r\n*\r\n* @return {number} The max zoom level.\r\n*/\r\nMarkerClusterer.prototype.getMaxZoom = function () {\r\n return this.maxZoom_;\r\n};\r\n\r\nMarkerClusterer.prototype.getClusterCount = function (markers) {\r\n let sum = 0;\r\n\r\n for (let i = 0; i < markers.length; i++) {\r\n if (markers[i].data && markers[i].data.units) {\r\n sum += +markers[i].data.units;\r\n }\r\n }\r\n\r\n if (sum === 0) {\r\n sum = markers.length;\r\n }\r\n\r\n return sum;\r\n}\r\n\r\n/**\r\n* The function for calculating the cluster icon image.\r\n*\r\n* @param {Array.} markers The markers in the clusterer.\r\n* @param {number} numStyles The number of styles available.\r\n* @return {Object} A object properties: 'text' (string) and 'index' (number).\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.calculator_ = function (markers, numStyles) {\r\n var index = 0;\r\n var count = MarkerClusterer.prototype.getClusterCount(markers);\r\n var dv = count;\r\n while (dv !== 0) {\r\n dv = parseInt(dv / 10, 10);\r\n index++;\r\n }\r\n\r\n index = Math.min(index, numStyles);\r\n return {\r\n text: count,\r\n index: index\r\n };\r\n};\r\n\r\n\r\n/**\r\n* Set the calculator function.\r\n*\r\n* @param {function(Array, number)} calculator The function to set as the\r\n* calculator. The function should return a object properties:\r\n* 'text' (string) and 'index' (number).\r\n*\r\n*/\r\nMarkerClusterer.prototype.setCalculator = function (calculator) {\r\n this.calculator_ = calculator;\r\n};\r\n\r\n\r\n/**\r\n* Get the calculator function.\r\n*\r\n* @return {function(Array, number)} the calculator function.\r\n*/\r\nMarkerClusterer.prototype.getCalculator = function () {\r\n return this.calculator_;\r\n};\r\n\r\n\r\n/**\r\n* Add an array of markers to the clusterer.\r\n*\r\n* @param {Array.} markers The markers to add.\r\n* @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n*/\r\nMarkerClusterer.prototype.addMarkers = function (markers, opt_nodraw) {\r\n if (markers.length) {\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n this.pushMarkerTo_(marker);\r\n }\r\n } else if (Object.keys(markers).length) {\r\n for (var marker in markers) {\r\n this.pushMarkerTo_(markers[marker]);\r\n }\r\n }\r\n if (!opt_nodraw) {\r\n this.redraw();\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Pushes a marker to the clusterer.\r\n*\r\n* @param {google.maps.Marker} marker The marker to add.\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.pushMarkerTo_ = function (marker) {\r\n marker.isAdded = false;\r\n if (marker['draggable']) {\r\n // If the marker is draggable add a listener so we update the clusters on\r\n // the drag end.\r\n var that = this;\r\n google.maps.event.addListener(marker, 'dragend', function () {\r\n marker.isAdded = false;\r\n that.repaint();\r\n });\r\n }\r\n this.markers_.push(marker);\r\n};\r\n\r\n\r\n/**\r\n* Adds a marker to the clusterer and redraws if needed.\r\n*\r\n* @param {google.maps.Marker} marker The marker to add.\r\n* @param {boolean=} opt_nodraw Whether to redraw the clusters.\r\n*/\r\nMarkerClusterer.prototype.addMarker = function (marker, opt_nodraw) {\r\n this.pushMarkerTo_(marker);\r\n if (!opt_nodraw) {\r\n this.redraw();\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Removes a marker and returns true if removed, false if not\r\n*\r\n* @param {google.maps.Marker} marker The marker to remove\r\n* @return {boolean} Whether the marker was removed or not\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.removeMarker_ = function (marker) {\r\n var index = -1;\r\n if (this.markers_.indexOf) {\r\n index = this.markers_.indexOf(marker);\r\n } else {\r\n for (var i = 0, m; m = this.markers_[i]; i++) {\r\n if (m == marker) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (index == -1) {\r\n // Marker is not in our list of markers.\r\n return false;\r\n }\r\n\r\n marker.setMap(null);\r\n\r\n this.markers_.splice(index, 1);\r\n\r\n return true;\r\n};\r\n\r\n\r\n/**\r\n* Remove a marker from the cluster.\r\n*\r\n* @param {google.maps.Marker} marker The marker to remove.\r\n* @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n* @return {boolean} True if the marker was removed.\r\n*/\r\nMarkerClusterer.prototype.removeMarker = function (marker, opt_nodraw) {\r\n var removed = this.removeMarker_(marker);\r\n\r\n if (!opt_nodraw && removed) {\r\n this.resetViewport();\r\n this.redraw();\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Removes an array of markers from the cluster.\r\n*\r\n* @param {Array.} markers The markers to remove.\r\n* @param {boolean=} opt_nodraw Optional boolean to force no redraw.\r\n*/\r\nMarkerClusterer.prototype.removeMarkers = function (markers, opt_nodraw) {\r\n var removed = false;\r\n\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n var r = this.removeMarker_(marker);\r\n removed = removed || r;\r\n }\r\n\r\n if (!opt_nodraw && removed) {\r\n this.resetViewport();\r\n this.redraw();\r\n return true;\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Sets the clusterer's ready state.\r\n*\r\n* @param {boolean} ready The state.\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.setReady_ = function (ready) {\r\n if (!this.ready_) {\r\n this.ready_ = ready;\r\n this.createClusters_();\r\n this.setUpUniqueMarkers_();\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Returns the number of clusters in the clusterer.\r\n*\r\n* @return {number} The number of clusters.\r\n*/\r\nMarkerClusterer.prototype.getTotalClusters = function () {\r\n return this.clusters_.length;\r\n};\r\n\r\n\r\n/**\r\n* Returns the google map that the clusterer is associated with.\r\n*\r\n* @return {google.maps.Map} The map.\r\n*/\r\nMarkerClusterer.prototype.getMap = function () {\r\n return this.map_;\r\n};\r\n\r\n\r\n/**\r\n* Sets the google map that the clusterer is associated with.\r\n*\r\n* @param {google.maps.Map} map The map.\r\n*/\r\nMarkerClusterer.prototype.setMap = function (map) {\r\n this.map_ = map;\r\n};\r\n\r\n\r\n/**\r\n* Returns the size of the grid.\r\n*\r\n* @return {number} The grid size.\r\n*/\r\nMarkerClusterer.prototype.getGridSize = function () {\r\n return this.gridSize_;\r\n};\r\n\r\n\r\n/**\r\n* Sets the size of the grid.\r\n*\r\n* @param {number} size The grid size.\r\n*/\r\nMarkerClusterer.prototype.setGridSize = function (size) {\r\n this.gridSize_ = size;\r\n};\r\n\r\n\r\n/**\r\n* Returns the min cluster size.\r\n*\r\n* @return {number} The grid size.\r\n*/\r\nMarkerClusterer.prototype.getMinClusterSize = function () {\r\n return this.minClusterSize_;\r\n};\r\n\r\n/**\r\n* Sets the min cluster size.\r\n*\r\n* @param {number} size The grid size.\r\n*/\r\nMarkerClusterer.prototype.setMinClusterSize = function (size) {\r\n this.minClusterSize_ = size;\r\n};\r\n\r\n\r\n/**\r\n* Extends a bounds object by the grid size.\r\n*\r\n* @param {google.maps.LatLngBounds} bounds The bounds to extend.\r\n* @return {google.maps.LatLngBounds} The extended bounds.\r\n*/\r\nMarkerClusterer.prototype.getExtendedBounds = function (bounds) {\r\n var projection = this.getProjection();\r\n\r\n // Turn the bounds into latlng.\r\n var tr = new google.maps.LatLng(bounds.getNorthEast().lat(),\r\n bounds.getNorthEast().lng());\r\n var bl = new google.maps.LatLng(bounds.getSouthWest().lat(),\r\n bounds.getSouthWest().lng());\r\n\r\n // Convert the points to pixels and the extend out by the grid size.\r\n var trPix = projection.fromLatLngToDivPixel(tr);\r\n trPix.x += this.gridSize_;\r\n trPix.y -= this.gridSize_;\r\n\r\n var blPix = projection.fromLatLngToDivPixel(bl);\r\n blPix.x -= this.gridSize_;\r\n blPix.y += this.gridSize_;\r\n\r\n // Convert the pixel points back to LatLng\r\n var ne = projection.fromDivPixelToLatLng(trPix);\r\n var sw = projection.fromDivPixelToLatLng(blPix);\r\n\r\n // Extend the bounds to contain the new bounds.\r\n bounds.extend(ne);\r\n bounds.extend(sw);\r\n\r\n return bounds;\r\n};\r\n\r\n\r\n/**\r\n* Determins if a marker is contained in a bounds.\r\n*\r\n* @param {google.maps.Marker} marker The marker to check.\r\n* @param {google.maps.LatLngBounds} bounds The bounds to check against.\r\n* @return {boolean} True if the marker is in the bounds.\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.isMarkerInBounds_ = function (marker, bounds) {\r\n return bounds.contains(marker.getPosition());\r\n};\r\n\r\n\r\n/**\r\n* Clears all clusters and markers from the clusterer.\r\n*/\r\nMarkerClusterer.prototype.clearMarkers = function () {\r\n this.resetViewport(true);\r\n\r\n // Set the markers a empty array.\r\n this.markers_ = [];\r\n};\r\n\r\n\r\n/**\r\n* Clears all existing clusters and recreates them.\r\n* @param {boolean} opt_hide To also hide the marker.\r\n*/\r\nMarkerClusterer.prototype.resetViewport = function (opt_hide) {\r\n // Remove all the clusters\r\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\r\n cluster.remove();\r\n }\r\n\r\n // Reset the markers to not be added and to be invisible.\r\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n marker.isAdded = false;\r\n if (opt_hide) {\r\n marker.setMap(null);\r\n }\r\n }\r\n\r\n this.clusters_ = [];\r\n};\r\n\r\n/**\r\n*\r\n*/\r\nMarkerClusterer.prototype.repaint = function () {\r\n var oldClusters = this.clusters_.slice();\r\n this.clusters_.length = 0;\r\n this.resetViewport();\r\n this.redraw();\r\n\r\n // Remove the old clusters.\r\n // Do it in a timeout so the other clusters have been drawn first.\r\n window.setTimeout(function () {\r\n for (var i = 0, cluster; cluster = oldClusters[i]; i++) {\r\n cluster.remove();\r\n }\r\n }, 0);\r\n};\r\n\r\n\r\n/**\r\n* Redraws the clusters.\r\n*/\r\nMarkerClusterer.prototype.redraw = function () {\r\n this.createClusters_();\r\n this.setUpUniqueMarkers_();\r\n};\r\n\r\n\r\n/**\r\n* Calculates the distance between two latlng locations in km.\r\n* @see http://www.movable-type.co.uk/scripts/latlong.html\r\n*\r\n* @param {google.maps.LatLng} p1 The first lat lng point.\r\n* @param {google.maps.LatLng} p2 The second lat lng point.\r\n* @return {number} The distance between the two points in km.\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.distanceBetweenPoints_ = function (p1, p2) {\r\n if (!p1 || !p2) {\r\n return 0;\r\n }\r\n\r\n p1 = {\r\n lat : this.getPositionPoints_(p1, 'lat'),\r\n lng : this.getPositionPoints_(p1, 'lng')\r\n };\r\n p2 = {\r\n lat : this.getPositionPoints_(p2, 'lat'),\r\n lng : this.getPositionPoints_(p2, 'lng')\r\n };\r\n\r\n var R = 6371; // Radius of the Earth in km\r\n var dLat = (p2.lat - p1.lat) * Math.PI / 180;\r\n var dLon = (p2.lng - p1.lng) * Math.PI / 180;\r\n var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +\r\n Math.cos(p1.lat * Math.PI / 180) * Math.cos(p2.lat * Math.PI / 180) *\r\n Math.sin(dLon / 2) * Math.sin(dLon / 2);\r\n var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n var d = R * c;\r\n return d;\r\n};\r\n\r\nMarkerClusterer.prototype.getPositionPoints_ = function(data, property) {\r\n if (typeof data[property] === 'function') {\r\n return data[property]();\r\n }\r\n\r\n return data[property];\r\n}\r\n\r\n\r\n/**\r\n* Add a marker to a cluster, or creates a new cluster.\r\n*\r\n* @param {google.maps.Marker} marker The marker to add.\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.addToClosestCluster_ = function (marker) {\r\n var distance = 40000; // Some large number\r\n var clusterToAddTo = null;\r\n var pos = marker.getPosition();\r\n for (var i = 0, cluster; cluster = this.clusters_[i]; i++) {\r\n var center = cluster.getCenter();\r\n if (center) {\r\n var d = this.distanceBetweenPoints_(center, marker.getPosition());\r\n if (d < distance) {\r\n distance = d;\r\n clusterToAddTo = cluster;\r\n }\r\n }\r\n }\r\n\r\n if (clusterToAddTo && clusterToAddTo.isMarkerInClusterBounds(marker)) {\r\n clusterToAddTo.addMarker(marker);\r\n } else {\r\n var cluster = new Cluster(this);\r\n cluster.addMarker(marker);\r\n this.clusters_.push(cluster);\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Creates the clusters.\r\n*\r\n* @private\r\n*/\r\nMarkerClusterer.prototype.createClusters_ = function () {\r\n if (!this.ready_) {\r\n return;\r\n }\r\n\r\n // Get our current map view bounds.\r\n // Create a new bounds object so we don't affect the map.\r\n var mapBounds = new google.maps.LatLngBounds(this.map_.getBounds().getSouthWest(),\r\n this.map_.getBounds().getNorthEast());\r\n var bounds = this.getExtendedBounds(mapBounds);\r\n\r\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n if (!marker.isAdded && this.isMarkerInBounds_(marker, bounds)) {\r\n this.addToClosestCluster_(marker);\r\n }\r\n }\r\n};\r\n\r\nMarkerClusterer.prototype.setUpUniqueMarkers_ = function () {\r\n const uniqueCluster = this.clusters_.filter(x=>x.markers_.length <= 1);\r\n const length = uniqueCluster.length;\r\n for (let index = 0; index < length; index++) {\r\n const cluster = uniqueCluster[index];\r\n for (let i = 0; i < cluster.markers_.length; i++) {\r\n cluster.markers_[i] = this.getPin_(cluster.markers_, cluster.markers_[i]);\r\n cluster.markers_[i].setMap(this.map_);\r\n }\r\n \r\n }\r\n}\r\n\r\nMarkerClusterer.prototype.getPin_ = function (markers_, marker) {\r\n if (!(marker instanceof google.maps.Marker) && this.options.createPinMethod) {\r\n const pin = this.options.createPinMethod.call(this.markers_, marker);\r\n const index = this.markers_.indexOf(marker);\r\n this.markers_[index] = pin;\r\n const clusterIndex = markers_.indexOf(marker);\r\n markers_[clusterIndex] = pin;\r\n return pin;\r\n }\r\n return marker\r\n} \r\n\r\n\r\n/**\r\n* A cluster that contains markers.\r\n*\r\n* @param {MarkerClusterer} markerClusterer The markerclusterer that this\r\n* cluster is associated with.\r\n* @constructor\r\n* @ignore\r\n*/\r\nfunction Cluster(markerClusterer) {\r\n this.markerClusterer_ = markerClusterer;\r\n this.map_ = markerClusterer.getMap();\r\n this.gridSize_ = markerClusterer.getGridSize();\r\n this.minClusterSize_ = markerClusterer.getMinClusterSize();\r\n this.averageCenter_ = markerClusterer.isAverageCenter();\r\n this.center_ = null;\r\n this.markers_ = [];\r\n this.bounds_ = null;\r\n\r\n const initOptions = {\r\n afterRenderCallback: markerClusterer.options.afterRenderCallback,\r\n };\r\n\r\n this.clusterIcon_ = new ClusterIcon(\r\n this,\r\n markerClusterer.getStyles(),\r\n markerClusterer.getGridSize(),\r\n initOptions\r\n );\r\n}\r\n\r\n/**\r\n* Determins if a marker is already added to the cluster.\r\n*\r\n* @param {google.maps.Marker} marker The marker to check.\r\n* @return {boolean} True if the marker is already added.\r\n*/\r\nCluster.prototype.isMarkerAlreadyAdded = function (marker) {\r\n if (this.markers_.indexOf) {\r\n return this.markers_.indexOf(marker) != -1;\r\n } else {\r\n for (var i = 0, m; m = this.markers_[i]; i++) {\r\n if (m == marker) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n};\r\n\r\n\r\n/**\r\n* Add a marker the cluster.\r\n*\r\n* @param {google.maps.Marker} marker The marker to add.\r\n* @return {boolean} True if the marker was added.\r\n*/\r\nCluster.prototype.addMarker = function (marker) {\r\n if (this.isMarkerAlreadyAdded(marker)) {\r\n return false;\r\n }\r\n\r\n if (!this.center_) {\r\n this.center_ = marker.getPosition();\r\n this.calculateBounds_();\r\n } else {\r\n if (this.averageCenter_) {\r\n var l = this.markers_.length + 1;\r\n var lat = (this.center_.lat() * (l - 1) + marker.getPosition().lat()) / l;\r\n var lng = (this.center_.lng() * (l - 1) + marker.getPosition().lng()) / l;\r\n this.center_ = new google.maps.LatLng(lat, lng);\r\n this.calculateBounds_();\r\n }\r\n }\r\n\r\n marker.isAdded = true;\r\n this.markers_.push(marker);\r\n\r\n var len = this.markers_.length;\r\n if (len < this.minClusterSize_ && marker.getMap() != this.map_) {\r\n // Min cluster size not reached so show the marker.\r\n marker = this.markerClusterer_.getPin_(this.markers_, marker);\r\n marker.setMap(this.map_);\r\n }\r\n\r\n if (len == this.minClusterSize_) {\r\n // Hide the markers that were showing.\r\n for (var i = 0; i < len; i++) {\r\n this.markers_[i].setMap(null);\r\n }\r\n }\r\n\r\n if (len >= this.minClusterSize_) {\r\n marker.setMap(null);\r\n }\r\n\r\n this.updateIcon();\r\n return true;\r\n};\r\n\r\n\r\n/**\r\n* Returns the marker clusterer that the cluster is associated with.\r\n*\r\n* @return {MarkerClusterer} The associated marker clusterer.\r\n*/\r\nCluster.prototype.getMarkerClusterer = function () {\r\n return this.markerClusterer_;\r\n};\r\n\r\n\r\n/**\r\n* Returns the bounds of the cluster.\r\n*\r\n* @return {google.maps.LatLngBounds} the cluster bounds.\r\n*/\r\nCluster.prototype.getBounds = function () {\r\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n var markers = this.getMarkers();\r\n for (var i = 0, marker; marker = markers[i]; i++) {\r\n bounds.extend(marker.getPosition());\r\n }\r\n return bounds;\r\n};\r\n\r\n\r\n/**\r\n* Removes the cluster\r\n*/\r\nCluster.prototype.remove = function () {\r\n this.clusterIcon_.remove();\r\n this.markers_.length = 0;\r\n delete this.markers_;\r\n};\r\n\r\n\r\n/**\r\n* Returns the center of the cluster.\r\n*\r\n* @return {number} The cluster center.\r\n*/\r\nCluster.prototype.getSize = function () {\r\n return this.markers_.length;\r\n};\r\n\r\n\r\n/**\r\n* Returns the center of the cluster.\r\n*\r\n* @return {Array.} The cluster center.\r\n*/\r\nCluster.prototype.getMarkers = function () {\r\n return this.markers_;\r\n};\r\n\r\n\r\n/**\r\n* Returns the center of the cluster.\r\n*\r\n* @return {google.maps.LatLng} The cluster center.\r\n*/\r\nCluster.prototype.getCenter = function () {\r\n return this.center_;\r\n};\r\n\r\n\r\n/**\r\n* Calculated the extended bounds of the cluster with the grid.\r\n*\r\n* @private\r\n*/\r\nCluster.prototype.calculateBounds_ = function () {\r\n var bounds = new google.maps.LatLngBounds(this.center_, this.center_);\r\n this.bounds_ = this.markerClusterer_.getExtendedBounds(bounds);\r\n};\r\n\r\n\r\n/**\r\n* Determines if a marker lies in the clusters bounds.\r\n*\r\n* @param {google.maps.Marker} marker The marker to check.\r\n* @return {boolean} True if the marker lies in the bounds.\r\n*/\r\nCluster.prototype.isMarkerInClusterBounds = function (marker) {\r\n return this.bounds_.contains(marker.getPosition());\r\n};\r\n\r\n\r\n/**\r\n* Returns the map that the cluster is associated with.\r\n*\r\n* @return {google.maps.Map} The map.\r\n*/\r\nCluster.prototype.getMap = function () {\r\n return this.map_;\r\n};\r\n\r\n\r\n/**\r\n* Updates the cluster icon\r\n*/\r\nCluster.prototype.updateIcon = function () {\r\n var zoom = this.map_.getZoom();\r\n var mz = this.markerClusterer_.getMaxZoom();\r\n\r\n if (mz && zoom > mz) {\r\n // The zoom is greater than our max zoom so show all the markers in cluster.\r\n for (var i = 0, marker; marker = this.markers_[i]; i++) {\r\n marker = this.markerClusterer_.getPin_(this.markers_, marker);\r\n marker.setMap(this.map_);\r\n }\r\n return;\r\n }\r\n\r\n if (this.markers_.length < this.minClusterSize_) {\r\n // Min cluster size not yet reached.\r\n this.clusterIcon_.hide();\r\n return;\r\n }\r\n\r\n var numStyles = this.markerClusterer_.getStyles().length;\r\n var sums = this.markerClusterer_.getCalculator()(this.markers_, numStyles);\r\n this.clusterIcon_.setCenter(this.center_);\r\n this.clusterIcon_.setSums(sums);\r\n this.clusterIcon_.show();\r\n};\r\n\r\n\r\n/**\r\n* A cluster icon\r\n*\r\n* @param {Cluster} cluster The cluster to be associated with.\r\n* @param {Object} styles An object that has style properties:\r\n* 'url': (string) The image url.\r\n* 'height': (number) The image height.\r\n* 'width': (number) The image width.\r\n* 'anchor': (Array) The anchor position of the label text.\r\n* 'textColor': (string) The text color.\r\n* 'textSize': (number) The text size.\r\n* 'backgroundPosition: (string) The background postition x, y.\r\n* @param {number=} opt_padding Optional padding to apply to the cluster icon.\r\n* @constructor\r\n* @extends google.maps.OverlayView\r\n* @ignore\r\n*/\r\nfunction ClusterIcon(cluster, styles, opt_padding, options) {\r\n cluster.getMarkerClusterer().extend(ClusterIcon, google.maps.OverlayView);\r\n\r\n this.styles_ = styles;\r\n this.padding_ = opt_padding || 0;\r\n this.cluster_ = cluster;\r\n this.center_ = null;\r\n this.map_ = cluster.getMap();\r\n this.div_ = null;\r\n this.sums_ = null;\r\n this.visible_ = false;\r\n this.afterRenderCallback = options['afterRenderCallback'];\r\n\r\n this.setMap(this.map_);\r\n}\r\n\r\n\r\n/**\r\n* Triggers the clusterclick event and zoom's if the option is set.\r\n*/\r\nClusterIcon.prototype.triggerClusterClick = function () {\r\n var markerClusterer = this.cluster_.getMarkerClusterer();\r\n\r\n // Trigger the clusterclick event.\r\n google.maps.event.trigger(markerClusterer, 'clusterclick', this.cluster_);\r\n\r\n if (markerClusterer.isZoomOnClick()) {\r\n\r\n this.map_.isEventFromClusterClick = true; // This is for the logic of the zoom, when the user clicks on a cluster and wants to get back to the previous zoom\r\n this.map_.panTo(this.cluster_.getCenter());\r\n // Zoom into the cluster.\r\n this.map_.fitBounds(this.cluster_.getBounds());\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Adding the cluster icon to the dom.\r\n* @ignore\r\n*/\r\nClusterIcon.prototype.onAdd = function () {\r\n this.div_ = document.createElement('DIV');\r\n if (this.visible_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.cssText = this.createCss(pos);\r\n this.div_.innerHTML = this.sums_.text;\r\n this.div_.className = this.css_;\r\n }\r\n\r\n var panes = this.getPanes();\r\n panes.overlayMouseTarget.appendChild(this.div_);\r\n\r\n if (this.afterRenderCallback && typeof this.afterRenderCallback === 'function') {\r\n const sumValue = this.sums_ && this.sums_.text ? this.sums_.text : '';\r\n this.afterRenderCallback(this.div_, sumValue, this.cluster_.markerClusterer_.options.name);\r\n }\r\n\r\n var that = this;\r\n this.div_.addEventListener('click', function () {\r\n that.triggerClusterClick();\r\n });\r\n};\r\n\r\n\r\n/**\r\n* Returns the position to place the div dending on the latlng.\r\n*\r\n* @param {google.maps.LatLng} latlng The position in latlng.\r\n* @return {google.maps.Point} The position in pixels.\r\n* @private\r\n*/\r\nClusterIcon.prototype.getPosFromLatLng_ = function (latlng) {\r\n var pos = this.getProjection().fromLatLngToDivPixel(latlng);\r\n pos.x -= parseInt(this.width_ / 2, 10);\r\n pos.y -= parseInt(this.height_ / 2, 10);\r\n return pos;\r\n};\r\n\r\n\r\n/**\r\n* Draw the icon.\r\n* @ignore\r\n*/\r\nClusterIcon.prototype.draw = function () {\r\n if (this.visible_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.top = pos.y + 'px';\r\n this.div_.style.left = pos.x + 'px';\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Hide the icon.\r\n*/\r\nClusterIcon.prototype.hide = function () {\r\n if (this.div_) {\r\n this.div_.style.display = 'none';\r\n }\r\n this.visible_ = false;\r\n};\r\n\r\n\r\n/**\r\n* Position and show the icon.\r\n*/\r\nClusterIcon.prototype.show = function () {\r\n if (this.div_) {\r\n var pos = this.getPosFromLatLng_(this.center_);\r\n this.div_.style.cssText = this.createCss(pos);\r\n this.div_.style.display = '';\r\n }\r\n this.visible_ = true;\r\n};\r\n\r\n\r\n/**\r\n* Remove the icon from the map\r\n*/\r\nClusterIcon.prototype.remove = function () {\r\n this.setMap(null);\r\n};\r\n\r\n\r\n/**\r\n* Implementation of the onRemove interface.\r\n* @ignore\r\n*/\r\nClusterIcon.prototype.onRemove = function () {\r\n if (this.div_ && this.div_.parentNode) {\r\n this.hide();\r\n this.div_.parentNode.removeChild(this.div_);\r\n this.div_ = null;\r\n }\r\n};\r\n\r\n\r\n/**\r\n* Set the sums of the icon.\r\n*\r\n* @param {Object} sums The sums containing:\r\n* 'text': (string) The text to display in the icon.\r\n* 'index': (number) The style index of the icon.\r\n*/\r\nClusterIcon.prototype.setSums = function (sums) {\r\n this.sums_ = sums;\r\n this.text_ = sums.text;\r\n this.index_ = sums.index;\r\n if (this.div_) {\r\n this.div_.innerHTML = sums.text;\r\n }\r\n\r\n this.useStyle();\r\n};\r\n\r\n\r\n/**\r\n* Sets the icon to the the styles.\r\n*/\r\nClusterIcon.prototype.useStyle = function () {\r\n var index = Math.max(0, this.sums_.index - 1);\r\n index = Math.min(this.styles_.length - 1, index);\r\n var style = this.styles_[index];\r\n this.url_ = style['url'];\r\n this.css_ = style['css'];\r\n this.height_ = style['height'];\r\n this.width_ = style['width'];\r\n this.textColor_ = style['textColor'];\r\n this.anchor_ = style['anchor'];\r\n this.textSize_ = style['textSize'];\r\n this.backgroundPosition_ = style['backgroundPosition'];\r\n};\r\n\r\n\r\n/**\r\n* Sets the center of the icon.\r\n*\r\n* @param {google.maps.LatLng} center The latlng to set as the center.\r\n*/\r\nClusterIcon.prototype.setCenter = function (center) {\r\n this.center_ = center;\r\n};\r\n\r\n\r\n/**\r\n* Create the css text based on the position of the icon.\r\n*\r\n* @param {google.maps.Point} pos The position.\r\n* @return {string} The css style text.\r\n*/\r\nClusterIcon.prototype.createCss = function (pos) {\r\n var style = [];\r\n if (this.url_)\r\n style.push('background-image:url(' + this.url_ + ');');\r\n var backgroundPosition = this.backgroundPosition_ ? this.backgroundPosition_ : '0 0';\r\n style.push('background-position:' + backgroundPosition + ';');\r\n if (typeof this.anchor_ === 'object') {\r\n if (typeof this.anchor_[0] === 'number' && this.anchor_[0] > 0 &&\r\n this.anchor_[0] < this.height_) {\r\n style.push('height:' + (this.height_ - this.anchor_[0]) +\r\n 'px; padding-top:' + this.anchor_[0] + 'px;');\r\n } else {\r\n style.push('height:' + this.height_ + 'px; line-height:' + this.height_ +\r\n 'px;');\r\n }\r\n if (typeof this.anchor_[1] === 'number' && this.anchor_[1] > 0 &&\r\n this.anchor_[1] < this.width_) {\r\n style.push('width:' + (this.width_ - this.anchor_[1]) +\r\n 'px; padding-left:' + this.anchor_[1] + 'px;');\r\n } else {\r\n style.push('width:' + this.width_ + 'px; text-align:center;');\r\n }\r\n } else {\r\n style.push('height:' + this.height_ + 'px; line-height:' +\r\n this.height_ + 'px; width:' + this.width_ + 'px; text-align:center;');\r\n }\r\n\r\n var txtColor = this.textColor_ ? this.textColor_ : 'black';\r\n var txtSize = this.textSize_ ? this.textSize_ : 11;\r\n\r\n style.push('cursor:pointer; top:' + pos.y + 'px; left:' +\r\n pos.x + 'px; color:' + txtColor + '; position:absolute; font-size:' +\r\n txtSize + 'px; font-family:Arial,sans-serif; font-weight:bold');\r\n style.push(\"pointer-events: none;\");\r\n return style.join('');\r\n};\r\n\r\n\r\n// Export Symbols for Closure\r\n// If you are not going to compile with closure then you can remove the\r\n// code below.\r\nwindow['MarkerClusterer'] = MarkerClusterer;\r\nMarkerClusterer.prototype['addMarker'] = MarkerClusterer.prototype.addMarker;\r\nMarkerClusterer.prototype['addMarkers'] = MarkerClusterer.prototype.addMarkers;\r\nMarkerClusterer.prototype['clearMarkers'] =\r\n MarkerClusterer.prototype.clearMarkers;\r\nMarkerClusterer.prototype['fitMapToMarkers'] =\r\n MarkerClusterer.prototype.fitMapToMarkers;\r\nMarkerClusterer.prototype['getCalculator'] =\r\n MarkerClusterer.prototype.getCalculator;\r\nMarkerClusterer.prototype['getGridSize'] =\r\n MarkerClusterer.prototype.getGridSize;\r\nMarkerClusterer.prototype['getExtendedBounds'] =\r\n MarkerClusterer.prototype.getExtendedBounds;\r\nMarkerClusterer.prototype['getMap'] = MarkerClusterer.prototype.getMap;\r\nMarkerClusterer.prototype['getMarkers'] = MarkerClusterer.prototype.getMarkers;\r\nMarkerClusterer.prototype['getMaxZoom'] = MarkerClusterer.prototype.getMaxZoom;\r\nMarkerClusterer.prototype['getStyles'] = MarkerClusterer.prototype.getStyles;\r\nMarkerClusterer.prototype['getTotalClusters'] =\r\n MarkerClusterer.prototype.getTotalClusters;\r\nMarkerClusterer.prototype['getTotalMarkers'] =\r\n MarkerClusterer.prototype.getTotalMarkers;\r\nMarkerClusterer.prototype['redraw'] = MarkerClusterer.prototype.redraw;\r\nMarkerClusterer.prototype['removeMarker'] =\r\n MarkerClusterer.prototype.removeMarker;\r\nMarkerClusterer.prototype['removeMarkers'] =\r\n MarkerClusterer.prototype.removeMarkers;\r\nMarkerClusterer.prototype['resetViewport'] =\r\n MarkerClusterer.prototype.resetViewport;\r\nMarkerClusterer.prototype['repaint'] =\r\n MarkerClusterer.prototype.repaint;\r\nMarkerClusterer.prototype['setCalculator'] =\r\n MarkerClusterer.prototype.setCalculator;\r\nMarkerClusterer.prototype['setGridSize'] =\r\n MarkerClusterer.prototype.setGridSize;\r\nMarkerClusterer.prototype['setMaxZoom'] =\r\n MarkerClusterer.prototype.setMaxZoom;\r\nMarkerClusterer.prototype['onAdd'] = MarkerClusterer.prototype.onAdd;\r\nMarkerClusterer.prototype['draw'] = MarkerClusterer.prototype.draw;\r\n\r\nCluster.prototype['getCenter'] = Cluster.prototype.getCenter;\r\nCluster.prototype['getSize'] = Cluster.prototype.getSize;\r\nCluster.prototype['getMarkers'] = Cluster.prototype.getMarkers;\r\n\r\nClusterIcon.prototype['onAdd'] = ClusterIcon.prototype.onAdd;\r\nClusterIcon.prototype['draw'] = ClusterIcon.prototype.draw;\r\nClusterIcon.prototype['onRemove'] = ClusterIcon.prototype.onRemove;\r\n\r\nObject.keys = Object.keys || function (o) {\r\n var result = [];\r\n for (var name in o) {\r\n if (o.hasOwnProperty(name))\r\n result.push(name);\r\n }\r\n return result;\r\n};\r\n\ndefine(\"markerClusterer\", function(){});\n\n","define('builderShowcaseState',[\r\n], () => {\r\n 'use strict';\r\n\r\n const defaultParameters = {\r\n Adult: false,\r\n AgeRestricted: false,\r\n Bathrooms: 0,\r\n Bedrooms: 0,\r\n BrandId: 0,\r\n Brands: [],\r\n CommName: '',\r\n CommunityStatus: '',\r\n ComingSoon: false,\r\n Custom: false,\r\n CustomResults: false,\r\n ExcludeBrandsFromResults: true,\r\n ExcludeRegularComms: false,\r\n Gated: false,\r\n GolfCourse: false,\r\n Green: false,\r\n Qmi: false,\r\n HomeStatus: '',\r\n HotDeals: false,\r\n IncludeMpc: true,\r\n LuxuryHomes: false,\r\n Mfr: false,\r\n MultiFamily: false,\r\n NatureAreas: false,\r\n NoBoyl: true,\r\n NumStory: 0,\r\n OriginLat: 0,\r\n OriginLng: 0,\r\n PartnerId: 0,\r\n Parks: false,\r\n Pool: false,\r\n PriceHigh: 0,\r\n PriceLow: 0,\r\n SchoolDistrictIds: '',\r\n SingleFamily: false,\r\n Sports: false,\r\n SqFtHigh: 0,\r\n SqFtLow: 0,\r\n SrpType: 'CommunityResults',\r\n Views: false,\r\n Waterfront: false,\r\n Garages: 0,\r\n LivingAreas: 0,\r\n Stories: 0,\r\n MasterBedLocation: 0,\r\n CommId: 0,\r\n HasRVGarage: false,\r\n MarketId: 0,\r\n State: '',\r\n MarketName: '',\r\n WebApiSearchType: 'Map',\r\n };\r\n\r\n const pageData = JSON.parse(document.querySelector('[data-component=\"builder-showcase-data\"]').innerHTML);\r\n const partnerElement = document.querySelector('#nhs_partnerID');\r\n\r\n const builderShowcaseData = {\r\n searchParameters: defaultParameters,\r\n data: pageData,\r\n locations: pageData.LocationsSection,\r\n parterId: partnerElement.value,\r\n };\r\n\r\n if (pageData.LocationsSection) {\r\n builderShowcaseData.searchParameters.OriginLat = builderShowcaseData.locations.Latitude;\r\n builderShowcaseData.searchParameters.OriginLng = builderShowcaseData.locations.Longitude;\r\n builderShowcaseData.searchParameters.Zoom = builderShowcaseData.locations.ZoomLevelToUse;\r\n\r\n if (builderShowcaseData.locations.PreSelectedMarket) {\r\n builderShowcaseData.searchParameters.MarketId = builderShowcaseData.locations.PreSelectedMarket.Id;\r\n builderShowcaseData.searchParameters.MarketName = builderShowcaseData.locations.PreSelectedMarket.Name;\r\n builderShowcaseData.searchParameters.State = builderShowcaseData.locations.PreSelectedMarket.StateAbbr;\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * getState: returns a copy of the BSP's current state.\r\n *\r\n */\r\n function getState() {\r\n return Object.assign({}, builderShowcaseData);\r\n }\r\n\r\n /**\r\n * @public\r\n * getParameters: returns a copy of the BSP's current search parameters.\r\n *\r\n */\r\n function getParameters() {\r\n return Object.assign({}, builderShowcaseData.searchParameters);\r\n }\r\n\r\n /**\r\n * @public\r\n * setSearchParamsAttributes: modifies a set of attributes in search params.\r\n * @param {object} object with a set of attributes to change on search params.\r\n */\r\n function setSearchParamsAttributes(object) {\r\n if (!object) {\r\n return;\r\n }\r\n\r\n const objectEntries = Object.entries(object);\r\n\r\n for (let i = 0; i < objectEntries.length; i += 1) {\r\n builderShowcaseData.searchParameters[objectEntries[i][0]] = objectEntries[i][1];\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * setSearchParamsAttributes: modifies a set of attributes in the data.\r\n * @param {object} object with a set of attributes to change the data.\r\n */\r\n function setData(object) {\r\n if (!object) {\r\n return;\r\n }\r\n\r\n const objectEntries = Object.entries(object);\r\n\r\n for (let i = 0; i < objectEntries.length; i += 1) {\r\n builderShowcaseData.data[objectEntries[i][0]] = objectEntries[i][1];\r\n }\r\n }\r\n\r\n return {\r\n getState,\r\n getParameters,\r\n setSearchParamsAttributes,\r\n setData,\r\n };\r\n});\r\n\n","(function eventBus(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousEventBus = global.NewHomeSource.EventBus;\r\n\r\n /**\r\n * @constructs NewHomeSource.EventBus\r\n */\r\n const EventBus = function EventBus() {\r\n this.observers = [];\r\n };\r\n\r\n /**\r\n * @public\r\n * addObserver: adds a new Observer to the Event bus for the given topic.\r\n *\r\n * @param {string} topic to identify the data needed for the observer.\r\n * @param {function} observer function to be called when the topic has changed.\r\n */\r\n EventBus.prototype.addObserver = function addObserver(topic, observer) {\r\n if (typeof observer !== 'function' || typeof topic !== 'string') {\r\n return;\r\n }\r\n\r\n if (!Array.isArray(this.observers[topic])) {\r\n this.observers[topic] = [];\r\n }\r\n\r\n this.observers[topic].push(observer);\r\n };\r\n\r\n /**\r\n * @public\r\n * notifyObservers: notifies the obsevers listening to the given topic and pass the given data.\r\n *\r\n * @param {string} topic to identify the observers to be notified.\r\n * @param {object} data to be passed to the observers.\r\n */\r\n EventBus.prototype.notifyObservers = function notifyObservers(topic, data) {\r\n if (typeof topic !== 'string') {\r\n return;\r\n }\r\n\r\n if (!Array.isArray(this.observers[topic])) {\r\n return;\r\n }\r\n\r\n const totalCallbacks = this.observers[topic].length;\r\n\r\n for (let i = 0; i < totalCallbacks; i += 1) {\r\n const fn = this.observers[topic][i];\r\n\r\n if (typeof fn.update === 'function') {\r\n fn.update(data, topic);\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * removeObserver: removes an Observer to the Event bus for the given topic.\r\n *\r\n * @param {string} topic to identify the data requested for the observer.\r\n * @param {function} observer function to be removed from the given topic.\r\n */\r\n EventBus.prototype.removeObserver = function removeObserver(topic, observer) {\r\n if (typeof observer !== 'function' || typeof topic !== 'string') {\r\n return;\r\n }\r\n\r\n if (!Array.isArray(this.observers[topic])) {\r\n return;\r\n }\r\n\r\n const index = this.observers[topic].indexOf(observer);\r\n\r\n if (index >= 0) {\r\n this.observers[topic].splice(index, 1);\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 EventBus.noConflict = function noConflict() {\r\n global.NewHomeSource.EventBus = previousEventBus;\r\n return EventBus;\r\n };\r\n\r\n global.NewHomeSource.EventBus = EventBus;\r\n}(window));\r\n\ndefine(\"eventBus\", function(){});\n\n","define('builderShowcaseObserver',[\r\n 'builderShowcaseState',\r\n 'eventBus'\r\n], (builderShowcaseState) => {\r\n 'use strict';\r\n\r\n const eventBus = new window.NewHomeSource.EventBus();\r\n const temporalState = builderShowcaseState.getState();\r\n\r\n /**\r\n * @public\r\n * beforeMapResultsLoaded: event to be executed before the map results are retrieved in a AJAX request.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function beforeMapResultsLoaded(data) {\r\n eventBus.notifyObservers('onBeforeMapResultsLoaded', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * OnSortByChanged: executed after sort by changes.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function OnSortByChanged(data) {\r\n eventBus.notifyObservers('OnSortByChanged', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * OnPageSizeChanged: executed after page size changes.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function OnPageSizeChanged(data) {\r\n eventBus.notifyObservers('OnPageSizeChanged', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * OnSortByChanged: executed after star filter changes.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function OnStarFilterChanged(data) {\r\n eventBus.notifyObservers('OnStarFilterChanged', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * OnSortByChanged: executed after star filter changes.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function PaginationChanged(data) {\r\n eventBus.notifyObservers('PaginationChanged', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * OnSortByChanged: executed after sort by changes.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function onReviewsSectionLoaded(data) {\r\n eventBus.notifyObservers('onReviewsSectionLoaded', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * afterMapResultsLoaded: event to be executed after the map results are retrieved in a AJAX request.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function afterMapResultsLoaded(data) {\r\n eventBus.notifyObservers('onAfterMapResultsLoaded', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * galleryOpened: event to be executed when the gallery is opened in the about page.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function galleryOpened(data) {\r\n eventBus.notifyObservers('onGalleryOpened', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * onResize: event to be executed whenever the device changes it's dimensions.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function onResize(data) {\r\n eventBus.notifyObservers('onResize', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * imageSelected: event to be executed whenever a new image is selected.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function imageSelected(data) {\r\n eventBus.notifyObservers('onImageSelected', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * modalImageSelected: event to be executed whenever a new modal image is selected.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function modalImageSelected(data) {\r\n eventBus.notifyObservers('onModalImageSelected', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * onGalleryClosed: event to be executed whenever a modal is closed.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function onGalleryClosed(data) {\r\n eventBus.notifyObservers('onGalleryClosed', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * navigateToImage: event to be executed whenever a navigation button is selected.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function navigateToImage(data) {\r\n eventBus.notifyObservers('onNavigateToImage', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * navigateToModalImage: event to be executed whenever a navigation modal button is selected.\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n function navigateToModalImage(data) {\r\n eventBus.notifyObservers('onNavigateToModalImage', data);\r\n }\r\n\r\n /**\r\n * @public\r\n * subscribe: represents the way that modules uses for subscribing to the BSP publisher.\r\n * @param {string} topic represents the name of an event to be observed.\r\n * @param {function} observer represents a callback to be executed when the topic event gets triggered.\r\n */\r\n function subscribe(topic, observer) {\r\n eventBus.addObserver(topic, observer);\r\n }\r\n\r\n /**\r\n* @public\r\n* setSearchParamAttribute: sets a single search param value.\r\n* @param {string} key to access on search params object.\r\n* @param {object} value to change in a given attribute.\r\n*/\r\n function setSearchParamAttribute(key, value) {\r\n if (!key ||\r\n !value ||\r\n !Object.prototype.hasOwnProperty.call(temporalState.searchParameters, key)) {\r\n return;\r\n }\r\n\r\n temporalState.searchParameters[key] = value;\r\n }\r\n\r\n /**\r\n * @public\r\n * setSearchParamsAttributes: modifies a set of attributes in search params.\r\n * @param {object} object with a set of attributes to change on search params.\r\n */\r\n function setSearchParamsAttributes(object) {\r\n if (!object) {\r\n return;\r\n }\r\n\r\n const objectEntries = Object.entries(object);\r\n\r\n for (let i = 0; i < objectEntries.length; i += 1) {\r\n temporalState.searchParameters[objectEntries[i][0]] = objectEntries[i][1];\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * setData: modifies a set of attributes in the data.\r\n * @param {object} object with a set of attributes to change on the data.\r\n */\r\n function setData(object) {\r\n if (!object) {\r\n return;\r\n }\r\n\r\n const objectEntries = Object.entries(object);\r\n\r\n for (let i = 0; i < objectEntries.length; i += 1) {\r\n temporalState.data[objectEntries[i][0]] = objectEntries[i][1];\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * commit: changes the state object.\r\n */\r\n function commit() {\r\n builderShowcaseState.setSearchParamsAttributes(temporalState.searchParameters);\r\n builderShowcaseState.setData(temporalState.data);\r\n }\r\n\r\n /**\r\n * @public\r\n * getParameter: gets a single parameter on the search parameters.\r\n * @param {string} key to access the search param object.\r\n */\r\n function getParameter(key) {\r\n const state = builderShowcaseState.getState();\r\n if (Object.prototype.hasOwnProperty.call(state.searchParameters, key)) {\r\n return state[key];\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @public\r\n * getState: gets the full state of the bulder show case\r\n */\r\n function getState() {\r\n return builderShowcaseState.getState();\r\n }\r\n\r\n /**\r\n * @public\r\n * getOriginalLatitude: gets the latitude to be consiedered for BSP\r\n */\r\n function getOriginalLatitude() {\r\n const value = parseFloat(temporalState.searchParameters.OriginLat);\r\n return value;\r\n }\r\n\r\n /**\r\n * @public\r\n * getOriginalLongitude: gets the longitud to be consiedered for BSP\r\n */\r\n function getOriginalLongitude() {\r\n const value = parseFloat(temporalState.searchParameters.OriginLng);\r\n return value;\r\n }\r\n\r\n /**\r\n * @public\r\n * getZoomLevel: gets the zoom level to use for BSP\r\n */\r\n function getZoomLevel() {\r\n return temporalState.searchParameters.Zoom;\r\n }\r\n\r\n /**\r\n * @public\r\n * getParameters: gets the full search parameter object\r\n */\r\n function getParameters() {\r\n return builderShowcaseState.getParameters();\r\n }\r\n\r\n /**\r\n * @public\r\n * getBrandId: gets the brand id from state\r\n */\r\n function getBrandId() {\r\n return temporalState.data.BrandId;\r\n }\r\n\r\n temporalState.searchParameters.PartnerId = temporalState.parterId;\r\n temporalState.searchParameters.BrandId = getBrandId();\r\n commit();\r\n\r\n window.addEventListener('resize', onResize);\r\n window.addEventListener('orientationchange', onResize);\r\n\r\n return {\r\n beforeMapResultsLoaded,\r\n afterMapResultsLoaded,\r\n OnSortByChanged,\r\n OnStarFilterChanged,\r\n OnPageSizeChanged,\r\n PaginationChanged,\r\n onReviewsSectionLoaded,\r\n galleryOpened,\r\n onResize,\r\n imageSelected,\r\n modalImageSelected,\r\n navigateToImage,\r\n navigateToModalImage,\r\n subscribe,\r\n commit,\r\n setParameter: setSearchParamAttribute,\r\n setParameters: setSearchParamsAttributes,\r\n getParameter,\r\n getParameters,\r\n getState,\r\n setData,\r\n getOriginalLatitude,\r\n getOriginalLongitude,\r\n getZoomLevel,\r\n onGalleryClosed,\r\n };\r\n});\r\n\n","define('domHelper',[], function () {\r\n var getPassiveOptions = function (passive) {\r\n var opts = new Object();\r\n opts.passive = !!passive;\r\n return opts;\r\n };\r\n\r\n /**\r\n * \r\n * Attaches a event to the DOM Element.\r\n * \r\n * @private \r\n * @param {string} event name that will be attached to the Element.\r\n * @param {function} callback JavaScript function to execute when the event is triggered.\r\n */\r\n function attachEvent(eventName, callback, passive) {\r\n var opts = getPassiveOptions(passive);\r\n\r\n if (document.addEventListener) {\r\n this.addEventListener(eventName, callback, opts);\r\n } else if (document.attachEvent) {\r\n this.attachEvent(eventName, callback, opts);\r\n }\r\n };\r\n\r\n /**\r\n * \r\n * Attaches a event to the DOM Element.\r\n * \r\n * @private \r\n * @param {string} event name that will be attached to the Element.\r\n * @param {function} callback JavaScript function to execute when the event is triggered.\r\n */\r\n function detachEvent(eventName, callback, passive) {\r\n var opts = getPassiveOptions(passive);\r\n\r\n if (document.removeEventListener) {\r\n this.removeEventListener(eventName, callback, opts);\r\n } else if (document.detachEvent) {\r\n this.detachEvent(eventName, callback, opts);\r\n }\r\n };\r\n\r\n Element.prototype.removeEventFromElement = detachEvent;\r\n Element.prototype.addEventToElement = attachEvent;\r\n\r\n Document.prototype.addEventToElement = attachEvent;\r\n Document.prototype.removeEventFromElement = detachEvent;\r\n\r\n /**\r\n * \r\n * Checks if an Element has a Parent with the given ID.\r\n * \r\n * @private \r\n * @param {string} id that will be searched in the parent nodes.\r\n */\r\n Element.prototype.hasParent = function (id) {\r\n if (this.id === id) {\r\n return true;\r\n }\r\n\r\n return this.parentNode && this.parentNode !== document.body && this.parentNode.hasParent(id);\r\n }\r\n\r\n /**\r\n * \r\n * Checks if an Element has a class associated.\r\n * \r\n * @private \r\n * @param {string} className that will be searched in the element.\r\n */\r\n Element.prototype.hasClass = function (className) {\r\n if (!this.classList) {\r\n return false;\r\n }\r\n\r\n return this.classList.contains(className);\r\n }\r\n\r\n if ((typeof window.CustomEvent === \"function\")) {\r\n var onClassListChange = new Event(\"onClassListChange\",\r\n {\r\n bubbles: true\r\n });\r\n\r\n\r\n Element.prototype.addClass = function (className) {\r\n if (this.hasClass(className)) {\r\n return true;\r\n }\r\n this.classList.add(className);\r\n this.dispatchEvent(onClassListChange);\r\n return this;\r\n }\r\n }\r\n\r\n Element.prototype.removeClass = function (className) {\r\n if (!this.hasClass(className)) {\r\n return true;\r\n }\r\n\r\n this.classList.remove(className);\r\n this.dispatchEvent(onClassListChange);\r\n return this;\r\n }\r\n\r\n Element.prototype.insertAfter = function (nodeToInsert) {\r\n this.parentNode.insertBefore(nodeToInsert, this.nextSibling);\r\n }\r\n /**\r\n * \r\n * Hides and element from the DOM.\r\n * \r\n * @private \r\n */\r\n Element.prototype.hide = function () {\r\n this.style.display = \"none\";\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * Displays and element from the DOM.\r\n * \r\n * @private \r\n */\r\n Element.prototype.show = function () {\r\n this.style.display = \"block\";\r\n return this;\r\n }\r\n\r\n /**\r\n * \r\n * Checks if an Element is visible.\r\n * \r\n * @private \r\n */\r\n Element.prototype.isVisible = function () {\r\n var style = window.getComputedStyle(this);\r\n\r\n return ((style.display !== \"none\") && (style.visibility !== \"hidden\")) ? true : false;\r\n };\r\n\r\n // Start of ticket BDR-17\r\n // NodeList.forEach Pollyfill\r\n if (!NodeList.prototype.forEach || !DOMTokenList.prototype.forEach) {\r\n var propertyName = \"forEach\";\r\n var forEach = function (callback) {\r\n if (typeof callback !== \"function\") {\r\n throw new TypeError(typeof callback + \" is not a function\");\r\n }\r\n var enumerable = this;\r\n var index = 0;\r\n for (index; index < enumerable.length; index++) {\r\n if (callback(enumerable[index], index, enumerable) === false) {\r\n break;\r\n }\r\n }\r\n };\r\n if (!NodeList.prototype.forEach) {\r\n Object.defineProperty(NodeList.prototype, propertyName, {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: forEach\r\n });\r\n }\r\n if (!DOMTokenList.prototype.forEach) {\r\n Object.defineProperty(DOMTokenList.prototype, propertyName, {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: forEach\r\n });\r\n }\r\n }\r\n\r\n if (!Node.prototype.replaceWith || !Element.prototype.replaceWith) {\r\n var replaceWith = function () {\r\n var currentElement = this;\r\n var parent = currentElement.parentNode;\r\n if (!parent) {\r\n return false;\r\n }\r\n //Remove myself if parameters are empty\r\n var length = arguments.length;\r\n if (!length) {\r\n return parent.removeChild(currentElement);\r\n }\r\n var index = 0;\r\n var currentNode;\r\n for (index; index < length; index++) {\r\n currentNode = arguments[index];\r\n if (typeof currentNode !== 'object') {\r\n currentNode = document.createTextNode(currentNode);\r\n } else if (currentNode.parentNode) {\r\n currentNode.parentNode.removeChild(currentNode);\r\n }\r\n if (index === length - 1) {\r\n parent.replaceChild(currentNode, currentElement);\r\n } else {\r\n parent.insertBefore(currentNode, currentElement);\r\n }\r\n }\r\n };\r\n if (!Element.prototype.replaceWith) {\r\n Object.defineProperty(Element.prototype, 'replaceWith', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: replaceWith\r\n });\r\n }\r\n if (!Node.prototype.replaceWith) {\r\n Object.defineProperty(Node.prototype, 'replaceWith', {\r\n enumerable: false,\r\n configurable: false,\r\n writable: false,\r\n value: replaceWith\r\n });\r\n }\r\n }\r\n //End of ticket BDR-17 \r\n});\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('ajaxHelper',[],\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 });\n","define('saveToFavorites',['routes', 'ajaxHelper', 'loadCss'], (routes, ajaxHelper, loadCss) => {\r\n // \"use strict\"; TODO Fix issues when using strict mode\r\n const partnerElement = document.getElementsByClassName('brand-logo');\r\n let partnerUrl = '';\r\n const modalCss = document.querySelector('#modalCss');\r\n const pendingItemsFromMail = document.cookie.match(new RegExp('TemporalFavoritesCookie_[0-9]=([^;]+)'));\r\n let mailFavorites = pendingItemsFromMail ? pendingItemsFromMail[1] : null;\r\n\r\n if (partnerElement && partnerElement.length > 0) {\r\n partnerUrl = partnerElement[0].href;\r\n }\r\n\r\n function isSignedIn() {\r\n const signInElement = document.querySelector('.nav__main .nhs_GlobalNavSignInUser');\r\n if (!signInElement) {\r\n return false;\r\n }\r\n\r\n return !signInElement.hasAttribute('data-sign-in');\r\n }\r\n\r\n const tryGetClosestButton = function (elem) {\r\n while (elem && elem.tagName !== 'BUTTON' && elem.tagName !== 'BODY') {\r\n elem = elem.parentElement;\r\n }\r\n\r\n return !elem || elem.tagName === 'BODY' ? undefined : elem;\r\n };\r\n\r\n const logSegmentEvent = function (segmentEvent, type, id) {\r\n const commonProperties = document.querySelector('#data-commonProperties_' + id);\r\n\r\n let eventForSegment = {\r\n event: segmentEvent,\r\n eventType: 'segmentEvent',\r\n home_id: type === 'HomePlan' ? id : null,\r\n spec_id: type === 'HomeSpec' ? id : null\r\n };\r\n\r\n if (type === 'Community') {\r\n eventForSegment.community_id = id;\r\n }\r\n\r\n if (commonProperties && commonProperties.dataset) {\r\n eventForSegment = Object.assign(eventForSegment, commonProperties.dataset);\r\n delete eventForSegment.button_action;\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\r\n const logTdvEvent = function (properties) {\r\n const eventForTdv = properties;\r\n eventForTdv.eventType = 'tdvEvent';\r\n document.body.dispatchEvent &&\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: eventForTdv }\r\n }));\r\n };\r\n\r\n const removeFromCookie = function (items, id) {\r\n const itemIndex = items.map((item) => JSON.parse(item).id).indexOf(id);\r\n\r\n if (itemIndex >= 0) {\r\n items.splice(itemIndex, 1);\r\n const cookie = [\r\n 'pendingSaveItem', '=', JSON.stringify(items), '; domain=.', window.location.host.toString(), '; path=/;'\r\n ].join('');\r\n document.cookie = cookie;\r\n }\r\n\r\n return itemIndex >= 0;\r\n };\r\n\r\n /**\r\n * @private\r\n * showLogInForSaveToFavorites: propmts a modal asking the user to log in in order to save more favorites.\r\n *\r\n * @param {HTML} element to grab the login url from\r\n */\r\n const showLogInForSaveToFavorites = function (element) {\r\n require(\r\n ['handlerAuth0'],\r\n (handlerAuth0) => {\r\n const options = {\r\n afterLogin() {\r\n performSave(\r\n element,\r\n element.dataset.url,\r\n element.dataset.category,\r\n element.dataset.type,\r\n element.dataset.id,\r\n element.dataset.url,\r\n element.dataset.name\r\n );\r\n }\r\n };\r\n handlerAuth0.init(options);\r\n }\r\n );\r\n };\r\n\r\n const temporalSaveToFavorites = function () {\r\n 'use strict';\r\n\r\n const pendingItems = document.cookie.match(new RegExp('pendingSaveItem=([^;]+)'));\r\n const temporalSavedItems = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n const totalFavoritesSaved = document.querySelector('[data-total-favorites]');\r\n const isLoggedIn = isSignedIn();\r\n\r\n if (removeFromCookie(temporalSavedItems, this.dataset.id) && isLoggedIn) {\r\n updateStylesToUnsaved(this);\r\n }\r\n\r\n temporalSavedItems.push(JSON.stringify({\r\n element: this.id,\r\n category: this.dataset.category,\r\n type: this.dataset.type,\r\n id: this.dataset.id,\r\n url: this.dataset.url,\r\n name: this.dataset.name,\r\n dataset: this.dataset\r\n }));\r\n\r\n const cookie = [\r\n 'pendingSaveItem', '=', JSON.stringify(temporalSavedItems), '; domain=.', window.location.host.toString(),\r\n '; path=/;'\r\n ].join('');\r\n document.cookie = cookie;\r\n\r\n showLogInForSaveToFavorites(this);\r\n\r\n document.body.dispatchEvent(new CustomEvent('customEventForSavedElements'));\r\n };\r\n\r\n const updateStylesToSaved = function (saveToFavoritesElement, id, parsedData) {\r\n const sharedKey = saveToFavoritesElement && saveToFavoritesElement.firstElementChild && saveToFavoritesElement.firstElementChild.children[1] ? saveToFavoritesElement.firstElementChild.children[1].getAttribute('data-shared') : null;\r\n const nextSharedKey = saveToFavoritesElement && saveToFavoritesElement.firstElementChild && saveToFavoritesElement.firstElementChild.children[0] ? saveToFavoritesElement.firstElementChild.children[0].getAttribute('data-shared') : null;\r\n\r\n if (saveToFavoritesElement.firstElementChild && saveToFavoritesElement.firstElementChild.children[0] && saveToFavoritesElement.firstElementChild.children[1]) {\r\n saveToFavoritesElement.firstElementChild.children[1].hide();\r\n saveToFavoritesElement.firstElementChild.children[0].show();\r\n }\r\n\r\n const saveToFavsElements = document.querySelectorAll('[data-id=\"' + id + '\"]');\r\n for (let i = 0; i < saveToFavsElements.length; i += 1) {\r\n if (saveToFavsElements[i].firstElementChild &&\r\n saveToFavsElements[i].firstElementChild.children[0] &&\r\n saveToFavsElements[i].firstElementChild.children[1]) {\r\n saveToFavsElements[i].firstElementChild.children[1].hide();\r\n saveToFavsElements[i].firstElementChild.children[0].show();\r\n }\r\n if (saveToFavsElements[i].firstElementChild && saveToFavsElements[i].firstElementChild.children[0]) {\r\n saveToFavsElements[i].firstElementChild.children[0].setAttribute('data-favoriteid', parsedData.Id);\r\n saveToFavsElements[i].setAttribute('data-favoriteid', parsedData.Id);\r\n }\r\n }\r\n\r\n if (sharedKey) {\r\n const twinElement = document.querySelectorAll(\"path[data-shared='\" + sharedKey + \"']\");\r\n\r\n if (twinElement) {\r\n for (let elementIndex = 0; elementIndex < twinElement.length; elementIndex += 1) {\r\n const element = twinElement[elementIndex];\r\n\r\n if (element) {\r\n element.hide();\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (nextSharedKey) {\r\n const nextTwinElement = document.querySelectorAll(\"path[data-shared='\" + nextSharedKey + \"']\");\r\n\r\n if (nextTwinElement) {\r\n for (let nextElementIndex = 0; nextElementIndex < nextTwinElement.length; nextElementIndex += 1) {\r\n const nextElement = nextTwinElement[nextElementIndex];\r\n\r\n if (nextElement) {\r\n nextElement.setAttribute('data-favoriteid', parsedData.Id);\r\n nextElement.show();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 55+ Result title fav\r\n const ffpResult = document.querySelector(\".nhs_CommResItem[data-id^='\" + id + \"']\");\r\n if (ffpResult) {\r\n const title = ffpResult.querySelector(\"h3[itemprop='name']\");\r\n if (!title.querySelector('span.ir.nhs_Saved')) {\r\n const favIcon = document.createRange().createContextualFragment(\"Saved\");\r\n title.insertBefore(favIcon, title.firstChild);\r\n const parent = self.currentItem.parentElement;\r\n if (parent) {\r\n parent.querySelector('.nhs_Saved').style.display = '';\r\n self.currentItem.style.display = 'none';\r\n }\r\n }\r\n }\r\n };\r\n\r\n var updateStylesToUnsaved = function (saveToFavoritesElement) {\r\n const sharedKey = saveToFavoritesElement && saveToFavoritesElement.firstElementChild ? saveToFavoritesElement.firstElementChild.children[1].getAttribute('data-shared') : null;\r\n const nextSharedKey = saveToFavoritesElement && saveToFavoritesElement.firstElementChild ? saveToFavoritesElement.firstElementChild.children[0].getAttribute('data-shared') : null;\r\n\r\n if (saveToFavoritesElement.firstElementChild && saveToFavoritesElement.firstElementChild.children[0] && saveToFavoritesElement.firstElementChild.children[1]) {\r\n saveToFavoritesElement.firstElementChild.children[0].hide();\r\n saveToFavoritesElement.firstElementChild.children[1].show();\r\n }\r\n\r\n const saveToFavsElements = document.querySelectorAll('[data-save-element]');\r\n for (let i = 0; i < saveToFavsElements.length; i += 1) {\r\n const savedIconElement = saveToFavsElements[i].firstElementChild ? saveToFavsElements[i].firstElementChild.children[0] : undefined;\r\n const unsavedIconElement = saveToFavsElements[i].firstElementChild ? saveToFavsElements[i].firstElementChild.children[1] : undefined;\r\n if (savedIconElement &&\r\n unsavedIconElement &&\r\n savedIconElement.dataset.id == saveToFavoritesElement.dataset.id) {\r\n savedIconElement.hide();\r\n unsavedIconElement.show();\r\n saveToFavsElements[i].removeAttribute('data-favid');\r\n }\r\n }\r\n\r\n saveToFavoritesElement.removeAttribute('data-favid');\r\n document.body.dispatchEvent(new CustomEvent('customEventForUnsavedElements'));\r\n\r\n if (sharedKey) {\r\n const twinElement = document.querySelectorAll(\"path[data-shared='\" + sharedKey + \"']\");\r\n\r\n if (twinElement) {\r\n for (let elementIndex = 0; elementIndex < twinElement.length; elementIndex += 1) {\r\n const element = twinElement[elementIndex];\r\n\r\n if (element) {\r\n element.show();\r\n element.removeAttribute('data-favid');\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (nextSharedKey) {\r\n const nextTwinElement = document.querySelectorAll(\"path[data-shared='\" + nextSharedKey + \"']\");\r\n\r\n if (nextTwinElement) {\r\n for (let nextElementIndex = 0; nextElementIndex < nextTwinElement.length; nextElementIndex += 1) {\r\n const nextElement = nextTwinElement[nextElementIndex];\r\n\r\n if (nextElement) {\r\n nextElement.hide();\r\n }\r\n }\r\n }\r\n }\r\n\r\n // 55+ Result title fav\r\n const id = saveToFavoritesElement.id.match(/\\d+$/gmi);\r\n const ffpResult = document.querySelector(\".nhs_CommResItem[data-id^='\" + id + \"']\");\r\n if (ffpResult) {\r\n const title = ffpResult.querySelector(\"h3[itemprop='name']\");\r\n const favIcon = title.querySelector('.ir.nhs_Saved');\r\n title.removeChild(favIcon);\r\n const parent = self.currentItem.parentElement;\r\n if (parent) {\r\n self.currentItem.style.display = 'none';\r\n parent.querySelector('.nhs_Save').style.display = '';\r\n }\r\n }\r\n };\r\n\r\n var performSave = function (saveToFavoritesElement, link, category, type, id, url, name) {\r\n const self = this;\r\n self.currentItem = saveToFavoritesElement;\r\n ajaxHelper.postRequest(partnerUrl + routes.saveToFavoritesMobile, {\r\n data: {\r\n Type: type,\r\n Id: id,\r\n FavoriteUrl: url,\r\n Title: name\r\n },\r\n abort: false,\r\n success(data) {\r\n const isHtmlElement = self.currentItem instanceof HTMLElement;\r\n const parsedData = JSON.parse(data);\r\n if (!parsedData.Saved) { return; }\r\n\r\n if (isHtmlElement === true) {\r\n self.currentItem.setAttribute('data-favoriteid', parsedData.Id);\r\n }\r\n\r\n logSegmentEvent((type === 'HomePlan' || type === 'HomeSpec') ? 'Home Saved' : 'Community Saved', type, id);\r\n document.body.dispatchEvent(new CustomEvent('customEventForSavedElements'));\r\n\r\n // element is the dom element that contain data attributes to get data in persona.js\r\n let element = isHtmlElement ? saveToFavoritesElement.querySelector('path:not([data-remove-local-storage=\"True\"])') : null;\r\n if (!element) {\r\n element = {\r\n dataset: saveToFavoritesElement.dataset\r\n };\r\n }\r\n document.body.dispatchEvent &&\r\n document.body.dispatchEvent(new CustomEvent('trackIdentifySaveItems', {\r\n detail: { data: element }\r\n }));\r\n\r\n if (isHtmlElement === true) {\r\n updateStylesToSaved(saveToFavoritesElement, id, parsedData);\r\n }\r\n },\r\n requestHeaders: [{\r\n name: 'Content-Type',\r\n value: 'application/json'\r\n }]\r\n });\r\n };\r\n\r\n const performDelete = function (saveToFavoritesElement, elementId) {\r\n const self = this;\r\n self.currentItem = saveToFavoritesElement;\r\n\r\n const dataToSend = {\r\n id: parseInt(elementId) || parseInt(self.currentItem.getAttribute('data-favid'))\r\n };\r\n\r\n ajaxHelper.postRequest(partnerUrl + routes.deleteFromFavoritesMobile, {\r\n data: dataToSend,\r\n abort: true,\r\n success(data) {\r\n const parsedData = JSON.parse(data);\r\n if (!parsedData.Saved) { return; }\r\n\r\n const element = saveToFavoritesElement.querySelector('path:not([style*=\"display:none\"]):not([style*=\"display: none\"])');\r\n document.body.dispatchEvent &&\r\n document.body.dispatchEvent(new CustomEvent('trackIdentifySaveItems', {\r\n detail: { data: element }\r\n }));\r\n updateStylesToUnsaved(saveToFavoritesElement);\r\n },\r\n requestHeaders: [{\r\n name: 'Content-Type',\r\n value: 'application/json'\r\n }]\r\n });\r\n };\r\n\r\n const deleteFromFavorites = function (element) {\r\n const is_SignedIn = isSignedIn();\r\n delete element.dataset.event;\r\n if (is_SignedIn) {\r\n if (element.firstElementChild &&\r\n element.firstElementChild.children[0] &&\r\n element.firstElementChild.children[0].dataset.favoriteid) {\r\n performDelete(element, element.firstElementChild.children[0].dataset.favoriteid);\r\n } else if (element) {\r\n const id = element.dataset.favoriteid ||\r\n Number(element.dataset.favid) ||\r\n Number(element.dataset.element.replace('nhs_SaveItem', ''));\r\n performDelete(element, id);\r\n }\r\n } else {\r\n temporalSaveToFavorites.apply(element);\r\n }\r\n };\r\n\r\n const saveToFavorites = function (element) {\r\n const is_SignedIn = isSignedIn();\r\n element.dataset.event = 'true';\r\n const type = element.dataset.type;\r\n logSegmentEvent((type === 'HomePlan' || type === 'HomeSpec') ? 'Home Favorited' : 'Community Favorited', type, element.dataset.id);\r\n if (is_SignedIn) {\r\n performSave(\r\n element,\r\n element.dataset.url,\r\n element.dataset.category,\r\n element.dataset.type,\r\n element.dataset.id,\r\n element.dataset.url,\r\n element.dataset.name\r\n );\r\n } else {\r\n temporalSaveToFavorites.apply(element);\r\n }\r\n\r\n const tdvProperties = {\r\n community: element.dataset.id,\r\n market: NewHomeSource.Modules.tagManager.getFromDataLayer('marketId'),\r\n label: (type === 'HomePlan' || type === 'HomeSpec') ? 'SAVETOFAV_HR' : 'SAVETOFAV_CR'\r\n };\r\n logTdvEvent(tdvProperties);\r\n };\r\n\r\n const saveToFavoritesHandler = function (event) {\r\n let elm = event.target || event.srcElement;\r\n if (elm.tagName !== 'BUTTON') {\r\n elm = tryGetClosestButton(elm);\r\n }\r\n\r\n if (!elm) {\r\n return;\r\n }\r\n\r\n if (elm.classList.contains('nhs_SavedListing') || elm.dataset.favoritesButton === 'true') {\r\n const modalCss = document.querySelector('#modalCss');\r\n loadCss(modalCss.value);\r\n if (elm.firstElementChild.children[1] && elm.firstElementChild.children[1].style.display == 'block' || elm.classList.contains('nhs_Save')) {\r\n saveToFavorites(elm);\r\n } else if (elm.firstElementChild.children[1] && elm.firstElementChild.children[1].style.display == 'none' || elm.classList.contains('nhs_Saved')) {\r\n deleteFromFavorites(elm);\r\n }\r\n } else if (elm.classList.contains('nhs_Save')) {\r\n saveToFavorites(elm);\r\n } else if (elm.classList.contains('nhs_SavedListing') || elm.classList.contains('nhs_Saved')) {\r\n deleteFromFavorites(elm);\r\n }\r\n };\r\n\r\n const updateSavesWhenLoggedIn = function () {\r\n let saveFavoritesList = document.getElementsByClassName('nhs_SavedListing');\r\n const saveFavoritesIds = [];\r\n let isFfplus = false;\r\n\r\n if (saveFavoritesList.length === 0) { // 55+ SRP does not have this kind of elements, so let's try with 55+ results\r\n const _saveFavoritesList = Array.from(document.querySelectorAll('.nhs_ResItem.nhs_CommResItem.clearfix.nhs_Row[data-id]'));\r\n if (_saveFavoritesList.length > 0) {\r\n isFfplus = true;\r\n saveFavoritesList = _saveFavoritesList;\r\n }\r\n }\r\n let counter;\r\n if (!isFfplus) {\r\n for (counter = 0; counter < saveFavoritesList.length; counter++) {\r\n saveFavoritesIds.push(saveFavoritesList[counter].dataset.id);\r\n }\r\n } else {\r\n for (counter = 0; counter < saveFavoritesList.length; counter++) {\r\n saveFavoritesIds.push(saveFavoritesList[counter].dataset.id.split('-')[0]);\r\n }\r\n }\r\n\r\n const pendingItems = document.cookie.match(new RegExp('pendingSaveItem=([^;]+)'));\r\n const cookieFavorites = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n\r\n if (cookieFavorites) {\r\n for (let index = cookieFavorites.length - 1; index >= 0; index -= 1) {\r\n const favoriteString = cookieFavorites[index];\r\n const favoriteObject = JSON.parse(favoriteString);\r\n const saveElements = document.querySelectorAll('#' + favoriteObject.element);\r\n\r\n for (const element of saveElements) {\r\n updateStylesToSaved(element.dataset.category, favoriteObject.id, 0, element);\r\n }\r\n\r\n removeFromCookie(cookieFavorites, favoriteObject.id);\r\n let elementToLog = document.querySelector(`[data-id=\"${favoriteObject.id}\"]`) || null;\r\n if (!elementToLog) {\r\n elementToLog = {\r\n dataset: favoriteObject.dataset\r\n };\r\n }\r\n\r\n performSave(\r\n elementToLog,\r\n favoriteObject.url,\r\n favoriteObject.category,\r\n favoriteObject.type,\r\n favoriteObject.id,\r\n favoriteObject.url,\r\n favoriteObject.name\r\n );\r\n }\r\n }\r\n\r\n ajaxHelper.postRequest(partnerUrl + routes.checkSaveToFavoritesMobile, {\r\n data: {\r\n listingIds: saveFavoritesIds\r\n },\r\n success(data) {\r\n const parsedData = JSON.parse(data);\r\n\r\n if (!(parsedData !== null && parsedData.ListOfIds.length > 0)) { return; }\r\n let counter;\r\n if (!isFfplus) {\r\n const currentElement = document.querySelectorAll('.nhs_SavedListing');\r\n for (counter = 0; counter < parsedData.ListOfIds.length; counter++) {\r\n let counterElement = 0;\r\n while (counterElement < currentElement.length) {\r\n if (currentElement.length > 0 && currentElement[counterElement].firstElementChild) {\r\n if (currentElement[counterElement].firstElementChild && currentElement[counterElement].firstElementChild.children[0] && parseInt(currentElement[counterElement].firstElementChild.children[0].dataset.id) == parsedData.ListOfIds[counter]) {\r\n currentElement[counterElement].firstElementChild.children[0].show();\r\n currentElement[counterElement].firstElementChild.children[1].hide();\r\n currentElement[counterElement].setAttribute('data-favid', parsedData.ListOfSaved[counter]);\r\n }\r\n }\r\n counterElement++;\r\n }\r\n }\r\n } else {\r\n for (counter = 0; counter < parsedData.ListOfIds.length; counter++) {\r\n const _id = parsedData.ListOfIds[counter];\r\n const ffpResult = document.querySelector(\".nhs_CommResItem[data-id^='\" + _id + \"']\");\r\n if (ffpResult) {\r\n const title = ffpResult.querySelector(\"h3[itemprop='name']\");\r\n if (!title.querySelector('span.ir.nhs_Saved')) {\r\n const favIcon = document.createRange().createContextualFragment(\"Saved\");\r\n title.insertBefore(favIcon, title.firstChild);\r\n }\r\n }\r\n }\r\n }\r\n },\r\n requestHeaders: [{\r\n name: 'Content-Type',\r\n value: 'application/json'\r\n }]\r\n });\r\n };\r\n\r\n const updateSavesWhenLoggedOut = function () {\r\n let saveFavoritesList = document.getElementsByClassName('nhs_SavedListing ');\r\n\r\n let isFfplus = false;\r\n if (saveFavoritesList.length === 0) { // 55+ SRP does not have this kind of elements, so let's try with 55+ results\r\n const _saveFavoritesList = Array.from(document.querySelectorAll('.nhs_ResItem.nhs_CommResItem.clearfix.nhs_Row[data-id]'));\r\n if (_saveFavoritesList.length > 0) {\r\n isFfplus = true;\r\n saveFavoritesList = _saveFavoritesList;\r\n }\r\n }\r\n let counter;\r\n if (!isFfplus) {\r\n for (counter = 0; counter < saveFavoritesList.length; counter++) {\r\n const currentElement = saveFavoritesList[counter];\r\n if (currentElement.firstElementChild) {\r\n currentElement.firstElementChild.children[0].hide();\r\n currentElement.firstElementChild.children[1].show();\r\n }\r\n currentElement.removeAttribute('data-favid');\r\n }\r\n } else {\r\n for (counter = 0; counter < saveFavoritesList.length; counter++) {\r\n const ffpResult = saveFavoritesList[counter];\r\n if (ffpResult) {\r\n const title = ffpResult.querySelector(\"h3[itemprop='name']\");\r\n const favIcon = title.querySelector('.ir.nhs_Saved');\r\n if (favIcon) {\r\n title.removeChild(favIcon);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Used to determine if an user has pending items\r\n * @returns a boolean value\r\n */\r\n const userHasPendingItems = function () {\r\n const pendingItems = document.cookie.match(new RegExp('pendingSaveItem=([^;]+)'));\r\n return !!pendingItems;\r\n };\r\n\r\n const init = function () {\r\n document.body.addEventListener('click', saveToFavoritesHandler);\r\n document.addEventListener('updateSavesWhenLoggedIn', updateSavesWhenLoggedIn);\r\n document.addEventListener('updateSavesWhenLoggedOut', updateSavesWhenLoggedOut);\r\n\r\n const isUserSignedIn = isSignedIn();\r\n const pendingItems = userHasPendingItems();\r\n\r\n if (isUserSignedIn && pendingItems) {\r\n updateSavesWhenLoggedIn();\r\n }\r\n };\r\n\r\n /**\r\n * @private\r\n * handleEmailFavorites: considers favorites comming from email and concats them to the cookie that handles favorites from navigation.\r\n */\r\n const handleEmailFavorites = function () {\r\n const pendingItems = document.cookie.match(new RegExp('pendingSaveItem=([^;]+)'));\r\n const cookieFavorites = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n\r\n if (mailFavorites && cookieFavorites.toString().indexOf(JSON.parse(mailFavorites).id) === -1) {\r\n const topSaveElement = document.querySelector('[data-save-element]');\r\n\r\n if (cookieFavorites.length > 0) {\r\n loadCss(modalCss.value);\r\n showLogInForSaveToFavorites(topSaveElement);\r\n return;\r\n }\r\n\r\n showTemporalSaveToolTip(JSON.parse(mailFavorites).id, cookieFavorites, topSaveElement);\r\n cookieFavorites.push(mailFavorites);\r\n\r\n const cookie = [\r\n 'pendingSaveItem', '=', JSON.stringify(cookieFavorites), '; domain=.', window.location.host.toString(),\r\n '; path=/;'\r\n ].join('');\r\n document.cookie = cookie;\r\n\r\n mailFavorites = null;\r\n }\r\n };\r\n\r\n handleEmailFavorites();\r\n\r\n return {\r\n init\r\n };\r\n});\r\n\n","/**\r\n * @module\r\n */\r\ndefine('Favorites',[\"ajaxHelper\", \"windowModal\"], function (ajax) {\r\n var signIn;\r\n var res;\r\n /**\r\n * Creates a Favorites instance\r\n * @constructor\r\n * @param {*} params Page parameters\r\n */\r\n var Favorites = function (params) {\r\n /**\r\n * @property {*} params Page parameters\r\n */\r\n this.params = params;\r\n };\r\n\r\n /**\r\n * Initializes the Favorites functionality\r\n * @method\r\n */\r\n Favorites.prototype.init = function () {\r\n var instance = this;\r\n const pendingItems = document.cookie.match(new RegExp(\"pendingSaveItem=([^;]+)\"));\r\n var cookieFavorites = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n const isLoggedIn = document.querySelector('[data-isloggedin=\"True\"]');\r\n\r\n if (cookieFavorites) {\r\n for (let index = cookieFavorites.length - 1; index >= 0; index -= 1) {\r\n const favoriteString = cookieFavorites[index];\r\n const favoriteObject = JSON.parse(favoriteString);\r\n const saveElements = document.querySelectorAll(\"#\" + favoriteObject.element);\r\n\r\n if (isLoggedIn) {\r\n for (let element of saveElements) {\r\n Favorites.prototype.updateStylesToSaved(element.dataset.category, favoriteObject.id, element);\r\n }\r\n\r\n let element = document.querySelector(\"#\" + favoriteObject.element);\r\n if (!element) {\r\n element = {\r\n dataset : favoriteObject.dataset\r\n }\r\n }\r\n instance.removeFromCookie(cookieFavorites, favoriteObject.id);\r\n instance.saveToFavs(element, favoriteObject.category, favoriteObject.type, favoriteObject.id, favoriteObject.url, favoriteObject.name);\r\n }\r\n }\r\n }\r\n\r\n // On Click Save to Favorites\r\n var favUnsaveHandler = function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if (this.classList.contains(\"nhs_favLogin\")) {\r\n return false;\r\n }\r\n\r\n instance.saveToFavs(this, this.dataset.category, this.dataset.type, this.dataset.id, this.dataset.url, this.dataset.name);\r\n return false;\r\n };\r\n Array.from(document.querySelectorAll(\".nhs_favUnsave, .nhs_nbyFavUnsave\")).forEach(function (favUnsave) {\r\n favUnsave.addEventListener(\"click\", favUnsaveHandler);\r\n favUnsave.classList.add(\"nhs_noLink\");\r\n });\r\n\r\n var favSavedHandler = function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n var link = this;\r\n var category = this.dataset.category;\r\n\r\n if (link.classList.contains(\"nhs_favLogin\")) {\r\n Favorites.prototype.updateStylesToUnsaved(category, link);\r\n return;\r\n }\r\n\r\n ajax.request({\r\n type: \"POST\",\r\n url: instance.params.urlBase + \"/favorites/delete\",\r\n data: {\r\n id: this.dataset.favid\r\n },\r\n success: function (data) {\r\n if (!data.Saved) return;\r\n\r\n Favorites.prototype.updateStylesToUnsaved(category, link);\r\n document.body.dispatchEvent &&\r\n document.body.dispatchEvent(new CustomEvent(\"trackIdentifySaveItems\", {\r\n detail: { data: link }\r\n }));\r\n }\r\n });\r\n return false;\r\n };\r\n\r\n Array.from(document.querySelectorAll(\".nhs_favSaved, .nhs_nbyFavUnsaved\")).forEach(function (favSaved) {\r\n favSaved.addEventListener(\"click\", favSavedHandler);\r\n favSaved.classList.add(\"nhs_noLink\");\r\n });\r\n\r\n var mouseDownHandler = function (event) {\r\n Favorites.prototype.temporalSaveToFavorites.call(this, event);\r\n };\r\n\r\n Array.from(document.querySelectorAll(\".nhs_favLogin\")).forEach(function (favLogin) {\r\n favLogin.addEventListener((dataLayer[0].adaptiveTemplate === \"M\") ? \"click\" : \"mousedown\", mouseDownHandler);\r\n favLogin.classList.add(\"nhs_noLink\");\r\n });\r\n\r\n // Save property when param is presented (after login)\r\n if (location.search.toLowerCase().indexOf(\"addtoprofile=true\") > -1) {\r\n var favUnsave = document.querySelector(\".nhs_favUnsave, .nhs_nbyFavUnsave\");\r\n if (favUnsave) {\r\n favUnsave.click();\r\n }\r\n\r\n var url = document.location.href;\r\n var urlparts = url.split(\"?\");\r\n\r\n if (urlparts.length >= 2) {\r\n var urlBase = urlparts.shift();\r\n var queryString = urlparts.join(\"?\");\r\n var prefix = encodeURIComponent(\"addtoprofile\") + \"=\";\r\n var pars = queryString.split(/[&;]/g);\r\n\r\n for (var i = pars.length; i-- > 0;) {\r\n if (pars[i].lastIndexOf(prefix, 0) !== -1) {\r\n pars.splice(i, 1);\r\n }\r\n }\r\n\r\n url = urlBase + \"?\" + pars.join(\"&\");\r\n }\r\n\r\n window.history.replaceState({}, document.title, url);\r\n }\r\n\r\n\r\n if (dataLayer[0].adaptiveTemplate === \"M\") {\r\n\r\n document.addEventListener(\"updateSavesWhenLoggedIn\",\r\n function () {\r\n var onResLoaded = function () {\r\n const pendingItems = document.cookie.match(new RegExp(\"pendingSaveItem=([^;]+)\"));\r\n var cookieFavorites = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n\r\n if (cookieFavorites) {\r\n for (let index = cookieFavorites.length - 1; index >= 0; index -= 1) {\r\n const favoriteString = cookieFavorites[index];\r\n const favoriteObject = JSON.parse(favoriteString);\r\n let element = document.querySelector(\"#\" + favoriteObject.element);\r\n instance.removeFromCookie(cookieFavorites, favoriteObject.id);\r\n instance.saveToFavs(element,\r\n favoriteObject.category,\r\n favoriteObject.type,\r\n favoriteObject.id,\r\n favoriteObject.url,\r\n favoriteObject.name);\r\n }\r\n };\r\n\r\n var element = document.querySelector(\"[id^=nhs_SaveItem]\"); \r\n ajax.request({\r\n type: \"POST\",\r\n url: instance.params.urlBase + \"/favorites/isSavedToFavorites\",\r\n data: {\r\n id: element.dataset.id,\r\n type: element.dataset.type\r\n },\r\n success: function(data) {\r\n if (!data) return;\r\n\r\n if (data.result) {\r\n Favorites.prototype.updateStylesToSaved(element.dataset.type.toLowerCase(), data, null);\r\n }\r\n }\r\n });\r\n }\r\n\r\n const saveElements = document.querySelectorAll(\"[id^=nhs_SaveItem], [id^=nhs_SavedItem]\");\r\n\r\n for (let element of saveElements) {\r\n element.classList.remove(\"nhs_favLogin\");\r\n }\r\n\r\n if (!res) {\r\n require([\"i18n!nls/res\"],\r\n function (_res) {\r\n res = _res;\r\n onResLoaded();\r\n });\r\n } else {\r\n onResLoaded();\r\n }\r\n });\r\n document.addEventListener(\"updateSavesWhenLoggedOut\",\r\n function () {\r\n var saveButtons = document.querySelectorAll(\"[id^=nhs_SaveItem], [id^=nhs_SavedItem]\");\r\n\r\n for (let button of saveButtons) {\r\n button.classList.add(\"nhs_favLogin\");\r\n Favorites.prototype.updateStylesToUnsaved(button.dataset.category, button);\r\n }\r\n });\r\n };\r\n };\r\n\r\n Favorites.prototype.removeFromCookie = function (items, id) {\r\n const itemIndex = items.map(function (item) { return JSON.parse(item).id; }).indexOf(id);\r\n\r\n if (itemIndex >= 0) {\r\n items.splice(itemIndex, 1);\r\n const cookie = [\"pendingSaveItem\", '=', JSON.stringify(items), '; domain=.', window.location.host.toString(), '; path=/;'].join('');\r\n document.cookie = cookie;\r\n }\r\n\r\n return itemIndex >= 0;\r\n };\r\n\r\n Favorites.prototype.temporalSaveToFavorites = function (event) {\r\n const pendingItems = document.cookie.match(new RegExp(\"pendingSaveItem=([^;]+)\"));\r\n const temporalSavedItems = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n\r\n event.preventDefault();\r\n\r\n if (temporalSavedItems.length > 0) {\r\n require(['handlerAuth0'],\r\n function(handlerAuth0) {\r\n var options = {};\r\n handlerAuth0.init(options);\r\n });\r\n } else {\r\n temporalSavedItems.push(JSON.stringify({\r\n element: this.id,\r\n category: this.dataset.category,\r\n type: this.dataset.type,\r\n id: this.dataset.id,\r\n url: this.dataset.url,\r\n name: this.dataset.name,\r\n dataset: this.dataset\r\n }));\r\n\r\n const cookie = [\"pendingSaveItem\", '=', JSON.stringify(temporalSavedItems), '; domain=.', window.location.host.toString(), '; path=/;'].join('');\r\n document.cookie = cookie;\r\n }\r\n };\r\n\r\n Favorites.prototype.updateStylesToSaved = function (category, data, link) {\r\n if (category === \"\" || category === \"mainviewer\" || category === \"commheader\" || !link) { // not comm results\r\n Array.from(document.querySelectorAll(\".nhs_favSaved, .nhs_nbyFavUnsaved\")).forEach(function (favSaved) {\r\n favSaved.style.display = \"block\";\r\n favSaved.dataset.favid = data.Id;\r\n });\r\n\r\n Array.from(document.querySelectorAll(\".nhs_favUnsave, .nhs_nbyFavUnsave\")).forEach(function (favUnSaved) {\r\n favUnSaved.style.display = \"none\";\r\n favUnSaved.dataset.favid = data.Id;\r\n });\r\n return;\r\n }\r\n\r\n if (link && link instanceof HTMLElement) { // results pages \r\n const nextElement = link.parentElement.querySelector(\".nhs_favSaved, .nhs_nbyFavUnsaved\");\r\n\r\n if (nextElement) {\r\n nextElement.dataset.favid = data.Id;\r\n nextElement.style.display = \"block\";\r\n }\r\n\r\n link.style.display = \"none\";\r\n }\r\n },\r\n\r\n Favorites.prototype.updateStylesToUnsaved = function (category, link) {\r\n if (category === \"\" || category === \"mainviewer\" || category === \"commheader\") {\r\n Array.from(document.querySelectorAll(\".nhs_favSaved, .nhs_nbyFavUnsaved\")).forEach(function (favSaved) {\r\n favSaved.style.display = \"none\";\r\n favSaved.removeAttribute(\"data-favid\");\r\n });\r\n\r\n Array.from(document.querySelectorAll(\".nhs_favUnsave, .nhs_nbyFavUnsave\")).forEach(function (favSaved) {\r\n favSaved.style.display = \"block\";\r\n });\r\n\r\n return;\r\n }\r\n\r\n if (link) {\r\n link.style.display = \"none\";\r\n delete link.dataset.favid;\r\n\r\n if (link.previousElementSibling) {\r\n link.previousElementSibling.style.display = \"block\";\r\n }\r\n }\r\n };\r\n /**\r\n * Saves an element to favorites\r\n * @method\r\n * @param {String} link Link\r\n * @param {String} category Favorite category\r\n * @param {String} type Favorite type\r\n * @param {String} id Favorite id\r\n * @param {String} url Url\r\n * @param {String} name Favorite name\r\n */\r\n Favorites.prototype.saveToFavs = function (link, category, type, id, url, name) {\r\n var instance = this;\r\n\r\n if (typeof (instance.params.logInfo) === \"undefined\") {\r\n instance.params.logInfo = {\r\n marketId: instance.params.marketId,\r\n partnerId: instance.params.partnerId\r\n };\r\n\r\n if (category === \"homeresults\" && type === \"HomePlan\") {\r\n instance.params.logInfo.planId = id;\r\n } else if (category === \"homeresults\" && type === \"HomeSpec\") {\r\n instance.params.logInfo.specificationId = id;\r\n } else {\r\n instance.params.logInfo.communityId = id;\r\n }\r\n }\r\n\r\n instance.logEvents(category, type, id);\r\n\r\n ajax.request({\r\n type: \"POST\",\r\n url: instance.params.urlBase + \"/favorites/save\",\r\n data: {\r\n Type: type,\r\n Id: id,\r\n FavoriteUrl: url,\r\n Title: name\r\n },\r\n success: function (data) {\r\n if (!data.Saved) return;\r\n Favorites.prototype.updateStylesToSaved(category, data, link);\r\n document.body.dispatchEvent &&\r\n document.body.dispatchEvent(new CustomEvent(\"trackIdentifySaveItems\", {\r\n detail: { data: link }\r\n }));\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Logs events\r\n * @method\r\n * @param {String} category Favorite category\r\n * @param {String} type Favorite type\r\n * @param {String} id Favorite id\r\n */\r\n Favorites.prototype.logEvents = function (category, type, id) {\r\n var instance = this;\r\n var log = instance.params.logger || instance.params.logInfo;\r\n\r\n if (category === \"commheader\") {\r\n log.googlepush(\"Community Detail Events\", \"Community - Gallery\", \"Save to favorites\");\r\n log.logEventWithParameters(\"CDSTC\", instance.params.logInfo);\r\n } else if (category === \"commfooter\") {\r\n log.googlepush(\"Community Detail Events\", \"Community - Next Steps\", \"Save to favorites\");\r\n log.logEventWithParameters(\"CDNSSTF\", instance.params.logInfo);\r\n } else if (category === \"mpcheader\") {\r\n log.googlepush(\"Community Detail Events\", \"Master Plan Community - Header\", \"Save to favorites\");\r\n logger.logEventWithParameters(\"Save_Listing\", instance.params.logInfo);\r\n } else if (category === \"mpcfooter\") {\r\n log.googlepush(\"Community Detail Events\", \"Master Plan Community - Next Steps\", \"Save to favorites\");\r\n log.logEventWithParameters(\"Save_Listing\", instance.params.logInfo);\r\n } else if (category === \"homeheader\") {\r\n log.googlepush(\"Home Detail Events\", \"Home - Gallery\", \"Save to favorites\");\r\n log.logEventWithParameters(\"HOMSTC\", instance.params.logInfo);\r\n } else if (category === \"homefooter\") {\r\n log.googlepush(\"Home Detail Events\", \"Home - Next Steps\", \"Save to favorites\");\r\n log.logEventWithParameters(\"HDNSSTF\", instance.params.logInfo);\r\n } else if (category === \"mainviewer\") {\r\n log.googlepush(\"Image Viewer\", \"Image Viewer\", \"Image Viewer - Favorite\");\r\n if (type === \"Community\") {\r\n log.logEventWithParameters(\"CDSTC\", instance.params.logInfo);\r\n } else {\r\n log.logEventWithParameters(\"HOMSTC\", instance.params.logInfo);\r\n }\r\n } else if (category === \"homesgrid\") {\r\n var homeLogInfo = instance.params.logInfo;\r\n if (type === \"HomePlan\") {\r\n homeLogInfo.planId = id;\r\n } else if (type === \"HomeSpec\") {\r\n homeLogInfo.specId = id;\r\n }\r\n log.googlepush(\"Image Viewer\", \"Image Viewer\", \"Image Viewer - Homes Favorite\");\r\n log.logEventWithParameters(\"HOMSTC\", homeLogInfo);\r\n } else if (category === \"commresults\") {\r\n log.googlepush(\"Community Results Events\", \"Community Item\", \"Save to favorites\");\r\n log.googlepush(\"Search Events\", \"Search Results\", \"Favorite Community\");\r\n log.SetDataLayerPair(\"favoriteSaved\");\r\n log.logEventWithParameters(\"SAVETOFAV_CR\", instance.params.logInfo);\r\n } else if (category === \"homeresults\") {\r\n log.googlepush(\"Community Results Events\", \"Home Item\", \"Save to favorites\");\r\n log.logEventWithParameters(\"SAVETOFAV_HR\", instance.params.logInfo);\r\n } else if (category === \"builder\") {\r\n log.googlepush(\"Builder Showcase Events\", \"Builder Showcase\", \"Save to favorites\");\r\n log.logEventWithParameters(\"SAVETOFAV_BSC\", instance.params.logInfo);\r\n }\r\n };\r\n\r\n return Favorites;\r\n});\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 analyticsHelper to exists on the window object.\r\n define('analyticsHelper',[],\r\n () => {\r\n global.analyticsHelper = factory(global);\r\n return global.analyticsHelper;\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 analyticsHelper Module.\r\n global.analyticsHelper = factory(global);\r\n module.exports = global.analyticsHelper;\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.analyticsHelper = factory(global);\r\n }\r\n}(typeof window !== 'undefined' ? window : {}, (root) => {\r\n 'use strict';\r\n\r\n const CONFIGURATION = (function () {\r\n const constants = {\r\n nhsTrackingId: 'UA-40843711-4'\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 * Helper to get values from google analytics trackers.\r\n * For reference:\r\n * {@link https://developers.google.com/analytics/devguides/collection/analyticsjs/ga-object-methods-reference}.\r\n * @param {array} keys Key Values we want to get from the tracker.\r\n * @returns {object} values Object with key/values pairs containing the requested key values.\r\n */\r\n const getGoogleAnalyticsValues = function (keys) {\r\n const nhsTrackingId = CONFIGURATION.get('nhsTrackingId');\r\n\r\n const trackers = root.ga.getAll().filter((element) => element.get('trackingId') === nhsTrackingId);\r\n const values = {};\r\n\r\n for (let i = 0; i < trackers.length; i += 1) {\r\n for (let j = 0; j < keys.length; j += 1) {\r\n if (values[keys[j]]) {\r\n // eslint-disable-next-line no-continue\r\n continue;\r\n }\r\n\r\n values[keys[j]] = trackers[i].get(keys[j]);\r\n }\r\n }\r\n\r\n return values;\r\n };\r\n\r\n const addAnalyticsUrlParameters = function (urlToWork) {\r\n let url = urlToWork;\r\n const analyticsValues = getGoogleAnalyticsValues(['clientId', 'userId']);\r\n\r\n const gaClientId = analyticsValues.clientId !== undefined\r\n ? analyticsValues.clientId\r\n : '';\r\n const gaUserId = analyticsValues.userId !== undefined\r\n ? analyticsValues.userId\r\n : '';\r\n\r\n if (gaClientId) {\r\n url = url + '/GAClientId-' + gaClientId;\r\n }\r\n\r\n if (gaUserId) {\r\n url = url + '/GAUserId-' + gaUserId;\r\n }\r\n\r\n return url;\r\n };\r\n\r\n return {\r\n addAnalyticsUrlParameters,\r\n getGoogleAnalyticsValues\r\n };\r\n}));\r\n\n","(function (global, factory) {\r\n \"use strict\";\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.\r\n define('performanceEventsQueue',[], function () {\r\n return (global.performanceEventsQueue = 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\r\n module.exports = (global.performanceEventsQueue = 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.performanceEventsQueue = factory(global);\r\n }\r\n})(\"undefined\" !== typeof window ? window : {}, function (root) {\r\n /*\r\n * This queue is going to hold all the urls that needs GA values before GA has been downloaded by the browser\r\n */\r\n var eventsQueue = [];\r\n /*\r\n * This module exposes a function for queuing to the eventsQueue property\r\n */\r\n var enqueueEvent = function (url) {\r\n if (eventsQueue) {\r\n eventsQueue.push(url);\r\n }\r\n };\r\n /*\r\n * This function takes the values from GA and fires the logging of all the queued events considering these values as part of the request\r\n */\r\n function fireEvents() {\r\n if (eventsQueue.length > 0 && typeof (ga) === \"function\") {\r\n ga(function() {\r\n var urlWithGaValues = analyticsHelper.addAnalyticsUrlParameters(\"\");\r\n for (var i = eventsQueue.length - 1; i >= 0; i--) {\r\n var url = eventsQueue.pop();\r\n var xhr = new XMLHttpRequest();\r\n var indexOfQueryString = url.indexOf(\"?\");\r\n if (indexOfQueryString === -1) {\r\n url = url + urlWithGaValues;\r\n } else {\r\n url = url.substring(0, indexOfQueryString) +\r\n urlWithGaValues +\r\n url.substring(indexOfQueryString, url.length);\r\n }\r\n // the 3rd param sets async = true\r\n xhr.open(\"POST\", url, true);\r\n xhr.send();\r\n }\r\n delete eventsQueue;\r\n });\r\n }\r\n };\r\n\r\n window.onload = fireEvents;\r\n\r\n return {\r\n enqueueEvent: enqueueEvent\r\n }\r\n});\n","/**\r\n * @module\r\n */\r\ndefine('eventLogger',[\"routes\", \"ajaxHelper\", \"analyticsHelper\", \"performanceEventsQueue\"], function (routes, ajax, analyticsHelper, performanceEventsQueue) {\r\n var callAddThis = true;\r\n var commIdHd = 0;\r\n var builderIdHd = 0;\r\n var siteRoot = document.getElementById(\"nhs_siteRoot\").value;\r\n var marketId = document.getElementById(\"nhs_marketId\").value;\r\n var _communityId = document.getElementById(\"nhs_communityId\").value;\r\n var _builderId = document.getElementById(\"nhs_builderId\").value;\r\n var _planId = document.getElementById(\"nhs_planId\").value;\r\n var _specId = document.getElementById(\"nhs_specId\").value;\r\n var _homeSearchViewMetricDisplayed = null;\r\n var _homeSearchViewMetricHidden = null;\r\n var fromPage = null;\r\n var performanceLogUrl = routes.performanceLog;\r\n var eventLoggerUrl = \"eventlogger/logevent-\";\r\n\r\n /**\r\n * Checks if the Google Analytics library has been downloaded yet\r\n * @function\r\n */\r\n function isGaLoaded() {\r\n return typeof (ga) === \"function\" && typeof (ga.getAll) === \"function\" ;\r\n }\r\n\r\n /**\r\n * Handles the url event log, if GA is ready then we log the event,\r\n * otherwise we are going to enqueue it and wait for the pageLoad event before trying to log them\r\n * @function\r\n * @param {String} url String\r\n * @param {String} isGaReady String\r\n * @param {Boolean} isAsync Boolean\r\n */\r\n function handleLogEvent(url, isGaReady, isAsync) {\r\n if (!isGaReady) {\r\n performanceEventsQueue.enqueueEvent(url);\r\n } else {\r\n url = analyticsHelper.addAnalyticsUrlParameters(url);\r\n ajax.postRequest(url, { async: isAsync });\r\n }\r\n }\r\n\r\n /**\r\n * Redirects the window\r\n * @function\r\n * @param {Event} e Event\r\n * @param {String} url URL\r\n * @param {*} newWin New Window\r\n */\r\n function redirect(e, url, newWin) {\r\n try {\r\n e.cancelBubble = true;\r\n } catch (err) {}\r\n\r\n if (e.stopPropagation) {\r\n e.stopPropagation();\r\n }\r\n\r\n if (!url) return;\r\n\r\n if (!!(navigator.userAgent.indexOf(\"Trident/\") >= 0 || navigator.userAgent.indexOf(\"MSIE \") >= 0)) {\r\n var referLink = document.createElement(\"a\");\r\n\r\n referLink.href = url;\r\n document.body.appendChild(referLink);\r\n\r\n //Begin Case: 79000\r\n if (newWin) {\r\n referLink.target = \"_blank\";\r\n referLink.click();\r\n } else {\r\n setTimeout(function () {\r\n referLink.click();\r\n }, 500);\r\n }\r\n //End Case: 79000\r\n } else {\r\n if (newWin) {\r\n window.open(url);\r\n } else {\r\n setTimeout(function () {\r\n window.location.href = url;\r\n }, 500);\r\n }\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Logs a view using parameters\r\n * @function\r\n * @param {String} url \r\n * @param {Number} eventCode \r\n * @param {*} parameters \r\n */\r\n function logViewWithParameters(url, eventCode, parameters) {\r\n var wturl = url;\r\n\r\n if (fromPage === \"communityresults\") {\r\n wturl = url;\r\n\r\n if (siteRoot === \"/\") {\r\n wturl = \"/NewHomeSource\" + url;\r\n }\r\n }\r\n\r\n var communityId = 0,\r\n specId = 0,\r\n planId = 0;\r\n\r\n if (parameters.builderId) {\r\n url = url + \"/builder-\" + parameters.builderId;\r\n }\r\n\r\n if (parameters.communityId || parameters.commId) {\r\n url = url + \"/community-\" + (parameters.communityId || parameters.commId);\r\n communityId = (parameters.communityId || parameters.commId);\r\n }\r\n\r\n if (parameters.parentCommunityId || parameters.parentCommId) {\r\n url = url + \"/parentcommunityid-\" + (parameters.parentCommunityId || parameters.parentCommunityId);\r\n }\r\n\r\n if (parameters.communityList) {\r\n url = url + \"/communitylist-\" + parameters.communityList;\r\n }\r\n\r\n if (parameters.marketId) {\r\n url = url + \"/market-\" + parameters.marketId;\r\n }\r\n\r\n if (parameters.planId) {\r\n url = url + \"/planid-\" + parameters.planId;\r\n planId = parameters.planId;\r\n }\r\n\r\n if (parameters.specId) {\r\n url = url + \"/specid-\" + parameters.specId;\r\n specId = parameters.specId;\r\n }\r\n\r\n if (parameters.basicListingId) {\r\n url = url + \"/basiclistingid-\" + parameters.basicListingId;\r\n }\r\n\r\n if (parameters.refer) {\r\n url = url + \"/refer-\" + parameters.refer;\r\n }\r\n\r\n if (parameters.totalHomes) {\r\n url = url + \"/totalhomes-\" + parameters.totalHomes;\r\n }\r\n\r\n if (parameters.builderCommunityList) {\r\n url = url + \"?buildercommunitylist=\" + parameters.builderCommunityList;\r\n }\r\n\r\n if (parameters.basicListingList) {\r\n url = url + \"?basiclistinglist=\" + parameters.basicListingList;\r\n }\r\n\r\n if (parameters.homeList) {\r\n url = url + \"?homeList=\" + parameters.homeList;\r\n }\r\n\r\n var isGaReady = isGaLoaded();\r\n handleLogEvent(url, isGaReady, true);\r\n\r\n //GA Performance event (with enhaced ecomm)\r\n logGoogleEcommerceEvent(eventCode, communityId, specId, planId, null, parameters.builderCommunityList, parameters.homeList);\r\n }\r\n\r\n /**\r\n * Logs a view\r\n * @function\r\n * @param {String} url URL\r\n * @param {Number} eventCode Event code\r\n * @param {Number} cid Community Id\r\n * @param {Number} bid Builder Id\r\n * @param {Number} planId Plan Id\r\n * @param {Number} specId Spec Id\r\n * @param {Number} bsId BS Id\r\n */\r\n function logView(url, eventCode, cid, bid, planId, specId, bsId) {\r\n if (url.indexOf(\"http://\") < 0) {\r\n url = url.replace(\" \", \"\").replace(\"//\", \"/\");\r\n }\r\n\r\n var hdPage = planId > 0 || specId > 0;\r\n\r\n if (cid === 0 && hdPage) {\r\n cid = commIdHd;\r\n }\r\n\r\n if (bid === 0 && hdPage) {\r\n bid = builderIdHd;\r\n }\r\n\r\n //Log to custom via http req \r\n if (bsId === 0) {\r\n url = url + \"/builder-\" + bid + \"/community-\" + cid + \"/planid-\" + planId + \"/specid-\" + specId + \"/market-\" + marketId;\r\n } else {\r\n url = url + \"/basiclistingid-\" + bsId + \"/market-\" + marketId;\r\n }\r\n\r\n var isGaReady = isGaLoaded();\r\n handleLogEvent(url, isGaReady, true);\r\n\r\n //GA Performance event (with enhaced ecomm)\r\n logGoogleEcommerceEvent(eventCode, cid, specId, planId, null);\r\n }\r\n\r\n /**\r\n * Logs Metrics\r\n * @function\r\n * @param {Event} event Event\r\n * @param {String} logString String to log\r\n */\r\n function logMetrics(event, logString) {\r\n ajax.request({\r\n type: \"POST\",\r\n url: \"https://\" + location.host + \"/metricseventlogger/\",\r\n data: {\r\n logsInChains: logString,\r\n eventName: event\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Logs a Google Ecommerce Event\r\n * @function\r\n * @param {String} eventName Event name\r\n * @param {Number} communityId Community Id\r\n * @param {Number} specId Spec Id\r\n * @param {Number} planId Plan Id\r\n * @param {String} builderName Builder's name\r\n * @param {Number[]} communitiesIdsList Communities Id List\r\n * @param {Number[]} homesIdsList Homes Id List\r\n */\r\n function logGoogleEcommerceEvent(eventName, communityId, specId, planId, builderName, communitiesIdsList, homesIdsList) {\r\n ajax.request({\r\n type: \"POST\",\r\n url: performanceLogUrl,\r\n data: {\r\n \"eventName\": eventName,\r\n \"communityId\": typeof (communityId) != \"undefined\" && communityId != null ? communityId : 0,\r\n \"specId\": typeof (specId) != \"undefined\" && specId != null ? specId : 0,\r\n \"planId\": typeof (planId) != \"undefined\" && planId != null ? planId : 0,\r\n \"builderName\": builderName,\r\n \"communitiesIdsList\": communitiesIdsList,\r\n \"homesIdsList\": homesIdsList\r\n },\r\n success: function (result) {\r\n // The GetDataLayerPush method of the Google Analytics Controller returns a js that needs to be executed\r\n eval(result);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Creates an EventLogger instance\r\n * @constructor\r\n */\r\n function EventLogger() {}\r\n\r\n /**\r\n * Logs List Hub Events\r\n * @method\r\n * @param {String} listHubProviderId List Hub provider Id\r\n * @param {String} testkey Test Key\r\n * @param {String} desckey Description Key\r\n * @param {String} listingKey Listing Key\r\n */\r\n EventLogger.prototype.logListHubEvent = function (listHubProviderId, testkey, desckey, listingKey) {\r\n try {\r\n var _lh = new ListHubTracker({\r\n provider: listHubProviderId,\r\n test: testkey\r\n });\r\n _lh.submit(desckey, listingKey);\r\n } catch (err) {}\r\n };\r\n\r\n /**\r\n * Logs and Redirects\r\n * @method\r\n * @param {Event} e Event\r\n * @param {String} url Url\r\n * @param {Number} eventCode Event code\r\n * @param {Number} cid Community Id\r\n * @param {Number} bid Builder Id\r\n * @param {Number} pid Plan Id\r\n * @param {Number} sid Spec Id\r\n * @param {Number} mid Market Id\r\n * @param {Boolean} external If the redirect is to an external page\r\n * @returns {Boolean} False\r\n */\r\n EventLogger.prototype.logAndRedirect = function (e, url, eventCode, cid, bid, pid, sid, mid, external) {\r\n marketId = mid;\r\n this.logEvent(eventCode, cid, bid, pid, sid);\r\n redirect(e, url, external);\r\n return false;\r\n };\r\n\r\n /**\r\n * Logs Basic Listing and Redirects\r\n * @method\r\n * @param {Event} e Event\r\n * @param {String} url Url\r\n * @param {Number} eventCode Event code\r\n * @param {Number} bsid Basic Id\r\n * @param {Number} mid Market Id\r\n * @returns {Boolean} False \r\n */\r\n EventLogger.prototype.logBasicListingAndRedirect = function (e, url, eventCode, bsid, mid) {\r\n var params = {\r\n basiclistingId: bsid,\r\n marketId: mid\r\n };\r\n this.logEventWithParameters(eventCode, params);\r\n redirect(e, url);\r\n return false;\r\n };\r\n\r\n /**\r\n * Logs using parameters and Redirects\r\n * @method\r\n * @param {Event} e Event\r\n * @param {String} url Url\r\n * @param {Number} eventCode Event code\r\n * @param {*} params Bs Id\r\n * @param {Boolean} external If the redirect is to an external page\r\n * @returns {Boolean} False\r\n */\r\n EventLogger.prototype.logWithParametersAndRedirect = function (e, url, eventCode, params, external) {\r\n this.logEventWithParameters(eventCode, params);\r\n redirect(e, url, external);\r\n return false;\r\n };\r\n\r\n /**\r\n * Logs Basic Listing event\r\n * @method\r\n * @param {Number} eventCode Event code\r\n * @param {Number} bsid Basic Id\r\n */\r\n EventLogger.prototype.logBasicListingEvent = function (eventCode, bsid) {\r\n if (!eventCode) return;\r\n var url = siteRoot + routes.logEvent + eventCode;\r\n\r\n if (siteRoot.substring(siteRoot.length - 1) !== \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n logView(url, eventCode, 0, 0, 0, 0, bsid);\r\n };\r\n\r\n /**\r\n * Logs an event\r\n * @method\r\n * @param {Number} eventCode Event code\r\n * @param {Number} cid Community Id\r\n * @param {Number} bid Builder Id\r\n * @param {Number} pid Partner Id\r\n * @param {Number} sid Spec Id\r\n */\r\n EventLogger.prototype.logEvent = function (eventCode, cid, bid, pid, sid) {\r\n if (!eventCode) return;\r\n var url = siteRoot + routes.logEvent + eventCode;\r\n\r\n if (siteRoot.substring(siteRoot.length - 1) !== \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n logView(url, eventCode, cid, bid, pid, sid, 0);\r\n };\r\n\r\n /**\r\n * Log events with parameters\r\n * @function\r\n * @param {Number} eventCode\r\n * @param {*} parameters\r\n */\r\n EventLogger.prototype.logEventWithParameters = function (eventCode, parameters) {\r\n var self = this;\r\n\r\n setTimeout(function () {\r\n if (eventCode) {\r\n var url = siteRoot + eventLoggerUrl + eventCode;\r\n\r\n if (siteRoot.substring(siteRoot.length - 1) != \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n logViewWithParameters(url, eventCode, parameters);\r\n }\r\n }, self._timeOut);\r\n };\r\n\r\n /**\r\n * Sets an allowance to add this\r\n * @method\r\n */\r\n EventLogger.prototype.setAllowAddThis = function () {\r\n callAddThis = false;\r\n setTimeout(function () {\r\n callAddThis = true;\r\n }, 2000);\r\n };\r\n\r\n /**\r\n * Logs Multiple events\r\n * @method\r\n * @param {Event} e Event\r\n * @param {String} url Url\r\n * @param {Number} eventCode Event code\r\n * @param {Number} bsid Bs Id\r\n * @param {Number} mid Market Id\r\n */\r\n EventLogger.prototype.logMultiEvent = function (eventCode, communityId, builderId, planId, specId) {\r\n if (eventCode) {\r\n var url = siteRoot + routes.logEvent + eventCode;\r\n\r\n if (siteRoot.substring(siteRoot.length - 1) !== \"/\") {\r\n url = \"/\" + url;\r\n }\r\n\r\n logView(url, eventCode, communityId, builderId, planId, specId, 0);\r\n }\r\n };\r\n\r\n /**\r\n * Logs Home Results metrics\r\n * @method\r\n * @param {String} eventCode Event Code\r\n * @param {Boolean} flag Flag\r\n */\r\n EventLogger.prototype.logHomeResultsMetrics = function (eventCode, flag) {\r\n if (eventCode) {\r\n var logString;\r\n\r\n if (flag === 1) {\r\n logString = _homeSearchViewMetricDisplayed;\r\n } else {\r\n logString = _homeSearchViewMetricHidden;\r\n }\r\n\r\n logMetrics(eventCode, logString);\r\n }\r\n };\r\n\r\n /**\r\n * Attaches Events to add this\r\n * @method\r\n */\r\n EventLogger.prototype.attachEventsToAddThis = function () {\r\n var instance = this;\r\n if (typeof addthis !== \"undefined\") {\r\n addthis.addEventListener(\"addthis.menu.share\", function (evt) { // TODO check this event \r\n if (!callAddThis) return;\r\n var serviceShared = evt.data.service.toString().toLowerCase();\r\n var eventCode, hdPage;\r\n\r\n if (serviceShared.indexOf(\"favorites\") === -1 && serviceShared.indexOf(\"print\") === -1 && serviceShared.indexOf(\"email\") === -1) {\r\n if (_planId === 0 && _specId === 0 && _communityId === 0) {\r\n eventCode = \"MHSMS\";\r\n } else {\r\n hdPage = _planId > 0 || _specId > 0;\r\n eventCode = hdPage ? \"HDSMS\" : \"CDSMS\";\r\n }\r\n\r\n instance.logMultiEvent(eventCode, _communityId, _builderId, _planId, _specId);\r\n } else if (serviceShared.indexOf(\"email\") > -1) {\r\n hdPage = _planId > 0 || _specId > 0;\r\n eventCode = hdPage ? \"HOMSTF\" : \"COMSTF\";\r\n instance.logMultiEvent(eventCode, _communityId, _builderId, _planId, _specId);\r\n instance.setAllowAddThis();\r\n } else if (serviceShared.indexOf(\"print\") > -1) {\r\n hdPage = _planId > 0 || _specId > 0;\r\n eventCode = hdPage ? \"HOMPR\" : \"COMPR\";\r\n\r\n if (this.classList.contains(\"nextStepsPrint\")) {\r\n eventCode = hdPage ? \"HDNSPRN\" : \"CDNSPRN\";\r\n }\r\n\r\n var logInfo = getLogInfo();\r\n\r\n instance.logEventWithParameters(eventCode, logInfo);\r\n instance.setAllowAddThis();\r\n }\r\n\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Gets log info\r\n */\r\n EventLogger.prototype.getLogInfo = function () {\r\n var logInformationObject;\r\n var logInfo = {\r\n communityId: _communityId,\r\n builderId: _builderId,\r\n planId: _planId,\r\n specId: _specId\r\n };\r\n\r\n if (typeof commDetail != \"undefined\") {\r\n logInformationObject = commDetail._parameters || commDetail.parameters;\r\n logInfo = logInformationObject.logInfo;\r\n }\r\n else if (typeof homeDetail != \"undefined\") {\r\n logInformationObject = homeDetail._parameters || homeDetail.parameters;\r\n logInfo = logInformationObject.logInfo;\r\n }\r\n\r\n return logInfo;\r\n };\r\n\r\n /**\r\n * Sets a Pair to the Data Layer\r\n * @method\r\n * @param {String} key Key\r\n * @param {*} optValue Optional value\r\n */\r\n EventLogger.prototype.SetDataLayerPair = function (key, optValue) {\r\n try {\r\n var finalUrl = \"/GoogleAnalytics/SetDataLayerPair\";\r\n\r\n if (typeof (optValue) == \"undefined\") {\r\n optValue = 0;\r\n }\r\n\r\n ajax.getRequest(finalUrl + \"?key=\" + key + \"&optValue=\" + optValue + \"\", null, null,\r\n {\r\n async: true,\r\n success: function(data) {\r\n if (!(data !== \"\" && typeof data === \"string\")) return;\r\n if (typeof (dataLayer) == \"undefined\") {\r\n var tmpData = data;\r\n var finalData = tmpData.replace(\"dataLayer\", \"window.parent.dataLayer\");\r\n eval(finalData);\r\n } else {\r\n eval(data);\r\n }\r\n }\r\n });\r\n } catch (ex) {}\r\n };\r\n\r\n /**\r\n * Creates a cookie\r\n * @method\r\n * @param {String} name Name\r\n * @param {String | Number | Boolean} value Value\r\n * @param {Number} days Days\r\n */\r\n function createCookie(name, value, days) {\r\n var expires;\r\n if (days) {\r\n var date = new Date();\r\n date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));\r\n expires = \"; expires=\" + date.toGMTString();\r\n } else {\r\n expires = \"\";\r\n }\r\n document.cookie = name + \"=\" + value + expires + \"; path=/\";\r\n };\r\n\r\n\r\n EventLogger.prototype.createCookie = createCookie;\r\n\r\n /**\r\n * reads the cookie with a given name\r\n *@method \r\n *\r\n * @param {string} name Name of the cookie\r\n * @returns\r\n */\r\n function readCookie(name) {\r\n var nameEQ = name + \"=\";\r\n var ca = document.cookie.split(\";\");\r\n for (var i = 0; i < ca.length; i++) {\r\n var c = ca[i];\r\n while (c.charAt(0) == \" \") c = c.substring(1, c.length);\r\n if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);\r\n }\r\n return null;\r\n };\r\n\r\n EventLogger.prototype.readCookie = readCookie;\r\n\r\n /**\r\n * Executes google push functionality\r\n * @method\r\n * @param {Event[]} events Event List\r\n * @param {String} action Action\r\n * @param {String} label Label\r\n * @param {String | Number | Boolean} value Value\r\n */\r\n EventLogger.prototype.googlepush = function (events, action, label, value) {\r\n createCookie(\"CTAName\", action);\r\n if (typeof dataLayer !== \"undefined\") {\r\n dataLayer.push({\r\n 'event': \"GAEvent\",\r\n 'eventCategory': events,\r\n 'eventAction': action,\r\n 'eventLabel': label,\r\n 'eventValue': undefined\r\n });\r\n } \r\n };\r\n\r\n return EventLogger;\r\n});\n","/**\r\n* favoritesInit: inits the Favorites and eventLogger\r\n*/\r\ndefine('favoritesInit',[\r\n 'Favorites',\r\n 'eventLogger'\r\n], (\r\n Favorites,\r\n EventLogger\r\n) => {\r\n 'use strict';\r\n\r\n const parameters = {\r\n logger: new EventLogger(),\r\n urlBase: ''\r\n };\r\n\r\n function init() {\r\n const favoritesObject = new Favorites(parameters);\r\n favoritesObject.init();\r\n }\r\n\r\n return {\r\n init\r\n };\r\n});\r\n\n","!(function (win) {\r\n\r\n /**\r\n * FastDom\r\n *\r\n * Eliminates layout thrashing\r\n * by batching DOM read/write\r\n * interactions.\r\n *\r\n * @author Wilson Page \r\n * @author Kornel Lesinski \r\n */\r\n\r\n \"use strict\";\r\n\r\n /**\r\n * Normalized rAF\r\n *\r\n * @type {Function}\r\n */\r\n var raf = win.requestAnimationFrame\r\n || win.webkitRequestAnimationFrame\r\n || win.mozRequestAnimationFrame\r\n || win.msRequestAnimationFrame\r\n || function (cb) { return setTimeout(cb, 16); };\r\n\r\n /**\r\n * Initialize a `FastDom`.\r\n *\r\n * @constructor\r\n */\r\n function FastDom() {\r\n var self = this;\r\n self.reads = [];\r\n self.writes = [];\r\n self.raf = raf.bind(win); // test hook\r\n }\r\n\r\n FastDom.prototype = {\r\n constructor: FastDom,\r\n\r\n /**\r\n * We run this inside a try catch\r\n * so that if any jobs error, we\r\n * are able to recover and continue\r\n * to flush the batch until it's empty.\r\n *\r\n * @param {Array} tasks\r\n */\r\n runTasks: function (tasks) {\r\n var task; while (task = tasks.shift()) task();\r\n },\r\n\r\n /**\r\n * Adds a job to the read batch and\r\n * schedules a new frame if need be.\r\n *\r\n * @param {Function} fn\r\n * @param {Object} ctx the context to be bound to `fn` (optional).\r\n * @public\r\n */\r\n measure: function (fn, ctx) {\r\n var task = !ctx ? fn : fn.bind(ctx);\r\n this.reads.push(task);\r\n scheduleFlush(this);\r\n return task;\r\n },\r\n\r\n /**\r\n * Adds a job to the\r\n * write batch and schedules\r\n * a new frame if need be.\r\n *\r\n * @param {Function} fn\r\n * @param {Object} ctx the context to be bound to `fn` (optional).\r\n * @public\r\n */\r\n mutate: function (fn, ctx) {\r\n var task = !ctx ? fn : fn.bind(ctx);\r\n this.writes.push(task);\r\n scheduleFlush(this);\r\n return task;\r\n },\r\n\r\n /**\r\n * Clears a scheduled 'read' or 'write' task.\r\n *\r\n * @param {Object} task\r\n * @return {Boolean} success\r\n * @public\r\n */\r\n clear: function (task) {\r\n return remove(this.reads, task) || remove(this.writes, task);\r\n },\r\n\r\n /**\r\n * Extend this FastDom with some\r\n * custom functionality.\r\n *\r\n * Because fastdom must *always* be a\r\n * singleton, we're actually extending\r\n * the fastdom instance. This means tasks\r\n * scheduled by an extension still enter\r\n * fastdom's global task queue.\r\n *\r\n * The 'super' instance can be accessed\r\n * from `this.fastdom`.\r\n *\r\n * @example\r\n *\r\n * var myFastdom = fastdom.extend({\r\n * initialize: function() {\r\n * // runs on creation\r\n * },\r\n *\r\n * // override a method\r\n * measure: function(fn) {\r\n * // do extra stuff ...\r\n *\r\n * // then call the original\r\n * return this.fastdom.measure(fn);\r\n * },\r\n *\r\n * ...\r\n * });\r\n *\r\n * @param {Object} props properties to mixin\r\n * @return {FastDom}\r\n */\r\n extend: function (props) {\r\n if (typeof props != 'object') throw new Error('expected object');\r\n\r\n var child = Object.create(this);\r\n mixin(child, props);\r\n child.fastdom = this;\r\n\r\n // run optional creation hook\r\n if (child.initialize) child.initialize();\r\n\r\n return child;\r\n },\r\n\r\n // override this with a function\r\n // to prevent Errors in console\r\n // when tasks throw\r\n catch: null\r\n };\r\n\r\n /**\r\n * Schedules a new read/write\r\n * batch if one isn't pending.\r\n *\r\n * @private\r\n */\r\n function scheduleFlush(fastdom) {\r\n if (!fastdom.scheduled) {\r\n fastdom.scheduled = true;\r\n fastdom.raf(flush.bind(null, fastdom));\r\n }\r\n }\r\n\r\n /**\r\n * Runs queued `read` and `write` tasks.\r\n *\r\n * Errors are caught and thrown by default.\r\n * If a `.catch` function has been defined\r\n * it is called instead.\r\n *\r\n * @private\r\n */\r\n function flush(fastdom) {\r\n var writes = fastdom.writes;\r\n var reads = fastdom.reads;\r\n var error;\r\n\r\n try {\r\n fastdom.runTasks(reads);\r\n fastdom.runTasks(writes);\r\n } catch (e) { error = e; }\r\n\r\n fastdom.scheduled = false;\r\n\r\n // If the batch errored we may still have tasks queued\r\n if (reads.length || writes.length) {\r\n scheduleFlush(fastdom);\r\n }\r\n\r\n if (error) {\r\n if (fastdom.catch) {\r\n fastdom.catch(error);\r\n } else {\r\n throw error;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Remove an item from an Array.\r\n *\r\n * @param {Array} array\r\n * @param {*} item\r\n * @return {Boolean}\r\n */\r\n function remove(array, item) {\r\n var index = array.indexOf(item);\r\n return !!~index && !!array.splice(index, 1);\r\n }\r\n\r\n /**\r\n * Mixin own properties of source\r\n * object into the target.\r\n *\r\n * @param {Object} target\r\n * @param {Object} source\r\n */\r\n function mixin(target, source) {\r\n for (var key in source) {\r\n if (source.hasOwnProperty(key)) target[key] = source[key];\r\n }\r\n }\r\n\r\n // There should never be more than\r\n // one instance of `FastDom` in an app\r\n var exports = win.fastdom = (win.fastdom || new FastDom()); // jshint ignore:line\r\n\r\n // Expose to CJS & AMD\r\n if ((typeof define) == 'function') define('fastdom',[],function () { return exports; });\r\n})(typeof window !== 'undefined' ? window : this);\n","define(\r\n 'builderShowcaseHelper',[\r\n 'builderShowcaseObserver',\r\n 'fastdom',\r\n ],\r\n (\r\n builderShowcaseObserver,\r\n fastdom,\r\n ) => {\r\n 'use strict';\r\n\r\n /**\r\n * @private\r\n * setUpTextValueInDomElement: assign a text value to a dom element innerText prop\r\n */\r\n function setUpTextValueInDomElement(domObjects, text) {\r\n for (let i = 0; i < domObjects.length; i += 1) {\r\n domObjects[i].innerText = text; // eslint-disable-line no-param-reassign\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * setBodyModalInformation: sets the modal body content, it could be a version for brands where\r\n * all of their plans are part of a plan library, or another version where this statement is false.\r\n * Check BDXNHS-7903 for information about version 1\r\n * Check BDXNHS-8058 for information about version 2\r\n */\r\n function setBodyModalInformation(info, container) {\r\n const locationsContainer = container.querySelector('[data-component=\"locations-container\"]');\r\n const locations = container.querySelector('[data-component=\"locations-text\"]');\r\n const locationsLink = container.querySelector('[data-component=\"locations-link\"]');\r\n const planLibraryContainer = container.querySelector('[data-component=\"plan-library-container\"]');\r\n const planLibraryStateTemplate = document.querySelector('[data-plan-library-state]');\r\n const planLibraryMarketTemplate = document.querySelector('[data-plan-library-market]');\r\n const planLibraryCommunityTemplate = document.querySelector('[data-plan-library-community]');\r\n\r\n if (info.jsonResponse.IsManufactured) {\r\n return;\r\n }\r\n\r\n if (info.jsonResponse.PlanLibraryHomes && info.jsonResponse.PlanLibraryHomes.length > 0) {\r\n planLibraryContainer.removeAttribute('hidden');\r\n locationsContainer.setAttribute('hidden', '');\r\n\r\n for (let i = 0; i < info.jsonResponse.PlanLibraryHomes.length; i += 1) {\r\n const stateListItem = planLibraryStateTemplate.content.cloneNode(true);\r\n const state = info.jsonResponse.PlanLibraryHomes[i];\r\n stateListItem.querySelector('[data-role-state]').innerHTML = state.State.StateName;\r\n\r\n for (let j = 0; j < info.jsonResponse.PlanLibraryHomes[i].Markets.length; j += 1) {\r\n const market = info.jsonResponse.PlanLibraryHomes[i].Markets[j];\r\n const marketListItem = planLibraryMarketTemplate.content.cloneNode(true);\r\n marketListItem.querySelector('[data-role-market]').innerHTML = market.Market.Name;\r\n\r\n for (let k = 0; k < info.jsonResponse.PlanLibraryHomes[i].Markets[j].Communities.length; k += 1) {\r\n const comm = info.jsonResponse.PlanLibraryHomes[i].Markets[j].Communities[k];\r\n const communityListItem = planLibraryCommunityTemplate.content.cloneNode(true);\r\n const anchorTag = communityListItem.querySelector('a');\r\n anchorTag.innerHTML = comm.Community.Name;\r\n anchorTag.href = comm.CommunityUrl;\r\n marketListItem.querySelector('[data-role-comm-list]').appendChild(communityListItem);\r\n }\r\n\r\n stateListItem.querySelector('[data-role-market-list]').appendChild(marketListItem);\r\n }\r\n\r\n planLibraryContainer.querySelector('ul').appendChild(stateListItem);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (locations) {\r\n locationsContainer.removeAttribute('hidden');\r\n locations.innerText = locations.innerText.replace('[BUILDERNAME]', info.jsonResponse.BrandName);\r\n locations.innerText = locations.innerText.replace('[METROCOUNT]', info.jsonResponse.MetroAreasCount);\r\n locationsLink.href = info.jsonResponse.LocationsLink;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * setUpPlanDescription: creates the text to be hold by the description section.\r\n */\r\n function setUpPlanDescription(info, container) {\r\n if (!info || (!info.PlanName && (!info.selectedItem || !info.selectedItem.PlanName))) {\r\n return;\r\n }\r\n\r\n const planName = info.PlanName || info.selectedItem.PlanName;\r\n const planAmenties = info.Amenities || info.selectedItem.Amenities;\r\n const planNameElements = container.querySelectorAll('[data-component=\"plan-name\"]');\r\n const planAmmenitiesElements = container.querySelectorAll('[data-component=\"plan-ammenities\"]');\r\n const builderName = container.querySelector('[data-component=\"builder-name\"]');\r\n const builderLink = container.querySelector('[data-component=\"builder-link\"]');\r\n const reviewsStars = container.querySelector('[data-component=\"reviews-starSummary\"]');\r\n const reviewsScoreText = container.querySelector('[data-component=\"reviews-scoreText\"]');\r\n const reviewsInformation = container.querySelector('[data-component=\"reviews-information\"]');\r\n\r\n if (!planName) {\r\n setUpTextValueInDomElement(planNameElements, '');\r\n setUpTextValueInDomElement(planAmmenitiesElements, '');\r\n return;\r\n }\r\n\r\n setUpTextValueInDomElement(planNameElements, planName);\r\n setUpTextValueInDomElement(planAmmenitiesElements, planAmenties.join(';').replace(/;/g, ' | '));\r\n\r\n if (!info.jsonResponse) {\r\n return;\r\n }\r\n\r\n if (builderName) {\r\n builderName.innerText = builderName.innerText.replace('[BUILDERNAME]', info.jsonResponse.BrandName);\r\n }\r\n\r\n if (builderLink) {\r\n builderLink.href = info.data.BuilderLink;\r\n }\r\n\r\n if (info.data.hasBuilderReviews && reviewsStars && reviewsScoreText) {\r\n const ratingValue = info.data.averageRating;\r\n reviewsStars.style = `--rating:${ratingValue}`;\r\n reviewsInformation.removeAttribute('hidden');\r\n }\r\n\r\n setBodyModalInformation(info, container);\r\n }\r\n\r\n /**\r\n * @private\r\n * Gets the image type for the source\r\n */\r\n function getImageType(url) {\r\n const sections = url.split(',');\r\n const source = sections[0].split(' ');\r\n const address = source[0];\r\n let type = 'image/';\r\n\r\n if (address.indexOf('webp') > 0) {\r\n type += 'webp';\r\n } else if (address.indexOf('avif') > 0) {\r\n type += 'avif';\r\n } else {\r\n type += 'jpeg';\r\n }\r\n\r\n return type;\r\n }\r\n\r\n /**\r\n * @private\r\n * degreeToRadius: converts degrees to radius\r\n *\r\n */\r\n function degreeToRadius(degree) {\r\n return degree * (Math.PI / 180);\r\n }\r\n\r\n /**\r\n * @private\r\n * calculateHaversineFormula: determines the great-circle distance between two points\r\n * on a sphere given their longitudes and latitudes. For more:\r\n * https://es.wikipedia.org/wiki/F%C3%B3rmula_del_semiverseno\r\n *\r\n */\r\n function calculateHaversineFormula(latitude, longitude, destinationLatitude, destinationLongitude) {\r\n const earthRadius = 6371; // Radius of the earth in km\r\n const distanceLatitude = degreeToRadius(destinationLatitude - latitude);\r\n const distanceLongitude = degreeToRadius(destinationLongitude - longitude);\r\n const a =\r\n Math.sin(distanceLatitude / 2) * Math.sin(distanceLatitude / 2) +\r\n Math.cos(degreeToRadius(latitude)) * Math.cos(degreeToRadius(destinationLatitude)) *\r\n Math.sin(distanceLongitude / 2) * Math.sin(distanceLongitude / 2);\r\n const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\r\n return earthRadius * c; // Distance in km\r\n }\r\n\r\n function onMapUpdatedSuccess(html, config) {\r\n const configObject = config;\r\n\r\n if (!document.querySelector('[data-ismobiledevice=\"true\"]')) {\r\n configObject.infowindow.setContent(html);\r\n configObject.infowindow.open(configObject.mapInstance, configObject.marker);\r\n configObject.marker.setCursor('pointer');\r\n require(['mapCardCtaHandler'], (mapCardCtaHandler) => {\r\n mapCardCtaHandler.setMapInstance(configObject.mapItem);\r\n });\r\n\r\n return;\r\n }\r\n\r\n configObject.cardsHtmlContainer.innerHTML = html;\r\n configObject.cardsHtmlContainer.style.opacity = '1';\r\n configObject.cardsHtmlContainer.removeAttribute('hidden');\r\n require(\r\n ['loadCss'],\r\n (loadCss) => {\r\n const cardCssInput = document.querySelector('#card-css');\r\n loadCss(cardCssInput.value);\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Gets from the state marquee gallary collection item.\r\n * the item object that is going to be active.\r\n * @param {string} imageId selected image Id from thumbnail/filmstrip.\r\n * @returns MarqueeGalleryItem object\r\n */\r\n function getCollectionItem(imageId, collectionCategory, getGalleryCollection) {\r\n const state = builderShowcaseObserver.getState();\r\n const galleryCollection = getGalleryCollection(state, collectionCategory);\r\n const items = galleryCollection.Items;\r\n const item = items.find((x) => +x.Id === +imageId);\r\n\r\n return item;\r\n }\r\n\r\n /**\r\n * changeStyleWithFastDom: applies style changes to a given element withing a fastdom frame\r\n */\r\n function changeStyleWithFastDom(element) {\r\n element.parentElement.classList.remove('figure--active');\r\n element.removeAttribute('data-active');\r\n }\r\n\r\n /**\r\n * performStyleChange: calls a named function for changing styles using fast dom\r\n */\r\n function performStyleChange(element) {\r\n fastdom.mutate(changeStyleWithFastDom.bind(null, element));\r\n }\r\n\r\n /**\r\n * Removes the classes and attributes set to the last active image\r\n */\r\n function cleanActiveElements(activeThumbSelector) {\r\n const elements = document.querySelectorAll(activeThumbSelector);\r\n if (elements) {\r\n elements.forEach(performStyleChange);\r\n }\r\n }\r\n\r\n /**\r\n * Sets classes and attributes to a given picture.\r\n * @param {object} selectedThumbnail Picture HTML object\r\n */\r\n function applyActiveStyles(selectedThumbnail, activeThumbSelector) {\r\n cleanActiveElements(activeThumbSelector);\r\n\r\n fastdom.mutate(() => {\r\n selectedThumbnail.parentElement.classList.add('figure--active');\r\n selectedThumbnail.setAttribute('data-active', true);\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * getMapUrl: gets url to hit the server in ajax requests related to map functionality.\r\n * Basically, it checks if we are querying from a private label to add the private\r\n * label to the url structure.\r\n *\r\n * @returns the url that should be requested for map related actions like getting\r\n * a single pin or a set of them.\r\n */\r\n function getMapUrl(url) {\r\n const siteRoot = document.querySelector('#nhs_siteRootLogger');\r\n return `${window.location.origin}${siteRoot.value}${url}`;\r\n }\r\n\r\n return {\r\n getImageType,\r\n setUpPlanDescription,\r\n calculateHaversineFormula,\r\n onMapUpdatedSuccess,\r\n getCollectionItem,\r\n applyActiveStyles,\r\n getMapUrl,\r\n };\r\n }\r\n);\r\n\n","/*\r\n * map observer is the observer where all independent modules can suscribe to.\r\n * This module contain basic functions to fire like onMapCenterChanged or\r\n * onPinsCreated. It's main goal is to alert subscribers about a change in\r\n * the map state.\r\n */\r\n(function mapObserver(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource.Map = global.NewHomeSource.Map || {};\r\n\r\n if (!global.NewHomeSource.EventBus) {\r\n return;\r\n }\r\n\r\n const previousMapObserver = global.NewHomeSource.Map.MapObserver;\r\n const eventBus = new global.NewHomeSource.EventBus();\r\n\r\n function MapObserver() {\r\n }\r\n\r\n /**\r\n * @public\r\n * add: adds a new Observer to the Event bus for the given topic.\r\n *\r\n * @param {string} topic to identify the data needed for the observer.\r\n * @param {function} observer function to be called when the topic has changed.\r\n */\r\n MapObserver.add = function add(topic, observer) {\r\n eventBus.addObserver(topic, observer);\r\n };\r\n\r\n /**\r\n * @public\r\n * onMapCenterChanged: notifies subscribers about the event: onMapCenterChanged.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onMapCenterChanged = function onMapCenterChanged(data) {\r\n eventBus.notifyObservers('onMapCenterChanged', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onMapCreated: notifies subscribers about the event: onMapCreated.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onMapCreated = function onMapCreated(data) {\r\n eventBus.notifyObservers('onMapCreated', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onCircleResized: notifies subscribers about the event: onCircleResized.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onCircleResized = function onCircleResized(data) {\r\n eventBus.notifyObservers('onCircleResized', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onCardLinkFollowed: notifies subscribers about the event: onCardLinkFollowed.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onCardLinkFollowed = function onCardLinkFollowed(data) {\r\n eventBus.notifyObservers('onCardLinkFollowed', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onPinsCreated: notifies subscribers about the event: onPinsCreated.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onPinsCreated = function onPinsCreated(data) {\r\n eventBus.notifyObservers('onPinsCreated', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onInfoWindowLoaded: notifies subscribers about the event: onInfoWindowLoaded.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onInfoWindowLoaded = function onInfoWindowLoaded(data) {\r\n eventBus.notifyObservers('onInfoWindowLoaded', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onExternalFilterApplied: notifies subscribers about the event: onExternalFilterApplied.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onExternalFilterApplied = function onExternalFilterApplied(data) {\r\n eventBus.notifyObservers('onExternalFilterApplied', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onCenterReset: notifies subscribers about the event: onCenterReset.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onCenterReset = function onCenterReset(data) {\r\n eventBus.notifyObservers('onCenterReset', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onZoomChanged: notifies subscribers about the event: onZoomChanged.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onZoomChanged = function onZoomChanged(data) {\r\n eventBus.notifyObservers('onZoomChanged', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * afterMapCenterChanged: notifies subscribers about the event: afterMapCenterChanged.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.afterMapCenterChanged = function afterMapCenterChanged(data) {\r\n eventBus.notifyObservers('afterMapCenterChanged', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * afterPinsCreated: notifies subscribers about the event: afterPinsCreated.\r\n * It is trigger after the pins was created.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.afterPinsCreated = function afterPinsCreated(data) {\r\n eventBus.notifyObservers('afterPinsCreated', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onCardClosed: notifies subscribers about the event: onCardClosed.\r\n * It is trigger after the pins is clicked.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onCardClosed = function onCardClosed(data) {\r\n eventBus.notifyObservers('onCardClosed', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onClusterClicked: notifies subscribers about the event: onClusterClicked.\r\n * It is trigger after the cluster is clicked.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onClusterClicked = function onClusterClicked(data) {\r\n eventBus.notifyObservers('onClusterClicked', data);\r\n };\r\n\r\n /**\r\n * @public\r\n * onPinClicked: notifies subscribers about the event: onPinClicked.\r\n * It is trigger after the pins is clicked.\r\n *\r\n * @param {object} data collected from the module that trigger the event.\r\n */\r\n MapObserver.onPinClicked = function onPinClicked(data) {\r\n eventBus.notifyObservers('onPinClicked', data);\r\n };\r\n\r\n /*\r\n * Add here any function that should fire an event in the map subscribers\r\n */\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.MapObserver to the previous script.\r\n */\r\n MapObserver.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.MapObserver = previousMapObserver;\r\n return MapObserver;\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver = MapObserver;\r\n}(window));\r\n\ndefine(\"MapObserver\", function(){});\n\n","/*\r\n * base map is the \"constructor\" for the whole map functionality. Think of this\r\n * module as the \"main\" function for console applications.\r\n * It's main responsibility is to instanciate the map from GM and trigger the\r\n * function that alerts the subscribers about a new map created.\r\n */\r\n(function baseMap(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource.Map = global.NewHomeSource.Map || {};\r\n\r\n if (!global.NewHomeSource.Map.MapObserver) {\r\n return;\r\n }\r\n\r\n const previousBaseMap = global.NewHomeSource.Map.BaseMap;\r\n const defaultMapInstanceConfiguration = {\r\n zoomControl: true,\r\n disableDefaultUI: true,\r\n panControl: false,\r\n zoomControlStyle: 'SMALL',\r\n gestureHandling: 'greedy',\r\n scrollwheel: true,\r\n disableDoubleClickZoom: false,\r\n };\r\n\r\n const mapInstanceConfiguration = defaultMapInstanceConfiguration;\r\n let mapInstance = null;\r\n\r\n /**\r\n * @public\r\n * setConfigurationObject: modifies a set of attributes in config object.\r\n * @param {object} object with a set of attributes to change on config object.\r\n */\r\n function setConfigurationObject(object) {\r\n const objectEntries = Object.entries(object);\r\n\r\n for (let i = 0; i < objectEntries.length; i += 1) {\r\n mapInstanceConfiguration[objectEntries[i][0]] = objectEntries[i][1];\r\n }\r\n\r\n const mapStyles = [{\r\n featureType: 'poi',\r\n stylers: [{\r\n visibility: 'off'\r\n }]\r\n }];\r\n\r\n mapInstanceConfiguration.styles = mapStyles;\r\n }\r\n\r\n /**\r\n * @private\r\n * attachEventsToMapInstance: attaches the events map is going to support.\r\n *\r\n * The next event listener will do the trick whenever\r\n * search within map is coded.\r\n * global.google.maps.event.addListener(mapInstance,\r\n * 'dragend',\r\n * global.NewHomeSource.Map.MapObserver.onMapCenterChanged);\r\n */\r\n function attachEventsToMapInstance(customEvents) {\r\n // do something only the first time the map is loaded\r\n global.google.maps.event.addListenerOnce(\r\n mapInstance,\r\n 'idle',\r\n () => {\r\n const data = {\r\n shouldUpdateCards: false,\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.onMapCenterChanged(data);\r\n }\r\n );\r\n\r\n // TODO: add here any event you want for the map UNLESS is very specific.\r\n // if it is specific, then send it as part of the configuration object!\r\n\r\n if (!customEvents) {\r\n return;\r\n }\r\n\r\n customEvents.forEach((item) => {\r\n const eventName = item.name;\r\n const eventFunction = item.func;\r\n\r\n if (!eventName || !eventFunction || typeof eventFunction === 'function') {\r\n return;\r\n }\r\n\r\n global.google.maps.event.addListener(\r\n mapInstance,\r\n eventName,\r\n eventFunction\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.BaseMap\r\n */\r\n function BaseMap(mapConfiguration) {\r\n if (mapConfiguration) {\r\n setConfigurationObject(mapConfiguration);\r\n }\r\n\r\n if (!mapInstanceConfiguration.mapContainer) {\r\n return;\r\n }\r\n\r\n mapInstance = new global.google.maps.Map(mapInstanceConfiguration.mapContainer, mapInstanceConfiguration);\r\n attachEventsToMapInstance(mapConfiguration.customEvents);\r\n const onMapCreatedData = {\r\n mapInstance,\r\n mapConfiguration\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.onMapCreated(onMapCreatedData);\r\n if (typeof mapInstanceConfiguration.callback === 'function') {\r\n mapInstanceConfiguration.callback(mapInstance);\r\n }\r\n }\r\n\r\n BaseMap.isMapCreated = function isMapCreated() {\r\n return mapInstance !== null;\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.BaseMap to the previous script.\r\n */\r\n BaseMap.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.BaseMap = previousBaseMap;\r\n return BaseMap;\r\n };\r\n\r\n global.NewHomeSource.Map.BaseMap = BaseMap;\r\n}(window));\r\n\ndefine(\"BaseMap\", function(){});\n\n","/*\r\n * This module is in charge of handling builder showcase specific rules for the map. As part\r\n * of this module, there are functions about calculating a proposed market based on where you\r\n * are in the map in order to pre-select the market of interest.\r\n */\r\n(function builderShowcaseMapHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Map.BaseMap) {\r\n return;\r\n }\r\n\r\n const previousBuilderShowcaseMapHandler = global.NewHomeSource.Map.previousBuilderShowcaseMapHandler;\r\n const marketsDropDownList = document.querySelector('[data-component=\"markets-list\"]');\r\n let builderShowcaseObserver = {};\r\n let builderShowcaseHelper = {};\r\n let mapInstance = {};\r\n\r\n /**\r\n * @private\r\n * shouldGuessMarket: if the zoom level is way to out, we should not try to\r\n * guess the market the user is interacting with, because the results are easy\r\n * to interpret wrong, so it's better to aim for UX in this scenarios.\r\n *\r\n * @returns a flag indicating if the effort for guessing a market after interactions\r\n * on the map needs to be done or not. The effort consists in the function:\r\n * calculateHaversineFormula from builderShowcaseHelper.\r\n */\r\n function shouldGuessMarket() {\r\n if (!marketsDropDownList) {\r\n return false;\r\n }\r\n\r\n const minZoom = parseInt(marketsDropDownList.options[0].dataset.zoomLevel, 10);\r\n return Math.abs(minZoom - mapInstance.getZoom()) >= 2;\r\n }\r\n\r\n /**\r\n * @private\r\n * getProposedMarket: from the markets list, it finds the closest one to the current map center.\r\n * If there's a market withing 150 miles from current map center, it will return it to the caller function.\r\n *\r\n * @returns a market object with information like the market ID, Name, State it belongs, etc.\r\n */\r\n function getProposedMarket(latitude, longitude, markets) {\r\n if (!shouldGuessMarket()) {\r\n return null;\r\n }\r\n\r\n let proposedMarket = null;\r\n for (let i = 0; i < markets.length; i += 1) {\r\n const destinationLatitude = parseFloat(markets[i].Lat, 10);\r\n const destinationLongitude = parseFloat(markets[i].Lng, 10);\r\n const harversineValue =\r\n builderShowcaseHelper.calculateHaversineFormula(\r\n latitude,\r\n longitude,\r\n destinationLatitude,\r\n destinationLongitude\r\n );\r\n\r\n if (harversineValue < 150) {\r\n if (proposedMarket) {\r\n if (harversineValue < proposedMarket.harversineValue) {\r\n proposedMarket = markets[i];\r\n proposedMarket.harversineValue = harversineValue;\r\n }\r\n } else {\r\n proposedMarket = markets[i];\r\n proposedMarket.harversineValue = harversineValue;\r\n }\r\n }\r\n }\r\n\r\n return proposedMarket;\r\n }\r\n\r\n /**\r\n * @private\r\n * onSearchUpdated: this function is triggered after the user navigates into the map.\r\n * It is in charge of let the other modules subscribed to beforeMapResultsLoaded about\r\n * the map's being moved to a new point of interest with the data retrieved\r\n * accordingly to this action.\r\n *\r\n */\r\n function onSearchUpdated() {\r\n const state = builderShowcaseObserver.getState();\r\n const markets = state.locations.Markets;\r\n const mapCenter = mapInstance.center;\r\n\r\n state.searchParameters.OriginLat = mapCenter.lat();\r\n state.searchParameters.OriginLng = mapCenter.lng();\r\n\r\n const newProposedMarket = getProposedMarket(\r\n state.searchParameters.OriginLat,\r\n state.searchParameters.OriginLng,\r\n markets\r\n );\r\n\r\n const stateProposedMarket = state.proposedMarket;\r\n\r\n if (newProposedMarket && stateProposedMarket && stateProposedMarket.Id === newProposedMarket.Id) {\r\n return;\r\n }\r\n\r\n if (!newProposedMarket) {\r\n state.proposedMarket = newProposedMarket;\r\n state.searchParameters.MarketId = 0;\r\n state.searchParameters.MarketName = '';\r\n state.searchParameters.State = '';\r\n } else {\r\n state.proposedMarket = newProposedMarket;\r\n state.searchParameters.MarketId = newProposedMarket.Id;\r\n state.searchParameters.MarketName = newProposedMarket.Name;\r\n state.searchParameters.State = newProposedMarket.StateAbbr;\r\n }\r\n\r\n builderShowcaseObserver.setData(state);\r\n builderShowcaseObserver.commit();\r\n\r\n state.comesFromDragInteraction = true;\r\n\r\n builderShowcaseObserver.beforeMapResultsLoaded(state);\r\n }\r\n\r\n /**\r\n * @private\r\n * triggerEvent: triggers and on demand event for any of the current event handlers supported.\r\n */\r\n function triggerEvent(event) {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: event }\r\n }));\r\n }\r\n\r\n /**\r\n * @private\r\n * onMarkerClick: builds and triggers an event related to the marker click interaction.\r\n */\r\n function onMarkerClick() {\r\n const gaEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Builder-Mapelements-Sp',\r\n eventAction: 'Marker-Clicked',\r\n eventLabel: '',\r\n };\r\n\r\n triggerEvent(gaEvent);\r\n }\r\n\r\n /**\r\n * @private\r\n * onClusterClick: builds and triggers an event related to the cluster click interaction.\r\n */\r\n function onClusterClick(event) {\r\n if (!event || !event.target || !event.target.dataset.srpCluster) {\r\n return;\r\n }\r\n\r\n const gaEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Builder-Mapelements-Sp',\r\n eventAction: 'Number-Clicked',\r\n eventLabel: event.target.innerText,\r\n };\r\n\r\n triggerEvent(gaEvent);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Map.BuilderShowcaseMapHandler\r\n */\r\n function BuilderShowcaseMapHandler() { }\r\n\r\n /**\r\n * @public\r\n * update: function that gets trigger after notification from observer\r\n *\r\n */\r\n BuilderShowcaseMapHandler.update = function update(data, topic) {\r\n if (topic === 'onMapCreated') {\r\n builderShowcaseObserver = data.mapConfiguration.builderShowcaseObserver;\r\n builderShowcaseHelper = data.mapConfiguration.builderShowcaseHelper;\r\n mapInstance = data.mapInstance;\r\n\r\n global.google.maps.event.addListener(\r\n mapInstance,\r\n 'dragend',\r\n onSearchUpdated\r\n );\r\n\r\n global.google.maps.event.addListener(\r\n mapInstance,\r\n 'zoom_changed',\r\n onSearchUpdated\r\n );\r\n\r\n data.mapConfiguration.mapContainer.addEventListener('click', onClusterClick);\r\n\r\n builderShowcaseObserver.subscribe('onBeforeMapResultsLoaded', BuilderShowcaseMapHandler);\r\n builderShowcaseObserver.subscribe('onResize', BuilderShowcaseMapHandler);\r\n }\r\n\r\n if (topic === 'onInfoWindowLoaded') {\r\n onMarkerClick();\r\n }\r\n\r\n if (['onBeforeMapResultsLoaded', 'onResize'].some((t) => t === topic)) {\r\n const latitude = builderShowcaseObserver.getOriginalLatitude();\r\n const longitude = builderShowcaseObserver.getOriginalLongitude();\r\n\r\n const position = new global.google.maps.LatLng(latitude, longitude);\r\n mapInstance.setCenter(position);\r\n\r\n if (!data.comesFromDragInteraction &&\r\n mapInstance.getZoom() !== builderShowcaseObserver.getZoomLevel()) {\r\n mapInstance.setZoom(builderShowcaseObserver.getZoomLevel());\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.BuilderShowcaseMapHandler to the previous script.\r\n * @returns the BuilderShowcaseMapHandler to the previous script.\r\n */\r\n BuilderShowcaseMapHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.BuilderShowcaseMapHandler = previousBuilderShowcaseMapHandler;\r\n return BuilderShowcaseMapHandler;\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.add('onMapCreated', BuilderShowcaseMapHandler);\r\n global.NewHomeSource.Map.MapObserver.add('onInfoWindowLoaded', BuilderShowcaseMapHandler);\r\n global.NewHomeSource.Map.BuilderShowcaseMapHandler = BuilderShowcaseMapHandler;\r\n}(window));\r\n\ndefine(\"BuilderShowcaseMapHandler\", function(){});\n\n","/*\r\n * Map Helper will handle miscellaneous tasks that different map modules require\r\n * and we don't want them to be repetitive among modules.\r\n */\r\n(function mapHelper(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Map.BaseMap ||\r\n !global.searchTypeHelper) {\r\n return;\r\n }\r\n\r\n const previousMapHelper = global.NewHomeSource.Map.previousMapHelper;\r\n const languageResources = JSON.parse(document.querySelector('[data-component=\"mapLanguageResources\"]').innerHTML);\r\n\r\n /**\r\n * @constructs NewHomeSource.Map.MapHelper\r\n */\r\n function MapHelper() { }\r\n\r\n /**\r\n * @public\r\n * getResultsType: gets the result type for SRP\r\n *\r\n */\r\n MapHelper.getLanguageByIndex = function getLanguageByIndex(index) {\r\n return languageResources[index];\r\n };\r\n\r\n /**\r\n * @public\r\n * getResultsType: gets the result type for SRP\r\n *\r\n */\r\n MapHelper.getResultsType = function getResultsType(srpType) {\r\n return global.searchTypeHelper.isAnyCommunitySearchType(srpType)\r\n ? 'CommunityResults'\r\n : 'HomeResults';\r\n };\r\n\r\n /**\r\n * @public\r\n * isCustomRadiusResultsPage: true if srp has a custom radius that is not changeable\r\n *\r\n */\r\n MapHelper.isCustomRadiusResultsPage = function isCustomRadiusResultsPage() {\r\n const srpType = global.NewHomeSource.Map.MapParams.getParameter('SrpType');\r\n return srpType === 'BoylResults' ||\r\n srpType === 'CustomHomes' ||\r\n srpType === 'ManufacturedHomes' ||\r\n srpType === 'ManufacturedResults';\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.MapHelper to the previous script.\r\n */\r\n MapHelper.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.MapHelper = previousMapHelper;\r\n return MapHelper;\r\n };\r\n\r\n global.NewHomeSource.Map.MapHelper = MapHelper;\r\n}(window));\r\n\ndefine(\"MapHelper\", function(){});\n\n","/*\r\n * Map params module is the one in charge of interacting with the search\r\n * params object we use to consult listings to the API.\r\n */\r\n(function mapParams(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource.Map = global.NewHomeSource.Map || {};\r\n\r\n const previousMapParams = global.NewHomeSource.Map.MapParams;\r\n let searchParameters = {};\r\n let commResultsHandler = {};\r\n\r\n function MapParams() { }\r\n\r\n document.body.addEventListener('syncUpMapSearchParameters', (event) => {\r\n searchParameters = Object.assign({}, event.detail.data);\r\n\r\n if (searchParameters.IsMapVisible) {\r\n if (event.detail.comesFromExternalFilter) {\r\n return;\r\n }\r\n\r\n const data = {\r\n shouldUpdateCards: false,\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.onMapCenterChanged(data);\r\n }\r\n });\r\n\r\n /**\r\n * @private\r\n * getParameters: gets all the search parameters currently used on the\r\n * page.\r\n *\r\n */\r\n MapParams.getParameters = function getParameters() {\r\n if (searchParameters.SortBy === 'Distance' && !searchParameters.Mfr) {\r\n searchParameters.SortBy = 'Random';\r\n }\r\n\r\n return Object.assign({}, searchParameters);\r\n };\r\n\r\n /**\r\n * @private\r\n * getParameter: gets a search parameter by key returning its value.\r\n *\r\n */\r\n MapParams.getParameter = function getParameter(key) {\r\n const parameters = MapParams.getParameters();\r\n return parameters[key];\r\n };\r\n\r\n /**\r\n * @private\r\n * setParameter: sets one search parameter by finding it by its key\r\n * and updating its value.\r\n *\r\n */\r\n MapParams.setParameter = function setParameter(key, value) {\r\n if (searchParameters[key] === value) {\r\n return;\r\n }\r\n\r\n searchParameters[key] = value;\r\n };\r\n\r\n /**\r\n * @private\r\n * setParameters: sets the search parameters object by an already\r\n * created search parameters instance.\r\n *\r\n */\r\n MapParams.setParameters = function setSearchParameters(parameters) {\r\n searchParameters = parameters;\r\n };\r\n\r\n MapParams.update = function update(data, topic) {\r\n if (topic === 'onMapCreated') {\r\n searchParameters = data.mapConfiguration.searchParameters;\r\n commResultsHandler = data.mapConfiguration.commResultsHandler;\r\n }\r\n\r\n if (topic === 'onMapCenterChanged') {\r\n if (data && !data.shouldUpdateCards) {\r\n return;\r\n }\r\n\r\n document.body.dispatchEvent(new CustomEvent(\r\n 'syncUpExternalSearchParameters',\r\n {\r\n detail: {\r\n data: MapParams.getParameters(),\r\n commResultsHandler,\r\n },\r\n }\r\n ));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.MapParams to the previous script.\r\n */\r\n MapParams.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.MapParams = previousMapParams;\r\n return MapParams;\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.add('onMapCenterChanged', MapParams);\r\n global.NewHomeSource.Map.MapObserver.add('onMapCreated', MapParams);\r\n global.NewHomeSource.Map.MapParams = MapParams;\r\n}(window));\r\n\ndefine(\"MapParams\", function(){});\n\n","/* eslint-disable no-param-reassign */\r\n/*\r\n * Interaction Handler is a module in charge of managing the zoom level on the map,\r\n * centering the map on the point of interest, and in general terms any other\r\n * functionality needed across map interactions.\r\n * The idea is to manage these functions via this module so it become easier to\r\n * understand why and where these zoom changes happens and who triggers them.\r\n */\r\n(function interactionHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Map.BaseMap) {\r\n return;\r\n }\r\n\r\n const previousInteractionHandler = global.NewHomeSource.Map.previousInteractionHandler;\r\n const maxRadiusLabel = global.document.querySelector('[data-component=\"max-radius\"]');\r\n const mapOptions = document.querySelectorAll('[data-map-option]');\r\n let mapInstance = {};\r\n let furtherRadius = 25;\r\n\r\n const furtherRadiusElement = global.document.querySelector('[data-slider-radius-options]');\r\n if (furtherRadiusElement) {\r\n furtherRadius = furtherRadiusElement.dataset.furtherRadius;\r\n }\r\n\r\n /**\r\n * @private\r\n * setMapZoom: sets the map zoom options on the \"onMapCreated\" function.\r\n * in this function, if the zone of interest has a further radius of\r\n * 25 miles or less, we are going to zoom out to a distance where the user can\r\n * see 50 miles radius in order to cover a bit more of area. This is because,\r\n * take for instance Austin, the whole Austin Area has way more things to\r\n * show than what you can see in 25 mile radius from center. So, please\r\n * remember that 25 miles is our further radius, but it doesn't means that\r\n * the zone of interest only covers 25 miles.\r\n * Also, this function sets a min zoom to check 200 and up to 400 mile radius\r\n * if it happens that the further radius in the area is bigger than 25 miles,\r\n * for instance think about Hawaii and it's default 400mile radius.\r\n */\r\n function setMapZoom(zoomToApply) {\r\n const zoomOptions = {\r\n minZoom: +furtherRadius <= 25 ? 8 : 5,\r\n zoom: zoomToApply,\r\n };\r\n\r\n mapInstance.setOptions(zoomOptions);\r\n }\r\n\r\n const zoomLookUp = {\r\n 1: () => { setMapZoom(13); },\r\n 3: () => { setMapZoom(12); },\r\n 5: () => { setMapZoom(11); },\r\n 10: () => { setMapZoom(10); },\r\n 15: () => { setMapZoom(9); },\r\n 25: () => { setMapZoom(9); },\r\n 50: () => { setMapZoom(8); },\r\n 100: () => { setMapZoom(7); },\r\n 150: () => { setMapZoom(6); },\r\n 200: () => { setMapZoom(5); },\r\n 300: () => { setMapZoom(5); },\r\n 400: () => { setMapZoom(5); },\r\n };\r\n\r\n /**\r\n * @private\r\n * changeZoomBasedOnRadius: zooms the map in or out depending on a given radius.\r\n */\r\n function changeZoomBasedOnRadius(radius) {\r\n if (zoomLookUp[radius]) {\r\n zoomLookUp[radius]();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * setUpInitialZoom: function called on map created to set up the map zoom once created.\r\n */\r\n function setUpInitialZoom() {\r\n let radiusToUse = 0;\r\n if (global.NewHomeSource.Map.MapParams.getParameter('WebApiSearchType') === 'Radius') {\r\n radiusToUse = global.NewHomeSource.Map.MapParams.getParameter('Radius');\r\n } else {\r\n radiusToUse = furtherRadius <= 25 ? 50 : furtherRadius;\r\n }\r\n\r\n changeZoomBasedOnRadius(radiusToUse);\r\n }\r\n\r\n /**\r\n * @private\r\n * changeMaxRadiusLabel: changes the max radius label according to the text received as parameter.\r\n */\r\n function changeMaxRadiusLabel(data) {\r\n if (!maxRadiusLabel) {\r\n return;\r\n }\r\n\r\n if (data && data.radius) {\r\n maxRadiusLabel.innerText = data.radius;\r\n return;\r\n }\r\n\r\n if (global.NewHomeSource.Map.MapParams.getParameter('WebApiSearchType') === 'Radius') {\r\n const radiusFromParams = global.NewHomeSource.Map.MapParams.getParameter('Radius');\r\n maxRadiusLabel.innerText = radiusFromParams;\r\n return;\r\n }\r\n\r\n if (furtherRadius) {\r\n maxRadiusLabel.innerText = furtherRadius;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * adjustZoom: figures out the radius of current map and sets the zoom of the map\r\n * base on it.\r\n * data should have the form:\r\n * data = {\r\n * zoomLevel: integer,\r\n * radius: integer,\r\n * }\r\n */\r\n function adjustZoom(data) {\r\n if (data && data.zoomLevel) {\r\n mapInstance.setZoom(data.zoomLevel);\r\n return;\r\n }\r\n\r\n if (data && data.radius) {\r\n changeZoomBasedOnRadius(data.radius);\r\n return;\r\n }\r\n\r\n if (global.NewHomeSource.Map.MapParams.getParameter('WebApiSearchType') === 'Radius') {\r\n const radiusFromParams = global.NewHomeSource.Map.MapParams.getParameter('Radius');\r\n changeZoomBasedOnRadius(radiusFromParams);\r\n return;\r\n }\r\n\r\n if (furtherRadius) {\r\n changeZoomBasedOnRadius(+furtherRadius === 25 ? 50 : furtherRadius);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * changeMapCenter: set the map center to a given lat and lng.\r\n */\r\n function changeMapCenter(coordinates) {\r\n if (coordinates) {\r\n const position = new global.google.maps.LatLng(coordinates.lat, coordinates.lng);\r\n mapInstance.setCenter(position);\r\n return;\r\n }\r\n\r\n const originLat = global.NewHomeSource.Map.MapParams.getParameter('OriginLat');\r\n const originLng = global.NewHomeSource.Map.MapParams.getParameter('OriginLng');\r\n const position = new global.google.maps.LatLng(originLat, originLng);\r\n mapInstance.setCenter(position);\r\n }\r\n\r\n /**\r\n * @private\r\n * updateMapOptions: set the map options to enable or disable.\r\n * @param {Boolean} doDisable the boolean value to disable or not the map options.\r\n */\r\n function updateMapOptions(doDisable) {\r\n mapOptions.forEach((element) => {\r\n if (element.dataset.forceDisable !== 'true') {\r\n if (doDisable) {\r\n element.style.pointerEvents = 'none';\r\n element.style.cursor = 'default';\r\n element.disabled = doDisable;\r\n } else {\r\n element.style.pointerEvents = 'auto';\r\n element.style.cursor = 'pointer';\r\n element.disabled = doDisable;\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Map.InteractionHandler\r\n */\r\n function InteractionHandler() { }\r\n\r\n InteractionHandler.update = function update(data, topic) {\r\n if (topic === 'onMapCreated') {\r\n mapInstance = data.mapInstance;\r\n\r\n if (!data.mapConfiguration.zoom) {\r\n setUpInitialZoom();\r\n }\r\n\r\n changeMaxRadiusLabel();\r\n }\r\n\r\n if (topic === 'onCenterReset') {\r\n changeMapCenter(data);\r\n }\r\n\r\n if (topic === 'onZoomChanged') {\r\n adjustZoom(data);\r\n changeMaxRadiusLabel(data);\r\n }\r\n\r\n if (topic === 'onMapCenterChanged') {\r\n updateMapOptions(true);\r\n }\r\n\r\n if (topic === 'afterMapCenterChanged') {\r\n updateMapOptions(false);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.InteractionHandler to the previous script.\r\n */\r\n InteractionHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.InteractionHandler = previousInteractionHandler;\r\n return InteractionHandler;\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.add('onMapCreated', InteractionHandler);\r\n global.NewHomeSource.Map.MapObserver.add('onZoomChanged', InteractionHandler);\r\n global.NewHomeSource.Map.MapObserver.add('onCenterReset', InteractionHandler);\r\n global.NewHomeSource.Map.MapObserver.add('onMapCenterChanged', InteractionHandler);\r\n global.NewHomeSource.Map.MapObserver.add('afterMapCenterChanged', InteractionHandler);\r\n global.NewHomeSource.Map.InteractionHandler = InteractionHandler;\r\n}(window));\r\n\ndefine(\"InteractionHandler\", function(){});\n\n","/*\r\n * pin handler module works with Marker related stuff from GM. It has 2 main\r\n * goals: executing an AJAX call for bringing GEO results and transform them to\r\n * pins in the map, and another AJAX call related with the infoWindow card that\r\n * shows whenever you click on a pin.\r\n */\r\n(function pinHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const iconsMapElement = document.querySelector('[data-icons-map]');\r\n if (!global.NewHomeSource.Modules ||\r\n !global.NewHomeSource.Map.MapHelper ||\r\n !global.NewHomeSource.Modules.IdleQueue ||\r\n !iconsMapElement) {\r\n return;\r\n }\r\n\r\n const iconsMap = JSON.parse(iconsMapElement.innerText);\r\n const previousPinHandler = global.NewHomeSource.Map.PinHandler;\r\n const eventsQueue = new global.NewHomeSource.Modules.IdleQueue();\r\n const pinsOnMap = {};\r\n const visitedPins = [];\r\n let previousController = null;\r\n let infoWindow = {};\r\n let mapInstance = {};\r\n let mapContainer = null;\r\n let favorites = {};\r\n let getPinsUrl = '';\r\n let getPinUrl = '';\r\n let lastHoveredPin = null;\r\n let mapName = null;\r\n\r\n const svgNonVisitedDictionary = iconsMap.nonVisitedPins;\r\n const svgVisitedDictionary = iconsMap.alreadyVisitedPins;\r\n\r\n /**\r\n * @private\r\n * showLoading: adds to the map the html structure in charge of\r\n * showing a loading gif to the user\r\n *\r\n */\r\n function showLoading() {\r\n const loadingStructure = global.document.querySelector('[data-component=\"map-loading\"]');\r\n const loadingClone = loadingStructure.content.cloneNode(true);\r\n mapContainer.prepend(loadingClone);\r\n }\r\n\r\n /**\r\n * @private\r\n * hideLoading: removes from the map the html structure in charge of\r\n * showing a loading gif to the user\r\n *\r\n */\r\n function hideLoading() {\r\n const loadingClones = mapContainer.querySelectorAll('[data-role=\"loading-structure\"]');\r\n loadingClones.forEach((element) => {\r\n element.remove();\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * getIconWithText: returns an svg with the text to display on it\r\n *\r\n */\r\n function getIconWithText(svg, label) {\r\n const svgToWork = svg;\r\n\r\n const icon = svgToWork.replace('#LabelText', label || '');\r\n return icon;\r\n }\r\n\r\n /**\r\n * @private\r\n * getPinIcon: returns the SVG to use in the map pin\r\n *\r\n */\r\n function getPinIcon(configPinObject, svgDictionary, resultType) {\r\n const srpType = resultType || global.NewHomeSource.Map.MapParams.getParameter('SrpType');\r\n const srpTypeAttribute = resultType || global.NewHomeSource.Map.MapHelper.getResultsType(srpType);\r\n const unitsLabel = global.NewHomeSource.Map.MapHelper.getLanguageByIndex(srpTypeAttribute);\r\n const priceLengthForSmallPins = 5;\r\n\r\n switch (srpTypeAttribute) {\r\n case 'HomeResults': {\r\n if (configPinObject.data.label.indexOf(unitsLabel) === -1 && configPinObject.data.isBasicCard) {\r\n return getIconWithText(svgDictionary.basicHome);\r\n }\r\n\r\n if (configPinObject.data.label.length <= priceLengthForSmallPins) {\r\n return getIconWithText(svgDictionary.homeShort, configPinObject.data.label);\r\n }\r\n\r\n return getIconWithText(svgDictionary.home, configPinObject.data.label);\r\n }\r\n\r\n case 'CommunityResults': {\r\n if (configPinObject.data.label.indexOf(unitsLabel) === -1 && configPinObject.data.isBasicCard) {\r\n return getIconWithText(svgDictionary.basicComm);\r\n }\r\n\r\n if (configPinObject.data.label.length <= priceLengthForSmallPins) {\r\n return getIconWithText(svgDictionary.communityShort, configPinObject.data.label);\r\n }\r\n\r\n return getIconWithText(svgDictionary.community, configPinObject.data.label);\r\n }\r\n default:\r\n return 'TBD - Sales center';\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * setIcon: sets an icon to a map pin\r\n *\r\n */\r\n function setIcon(pin, configPinObject, svgDictionary) {\r\n if (visitedPins.indexOf(configPinObject.data.id) !== -1) {\r\n return;\r\n }\r\n\r\n const icon = getPinIcon(configPinObject, svgDictionary);\r\n const codedIcon = 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(icon);\r\n pin.setIcon(codedIcon);\r\n }\r\n\r\n /**\r\n * @private\r\n * pushVisitedPin: once a pin is visited, this function pushes it to a visited array\r\n *\r\n */\r\n function pushVisitedPin(referrerPin) {\r\n const pin = referrerPin;\r\n\r\n if (visitedPins.indexOf(pin.data.id) !== -1) {\r\n return;\r\n }\r\n\r\n visitedPins.push(pin.data.id);\r\n }\r\n\r\n /**\r\n * @private\r\n * getAllowRegistrationFlag: gets a flag indicating if allow registration is valid in the current partner.\r\n *\r\n */\r\n function getAllowRegistrationFlag() {\r\n const allowRegistration = document.querySelector('#nhs_partnerAllowRegistration');\r\n if (!allowRegistration) {\r\n return false;\r\n }\r\n\r\n return allowRegistration.value;\r\n }\r\n\r\n /**\r\n * @private\r\n * getParamsForMultipleListingsSearch: returns the params to build the API call for the scenario\r\n * of several homes sharing the same lat and lng.\r\n *\r\n */\r\n function getParamsForMultipleListingsSearch(referrerPin) {\r\n const paramsObject = {\r\n pageSize: referrerPin.data.pageSize,\r\n brands: [...new Set(referrerPin.data.brands)],\r\n comms: [...new Set(referrerPin.data.comms)],\r\n SrpType: global.NewHomeSource.Map.MapParams.getParameter('SrpType'),\r\n plans: [...new Set(referrerPin.data.plans)],\r\n specs: [...new Set(referrerPin.data.specs)],\r\n allowRegistration: getAllowRegistrationFlag(),\r\n marketId: referrerPin.data.marketId,\r\n mapName\r\n };\r\n\r\n const comms = referrerPin.data.comms;\r\n\r\n if (comms && comms.indexOf(0) === -1) {\r\n paramsObject.comms = comms;\r\n\r\n return paramsObject;\r\n }\r\n\r\n paramsObject.basicListings = [...new Set(referrerPin.data.basicListings)];\r\n paramsObject.isBasicListing = referrerPin.data.isBasicListing;\r\n paramsObject.comms = [];\r\n paramsObject.brands = [];\r\n return paramsObject;\r\n }\r\n\r\n /**\r\n * @private\r\n * getDataForSingleListingSearch: returns the params to build the API call for the scenario\r\n * of a single pin in the map.\r\n *\r\n */\r\n function getDataForSingleListingSearch(referrerPin) {\r\n return {\r\n commId: referrerPin.data.communityId,\r\n planId: referrerPin.data.plans[0] || 0,\r\n specId: referrerPin.data.specs[0] || 0,\r\n brandId: referrerPin.data.brands[0] || 0,\r\n listingId: referrerPin.data.basicListings[0] || 0,\r\n SrpType: global.NewHomeSource.Map.MapParams.getParameter('SrpType'),\r\n isBasicListing: referrerPin.data.isBasicListing,\r\n allowRegistration: getAllowRegistrationFlag(),\r\n marketId: referrerPin.data.marketId,\r\n mapName,\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * getSinglePin: hits the server and returns information about a listing clicked\r\n *\r\n */\r\n function getSinglePin(referrerPin, configPinObject) {\r\n const pin = referrerPin;\r\n\r\n setIcon(referrerPin, configPinObject, svgVisitedDictionary);\r\n pushVisitedPin(pin);\r\n infoWindow.close();\r\n\r\n let data = {};\r\n if ((typeof configPinObject.data.pageSize === 'number' && configPinObject.data.pageSize > 1) ||\r\n (configPinObject.data.comms && configPinObject.data.comms.length > 1)) {\r\n data = getParamsForMultipleListingsSearch(referrerPin);\r\n } else {\r\n data = getDataForSingleListingSearch(referrerPin);\r\n }\r\n\r\n showLoading();\r\n const singlePinXhr = new XMLHttpRequest();\r\n singlePinXhr.open('POST', getPinUrl, true);\r\n singlePinXhr.setRequestHeader('Content-Type', 'application/json');\r\n const acceptHeader = localStorage.getItem('browserAcceptTypes') || '*/*';\r\n singlePinXhr.setRequestHeader('Accept', acceptHeader);\r\n singlePinXhr.send(JSON.stringify(data));\r\n\r\n singlePinXhr.onreadystatechange = () => {\r\n if (singlePinXhr.readyState !== 4) {\r\n return;\r\n }\r\n\r\n if (singlePinXhr.status === 200) {\r\n if (!singlePinXhr.response) {\r\n return;\r\n }\r\n\r\n infoWindow.setContent(singlePinXhr.response);\r\n infoWindow.open({\r\n anchor: referrerPin,\r\n map: mapInstance,\r\n shouldFocus: false,\r\n });\r\n }\r\n\r\n hideLoading();\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * getOpenPinCommunityGALabel: returns the label for the Google Analytics related to community pins.\r\n * @param {object} pinData information related to the current pin.\r\n */\r\n function getOpenPinCommunityGALabel(pinData) {\r\n const isBasic = pinData.isBasicCard;\r\n if (isBasic) {\r\n return 'View - Basic';\r\n }\r\n\r\n const callForPriceLabel = window.NewHomeSource.Map.MapHelper.getLanguageByIndex('CallForPrice');\r\n if (pinData.label === callForPriceLabel) {\r\n return 'View - Call for Price';\r\n }\r\n\r\n return 'View - Communities';\r\n }\r\n\r\n /**\r\n * @private\r\n * getOpenPinHomeGALabel: returns the label for the Google Analytics related to home pins.\r\n * @param {object} pinData information related to the current pin.\r\n */\r\n function getOpenPinHomeGALabel(pinData) {\r\n const isBasic = pinData.isBasicCard;\r\n\r\n if (isBasic) {\r\n return 'View - Basic Homes';\r\n }\r\n\r\n return 'View - Homes';\r\n }\r\n\r\n /**\r\n * @private\r\n * getOpenPinGALabel: returns the label for the Google Analytics related to pins according to its pin type.\r\n * @param {object} pinConfiguration configuration related to the current pin.\r\n */\r\n function getOpenPinGALabel(pinConfiguration) {\r\n const getOpenPinGALabelFunctions = {\r\n HomeResults: getOpenPinHomeGALabel,\r\n CommunityResults: getOpenPinCommunityGALabel\r\n };\r\n\r\n const selectedGALabelFunction = getOpenPinGALabelFunctions[pinConfiguration.resultType];\r\n const gaLabel = selectedGALabelFunction(pinConfiguration.data);\r\n\r\n return gaLabel;\r\n }\r\n\r\n /**\r\n * @private\r\n * shouldTrackOpenPinGAEvent: returns the label for the Google Analytics related to pins according to its pin type.\r\n * @param {object} pinConfiguration configuration related to the current pin.\r\n */\r\n function shouldTrackOpenPinGAEvent(pinConfiguration) {\r\n if (pinConfiguration.resultType === 'HomeResults') {\r\n // We should only track the single home pins\r\n // Also, we don't have to track the basic detail pins\r\n return pinConfiguration.data.pageSize === 1 && !pinConfiguration.data.isBasicListing;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * @private\r\n * trackOpenPinEvent: track the Open Pin event if it should\r\n * @param {object} pinConfiguration configuration related to the current pin.\r\n */\r\n function trackOpenPinEvent(pinConfiguration) {\r\n const shouldTrackEvent = shouldTrackOpenPinGAEvent(pinConfiguration);\r\n if (!shouldTrackEvent) {\r\n return;\r\n }\r\n\r\n const gaLabel = getOpenPinGALabel(pinConfiguration);\r\n const gaEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Map',\r\n eventAction: 'Search Action',\r\n eventLabel: gaLabel,\r\n };\r\n\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: gaEvent\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * @private\r\n * createPin: creates a single pin in the current map instance.\r\n * @param {object} configPinObject configuration related to the current pin.\r\n */\r\n function createPin(configPinObject) {\r\n const position = configPinObject.getPosition();\r\n const pinPosition = new global.google.maps.LatLng(position.lat, position.lng);\r\n\r\n const options = {\r\n position: pinPosition,\r\n icon: 'data:image/svg+xml;charset=UTF-8;base64,' + btoa(configPinObject.icon),\r\n title: configPinObject.name,\r\n zIndex: configPinObject.zindex,\r\n label: {\r\n text: ' ',\r\n color: 'white',\r\n class: 'rectanleLabel'\r\n },\r\n data: configPinObject.data,\r\n };\r\n\r\n const pin = new global.google.maps.Marker(options);\r\n\r\n const index = pinsOnMap[configPinObject.resultType].indexOf(configPinObject);\r\n pinsOnMap[configPinObject.resultType][index] = pin;\r\n\r\n pin.addListener('click', () => {\r\n trackOpenPinEvent(configPinObject);\r\n lastHoveredPin = null;\r\n getSinglePin(pin, configPinObject);\r\n global.NewHomeSource.Map.MapObserver.onPinClicked(configPinObject);\r\n });\r\n\r\n pin.addListener('mouseout', () => {\r\n lastHoveredPin = null;\r\n setIcon(pin, configPinObject, svgNonVisitedDictionary);\r\n });\r\n\r\n pin.addListener(\r\n 'mouseover',\r\n () => {\r\n lastHoveredPin = {\r\n pin,\r\n configPinObject\r\n };\r\n\r\n setIcon(pin, configPinObject, svgVisitedDictionary);\r\n }\r\n );\r\n\r\n return pin;\r\n }\r\n\r\n /**\r\n * @private\r\n * getCardId: gets the Id to place to the pin information based on\r\n * what the user is requesting, it could be a community, plan, spec.\r\n *\r\n */\r\n function getCardId(info, geoTypeRequested) {\r\n let idToReturn = 0;\r\n switch (geoTypeRequested) {\r\n case 'community':\r\n idToReturn = info.CommId;\r\n break;\r\n case 'spec':\r\n if (info.HomeInfo && info.HomeInfo.IsSpec === 1) {\r\n idToReturn = info.Id;\r\n }\r\n break;\r\n case 'plan':\r\n if (info.HomeInfo && info.HomeInfo.IsSpec === 0 && !info.IsBl) {\r\n idToReturn = info.Id;\r\n }\r\n break;\r\n case 'basicHome':\r\n if (info.HomeInfo && info.HomeInfo.IsSpec === 0 && info.IsBl) {\r\n idToReturn = info.Id;\r\n }\r\n break;\r\n default:\r\n idToReturn = 0;\r\n }\r\n\r\n return idToReturn;\r\n }\r\n\r\n /**\r\n * @private\r\n * getDistinctIds: gets the different IDs out of a single property in an array\r\n *\r\n */\r\n function getDistinctIds(array, property) {\r\n const temporalArray = [];\r\n array.forEach((data) => temporalArray.indexOf(data[property]) === -1 && temporalArray.push(data[property]));\r\n return temporalArray;\r\n }\r\n\r\n /**\r\n * @private\r\n * createObjectPin: plots pins in the current map instance.\r\n *\r\n */\r\n function createObjectPin(result, index, resultType) {\r\n let mapData = mapInstance;\r\n const configPinObject = {\r\n getPosition: () => ({\r\n lat: +result.Lat,\r\n lng: +result.Lng,\r\n }),\r\n zindex: index,\r\n optimized: true,\r\n priceHigh: Math.ceil(result.MarketPoints[0].PrHi),\r\n priceLow: Math.ceil(result.MarketPoints[0].PrLo),\r\n data: {\r\n communityId: getCardId(result.MarketPoints[0], 'community'),\r\n comms: getDistinctIds(result.MarketPoints, 'CommId'),\r\n plans: result.MarketPoints.map((plan) => getCardId(plan, 'plan')),\r\n specs: result.MarketPoints.map((spec) => getCardId(spec, 'spec')),\r\n brands: getDistinctIds(result.MarketPoints, 'BrandId'),\r\n basicListings: result.MarketPoints.map((basic) => getCardId(basic, 'basicHome')),\r\n isBasicCard: result.MarketPoints[0].IsBl === 1 || result.MarketPoints[0].IsBasic === 1,\r\n isBasicListing: result.MarketPoints[0].IsBl === 1,\r\n pageSize: result.Units,\r\n label: result.Label,\r\n units: result.Units,\r\n marketId: result.MarketPoints[0].MarketId,\r\n },\r\n getMap: () => mapData,\r\n setMap: (mapValue) => {\r\n mapData = mapValue;\r\n },\r\n resultType\r\n };\r\n\r\n // eslint-disable-next-line max-len\r\n configPinObject.data.id = `${configPinObject.data.communityId}-${configPinObject.data.plans[0] || 0}-${configPinObject.data.specs[0] || 0}-${configPinObject.data.basicListings[0]}`;\r\n configPinObject.visited = visitedPins.indexOf(configPinObject.data.id) !== -1;\r\n\r\n const svgDictionaryToUse = configPinObject.visited\r\n ? svgVisitedDictionary\r\n : svgNonVisitedDictionary;\r\n\r\n configPinObject.icon = getPinIcon(configPinObject, svgDictionaryToUse, resultType);\r\n\r\n return configPinObject;\r\n }\r\n\r\n /**\r\n * @private\r\n * areTherePinsInMap: returns a flag indicating if there are pins plotted in the map.\r\n *\r\n */\r\n function areTherePinsInMap() {\r\n return pinsOnMap.CommunityResults || pinsOnMap.HomeResults;\r\n }\r\n\r\n /**\r\n * @private\r\n * handlePins: function in charge of the pin creation on the map.\r\n *\r\n */\r\n function handlePins() {\r\n let defaultZIndex = this.index || 9;\r\n while (this.result.length) {\r\n pinsOnMap[this.resultType].push(createObjectPin(this.result.shift(), defaultZIndex, this.resultType));\r\n defaultZIndex += 1;\r\n }\r\n\r\n if (this.drawPin) {\r\n global.NewHomeSource.Map.MapObserver.onPinsCreated(pinsOnMap[this.resultType]);\r\n hideLoading();\r\n global.NewHomeSource.Map.MapObserver.afterMapCenterChanged(true);\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * getPins: gets pins for communities or homes based on a geography.\r\n *\r\n */\r\n async function getPins() {\r\n const body = {\r\n searchParameters: global.NewHomeSource.Map.MapParams.getParameters(),\r\n };\r\n\r\n const isFirstLoad = !areTherePinsInMap();\r\n const controller = new AbortController();\r\n\r\n if (previousController) {\r\n previousController.abort();\r\n }\r\n previousController = controller;\r\n\r\n showLoading();\r\n const response = await fetch(getPinsUrl, {\r\n method: 'POST',\r\n body: JSON.stringify(body),\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n signal: controller.signal\r\n });\r\n\r\n if (response.ok) {\r\n const data = await response.json();\r\n const srpType = global.NewHomeSource.Map.MapParams.getParameter('SrpType');\r\n const resultType = global.NewHomeSource.Map.MapHelper.getResultsType(srpType);\r\n\r\n if (!data || !data[resultType]) {\r\n return;\r\n }\r\n\r\n pinsOnMap.CommunityResults = [];\r\n pinsOnMap.HomeResults = [];\r\n handlePins.call({\r\n result: Object.assign([], data[resultType].Results),\r\n resultType,\r\n drawPin: true\r\n });\r\n\r\n const dataForSubscribers =\r\n {\r\n commCount: data.CommunityResults.Total - data.CommunityResults.NoPlotted,\r\n homeCount: data.HomeResults.Total - data.HomeResults.NoPlotted,\r\n shouldCenterMap: !isFirstLoad,\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.onExternalFilterApplied(dataForSubscribers);\r\n\r\n // After the pins was created, handler the pins to GMaps\r\n eventsQueue.pushTask(() => {\r\n const resutlToLazyLoad = resultType === 'CommunityResults' ? 'HomeResults' : 'CommunityResults';\r\n global.NewHomeSource.Map.MapObserver.afterPinsCreated({\r\n result: Object.assign([], data[resutlToLazyLoad].Results),\r\n resultType: resutlToLazyLoad\r\n });\r\n return true;\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Map.PinHandler\r\n */\r\n function PinHandler() { }\r\n\r\n PinHandler.update = function update(data, topic) {\r\n if (topic === 'onMapCenterChanged') {\r\n const srpType = global.NewHomeSource.Map.MapParams.getParameter('SrpType');\r\n const resultType = global.NewHomeSource.Map.MapHelper.getResultsType(srpType);\r\n const pins = pinsOnMap[resultType];\r\n\r\n if (data && data.isSubjectChange && pins.length) {\r\n global.NewHomeSource.Map.MapObserver.onPinsCreated(pins);\r\n hideLoading();\r\n global.NewHomeSource.Map.MapObserver.afterMapCenterChanged(true);\r\n return;\r\n }\r\n\r\n getPins();\r\n }\r\n\r\n if (topic === 'onMapCreated') {\r\n mapName = data.mapConfiguration.mapName || null;\r\n getPinsUrl = data.mapConfiguration.getPinsUrl;\r\n getPinUrl = data.mapConfiguration.getPinUrl;\r\n mapInstance = data.mapInstance;\r\n mapContainer = data.mapConfiguration.mapContainer;\r\n favorites = data.mapConfiguration.saveToFavorites;\r\n infoWindow = new global.google.maps.InfoWindow();\r\n\r\n global.google.maps.event.addListener(\r\n infoWindow,\r\n 'visible',\r\n () => {\r\n global.NewHomeSource.Map.MapObserver.onInfoWindowLoaded(infoWindow);\r\n favorites.init();\r\n }\r\n );\r\n\r\n global.google.maps.event.addListener(\r\n infoWindow,\r\n 'closeclick',\r\n () => {\r\n global.NewHomeSource.Map.MapObserver.onCardClosed(infoWindow);\r\n }\r\n );\r\n\r\n global.google.maps.event.addListener(\r\n mapInstance,\r\n 'click',\r\n infoWindow.close\r\n );\r\n\r\n global.google.maps.event.addListener(\r\n mapInstance,\r\n 'dragend',\r\n infoWindow.close\r\n );\r\n\r\n global.google.maps.event.addListener(\r\n mapInstance,\r\n 'zoom_changed',\r\n () => {\r\n infoWindow.close();\r\n\r\n if (lastHoveredPin) {\r\n setIcon(lastHoveredPin.pin, lastHoveredPin.configPinObject, svgNonVisitedDictionary);\r\n }\r\n }\r\n );\r\n }\r\n\r\n if (topic === 'afterPinsCreated') {\r\n const results = data.result;\r\n const resultType = data.resultType;\r\n handlePins.call({\r\n result: Object.assign([], results),\r\n resultType,\r\n drawPin: false\r\n });\r\n }\r\n };\r\n\r\n PinHandler.CreatePin = createPin;\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.PinHandler to the previous script.\r\n */\r\n PinHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.PinHandler = previousPinHandler;\r\n return PinHandler;\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.add('onMapCenterChanged', PinHandler);\r\n global.NewHomeSource.Map.MapObserver.add('onMapCreated', PinHandler);\r\n global.NewHomeSource.Map.MapObserver.add('afterPinsCreated', PinHandler);\r\n global.NewHomeSource.Map.PinHandler = PinHandler;\r\n}(window));\r\n\ndefine(\"PinHandler\", function(){});\n\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\ndefine(\"arrowHandler\", function(){});\n\n","/*\r\n * Cluster Handler module is in charge of creating clusters on a map Instance. It exposes\r\n * a way of creating and deleting clusters. A map it's able to support n clusters at the\r\n * same time (careful with maps with lots of data, it might look not so great due to\r\n * overlapping)\r\n */\r\n(function clusterHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const iconsMapElement = document.querySelector('[data-icons-map]');\r\n\r\n if (!global.NewHomeSource.Map.BaseMap ||\r\n !global.NewHomeSource.Map.MapHelper ||\r\n !iconsMapElement) {\r\n return;\r\n }\r\n\r\n const previousClusterHandler = global.NewHomeSource.Map.previousClusterHandler;\r\n const iconsMap = JSON.parse(iconsMapElement.innerText);\r\n let mapInstance = {};\r\n const clustersOnMap = [];\r\n const svgDictionary = iconsMap.clusters;\r\n\r\n /*\r\n * isHomeCluster: interpret a single pin and returns true if the pin is for a home, false otherwise.\r\n */\r\n function isHomeCluster(clusterPin) {\r\n if (clusterPin.data.plans.find((planId) => planId > 0)) {\r\n return true;\r\n }\r\n\r\n if (clusterPin.data.specs.find((specId) => specId > 0)) {\r\n return true;\r\n }\r\n\r\n if (clusterPin.data.basicListings.find((basicId) => basicId > 0)) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /*\r\n * getClusterName: gets a key to use in a dictionary. The key represents\r\n * what cluster should be used for certain a operation.\r\n */\r\n function getClusterName(clusterPin) {\r\n if (clusterPin.data.SalesCenterId) {\r\n return 'salesCenter';\r\n }\r\n\r\n if (isHomeCluster(clusterPin)) {\r\n return 'HomeResults';\r\n }\r\n\r\n return 'CommunityResults';\r\n }\r\n\r\n /*\r\n * getClusterSvg: gets the svg to display in a cluster. It could be a comm,\r\n * home, sales center, etc. Find the possibilities in svgDictionary var.\r\n */\r\n function getClusterSvg(count, clusterName) {\r\n if (!svgDictionary[clusterName]) {\r\n return '';\r\n }\r\n\r\n const svgToUse = svgDictionary[clusterName];\r\n const label = global.NewHomeSource.Map.MapHelper.getLanguageByIndex(clusterName);\r\n return svgToUse.replace('#LabelText', `${count} ${label}`);\r\n }\r\n\r\n function firedOnMarkerClusterClick(cluster) {\r\n global.NewHomeSource.Map.MapObserver.onClusterClicked({\r\n clusterType: this.clusterType,\r\n cluster\r\n });\r\n }\r\n\r\n /*\r\n * adjustClusterStyles: callback to adjust SVG for the cluster with the number\r\n * of items the cluster is holding.\r\n */\r\n function adjustClusterStyles(cluster, count, clusterName) {\r\n const svg = getClusterSvg(count, clusterName);\r\n // eslint-disable-next-line no-param-reassign\r\n cluster.style.backgroundImage = 'url(\"data:image/svg+xml;charset=UTF-8;base64,' + btoa(svg) + '\")';\r\n cluster.setAttribute('data-srp-cluster', 'true');\r\n cluster.setAttribute('data-cluster-type', clusterName);\r\n }\r\n\r\n /**\r\n * @private\r\n * removeClusters: Deletes a specific cluster if present, otherwise deletes all of them.\r\n *\r\n */\r\n function removeClusters(clusterName) {\r\n if (!clusterName) {\r\n clustersOnMap.forEach((item) => {\r\n item.cluster.clearMarkers();\r\n });\r\n\r\n clustersOnMap.length = 0;\r\n return;\r\n }\r\n\r\n const clusterToDelete = clustersOnMap.find((x) => x.name === clusterName);\r\n const indexToRemove = clustersOnMap.indexOf(clusterToDelete);\r\n if (indexToRemove !== -1) {\r\n clusterToDelete.pins.forEach((item) => {\r\n item.cluster.clearMarkers();\r\n });\r\n clustersOnMap.splice(indexToRemove, 1);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * clusterResults: Receives an array of markers and creates a cluster for them.\r\n *\r\n */\r\n function clusterResults(pinsToMakeClusterAround) {\r\n removeClusters();\r\n\r\n if (pinsToMakeClusterAround.length === 0) {\r\n return;\r\n }\r\n\r\n const clusterName = getClusterName(pinsToMakeClusterAround[0]);\r\n const MarkerClustererOptions = {\r\n gridSize: 50,\r\n maxZoom: 15,\r\n cssName: 'nhs_Cluster map__cluster',\r\n imagePath: null,\r\n zoomOnClick: true,\r\n minimumClusterSize: null,\r\n afterRenderCallback: adjustClusterStyles,\r\n name: clusterName,\r\n createPinMethod: global.NewHomeSource.Map.PinHandler.CreatePin\r\n };\r\n\r\n const cluster = {\r\n name: clusterName,\r\n cluster: new global.MarkerClusterer(mapInstance, pinsToMakeClusterAround, MarkerClustererOptions),\r\n };\r\n\r\n google.maps.event.addListener(cluster.cluster, 'clusterclick', firedOnMarkerClusterClick.bind({\r\n clusterType: clusterName\r\n }));\r\n\r\n clustersOnMap.push(cluster);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Map.ClusterHandler\r\n */\r\n function ClusterHandler() { }\r\n\r\n ClusterHandler.update = function update(data, topic) {\r\n if (topic === 'onMapCreated') {\r\n mapInstance = data.mapInstance;\r\n }\r\n\r\n if (topic === 'onPinsCreated') {\r\n clusterResults(data);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.ClusterHandler to the previous script.\r\n */\r\n ClusterHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.ClusterHandler = previousClusterHandler;\r\n return ClusterHandler;\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.add('onMapCreated', ClusterHandler);\r\n global.NewHomeSource.Map.MapObserver.add('onPinsCreated', ClusterHandler);\r\n global.NewHomeSource.Map.ClusterHandler = ClusterHandler;\r\n ClusterHandler();\r\n}(window));\r\n\ndefine(\"ClusterHandler\", function(){});\n\n","define('asyncLoader',[],function () {\r\n \"use strict\";\r\n var DEFAULT_PARAM_NAME = 'callback',\r\n _uid = 0;\r\n\r\n function injectScript(src) {\r\n var s, t;\r\n s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = src;\r\n t = document.getElementsByTagName('script')[0]; t.parentNode.insertBefore(s, t);\r\n }\r\n\r\n function formatUrl(name, id) {\r\n var paramRegex = /!(.+)/,\r\n url = name.replace(paramRegex, ''),\r\n param = (paramRegex.test(name)) ? name.replace(/.+!/, '') : DEFAULT_PARAM_NAME;\r\n url += (url.indexOf('?') < 0) ? '?' : '&';\r\n return url + param + '=' + id;\r\n }\r\n\r\n function uid() {\r\n _uid += 1;\r\n return '__async_req_' + _uid + '__';\r\n }\r\n\r\n return {\r\n load: function (name, req, onLoad, config) {\r\n if (config.isBuild) {\r\n onLoad(null); //avoid errors on the optimizer\r\n } else {\r\n var id = uid();\r\n //create a global variable that stores onLoad so callback\r\n //function can define new module after async load\r\n window[id] = onLoad;\r\n injectScript(formatUrl(name, id));\r\n }\r\n }\r\n };\r\n});\n","define('googlemaps',[\r\n 'asyncLoader'\r\n], function (async) {\r\n var root = this;\r\n\r\n /**\r\n * Google maps AMD loader plugin.\r\n *\r\n * Example:\r\n * // All configs options are optional.\r\n * require.config({\r\n * googlemaps: {\r\n * url: 'https://maps.googleapis.com/maps/api/js',\r\n * params: {\r\n * key: 'abcd1234',\r\n * libraries: 'geometry',\r\n * sensor: true // Defaults to false\r\n * },\r\n * async: asyncLoaderPlugin // Primarly for providing test stubs.\r\n * }\r\n * });\r\n *\r\n * require(['googlemaps!'], function(gmaps) {\r\n * var map = new gmaps.Map('map-canvas);\r\n * });\r\n *\r\n */\r\n var googlemapsPlugin = {\r\n load: function (name, parentRequire, onload, opt_config) {\r\n var googleMapsLoader;\r\n var config = opt_config || {};\r\n\r\n if (config.isBuild) {\r\n onload(null);\r\n return;\r\n }\r\n\r\n googleMapsLoader = new GoogleMapsLoader(parentRequire, onload, config.googlemaps || {});\r\n googleMapsLoader.load();\r\n }\r\n };\r\n\r\n /**\r\n * Helper class for googlemaps loader plugin.\r\n */\r\n var GoogleMapsLoader = function (require, onload, config) {\r\n this.require_ = require;\r\n this.onload_ = onload || NOOP;\r\n this.baseUrl_ = config.url || GoogleMapsLoader.DEFAULT_BASE_URL;\r\n this.async_ = config.async || async;\r\n this.params_ = config.params;\r\n };\r\n\r\n GoogleMapsLoader.prototype.load = function () {\r\n if (this.isGoogleMapsLoaded_()) {\r\n this.resolveWith_(this.getGlobalGoogleMaps_());\r\n }\r\n else {\r\n this.loadGoogleMaps_();\r\n }\r\n };\r\n\r\n GoogleMapsLoader.prototype.loadGoogleMaps_ = function () {\r\n var self = this;\r\n\r\n var onAsyncLoad = function () {\r\n // Ensure correct context\r\n self.resolveWithGoogleMaps_(self);\r\n };\r\n onAsyncLoad.onerror = this.onload_.onerror;\r\n\r\n this.async_.load(this.getGoogleUrl_(), this.require_, onAsyncLoad, {});\r\n };\r\n\r\n GoogleMapsLoader.prototype.getGoogleUrl_ = function () {\r\n return this.baseUrl_ + '?' + this.serializeParams_();\r\n };\r\n\r\n GoogleMapsLoader.prototype.resolveWithGoogleMaps_ = function () {\r\n if (!this.isGoogleMapsLoaded_()) {\r\n this.reject_();\r\n return;\r\n }\r\n\r\n this.resolveWith_(this.getGlobalGoogleMaps_());\r\n };\r\n\r\n /** Thanks to http://jsfiddle.net/rudiedirkx/U5Tyb/1/ */\r\n GoogleMapsLoader.prototype.serializeParams_ = function () {\r\n var encodedParams = [];\r\n for (var key in this.params_) {\r\n if (this.params_.hasOwnProperty(key)) {\r\n var value = this.params_[key];\r\n var isObject = (typeof value === 'object');\r\n var encodedParam = encodeURIComponent(key) + \"=\" + encodeURIComponent(value);\r\n var serializedValue = isObject ? this.serializeParams_(value, key) : encodedParam;\r\n\r\n encodedParams.push(serializedValue);\r\n }\r\n }\r\n\r\n return encodedParams.join(\"&\");\r\n };\r\n\r\n GoogleMapsLoader.prototype.isGoogleMapsLoaded_ = function () {\r\n return root.google && root.google.maps;\r\n };\r\n\r\n GoogleMapsLoader.prototype.getGlobalGoogleMaps_ = function () {\r\n return root.google ? root.google.maps : undefined;\r\n };\r\n\r\n GoogleMapsLoader.prototype.resolveWith_ = function (var_args) {\r\n this.onload_.apply(root, arguments);\r\n };\r\n\r\n GoogleMapsLoader.prototype.reject_ = function (opt_error) {\r\n var error = opt_error || new Error('Failed to load Google Maps library.');\r\n\r\n if (this.onload_.onerror) {\r\n this.onload_.onerror.call(root, error);\r\n }\r\n else {\r\n throw error;\r\n }\r\n };\r\n\r\n GoogleMapsLoader.DEFAULT_BASE_URL = 'https://maps.googleapis.com/maps/api/js';\r\n\r\n function NOOP() {\r\n }\r\n\r\n return googlemapsPlugin;\r\n});\n","/* eslint-disable no-param-reassign */\r\n/*\r\n * card handler module works with card related functions like the call for price option.\r\n */\r\n(function cardHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Map.BaseMap ||\r\n !global.NewHomeSource.Modules.ArrowHandler) {\r\n return;\r\n }\r\n\r\n const previousCardHandler = global.NewHomeSource.Map.CardHandler;\r\n const swipingObject = {};\r\n const minimumMoveSlider = 60;\r\n let activeCarousels = [];\r\n\r\n /**\r\n * @private\r\n *\r\n * setUpCarousel: sets up a carousel from a given container\r\n */\r\n function setUpCarousel(carouselContainer, collectionSelector, arrowSelector) {\r\n setTimeout(() => {\r\n let currentCarousel = null;\r\n currentCarousel = new global.NewHomeSource.Modules.ArrowHandler({\r\n container: carouselContainer,\r\n collectionsReferenceSelector: collectionSelector,\r\n arrowReferenceSelector: arrowSelector,\r\n });\r\n\r\n activeCarousels.push(currentCarousel);\r\n }, 300);\r\n }\r\n\r\n /**\r\n * @private\r\n * trackChangeImageEvent: tracks the change image event when the image arrow is clicked.\r\n * @param {object} event result of the click on the page.\r\n */\r\n function trackChangeImageEvent(event) {\r\n if (event && event.target && event.target.dataset.desktopGalleryArrow) {\r\n const gaEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Map',\r\n eventAction: 'Search Action',\r\n eventLabel: 'Scroll - Gallery',\r\n };\r\n\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: gaEvent\r\n }\r\n }));\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * attachLinkToDetailEvent: attaches event to handle link to detail page function\r\n */\r\n function attachLinkToDetailEvent(card) {\r\n const linkToDetail = card.querySelector('[data-role=\"card-link-to-detail\"]');\r\n if (!linkToDetail) {\r\n return;\r\n }\r\n\r\n linkToDetail.addEventListener('click', global.NewHomeSource.Map.MapObserver.onCardLinkFollowed);\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * attachCallForDetailsEvent: attaches event to handle call for details function\r\n */\r\n function attachCallForDetailsEvent(card) {\r\n const phoneElement = card.querySelector('[data-call-for-price]');\r\n if (!phoneElement) {\r\n return;\r\n }\r\n\r\n phoneElement.addEventListener('click', () => {\r\n const hiddenPhone = card.querySelector('[data-hidden-phone]');\r\n hiddenPhone.style.display = 'flex';\r\n hiddenPhone.classList.remove('hidden');\r\n phoneElement.style.display = 'none';\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * disposeCarousel: disposes allocated resources for a carousel\r\n */\r\n function disposeCarousel(carousel) {\r\n if (carousel) {\r\n carousel.dispose();\r\n carousel = null;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * onGalleryImageError: attaches on error listener function to map card gallery images\r\n */\r\n function onGalleryImageError(cardContainer, brokenImage) {\r\n const pictures = cardContainer.querySelectorAll('PICTURE');\r\n if (pictures.length === 1) {\r\n const image = pictures[0].querySelector('IMG');\r\n\r\n image.classList.remove('nhs_lazyLoadImage', 'nhs_lazyLoadSize', 'async');\r\n image.removeAttribute('data-lazy-load');\r\n image.removeAttribute('data-src');\r\n\r\n pictures[0].querySelectorAll('SOURCE').forEach((element) => {\r\n pictures[0].removeChild(element);\r\n });\r\n\r\n image.src = image.dataset.onErrorSrc;\r\n return;\r\n }\r\n\r\n brokenImage.closest('PICTURE').remove();\r\n\r\n const currentCarousel = activeCarousels.find((x) => x.container === cardContainer);\r\n if (!currentCarousel) {\r\n return;\r\n }\r\n\r\n disposeCarousel(currentCarousel);\r\n activeCarousels.splice(activeCarousels.indexOf(currentCarousel), 1);\r\n setUpCarousel(\r\n cardContainer,\r\n '[data-gallery-scroll]',\r\n '[data-gallery-arrow]'\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * touchCancel: reset all the properties of touch object.\r\n */\r\n function touchCancel() {\r\n swipingObject.startX = 0;\r\n swipingObject.curX = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * touchStartEvent: set the pageX value represeting the inital touch of the user.\r\n * @param {Event} event with the information of touchstart.\r\n */\r\n function touchStartEvent(event) {\r\n if (event.touches.length === 1) {\r\n swipingObject.startX = event.touches[0].pageX;\r\n } else {\r\n touchCancel();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * fireScrollGalleryEvent: fired GA event when user scroll the gallery card.\r\n *\r\n * @param {Number} move in X of the slider.\r\n */\r\n function fireScrollGalleryEvent(move) {\r\n const limits = this.getBoundingClientRect();\r\n const firstCollectionLimits = this.querySelector('[data-gallery-scroll]').getBoundingClientRect();\r\n const lastCollectionLimits = this.querySelector('[data-gallery-scroll]:last-child').getBoundingClientRect();\r\n\r\n if (!(firstCollectionLimits.left < limits.left)) {\r\n return;\r\n }\r\n\r\n if (!(lastCollectionLimits.right > limits.right)) {\r\n return;\r\n }\r\n\r\n if (Math.abs(move) >= minimumMoveSlider) {\r\n const events = [];\r\n const gaEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Map',\r\n eventAction: 'Search Action',\r\n eventLabel: 'Scroll - Gallery',\r\n };\r\n\r\n const clickTarget = move >= 0 ? 'back' : 'forward';\r\n const ga4Event = {\r\n event: 'GA4Event',\r\n eventType: 'GA4Event',\r\n eventName: 'map_events',\r\n params: {\r\n click_target: `On-page Gallery ${clickTarget}`\r\n }\r\n };\r\n\r\n events.push(gaEvent, ga4Event);\r\n\r\n events.forEach((event) => {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: event\r\n }\r\n }));\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * touchEndEvent: represent the end of the touching to know if the user move or not the gallery.\r\n */\r\n function touchEndEvent() {\r\n if (swipingObject.curX !== 0) {\r\n requestAnimationFrame(fireScrollGalleryEvent.bind(this, swipingObject.curX - swipingObject.startX));\r\n touchCancel();\r\n } else {\r\n touchCancel();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * touchMoveEvent: set the pageX value represeting the movement of the user.\r\n * @param {Event} event with the information of touchmove.\r\n */\r\n function touchMoveEvent(event) {\r\n if (event.touches.length === 1) {\r\n swipingObject.curX = event.touches[0].pageX;\r\n } else {\r\n touchCancel();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * attachTouchEvents: Add touch listener to an element\r\n * @param {Node} element to set the listener.\r\n */\r\n function attachTouchEvents(element) {\r\n element.addEventListener('touchstart', touchStartEvent, false);\r\n element.addEventListener('touchend', touchEndEvent, false);\r\n element.addEventListener('touchmove', touchMoveEvent, false);\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * attachCarouselHomeEvents: init the events of carousel for homes.\r\n */\r\n function attachCarouselHomeEvents() {\r\n const homeCarousel = document.querySelector('[data-component=\"map-home-carousel\"]');\r\n if (homeCarousel && homeCarousel.dataset.mobileGallery === 'true') {\r\n const cardCarousel = homeCarousel.querySelectorAll('.card__carousel.swiper-wrapper');\r\n cardCarousel.forEach(attachTouchEvents);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * attachOnGalleryImageErrorEvent: attaches on error listener function to map card gallery images\r\n */\r\n function attachOnGalleryImageErrorEvent(cardContainer) {\r\n if (!cardContainer) {\r\n return;\r\n }\r\n\r\n const imagesArray = cardContainer.querySelectorAll('[data-card-gallery-image]');\r\n if (imagesArray.length === 0) {\r\n return;\r\n }\r\n\r\n imagesArray.forEach((brokenImage) => {\r\n brokenImage.onerror = onGalleryImageError.bind(this, cardContainer, brokenImage);\r\n });\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Map.CardHandler\r\n */\r\n function CardHandler() { }\r\n\r\n CardHandler.update = function update(data, topic) {\r\n if (topic === 'onInfoWindowLoaded') {\r\n activeCarousels.forEach((currentCarousel) => {\r\n disposeCarousel(currentCarousel);\r\n });\r\n\r\n activeCarousels = [];\r\n const cards = document.querySelectorAll('[data-component=\"mapCard\"]');\r\n\r\n cards.forEach((card) => {\r\n const carouselContainer = card.querySelector('[data-map-card-images-container]');\r\n\r\n if (carouselContainer) {\r\n requestAnimationFrame(setUpCarousel.bind(\r\n this,\r\n carouselContainer,\r\n '[data-gallery-scroll]',\r\n '[data-gallery-arrow]'\r\n ));\r\n }\r\n\r\n attachCallForDetailsEvent(card);\r\n attachLinkToDetailEvent(card);\r\n attachOnGalleryImageErrorEvent(carouselContainer);\r\n });\r\n\r\n attachCarouselHomeEvents();\r\n global.lazyLoad.init();\r\n\r\n const homeCarousel = global.document.querySelector('[data-component=\"map-home-carousel\"]');\r\n if (!homeCarousel) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(setUpCarousel.bind(\r\n this,\r\n homeCarousel,\r\n '[data-component=\"mapCard\"]',\r\n '[data-card-arrow]'\r\n ));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Map.CardHandler to the previous script.\r\n */\r\n CardHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Map.CardHandler = previousCardHandler;\r\n return CardHandler;\r\n };\r\n\r\n document.addEventListener('click', trackChangeImageEvent);\r\n global.NewHomeSource.Map.MapObserver.add('onInfoWindowLoaded', CardHandler);\r\n global.NewHomeSource.Map.CardHandler = CardHandler;\r\n}(window));\r\n\ndefine(\"CardHandler\", function(){});\n\n","(function trackerSearchMapEvents(global) {\r\n 'use strict';\r\n\r\n if (!global.NewHomeSource.Map.MapObserver ||\r\n !global.NewHomeSource.Map.MapHelper) {\r\n return;\r\n }\r\n\r\n const labels = {\r\n HomeResults: 'Homes',\r\n CommunityResults: 'Communities',\r\n };\r\n\r\n let eventsConfig = null;\r\n const callForPriceLabel = global.NewHomeSource.Map.MapHelper.getLanguageByIndex('CallForPrice');\r\n\r\n function triggerOnDemand(event) {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: event\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * @private\r\n * onClusterClicked: tracks the event when the cluster is clicked according to the cluster type.\r\n * @param {object} data result of the click on the page.\r\n */\r\n function onClusterClicked(data) {\r\n const { clusterType } = data;\r\n const events = [];\r\n const gaEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Map',\r\n eventAction: 'Search Action',\r\n eventLabel: `View - ${labels[clusterType]}`,\r\n };\r\n\r\n const ga4Event = {\r\n event: 'GA4Event',\r\n eventType: 'GA4Event',\r\n eventName: 'map_events',\r\n params: {\r\n click_target: `${labels[clusterType]} cluster clicked`\r\n }\r\n };\r\n\r\n events.push(gaEvent, ga4Event);\r\n events.forEach(triggerOnDemand);\r\n }\r\n\r\n function onCircleResized() {\r\n const ga4Event = {\r\n event: 'GA4Event',\r\n eventType: 'GA4Event',\r\n eventName: 'search_filters',\r\n params: {\r\n click_target: 'Adjust Search Status',\r\n filter_name: 'Map Radius',\r\n search_value: global.NewHomeSource.Map.MapParams.getParameter('Radius')\r\n }\r\n };\r\n triggerOnDemand(ga4Event);\r\n }\r\n\r\n function onPinClicked(data) {\r\n if (data.data.label !== callForPriceLabel) {\r\n return;\r\n }\r\n\r\n const ga4Event = {\r\n event: 'GA4Event',\r\n eventType: 'GA4Event',\r\n eventName: 'map_events',\r\n params: {\r\n click_target: 'Call for Price cluster clicked',\r\n }\r\n };\r\n triggerOnDemand(ga4Event);\r\n }\r\n\r\n function onCardClosed() {\r\n const ga4Event = {\r\n event: 'GA4Event',\r\n eventType: 'GA4Event',\r\n eventName: 'map_events',\r\n params: {\r\n click_target: 'Listing card closed',\r\n }\r\n };\r\n triggerOnDemand(ga4Event);\r\n }\r\n\r\n function TrackerSearchMapEvents() {\r\n }\r\n\r\n TrackerSearchMapEvents.update = function update(data, topic) {\r\n const event = eventsConfig[topic];\r\n if (event && typeof event === 'function') {\r\n event(data);\r\n }\r\n };\r\n\r\n eventsConfig = {\r\n onClusterClicked,\r\n onCircleResized,\r\n onPinClicked,\r\n onCardClosed\r\n };\r\n\r\n global.NewHomeSource.Map.MapObserver.add('onClusterClicked', TrackerSearchMapEvents);\r\n global.NewHomeSource.Map.MapObserver.add('onCircleResized', TrackerSearchMapEvents);\r\n global.NewHomeSource.Map.MapObserver.add('onPinClicked', TrackerSearchMapEvents);\r\n global.NewHomeSource.Map.MapObserver.add('onCardClosed', TrackerSearchMapEvents);\r\n}(window));\r\n\ndefine(\"trackSearchMapEvents\", function(){});\n\n","define(\r\n 'mapLocationsBuilderShowcase',[\r\n 'builderShowcaseObserver',\r\n 'saveToFavorites',\r\n 'favoritesInit',\r\n 'builderShowcaseHelper',\r\n 'routes',\r\n 'MapObserver',\r\n 'BaseMap',\r\n 'BuilderShowcaseMapHandler',\r\n 'MapHelper',\r\n 'MapParams',\r\n 'InteractionHandler',\r\n 'PinHandler',\r\n 'arrowHandler',\r\n 'ClusterHandler',\r\n 'googlemaps!',\r\n 'markerClusterer',\r\n 'CardHandler',\r\n 'trackSearchMapEvents'\r\n ],\r\n (builderShowcaseObserver, favoritesMobile, favoritesDesktop, builderShowcaseHelper, routes) => {\r\n 'use strict';\r\n\r\n const isMobileDevice = !!document.querySelector('[data-ismobiledevice=\"true\"]');\r\n const state = builderShowcaseObserver.getState();\r\n const mapElement = document.querySelector('[data-component=\"marquee-map\"]');\r\n const configuration = {\r\n mapContainer: mapElement,\r\n getPinsUrl: builderShowcaseHelper.getMapUrl(routes.getMapResultsForBuilderShowcase),\r\n getPinUrl: builderShowcaseHelper.getMapUrl(routes.getMapCard),\r\n searchParameters: state.searchParameters,\r\n saveToFavorites: isMobileDevice ? favoritesMobile : favoritesDesktop,\r\n builderShowcaseObserver,\r\n builderShowcaseHelper,\r\n scrollwheel: false,\r\n zoom: builderShowcaseObserver.getZoomLevel(),\r\n minZoom: state.locations.MinZoomLevel,\r\n center: {\r\n lat: builderShowcaseObserver.getOriginalLatitude(),\r\n lng: builderShowcaseObserver.getOriginalLongitude(),\r\n },\r\n mapName: 'BSP Map'\r\n };\r\n\r\n window.NewHomeSource.Map.BaseMap(configuration);\r\n }\r\n);\r\n\n","define('mapLocationsBuilderShowCaseDesktopLoader',[\r\n 'mapLocationsBuilderShowcase',\r\n], () => {\r\n 'use strict';\r\n});\r\n\n"]}