{"version":3,"sources":["nhs/components/GeoFiltering.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseState.js","../../Default/js/modules/eventBus.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseObserver.js","libs/domHelper.js","libs/ajaxHelper.js","libs/fastdom.js","pwa/component/buildershowcaseredesign/reviewsParameters.js","pwa/component/buildershowcaseredesign/reviewsHandler.js","../../default/js/modules/event.js","nhs/views/BuilderShowcaseRedesign/Sections/sortByFilterHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/starFilterHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/areaFilterHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/paginationHandler.js","modules/SearchPagination/trackerSearchPagination.js","nhs/views/BuilderShowcaseRedesign/Sections/pageSizeFilterHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/favoritesLoader.js","nhs/views/BuilderShowcaseRedesign/Sections/longTextHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/builderShowcaseGalleryStateHandler.js","../../default/js/components/modalBackground.js","pwa/component/buildershowcaseredesign/galleryModalHandler.js","nhs/views/BuilderShowcaseRedesign/Sections/askQuestionLoader.js","nhs/views/BuilderShowcaseRedesign/Initializers/reviewsRedesignInitializer.js","nhs/views/BuilderShowCaseRedesign/ShowReviews.js","../../../../../../../../../../module-insertRequire.js"],"names":["define","require","factory","GeoFilter","settings","this","filter","demand","url","keyName","currentTarget","id","controls","getPage","window","location","href","pathName","trigger","event","i","mapHandler","e","addEventListener","length","slice","call","document","querySelectorAll","map","attachBind","prototype","defaults","requestUrl","afterFilter","completeUrl","pageData","JSON","parse","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","setData","global","NewHomeSource","previousEventBus","EventBus","observers","addObserver","topic","observer","Array","isArray","push","notifyObservers","totalCallbacks","fn","update","removeObserver","index","indexOf","splice","noConflict","builderShowcaseState","eventBus","temporalState","onResize","commit","beforeMapResultsLoaded","afterMapResultsLoaded","OnSortByChanged","OnStarFilterChanged","OnPageSizeChanged","PaginationChanged","onReviewsSectionLoaded","galleryOpened","imageSelected","modalImageSelected","navigateToImage","navigateToModalImage","subscribe","setParameter","key","hasOwnProperty","setParameters","getParameter","state","getOriginalLatitude","parseFloat","getOriginalLongitude","getZoomLevel","onGalleryClosed","getPassiveOptions","passive","opts","attachEvent","eventName","callback","detachEvent","removeEventListener","Element","removeEventFromElement","addEventToElement","Document","hasParent","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","amd","AjaxHelper","exports","module","root","requestsQueue","getElementsByClassName","siteRoot","getElementById","browserAcceptTypes","partnerUrl","replace","protocol","executeCallbacks","req","options","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","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","getAbsolutePathRequest","siteUrl","convertToQueryString","domHelper","win","raf","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","cb","setTimeout","FastDom","reads","writes","bind","scheduleFlush","fastdom","scheduled","flush","error","runTasks","catch","array","item","constructor","tasks","task","shift","measure","ctx","mutate","clear","extend","props","child","create","target","source","mixin","initialize","reviewsParameters","PageSize","StateName","StateAbbreviation","IsMarketSearch","ReviewSortBy","PageNumber","ReviewStar","BuilderToSearch","SearchType","isReviewsPage","getReviewsDefaultParameters","builderShowcaseObserver","ajaxHelper","routes","lazyLoad","sortByList","reviewsSection","lastMarketIdShowed","ReviewsHandler","initLazyLoad","init","reviewsSkeleton","showContent","skeleton","reviewsCards","filterArea","scrollTo","top","offsetTop","getReviews","searchParams","getRatingsAndReviewsSection","html","updateContent","SetCommonParameters","localSearchParams","brandName","ReviewSearchParams","filterType","sortBy","selectedIndex","onSortByChanged","onStarFilterChanged","PageSizeChanged","proposedMarket","brandId","BrandName","marketName","marketId","stateName","stateAbbreviation","isMarketSearch","onMarketChanged","previousEvent","addEvent","processCallbacks","element","callbacks","processEvents","events","processConfiguration","property","setter","configuration","keys","clickElement","click","SortByFilterInitHandler","selectedOption","updatedSearchParams","Number","pageUrl","history","pushState","SetListenersSortBy","StarFilterInitHandler","onFilterStarChanged","preventDefault","starFilter","dataset","rate","SetListenersStarsSort","el","AreaFilterInitHandler","InitAreaFilter","FilterArea","optionSelected","getAttribute","PaginationInitHandler","PageChanged","pageNumber","SetListenersPagination","previousTrackerSearchPagination","TrackerSearchPagination","pageSizeSelectionTracker","pageSize","ga4Event","eventType","params","click_target","search_value","detail","PageSizeFilterInitHandler","onPageSizeChanged","pageSizeSelect","SetListenersPageSize","favoriteElements","initFavoritesComponent","stopPropagation","buttonTarget","favoritesInit","eventToDispatch","Init","pendingItems","cookie","match","arrayFavorites","parentElement","updateStyleFavoriteAnchor","res","longTextHandler","SetListenersLongText","showMoreLinks","linkClickHandler","isShowMore","readMoreDots","longText","setAttribute","showLess","more","collectionsObject","collections","saveGalleryCollectionsIntoState","getCollection","category","Category","previousModalBackground","ModalBackground","createBackground","backgroundColor","zIndex","createElement","position","left","width","height","appendChild","background","overflow","destroyBackground","galleryStateHandler","role","imageToOpen","galleryModalOpenerSubPage","imagesContainer","closest","imagesArray","images","image","Thumbnail","src","isLiteGalleryModal","MainImageSources","MainPictureImage","ImageUrl","NoPhoto","buildImagesCollectionFromImageTag","dataForSubscribers","collectionImages","selectedItem","Items","openModalFromImagesArray","figure","undefined","galleryItemId","clickedItem","metroAreasCount","hasConsultedAboutReviews","imageId","imageCategory","galleryCollection","planId","GalleryViewModel","hasBuilderReviews","hasPlanLibrary","urlForPlan","getGalleryInformationBasedOnPlan","jsonResponse","imageIdAsInt","parseInt","mainCollection","findIndex","IsMainCollection","selectedImage","unshift","prepareImagesFromAjax","Collections","isGallerySubPage","MetroAreasCount","HasConsultedAboutReviews","HasBuilderReviews","averageRating","RatingsAverageScore","HasPlanLibraryHomes","openModalGallerySubPage","loadAskQuestionHandlerModule","moduleName","askQuestionHandler","openModal","starSelected","removeItem","clickSelectedStars"],"mappings":"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","file":"../showreviews-9697a39393.js","sourceRoot":"..","sourcesContent":["define('GeoFiltering',[], function(require, factory) {\r\n \"use strict\";\r\n\r\n function loadPage(url, completeUrl) {\r\n if (completeUrl)\r\n window.location.href = url;\r\n else\r\n window.location.pathName = url;\r\n }\r\n\r\n function attachBind(filter, trigger, event) {\r\n var i;\r\n var mapHandler = function (e) {\r\n e.addEventListener(event[i], filter);\r\n };\r\n for (i = 0; i < trigger.length; i++) {\r\n [].slice.call(document.querySelectorAll(trigger[i])).map(mapHandler);\r\n }\r\n }\r\n\r\n function GeoFilter(settings) {\r\n var instance = this;\r\n \r\n instance.filter = function(demand) {\r\n var keyName = demand.currentTarget.id;\r\n var criteria = settings.controls[keyName];\r\n\r\n if (criteria === \"loadPage\") {\r\n loadPage(settings.getPage[keyName](demand.currentTarget), (settings.completeUrl));\r\n }\r\n };\r\n\r\n attachBind(instance.filter, settings.trigger, settings.event);\r\n }\r\n\r\n GeoFilter.prototype.defaults = {\r\n controls: {},\r\n requestUrl: \"\",\r\n getPage: [],\r\n trigger: [],\r\n event: [],\r\n afterFilter: null,\r\n completeUrl: false\r\n };\r\n\r\n\r\n return GeoFilter;\r\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","!(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('reviewsParameters',[], () => {\r\n 'use strict';\r\n\r\n const reviewsParameters = {\r\n BrandId: 0,\r\n PageSize: 1,\r\n StateName: '',\r\n StateAbbreviation: '',\r\n MarketName: '',\r\n IsMarketSearch: false,\r\n ReviewSortBy: 2, // HighestToLowest\r\n PageNumber: 1,\r\n MarketId: null,\r\n ReviewStar: null,\r\n BuilderToSearch: '',\r\n SearchType: '',\r\n isReviewsPage: false\r\n };\r\n\r\n /**\r\n * Builds the default Ratings Search Params.\r\n * @returns Ratings Search Params Object.\r\n */\r\n function getReviewsDefaultParameters() {\r\n return reviewsParameters;\r\n }\r\n\r\n return {\r\n getReviewsDefaultParameters\r\n };\r\n});\r\n\n","define(\r\n 'reviewsHandler',[\r\n 'builderShowcaseObserver',\r\n 'ajaxHelper',\r\n 'routes',\r\n 'fastdom',\r\n 'reviewsParameters',\r\n 'lazyLoad',\r\n ],\r\n (builderShowcaseObserver, ajaxHelper, routes, fastdom, reviewsParameters, lazyLoad) => {\r\n 'use strict';\r\n\r\n const sortByList = document.querySelector('[data-component=\"sort-by-list\"]');\r\n const reviewsSection = document.querySelector('[data-reviewsSection-container]');\r\n let lastMarketIdShowed = 0;\r\n\r\n /**\r\n * ReviewsHandler Constructor.\r\n */\r\n function ReviewsHandler() {\r\n }\r\n\r\n /**\r\n * calls lazy load init module\r\n * */\r\n function initLazyLoad() {\r\n if (lazyLoad) {\r\n lazyLoad.init();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * reviewsSkeleton: Display or removes the skeleton.\r\n * @param {object} showContent flag to display or hide.\r\n */\r\n function reviewsSkeleton(showContent) {\r\n const skeleton = document.getElementById('nhs_reviewsSkeleton');\r\n const reviewsCards = document.getElementById('nhs_reviewsCards');\r\n const filterArea = document.getElementById('FilterArea');\r\n\r\n if (skeleton) {\r\n if (showContent) {\r\n window.scrollTo({ top: filterArea ? filterArea.offsetTop : 200 });\r\n skeleton.style.display = 'block';\r\n reviewsCards.style.display = 'none';\r\n } else {\r\n skeleton.style.display = 'none';\r\n reviewsCards.style.display = 'block';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * updateContent: sets the upcoming reviews section in the DOM.\r\n * @param {object} html Reviews section.\r\n */\r\n function updateContent(html, callback) {\r\n if (!reviewsSection) {\r\n return;\r\n }\r\n\r\n fastdom.mutate(() => {\r\n reviewsSection.innerHTML = html;\r\n if (typeof callback === 'function') {\r\n callback();\r\n }\r\n });\r\n\r\n fastdom.mutate(() => {\r\n initLazyLoad();\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * getReviews: retrieves from api the reviews content.\r\n * @param {object} searchParams ratings&reviews api search params.\r\n */\r\n function getReviews(searchParams, callback) {\r\n const url = routes.getRatingsAndReviewsSection;\r\n\r\n ajaxHelper.postRequest(\r\n url,\r\n {\r\n data: searchParams,\r\n async: true,\r\n abort: true,\r\n requestHeaders: [\r\n {\r\n name: 'Content-Type',\r\n value: 'application/json'\r\n }\r\n ],\r\n success: (response) => {\r\n updateContent(response, callback);\r\n reviewsSkeleton(false);\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * getReviews: retrieves from api the reviews content.\r\n * @param {object} searchParams ratings&reviews api search params.\r\n * @param {object} data new parameters.\r\n */\r\n function SetCommonParameters(searchParams, data) {\r\n const localSearchParams = searchParams;\r\n localSearchParams.BrandId = data.data.BrandId;\r\n localSearchParams.BuilderToSearch = data.data.brandName;\r\n localSearchParams.ReviewStar = data.data.ReviewSearchParams.ReviewStar;\r\n localSearchParams.ReviewSortBy = data.data.ReviewSearchParams.ReviewSortBy;\r\n localSearchParams.isReviewsPage = true;\r\n localSearchParams.PageSize = data.data.ReviewSearchParams.PageSize;\r\n localSearchParams.PageNumber = data.data.ReviewSearchParams.PageNumber;\r\n if (data.data.ReviewSearchParams.IsMarketSearch) {\r\n localSearchParams.MarketName = data.data.ReviewSearchParams.MarketName;\r\n localSearchParams.StateName = data.data.ReviewSearchParams.StateName;\r\n localSearchParams.MarketId = data.data.ReviewSearchParams.MarketId;\r\n localSearchParams.IsMarketSearch = data.data.ReviewSearchParams.IsMarketSearch;\r\n localSearchParams.StateAbbreviation = data.data.ReviewSearchParams.StateAbbreviation;\r\n }\r\n return localSearchParams;\r\n }\r\n\r\n /**\r\n * @private\r\n * onMarketChanged: Gets reviews based on the market update and update the reviews section.\r\n * @param {object} data buildershowcase state.\r\n */\r\n function onMarketChanged(data) {\r\n const proposedMarket = data.proposedMarket || {};\r\n\r\n if (proposedMarket.Id === lastMarketIdShowed) {\r\n return;\r\n }\r\n\r\n lastMarketIdShowed = proposedMarket.Id;\r\n\r\n const brandId = data.data.BrandId;\r\n const brandName = data.data.BrandName || '';\r\n const marketName = proposedMarket.Name || '';\r\n const marketId = +proposedMarket.Id || 0;\r\n const stateName = proposedMarket.StateName || '';\r\n const stateAbbreviation = proposedMarket.StateAbbr || '';\r\n const isMarketSearch = marketId && marketId > 0;\r\n const searchParams = reviewsParameters.getReviewsDefaultParameters();\r\n searchParams.BrandId = brandId;\r\n searchParams.StateName = stateName;\r\n searchParams.StateAbbreviation = stateAbbreviation;\r\n searchParams.MarketName = marketName;\r\n searchParams.MarketId = marketId;\r\n searchParams.IsMarketSearch = isMarketSearch;\r\n searchParams.BuilderToSearch = brandName;\r\n searchParams.PageSize = 2;\r\n\r\n /** TODO: show skeleton */\r\n getReviews(searchParams);\r\n /** TODO: hide skeleton */\r\n }\r\n\r\n /**\r\n * @private\r\n * onSortByChanged: Gets reviews based on the sort by.\r\n * @param {object} data buildershowcase state.\r\n */\r\n function onSortByChanged(data) {\r\n let sortBy = data.searchParameters.ReviewSortBy;\r\n\r\n if (!sortBy) {\r\n sortBy = sortByList[sortByList.selectedIndex];\r\n }\r\n\r\n let searchParams = reviewsParameters.getReviewsDefaultParameters();\r\n searchParams = SetCommonParameters(searchParams, data);\r\n searchParams.ReviewSortBy = sortBy;\r\n searchParams.PageNumber = 1;\r\n searchParams.isReviewsPage = true;\r\n reviewsSkeleton(true);\r\n getReviews(searchParams, () => {\r\n builderShowcaseObserver.onReviewsSectionLoaded(data);\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * onSortByChanged: Gets reviews based on the star filter.\r\n * @param {object} data buildershowcase state.\r\n */\r\n function onStarFilterChanged(data) {\r\n let searchParams = reviewsParameters.getReviewsDefaultParameters();\r\n searchParams = SetCommonParameters(searchParams, data);\r\n searchParams.isReviewsPage = true;\r\n searchParams.PageNumber = 1;\r\n reviewsSkeleton(true);\r\n getReviews(searchParams, () => {\r\n builderShowcaseObserver.onReviewsSectionLoaded(data);\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * onSortByChanged: Gets reviews based on the star filter.\r\n * @param {object} data buildershowcase state.\r\n */\r\n function PaginationChanged(data) {\r\n let searchParams = reviewsParameters.getReviewsDefaultParameters();\r\n searchParams = SetCommonParameters(searchParams, data);\r\n searchParams.isReviewsPage = true;\r\n reviewsSkeleton(true);\r\n getReviews(searchParams, () => {\r\n builderShowcaseObserver.onReviewsSectionLoaded(data);\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * onSortByChanged: Gets reviews based on pageSize.\r\n * @param {object} data buildershowcase state.\r\n */\r\n function PageSizeChanged(data) {\r\n let searchParams = reviewsParameters.getReviewsDefaultParameters();\r\n searchParams = SetCommonParameters(searchParams, data);\r\n searchParams.isReviewsPage = true;\r\n searchParams.PageNumber = 1;\r\n reviewsSkeleton(true);\r\n getReviews(searchParams, () => {\r\n builderShowcaseObserver.onReviewsSectionLoaded(data);\r\n });\r\n }\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes.\r\n * @param {object} data buildershowcase state.\r\n */\r\n ReviewsHandler.update = function updateReviewsSection(data) {\r\n switch (data.filterType) {\r\n case 'sortBy':\r\n onSortByChanged(data);\r\n break;\r\n case 'starFilter':\r\n onStarFilterChanged(data);\r\n break;\r\n case 'pagination':\r\n PaginationChanged(data);\r\n break;\r\n case 'pageSize':\r\n PageSizeChanged(data);\r\n break;\r\n default:\r\n onMarketChanged(data);\r\n }\r\n };\r\n\r\n builderShowcaseObserver.subscribe('onBeforeMapResultsLoaded', ReviewsHandler);\r\n builderShowcaseObserver.subscribe('OnSortByChanged', ReviewsHandler);\r\n builderShowcaseObserver.subscribe('OnPageSizeChanged', ReviewsHandler);\r\n builderShowcaseObserver.subscribe('OnStarFilterChanged', ReviewsHandler);\r\n builderShowcaseObserver.subscribe('PaginationChanged', ReviewsHandler);\r\n\r\n initLazyLoad();\r\n }\r\n);\r\n\n","(function event(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousEvent = global.NewHomeSource.Event;\r\n\r\n /**\r\n * private\r\n * addEvent: appends a event listener to the given element.\r\n *\r\n * @param {string} name of the event being added.\r\n * @param {function} callback that is going to be executed.\r\n */\r\n function addEvent(name, callback) {\r\n this.addEventListener(name, callback, false);\r\n }\r\n\r\n /**\r\n * private\r\n * processCallbacks: loops through the callbacks that are going to be append.\r\n *\r\n * @param {HTMLElement} element that is going to listen for the event.\r\n * @param {string} name of the event being added.\r\n */\r\n function processCallbacks(element, name) {\r\n this.callbacks.forEach(addEvent.bind(element, name));\r\n }\r\n\r\n /**\r\n * private\r\n * processEvents: loops through the events that are going to be appended.\r\n *\r\n * @param {HTMLElement} element that is going to listen for the event.\r\n */\r\n function processEvents(element) {\r\n this.events.forEach(processCallbacks.bind(this, element));\r\n }\r\n\r\n /**\r\n * private\r\n * processConfiguration: loops through the configuration object in order to append the events.\r\n *\r\n * @param {string} property being processed.\r\n */\r\n function processConfiguration(property) {\r\n const setter = this[property];\r\n const elements = global.document.querySelectorAll(setter.elements);\r\n\r\n elements.forEach(processEvents.bind(setter));\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Event\r\n *\r\n * @param {object} configuration events that are going to be attached.\r\n */\r\n function Event(configuration) {\r\n Object.keys(configuration).forEach(processConfiguration.bind(configuration));\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * clickElement: trigger click element on the document\r\n *\r\n * @param {object} element to click.\r\n */\r\n Event.clickElement = function clickElement (element) {\r\n if (element) {\r\n element.click();\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer to the previous script.\r\n */\r\n Event.noConflict = function noConflict() {\r\n global.NewHomeSource.Event = previousEvent;\r\n return Event;\r\n };\r\n\r\n global.NewHomeSource.Event = Event;\r\n}(window));\r\n\ndefine(\"event\", function(){});\n\n","define(\r\n 'sortByFilterHandler',[\r\n 'builderShowcaseObserver',\r\n 'event'\r\n ],\r\n (builderShowcaseObserver) => {\r\n 'use strict';\r\n\r\n function SortByFilterHandler() {\r\n }\r\n\r\n function SortByFilterInitHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * onSortByChanged: triggers the on change on the sorting options.\r\n *\r\n */\r\n function onSortByChanged(data) {\r\n const sortByList = document.querySelector('[data-component=\"sort-by-list\"]');\r\n const selectedOption = sortByList[sortByList.selectedIndex];\r\n let sortBy = data.target.value;\r\n if (sortBy === null) {\r\n sortBy = selectedOption.value;\r\n }\r\n\r\n const updatedSearchParams = {\r\n ReviewSortBy: Number(sortBy)\r\n };\r\n\r\n builderShowcaseObserver.setParameters(updatedSearchParams);\r\n builderShowcaseObserver.commit();\r\n const state = builderShowcaseObserver.getState();\r\n state.data.ReviewSearchParams.ReviewSortBy = Number(sortBy);\r\n state.filterType = 'sortBy';\r\n const pageUrl = document.querySelector('[data-page-number=\"1\"]').href;\r\n window.history.pushState({}, null, pageUrl);\r\n builderShowcaseObserver.OnSortByChanged(state);\r\n }\r\n\r\n /**\r\n * @private\r\n * SetListenersSortBy: set listeners for sort by select.\r\n *\r\n */\r\n function SetListenersSortBy() {\r\n const sortByList = document.querySelector('[data-component=\"sort-by-list\"]');\r\n sortByList.addEventListener('change', onSortByChanged);\r\n }\r\n\r\n const events = {\r\n onSortByChanged: {\r\n callbacks: [onSortByChanged],\r\n elements: '[data-component=\"sort-by-list\"]',\r\n events: ['change'],\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n SortByFilterHandler.update = function updateSortByValue(data) {\r\n onSortByChanged(data);\r\n };\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n SortByFilterInitHandler.update = function SetListeners() {\r\n SetListenersSortBy();\r\n };\r\n\r\n SetListenersSortBy();\r\n window.NewHomeSource.Event(events);\r\n builderShowcaseObserver.subscribe('onReviewsSectionLoaded', SortByFilterInitHandler);\r\n }\r\n\r\n);\r\n\n","define(\r\n 'starFilterHandler',[\r\n 'builderShowcaseObserver',\r\n 'event'\r\n ],\r\n (builderShowcaseObserver) => {\r\n 'use strict';\r\n\r\n function StarFilterHandler() {\r\n }\r\n\r\n function StarFilterInitHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * onFilterStarChanged: manage the change on the filters by stars.\r\n *\r\n */\r\n function onFilterStarChanged(data) {\r\n data.preventDefault();\r\n let starFilter = Number(data.currentTarget.dataset.rate);\r\n const updatedSearchParams = {\r\n ReviewStar: starFilter\r\n };\r\n starFilter = starFilter !== 0 ? starFilter : null;\r\n builderShowcaseObserver.setParameters(updatedSearchParams);\r\n builderShowcaseObserver.commit();\r\n const state = builderShowcaseObserver.getState();\r\n state.data.ReviewSearchParams.ReviewStar = starFilter;\r\n state.filterType = 'starFilter';\r\n const pageUrl = document.querySelector('[data-page-number=\"1\"]').href;\r\n window.history.pushState({}, null, pageUrl);\r\n builderShowcaseObserver.OnStarFilterChanged(state);\r\n }\r\n\r\n /**\r\n * @private\r\n * SetListenersStarsSort: set the listeners related to the stars filter.\r\n *\r\n */\r\n function SetListenersStarsSort() {\r\n const starFilterList = document.querySelectorAll('[data-component=\"filter-by-star\"]');\r\n starFilterList.forEach((el) => { el.addEventListener('click', onFilterStarChanged); });\r\n }\r\n\r\n const events = {\r\n onSortByChanged: {\r\n callbacks: [onFilterStarChanged],\r\n elements: '[data-component=\"filter-by-star\"]',\r\n events: ['change'],\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n StarFilterHandler.update = function updateStarSortValue(data) {\r\n onFilterStarChanged(data);\r\n };\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n StarFilterInitHandler.update = function SetListeners() {\r\n SetListenersStarsSort();\r\n };\r\n\r\n SetListenersStarsSort();\r\n window.NewHomeSource.Event(events);\r\n builderShowcaseObserver.subscribe('onReviewsSectionLoaded', StarFilterInitHandler);\r\n }\r\n\r\n);\r\n\n","define(\r\n 'areaFilterHandler',[\r\n 'builderShowcaseObserver',\r\n 'GeoFiltering',\r\n 'event'\r\n ],\r\n (builderShowcaseObserver, GeoFilter) => {\r\n 'use strict';\r\n\r\n function AreaFilterInitHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * SetListenersStarsSort: set the stuff related to the area filter.\r\n *\r\n */\r\n function InitAreaFilter() {\r\n // eslint-disable-next-line no-unused-vars\r\n const geoFilter = new GeoFilter({\r\n controls: {\r\n FilterArea: 'loadPage'\r\n },\r\n getPage: {\r\n FilterArea: (e) => {\r\n const optionSelected = e.options[e.selectedIndex];\r\n return optionSelected ? optionSelected.getAttribute('value') : '';\r\n }\r\n },\r\n trigger: ['#FilterArea'],\r\n event: ['change'],\r\n completeUrl: true\r\n });\r\n }\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n AreaFilterInitHandler.update = function SetListeners() {\r\n InitAreaFilter();\r\n };\r\n\r\n InitAreaFilter();\r\n builderShowcaseObserver.subscribe('onReviewsSectionLoaded', AreaFilterInitHandler);\r\n }\r\n\r\n);\r\n\n","define(\r\n 'paginationHandler',[\r\n 'builderShowcaseObserver',\r\n 'event'\r\n ],\r\n (builderShowcaseObserver) => {\r\n 'use strict';\r\n\r\n function PaginationHandler() {\r\n }\r\n\r\n function PaginationInitHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * PageChanged:manage when the user change the page.\r\n *\r\n */\r\n function PageChanged(data) {\r\n data.preventDefault();\r\n const pageNumber = data.currentTarget.dataset.pageNumber;\r\n const pageUrl = data.currentTarget.href.replace(/^.*\\/\\/[^/]+/, '');\r\n const updatedSearchParams = {\r\n PageNumber: Number(pageNumber)\r\n };\r\n\r\n builderShowcaseObserver.setParameters(updatedSearchParams);\r\n builderShowcaseObserver.commit();\r\n const state = builderShowcaseObserver.getState();\r\n state.data.ReviewSearchParams.PageNumber = Number(pageNumber);\r\n state.filterType = 'pagination';\r\n window.history.pushState({}, null, pageUrl);\r\n builderShowcaseObserver.PaginationChanged(state);\r\n }\r\n\r\n /**\r\n * @private\r\n * SetListenersPagination: adds listeners related to pagination.\r\n *\r\n */\r\n function SetListenersPagination() {\r\n const starFilterList = document.querySelectorAll('[data-component=\"page-element\"]');\r\n starFilterList.forEach((el) => { el.addEventListener('click', PageChanged); });\r\n }\r\n\r\n const events = {\r\n PageChanged: {\r\n callbacks: [PageChanged],\r\n elements: '[data-component=\"filter-by-star\"]',\r\n events: ['change'],\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n PaginationHandler.update = function PageValueChanged(data) {\r\n PageChanged(data);\r\n };\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n PaginationInitHandler.update = function SetListeners() {\r\n SetListenersPagination();\r\n };\r\n\r\n SetListenersPagination();\r\n window.NewHomeSource.Event(events);\r\n builderShowcaseObserver.subscribe('onReviewsSectionLoaded', PaginationInitHandler);\r\n }\r\n\r\n);\r\n\n","(function trackerSearchPagination(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousTrackerSearchPagination = global.NewHomeSource.TrackerSearchPagination;\r\n\r\n /**\r\n * @constructs NewHomeSource.TrackerSearchPagination\r\n */\r\n function TrackerSearchPagination() { }\r\n\r\n /**\r\n * @public\r\n * pageSizeSelectionTracker: Tracks the events of the page size option selector.\r\n * @param {Number} pageSize Page size selected number.\r\n */\r\n TrackerSearchPagination.pageSizeSelectionTracker = function pageSizeSelectionTracker(pageSize) {\r\n const ga4Event = {\r\n eventType: 'GA4Event',\r\n eventName: 'pagination_events',\r\n params: {\r\n click_target: 'Page Count Select',\r\n // Ticket-BDXPERF-3351: We should send \"per page\" for both NHS and CNA\r\n search_value: `${pageSize} per page`\r\n }\r\n };\r\n\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: ga4Event\r\n }\r\n }));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n TrackerSearchPagination.noConflict = function noConflict() {\r\n global.NewHomeSource.TrackerSearchPagination = previousTrackerSearchPagination;\r\n return TrackerSearchPagination;\r\n };\r\n\r\n global.NewHomeSource.TrackerSearchPagination = TrackerSearchPagination;\r\n}(window));\r\n\ndefine(\"trackerSearchPagination\", function(){});\n\n","define(\r\n 'pageSizeFilterHandler',[\r\n 'builderShowcaseObserver',\r\n 'event',\r\n 'trackerSearchPagination'\r\n ],\r\n (builderShowcaseObserver) => {\r\n 'use strict';\r\n\r\n function PageSizeFilterInitHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * onSortByChanged: triggers the on change on the sorting options.\r\n *\r\n */\r\n function onPageSizeChanged(data) {\r\n const pageSizeSelect = document.querySelector('[data-component=\"page-size-options\"]');\r\n const selectedOption = pageSizeSelect[pageSizeSelect.selectedIndex];\r\n let pageSize = data.target.value;\r\n if (pageSize === null) {\r\n pageSize = selectedOption.value;\r\n }\r\n\r\n const updatedSearchParams = {\r\n PageSize: Number(pageSize)\r\n };\r\n\r\n builderShowcaseObserver.setParameters(updatedSearchParams);\r\n builderShowcaseObserver.commit();\r\n const state = builderShowcaseObserver.getState();\r\n state.data.ReviewSearchParams.PageSize = Number(pageSize);\r\n state.filterType = 'pageSize';\r\n const pageUrl = document.querySelector('[data-page-number=\"1\"]').href;\r\n window.history.pushState({}, null, pageUrl);\r\n builderShowcaseObserver.OnPageSizeChanged(state);\r\n window.NewHomeSource.TrackerSearchPagination.pageSizeSelectionTracker(pageSize);\r\n }\r\n\r\n /**\r\n * @private\r\n * SetListenersPageSize: set listeners for sort by select.\r\n *\r\n */\r\n function SetListenersPageSize() {\r\n const pageSizeList = document.querySelector('[data-component=\"page-size-options\"]');\r\n pageSizeList.addEventListener('change', onPageSizeChanged);\r\n }\r\n\r\n const events = {\r\n onPageSizeChanged: {\r\n callbacks: [onPageSizeChanged],\r\n elements: '[data-component=\"page-size-options\"]',\r\n events: ['change'],\r\n },\r\n };\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n * @param {object} data information that was changed.\r\n *\r\n */\r\n PageSizeFilterInitHandler.update = function SetListeners() {\r\n SetListenersPageSize();\r\n };\r\n\r\n SetListenersPageSize();\r\n window.NewHomeSource.Event(events);\r\n builderShowcaseObserver.subscribe('onReviewsSectionLoaded', PageSizeFilterInitHandler);\r\n }\r\n\r\n);\r\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","/**\r\n* This component allows you to expand or contract long text when needed base on data attributes\r\n* data-show-more for the see more button and data-long-text for the text and data-read-more-dots for the dots\r\n*/\r\ndefine(\r\n 'longTextHandler',[\r\n 'builderShowcaseObserver',\r\n 'i18n!nls/res',\r\n 'event',\r\n ],\r\n (\r\n builderShowcaseObserver,\r\n res\r\n ) => {\r\n 'use strict';\r\n\r\n /**\r\n * @constructor\r\n * This component handles the long text see more see less text toggles between the short and long version.\r\n *\r\n */\r\n function longTextHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * SetListenersLongText: set listeners for long text.\r\n *\r\n */\r\n function SetListenersLongText() {\r\n const showMoreLinks = document.querySelectorAll('[data-show-more]');\r\n\r\n if (!showMoreLinks || !showMoreLinks.length) {\r\n return;\r\n }\r\n\r\n const linkClickHandler = function () {\r\n const isShowMore = this.getAttribute('data-show-more') === '0';\r\n const readMoreDots = this.parentElement.querySelector('[data-read-more-dots]');\r\n const longText = this.parentElement.querySelector('[data-long-text]');\r\n if (isShowMore) {\r\n this.setAttribute('data-show-more', 1);\r\n this.style.display = 'block';\r\n this.innerHTML = res.showLess;\r\n\r\n readMoreDots.style.display = 'none';\r\n longText.style.display = 'inline';\r\n } else {\r\n this.setAttribute('data-show-more', 0);\r\n this.style.display = 'inline';\r\n this.innerHTML = res.more;\r\n\r\n readMoreDots.style.display = 'inline';\r\n longText.style.display = 'none';\r\n }\r\n };\r\n\r\n for (let i = 0; i < showMoreLinks.length; i += 1) {\r\n showMoreLinks[i].addEventListener('click', linkClickHandler);\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * update: function for receiving notifications about state changes\r\n *\r\n */\r\n longTextHandler.update = function SetListeners() {\r\n SetListenersLongText();\r\n };\r\n\r\n SetListenersLongText();\r\n builderShowcaseObserver.subscribe('onReviewsSectionLoaded', longTextHandler);\r\n }\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('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 about page\r\n */\r\ndefine(\r\n 'reviewsRedesignInitializer',[\r\n 'GeoFiltering',\r\n 'reviewsHandler',\r\n 'sortByFilterHandler',\r\n 'starFilterHandler',\r\n 'areaFilterHandler',\r\n 'paginationHandler',\r\n 'pageSizeFilterHandler',\r\n 'favoritesLoader',\r\n 'longTextHandler',\r\n 'galleryModalHandler',\r\n 'askQuestionLoader',\r\n ],\r\n () => {\r\n 'use strict';\r\n\r\n /**\r\n * Used to click the selected stars filter button on initial load\r\n */\r\n function clickSelectedStars() {\r\n if (!localStorage) {\r\n return;\r\n }\r\n\r\n const starSelected = localStorage.getItem('selectedStars');\r\n if (starSelected) {\r\n const element = document.querySelector(`[data-component=\"filter-by-star\"][data-rate=\"${starSelected}\"]`);\r\n if (element === null) {\r\n return;\r\n }\r\n element.click();\r\n\r\n // clear it so it only opens it once\r\n localStorage.removeItem('selectedStars');\r\n }\r\n }\r\n clickSelectedStars();\r\n }\r\n);\r\n\n","require(\r\n [\r\n 'reviewsRedesignInitializer',\r\n ]\r\n);\r\n\ndefine(\"nhs/views/BuilderShowCaseRedesign/ShowReviews\", function(){});\n\n","\nrequire([\"nhs/views/BuilderShowCaseRedesign/ShowReviews\"]);\n"]}