{"version":3,"sources":["nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseState.js","../../Default/js/modules/eventBus.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseObserver.js","libs/fastdom.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseHelper.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseGalleryImagesHandler.js","modules/sectionLazyLoad.js","nhs/views/BuilderShowcaseRedesign/Handlers/galleryPageMoreResultsHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseGalleryStateHandler.js","../../default/js/components/modalBackground.js","pwa/component/buildershowcaseredesign/galleryModalHandler.js","nhs/views/BuilderShowcaseRedesign/Handlers/galleryPageImagesHandler.js","nhs/views/BuilderShowcaseRedesign/Handlers/galleryPageTabsHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/favoritesLoader.js","nhs/views/BuilderShowcaseRedesign/Trackers/trackerBreadcrumbShowCase.js","nhs/views/BuilderShowcaseRedesign/Sections/askQuestionLoader.js","nhs/views/BuilderShowcaseRedesign/Initializers/galleryInitializer.js","nhs/views/BuilderShowCaseRedesign/ShowGallery.js","../../../../../../../../../../module-insertRequire.js"],"names":["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","Object","assign","getParameters","setSearchParamsAttributes","object","objectEntries","entries","i","length","setData","global","NewHomeSource","previousEventBus","EventBus","this","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","win","raf","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","cb","setTimeout","FastDom","reads","writes","bind","scheduleFlush","fastdom","scheduled","flush","error","runTasks","e","catch","remove","array","item","constructor","tasks","task","shift","measure","ctx","mutate","clear","extend","props","Error","child","create","target","source","mixin","initialize","exports","builderShowcaseObserver","setUpTextValueInDomElement","domObjects","text","innerText","degreeToRadius","degree","Math","PI","changeStyleWithFastDom","element","parentElement","classList","removeAttribute","performStyleChange","getImageType","url","address","split","type","setUpPlanDescription","info","container","PlanName","selectedItem","planName","planAmenties","Amenities","planNameElements","querySelectorAll","planAmmenitiesElements","builderName","builderLink","reviewsStars","reviewsScoreText","reviewsInformation","join","replace","jsonResponse","BrandName","href","BuilderLink","hasBuilderReviews","ratingValue","averageRating","style","locationsContainer","locationsLink","planLibraryContainer","planLibraryStateTemplate","planLibraryMarketTemplate","planLibraryCommunityTemplate","IsManufactured","PlanLibraryHomes","setAttribute","stateListItem","content","cloneNode","StateName","j","Markets","market","marketListItem","Market","k","Communities","comm","communityListItem","anchorTag","Community","CommunityUrl","appendChild","MetroAreasCount","LocationsLink","setBodyModalInformation","calculateHaversineFormula","latitude","longitude","destinationLatitude","destinationLongitude","distanceLatitude","distanceLongitude","a","sin","cos","atan2","sqrt","onMapUpdatedSuccess","html","config","configObject","infowindow","setContent","open","mapInstance","marker","setCursor","require","mapCardCtaHandler","setMapInstance","mapItem","cardsHtmlContainer","opacity","loadCss","getCollectionItem","imageId","collectionCategory","getGalleryCollection","Items","find","x","applyActiveStyles","selectedThumbnail","activeThumbSelector","elements","forEach","cleanActiveElements","add","getMapUrl","siteRoot","location","origin","builderShowcaseHelper","language","videoThumbnail","getElementById","brandName","textContent","createGalleryItem","image","figure","parent","CollectionName","list","map","amenity","span","createElement","attribute","number","substr","name","getAmenityNumber","amenitiesContainer","addImageAmenities","title","addTitle","sources","Sources","thumbnail","ThumbnailSrcFormatedWithIrs","img","template","sizes","figCaption","dataset","galleryItemId","galleryCollection","planId","PlanId","src","srcset","insertBefore","removeChild","alt","from","plan","by","addImages","amenities","gaEventLabel","setEventLabelGA","ga4EventClick_target1","createGallerySection","collection","images","newElement","test","navigator","userAgent","outerHTML","factory","amd","SectionLazyLoad","module","root","rootMarginObserver","IntersectionObserver","entry","isIntersecting","intersectionRatio","getAttribute","protocol","hostname","fetch","then","response","event","CustomEvent","detail","preventLazyLoadSectionDefaultBehavior","responseFragment","createRange","createContextualFragment","dispatchEvent","lazyLoadSection","unobserve","rootMargin","lazyLoadSections","observe","initLazyLoad","routes","moreResultsUrl","BuilderShowcaseGalleryMoreResultsUrl","closest","activeCategoryCurrentPage","createMoreResultsUrl","brandId","page","category","activeCategory","lastIndex","collectionsObject","collections","saveGalleryCollectionsIntoState","getCollection","Category","previousModalBackground","ModalBackground","createBackground","backgroundColor","zIndex","position","top","left","width","height","body","background","overflow","destroyBackground","galleryStateHandler","role","imageToOpen","galleryModalOpenerSubPage","imagesContainer","imagesArray","Thumbnail","isLiteGalleryModal","MainImageSources","MainPictureImage","ImageUrl","NoPhoto","buildImagesCollectionFromImageTag","dataForSubscribers","collectionImages","init","openModalFromImagesArray","undefined","clickedItem","metroAreasCount","hasConsultedAboutReviews","imageCategory","GalleryViewModel","hasPlanLibrary","urlForPlan","getGalleryInformationBasedOnPlan","xhr","XMLHttpRequest","setRequestHeader","send","onreadystatechange","readyState","imageIdAsInt","parseInt","mainCollection","findIndex","IsMainCollection","selectedImage","unshift","prepareImagesFromAjax","Collections","isGallerySubPage","HasConsultedAboutReviews","HasBuilderReviews","RatingsAverageScore","HasPlanLibraryHomes","openModalGallerySubPage","builderShowcaseGalleryImagesHandler","galleryPageMoreResultsHandler","createIntersectionObserverTarget","MutationObserver","mutations","mutation","addedNodes","node","id","disconnect","subtree","childList","waitForNewPage","createImageCollection","result","getCollectionFromTemplate","galleryPageImagesHandler","button","disabled","contains","gaEventCategory","gaEventAction","ga4EventName","ga4EventClick_target","activeTab","activeButton","setActiveTab","buttonSize","clientWidth","scrollTo","behavior","scrollTabIntoView","favoriteElements","eventName","initFavoritesComponent","currentTarget","stopPropagation","removeEventListener","buttonTarget","favoritesInit","eventToDispatch","Event","preventDefault","Init","pendingItems","cookie","match","arrayFavorites","display","updateStyleFavoriteAnchor","breadcrumbSection","breadcrumbItem","eventGa4","params","click_target","click_target1","eventType","loadAskQuestionHandlerModule","moduleName","askQuestionHandler","openModal","BuilderShowcaseGalleryGetFirstPageUrl","async","request","tab","localStorage","getItem","click","removeItem","clickSelectedCategory"],"mappings":"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","file":"../showgallery-e18e072217.js","sourceRoot":"..","sourcesContent":["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","!(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","define(\r\n 'builderShowcaseGalleryImagesHandler',[\r\n 'builderShowcaseHelper',\r\n 'i18n!nls/res'\r\n ],\r\n (builderShowcaseHelper, language) => {\r\n 'use strict';\r\n\r\n const videoThumbnailElement = document.getElementById('VideoThumbnail');\r\n const videoThumbnail = videoThumbnailElement.value;\r\n const brandName = document.querySelector('[data-brand-name]')\r\n ? document.querySelector('[data-brand-name]').value\r\n : document.querySelector('#NHS_BuilderShowCaseTitle').textContent;\r\n\r\n /**\r\n * Used to get the number of amenities by a plan.\r\n * @param {String} amenity the string containing the amenity, and quantity.\r\n * @returns an object that contains the amenity, and the quantity of said amenity.\r\n */\r\n function getAmenityNumber(amenity) {\r\n const number = amenity.substr(0, amenity.indexOf(' '));\r\n const name = amenity.substr(amenity.indexOf(' ') + 1).replace(' ', '');\r\n\r\n return {\r\n number,\r\n name\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * Used to get the image\r\n * @param {*} element the figure element\r\n * @param {*} image the image object\r\n */\r\n function addImageAmenities(element, image) {\r\n const amenities = image.Amenities;\r\n\r\n const list = amenities.map((amenity) => {\r\n const span = document.createElement('span');\r\n const attribute = getAmenityNumber(amenity);\r\n span.textContent = amenity + ' ';\r\n span.setAttribute(`data-${attribute.name}`, attribute.number);\r\n return span;\r\n });\r\n\r\n const amenitiesContainer = element.querySelector('p');\r\n\r\n list.forEach((amenity) => {\r\n amenitiesContainer.appendChild(amenity);\r\n });\r\n }\r\n\r\n /**\r\n * Used to add the title to the figure element\r\n * @param {*} element the figure element\r\n * @param {*} image the image object\r\n */\r\n function addTitle(element, image) {\r\n const title = image.PlanName;\r\n\r\n if (title) {\r\n const header = element.querySelector('strong');\r\n header.textContent = title;\r\n }\r\n }\r\n\r\n /**\r\n * Used to add the images to the figure element\r\n * @param {*} element the figure element\r\n * @param {*} image the image object\r\n */\r\n function addImages(element, image) {\r\n const sources = image.Sources;\r\n const thumbnail = image.ThumbnailSrcFormatedWithIrs;\r\n const img = element.querySelector('img');\r\n const template = element.querySelector('source');\r\n const sizes = template.sizes;\r\n const figCaption = element.querySelector('figcaption');\r\n\r\n if (figCaption) {\r\n figCaption.dataset.galleryItemId = image.Id;\r\n figCaption.dataset.galleryCollection = image.CollectionName;\r\n figCaption.dataset.planId = image.PlanId;\r\n }\r\n\r\n sources.forEach((source) => {\r\n const src = document.createElement('source');\r\n const url = source.replace('srcset=', '').replace(/\"/g, '');\r\n src.sizes = sizes;\r\n src.srcset = url;\r\n src.type = builderShowcaseHelper.getImageType(url);\r\n\r\n template.parentElement.insertBefore(src, img);\r\n });\r\n\r\n template.parentElement.removeChild(template);\r\n\r\n if (thumbnail && img) {\r\n img.src = thumbnail;\r\n img.alt = `${image.CollectionName} ${language.from} ${image.PlanName} \r\n ${language.plan} ${language.by} ${brandName}`;\r\n }\r\n\r\n if (image.CollectionName === 'Videos') {\r\n img.src = videoThumbnail;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * setGaAttribute: set event label to be log google analytics. Event Label change dynamic as user interacts\r\n * with the site.\r\n *\r\n * @param {Element} element current element to update the data-ga-event-label\r\n * @param {Object} data information of the current image.\r\n */\r\n function setEventLabelGA(element, data) {\r\n const figure = element;\r\n const amenities = data.Amenities || [];\r\n figure.dataset.gaEventLabel = `${data.PlanName || ''} + ${amenities.join('')}`;\r\n }\r\n\r\n /**\r\n * @private\r\n * Creates a new figure element to add to the gallery.\r\n * @param {*} template the template used to create a new figure.\r\n * @param {*} image the required data to create the new image.\r\n * @param {Number} index of current item.\r\n * @returns a new picture element.\r\n */\r\n function createGalleryItem(image, index) {\r\n const template = document.querySelector('[data-gallery-item-template]');\r\n const newElement = template.cloneNode(true);\r\n\r\n const figure = newElement.content.querySelector('figure');\r\n const parent = figure.querySelector('.gallery__figure-imgbox');\r\n\r\n if (parent && image.CollectionName === 'Videos') {\r\n parent.setAttribute('data-gallery-video', true);\r\n }\r\n addImageAmenities(figure, image);\r\n addTitle(figure, image);\r\n addImages(figure, image);\r\n setEventLabelGA(figure, image);\r\n figure.dataset.ga4EventClick_target1 = index + 1;\r\n\r\n return figure;\r\n }\r\n\r\n /**\r\n * @private\r\n * Used to create the new images to be displayed.\r\n */\r\n function createGallerySection(collection) {\r\n const images = collection.Items;\r\n const container = document.querySelector('[data-section-gallery-images]');\r\n\r\n images.forEach((image, index) => {\r\n const newElement = createGalleryItem(image, index);\r\n container.appendChild(newElement);\r\n if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\r\n // eslint-disable-next-line no-self-assign\r\n newElement.outerHTML = newElement.outerHTML;\r\n }\r\n });\r\n }\r\n\r\n return {\r\n createGallerySection\r\n };\r\n }\r\n);\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 SectionLazyLoad to exists on the window object.\r\n define('sectionLazyLoad',[], () => {\r\n global.SectionLazyLoad = factory(global);\r\n });\r\n } else if (typeof exports === 'object') {\r\n // If supports for Common JS is available export the module\r\n // and pass is value to the global (window) object in case non Common JS code\r\n // is expected to work with this SectionLazyLoad Module.\r\n global.SectionLazyLoad = factory(global);\r\n module.exports = global.SectionLazyLoad;\r\n } else {\r\n // If not support for AMD or Common JS is available register the module in the global scope.\r\n global.SectionLazyLoad = factory(global);\r\n }\r\n}(typeof window !== 'undefined' ? window : {}, (root) => {\r\n 'use strict';\r\n\r\n // Lazy Loading\r\n function lazyLoadSection(entry) {\r\n if (entry.getAttribute('data-url')) {\r\n const url = root.location.protocol + '//' + root.location.hostname + entry.getAttribute('data-url');\r\n\r\n fetch(url).then((response) => {\r\n response.text().then((data) => {\r\n // Now the dispatched event contains the raw data that the url returns\r\n const event = new CustomEvent('sectionLazyLoaded', {\r\n detail: {\r\n data,\r\n }\r\n });\r\n\r\n // Add the data-prevent-lazy-load-section-default-behavior=\"true\" attribute to prevent the script.\r\n // from appending the data to the DOM this should only be used if you don't need the response.\r\n // added to the target element.\r\n if (!entry.dataset.preventLazyLoadSectionDefaultBehavior) {\r\n const responseFragment = document.createRange().createContextualFragment(data);\r\n entry.appendChild(responseFragment);\r\n }\r\n\r\n entry.dispatchEvent(event);\r\n });\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Callback function used with the intersection observer.\r\n * @param {*} entries\r\n * @param {*} observer\r\n */\r\n function callback(entries, observer) {\r\n entries.forEach((entry) => {\r\n if (entry.isIntersecting && entry.intersectionRatio > 0) {\r\n lazyLoadSection(entry.target);\r\n observer.unobserve(entry.target);\r\n }\r\n });\r\n }\r\n\r\n const options = {\r\n root: null,\r\n rootMargin: '100px 0px'\r\n };\r\n\r\n const rootMarginObserver = new IntersectionObserver(callback, options);\r\n\r\n /**\r\n * Function used to get all the lazyloaded sections on initial load\r\n */\r\n function initLazyLoad() {\r\n const lazyLoadSections = document.querySelectorAll(\"[data-component='lazyLoad']\");\r\n\r\n // lazy load the sections\r\n for (let i = 0; i < lazyLoadSections.length; i += 1) {\r\n rootMarginObserver.observe(lazyLoadSections[i]);\r\n }\r\n }\r\n\r\n /**\r\n * Used to observe a dynamically created element that doesn't exist\r\n * on initial load (or re-observe an already unobserved element)\r\n * @param {Element} target the element that will be observed\r\n */\r\n function observe(target) {\r\n rootMarginObserver.observe(target);\r\n }\r\n\r\n initLazyLoad();\r\n\r\n return {\r\n observe\r\n };\r\n}));\r\n\n","define('galleryPageMoreResultsHandler',['builderShowcaseObserver', 'routes', 'sectionLazyLoad'], (builderShowcaseObserver, routes) => {\r\n 'use strict';\r\n\r\n const moreResultsUrl = routes.BuilderShowcaseGalleryMoreResultsUrl;\r\n\r\n /**\r\n * Used to observe the target for the gallery's new page.\r\n * @param {*} target dom element used to observe.\r\n */\r\n function observe(target) {\r\n const data = builderShowcaseObserver.getState().data;\r\n window.SectionLazyLoad.observe(target);\r\n\r\n target.addEventListener('sectionLazyLoaded', (event) => {\r\n const container = target.closest('[data-section-gallery-images]');\r\n const response = event.detail.data;\r\n const responseFragment = document.createRange().createContextualFragment(response);\r\n container.appendChild(responseFragment);\r\n\r\n target.parentElement.removeChild(target);\r\n });\r\n\r\n builderShowcaseObserver.setData({\r\n activeCategoryCurrentPage: data.activeCategoryCurrentPage + 1,\r\n });\r\n\r\n builderShowcaseObserver.commit();\r\n }\r\n\r\n /**\r\n * Function used to build the URL for the next page.\r\n * @returns the url used in the next page.\r\n */\r\n function createMoreResultsUrl() {\r\n const data = builderShowcaseObserver.getState().data;\r\n const brandId = data.BrandId;\r\n const page = data.activeCategoryCurrentPage + 1;\r\n const category = data.activeCategory;\r\n const lastIndex = document.querySelectorAll('[data-section-gallery-images] [data-gallery-image]').length;\r\n\r\n let url;\r\n\r\n if (page <= 5) {\r\n url = `${moreResultsUrl}?page=${page}&category=${category}&brandId=${brandId}&lastIndex=${lastIndex}`;\r\n }\r\n\r\n return url;\r\n }\r\n\r\n return {\r\n observe,\r\n createMoreResultsUrl,\r\n };\r\n});\r\n\n","define('builderShowcaseGalleryStateHandler',['builderShowcaseObserver'], (builderShowcaseObserver) => {\r\n 'use strict';\r\n\r\n /**\r\n * @private\r\n * Used to save the collections from the template, and into the BSP state\r\n */\r\n function saveGalleryCollectionsIntoState() {\r\n const collectionsObject = document.querySelector('[data-gallery-collections]');\r\n if (collectionsObject) {\r\n const collections = JSON.parse(collectionsObject.innerHTML);\r\n\r\n builderShowcaseObserver.setData({\r\n collections\r\n });\r\n builderShowcaseObserver.commit();\r\n }\r\n }\r\n\r\n /**\r\n * Used to get the list of images to display.\r\n * @param {Array} collections the image collections.\r\n * @param {string} category the current active collection.\r\n */\r\n function getCollectionFromState(category) {\r\n const state = builderShowcaseObserver.getState();\r\n const collections = state.data.collections;\r\n const collection = collections.find((element) => element.Category === category ||\r\n element.Name === category);\r\n\r\n return collection;\r\n }\r\n\r\n saveGalleryCollectionsIntoState();\r\n\r\n return {\r\n getCollection: getCollectionFromState\r\n };\r\n});\r\n\n","(function modalBackground(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousModalBackground = global.NewHomeSource.ModalBackground;\r\n\r\n /**\r\n * @constructs NewHomeSource.ModalBackground\r\n */\r\n function ModalBackground() {\r\n }\r\n\r\n /**\r\n * @public\r\n * createBackground: creates a modal background.\r\n * \r\n * @param {string} backgroundColor background color of the overlay.\r\n */\r\n ModalBackground.createBackground = function createBackground(backgroundColor, zIndex) {\r\n const element = document.createElement('div');\r\n\r\n element.style['background-color'] = backgroundColor || 'rgba(0,0,0,.5)';\r\n element.style['z-index'] = zIndex || 100000;\r\n element.style.position = 'fixed';\r\n element.style.top = 0;\r\n element.style.left = 0;\r\n element.style.width = '100%';\r\n element.style.height = '100%';\r\n element.setAttribute('data-modal-background', '');\r\n document.body.appendChild(element);\r\n this.background = element;\r\n global.document.body.style.overflow = 'hidden';\r\n };\r\n\r\n /**\r\n * @public\r\n * destroyBackground: destroys a modal background.\r\n */\r\n ModalBackground.destroyBackground = function destroyBackground() {\r\n if (!this.background) {\r\n return;\r\n }\r\n\r\n global.document.body.style.overflow = '';\r\n this.background.parentElement.removeChild(this.background);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.ModalBackground to the previous script.\r\n */\r\n ModalBackground.noConflict = function noConflict() {\r\n global.NewHomeSource.ModalBackground = previousModalBackground;\r\n return ModalBackground;\r\n };\r\n\r\n global.NewHomeSource.ModalBackground = ModalBackground;\r\n}(window));\r\n\ndefine(\"modalBackground\", function(){});\n\n","define(\r\n 'galleryModalHandler',[\r\n 'builderShowcaseObserver',\r\n 'builderShowcaseGalleryStateHandler',\r\n 'routes',\r\n 'modalBackground',\r\n ],\r\n (\r\n builderShowcaseObserver,\r\n galleryStateHandler,\r\n routes\r\n ) => {\r\n 'use strict';\r\n\r\n /**\r\n * @private\r\n * buildImagesCollectionFromImageTag: builds objects after interpreting img tags.\r\n * These objects are the ones interpreted by internal modules to build elements like\r\n * filmstrips, arrows, main viewers, etc.\r\n * @param {Array} images collection with a set of img tags from DOM.\r\n *\r\n */\r\n function buildImagesCollectionFromImageTag(images) {\r\n const imagesArray = [];\r\n for (let i = 0; i < images.length; i += 1) {\r\n const image = {\r\n Id: i,\r\n Thumbnail: images[i].src,\r\n isLiteGalleryModal: true,\r\n MainImageSources: [],\r\n MainPictureImage: {\r\n ImageUrl: images[i].src,\r\n NoPhoto: '',\r\n }\r\n };\r\n\r\n imagesArray.push(image);\r\n }\r\n\r\n return imagesArray;\r\n }\r\n\r\n /**\r\n * @private\r\n * openModalFromImagesArray: takes the information needed to open up a modal from the\r\n * information set in the HTML element for an img tag.\r\n * @param {HTML} selectedItem the user is interested in view on the main viewer.\r\n *\r\n */\r\n function openModalFromImagesArray(imageToOpen) {\r\n require(\r\n ['galleryModalOpenerSubPage'],\r\n (galleryModalOpenerSubPage) => {\r\n window.NewHomeSource.ModalBackground.createBackground('rgba(0,0,0,.82)');\r\n\r\n const imagesContainer = imageToOpen.closest('[data-reviews-images]');\r\n\r\n if (!imagesContainer) {\r\n return;\r\n }\r\n\r\n const images = imagesContainer.querySelectorAll('img');\r\n const imagesArray = buildImagesCollectionFromImageTag(images);\r\n const clickedItem = imagesArray.find((element) => element.Thumbnail === imageToOpen.src);\r\n\r\n const dataForSubscribers = {\r\n collectionImages: { },\r\n selectedItem: clickedItem,\r\n isLiteGalleryModal: true,\r\n };\r\n\r\n dataForSubscribers.collectionImages.Items = imagesArray;\r\n\r\n galleryModalOpenerSubPage.init(builderShowcaseObserver.galleryOpened.bind(this, dataForSubscribers));\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * openModalFireEvent: fires the galleryOpened event for the subscribers\r\n * @param {HTML} selectedItem the user is interested in view on the main viewer.\r\n *\r\n */\r\n function openModalFireEvent(selectedItem) {\r\n require(\r\n ['galleryModalOpener'],\r\n () => {\r\n window.NewHomeSource.ModalBackground.createBackground('rgba(0,0,0,.82)');\r\n const images = galleryStateHandler.getCollection(selectedItem.dataset.galleryCollection);\r\n const galleryItemId = parseInt(selectedItem.dataset.galleryItemId, 10);\r\n const clickedItem = images.Items.find((element) => element.Id === galleryItemId);\r\n const dataForSubscribers = {\r\n collectionImages: images,\r\n selectedItem: clickedItem,\r\n isLiteGalleryModal: false,\r\n };\r\n\r\n builderShowcaseObserver.galleryOpened(dataForSubscribers);\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * prepareImagesFromAjax: when the images comes from an AJAX request, this method will prepare an array with\r\n * this images ready to be used as a filmstrip on the modal.\r\n * @param {Array} collections of images to be shown in the modal filmstrip.\r\n * @param {int} imageId representing the id of the selected image.\r\n *\r\n */\r\n function prepareImagesFromAjax(collections, imageId) {\r\n const images = [];\r\n const mainCollection = collections.splice(collections.findIndex((item) => item.IsMainCollection), 1)[0].Items;\r\n const selectedImage = mainCollection.splice(mainCollection.findIndex((item) => item.Id === imageId), 1);\r\n\r\n mainCollection.unshift(selectedImage[0]);\r\n images.push(...mainCollection);\r\n for (let i = 0; i < collections.length; i += 1) {\r\n if (!collections[i].IsMainCollection && collections[i].Items != null) {\r\n images.push(...collections[i].Items);\r\n }\r\n }\r\n\r\n return {\r\n Items: images,\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * openModalGallerySubPage: function to be executed when the images to show in the modal comes\r\n * from an AJAX request.\r\n * @param {HTML} clickedItem the user is interested in view on the main viewer.\r\n *\r\n */\r\n function openModalGallerySubPage(clickedItem) {\r\n window.NewHomeSource.ModalBackground.createBackground('rgba(0,0,0,.82)');\r\n\r\n const data = builderShowcaseObserver.getState().data;\r\n let metroAreasCount = data.metroAreasCount || 0;\r\n const hasConsultedAboutReviews = data.hasConsultedAboutReviews || false;\r\n const imageId = clickedItem.dataset.galleryItemId;\r\n const imageCategory = clickedItem.dataset.galleryCollection;\r\n const planId = clickedItem.dataset.planId;\r\n const brandId = data.GalleryViewModel.BrandId;\r\n const brandName = data.GalleryViewModel.BrandName;\r\n const hasBuilderReviews = data.hasBuilderReviews;\r\n const hasPlanLibrary = data.hasPlanLibrary;\r\n const url = routes.getGalleryInformationBasedOnPlan;\r\n const plan = `planid=${planId}`;\r\n const image = `imageId=${imageId}`;\r\n const category = `imageCategory=${imageCategory}`;\r\n const brand = `brandId=${brandId}`;\r\n const name = `brandName=${brandName}`;\r\n const metro = `MetroAreasCount=${metroAreasCount}`;\r\n const hasReviews = `hasBuilderReviews=${hasBuilderReviews}`;\r\n const hasPlanLibraryHomes = `HasPlanLibraryHomes=${hasPlanLibrary}`;\r\n const reviewsCheck = `HasConsultedAboutReviews=${hasConsultedAboutReviews}`;\r\n // eslint-disable-next-line max-len\r\n const urlForPlan = `${url}?${plan}&${image}&${category}&${brand}&${name}&${hasReviews}&${metro}&${reviewsCheck}&${hasPlanLibraryHomes}`;\r\n\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('GET', urlForPlan, true);\r\n xhr.setRequestHeader('Content-Type', 'application/json');\r\n xhr.send();\r\n\r\n xhr.onreadystatechange = function () {\r\n if (xhr.readyState === 4) {\r\n const jsonResponse = JSON.parse(xhr.response);\r\n require(\r\n ['galleryModalOpenerSubPage'],\r\n (galleryModalOpenerSubPage) => {\r\n const imageIdAsInt = parseInt(imageId, 10);\r\n const collectionsCopy = Object.assign([], jsonResponse.Collections);\r\n const collectionImages = prepareImagesFromAjax(collectionsCopy, imageIdAsInt);\r\n const selectedItem = collectionImages.Items.find((element) => element.Id === imageIdAsInt);\r\n const dataForSubscribers = {\r\n collectionImages,\r\n selectedItem,\r\n jsonResponse,\r\n isGallerySubPage: true,\r\n isLiteGalleryModal: false,\r\n data,\r\n };\r\n\r\n galleryModalOpenerSubPage.init(builderShowcaseObserver.galleryOpened.bind(this, dataForSubscribers));\r\n }\r\n );\r\n\r\n if (metroAreasCount === 0 || imageCategory === 'Videos') {\r\n metroAreasCount = jsonResponse.MetroAreasCount || 0;\r\n builderShowcaseObserver.setData({\r\n metroAreasCount,\r\n });\r\n\r\n builderShowcaseObserver.commit();\r\n }\r\n\r\n if (data.hasConsultedAboutReviews === undefined) {\r\n builderShowcaseObserver.setData({\r\n hasConsultedAboutReviews: jsonResponse.HasConsultedAboutReviews,\r\n hasBuilderReviews: jsonResponse.HasBuilderReviews,\r\n averageRating: jsonResponse.RatingsAverageScore\r\n });\r\n }\r\n\r\n builderShowcaseObserver.setData({\r\n hasPlanLibrary: jsonResponse.HasPlanLibraryHomes || false,\r\n });\r\n\r\n builderShowcaseObserver.commit();\r\n }\r\n };\r\n }\r\n\r\n document.addEventListener(\r\n 'click',\r\n (event) => {\r\n if (!event.target) {\r\n return;\r\n }\r\n\r\n if (event.target.dataset && event.target.dataset.role === 'review-image') {\r\n openModalFromImagesArray(event.target);\r\n return;\r\n }\r\n\r\n const figure = event.target.closest('figure');\r\n\r\n if (!figure) {\r\n return;\r\n }\r\n\r\n const target = figure.querySelector('figcaption');\r\n if (target && target.dataset.galleryItemId !== undefined) {\r\n if (document.querySelector('[data-gallery-sub-page-container]')) {\r\n openModalGallerySubPage(target);\r\n return;\r\n }\r\n\r\n openModalFireEvent(target);\r\n }\r\n }\r\n );\r\n }\r\n);\r\n\n","define(\r\n 'galleryPageImagesHandler',[\r\n 'builderShowcaseGalleryImagesHandler',\r\n 'galleryPageMoreResultsHandler',\r\n 'galleryModalHandler',\r\n ],\r\n (\r\n builderShowcaseGalleryImagesHandler,\r\n galleryPageMoreResultsHandler,\r\n ) => {\r\n 'use strict';\r\n\r\n /**\r\n * Clears the container from any existing image.\r\n */\r\n function clearImageCollections() {\r\n const container = document.querySelector('[data-section-gallery-images]');\r\n container.innerHTML = '';\r\n }\r\n\r\n /**\r\n * Used to get the items from the DOM's template\r\n * @param {string} category the category being created.\r\n * @returns The list of images for that category.\r\n */\r\n function getCollectionFromTemplate(category) {\r\n const template = document.querySelector('[data-gallery-collections]');\r\n const collections = JSON.parse(template.innerHTML);\r\n let result;\r\n\r\n collections.forEach((collection) => {\r\n if (collection.Category === category) {\r\n result = collection;\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Function used to observe the document and wait for a new page.\r\n */\r\n function waitForNewPage() {\r\n const container = document.querySelector('[data-section-gallery-images]');\r\n const observer = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n mutation.addedNodes.forEach((node) => {\r\n if (node.id === 'nhs_gallery_newpage') {\r\n observer.disconnect();\r\n // eslint-disable-next-line no-use-before-define\r\n createIntersectionObserverTarget();\r\n }\r\n });\r\n });\r\n });\r\n\r\n observer.observe(container, { subtree: true, childList: true });\r\n }\r\n\r\n /**\r\n * Creates a new element at the end of the gallery to observe.\r\n * @param {Number} page the page to be loaded\r\n */\r\n function createIntersectionObserverTarget() {\r\n const container = document.querySelector('[data-section-gallery-images]');\r\n const target = document.createElement('div');\r\n const url = galleryPageMoreResultsHandler.createMoreResultsUrl();\r\n\r\n if (url) {\r\n target.setAttribute('data-url', url);\r\n\r\n // Prevent the elements from being added into the target element to prevent breaking the grid.\r\n target.dataset.preventLazyLoadSectionDefaultBehavior = true;\r\n target.classList.add('gallery__images', 'gallery__images--subpage');\r\n container.appendChild(target);\r\n galleryPageMoreResultsHandler.observe(target);\r\n waitForNewPage();\r\n }\r\n }\r\n\r\n /**\r\n * Used to create the images for the collection\r\n * @param {string} category the category being created\r\n */\r\n function createImageCollection(category) {\r\n const collection = getCollectionFromTemplate(category);\r\n\r\n clearImageCollections();\r\n builderShowcaseGalleryImagesHandler.createGallerySection(collection);\r\n createIntersectionObserverTarget();\r\n }\r\n\r\n return {\r\n createImageCollection,\r\n };\r\n }\r\n);\r\n\n","require(\r\n [\r\n 'fastdom',\r\n 'galleryPageImagesHandler',\r\n 'builderShowcaseObserver'\r\n ],\r\n (fastdom, galleryPageImagesHandler, builderShowcaseObserver) => {\r\n 'use strict';\r\n\r\n /**\r\n * Used to switch the data attribute used to determine which tab is currently active.\r\n * @param {*} activeButton the button element that contains each tab.\r\n */\r\n function toggleActiveTab(activeButton) {\r\n const buttons = document.querySelectorAll('[data-gallery-button]');\r\n\r\n buttons.forEach((button) => {\r\n button.removeAttribute('data-active-tab');\r\n button.classList.remove('btn--active');\r\n });\r\n\r\n activeButton.setAttribute('data-active-tab', true);\r\n activeButton.classList.add('btn--active');\r\n }\r\n\r\n /**\r\n * Sets the new active category into state\r\n * @param {string} category the new active category\r\n */\r\n function setActiveTab(category) {\r\n builderShowcaseObserver.setData({\r\n activeCategory: category,\r\n activeCategoryCurrentPage: 1,\r\n });\r\n\r\n builderShowcaseObserver.commit();\r\n }\r\n\r\n /**\r\n * Used to scroll the active tab into the device's viewport\r\n * @param {*} container the container element\r\n * @param {*} button the currently active button\r\n */\r\n function scrollTabIntoView(container, button) {\r\n const index = button.dataset.index;\r\n\r\n fastdom.mutate(() => {\r\n const buttonSize = button.clientWidth;\r\n if (buttonSize && index) {\r\n const position = index * buttonSize;\r\n container.scrollTo({ left: position, top: 0, behavior: 'smooth' });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Inits the tab handling functionality\r\n */\r\n function init() {\r\n const container = document.querySelector('[data-gallery-tabs]');\r\n\r\n container.addEventListener('click', (event) => {\r\n const target = event.target;\r\n const button = target.closest('button');\r\n\r\n if (!button || button.disabled) {\r\n return;\r\n }\r\n\r\n if (!container.classList.contains('button-nav--thumbs')) {\r\n container.querySelectorAll('[data-gallery-image]').forEach((element) => {\r\n const figure = element;\r\n figure.dataset.gaEventCategory = 'Builder-Gallery-Pages';\r\n figure.dataset.gaEventAction = 'List-view-menu-buttons';\r\n figure.dataset.ga4EventName = 'showcase_events';\r\n figure.dataset.ga4EventClick_target = 'Gallery list menu';\r\n figure.dataset.ga4EventClick_target1 = figure.innerText;\r\n });\r\n }\r\n\r\n container.classList.remove('button-nav--thumbs');\r\n const isCurrentlyActive = button.dataset.activeTab === true;\r\n\r\n if (!isCurrentlyActive) {\r\n container.classList.remove('button-nav--thumbs');\r\n toggleActiveTab(button);\r\n\r\n const category = button.dataset.collection;\r\n container.classList.add('navigation--selected');\r\n\r\n setActiveTab(category);\r\n scrollTabIntoView(container, button);\r\n galleryPageImagesHandler.createImageCollection(category);\r\n }\r\n });\r\n }\r\n\r\n init();\r\n }\r\n);\r\n\ndefine(\"galleryPageTabsHandler\", function(){});\n\n","define(\r\n 'favoritesLoader',[],\r\n () => {\r\n 'use strict';\r\n\r\n const favoriteElements = document.querySelectorAll('[data-favorite-trigger]');\r\n\r\n /*\r\n * We need to define the event name for mobile and desktop because we need to dispatch the event\r\n * after loading the favorites js resources, also favorites js works with mousedown for desktop and click\r\n * for mobile.\r\n *\r\n * Example desktop: user clicks on favorites button -> load the favorites js ->\r\n * we dispatch mousedown event -> favorites js working the event\r\n * Example mobile: user touch the favorites button -> load the favorites js ->\r\n * we dispatch click event -> favorites js working the event\r\n *\r\n * Notes: The reason to not use mouseover is that for mobile not working as expected because the\r\n * mouse over event needs to press the screen and this dispatch the touch start event first, and this\r\n * not working in the same way on desktop, desktop just needs to pass the pointer over the button.\r\n */\r\n const isTouchScreen = Object.prototype.hasOwnProperty.call(window, 'ontouchstart');\r\n const eventName = isTouchScreen ? 'click' : 'mousedown';\r\n\r\n /**\r\n * @private\r\n * initFavoritesComponent: inits the Favorites component on the title section\r\n */\r\n\r\n function initFavoritesComponent(event) {\r\n if (!event && !event.currentTarget) {\r\n return;\r\n }\r\n\r\n event.stopPropagation();\r\n\r\n favoriteElements.forEach((item) => {\r\n item.removeEventListener(eventName, initFavoritesComponent);\r\n });\r\n\r\n const buttonTarget = event.currentTarget;\r\n\r\n require(\r\n ['favoritesInit'],\r\n (favoritesInit) => {\r\n favoritesInit.init();\r\n\r\n const eventToDispatch = new Event(eventName);\r\n buttonTarget.dispatchEvent(eventToDispatch);\r\n }\r\n );\r\n\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * @private\r\n * Init: update Styles\r\n */\r\n function updateStyleFavoriteAnchor() {\r\n const pendingItems = document.cookie.match(/pendingSaveItem=([^;]+)/);\r\n const cookieFavorites = pendingItems ? JSON.parse(pendingItems[1]) : [];\r\n const arrayFavorites = cookieFavorites.map((item) => JSON.parse(item).id);\r\n favoriteElements.forEach((item) => {\r\n const itemIndex = arrayFavorites.indexOf(item.dataset.id);\r\n if (itemIndex >= 0) {\r\n const anchorSaved = item.parentElement.querySelector('.nhs_favSaved');\r\n anchorSaved.style.display = 'block';\r\n\r\n const anchorUnSave = item.parentElement.querySelector('.nhs_favUnsave');\r\n anchorUnSave.style.display = 'none';\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * Init: Init the component\r\n */\r\n\r\n function Init() {\r\n favoriteElements.forEach((item) => {\r\n item.addEventListener(eventName, initFavoritesComponent);\r\n });\r\n updateStyleFavoriteAnchor();\r\n }\r\n\r\n if (document.readyState === 'complete') {\r\n Init();\r\n } else {\r\n window.addEventListener('load', Init);\r\n }\r\n }\r\n);\r\n\n","define(\r\n 'trackerBreadcrumbShowCase',[\r\n\r\n ],\r\n () => {\r\n 'use strict';\r\n\r\n const breadcrumbSection = document.querySelector('[data-breadcrumb-section]');\r\n\r\n /**\r\n * @private\r\n * trackBreadCrumbEvent: track events realted to breadcrumb in builder showcase.\r\n *\r\n * @param {Event} event with the information of click event\r\n */\r\n function trackBreadCrumbEvent(event) {\r\n const target = event.target.closest('[data-breadcrumb-item]') || event.target;\r\n\r\n if (!target.dataset.breadcrumbItem) {\r\n return;\r\n }\r\n\r\n const eventGa4 = {\r\n eventName: 'showcase_events',\r\n params: {\r\n click_target: 'Breadcrum clicked',\r\n click_target1: target.innerText\r\n },\r\n eventType: 'GA4Event'\r\n };\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: { data: eventGa4 }\r\n }));\r\n }\r\n\r\n if (breadcrumbSection) {\r\n breadcrumbSection.addEventListener('click', trackBreadCrumbEvent);\r\n }\r\n }\r\n);\r\n\n","define('askQuestionLoader',[\r\n], () => {\r\n 'use strict';\r\n\r\n /**\r\n * Loads the ask question module.\r\n * @param {*} event Event object.\r\n */\r\n function loadAskQuestionHandlerModule(event) {\r\n const moduleName = document.querySelector('[data-ismobiledevice=\"true\"]')\r\n ? 'askQuestionMobileWrapper'\r\n : 'askQuestionDesktopWrapper';\r\n\r\n // since we're using event delegation for this event, only execute it if the target has a\r\n // data-askQuestionBtn attribute\r\n if (!event.target.closest('[data-askQuestionBtn]')) {\r\n return;\r\n }\r\n\r\n // remove the event listener so it doesn't fire again the load of the module\r\n // since the module adds another event listener and re-loading the module duplicates the event listener.\r\n document.removeEventListener('click', loadAskQuestionHandlerModule);\r\n\r\n require(\r\n [moduleName],\r\n (askQuestionHandler) => {\r\n askQuestionHandler.openModal(event);\r\n }\r\n );\r\n }\r\n\r\n document.addEventListener('click', loadAskQuestionHandlerModule);\r\n});\r\n\n","/*\r\n * Inits the builder showcase gallery page\r\n */\r\ndefine('galleryInitializer',[\r\n 'builderShowcaseObserver',\r\n 'routes',\r\n 'galleryPageTabsHandler',\r\n 'favoritesLoader',\r\n 'lazyLoad',\r\n 'trackerBreadcrumbShowCase',\r\n 'askQuestionLoader',\r\n], (builderShowcaseObserver, routes) => {\r\n 'use strict';\r\n\r\n const url = routes.BuilderShowcaseGalleryGetFirstPageUrl;\r\n const collectionsObject = document.querySelector('[data-gallery-collections]');\r\n const data = builderShowcaseObserver.getState().data;\r\n\r\n /**\r\n * Used to remove the disabled attributes once the data has been fetched.\r\n */\r\n function enableCategoryTabs() {\r\n const tabs = document.querySelectorAll('[data-gallery-button]');\r\n\r\n tabs.forEach((tab) => {\r\n const button = tab.closest('button');\r\n\r\n if (button) {\r\n button.removeAttribute('disabled');\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Used to click the selected categorie's button on initial load\r\n */\r\n function clickSelectedCategory() {\r\n if (!localStorage) {\r\n return;\r\n }\r\n\r\n const category = localStorage.getItem('selectedCategory');\r\n\r\n if (category && category !== 'undefined') {\r\n const button = document.querySelector(`button[data-collection=\"${category}\"]`);\r\n button.click();\r\n\r\n // clear it so it only opens it once\r\n localStorage.removeItem('selectedCategory');\r\n }\r\n }\r\n\r\n /**\r\n * Used to initialize the gallery, and hydrate the collections with images.\r\n */\r\n async function init() {\r\n const brandId = data.BrandId;\r\n const request = await fetch(url + `?brandId=${brandId}`);\r\n const response = await request.text();\r\n\r\n // replace the old content with the full collections\r\n collectionsObject.innerHTML = response;\r\n enableCategoryTabs();\r\n clickSelectedCategory();\r\n }\r\n\r\n init();\r\n});\r\n\n","require(['galleryInitializer'], () => {\r\n 'use strict';\r\n});\r\n\ndefine(\"nhs/views/BuilderShowCaseRedesign/ShowGallery\", function(){});\n\n","\nrequire([\"nhs/views/BuilderShowCaseRedesign/ShowGallery\"]);\n"]}