{"version":3,"sources":["eventBus.js","config.js","verticalSwiper.js","urlHandler.js","imageHandler.js","brightcove.js","vimeo.js","youtube.js","resizeHandler.js","fullImageViewerSetters.js","fullImageViewerState.js","fullImageViewerState.Desktop.js","fullImageViewerHeader.js","fullImageViewerBasicFormsHandlerLoader.js","filmStrip.js","arrowNavigation.js","captionBar.js","analitycs.js","filmStripHover.js","imageCounter.js","pipe.js","imageViewer.js","imageZoom.js","externalLink.js","iframeContentHandler.js","copyLink.js","moreInfoPanel.js","imageViewerCallToAction.js","collectionCallToAction.js","trackerMedia.js","galleryTab.js","otherMedia.js","fullImageViewerMain.js","scheduleTour.js","freeBrochureHandler.js","zoom.js","performanceEvents.js","segmentEvents.js","video.js","index.js"],"names":["global","NewHomeSource","previousEventBus","EventBus","this","observers","prototype","addObserver","topic","observer","Array","isArray","push","notifyObservers","data","totalCallbacks","length","i","fn","update","removeObserver","index","indexOf","splice","noConflict","window","FullImageViewer","FullImageViewerOpener","previousConfig","Config","defaultThumbnails","JSON","parse","document","querySelector","innerHTML","languageResources","isTouchScreen","Object","hasOwnProperty","call","zoomableCollections","notDisplayWithinSandboxExtensions","isMediaGoingToBeShownInCarousel","specialCollections","other","isCaptionBarVisible","isFilmStripVisible","processImage","collectionName","imageElement","links","element","media","title","Title","url","Url","type","Type","id","Id","Collection","IsCtaSlide","IsSelected","OpenExternally","Source","toLowerCase","getClickOrTouchEvent","isMobileDevice","collectionConfig","Name","collectionImages","Images","keys","isZoomableCollection","includes","IsFrame","isDisplayInSandBoxCollection","match","getAttributeValue","attribute","fullImageViewer","getAttribute","filmStrip","scheduleATour","otherMedia","defaultThumbs","isMediShownInCarousel","queryImagesContainer","dataTdvAttributes","previousVerticalSwiper","VerticalSwiper","movementY","event","changedTouches","clientY","moveElement","updateTransitionY","translate","style","transitionDuration","validate","availableHeight","parentElement","getBoundingClientRect","height","totalHeight","maximum","translateY","onTouchEnd","totalMovement","Math","abs","touchStart","isClick","touchNow","requestAnimationFrame","bind","onTouchMove","translation","preventDefault","isScrolling","onTouchStart","onWheel","value","scrollCallback","deltaY","callback","scrollElement","addEventListener","transform","previousUrlHandler","UrlHandler","insertQueryString","queryString","firstQuestion","queryStringToAppend","substring","removeQueryString","position","Modules","previousImageHandler","ImageHandler","addJpgParameter","imageSource","formatJpg","separator","beforeFormat","triggerOnDemandTracker","eventInformation","body","dispatchEvent","CustomEvent","detail","triggerEvents","eventParameters","googleAnalyticsEventAction","googleAnalytics4EventName","events","googleAnalytics4Event","eventType","eventName","params","video_type","click_target","googleAnalyticsEvent","eventCategory","eventAction","eventLabel","forEach","videoPlayers","brightcove","playerInformation","account","player","defaultEvents","onEnded","onPlaying","onPaused","bcPlayer","eventsHandler","loadVideo","error","video","catalog","load","setAttribute","onTimeUpdate","currentTime","Number","duration","percentViewed","floor","ev","isEventViewed","playingHandler","eventData","videoId","on","onReady","playOnLoaded","play","createVideo","videojs","bc","loadBrightcoveScript","define","require","brightcoveCallback","tag","getElementsByTagName","script","createElement","async","src","location","protocol","onload","parentNode","insertBefore","Player","source","config","getElementById","assign","createContainer","videoElement","width","classList","setVideo","getVideo","dispose","pause","vimeo","onLoaded","createPlayer","options","destroy","Vimeo","loadVimeoScript","vimeoPlayerCallback","youtube","loadYoutubeApiScript","YT","onYouTubeIframeAPIReady","target","playVideo","onPlayerStateChange","cueVideoById","onStateChange","pauseVideo","previousResizeHandler","ResizeHandler","filmStripContainer","fullImageViewerContainer","imagesContainer","calculateArea","filmStripSize","size","fullImageViewerSize","calculate","previousFullImageViewerSetters","FullImageViewerSetters","compareById","currentImage","setImageFromImageTag","image","activeImage","selectedImage","collection","dataset","imageId","setImageFromButtonTag","button","collectionKeys","collectionKeysLength","selectedCollection","currentCollection","imageKeys","imageKeysLength","current","setters","A","DIV","IMG","BUTTON","PICTURE","object","flag","setImageFromCondition","getImage","opener","setFunction","tagName","previousFullImageViewerState","FullImageViewerState","eventBus","fullImageViewerData","allImages","VideoId","dataUrl","ThumbnailHelper","thumbnailUrl","Alt","AltText","Description","CollectionName","Index","Is360Image","IsRichMedia","EmbedCode","ThumbnailUrl","VideoType","IsGalleryResource","processCollection","TotalImages","Elements","imagesAdded","add","get","images","getViewerData","setTotalCollections","totalCollections","TotalCollections","getAllImages","pushCtaLastImage","lastImage","notifyResize","handleResize","init","Collections","totalElements","setImage","trigger","closest","selectedCollectionName","focus","previousFullImageViewerHeader","FullImageViewerHeader","getTextContent","textContent","render","header","information","subtitle","subtitleText","slice","querySelectorAll","map","join","appendChild","cloneNode","appendInformation","previousFullImageViewerBasicFormsHandlerLoader","FullImageViewerBasicFormsHandlerLoader","initBasicFormHandler","containerElement","querySelectorTemplate","FullImageViewerBasicFormsHandler","removeAttribute","Init","modalOpened","modal","loadBasicForm","NHS","loadJs","EmailDomainValidator","Event","previousFilmStrip","FilmStrip","queryfullImageRoleThumbnail","downElement","upElement","eventToAttach","hidden","swiper","translationInY","createThumbnail","replace","getSrc","alt","updateTranslation","translateToSelectedElement","parseInt","selectedElement","selectedTop","offsetTop","maxMovement","movement","direction","documentFragment","createDocumentFragment","filler","visibilityClass","remove","thumbnail","renderActiveThumbnail","activeThumbnail","newActiveThumbnail","allThumbnails","findById","item","validateWheel","scrollValue","click","callbacks","triggerId","newImage","find","elements","move","moveArrow","keyCode","previousArrowNavigation","ArrowNavigation","leftElement","rightElement","callbackMove","state","visibility","renderCollectionSet","isSelected","onMoveDown","selectedIndex","findIndex","newIndex","onMoveLeft","onMoveRight","onMoveUp","moveDown","moveLeft","moveUp","moveRight","keyboard","previousCaptionBar","CaptionBar","headerElement","subtextElement","isVisible","AnalitycsHelper","googleAnalyticsId","getGoogleAnalitycsIdentifier","eventsCategory","previousAnalitycs","Analitycs","eventsConfiguration","closeFullImage","ga","saveFullImage","scheduleFullImage","moreInfoFullImage","upArrowFullImage","downArrowFullImage","selectedThumbFullImage","leftArrowFullImage","rightArrowFullImage","closeMoreInfoFullImage","scheduleTourAfterMoreInfoFullImage","contactBuilderAfterMoreInfoFullImage","askBuilderAfterMoreInfoFullImage","copyFullImage","emailFullImage","saveFromMoreInfoFullImage","collectionFullImage","label","externalLink","code","previousFilmStripHover","FilmStripHover","hoverableCollections","previousImageCounter","ImageCounter","counterElement","elementsInCollection","imageIndex","previousPipe","Pipe","composeFunctions","functions","parameters","arguments","result","functionIndex","apply","conditionalPipe","previousImageViewer","ImageViewer","mediaBreakpoints","pictureElement","createSource","pixels","oneX","twoX","srcset","maxResolution","maxResolutionx2","img","display","displayPicture","shouldBeIgnored","isZoomable","Zoom","isPicture","IsOtherMedia","hidePicture","previousImageZoom","ImageZoom","onTouchEndEvent","onTouchMoveEvent","onTouchStartEvent","onMouseWheelEvent","onMouseLeaveEvent","clear","x","y","startObject","constrain","imageHeight","picture","ratio","zoomLevel","imageWidth","canvasHeight","canvas","canvasWidth","bounds","left","right","top","bottom","dx","dy","clientX","totalMovementInX","totalMovementInY","timeElapsed","Date","time","zoom","shiftKey","offsetX","offsetY","moveX","moveY","pan","eventDetail","delta","wheelDelta","isZoomIn","redraw","dHeight","dWidth","drawingContext","save","clearRect","restore","drawImage","onImageLoaded","removeEventListener","min","Image","imageSmoothingEnabled","NaN","getContext","resize","adjustedClickX","adjustedClickY","realCanvasWidth","realCanvasHeight","previousExternalLink","ExternalLink","containerExternalLink","anchorLink","alertExternalLink","isFrame","displayLink","previousIframeContentHandler","IframeContentHandler","iframeContainer","iframeElement","resizeFrameDimensions","alreadyExistingIframe","iFrameSource","embedCode","replaceableStrings","&","lt;","gt;","#39;","quot;","char","replaceSpecialCharactersFromEmbedCode","getEmbededCodeSource","updateSandboxAttribute","prepend","previousCopyLink","CopyLink","alertCopyLink","queryCopyLink","urlToCopy","toggleCopyAlert","navigator","clipboard","writeText","copyLinkButton","previousMoreInfoPanel","MoreInfoPanel","panelForm","moreInfoButton","elementsActions","panelActionContainer","revealPhoneTextOnPage","hiddePhoneText","revealPhoneTextFullImageViewer","queryMoreInfo","revealPhoneNumberFullImageViewer","backButton","trackingQueryString","encodeURIComponent","openPanelActions","ga4EventClick_target","isPhoneNumberVisible","GalleryTab","showArrows","closePanelActions","openScheduleForm","ScheduleTour","setUpScheduleTour","openContactBuilderForm","setUpContactBuilder","openScheduleTourFromCallToAction","openContactBuilderFromCallToAction","closePanelAction","scheduleTourButton","contactBuilderButton","askQuestionButton","contactAgentButton","querySelectorTeplate","currentTarget","Mailcheck","emailButton","href","openScheduleTourFromCta","openFreeBrochureFromCta","modalUrl","FreeBrochureHandler","revealPhoneEvent","leadEvents","tagManager","getFromDataLayer","ga4EventPosition","Position","previousImageViewerCallToAction","ImageViewerCallToAction","callToActionElement","scheculeButton","queryCallToAction","previouscollectionCallToAction","CollectionCallToAction","messages","translationKeys","GetCollectionMessage","previousTrackerMedia","TrackerMedia","trackCollectionImpressionEvent","viewedCollection","event_type","currency","click_target1","previousGalleryTab","trackerMedia","queryNavigator","galleryNavigation","leftGalleryArrow","rightGalleryArrow","navCallToAction","swipingObject","navCallToActionLeftLimit","getRightViewportLimit","showLeftAndRightArrow","firstCollection","lastCollection","touchCancel","fingerCount","startX","startY","curX","curY","setUpGalleryNavigationBar","isActiveCollectionInsideViewport","currentActiveCollection","isSelectedTabInsideViewport","scroll","letfArrow","scrollBy","rightArrow","swipingStart","touches","pageX","pageY","swipingEnd","swipingMove","selectCollection","imagesArray","from","newSelectedImage","filter","otherMediaType","tdvEvent","previousOtherMedia","OtherMedia","OtherMediaTitle","OtherMediaSubtitle","captionContainer","otherMediaLogo","container","mediaContainer","titleElement","otherMediaContent","subtitleElement","swiperContainer","isCommunityDetail","playerBox","dataAttributesTdv","tdvAttributes","dataAttr","template","logo","createMediaLink","link","getTdvEvent","displayInCarousel","hide","outerHTML","ModalBackground","previousFullImageViewerMain","FullImageViewerMain","close","destroyBackground","removeChild","previousScheduleTour","closeButton","mainContainer","guidedTourConfiguration","closeButtonForm","ga4EventButton_name","ButtonNameClicked","handleSelfGuidedTourContent","isGoingToBeShown","selfGuidedContent","elementsInSelector","j","lazyLoad","closeThankYouModal","step","setUpEventClose","sendFormFunction","firedEvent","formToGoBack","panelFormType","segmentButton_action","segmentbutton_action","ga4IdentityButton_name","ga4IdentityPosition","onClickSendForm","forgotPasswordLink","resetDataset","ga4EventName","resetFormLink","ResetForm","onclick","formTextValues","setFormValuesToDefault","bindEvents","getBrochureCta","form","liveOutSideChackBox","onchange","onChangeToggleZipInput","setupLeadForms","oneOnOneTabButton","guidedTourTabButton","videoChatTabButton","bindScheduleTourTabsEvents","setUpForm","isScheduleTour","formClone","content","querySelectorForSectionToRemove","formType","formTitle","formButton","TitleForGalleryForm","ContactTheBuilder","SubmitRequest","remainingForm","innerText","segmentEventButton_action","buttonText","clonedFirstLegalConsentSection","updatedtLegalConsentText","replaceWith","updateLegalConsentText","phone","initDatePicker","nterNowStatus","parametersElement","leadAction","LeadAction","stringify","inputs","stopPropagation","previousFreeBrochureHandler","fieldsConfig","backFromFormEvent","freeBrochureButton","request","fetch","method","headers","X-Requested-With","response","text","createRange","createContextualFragment","fetchFreeBrochureForm","isFullImageViewerLead","html","htmlResponse","isModalReadyToDisplay","ModalLoader","displayModal","fragment","createModal","previousZoom","canvasElement","zoomInQuery","zoomOutQuery","zoomInElement","zoomOutElement","isDisplayedInCarousel","imageZoom","onOrientationChange","displayZoomControls","zoomControls","displayValue","functionForClassList","zoomControl","displayCanvas","orientation","getCarouselWidth","onerror","NoPhoto","setSizes","isCanvas","zoomIn","zoomOut","communityVideoEvent","dataDetailInfo","previousPerformanceEvents","PerformanceEvents","logVideo","previousSegmentEvents","SegmentEvents","eventForSegment","image_url","image_sequence","map_id","map_sequence","tour_id","tour_sequnce","image_type","floorplan_url","floorplan_type","floorplan_sequence","page","video_id","video_sequence","previousVideo","Video","videoContainer","displayVideo","insertPlayer","playerToUse","playerName","findPlayer","handler","[object Object]","isVideo"],"mappings":"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","file":"../fullimageviewerbundle-0ed76049ab.min.js","sourceRoot":"..","sourcesContent":["(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","(function config(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerOpener) {\r\n return;\r\n }\r\n\r\n const previousConfig = global.NewHomeSource.FullImageViewer.Config;\r\n const defaultThumbnails = JSON.parse(document.querySelector('[data-component=\"defaultThumbnails\"]').innerHTML);\r\n const languageResources = JSON.parse(document.querySelector('[data-component=\"languageResources\"]').innerHTML);\r\n const querySwiperElement = '[data-full-image-viewer-role=\"swiper-container\"]';\r\n const isTouchScreen = Object.prototype.hasOwnProperty.call(global, 'ontouchstart');\r\n const zoomableCollections = ['floorplan', 'map'];\r\n const notDisplayWithinSandboxExtensions = /(?:pdf)/;\r\n const isMediaGoingToBeShownInCarousel = global.document.querySelector(querySwiperElement);\r\n\r\n /**\r\n * @private\r\n * processImage: adds the relevat image information into the fullImageViewerData collection.\r\n *\r\n * @param {string} collectionName name of the image collection.\r\n * @param {object} image with the information relevat of the element.\r\n * @param {int} index image index.\r\n */\r\n function processImage(collectionName) {\r\n const imageElement = { };\r\n const length = this.length;\r\n const links = [];\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n const element = this[index];\r\n const media = {\r\n title: element.Title,\r\n url: element.Url,\r\n type: element.Type,\r\n id: element.Id,\r\n };\r\n\r\n links.push(media);\r\n }\r\n\r\n imageElement.Collection = collectionName;\r\n imageElement.Id = this[0].Id;\r\n imageElement.IsCtaSlide = false;\r\n imageElement.IsSelected = false;\r\n imageElement.OpenExternally = false;\r\n imageElement.Source = defaultThumbnails[collectionName.toLowerCase()];\r\n imageElement.links = links;\r\n\r\n return imageElement;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.Config\r\n */\r\n function Config() {\r\n }\r\n\r\n const specialCollections = {\r\n other: {\r\n isCaptionBarVisible: false,\r\n isFilmStripVisible: false,\r\n processImage,\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n * getClickOrTouchEvent: returns 'click' if the device doesn't supports touch events, 'touchend' otherwise.\r\n */\r\n Config.getClickOrTouchEvent = function getClickOrTouchEvent() {\r\n return isTouchScreen ? 'touchend' : 'click';\r\n };\r\n\r\n /**\r\n * @public\r\n * isMobileDevice: returns 'click' if the device doesn't supports touch events, 'touchend' otherwise.\r\n */\r\n Config.isMobileDevice = function isMobileDevice() {\r\n return !!document.querySelector('[data-ismobiledevice=\"true\"]');\r\n };\r\n\r\n /**\r\n * @public\r\n * isCaptionBarVisible: returns true if a collection should display the caption bar, otherwise false.\r\n *\r\n * @param {object} data with the information of the object being evaluated.\r\n */\r\n Config.isCaptionBarVisible = function isCaptionBarVisible(data) {\r\n if (!data) {\r\n return true;\r\n }\r\n\r\n const collectionConfig = specialCollections[data.Collection.toLowerCase()];\r\n\r\n if (typeof collectionConfig === 'object' &&\r\n Object.prototype.hasOwnProperty.call(collectionConfig, 'isCaptionBarVisible')) {\r\n return collectionConfig.isCaptionBarVisible;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n /**\r\n * @public\r\n * isFilmStripVisible: returns true if a collection should display the filmstrip, otherwise false.\r\n *\r\n * @param {object} data with the information of the object being evaluated.\r\n */\r\n Config.isFilmStripVisible = function isFilmStripVisible(data) {\r\n if (!data) {\r\n return false;\r\n }\r\n\r\n const collectionConfig = specialCollections[data.Name.toLowerCase()];\r\n\r\n if (typeof collectionConfig === 'object' &&\r\n Object.prototype.hasOwnProperty.call(collectionConfig, 'isFilmStripVisible')) {\r\n return collectionConfig.isFilmStripVisible;\r\n }\r\n\r\n const collectionImages = data.Images;\r\n const imageKeys = Object.keys(collectionImages);\r\n return imageKeys.length > 1;\r\n };\r\n\r\n /**\r\n * @public\r\n * isZoomableCollection: returns true if a collection should be handled by the Zoom module, otherwise false.\r\n *\r\n * @param {object} data with the information of the object being evaluated.\r\n */\r\n Config.isZoomableCollection = function isZoomableCollection(data) {\r\n const collectionName = data.Collection || data.Name;\r\n return zoomableCollections.includes(collectionName.toLowerCase()) && !data.IsFrame;\r\n };\r\n\r\n /**\r\n * @public\r\n * isDisplayInSandBoxCollection: returns true if a collection should have sandbox attribute, otherwise false.\r\n *\r\n * @param {object} data with the information of the object being evaluated.\r\n */\r\n Config.isDisplayInSandBoxCollection = function isDisplayInSandBoxCollection(data) {\r\n return data.Source.match(notDisplayWithinSandboxExtensions) == null;\r\n };\r\n\r\n /**\r\n * @public\r\n * getAttributeValue: get value of data attribute on FIV\r\n *\r\n * @param {String} attribute to be selected.\r\n */\r\n Config.getAttributeValue = function getAttributeValue(attribute) {\r\n const element = Config.fullImageViewer.querySelector('[' + attribute + ']');\r\n return element && element.getAttribute(attribute);\r\n };\r\n\r\n Config.filmStrip = global.document.querySelector('[data-full-image-viewer-role=\"filmstrip-parent\"]');\r\n Config.fullImageViewer = global.document.querySelector('[data-component=\"full-image-viewer\"]');\r\n Config.scheduleATour = global.document.querySelector('[data-component=\"full-image-viewer-schedule-tour-cta\"]');\r\n Config.otherMedia = global.document.querySelector('[data-full-image-viewer-role=\"other-media\"]');\r\n Config.defaultThumbs = defaultThumbnails;\r\n Config.collectionConfig = specialCollections;\r\n Config.languageResources = languageResources;\r\n Config.isMediShownInCarousel = isMediaGoingToBeShownInCarousel;\r\n Config.queryImagesContainer = isMediaGoingToBeShownInCarousel\r\n ? '[data-full-image-viewer-role=\"viewer\"]'\r\n : '[data-full-image-viewer-role=\"main-media-container\"]';\r\n Config.dataTdvAttributes = ['data-builder', 'data-community', 'data-parent-community-id', 'data-market',\r\n 'data-plan-id', 'data-spec-id'];\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.Config to the previous script.\r\n */\r\n Config.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.Config = previousConfig;\r\n return Config;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewer.Config = Config;\r\n}(window));\r\n","(function verticalSwiper(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousVerticalSwiper = global.NewHomeSource.VerticalSwiper;\r\n\r\n /**\r\n * @private\r\n * movementX: returns the clientY coordinate of the mouse or touch event.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function movementY(event) {\r\n return event.changedTouches\r\n ? event.changedTouches[0].clientY\r\n : event.clientY;\r\n }\r\n\r\n /**\r\n * @private\r\n * moveElement: move the element vertical.\r\n */\r\n function moveElement(updateTransitionY, translate) {\r\n const element = this.element;\r\n element.style.transitionDuration = '0.7s';\r\n this.update(updateTransitionY);\r\n this.translate(translate);\r\n }\r\n\r\n /**\r\n * @private\r\n * validate: validates the translation movement does not go outside bounds.\r\n */\r\n function validate() {\r\n const element = this.element;\r\n const availableHeight = element.parentElement.getBoundingClientRect().height;\r\n const totalHeight = element.getBoundingClientRect().height;\r\n const maximum = availableHeight - totalHeight;\r\n\r\n if (totalHeight <= availableHeight) {\r\n moveElement.call(this, 0, 0);\r\n return;\r\n }\r\n\r\n if (this.translateY > 0) {\r\n moveElement.call(this, this.translateY, -this.translateY);\r\n return;\r\n }\r\n\r\n if (this.translateY < maximum) {\r\n moveElement.call(this, 0, maximum);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * onTouchEnd: handler of mouse up and touch end events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchEnd(event) {\r\n const totalMovement = Math.abs(movementY(event) - this.touchStart);\r\n\r\n this.isClick = totalMovement > 10;\r\n this.touchNow = null;\r\n this.touchStart = null;\r\n\r\n if (!this.isClick) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(validate.bind(this));\r\n }\r\n\r\n /**\r\n * @private\r\n * onTouchMove: handler of mouse and touch move events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchMove(event) {\r\n const clientY = movementY(event);\r\n const translation = clientY - this.touchNow;\r\n\r\n event.preventDefault();\r\n\r\n if (!this.isScrolling()) {\r\n return;\r\n }\r\n\r\n this.touchNow = clientY;\r\n this.translate(translation);\r\n }\r\n\r\n /**\r\n * @private\r\n * onTouchStart: handler of mouse down and touch start events.\r\n *\r\n * @param {event} event\r\n */\r\n function onTouchStart(event) {\r\n const clientY = movementY(event);\r\n\r\n this.element.style.transitionDuration = '';\r\n this.touchStart = clientY;\r\n this.touchNow = clientY;\r\n this.isClick = true;\r\n }\r\n\r\n /**\r\n * @private\r\n * onWheel: handler of when user move wheel in the element.\r\n *\r\n * @param {event} event\r\n */\r\n function onWheel(event) {\r\n const value = (this.scrollCallback && this.scrollCallback(event.deltaY)) || 0;\r\n this.translate(value);\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.VerticalSwiper\r\n */\r\n function VerticalSwiper(element, callback, scrollElement, scrollCallback) {\r\n if (!element) {\r\n return;\r\n }\r\n\r\n this.translateY = 0;\r\n this.callback = callback;\r\n this.scrollCallback = scrollCallback;\r\n this.element = element;\r\n this.element.addEventListener('mousedown', onTouchStart.bind(this), false);\r\n this.element.addEventListener('touchstart', onTouchStart.bind(this), false);\r\n this.element.addEventListener('mousemove', onTouchMove.bind(this), false);\r\n this.element.addEventListener('touchmove', onTouchMove.bind(this), false);\r\n this.element.addEventListener('mouseup', onTouchEnd.bind(this), false);\r\n this.element.addEventListener('touchend', onTouchEnd.bind(this), false);\r\n this.element.addEventListener('mouseleave', onTouchEnd.bind(this), false);\r\n this.element.addEventListener('wheel', onWheel.bind(this), false);\r\n }\r\n\r\n /**\r\n * @public\r\n * isScrolling: returns true if a touchStart event has been triggered, otherwise false.\r\n */\r\n VerticalSwiper.prototype.isScrolling = function isScrolling() {\r\n return this.touchStart || this.touchStart === 0;\r\n };\r\n\r\n /**\r\n * @public\r\n * translate: moves the element in the Y axis.\r\n *\r\n * @param {number} translation pixes that are going to be moved.\r\n */\r\n VerticalSwiper.prototype.translate = function translate(translation) {\r\n this.translateY += translation;\r\n this.element.style.transform = 'translateY(' + this.translateY + 'px)';\r\n\r\n if (typeof this.callback === 'function') {\r\n this.callback(this.translateY);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * update: overrides the value of translateY property.\r\n *\r\n * @param {number} value new translate Y value.\r\n */\r\n VerticalSwiper.prototype.update = function translate(value) {\r\n this.translateY = value;\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.SampleModule to the previous script.\r\n */\r\n VerticalSwiper.noConflict = function noConflict() {\r\n global.NewHomeSource.VerticalSwiper = previousVerticalSwiper;\r\n return VerticalSwiper;\r\n };\r\n\r\n global.NewHomeSource.VerticalSwiper = VerticalSwiper;\r\n}(window));\r\n","(function urlHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n const previousUrlHandler = global.NewHomeSource.FullImageViewer.UrlHandler;\r\n\r\n /**\r\n * @constructs NewHomeSource.UrlHandler\r\n */\r\n function UrlHandler() {\r\n }\r\n\r\n /**\r\n * @public\r\n * insertQueryString: inserts additional parameters to the url.\r\n *\r\n * @param {string} url where the query string is going to be added.\r\n * @param {string} queryString to add to the string.\r\n */\r\n UrlHandler.insertQueryString = function insertQueryString(url, queryString) {\r\n let firstQuestion = url.indexOf('?') + 1;\r\n let queryStringToAppend = queryString;\r\n\r\n if (!queryString) {\r\n queryStringToAppend = '';\r\n\r\n if (firstQuestion > 0) {\r\n firstQuestion -= 1;\r\n } else if (firstQuestion === 0) {\r\n firstQuestion = url.length;\r\n }\r\n }\r\n\r\n if (queryString && firstQuestion === 0) {\r\n queryStringToAppend = '?' + queryString;\r\n firstQuestion = url.length;\r\n }\r\n\r\n return url.substring(0, firstQuestion) + queryStringToAppend;\r\n };\r\n\r\n /**\r\n * @public\r\n * removeQueryString: returns the given URL without the querystring portion.\r\n *\r\n * @param {string} url where the query string is going to be removed.\r\n */\r\n UrlHandler.removeQueryString = function removeQueryString(url) {\r\n const position = url.indexOf('?');\r\n\r\n if (position < 1) {\r\n return url;\r\n }\r\n\r\n return url.substring(0, position);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.UrlHandler to the previous script.\r\n */\r\n UrlHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.UrlHandler = previousUrlHandler;\r\n return UrlHandler;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewer.UrlHandler = UrlHandler;\r\n}(window));\r\n","(function imageHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewer.UrlHandler) {\r\n return;\r\n }\r\n\r\n const previousImageHandler = global.NewHomeSource.Modules.ImageHandler;\r\n\r\n /**\r\n * @constructs ImageHandler\r\n */\r\n function ImageHandler() {\r\n }\r\n\r\n /**\r\n * @public\r\n * addJpgParameter: add jpg parameter to image source.\r\n *\r\n */\r\n ImageHandler.addJpgParameter = function addJpgParameter(imageSource, queryString) {\r\n let formatJpg = '';\r\n let separator = '';\r\n let beforeFormat = '';\r\n if (queryString) {\r\n separator = '&';\r\n beforeFormat = queryString;\r\n }\r\n if (imageSource.indexOf('.gif') > -1) {\r\n formatJpg = separator + 'format=jpg';\r\n }\r\n\r\n if (imageSource.indexOf('.png') > -1 || imageSource.indexOf('.svg') > -1) {\r\n formatJpg = separator + 'format=jpg&backgroundColor=white';\r\n }\r\n\r\n return global.NewHomeSource.FullImageViewer.UrlHandler.insertQueryString(imageSource, beforeFormat + formatJpg);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Modules.ImageHandler to the previous script.\r\n */\r\n ImageHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.ImageHandler = previousImageHandler;\r\n return ImageHandler;\r\n };\r\n\r\n global.NewHomeSource.Modules.ImageHandler = ImageHandler;\r\n}(window));\r\n","(function brightcovePlayer(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.videoPlayers = global.NewHomeSource.videoPlayers || {};\r\n global.NewHomeSource.videoPlayers.brightcove = global.NewHomeSource.videoPlayers.brightcove || {};\r\n\r\n /**\r\n * @private\r\n * triggerOnDemandTracker: dispatch the event trackOnDemandEvent\r\n *\r\n * @param {Object} eventInformation object with the event information to be triggered.\r\n */\r\n function triggerOnDemandTracker(eventInformation) {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: eventInformation\r\n }\r\n }));\r\n }\r\n\r\n /**\r\n * triggerEvents: triggers the events with the parameter values.\r\n * @param {Object} eventParameters object parameter values that will be used on the events.\r\n */\r\n function triggerEvents(eventParameters) {\r\n const { googleAnalyticsEventAction, googleAnalytics4EventName } = eventParameters;\r\n const events = [];\r\n if (googleAnalytics4EventName) {\r\n const googleAnalytics4Event = {\r\n eventType: 'GA4Event',\r\n eventName: googleAnalytics4EventName,\r\n params: {\r\n video_type: 'Brightcove',\r\n click_target: 'Video event'\r\n }\r\n };\r\n events.push(googleAnalytics4Event);\r\n }\r\n\r\n if (googleAnalyticsEventAction) {\r\n const googleAnalyticsEvent = {\r\n event: 'GAEvent',\r\n eventType: 'GAEvent',\r\n eventCategory: 'Video',\r\n eventAction: googleAnalyticsEventAction,\r\n eventLabel: 'Brightcove',\r\n };\r\n events.push(googleAnalyticsEvent);\r\n }\r\n\r\n events.forEach(triggerOnDemandTracker);\r\n }\r\n\r\n const brightcoveDomain = '//players.brightcove.net/';\r\n const scriptFile = '_default/index.min.js';\r\n const playerInformation = {\r\n account: '689254969001',\r\n player: 'HkxkXn9mf',\r\n };\r\n const videoId = 'video-id';\r\n const defaultEvents = {\r\n onEnded: function onEnded() {\r\n const eventParameters = {\r\n googleAnalyticsEventAction: 'Completed',\r\n googleAnalytics4EventName: 'video_completed'\r\n };\r\n triggerEvents(eventParameters);\r\n },\r\n onPlaying: function onPlaying() { },\r\n onPaused: function onPaused() {\r\n const eventParameters = {\r\n googleAnalyticsEventAction: 'Pause',\r\n googleAnalytics4EventName: 'video_pause'\r\n };\r\n triggerEvents(eventParameters);\r\n },\r\n };\r\n\r\n let bcPlayer;\r\n let eventsHandler;\r\n let player;\r\n\r\n /**\r\n * @private\r\n * brightcoveFilepath: returns the path where the JavaScript for the requested player can be found.\r\n */\r\n function brightcoveFilepath() {\r\n return global.document.location.protocol +\r\n brightcoveDomain +\r\n playerInformation.account +\r\n '/' +\r\n playerInformation.player +\r\n scriptFile;\r\n }\r\n\r\n /**\r\n * @private\r\n * loadVideo: loads a new video into the Brightcove Player.\r\n *\r\n * @param {object} error with the error information.\r\n * @param {string} video that is going to be loaded.\r\n */\r\n function loadVideo(error, video) {\r\n bcPlayer.catalog.load(video);\r\n }\r\n\r\n /**\r\n * @private\r\n * setAttribute: sets the value as an attribute according to the playerInformation.\r\n * @param {string} value property that is going to be set in the DOM.\r\n */\r\n function setAttribute(value) {\r\n player.setAttribute('data-' + value, playerInformation[value]);\r\n }\r\n\r\n /**\r\n * @private\r\n * updateVideo: looks for the given video id from the player information, and loads it.\r\n */\r\n function updateVideo() {\r\n bcPlayer.catalog.getVideo(playerInformation[videoId], loadVideo);\r\n }\r\n\r\n /**\r\n * @private\r\n * onTimeUpdate: Executed each second the video is reproduced.\r\n */\r\n\r\n function onTimeUpdate() {\r\n const currentTime = Number(this.currentTime());\r\n const duration = Number(this.duration());\r\n const percentViewed = Math.floor((currentTime / duration) * 100);\r\n const ev = this.isEventViewed;\r\n // eslint-disable-next-line default-case\r\n switch (true) {\r\n case (!ev['75'] && percentViewed === 75): {\r\n const eventParameters = {\r\n googleAnalyticsEventAction: '75% Watched',\r\n googleAnalytics4EventName: 'video_75%'\r\n };\r\n triggerEvents(eventParameters);\r\n ev['75'] = true;\r\n break;\r\n }\r\n case (!ev['50'] && percentViewed === 50): {\r\n const eventParameters = {\r\n googleAnalyticsEventAction: '50% Watched',\r\n googleAnalytics4EventName: 'video_50%'\r\n };\r\n triggerEvents(eventParameters);\r\n ev['50'] = true;\r\n break;\r\n }\r\n case (!ev['25'] && percentViewed === 25): {\r\n const eventParameters = {\r\n googleAnalyticsEventAction: '25% Watched',\r\n googleAnalytics4EventName: 'video_25%'\r\n };\r\n triggerEvents(eventParameters);\r\n ev['25'] = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * onPlaying: triggers the onPlaying event handler.\r\n */\r\n function playingHandler(data) {\r\n const eventData = data;\r\n eventData.videoId = playerInformation[videoId];\r\n eventsHandler.onPlaying(eventData);\r\n\r\n const eventParameters = {\r\n googleAnalyticsEventAction: 'Play',\r\n };\r\n triggerEvents(eventParameters);\r\n\r\n bcPlayer.isEventViewed = {};\r\n bcPlayer.on('timeupdate', onTimeUpdate);\r\n }\r\n\r\n function onReady() {\r\n if (eventsHandler.playOnLoaded) {\r\n bcPlayer.play();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * createVideo: loads the requested video on the player.\r\n */\r\n function createVideo() {\r\n if (typeof videojs !== 'function') {\r\n return;\r\n }\r\n\r\n Object.keys(playerInformation).forEach(setAttribute);\r\n bcPlayer = global.bc(player);\r\n bcPlayer.on('ended', eventsHandler.onEnded);\r\n bcPlayer.on('play', playingHandler);\r\n bcPlayer.on('pause', eventsHandler.onPaused);\r\n bcPlayer.on('ready', onReady);\r\n }\r\n\r\n /**\r\n * @private\r\n * loadBrightcoveScript: loads the Brightcove JavaScript needed for the player.\r\n */\r\n function loadBrightcoveScript() {\r\n if (typeof global.videojs === 'function') {\r\n createVideo();\r\n return;\r\n }\r\n\r\n if (global.define) {\r\n require(\r\n ['bc'],\r\n (brightcoveCallback) => {\r\n global.bc = brightcoveCallback;\r\n createVideo();\r\n }\r\n );\r\n\r\n return;\r\n }\r\n\r\n const tag = document.getElementsByTagName('meta')[0];\r\n const script = document.createElement('script');\r\n\r\n script.async = true;\r\n script.src = brightcoveFilepath();\r\n script.type = 'text/javascript';\r\n script.onload = createVideo;\r\n tag.parentNode.insertBefore(script, tag);\r\n }\r\n\r\n /**\r\n * @constructs BrightcovePlayer\r\n *\r\n * @param {HTMLVideoElement} video element where the brightcove player is going to be created.\r\n * @param {string} source id of the video to be displayed.\r\n * @param {object} config with the extra information needed by the player.\r\n */\r\n function Player(video, source, config) {\r\n player = global.document.getElementById(video);\r\n playerInformation[videoId] = source;\r\n eventsHandler = Object.assign({ }, defaultEvents, config);\r\n loadBrightcoveScript();\r\n }\r\n\r\n /**\r\n * @public\r\n * createContainer: creates an HTML element needed by the Brightcove JavaScript to create the player.\r\n */\r\n Player.createContainer = function createContainer() {\r\n const videoElement = document.createElement('video');\r\n videoElement.id = 'videoContainer';\r\n videoElement.style.width = '100%';\r\n videoElement.style.height = '100%';\r\n videoElement.innerHTML = '';\r\n videoElement.classList = 'video-js BrightcoveExperience BrightcoveExperienceID_4160 bc-player-HkxkXn9mf_default';\r\n videoElement.setAttribute('data-embed', 'default');\r\n videoElement.setAttribute('data-application-id', 'true');\r\n videoElement.setAttribute('controls', 'true');\r\n\r\n return videoElement;\r\n };\r\n\r\n /**\r\n * @public\r\n * setVideo: changes the source of the video to the given value.\r\n *\r\n * @param {HTMLVideoElement} video element where the YouTube player is going to be created.\r\n * @param {string} source new video ID.\r\n */\r\n Player.setVideo = function setVideo(video, source) {\r\n if (source) {\r\n player = global.document.getElementById(video);\r\n playerInformation[videoId] = source;\r\n }\r\n\r\n if (!bcPlayer) {\r\n loadBrightcoveScript();\r\n return;\r\n }\r\n\r\n updateVideo();\r\n };\r\n\r\n /**\r\n * @public\r\n * dispose: destroy the video reference for brightcove.\r\n *\r\n */\r\n Player.dispose = function dispose() {\r\n try {\r\n if (bcPlayer) {\r\n bcPlayer.dispose();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * pause: pauses the brightcove video.\r\n *\r\n */\r\n Player.pause = function pause() {\r\n try {\r\n if (player) {\r\n player.pause();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * play: plays the brightcove video.\r\n *\r\n */\r\n Player.play = function play() {\r\n try {\r\n if (player) {\r\n player.play();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n global.NewHomeSource.videoPlayers.brightcove.Player = Player;\r\n}(window));\r\n","(function vimeoPlayer(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.videoPlayers = global.NewHomeSource.videoPlayers || {};\r\n global.NewHomeSource.videoPlayers.vimeo = global.NewHomeSource.videoPlayers.vimeo || {};\r\n\r\n const vimeoApi = '//player.vimeo.com/api/player.js';\r\n const playerInformation = { };\r\n const videoId = 'video-id';\r\n const elementId = 'element-id';\r\n const defaultEvents = {\r\n onEnded: function onEnded() { },\r\n onPlaying: function onPlaying() { },\r\n onPaused: function onPaused() { },\r\n onLoaded: function onLoaded() { },\r\n };\r\n\r\n let eventsHandler;\r\n let player;\r\n\r\n /**\r\n * @private\r\n * apiFilepath: returns the path where the JavaScript for the requested player can be found.\r\n */\r\n function apiFilepath() {\r\n return global.document.location.protocol + vimeoApi;\r\n }\r\n\r\n /**\r\n * @private\r\n * onPlaying: triggers the onPlaying event handler.\r\n */\r\n function playingHandler(data) {\r\n const eventData = data;\r\n eventData.videoId = playerInformation[videoId];\r\n eventsHandler.onPlaying(eventData);\r\n }\r\n\r\n function onReady() {\r\n if (eventsHandler.playOnLoaded) {\r\n player.play();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * createPlayer: creates a new Vimeo Player in the given element ID.\r\n */\r\n function createPlayer() {\r\n const options = {\r\n id: playerInformation[videoId],\r\n };\r\n\r\n if (player) {\r\n player.destroy();\r\n }\r\n\r\n player = new global.Vimeo.Player(playerInformation[elementId], options);\r\n player.on('playing', playingHandler);\r\n player.on('pause', eventsHandler.onPaused);\r\n player.on('ended', eventsHandler.onEnded);\r\n player.on('loaded', onReady);\r\n }\r\n\r\n /**\r\n * @private\r\n * updateVideo: loads the new video-id into the Vimeo player.\r\n */\r\n function updateVideo() {\r\n if (!player) {\r\n createPlayer();\r\n }\r\n\r\n player.loadVideo(playerInformation[videoId]);\r\n }\r\n\r\n /**\r\n * @private\r\n * loadVimeoScript: loads the Vimeo JavaScript needed for the player.\r\n */\r\n function loadVimeoScript() {\r\n if (typeof global.Vimeo === 'object') {\r\n createPlayer();\r\n return;\r\n }\r\n\r\n if (global.define) {\r\n require(\r\n ['vimeoPlayer'],\r\n (vimeoPlayerCallback) => {\r\n global.Vimeo = {};\r\n global.Vimeo.Player = vimeoPlayerCallback;\r\n createPlayer();\r\n }\r\n );\r\n\r\n return;\r\n }\r\n\r\n const tag = document.getElementsByTagName('meta')[0];\r\n const script = document.createElement('script');\r\n\r\n script.async = true;\r\n script.type = 'text/javascript';\r\n script.src = apiFilepath();\r\n script.onload = createPlayer;\r\n tag.parentNode.insertBefore(script, tag);\r\n }\r\n\r\n /**\r\n * @constructs VimeoPlayer\r\n *\r\n * @param {HTMLVideoElement} video element where the Vimeo player is going to be created.\r\n * @param {string} source id of the video to be displayed.\r\n * @param {object} config with the extra information needed by the player.\r\n */\r\n function Player(video, source, config) {\r\n playerInformation[videoId] = source;\r\n playerInformation[elementId] = video;\r\n eventsHandler = Object.assign({ }, defaultEvents, config);\r\n loadVimeoScript();\r\n }\r\n\r\n /**\r\n * @public\r\n * createContainer: creates an HTML element needed by the Vimeo JavaScript to create the player.\r\n *\r\n * @param {number} width of the video.\r\n * @param {number} height of the video.\r\n */\r\n Player.createContainer = function createContainer(width, height) {\r\n const videoElement = document.createElement('div');\r\n videoElement.setAttribute('data-vimeo-width', width);\r\n videoElement.setAttribute('data-vimeo-height', height);\r\n videoElement.setAttribute('responsive', 'true');\r\n videoElement.id = 'videoContainer';\r\n videoElement.style.width = '100%';\r\n videoElement.style.height = '100%';\r\n videoElement.innerHTML = '';\r\n return videoElement;\r\n };\r\n\r\n /**\r\n * @public\r\n * setVideo: changes the source of the video to the given value.\r\n *\r\n * @param {HTMLVideoElement} video element where the YouTube player is going to be created.\r\n * @param {string} source new video ID.\r\n */\r\n Player.setVideo = function setVideo(video, source) {\r\n if (source) {\r\n playerInformation[videoId] = source;\r\n playerInformation[elementId] = video;\r\n }\r\n\r\n if (!player) {\r\n loadVimeoScript();\r\n return;\r\n }\r\n\r\n updateVideo();\r\n };\r\n\r\n /**\r\n * @public\r\n * dispose: destroy the video reference for vimeo.\r\n *\r\n */\r\n Player.dispose = function dispose() {\r\n try {\r\n if (player) {\r\n player.destroy();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * pause: pauses the vimeo video.\r\n *\r\n */\r\n Player.pause = function pause() {\r\n try {\r\n if (player) {\r\n player.pause();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * play: plays the vimeo video.\r\n *\r\n */\r\n Player.play = function play() {\r\n try {\r\n if (player) {\r\n player.play();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n global.NewHomeSource.videoPlayers.vimeo.Player = Player;\r\n}(window));\r\n","(function youtubePlayer(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.videoPlayers = global.NewHomeSource.videoPlayers || {};\r\n global.NewHomeSource.videoPlayers.youtube = global.NewHomeSource.videoPlayers.youtube || {};\r\n\r\n const youtubeAPI = '//www.youtube.com/iframe_api';\r\n const playerInformation = {};\r\n const videoId = 'video-id';\r\n const elementId = 'element-id';\r\n const defaultEvents = {\r\n onEnded: function onEnded() { },\r\n onPlaying: function onPlaying() { },\r\n onPaused: function onPaused() { },\r\n onLoaded: function onLoaded() { },\r\n };\r\n\r\n let eventsHandler;\r\n let player;\r\n\r\n /**\r\n * @private\r\n * apiFilepath: returns the path where the JavaScript for the requested player can be found.\r\n */\r\n function apiFilepath() {\r\n return global.document.location.protocol + youtubeAPI;\r\n }\r\n\r\n /**\r\n * @private\r\n * loadYoutubeApiScript: loads the Youtube IFrame API needed for the player.\r\n */\r\n function loadYoutubeApiScript() {\r\n if (typeof global.YT === 'object') {\r\n global.onYouTubeIframeAPIReady();\r\n return;\r\n }\r\n\r\n const tag = document.getElementsByTagName('meta')[0];\r\n const script = document.createElement('script');\r\n\r\n script.type = 'text/javascript';\r\n script.async = true;\r\n script.src = apiFilepath();\r\n tag.parentNode.insertBefore(script, tag);\r\n }\r\n\r\n /**\r\n * @private\r\n * onPlaying: triggers the onPlaying event handler.\r\n */\r\n function playingHandler(data) {\r\n const eventData = data;\r\n eventData.videoId = playerInformation[videoId];\r\n eventsHandler.onPlaying(eventData);\r\n }\r\n\r\n function onReady(event) {\r\n if (eventsHandler.playOnLoaded) {\r\n event.target.playVideo();\r\n }\r\n }\r\n\r\n function onPlayerStateChange(event) {\r\n switch (event.data) {\r\n case 0:\r\n // Ended.\r\n eventsHandler.onEnded(event);\r\n break;\r\n case 1:\r\n // Playing.\r\n playingHandler(event);\r\n break;\r\n case 2:\r\n // Paused.\r\n eventsHandler.onPaused(event);\r\n break;\r\n default:\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * updateVideo: sets a new video in the YouTube player.\r\n */\r\n function updateVideo() {\r\n player.cueVideoById(playerInformation[videoId]);\r\n }\r\n\r\n /**\r\n * @constructs YoutubePlayer\r\n *\r\n * @param {HTMLVideoElement} video element where the YouTube player is going to be created.\r\n * @param {string} source id of the video to be displayed.\r\n * @param {object} config with the extra information needed by the player.\r\n */\r\n function Player(video, source, config) {\r\n playerInformation[videoId] = source;\r\n playerInformation[elementId] = video;\r\n eventsHandler = Object.assign({ }, defaultEvents, config);\r\n loadYoutubeApiScript();\r\n }\r\n\r\n /**\r\n * @public\r\n * createContainer: creates an HTML element needed by the Youtube JavaScript to create the player.\r\n */\r\n Player.createContainer = function createContainer() {\r\n const videoElement = document.createElement('div');\r\n videoElement.id = 'videoContainer';\r\n videoElement.style.width = '100%';\r\n videoElement.style.height = '100%';\r\n videoElement.innerHTML = '';\r\n return videoElement;\r\n };\r\n\r\n /**\r\n * @public\r\n * setVideo: changes the source of the video to the given value.\r\n *\r\n * @param {HTMLVideoElement} video element where the YouTube player is going to be created.\r\n * @param {string} source new video ID.\r\n */\r\n Player.setVideo = function setVideo(video, source) {\r\n if (source) {\r\n playerInformation[videoId] = source;\r\n playerInformation[elementId] = video;\r\n }\r\n\r\n if (!player) {\r\n loadYoutubeApiScript();\r\n return;\r\n }\r\n\r\n updateVideo();\r\n };\r\n\r\n /**\r\n * @public\r\n * onYouTubeIframeAPIReady: function invoked by the Youtube IFrame API once all the resources have been loaded.\r\n */\r\n global.onYouTubeIframeAPIReady = function onYouTubeIframeAPIReady() {\r\n if (typeof global.YT !== 'object') {\r\n return;\r\n }\r\n\r\n player = new global.YT.Player(playerInformation[elementId], {\r\n videoId: playerInformation[videoId],\r\n events: {\r\n onStateChange: onPlayerStateChange,\r\n onReady,\r\n },\r\n });\r\n };\r\n\r\n /**\r\n * @public\r\n * dispose: destroy the video reference for youtube.\r\n *\r\n */\r\n Player.dispose = function dispose() {\r\n try {\r\n if (player) {\r\n player.destroy();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * pause: pauses the youtube video.\r\n *\r\n */\r\n Player.pause = function pause() {\r\n try {\r\n if (player) {\r\n player.pauseVideo();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * play: plays the youtube video.\r\n *\r\n */\r\n Player.play = function play() {\r\n try {\r\n if (player) {\r\n player.playVideo();\r\n }\r\n // eslint-disable-next-line no-empty\r\n } catch (error) {\r\n\r\n }\r\n };\r\n\r\n global.NewHomeSource.videoPlayers.youtube.Player = Player;\r\n}(window));\r\n","(function resizeHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const previousResizeHandler = global.NewHomeSource.ResizeHandler;\r\n const filmStripContainer = global.NewHomeSource.FullImageViewer.Config.filmStrip;\r\n const fullImageViewerContainer = global.NewHomeSource.FullImageViewer.Config.fullImageViewer;\r\n const imagesContainer = global.document.querySelector(global\r\n .NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n\r\n /**\r\n * @private\r\n * calculateArea: gets the width and height available to display the media.\r\n * @param {*} callback function to execute after the width and height has been found.\r\n */\r\n function calculateArea(callback) {\r\n const filmStripSize = filmStripContainer.getBoundingClientRect();\r\n const size = imagesContainer.getBoundingClientRect();\r\n const fullImageViewerSize = fullImageViewerContainer.getBoundingClientRect();\r\n const height = size.height + 1;\r\n const width = fullImageViewerSize.width - filmStripSize.width - 52;\r\n\r\n if (typeof callback === 'function') {\r\n callback({ width, height });\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.ResizeHandler\r\n */\r\n function ResizeHandler() {\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * resize: Returns resized element according to images container.\r\n */\r\n ResizeHandler.calculate = function calculate(callback) {\r\n requestAnimationFrame(calculateArea.bind(this, callback));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.ResizeHandler to the previous script.\r\n */\r\n ResizeHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.ResizeHandler = previousResizeHandler;\r\n return ResizeHandler;\r\n };\r\n\r\n global.NewHomeSource.ResizeHandler = ResizeHandler;\r\n}(window));\r\n","(function fullImageViewerSetters(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousFullImageViewerSetters = global.NewHomeSource.FullImageViewerSetters;\r\n\r\n /**\r\n * @private\r\n * compareById: true if the currentImage.Id is equals to the id, otherwise false.\r\n *\r\n * @param {object} currentImage that is being evaluated\r\n * @param {*} id of the image.\r\n */\r\n function compareById(currentImage, id) {\r\n return currentImage.Id === id;\r\n }\r\n\r\n /**\r\n * @private\r\n * setImageFromUrl: sets the information regarding the selected image using the given URL.\r\n *\r\n * @param {object} element that will be used to decide if the image is selected.\r\n * @param {function} fn function that returns the value for the isSelected property.\r\n * @param {boolean} flag value to be passed to the fn parameter.\r\n */\r\n function setImageFromCondition(element, fn, data, flag) {\r\n const collectionKeys = Object.keys(data);\r\n const collectionKeysLength = collectionKeys.length;\r\n let selectedImage = null;\r\n\r\n for (let index = 0; index < collectionKeysLength; index += 1) {\r\n const currentCollection = data[collectionKeys[index]];\r\n const collectionImages = currentCollection.Images;\r\n\r\n if (currentCollection.Images) {\r\n const imageKeys = Object.keys(collectionImages);\r\n const imageKeysLength = imageKeys.length;\r\n\r\n for (let current = 0; current < imageKeysLength; current += 1) {\r\n const currentImage = collectionImages[imageKeys[current]];\r\n\r\n currentImage.IsSelected = fn(currentImage, element, flag);\r\n\r\n if (currentImage.IsSelected) {\r\n selectedImage = Object.assign(currentImage);\r\n }\r\n }\r\n\r\n currentCollection.IsSelected = selectedImage && selectedImage.Collection === currentCollection.Name;\r\n }\r\n }\r\n\r\n return selectedImage;\r\n }\r\n\r\n /**\r\n * @private\r\n * setImage: sets the selected image according to the image tag provided as parameter.\r\n *\r\n * @param {object} image where the information related to the state exists.\r\n * @param {object} data with the information about the Full Image Viewer State.\r\n */\r\n function setImageFromImageTag(image, data) {\r\n const activeImage = global.document.querySelector('[data-full-image-viewer-opener=\"true\"].active') || image;\r\n let selectedImage = null;\r\n const collection = data[activeImage.dataset.collection];\r\n const currentImage = collection.Images['Image' + activeImage.dataset.imageId];\r\n collection.IsSelected = true;\r\n currentImage.IsSelected = true;\r\n selectedImage = Object.assign(currentImage);\r\n return selectedImage;\r\n }\r\n\r\n /**\r\n * @private\r\n * setImage: sets the selected image according to the button tag provided as parameter.\r\n *\r\n * @param {object} image where the information related to the state exists.\r\n * @param {object} data with the information about the Full Image Viewer State.\r\n */\r\n function setImageFromButtonTag(button, data) {\r\n const collectionKeys = Object.keys(data);\r\n const collectionKeysLength = collectionKeys.length;\r\n const selectedCollection = button.getAttribute('data-type') || collectionKeys[0];\r\n let selectedImage = button.getAttribute('data-type') || null;\r\n const collection = data[selectedCollection];\r\n const imageId = button.dataset.imageId;\r\n let image;\r\n\r\n if (imageId) {\r\n image = collection.Images['Image' + button.dataset.imageId];\r\n }\r\n\r\n for (let index = 0; index < collectionKeysLength; index += 1) {\r\n const currentCollection = data[collectionKeys[index]];\r\n\r\n if (typeof currentCollection === 'object') {\r\n currentCollection.IsSelected = selectedCollection === currentCollection.Name;\r\n }\r\n }\r\n\r\n const collectionImages = data[selectedCollection].Images;\r\n const imageKeys = Object.keys(collectionImages);\r\n const imageKeysLength = imageKeys.length;\r\n\r\n if (image) {\r\n selectedImage = image;\r\n selectedImage.IsSelected = true;\r\n } else {\r\n for (let current = 0; current < imageKeysLength; current += 1) {\r\n const currentImage = collectionImages[imageKeys[current]];\r\n\r\n currentImage.IsSelected = current === 0;\r\n\r\n if (currentImage.IsSelected) {\r\n selectedImage = Object.assign({ }, currentImage);\r\n }\r\n }\r\n }\r\n\r\n return selectedImage;\r\n }\r\n\r\n /**\r\n * @private\r\n * setImageFromObject: set the selected image according to the object provided as parameter.\r\n *\r\n * @param {object} image with the information that is going to be set in the state.\r\n * @param {object} data with the information about the Full Image Viewer State.\r\n */\r\n function setImageFromObject(image, data) {\r\n return setImageFromCondition(image.Id, compareById, data);\r\n }\r\n\r\n /**\r\n * @private\r\n * Different ways to set the fullImageViewerState\r\n */\r\n const setters = {\r\n A: setImageFromButtonTag,\r\n DIV: setImageFromButtonTag,\r\n IMG: setImageFromImageTag,\r\n BUTTON: setImageFromButtonTag,\r\n PICTURE: setImageFromImageTag,\r\n object: setImageFromObject,\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewerSetters\r\n */\r\n function FullImageViewerSetters() {\r\n }\r\n\r\n /**\r\n * @public\r\n * getImage: gets the image that is related to the opener.\r\n *\r\n * @param {any} opener element or object that will be used to search for the more accurate image.\r\n * @param {object} data with the information about the Full Image Viewer State.\r\n */\r\n FullImageViewerSetters.getImage = function getImage(opener, data) {\r\n const setFunction = setters[opener.tagName || typeof opener];\r\n\r\n if (setFunction) {\r\n return setFunction(opener, data);\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewerSetters to the previous script.\r\n */\r\n FullImageViewerSetters.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewerSetters = previousFullImageViewerSetters;\r\n return FullImageViewerSetters;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerSetters = FullImageViewerSetters;\r\n}(window));\r\n","(function fullImageViewerState(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.EventBus ||\r\n !global.NewHomeSource.FullImageViewer.UrlHandler ||\r\n !global.NewHomeSource.FullImageViewerSetters ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const previousFullImageViewerState = global.NewHomeSource.FullImageViewerState;\r\n const eventBus = new global.NewHomeSource.EventBus();\r\n const fullImageViewerData = { };\r\n const allImages = [];\r\n\r\n /**\r\n * @private\r\n * getThumbnailSrc: returns a default thumbnail if the image collection is rich media, otherwise: this will return\r\n * the src property of the image.\r\n *\r\n * @param {object} data with the information relevat of the element.\r\n */\r\n function getThumbnailSrc(data, thumbnailUrl) {\r\n const url = thumbnailUrl || '';\r\n const isValidImage = url.match(/(?:jpg|gif|png|svg|webp)/);\r\n return !isValidImage\r\n ? global.NewHomeSource.FullImageViewer.Config.defaultThumbs[data.CollectionName]\r\n : thumbnailUrl;\r\n }\r\n\r\n /**\r\n * @private\r\n * processImage: adds the relevat image information into the fullImageViewerData collection.\r\n *\r\n * @param {string} collectionName name of the image collection.\r\n * @param {object} image with the information relevat of the element.\r\n * @param {int} index image index.\r\n */\r\n function processImage(collectionName, image, index) {\r\n if (image.Type.toLowerCase() === 'vid' && !image.VideoId) {\r\n return;\r\n }\r\n\r\n const dataUrl = global.NewHomeSource.FullImageViewer.UrlHandler\r\n .removeQueryString(global.NewHomeSource.ThumbnailHelper.validate(image));\r\n const imageElement = { };\r\n\r\n imageElement.Alt = image.AltText || image.Description || image.CollectionName;\r\n imageElement.Collection = collectionName;\r\n imageElement.Description = image.Description || image.AltText || image.CollectionName;\r\n imageElement.Id = image.Id;\r\n imageElement.Index = index + 1;\r\n imageElement.Is360Image = image.Is360Image;\r\n imageElement.IsCtaSlide = false;\r\n imageElement.IsSelected = false;\r\n imageElement.OpenExternally = image.OpenExternally;\r\n imageElement.Title = image.Title || image.CollectionName;\r\n imageElement.Source = image.IsRichMedia ? image.Url : dataUrl;\r\n imageElement.EmbedCode = image.EmbedCode;\r\n imageElement.IsFrame = image.IsRichMedia;\r\n imageElement.ThumbnailUrl = getThumbnailSrc(image, dataUrl);\r\n imageElement.VideoId = image.VideoId;\r\n imageElement.VideoType = image.VideoType;\r\n imageElement.Type = image.Type;\r\n imageElement.IsGalleryResource = true;\r\n\r\n this['Image' + image.Id] = imageElement;\r\n allImages.push(imageElement);\r\n }\r\n\r\n function FullImageViewerState() {\r\n }\r\n\r\n /**\r\n * @private\r\n * processCollection: adds relevant collection information into the fullImageViewerData\r\n *\r\n * @param {object} collection with the information relevant for the collection.\r\n */\r\n FullImageViewerState.processCollection = function processCollection(collection) {\r\n const collectionConfig = global\r\n .NewHomeSource\r\n .FullImageViewer\r\n .Config\r\n .collectionConfig[collection.Name.toLowerCase()] ||\r\n {};\r\n\r\n fullImageViewerData[collection.Name] = {};\r\n fullImageViewerData[collection.Name].Images = {};\r\n fullImageViewerData[collection.Name].IsSelected = false;\r\n fullImageViewerData[collection.Name].Name = collection.Name;\r\n fullImageViewerData[collection.Name].TotalImages = collection.Elements.length;\r\n\r\n if (Object.prototype.hasOwnProperty.call(collectionConfig, 'processImage')) {\r\n const imagesAdded = collectionConfig.processImage.call(collection.Elements, collection.Name);\r\n allImages.push(imagesAdded);\r\n fullImageViewerData[collection.Name].Images = [imagesAdded];\r\n } else {\r\n collection.Elements.forEach(processImage.bind(fullImageViewerData[collection.Name].Images, collection.Name));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * add: adds a new Observer to the Event bus for the given topic.\r\n *\r\n * @param {string} topic to identify the data needed for the observer.\r\n * @param {function} observer function to be called when the topic has changed.\r\n */\r\n FullImageViewerState.add = function add(topic, observer) {\r\n eventBus.addObserver(topic, observer);\r\n };\r\n\r\n /**\r\n * @public\r\n * get: gets the Full Image Viewer State.\r\n */\r\n FullImageViewerState.get = function get() {\r\n return Object.assign({ images: allImages }, fullImageViewerData);\r\n };\r\n\r\n FullImageViewerState.getViewerData = function getViewerData() {\r\n return Object.assign({}, fullImageViewerData);\r\n };\r\n\r\n FullImageViewerState.setTotalCollections = function setTotalCollections(totalCollections) {\r\n fullImageViewerData.TotalCollections = totalCollections;\r\n };\r\n\r\n FullImageViewerState.getAllImages = function getAllImages() {\r\n return Object.assign([], allImages);\r\n };\r\n\r\n FullImageViewerState.pushCtaLastImage = function pushCtaLastImage(lastImage) {\r\n allImages.push(lastImage);\r\n };\r\n\r\n FullImageViewerState.eventBus = eventBus;\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewerState to the previous script.\r\n */\r\n FullImageViewerState.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewerState = previousFullImageViewerState;\r\n return FullImageViewerState;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState = FullImageViewerState;\r\n}(window));\r\n","(function fullImageViewerStateDesktop(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState.eventBus ||\r\n !global.NewHomeSource.FullImageViewer.UrlHandler ||\r\n !global.NewHomeSource.FullImageViewerSetters ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.FullImageViewerState) {\r\n return;\r\n }\r\n\r\n const ctaSlideId = 'CTASlide';\r\n let selectedImage = {};\r\n\r\n /**\r\n * @private\r\n * notifyResize: sends an onResize event to the event bus.\r\n *\r\n * @param {object} data with the information of the new width and height.\r\n */\r\n function notifyResize(data) {\r\n global.NewHomeSource.FullImageViewerState.eventBus.notifyObservers(\r\n 'onResize',\r\n Object.assign(data, global.NewHomeSource.FullImageViewerState.getViewerData()[selectedImage.Collection])\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * handleResie: notifies the observers about a resize event in progress.\r\n */\r\n function handleResize() {\r\n global.NewHomeSource.ResizeHandler.calculate(notifyResize);\r\n }\r\n\r\n /**\r\n * @public\r\n * init: inits the full image viewer state logic.\r\n *\r\n * @param {object} data to fill related to collection and images.\r\n */\r\n global.NewHomeSource.FullImageViewerState.init = function init(data) {\r\n if (!data || !data.Collections) {\r\n return;\r\n }\r\n\r\n data.Collections.forEach(global.NewHomeSource.FullImageViewerState.processCollection);\r\n const totalElements = global.NewHomeSource.FullImageViewerState.getAllImages().length;\r\n const lastImage = Object.assign({}, global.NewHomeSource.FullImageViewerState.getAllImages()[totalElements - 1]);\r\n\r\n if (global.NewHomeSource.FullImageViewer.Config.scheduleATour) {\r\n lastImage.Id = ctaSlideId;\r\n lastImage.Index = totalElements + 1;\r\n lastImage.IsCtaSlide = true;\r\n global.NewHomeSource.FullImageViewerState.pushCtaLastImage(lastImage);\r\n }\r\n global.NewHomeSource.FullImageViewerState.setTotalCollections(data.Collections.length);\r\n };\r\n\r\n /**\r\n * @public\r\n * setImage: sets the Full Image Viewer to the image according to the data passed.\r\n *\r\n * @param {object} trigger with the information that is going to be set.\r\n */\r\n global.NewHomeSource.FullImageViewerState.setImage = function setImage(trigger) {\r\n const opener = trigger.tagName ? trigger.closest('[data-full-image-viewer-opener=\"true\"]') : trigger;\r\n const selectedCollectionName = selectedImage ? selectedImage.Collection : null;\r\n\r\n selectedImage = global.NewHomeSource.FullImageViewerSetters.getImage(\r\n opener,\r\n global.NewHomeSource.FullImageViewerState.getViewerData()\r\n );\r\n\r\n if (!selectedImage && global.NewHomeSource.FullImageViewerState.getAllImages().includes(trigger)) {\r\n selectedImage = trigger;\r\n selectedImage.IsSelected = true;\r\n }\r\n\r\n if (selectedCollectionName !== selectedImage.Collection) {\r\n global.NewHomeSource.FullImageViewerState.eventBus.notifyObservers('onCollectionSet', Object.assign(\r\n {},\r\n global.NewHomeSource.FullImageViewerState.getViewerData()[selectedImage.Collection]\r\n ));\r\n handleResize();\r\n }\r\n global.NewHomeSource.FullImageViewer.Config.fullImageViewer.focus();\r\n global.NewHomeSource.FullImageViewerState.eventBus.notifyObservers('onImageSet', Object.assign({}, selectedImage));\r\n };\r\n\r\n handleResize();\r\n global.addEventListener('resize', handleResize);\r\n global.addEventListener('orientationchange', handleResize);\r\n}(window));\r\n","(function fullImageViewerHeader(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousFullImageViewerHeader = global.NewHomeSource.FullImageViewerHeader;\r\n\r\n /**\r\n * @private\r\n * getTextContent: return textContent from element.\r\n *\r\n * @param {HTMLElement} element to get text.\r\n */\r\n function getTextContent(element) {\r\n return element.textContent;\r\n }\r\n\r\n /**\r\n * @public\r\n * render: renders the Header of the Full Image Viewer.\r\n *\r\n * @param {HTMLElement} header where the information is going to be added.\r\n * @param {HTMLElement} information that is going to be added in the header.\r\n */\r\n function render(header, information) {\r\n const subtitle = global.document.querySelector('[full-image-viewer-role=\"subtitle\"]');\r\n const subtitleText = [].slice.call(global.document.querySelectorAll('[data-full-image-viewer-role=\"subtitle\"]'));\r\n\r\n if (subtitle && subtitleText.length > 0) {\r\n subtitle.textContent = subtitleText.map(getTextContent).join(' ');\r\n }\r\n\r\n header.appendChild(information.cloneNode(true));\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewerHeader\r\n */\r\n function FullImageViewerHeader() {\r\n }\r\n\r\n /**\r\n * @public\r\n * appendInformation: reads the information from the current header and\r\n * appends it to the Full Image Viewer.\r\n */\r\n FullImageViewerHeader.appendInformation = function appendInformation() {\r\n const header = global.document.querySelector('[full-image-viewer-role=\"header\"]');\r\n const information = global.document.querySelector('[data-full-image-viewer-role=\"header\"]');\r\n\r\n if (!header || !information) {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(render.bind(this, header, information));\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 FullImageViewerHeader.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewerHeader = previousFullImageViewerHeader;\r\n return FullImageViewerHeader;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerHeader = FullImageViewerHeader;\r\n}(window));\r\n","/**\r\n * Summary: Load by async way and start the code to manage the\r\n * basic Forms on the Full Image Viewer.\r\n */\r\n(function fullImageViewerBasicFormsHandlerLoader(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousFullImageViewerBasicFormsHandlerLoader =\r\n global.NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandlerLoader;\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandlerLoader\r\n */\r\n function FullImageViewerBasicFormsHandlerLoader() { }\r\n\r\n function initBasicFormHandler(containerElement, querySelectorTemplate) {\r\n if (global.NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandler) {\r\n containerElement.removeAttribute('hidden');\r\n global.NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandler\r\n .Init(containerElement, querySelectorTemplate);\r\n }\r\n\r\n // Create a new custom event with the name 'modalOpened' and the detail property containing the modal name\r\n const modalOpened = new CustomEvent('modalOpened', {\r\n detail: {\r\n modal: containerElement\r\n }\r\n });\r\n\r\n // Dispatch the event from the element that opens the modal\r\n document.dispatchEvent(modalOpened);\r\n }\r\n\r\n /**\r\n * @public\r\n * loadBasicForm: Load the basicFormHandler js code by the async way.\r\n */\r\n FullImageViewerBasicFormsHandlerLoader.loadBasicForm =\r\n function loadBasicForm(containerElement, querySelectorTemplate) {\r\n if (!containerElement || !querySelectorTemplate) {\r\n return;\r\n }\r\n\r\n const url = document.getElementById('fullImageViewerBasicFormsHandler');\r\n if (global.NHS && url) {\r\n global.NHS.loadJs(url.value, 'fullImageViewerBasicFormsHandler', () => {\r\n initBasicFormHandler(containerElement, querySelectorTemplate);\r\n });\r\n } else {\r\n require(['fullImageViewerBasicFormsHandler', 'emailDomainValidator'], () => {\r\n initBasicFormHandler(containerElement, querySelectorTemplate);\r\n global.NewHomeSource.EmailDomainValidator();\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.FullImageViewerBasicFormsHandlerLoader to the previous script.\r\n */\r\n FullImageViewerBasicFormsHandlerLoader.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandlerLoader =\r\n previousFullImageViewerBasicFormsHandlerLoader;\r\n return FullImageViewerBasicFormsHandlerLoader;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandlerLoader = FullImageViewerBasicFormsHandlerLoader;\r\n}(window));\r\n","(function filmStrip(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.Event ||\r\n !global.NewHomeSource.VerticalSwiper ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Modules.ImageHandler) {\r\n return;\r\n }\r\n\r\n const previousFilmStrip = global.NewHomeSource.FilmStrip;\r\n const activeCssClass = 'active';\r\n const filmStripSelector = '[data-full-image-viewer-role=\"filmstrip\"]';\r\n const queryfullImageRoleThumbnail = '[data-full-image-viewer-role=\"thumbnail\"]';\r\n const queryUpElement = '[data-full-image-viewer-role=\"up\"]';\r\n const queryDownElement = '[data-full-image-viewer-role=\"down\"]';\r\n const thumbsVisible = 'thumbs--visible';\r\n const thumbsHidden = 'thumbs--hidden';\r\n const containerElement = global.document.querySelector(filmStripSelector);\r\n const parentElement = global.document.querySelector('[data-full-image-viewer-role=\"filmstrip-parent\"]');\r\n const params = 'w=112&h=82&mode=crop';\r\n const downElement = global.document.querySelector(queryDownElement);\r\n const upElement = global.document.querySelector(queryUpElement);\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const fullImageViewer = global.NewHomeSource.FullImageViewer.Config.fullImageViewer;\r\n const step = 86;\r\n const hidden = 'hidden';\r\n let translationInY = 0;\r\n let swiper;\r\n\r\n /**\r\n * @private\r\n * getSrc: creates a thumbnail that can be added to the film strip.\r\n * @param {object} data information that is going to be used to create the thumbnail.\r\n */\r\n function getSrc(data) {\r\n if (!data.ThumbnailUrl) {\r\n return null;\r\n }\r\n\r\n let url = data.ThumbnailUrl;\r\n\r\n if (data.VideoType === 'vimeo') {\r\n url = data.ThumbnailUrl.replace('_640.jpg', '_150.jpg');\r\n } else if (data.VideoType !== 'youtube') {\r\n url = global.NewHomeSource.Modules.ImageHandler.addJpgParameter(data.ThumbnailUrl, params);\r\n }\r\n\r\n return url;\r\n }\r\n\r\n /**\r\n * @private\r\n * createThumbnail: creates a thumbnail that can be added to the film strip.\r\n * @param {object} data information that is going to be used to create the thumbnail.\r\n */\r\n function createThumbnail(data) {\r\n const button = global.document.createElement('BUTTON');\r\n const image = global.document.createElement('IMG');\r\n const src = getSrc(data);\r\n\r\n if (!src) {\r\n return null;\r\n }\r\n\r\n button.classList.add('thumbs__btn');\r\n button.setAttribute('data-full-image-viewer-role', 'thumbnail');\r\n button.setAttribute('data-description', data.Title);\r\n button.id = 'Image' + data.Id;\r\n image.src = src;\r\n image.alt = data.Alt;\r\n image.classList.add('thumbs__img');\r\n button.appendChild(image);\r\n\r\n return button;\r\n }\r\n\r\n /**\r\n * @private\r\n * updateTranslation: updates the translateY position of the film strip container.\r\n */\r\n function updateTranslation(translateToSelectedElement) {\r\n containerElement.style.height = 'auto';\r\n translationInY = parseInt(translationInY / step, 10) * step;\r\n const selectedElement = document.querySelector(queryfullImageRoleThumbnail + '.' + activeCssClass);\r\n const selectedTop = selectedElement ? selectedElement.offsetTop : 0;\r\n const availableHeight = parentElement.getBoundingClientRect().height - step;\r\n const totalHeight = containerElement.getBoundingClientRect().height - step;\r\n const maxMovement = availableHeight - totalHeight;\r\n let movement = translationInY + step * this.direction;\r\n\r\n translationInY = movement;\r\n\r\n if (translateToSelectedElement === true) {\r\n movement = -selectedTop;\r\n translationInY = -selectedTop;\r\n }\r\n\r\n if (movement >= 0) {\r\n movement = 0;\r\n upElement.setAttribute(hidden, true);\r\n } else if (translationInY < 0) {\r\n upElement.removeAttribute(hidden);\r\n }\r\n\r\n if (movement - (step / 2) <= maxMovement) {\r\n movement = maxMovement;\r\n downElement.setAttribute(hidden, true);\r\n } else if (totalHeight > availableHeight) {\r\n downElement.removeAttribute(hidden);\r\n }\r\n\r\n if (maxMovement > 0) {\r\n movement = 0;\r\n downElement.setAttribute(hidden, true);\r\n upElement.setAttribute(hidden, true);\r\n containerElement.style.height = '100%';\r\n }\r\n\r\n containerElement.style.transitionDuration = '0.3s';\r\n containerElement.style.transform = 'translateY(' + movement + 'px)';\r\n\r\n if (swiper) {\r\n swiper.update(movement);\r\n }\r\n global.NewHomeSource.FullImageViewer.Config.fullImageViewer.focus();\r\n }\r\n\r\n /**\r\n * @private\r\n * validate: hides or displays the up and down arrows.\r\n *\r\n * @param {number} value relative position.\r\n */\r\n function validate(value) {\r\n const availableHeight = parentElement.getBoundingClientRect().height;\r\n const totalHeight = containerElement.getBoundingClientRect().height - step;\r\n const maximum = availableHeight - totalHeight;\r\n translationInY = value;\r\n fullImageViewer.focus();\r\n\r\n if (value === 0) {\r\n upElement.setAttribute(hidden, true);\r\n requestAnimationFrame(updateTranslation.bind({ direction: 0 }, false));\r\n return;\r\n }\r\n upElement.removeAttribute(hidden);\r\n if (value < maximum) {\r\n downElement.setAttribute(hidden, true);\r\n } else {\r\n downElement.removeAttribute(hidden);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * render: renders the film strip.\r\n *\r\n * @param {object} data information that is needed to render the film strip.\r\n */\r\n function render(data) {\r\n const documentFragment = document.createDocumentFragment();\r\n const collectionImages = data.Images;\r\n const imageKeys = Object.keys(collectionImages);\r\n const imageKeysLength = imageKeys.length;\r\n const filler = global.document.createElement('DIV');\r\n const visibilityClass = global.NewHomeSource.FullImageViewer.Config.isFilmStripVisible(data)\r\n ? thumbsVisible\r\n : thumbsHidden;\r\n\r\n translationInY = 0;\r\n containerElement.style.transform = 'translateY(' + translationInY + 'px)';\r\n containerElement.parentElement.classList.remove(thumbsVisible);\r\n containerElement.parentElement.classList.remove(thumbsHidden);\r\n containerElement.parentElement.classList.add(visibilityClass);\r\n filler.classList.add('thumbs__filler');\r\n\r\n for (let current = 0; current < imageKeysLength; current += 1) {\r\n const currentImage = collectionImages[imageKeys[current]];\r\n const thumbnail = createThumbnail(currentImage);\r\n\r\n if (thumbnail) {\r\n documentFragment.appendChild(thumbnail);\r\n }\r\n }\r\n\r\n containerElement.innerHTML = '';\r\n containerElement.appendChild(documentFragment);\r\n containerElement.appendChild(filler);\r\n requestAnimationFrame(updateTranslation.bind({ direction: 0 }, true));\r\n }\r\n\r\n /**\r\n * @private\r\n * renderActiveThumbnail: renders the active thumbnail.\r\n * @param {object} data information that is needed to set the active thumbnail.\r\n */\r\n function renderActiveThumbnail(data) {\r\n const activeThumbnail = global.document\r\n .querySelector(queryfullImageRoleThumbnail + '.' + activeCssClass);\r\n const newActiveThumbnail = global.document\r\n .querySelector(queryfullImageRoleThumbnail + '#Image' + data.Id);\r\n\r\n if (activeThumbnail) {\r\n activeThumbnail.classList.remove(activeCssClass);\r\n }\r\n\r\n if (newActiveThumbnail) {\r\n newActiveThumbnail.classList.add(activeCssClass);\r\n } else {\r\n const allThumbnails = global.document.querySelectorAll(queryfullImageRoleThumbnail);\r\n\r\n if (allThumbnails.length > 0) {\r\n allThumbnails[allThumbnails.length - 1].classList.add(activeCssClass);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * findById: returns true if the item Id is equals to the binded Id, otherwise false.\r\n */\r\n function findById(item) {\r\n return item.Id === this.id;\r\n }\r\n\r\n /**\r\n * @private\r\n * setImage: set the image pressed by the user as the new selected image.\r\n */\r\n function setImage(event) {\r\n const trigger = event.target.closest(queryfullImageRoleThumbnail);\r\n\r\n if (!trigger) {\r\n return;\r\n }\r\n\r\n const triggerId = +trigger.id.replace('Image', '');\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n const newImage = state.images.find(findById, { id: triggerId });\r\n\r\n global.NewHomeSource.FullImageViewerState.setImage(newImage);\r\n }\r\n\r\n /**\r\n * @private\r\n * validateWheel: move the filmstrip with the mouse wheel.\r\n */\r\n function validateWheel(scrollValue) {\r\n let value = 0;\r\n fullImageViewer.focus();\r\n if (scrollValue > 0) {\r\n value = -1;\r\n } else if (scrollValue < 0) {\r\n value = 1;\r\n }\r\n requestAnimationFrame(updateTranslation.bind({ direction: value }));\r\n }\r\n\r\n /**\r\n * @private\r\n * setupSwiper: attaches listeners to handle swiping actions.\r\n */\r\n function setupSwiper() {\r\n swiper = new global.NewHomeSource.VerticalSwiper(containerElement, validate, parentElement, validateWheel);\r\n }\r\n\r\n const events = {\r\n click: {\r\n callbacks: [setImage],\r\n elements: filmStripSelector,\r\n events: [eventToAttach],\r\n },\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.FilmStrip\r\n */\r\n function FilmStrip() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n FilmStrip.update = function update(data, topic) {\r\n if (topic === 'onCollectionSet') {\r\n requestAnimationFrame(render.bind(this, data, topic));\r\n }\r\n\r\n if (topic === 'onImageSet') {\r\n requestAnimationFrame(renderActiveThumbnail.bind(this, data));\r\n }\r\n\r\n if (topic === 'onResize') {\r\n requestAnimationFrame(updateTranslation.bind({ direction: 0 }, false));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * move: translates the filmStrip content down by moving the Y axis in negative steps.\r\n */\r\n FilmStrip.move = function move(event) {\r\n const trigger = event.target.closest('[data-full-image-viewer-role]');\r\n let value = 0;\r\n\r\n if (trigger.getAttribute('data-full-image-viewer-role') === 'down' ||\r\n trigger.getAttribute('data-full-image-viewer-role') === 'right') {\r\n value = -1;\r\n } else if (trigger.getAttribute('data-full-image-viewer-role') === 'up' ||\r\n trigger.getAttribute('data-full-image-viewer-role') === 'left') {\r\n value = 1;\r\n }\r\n\r\n if (value) {\r\n requestAnimationFrame(updateTranslation.bind({ direction: value }, true));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * moveArrow: translates the filmStrip content down by key down.\r\n */\r\n FilmStrip.moveArrow = function moveArrow(event) {\r\n let value = 0;\r\n if (event.keyCode === 37 || event.keyCode === 38) {\r\n value = 1;\r\n } else if (event.keyCode === 39 || event.keyCode === 40) {\r\n value = -1;\r\n }\r\n\r\n requestAnimationFrame(updateTranslation.bind({ direction: value }, true));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FilmStrip to the previous script.\r\n */\r\n FilmStrip.noConflict = function noConflict() {\r\n global.NewHomeSource.FilmStrip = previousFilmStrip;\r\n return FilmStrip;\r\n };\r\n\r\n requestAnimationFrame(setupSwiper);\r\n global.NewHomeSource.Event(events);\r\n global.NewHomeSource.FullImageViewerState.add('onCollectionSet', FilmStrip);\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', FilmStrip);\r\n global.NewHomeSource.FullImageViewerState.add('onResize', FilmStrip);\r\n global.NewHomeSource.FilmStrip = FilmStrip;\r\n}(window));\r\n","(function arrowNavigation(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.Event ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.FilmStrip) {\r\n return;\r\n }\r\n\r\n const previousArrowNavigation = global.NewHomeSource.ArrowNavigation;\r\n const queryArrowDown = '[data-full-image-viewer-role=\"down\"]';\r\n const queryArrowLeft = '[data-full-image-viewer-role=\"left\"]';\r\n const queryArrowRight = '[data-full-image-viewer-role=\"right\"]';\r\n const queryArrowUp = '[data-full-image-viewer-role=\"up\"]';\r\n const downElement = global.document.querySelector(queryArrowDown);\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const leftElement = global.document.querySelector(queryArrowLeft);\r\n const rightElement = global.document.querySelector(queryArrowRight);\r\n const upElement = global.document.querySelector(queryArrowUp);\r\n const callbackMove = global.NewHomeSource.FilmStrip.move;\r\n const visible = 'visible';\r\n const hidden = 'hidden';\r\n\r\n /**\r\n * @private\r\n * render: renders the arrows according to the information available.\r\n *\r\n * @param {object} data with the information to display or hide the arrows.\r\n */\r\n function render(data) {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n\r\n if (data.TotalImages > 1 || state.TotalCollections > 1) {\r\n leftElement.style.visibility = visible;\r\n rightElement.style.visibility = visible;\r\n } else {\r\n leftElement.style.visibility = hidden;\r\n rightElement.style.visibility = hidden;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * render: renders the arrows according to the information available.\r\n *\r\n * @param {object} data with the information to display or hide the arrows.\r\n */\r\n function renderCollectionSet(data) {\r\n if (data.TotalImages > 1) {\r\n downElement.style.visibility = visible;\r\n upElement.style.visibility = visible;\r\n } else {\r\n upElement.style.visibility = hidden;\r\n downElement.style.visibility = hidden;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * isSelected: returs the value of the IsSelected property.\r\n *\r\n * @param {object} element that is being evaluated.\r\n */\r\n function isSelected(element) {\r\n return element.IsSelected;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.ArrowNavigation\r\n */\r\n function ArrowNavigation() {\r\n }\r\n\r\n /**\r\n * @public\r\n * onMoveDown: moves the image being displayed to the next one.\r\n * If not more images are available in the current collection, will not move.\r\n */\r\n ArrowNavigation.onMoveDown = function onMoveDown() {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n const selectedIndex = state.images.findIndex(isSelected);\r\n const newIndex = selectedIndex + 1;\r\n\r\n if (newIndex === state.images.length ||\r\n state.images[selectedIndex].Collection !== state.images[newIndex].Collection) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.FullImageViewerState.setImage(state.images[newIndex]);\r\n };\r\n\r\n /**\r\n * @public\r\n * onMoveLeft: moves the image being displayed to the previous one.\r\n * If not more images are available in the current collection, will move to the previous collection.\r\n */\r\n ArrowNavigation.onMoveLeft = function onMoveLeft() {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n const selectedIndex = state.images.findIndex(isSelected);\r\n let newIndex = selectedIndex - 1;\r\n\r\n if (newIndex < 0) {\r\n newIndex = state.images.length - 1;\r\n }\r\n\r\n global.NewHomeSource.FullImageViewerState.setImage(state.images[newIndex]);\r\n };\r\n\r\n /**\r\n * @public\r\n * onMoveRight: moves the image being displayed to the next one.\r\n * If not more images are available in the current collection, will move to the next collection.\r\n */\r\n ArrowNavigation.onMoveRight = function onMoveRigth() {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n const selectedIndex = state.images.findIndex(isSelected);\r\n let newIndex = selectedIndex + 1;\r\n\r\n if (newIndex >= state.images.length) {\r\n newIndex = 0;\r\n }\r\n\r\n global.NewHomeSource.FullImageViewerState.setImage(state.images[newIndex]);\r\n };\r\n\r\n /**\r\n * @public\r\n * onMoveRight: moves the image being displayed to the previous one.\r\n * If not more images are available in the current collection, will not move.\r\n */\r\n ArrowNavigation.onMoveUp = function onMoveUp() {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n const selectedIndex = state.images.findIndex(isSelected);\r\n const newIndex = selectedIndex - 1;\r\n\r\n if (newIndex < 0 || state.images[selectedIndex].Collection !== state.images[newIndex].Collection) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.FullImageViewerState.setImage(state.images[newIndex]);\r\n };\r\n\r\n /**\r\n * @private\r\n * onKeyDown: moves the image to the left or right according to the key pressed.\r\n *\r\n * @param {KeyboardEvent} event with the information related to key pressed.\r\n */\r\n function onKeyDown(event) {\r\n if (event.keyCode === 37) {\r\n ArrowNavigation.onMoveLeft();\r\n } else if (event.keyCode === 38) {\r\n ArrowNavigation.onMoveUp();\r\n } else if (event.keyCode === 39) {\r\n ArrowNavigation.onMoveRight();\r\n } else if (event.keyCode === 40) {\r\n ArrowNavigation.onMoveDown();\r\n }\r\n }\r\n\r\n const events = {\r\n moveDown: {\r\n callbacks: [ArrowNavigation.onMoveDown, callbackMove],\r\n elements: queryArrowDown,\r\n events: [eventToAttach],\r\n },\r\n moveLeft: {\r\n callbacks: [ArrowNavigation.onMoveLeft, callbackMove],\r\n elements: queryArrowLeft,\r\n events: [eventToAttach],\r\n },\r\n moveUp: {\r\n callbacks: [ArrowNavigation.onMoveUp, callbackMove],\r\n elements: queryArrowUp,\r\n events: [eventToAttach],\r\n },\r\n moveRight: {\r\n callbacks: [ArrowNavigation.onMoveRight, callbackMove],\r\n elements: queryArrowRight,\r\n events: [eventToAttach],\r\n },\r\n keyboard: {\r\n callbacks: [onKeyDown, global.NewHomeSource.FilmStrip.moveArrow],\r\n elements: '[data-component=\"full-image-viewer\"]',\r\n events: ['keydown'],\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n ArrowNavigation.update = function update(data, topic) {\r\n requestAnimationFrame(render.bind(this, data));\r\n\r\n if (topic === 'onCollectionSet') {\r\n requestAnimationFrame(renderCollectionSet.bind(this, data));\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 ArrowNavigation.noConflict = function noConflict() {\r\n global.NewHomeSource.ArrowNavigation = previousArrowNavigation;\r\n return ArrowNavigation;\r\n };\r\n\r\n global.NewHomeSource.Event(events);\r\n global.NewHomeSource.FullImageViewerState.add('onCollectionSet', ArrowNavigation);\r\n global.NewHomeSource.ArrowNavigation = ArrowNavigation;\r\n}(window));\r\n","(function captionBar(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const previousCaptionBar = global.NewHomeSource.CaptionBar;\r\n const headerElement = global.document.querySelector('[data-full-image-viewer-role=\"caption-header\"]');\r\n const subtextElement = global.document.querySelector('[data-full-image-viewer-role=\"caption-subtext\"]');\r\n\r\n /**\r\n * @public\r\n * render: renders the caption bar.\r\n *\r\n * @param {object} data information that is needed to render the caption bar.\r\n */\r\n function render(data) {\r\n const isVisible = global.NewHomeSource.FullImageViewer.Config.isCaptionBarVisible(data);\r\n const title = isVisible ? data.Title : '';\r\n const subtitle = isVisible && data.Title !== data.Description ? data.Description : '';\r\n\r\n headerElement.innerHTML = title;\r\n subtextElement.innerHTML = subtitle;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.CaptionBar\r\n */\r\n function CaptionBar() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n CaptionBar.update = function update(data) {\r\n requestAnimationFrame(render.bind(this, data));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.CaptionBar to the previous script.\r\n */\r\n CaptionBar.noConflict = function noConflict() {\r\n global.NewHomeSource.CaptionBar = previousCaptionBar;\r\n return CaptionBar;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', CaptionBar);\r\n global.NewHomeSource.CaptionBar = CaptionBar;\r\n}(window));\r\n","(function analitycs(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.AnalitycsHelper ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const googleAnalyticsId = global.NewHomeSource.AnalitycsHelper.getGoogleAnalitycsIdentifier() + '.send';\r\n const eventsCategory = 'Gallery Detail Pages';\r\n const eventLabel = 'event';\r\n const previousAnalitycs = global.NewHomeSource.FullImageViewer.Analitycs;\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.Analitycs\r\n */\r\n function Analitycs() {\r\n }\r\n\r\n function logCloseFullImageEvent() {\r\n global.ga(\r\n googleAnalyticsId,\r\n eventLabel,\r\n eventsCategory,\r\n 'Clicks to Close Gallery Viewer',\r\n 'Arrow - Close'\r\n );\r\n }\r\n\r\n function logSaveEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'Favorite - FWIV Top', 'Favorite Heart Icon Clicks');\r\n }\r\n\r\n function logScheduleTourTopEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - Top - Sched Virtual Tour', 'CTA - Modal Open');\r\n }\r\n\r\n function logMoreInfoEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - More Info Panel Open', 'More Info Panel Opened');\r\n }\r\n\r\n function logUpThumbnailsEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV thumbs up-down', 'Up');\r\n }\r\n\r\n function logDownThumbnailsEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV thumbs up-down', 'Down');\r\n }\r\n\r\n function logSelectedThumbnailEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV thumbs click', 'FWIV thumb clicked');\r\n }\r\n\r\n function logBackwardFullImageEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV Gallery forward-back', 'Back');\r\n }\r\n\r\n function logForwardFullImageEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV Gallery forward-back', 'Forward');\r\n }\r\n\r\n function logCloseMoreInfoEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - More Info Panel Close', 'More Info Panel Closed');\r\n }\r\n\r\n function logScheduleTourEvent() {\r\n global.ga(\r\n googleAnalyticsId,\r\n eventLabel,\r\n eventsCategory,\r\n 'FWIV - MoreInfo - Sched Virtual Tour',\r\n 'CTA - Modal Open'\r\n );\r\n }\r\n\r\n function logContactBuilderEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - MoreInfo - Contact Builder', 'CTA - Modal Open');\r\n }\r\n\r\n function logAskQuestionEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - MoreInfo - Ask A Question', 'CTA - Modal Open');\r\n }\r\n\r\n function logCopyLinkEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - copy link', 'Copy link');\r\n }\r\n\r\n function logEmailEvent() {\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'FWIV - email link', 'Email');\r\n }\r\n\r\n function logSaveFromMoreInfoEvent() {\r\n global.ga(\r\n googleAnalyticsId,\r\n eventLabel,\r\n eventsCategory,\r\n 'Favorite - FWIV More Info Section',\r\n 'Favorite Heart Icon Clicks'\r\n );\r\n }\r\n\r\n function logCollectionEvent(event) {\r\n const label = event.target.textContent + ' tab clicks';\r\n global.ga(googleAnalyticsId, eventLabel, eventsCategory, 'Gallery Navigation', label);\r\n }\r\n\r\n function logOpenExternalLinkEvent(event) {\r\n const code = event.target.closest('[data-external-link]').getAttribute('data-item-id');\r\n global.ga(\r\n googleAnalyticsId,\r\n eventLabel,\r\n eventsCategory,\r\n 'FWIV - Open iframe in New Window',\r\n 'FWIV open media ' + code\r\n );\r\n }\r\n\r\n const eventsConfiguration = {\r\n closeFullImage: {\r\n callbacks: [logCloseFullImageEvent],\r\n events: [eventToAttach],\r\n elements: '[data-full-image-viewer-role=\"close\"]',\r\n },\r\n saveFullImage: {\r\n callbacks: [logSaveEvent],\r\n events: [eventToAttach],\r\n elements: '[data-component=\"full-image-viewer-favorites\"]',\r\n },\r\n scheduleFullImage: {\r\n callbacks: [logScheduleTourTopEvent],\r\n events: [eventToAttach],\r\n elements: '[data-component=\"full-image-viewer-schedule-tour-cta\"]',\r\n },\r\n moreInfoFullImage: {\r\n callbacks: [logMoreInfoEvent],\r\n events: [eventToAttach],\r\n elements: '[data-component=\"data-nav-call-to-action\"], [data-more-information-btn=\"true\"]',\r\n },\r\n upArrowFullImage: {\r\n callbacks: [logUpThumbnailsEvent],\r\n events: [eventToAttach],\r\n elements: '[data-full-image-viewer-role=\"up\"]',\r\n },\r\n downArrowFullImage: {\r\n callbacks: [logDownThumbnailsEvent],\r\n events: [eventToAttach],\r\n elements: '[data-full-image-viewer-role=\"down\"]',\r\n },\r\n selectedThumbFullImage: {\r\n callbacks: [logSelectedThumbnailEvent],\r\n events: [eventToAttach],\r\n elements: '[data-full-image-viewer-role=\"filmstrip\"]',\r\n },\r\n leftArrowFullImage: {\r\n callbacks: [logBackwardFullImageEvent],\r\n events: [eventToAttach],\r\n elements: '[data-full-image-viewer-role=\"left\"], [data-full-image-viewer-role=\"leftArrow\"]',\r\n },\r\n rightArrowFullImage: {\r\n callbacks: [logForwardFullImageEvent],\r\n events: [eventToAttach],\r\n elements: '[data-full-image-viewer-role=\"right\"], [data-full-image-viewer-role=\"rightArrow\"]',\r\n },\r\n closeMoreInfoFullImage: {\r\n callbacks: [logCloseMoreInfoEvent],\r\n events: [eventToAttach],\r\n elements: '[data-close-panel-action=\"true\"]',\r\n },\r\n scheduleTourAfterMoreInfoFullImage: {\r\n callbacks: [logScheduleTourEvent],\r\n events: [eventToAttach],\r\n elements: '[data-schedule-panel-actions]',\r\n },\r\n contactBuilderAfterMoreInfoFullImage: {\r\n callbacks: [logContactBuilderEvent],\r\n events: [eventToAttach],\r\n elements: '[data-contact-builder-panel-actions]',\r\n },\r\n askBuilderAfterMoreInfoFullImage: {\r\n callbacks: [logAskQuestionEvent],\r\n events: [eventToAttach],\r\n elements: '[data-ask-question-panel-actions]',\r\n },\r\n copyFullImage: {\r\n callbacks: [logCopyLinkEvent],\r\n events: [eventToAttach],\r\n elements: '[data-copy-link]',\r\n },\r\n emailFullImage: {\r\n callbacks: [logEmailEvent],\r\n events: [eventToAttach],\r\n elements: '[data-email]',\r\n },\r\n saveFromMoreInfoFullImage: {\r\n callbacks: [logSaveFromMoreInfoEvent],\r\n events: [eventToAttach],\r\n elements: '[data-panel-actions] [data-component=\"full-image-viewer-favorites\"], [data-favorites-button=\"true\"]',\r\n },\r\n collectionFullImage: {\r\n callbacks: [logCollectionEvent],\r\n events: [eventToAttach],\r\n elements: '[data-collection-item]',\r\n },\r\n externalLink: {\r\n callbacks: [logOpenExternalLinkEvent],\r\n events: [eventToAttach],\r\n elements: '[data-external-link]',\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.Analitycs to the previous script.\r\n */\r\n Analitycs.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.Analitycs = previousAnalitycs;\r\n return Analitycs;\r\n };\r\n\r\n if (global.ga) {\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n }\r\n global.NewHomeSource.FullImageViewer.Analitycs = Analitycs;\r\n}(window));\r\n","(function filmStripHover(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Event) {\r\n return;\r\n }\r\n\r\n const previousFilmStripHover = global.NewHomeSource.FilmStripHover;\r\n const containerElement = global.document.querySelector('[data-full-image-viewer-role=\"filmstrip\"]');\r\n const hoverableCollections = ['FloorPlan'];\r\n const hoverableCssClass = 'hoverable';\r\n\r\n /**\r\n * @private\r\n * render: renders the film strip.\r\n *\r\n * @param {object} data information that is needed to render the film strip.\r\n */\r\n function render(data) {\r\n if (hoverableCollections.indexOf(data.Name) >= 0) {\r\n containerElement.classList.add(hoverableCssClass);\r\n } else {\r\n containerElement.classList.remove(hoverableCssClass);\r\n }\r\n }\r\n /**\r\n * @constructs NewHomeSource.FilmStripHover\r\n */\r\n function FilmStripHover() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n FilmStripHover.update = function update(data) {\r\n requestAnimationFrame(render.bind(this, data));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FilmStripHover to the previous script.\r\n */\r\n FilmStripHover.noConflict = function noConflict() {\r\n global.NewHomeSource.FilmStripHover = previousFilmStripHover;\r\n return FilmStripHover;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onCollectionSet', FilmStripHover);\r\n global.NewHomeSource.FilmStripHover = FilmStripHover;\r\n}(window));\r\n","(function imageCounter(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState) {\r\n return;\r\n }\r\n\r\n const previousImageCounter = global.NewHomeSource.ImageCounter;\r\n const counterElement = global.document.querySelector('[data-full-image-viewer-role=\"image-counter\"]');\r\n let elementsInCollection = null;\r\n\r\n /**\r\n * @public\r\n * render: renders the image counter.\r\n *\r\n * @param {object} data information that is needed to render the image counter.\r\n */\r\n function render(data) {\r\n let imageIndex = data.Index;\r\n const isVisible = global.NewHomeSource.FullImageViewer.Config.isCaptionBarVisible(data);\r\n\r\n if (imageIndex > elementsInCollection) {\r\n imageIndex = elementsInCollection;\r\n }\r\n\r\n if (isVisible) {\r\n counterElement.innerHTML = imageIndex + '/' + elementsInCollection;\r\n } else {\r\n counterElement.innerHTML = '';\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.ImageCounter\r\n */\r\n function ImageCounter() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n ImageCounter.update = function update(data, topic) {\r\n if (topic === 'onCollectionSet') {\r\n elementsInCollection = data.TotalImages;\r\n }\r\n\r\n if (topic === 'onImageSet') {\r\n requestAnimationFrame(render.bind(this, data));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.ImageCounter to the previous script.\r\n */\r\n ImageCounter.noConflict = function noConflict() {\r\n global.NewHomeSource.ImageCounter = previousImageCounter;\r\n return ImageCounter;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onCollectionSet', ImageCounter);\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', ImageCounter);\r\n global.NewHomeSource.ImageCounter = ImageCounter;\r\n}(window));\r\n","(function pipe(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousPipe = global.NewHomeSource.Pipe;\r\n\r\n /**\r\n * @private\r\n *\r\n * composeFunctions: executes a set of functions in the given order whilst they return true.\r\n * @param {object} functions is the array of functions needed to execute.\r\n */\r\n function composeFunctions(functions) {\r\n return function composeFuncs() {\r\n const parameters = arguments;\r\n const length = functions.length;\r\n let result = true;\r\n let functionIndex = 0;\r\n\r\n while (result && functionIndex < length) {\r\n result = typeof functions[functionIndex] === 'function' && functions[functionIndex].apply(this, parameters);\r\n functionIndex += 1;\r\n }\r\n\r\n return result;\r\n };\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.Pipe\r\n */\r\n function Pipe() {\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * conditionalPipe: calls the private composeFunctions with the functions array needed to execute.\r\n */\r\n Pipe.conditionalPipe = function conditionalPipe() {\r\n return composeFunctions(arguments);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Pipe to the previous script.\r\n */\r\n Pipe.noConflict = function noConflict() {\r\n global.NewHomeSource.Pipe = previousPipe;\r\n return Pipe;\r\n };\r\n\r\n global.NewHomeSource.Pipe = Pipe;\r\n}(window));\r\n","(function imageViewer(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Pipe ||\r\n !global.NewHomeSource.Modules.ImageHandler) {\r\n return;\r\n }\r\n\r\n const previousImageViewer = global.NewHomeSource.ImageViewer;\r\n const mediaBreakpoints = [768, 1024, 1440];\r\n const pictureElement = global.document.querySelector('[data-full-image-viewer-role=\"viewer\"]');\r\n const addJpgParameter = global.NewHomeSource.Modules.ImageHandler.addJpgParameter;\r\n\r\n /**\r\n * @private\r\n * createSource: create a source that can be added to a picture element.\r\n *\r\n * @param {string} url the image url to be used as scrset.\r\n */\r\n function createSource(pixels) {\r\n const source = global.document.createElement('SOURCE');\r\n const oneX = '?maxWidth=' + pixels + ' 1x';\r\n const twoX = '?maxWidth=' + (pixels * 2) + ' 2x';\r\n\r\n source.media = '(max-width:' + pixels + 'px)';\r\n source.type = 'image/jpg';\r\n source.srcset = this + oneX + ', ' + this + twoX;\r\n\r\n pictureElement.appendChild(source);\r\n }\r\n\r\n /**\r\n * @private\r\n * render: renders the information of the image inside ImageViewer picture element.\r\n *\r\n * @param {*} image with the information needed to fill the Image Viewer picture element.\r\n */\r\n function render(image) {\r\n const maxResolution = addJpgParameter(image.Source, 'maxWidth=1920');\r\n const maxResolutionx2 = addJpgParameter(image.Source, 'maxWidth=3940');\r\n const source = global.document.createElement('SOURCE');\r\n const img = global.document.createElement('IMG');\r\n pictureElement.innerHTML = '';\r\n source.media = '(min-width:' + 1441 + 'px)';\r\n source.type = 'image/jpg';\r\n source.srcset = maxResolution + ' 1x, ' + maxResolutionx2 + ' 2x';\r\n img.src = maxResolution;\r\n img.alt = image.Alt;\r\n\r\n mediaBreakpoints.forEach(createSource.bind(image.Source));\r\n pictureElement.appendChild(source);\r\n pictureElement.appendChild(img);\r\n pictureElement.style.display = 'block';\r\n }\r\n\r\n /**\r\n * @private\r\n * hidePicture: this method hides the picture element from the full image viewer\r\n * if the current element to display is not an image.\r\n *\r\n * @param {boolean} isPicture true if the current element is a picture, false otherwise.\r\n */\r\n function hidePicture(isPicture) {\r\n if (isPicture) {\r\n return;\r\n }\r\n\r\n pictureElement.style.display = 'none';\r\n }\r\n\r\n /**\r\n * @private\r\n * displayPicture: this method shows the picture element from the full image viewer\r\n * if the current element to display is an image.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n function displayPicture(data) {\r\n requestAnimationFrame(render.bind(this, data));\r\n }\r\n\r\n /**\r\n * @private\r\n * shouldBeIgnored: hides the Picture element if the current element data is not of picture type.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n function shouldBeIgnored(data) {\r\n const isZoomable = global.NewHomeSource.FullImageViewer.Zoom &&\r\n global.NewHomeSource.FullImageViewer.Config.isZoomableCollection(data);\r\n const isPicture = !data.IsFrame &&\r\n !isZoomable &&\r\n !data.VideoType &&\r\n !data.IsOtherMedia &&\r\n data.Collection.toLowerCase() !== 'other';\r\n\r\n hidePicture(isPicture);\r\n return isPicture;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.ImageViewer\r\n */\r\n function ImageViewer() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n ImageViewer.update = function update(data) {\r\n global.NewHomeSource.Pipe.conditionalPipe(shouldBeIgnored, displayPicture)(data);\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 ImageViewer.noConflict = function noConflict() {\r\n global.NewHomeSource.ImageViewer = previousImageViewer;\r\n return ImageViewer;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', ImageViewer);\r\n global.NewHomeSource.ImageViewer = ImageViewer;\r\n}(window));\r\n","(function imageZoom(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.Modules = global.NewHomeSource.Modules || {};\r\n\r\n if (!global.NewHomeSource.Modules.ImageHandler) {\r\n return;\r\n }\r\n\r\n const previousImageZoom = global.NewHomeSource.Modules.ImageZoom;\r\n\r\n const scaleFactor = 0.5;\r\n const maxZoomLevel = 4;\r\n const zoomOutClass = 'player__zoomout-canvas';\r\n let onTouchEndEvent = null;\r\n let onTouchMoveEvent = null;\r\n let onTouchStartEvent = null;\r\n let onMouseWheelEvent = null;\r\n let onMouseLeaveEvent = null;\r\n\r\n /**\r\n * @private\r\n * clear: clears the touchNow and touchStart properties.\r\n */\r\n function clear() {\r\n if (this.config.touchNow) {\r\n this.config.touchNow.x = null;\r\n this.config.touchNow.y = null;\r\n }\r\n\r\n this.config.touchStart.x = null;\r\n this.config.touchStart.y = null;\r\n this.startObject = null;\r\n }\r\n\r\n function constrain() {\r\n const imageHeight = this.picture.height * this.ratio * this.config.zoomLevel;\r\n const imageWidth = this.picture.width * this.ratio * this.config.zoomLevel;\r\n const canvasHeight = this.canvas.height - imageHeight;\r\n const canvasWidth = this.canvas.width - imageWidth;\r\n\r\n this.bounds.left = canvasWidth > 0 ? 0 : canvasWidth;\r\n this.bounds.right = canvasWidth < 0 ? 0 : canvasWidth;\r\n this.bounds.top = canvasHeight > 0 ? 0 : canvasHeight;\r\n this.bounds.bottom = canvasHeight < 0 ? 0 : canvasHeight;\r\n\r\n if (this.dx < this.bounds.left) {\r\n this.dx = this.bounds.left;\r\n }\r\n\r\n if (this.dx > this.bounds.right) {\r\n this.dx = this.bounds.right;\r\n }\r\n\r\n if (this.dy < this.bounds.top) {\r\n this.dy = this.bounds.top;\r\n }\r\n\r\n if (this.dy > this.bounds.bottom) {\r\n this.dy = this.bounds.bottom;\r\n }\r\n\r\n if (this.config.zoomLevel === 1) {\r\n this.dx = (this.config.canvasWidth - this.picture.width * this.ratio * this.config.zoomLevel) / 2;\r\n this.dy = (this.config.canvasHeight - this.picture.height * this.ratio * this.config.zoomLevel) / 2;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * isScrolling: returns true if a touchStart event has been triggered, otherwise false.\r\n */\r\n function isScrolling() {\r\n if (!this.startObject) {\r\n return false;\r\n }\r\n\r\n return this.startObject.x || this.startObject.x === 0 || this.startObject.y || this.startObject.y === 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * movement: returns the clientX and clientY coordinates of the mouse or touch event.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function movement(event) {\r\n if (event.changedTouches) {\r\n return {\r\n x: event.changedTouches[0].clientX,\r\n y: event.changedTouches[0].clientY,\r\n };\r\n }\r\n\r\n return {\r\n x: event.clientX,\r\n y: event.clientY,\r\n };\r\n }\r\n\r\n /**\r\n * @private\r\n * onTouchEnd: handler of mouse up and touch end events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchEnd(event) {\r\n event.preventDefault();\r\n\r\n if (!this.startObject || !this.startObject.x || !this.startObject.y) {\r\n return;\r\n }\r\n\r\n const move = movement(event);\r\n const totalMovementInX = Math.abs(move.x - this.startObject.x);\r\n const totalMovementInY = Math.abs(move.y - this.startObject.y);\r\n const timeElapsed = new Date() - this.startObject.time;\r\n const isClick = !(totalMovementInX > 10 || totalMovementInY > 10 || timeElapsed > 1000);\r\n\r\n if (isClick) {\r\n this.zoom(!event.shiftKey, event.offsetX, event.offsetY);\r\n }\r\n\r\n clear.call(this);\r\n }\r\n\r\n /**\r\n * @private\r\n * onTouchMove: handler of mouse and touch move events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchMove(event) {\r\n event.preventDefault();\r\n\r\n if (!this.isScrolling() || this.config.zoomLevel === 1) {\r\n return;\r\n }\r\n\r\n const moveX = this.config.touchNow.x - this.config.touchStart.x;\r\n const moveY = this.config.touchNow.y - this.config.touchStart.y;\r\n\r\n this.pan(moveX, moveY);\r\n this.config.touchStart = this.config.touchNow;\r\n this.config.touchNow = movement(event);\r\n }\r\n\r\n /**\r\n * @private\r\n * onTouchStart: handler of mouse down and touch start events.\r\n *\r\n * @param {event} event with the information of the mouse or touch event.\r\n */\r\n function onTouchStart(event) {\r\n event.preventDefault();\r\n\r\n const move = movement(event);\r\n\r\n this.config.touchStart = move;\r\n this.config.touchNow = move;\r\n this.startObject = {\r\n x: move.x,\r\n y: move.y,\r\n time: new Date(),\r\n };\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @private\r\n * onWheel: handler of the mouse wheel event.\r\n *\r\n * @param {event} event with the scroll wheel information/\r\n */\r\n function onWheel(event) {\r\n const direction = event.deltaY * -1;\r\n const eventDetail = event.detail ? -event.detail : 0;\r\n const delta = event.wheelDelta ? event.wheelDelta / 40 : eventDetail;\r\n const move = movement(event);\r\n let isZoomIn = false;\r\n\r\n if (!delta) {\r\n return;\r\n }\r\n\r\n if (Math.abs(direction) < 1) {\r\n return;\r\n }\r\n\r\n if (direction > 0) {\r\n isZoomIn = true;\r\n }\r\n\r\n this.zoom(isZoomIn, move.x, move.y);\r\n }\r\n\r\n /**\r\n * @private\r\n * redraw: draws the picture from scratch in the canvas element.\r\n */\r\n function redraw() {\r\n const dHeight = this.picture.height * this.ratio * this.config.zoomLevel;\r\n const dWidth = this.picture.width * this.ratio * this.config.zoomLevel;\r\n\r\n constrain.call(this);\r\n this.drawingContext.save();\r\n this.drawingContext.clearRect(0, 0, this.config.canvasWidth, this.config.canvasHeight);\r\n this.drawingContext.restore();\r\n this.drawingContext.drawImage(\r\n this.picture,\r\n 0,\r\n 0,\r\n this.picture.width,\r\n this.picture.height,\r\n this.dx,\r\n this.dy,\r\n dWidth,\r\n dHeight\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * onImageLoaded do the maths that needs to know the image dimensions, and attach the events.\r\n */\r\n function onImageLoaded() {\r\n this.canvas.removeEventListener('mousedown', onTouchStartEvent, false);\r\n this.canvas.removeEventListener('mouseleave', onMouseLeaveEvent, false);\r\n this.canvas.removeEventListener('mousemove', onTouchMoveEvent, false);\r\n this.canvas.removeEventListener('mouseup', onTouchEndEvent, false);\r\n this.canvas.removeEventListener('wheel', onMouseWheelEvent, false);\r\n this.canvas.removeEventListener('touchstart', onTouchStartEvent, false);\r\n this.canvas.removeEventListener('touchmove', onTouchMoveEvent, false);\r\n this.canvas.removeEventListener('touchend', onTouchEndEvent, false);\r\n\r\n onTouchStartEvent = onTouchStart.bind(this);\r\n onMouseLeaveEvent = clear.bind(this);\r\n onTouchMoveEvent = onTouchMove.bind(this);\r\n onTouchEndEvent = onTouchEnd.bind(this);\r\n onMouseWheelEvent = onWheel.bind(this);\r\n\r\n this.canvas.addEventListener('mousedown', onTouchStartEvent, false);\r\n this.canvas.addEventListener('mouseleave', onMouseLeaveEvent, false);\r\n this.canvas.addEventListener('mousemove', onTouchMoveEvent, false);\r\n this.canvas.addEventListener('mouseup', onTouchEndEvent, false);\r\n this.canvas.addEventListener('wheel', onMouseWheelEvent, false);\r\n\r\n this.canvas.addEventListener('touchstart', onTouchStartEvent, false);\r\n this.canvas.addEventListener('touchmove', onTouchMoveEvent, false);\r\n this.canvas.addEventListener('touchend', onTouchEndEvent, false);\r\n\r\n this.ratio = Math.min(this.config.canvasWidth / this.picture.width, this.config.canvasHeight / this.picture.height);\r\n this.config.touchStart = {};\r\n requestAnimationFrame(redraw.bind(this));\r\n }\r\n\r\n /**\r\n * @constructs ImageZoom\r\n *\r\n * @param {HTMLCanvasElement} canvas element where the picture is going to be displayed.\r\n * @param {string} picture URL of the picture to be added to the canvas element.\r\n */\r\n function ImageZoom(canvas, picture) {\r\n const image = new Image();\r\n\r\n this.picture = image;\r\n this.canvas = canvas;\r\n this.canvas.imageSmoothingEnabled = true;\r\n this.bounds = {};\r\n this.bounds.top = NaN;\r\n this.bounds.left = NaN;\r\n this.bounds.right = NaN;\r\n this.bounds.bottom = NaN;\r\n this.config = {};\r\n this.config.canvasWidth = canvas.width;\r\n this.config.canvasHeight = canvas.height;\r\n this.config.zoomLevel = 1;\r\n this.drawingContext = canvas.getContext('2d');\r\n\r\n image.onload = onImageLoaded.bind(this);\r\n image.src = global.NewHomeSource.Modules.ImageHandler.addJpgParameter(picture);\r\n }\r\n\r\n /**\r\n * @public\r\n * isScrolling: returns true if a touchStart event has been triggered, otherwise false.\r\n */\r\n ImageZoom.prototype.isScrolling = isScrolling;\r\n\r\n /**\r\n * @public\r\n * pan: moves the image to the given position.\r\n *\r\n * @param {number} x coordinate in the X axis to move the image.\r\n * @param {number} y coordinate in the Y axis to move the image.\r\n */\r\n ImageZoom.prototype.pan = function pan(x, y) {\r\n this.dx += x;\r\n this.dy += y;\r\n requestAnimationFrame(redraw.bind(this));\r\n };\r\n\r\n /**\r\n * @public\r\n * redraw: draws the picture from scratch in the canvas element.\r\n */\r\n ImageZoom.prototype.redraw = redraw;\r\n\r\n /**\r\n * @public\r\n * resize: sets a new width and height to the canvas element.\r\n *\r\n * @param {number} width new value for the X axis.\r\n * @param {number} height new value for the Y axis.\r\n */\r\n ImageZoom.prototype.resize = function resize(width, height) {\r\n this.canvas.width = width * 1;\r\n this.canvas.height = height * 1;\r\n this.config.canvasHeight = this.canvas.height;\r\n this.config.canvasWidth = this.canvas.width;\r\n this.dx = (this.config.canvasWidth - this.picture.width * this.ratio * this.config.zoomLevel) / 2;\r\n this.dy = (this.config.canvasHeight - this.picture.height * this.ratio * this.config.zoomLevel) / 2;\r\n this.ratio = Math.min(this.config.canvasWidth / this.picture.width, this.config.canvasHeight / this.picture.height);\r\n requestAnimationFrame(redraw.bind(this));\r\n };\r\n\r\n /**\r\n * @public\r\n * zoom: increases or decreases the size of the image.\r\n *\r\n * @param {boolean} isZoomIn true if the intention is to increase the size of the image, otherwise false.\r\n * @param {number} x translation in the X axis after the zoom.\r\n * @param {number} y translation in the X axis after the zoom.\r\n */\r\n ImageZoom.prototype.zoom = function zoom(isZoomIn, x, y) {\r\n let direction;\r\n\r\n if (isZoomIn) {\r\n direction = 1;\r\n } else {\r\n direction = -1;\r\n }\r\n\r\n this.config.zoomLevel += direction * scaleFactor;\r\n\r\n if (this.config.zoomLevel > maxZoomLevel) {\r\n this.config.zoomLevel = maxZoomLevel;\r\n this.canvas.classList.add(zoomOutClass);\r\n } else {\r\n this.canvas.classList.remove(zoomOutClass);\r\n }\r\n\r\n if (this.config.zoomLevel < 1) {\r\n this.config.zoomLevel = 1;\r\n return;\r\n }\r\n\r\n const adjustedClickX = x * this.config.zoomLevel;\r\n const adjustedClickY = y * this.config.zoomLevel;\r\n const realCanvasWidth = this.canvas.width * this.config.zoomLevel;\r\n const realCanvasHeight = this.canvas.height * this.config.zoomLevel;\r\n const differenceX = this.canvas.width - realCanvasWidth;\r\n const differenceY = this.canvas.height - realCanvasHeight;\r\n const positionX = realCanvasWidth / adjustedClickX;\r\n const positionY = realCanvasHeight / adjustedClickY;\r\n let dx = differenceX / positionX;\r\n let dy = differenceY / positionY;\r\n\r\n if (this.dx > 0) {\r\n dx = this.dx / this.config.zoomLevel;\r\n }\r\n\r\n if (this.dy > 0) {\r\n dy = this.dy / this.config.zoomLevel;\r\n }\r\n\r\n if (!x || !y) {\r\n dx = (this.config.canvasWidth - this.picture.width * this.ratio * this.config.zoomLevel) / 2;\r\n dy = (this.config.canvasHeight - this.picture.height * this.ratio * this.config.zoomLevel) / 2;\r\n }\r\n\r\n this.dx = dx;\r\n this.dy = dy;\r\n requestAnimationFrame(redraw.bind(this));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.ImageZoom to the previous script.\r\n */\r\n ImageZoom.noConflict = function noConflict() {\r\n global.NewHomeSource.Modules.ImageZoom = previousImageZoom;\r\n return ImageZoom;\r\n };\r\n\r\n global.NewHomeSource.Modules.ImageZoom = ImageZoom;\r\n}(window));\r\n","(function externalLink(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Pipe) {\r\n return;\r\n }\r\n\r\n const previousExternalLink = global.NewHomeSource.FullImageViewer.ExternalLink;\r\n const queryExternalLink = '[data-external-link]';\r\n const containerExternalLink = global.document.querySelector(queryExternalLink);\r\n const anchorLink = containerExternalLink.querySelector('a');\r\n const alertExternalLink = containerExternalLink.querySelector('[data-alert-link]');\r\n const hidden = 'hidden';\r\n\r\n /**\r\n * @private\r\n * hideLink: hidde the external link element from the DOM.\r\n */\r\n function hideLink() {\r\n containerExternalLink.setAttribute(hidden, true);\r\n }\r\n\r\n /**\r\n * @private\r\n * shouldBeIgnored: hides the external link element if the current element is not frame.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n function shouldBeIgnored(data) {\r\n const isFrame = data.IsFrame;\r\n if (!isFrame) {\r\n hideLink();\r\n }\r\n return isFrame;\r\n }\r\n\r\n /**\r\n * @private\r\n * displayLink: show the link element to the DOM.\r\n *\r\n */\r\n function displayLink() {\r\n containerExternalLink.removeAttribute(hidden);\r\n containerExternalLink.setAttribute('data-item-id', this.Type);\r\n anchorLink.setAttribute('href', this.Source);\r\n }\r\n\r\n /**\r\n * @private\r\n * render: display the external link element.\r\n *\r\n */\r\n function render(data) {\r\n requestAnimationFrame(displayLink.bind(data));\r\n }\r\n\r\n /**\r\n* @public\r\n* toggleCopyAlert: copy current url to clipboard and show or hidde alert.\r\n*\r\n* @param {MouseEvent} event with the information related to click pressed.\r\n*/\r\n function toggleAlertLink(event) {\r\n if (event && event.type !== 'mouseleave') {\r\n alertExternalLink.removeAttribute(hidden);\r\n } else {\r\n alertExternalLink.setAttribute(hidden, '');\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.ExternalLink\r\n */\r\n function ExternalLink() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n ExternalLink.update = function update(data, topic) {\r\n global.NewHomeSource.Pipe.conditionalPipe(shouldBeIgnored, render)(data, topic);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.ExternalLink to the previous script.\r\n */\r\n ExternalLink.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.ExternalLink = previousExternalLink;\r\n return ExternalLink;\r\n };\r\n\r\n const eventsConfiguration = {\r\n externalLink: {\r\n callbacks: [toggleAlertLink],\r\n events: ['mouseenter', 'mouseleave'],\r\n elements: queryExternalLink,\r\n },\r\n };\r\n\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', ExternalLink);\r\n global.NewHomeSource.FullImageViewer.ExternalLink = ExternalLink;\r\n}(window));\r\n","(function iframeContentHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Pipe) {\r\n return;\r\n }\r\n\r\n const previousIframeContentHandler = global.NewHomeSource.IframeContentHandler;\r\n const iframeContainer = global.document.createElement('DIV');\r\n const iframeElement = global.document.createElement('IFRAME');\r\n let imagesContainer = global.document.createElement(global\r\n .NewHomeSource.FullImageViewer.Config.imagesContainer);\r\n\r\n if (!imagesContainer) {\r\n return;\r\n }\r\n\r\n /**\r\n * @private\r\n * replaceSpecialCharactersFromEmbedCode: replaces ASCII codes of a string, in concrete: <, >, '.\r\n * @param {string} embedCode is the string where we want to replace special characters from.\r\n */\r\n function replaceSpecialCharactersFromEmbedCode(embedCode) {\r\n if (!embedCode) {\r\n return '';\r\n }\r\n\r\n const replaceableStrings = {\r\n '&': '',\r\n 'lt;': '<',\r\n 'gt;': '>',\r\n '#39;': '\\'',\r\n 'quot;': '\\'',\r\n };\r\n\r\n const getReplaceableValue = function getReplaceableValue(char) {\r\n return replaceableStrings[char] || '';\r\n };\r\n\r\n return embedCode.replace(/&|lt;|gt;|#39;|quot;/g, getReplaceableValue);\r\n }\r\n\r\n /**\r\n * @private\r\n * getEmbededCodeSource: return the embed code src.\r\n * @param {string} embedCode is the embedCode we need to return as an element.\r\n */\r\n function getEmbededCodeSource(embedCode) {\r\n if (!embedCode) {\r\n return undefined;\r\n }\r\n\r\n const embedCodeWithoutAsciiCharacters = replaceSpecialCharactersFromEmbedCode(embedCode);\r\n return embedCodeWithoutAsciiCharacters.replace(/.*src='(.*?)'.*/g, '$1');\r\n }\r\n\r\n /**\r\n * @private\r\n * resizeFrameDimensions: sets the new width and height.\r\n *\r\n * @param {object} data with the information regarding the new boundaries.\r\n */\r\n function resizeFrameDimensions(data) {\r\n iframeElement.setAttribute('width', data.width);\r\n iframeElement.setAttribute('height', data.height);\r\n }\r\n\r\n /**\r\n * @private\r\n * handleResize: checks if the topic message indicates a resize action is needed.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n function handleResize(data, topic) {\r\n if (topic !== 'onResize') {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(resizeFrameDimensions.bind(null, data));\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.IframeContentHandler\r\n */\r\n function IframeContentHandler() {\r\n }\r\n\r\n /**\r\n * @private\r\n * updateSandboxAttribute: sets or removes the sandbox iframe attribute. This attribute is needed for resources\r\n * like matterports, but non needed for other kind of resources like pdf, that is why we set or remove this\r\n * based on the media type.\r\n *\r\n * @param {object} element iframe where the rich media type is going to be shown.\r\n * @param {object} data contains the information related to the current rich media resource.\r\n */\r\n function updateSandboxAttribute(element, data) {\r\n if (global.NewHomeSource.FullImageViewer.Config.isDisplayInSandBoxCollection(data)) {\r\n if (global.NewHomeSource.FullImageViewer.Config.isMediShownInCarousel) {\r\n element.setAttribute('sandbox', 'allow-same-origin allow-scripts allow-forms allow-popups');\r\n return;\r\n }\r\n\r\n element.setAttribute('sandbox', 'allow-same-origin allow-scripts allow-top-navigation allow-forms');\r\n } else {\r\n element.removeAttribute('sandbox');\r\n }\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n IframeContentHandler.update = function update(data, topic) {\r\n if (topic === 'onResize') {\r\n handleResize(data, topic);\r\n return;\r\n }\r\n\r\n imagesContainer = global.document.querySelector(global.NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n\r\n if (!data.IsFrame || !imagesContainer) {\r\n if (iframeContainer) {\r\n iframeContainer.innerHTML = '';\r\n }\r\n\r\n imagesContainer.classList.add('player-box');\r\n\r\n return;\r\n }\r\n\r\n const alreadyExistingIframe = imagesContainer.querySelector('iframe');\r\n if (alreadyExistingIframe) {\r\n alreadyExistingIframe.parentElement.remove();\r\n }\r\n\r\n let iFrameSource = getEmbededCodeSource(data.EmbedCode);\r\n if (!iFrameSource) {\r\n iFrameSource = data.Source;\r\n }\r\n\r\n updateSandboxAttribute(iframeElement, data);\r\n iframeElement.src = iFrameSource;\r\n iframeElement.alt = data.Alt;\r\n iframeElement.onload = () => {\r\n imagesContainer.classList.remove('player-box');\r\n };\r\n\r\n if (global.NewHomeSource.FullImageViewer.Config.isMediShownInCarousel) {\r\n iframeElement.style.height = 'inherit';\r\n }\r\n\r\n iframeContainer.prepend(iframeElement);\r\n imagesContainer.prepend(iframeContainer);\r\n iframeContainer.classList.add('player-box__iframe-box');\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.IframeContentHandler to the previous script.\r\n */\r\n IframeContentHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.IframeContentHandler = previousIframeContentHandler;\r\n return IframeContentHandler;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', IframeContentHandler);\r\n global.NewHomeSource.FullImageViewerState.add('onResize', IframeContentHandler);\r\n global.NewHomeSource.IframeContentHandler = IframeContentHandler;\r\n}(window));\r\n","(function copyLink(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewer.UrlHandler ||\r\n !global.NewHomeSource.FullImageViewerOpener) {\r\n return;\r\n }\r\n\r\n const previousCopyLink = global.NewHomeSource.FullImageViewer.CopyLink;\r\n const queryCopyLink = '[data-copy-link]';\r\n const alertCopyLink = global.document.querySelector(queryCopyLink + ' [data-alert-copied]');\r\n const hidden = 'hidden';\r\n const urlToCopyInput = global.document.querySelector('input[name=\"linkToCopy\"]');\r\n const urlToCopy = urlToCopyInput.value;\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.CopyLink\r\n */\r\n function CopyLink() {\r\n }\r\n\r\n /**\r\n* @public\r\n* toggleCopyAlert: copy current url to clipboard and show or hidde alert.\r\n*\r\n* @param {MouseEvent} event with the information related to click pressed.\r\n*/\r\n CopyLink.toggleCopyAlert = function toggleAlertCopied(event) {\r\n if (event && event.type !== 'mouseleave') {\r\n alertCopyLink.removeAttribute(hidden);\r\n navigator.clipboard.writeText(urlToCopy);\r\n } else {\r\n alertCopyLink.setAttribute(hidden, '');\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.CopyLink to the previous script.\r\n */\r\n CopyLink.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.CopyLink = previousCopyLink;\r\n return CopyLink;\r\n };\r\n\r\n const eventsConfiguration = {\r\n copyLinkButton: {\r\n callbacks: [CopyLink.toggleCopyAlert],\r\n events: ['click', 'mouseleave'],\r\n elements: queryCopyLink,\r\n },\r\n };\r\n\r\n if (!navigator.clipboard) {\r\n global.document.querySelector(queryCopyLink).setAttribute(hidden, 'true');\r\n }\r\n\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n global.NewHomeSource.FullImageViewer.CopyLink = CopyLink;\r\n}(window));\r\n","(function moreInfoPanel(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewer.CopyLink ||\r\n !global.NewHomeSource.FullImageViewer.UrlHandler ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const previousMoreInfoPanel = global.NewHomeSource.FullImageViewer.MoreInfoPanel;\r\n const queryPanelForm = '[data-panel-form]';\r\n const queryCancelButton = '[data-close-panel-action]';\r\n const queryMoreInfoButton = '[data-more-information-btn]';\r\n const queryScheduleTour = '[data-schedule-panel-actions]';\r\n const queryContactBuilder = '[data-contact-builder-panel-actions]';\r\n const queryAskQuestion = '[data-ask-question-panel-actions]';\r\n const queryContactAgent = '[data-contact-agent-panel-actions]';\r\n const queryEmail = '[data-email]';\r\n const queryRevealPhoneText = '[data-phone-reveal-text]';\r\n const queryMoreInfo = '[data-more-info]';\r\n const queryScheduleTourCallToAction = '[data-component=\"full-image-viewer-schedule-tour-cta\"]';\r\n const queryFreeBrochureCallToAction = '[data-component=\"full-image-viewer-free-brochure-cta\"]';\r\n const panelForm = global.document.querySelector(queryPanelForm);\r\n const moreInfoButton = global.document.querySelector(queryMoreInfoButton);\r\n const elementsActions = global.document.querySelectorAll(queryMoreInfo);\r\n const panelActionContainer = global.document.querySelector('[data-panel-actions]');\r\n const revealPhoneTextOnPage = global.document.querySelector('p' + queryRevealPhoneText);\r\n const hiddePhoneText = revealPhoneTextOnPage && revealPhoneTextOnPage.hidden;\r\n const revealPhoneTextFullImageViewer = global.document.querySelector(queryMoreInfo + queryRevealPhoneText);\r\n const revealPhoneNumberFullImageViewer = global.document.querySelector(queryMoreInfo + '[data-phone-reveal-number]');\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const backButton = document.querySelector('[data-component=\"close-form\"]');\r\n const hidden = 'hidden';\r\n const trackingQueryString = encodeURIComponent('utm_source=Social&medium=Email&utm_campaign=EmailFromFWIV');\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.MoreInfoPanel\r\n */\r\n function MoreInfoPanel() {\r\n }\r\n\r\n /**\r\n * @private\r\n * openPanelActions: open panel actions when user click more information button or close button.\r\n *\r\n */\r\n function openPanelActions() {\r\n backButton.dataset.ga4EventClick_target = 'CTA back clicked';\r\n global.NewHomeSource.FullImageViewer.CopyLink.toggleCopyAlert();\r\n if (moreInfoButton) {\r\n moreInfoButton.setAttribute(hidden, '');\r\n }\r\n\r\n const isPhoneNumberVisible = revealPhoneNumberFullImageViewer &&\r\n revealPhoneNumberFullImageViewer.style.display === 'block';\r\n\r\n for (let index = 0; index < elementsActions.length; index += 1) {\r\n elementsActions[index].removeAttribute(hidden);\r\n }\r\n\r\n if (hiddePhoneText || isPhoneNumberVisible) {\r\n revealPhoneTextFullImageViewer.setAttribute(hidden, '');\r\n revealPhoneNumberFullImageViewer.classList.remove('form__number');\r\n }\r\n requestAnimationFrame(global.NewHomeSource.GalleryTab.showArrows);\r\n }\r\n\r\n /**\r\n * @private\r\n * closePanelActions: close panel actions when user click more information button or close button.\r\n *\r\n */\r\n function closePanelActions() {\r\n if (moreInfoButton) {\r\n moreInfoButton.removeAttribute(hidden);\r\n }\r\n\r\n for (let index = 0; index < elementsActions.length; index += 1) {\r\n elementsActions[index].setAttribute(hidden, '');\r\n }\r\n requestAnimationFrame(global.NewHomeSource.GalleryTab.showArrows);\r\n }\r\n\r\n MoreInfoPanel.closePanelActions = closePanelActions;\r\n\r\n /**\r\n * @private\r\n * openScheduleForm: open schedule form on panel actions.\r\n *\r\n */\r\n function openScheduleForm() {\r\n panelActionContainer.setAttribute(hidden, '');\r\n global.NewHomeSource.FullImageViewer.ScheduleTour.setUpScheduleTour();\r\n }\r\n\r\n /**\r\n * @private\r\n * openFreeBrochureForm: open freeBrochure form on panel actions.\r\n *\r\n */\r\n function openFreeBrochureForm(event) {\r\n const modalUrl = event && event.target\r\n ? event.target.dataset.modalUrl\r\n : '';\r\n const doesFreeBrochureAlreadyLoaded = !!panelForm.querySelector('[data-form-container]');\r\n\r\n if (doesFreeBrochureAlreadyLoaded || !modalUrl) {\r\n return;\r\n }\r\n\r\n panelActionContainer.setAttribute(hidden, '');\r\n global.NewHomeSource.FullImageViewer.FreeBrochureHandler.Init(panelForm, modalUrl);\r\n\r\n openPanelActions();\r\n panelForm.removeAttribute('hidden');\r\n }\r\n\r\n /**\r\n * @private\r\n * openContactBuilderForm: open contact builder form on panel actions.\r\n *\r\n */\r\n function openContactBuilderForm(event) {\r\n panelActionContainer.setAttribute(hidden, '');\r\n global.NewHomeSource.FullImageViewer.ScheduleTour.setUpContactBuilder(event);\r\n }\r\n\r\n /**\r\n* @private\r\n* onClickEmail: open malito.\r\n*\r\n*/\r\n function onClickEmail() {\r\n document.location.href = 'mailto:?body=' + global.NewHomeSource\r\n .FullImageViewer.UrlHandler.insertQueryString(window.location.href, trackingQueryString);\r\n }\r\n\r\n /**\r\n* @private\r\n* openAskQuestionForm: open ask question form on panel actions.\r\n*\r\n*/\r\n function openAskQuestionForm(event) {\r\n openContactBuilderForm(event);\r\n }\r\n\r\n /**\r\n* @private\r\n* openBasicForm: open any basic form on panel actions, the form type\r\n* is added on the current event element like a data parameter.\r\n*/\r\n function openBasicForm(event) {\r\n const querySelectorTeplate = event.currentTarget ? event.currentTarget.getAttribute('data-query-template') : '';\r\n\r\n if (querySelectorTeplate) {\r\n panelActionContainer.setAttribute(hidden, '');\r\n global.NewHomeSource.FullImageViewer.FullImageViewerBasicFormsHandlerLoader\r\n .loadBasicForm(panelForm, querySelectorTeplate);\r\n }\r\n\r\n if (!window.Mailcheck && typeof global.NHS.loadJs === 'function') {\r\n global.NHS.loadJs(document.getElementById('CtaDependencies').value);\r\n } else if (window.NewHomeSource && window.NewHomeSource.EmailDomainValidator) {\r\n window.NewHomeSource.EmailDomainValidator();\r\n }\r\n }\r\n\r\n function logViewPhoneNumber() {\r\n const leadEvents = global.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n this.dataset.ga4EventPosition = leadEvents.Position || this.dataset.ga4EventPosition;\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * openContactBuilderFromCallToAction: Exposes the open the schedule tour panel.\r\n */\r\n MoreInfoPanel.openScheduleTourFromCallToAction = function openScheduleTourFromCallToAction() {\r\n openPanelActions();\r\n openScheduleForm();\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * openContactBuilderFromCallToAction: Exposes the open the contact builder panel.\r\n */\r\n MoreInfoPanel.openContactBuilderFromCallToAction = function openContactBuilderFromCallToAction() {\r\n openPanelActions();\r\n openContactBuilderForm();\r\n backButton.dataset.ga4EventClick_target = 'Banner CTA back clicked';\r\n };\r\n\r\n const eventsConfiguration = {\r\n moreInfoButton: {\r\n callbacks: [openPanelActions],\r\n events: [eventToAttach],\r\n elements: queryMoreInfoButton,\r\n },\r\n closePanelAction: {\r\n callbacks: [closePanelActions],\r\n events: [eventToAttach],\r\n elements: queryCancelButton,\r\n },\r\n scheduleTourButton: {\r\n callbacks: [openScheduleForm],\r\n events: [eventToAttach],\r\n elements: queryScheduleTour,\r\n },\r\n contactBuilderButton: {\r\n callbacks: [openContactBuilderForm],\r\n events: [eventToAttach],\r\n elements: queryContactBuilder,\r\n },\r\n askQuestionButton: {\r\n callbacks: [openAskQuestionForm],\r\n events: [eventToAttach],\r\n elements: queryAskQuestion,\r\n },\r\n contactAgentButton: {\r\n callbacks: [openBasicForm],\r\n events: [eventToAttach],\r\n elements: queryContactAgent,\r\n },\r\n emailButton: {\r\n callbacks: [onClickEmail],\r\n events: [eventToAttach],\r\n elements: queryEmail,\r\n },\r\n openScheduleTourFromCta: {\r\n callbacks: [MoreInfoPanel.openScheduleTourFromCallToAction],\r\n events: [eventToAttach],\r\n elements: queryScheduleTourCallToAction,\r\n },\r\n openFreeBrochureFromCta: {\r\n callbacks: [openFreeBrochureForm],\r\n events: [eventToAttach],\r\n elements: queryFreeBrochureCallToAction,\r\n },\r\n revealPhoneEvent: {\r\n callbacks: [logViewPhoneNumber],\r\n events: [eventToAttach],\r\n elements: queryMoreInfo + queryRevealPhoneText\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.MoreInfoPanel to the previous script.\r\n */\r\n MoreInfoPanel.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.MoreInfoPanel = previousMoreInfoPanel;\r\n return MoreInfoPanel;\r\n };\r\n\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n global.NewHomeSource.FullImageViewer.MoreInfoPanel = MoreInfoPanel;\r\n}(window));\r\n","(function imageViewerCallToAction(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.MoreInfoPanel ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const previousImageViewerCallToAction = global.NewHomeSource.ImageViewerCallToAction;\r\n const queryCallToAction = '[data-full-image-viewer-role=\"ImageViewerCTA\"]';\r\n const queryScheduleButtonCta = queryCallToAction + ' [data-schedule-button]';\r\n const callToActionElement = global.document.querySelector(queryCallToAction);\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const hidden = 'hidden';\r\n\r\n /**\r\n * @public\r\n * render: renders the Call to Action.\r\n *\r\n * @param {object} data information that is needed to render the image counter.\r\n */\r\n function render(data) {\r\n if (data.IsCtaSlide) {\r\n callToActionElement.removeAttribute(hidden);\r\n } else {\r\n callToActionElement.setAttribute(hidden, true);\r\n }\r\n }\r\n\r\n /**\r\n* @private\r\n* openScheduleForm: open schedule form on panel actions.\r\n*\r\n*/\r\n function openScheduleForm() {\r\n global.NewHomeSource.FullImageViewer.MoreInfoPanel.openScheduleTourFromCallToAction();\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.ImageViewerCallToAction\r\n */\r\n function ImageViewerCallToAction() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n ImageViewerCallToAction.update = function update(data) {\r\n requestAnimationFrame(render.bind(this, data));\r\n };\r\n\r\n const eventsConfiguration = {\r\n scheculeButton: {\r\n callbacks: [openScheduleForm],\r\n events: [eventToAttach],\r\n elements: queryScheduleButtonCta,\r\n },\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.ImageViewerCallToAction to the previous script.\r\n */\r\n ImageViewerCallToAction.noConflict = function noConflict() {\r\n global.NewHomeSource.ImageViewerCallToAction = previousImageViewerCallToAction;\r\n return ImageViewerCallToAction;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', ImageViewerCallToAction);\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n global.NewHomeSource.ImageViewerCallToAction = ImageViewerCallToAction;\r\n}(window));\r\n","(function collectionCallToAction(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const previouscollectionCallToAction = global.NewHomeSource.CollectionCallToAction;\r\n const languageResources = global.NewHomeSource.FullImageViewer.Config.languageResources;\r\n const messages = {};\r\n\r\n if (languageResources) {\r\n const translationKeys = Object.keys(languageResources);\r\n\r\n for (let i = 0; i < translationKeys.length; i += 1) {\r\n messages[translationKeys[i]] = languageResources[translationKeys[i]];\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.collectionCallToAction\r\n */\r\n function CollectionCallToAction() {\r\n\r\n }\r\n\r\n CollectionCallToAction.GetCollectionMessage = function getCollectionMessage(collectionName) {\r\n return messages[collectionName];\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.CollectionCallToAction to the previous script.\r\n */\r\n CollectionCallToAction.noConflict = function noConflict() {\r\n global.NewHomeSource.CollectionCallToAction = previouscollectionCallToAction;\r\n return CollectionCallToAction;\r\n };\r\n\r\n global.NewHomeSource.CollectionCallToAction = CollectionCallToAction;\r\n}(window));\r\n","(function trackerMedia(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n const previousTrackerMedia = global.NewHomeSource.TrackerMedia;\r\n\r\n /**\r\n * @constructs NewHomeSource.TrackerMedia\r\n */\r\n function TrackerMedia() {\r\n }\r\n\r\n /**\r\n * trackCollectionImpressionEvent: tracks the impression event when a collection is viewed.\r\n * @param {string} viewedCollection collection that was viewed\r\n */\r\n TrackerMedia.trackCollectionImpressionEvent = function (viewedCollection) {\r\n const googleAnalyticsEvent = {\r\n eventType: 'GA4Event',\r\n eventName: 'media_views',\r\n params: {\r\n click_target: viewedCollection,\r\n event_type: 'TDV Events',\r\n currency: 'USD',\r\n value: '4',\r\n click_target1: 'On Scroll',\r\n position: 'On Gallery'\r\n }\r\n };\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: googleAnalyticsEvent\r\n }\r\n }));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.TrackerMedia to the previous scripty.\r\n */\r\n TrackerMedia.noConflict = function noConflict() {\r\n global.NewHomeSource.TrackerMedia = previousTrackerMedia;\r\n return TrackerMedia;\r\n };\r\n\r\n global.NewHomeSource.TrackerMedia = TrackerMedia;\r\n}(window));\r\n","(function galleryTab(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState || !global.NewHomeSource.TrackerMedia) {\r\n return;\r\n }\r\n\r\n const previousGalleryTab = global.NewHomeSource.GalleryTab;\r\n const trackerMedia = global.NewHomeSource.TrackerMedia;\r\n const queryNavigator = '[data-component=\"full-image-viewer-navigation\"]';\r\n const queryArrowLeft = '[data-component=\"arrow-left\"]';\r\n const queryArrowRight = '[data-component=\"arrow-right\"]';\r\n const tabActiveClass = 'tab--active';\r\n const blockStyle = 'block';\r\n const none = 'none';\r\n const galleryNavigation = global.document.querySelector(queryNavigator + ' div');\r\n const leftGalleryArrow = global.document.querySelector(queryArrowLeft);\r\n const rightGalleryArrow = global.document.querySelector(queryArrowRight);\r\n const navCallToAction = global.document.querySelector('[data-component=\"data-nav-call-to-action\"]');\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const swipingObject = {};\r\n let navCallToActionLeftLimit = 0;\r\n let selectedCollection = null;\r\n\r\n if (!galleryNavigation || galleryNavigation.querySelectorAll('li').length === 0 ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n /**\r\n * @private\r\n * isElementInsideViewport: returns true if a given collection is inside the viewport\r\n * @param {object} elementToCheck HTML element to check\r\n */\r\n function isElementInsideViewport(elementToCheck) {\r\n return elementToCheck.getBoundingClientRect().right <= navCallToActionLeftLimit;\r\n }\r\n\r\n /**\r\n * @private\r\n * getRightViewportLimit: gets the last limit in the nav bar where collection tabs are visible\r\n */\r\n function getRightViewportLimit() {\r\n navCallToActionLeftLimit = navCallToAction.getBoundingClientRect().left;\r\n }\r\n\r\n navCallToActionLeftLimit = requestAnimationFrame(getRightViewportLimit);\r\n\r\n /**\r\n * @private\r\n * isSelected: returs the value of the IsSelected property.\r\n *\r\n * @param {object} element that is being evaluated.\r\n */\r\n function isSelected(element) {\r\n return element.IsSelected;\r\n }\r\n\r\n /**\r\n * @private\r\n * isSelectedTabInsideViewport: returns true if the selected collection is inside the viewport, false if not\r\n */\r\n function isSelectedTabInsideViewport() {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n const selectedIndex = state.images.findIndex(isSelected);\r\n selectedCollection = galleryNavigation.querySelector('li [data-collection=\"' +\r\n state.images[selectedIndex].Collection + '\"]');\r\n const rightLimitOfElement = selectedCollection.getBoundingClientRect().right;\r\n\r\n return rightLimitOfElement <= navCallToActionLeftLimit;\r\n }\r\n\r\n /**\r\n * @private\r\n * selectActiveTab: Changes the FIV state by selecting a new image\r\n * @param {event} event the event that fired this callback.\r\n */\r\n function selectActiveTab(event) {\r\n const state = global.NewHomeSource.FullImageViewerState.get();\r\n\r\n const getImageFromCollection = function getImageFromCollection(image) {\r\n return image.Collection === event.target.dataset.collection;\r\n };\r\n\r\n const imagesArray = Array.from(state.images);\r\n const newSelectedImage = imagesArray.filter(getImageFromCollection)[0];\r\n const newIndex = imagesArray.indexOf(newSelectedImage);\r\n\r\n global.NewHomeSource.FullImageViewerState.setImage(state.images[newIndex]);\r\n }\r\n\r\n /**\r\n * @private\r\n * showLeftAndRightArrow: shows/hides the left/right arrows of the nav bar\r\n */\r\n function showLeftAndRightArrow() {\r\n const firstCollection = galleryNavigation.querySelector('li');\r\n const lastCollection = galleryNavigation.querySelector('ul li:last-child');\r\n const leftNavigationLimit = 24;\r\n\r\n if (firstCollection.getBoundingClientRect().left < leftNavigationLimit) {\r\n leftGalleryArrow.style.display = blockStyle;\r\n } else {\r\n leftGalleryArrow.style.display = none;\r\n }\r\n\r\n if (lastCollection.getBoundingClientRect().right > navCallToActionLeftLimit) {\r\n rightGalleryArrow.style.display = blockStyle;\r\n } else {\r\n rightGalleryArrow.style.display = none;\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * leftArrowClick: defines the function for the left gallery tab arrow.\r\n */\r\n function leftArrowClick() {\r\n galleryNavigation.scrollBy(-100, 0);\r\n requestAnimationFrame(showLeftAndRightArrow);\r\n }\r\n\r\n /**\r\n * @private\r\n * rightArrowClick: defines the function for the right gallery tab arrow.\r\n */\r\n function rightArrowClick() {\r\n galleryNavigation.scrollBy(100, 0);\r\n requestAnimationFrame(showLeftAndRightArrow);\r\n }\r\n\r\n /**\r\n * @private\r\n * touchCancel: resets the values of the swipingObject to their defaults\r\n */\r\n function touchCancel() {\r\n swipingObject.fingerCount = 0;\r\n swipingObject.startX = 0;\r\n swipingObject.startY = 0;\r\n swipingObject.curX = 0;\r\n swipingObject.curY = 0;\r\n }\r\n\r\n /**\r\n * @private\r\n * handleSwipeStart: handles the first values captured from the fingers gesture in the nav bar\r\n * @param {event} event the event of the fingers gesture (touchestart).\r\n */\r\n function handleSwipeStart(event) {\r\n swipingObject.fingerCount = event.touches.length;\r\n if (swipingObject.fingerCount === 1) {\r\n swipingObject.startX = event.touches[0].pageX;\r\n swipingObject.startY = event.touches[0].pageY;\r\n } else {\r\n touchCancel();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * handleSwipeEnd: handles the last values captured from the fingers gesture in the nav bar\r\n */\r\n function handleSwipeEnd() {\r\n if (swipingObject.fingerCount === 1 && swipingObject.curX !== 0) {\r\n requestAnimationFrame(showLeftAndRightArrow);\r\n touchCancel();\r\n } else {\r\n touchCancel();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * handleSwipeMove: handles the last values captured from the fingers gesture in the nav bar\r\n * @param {event} event the event of the fingers gesture (touchemove).\r\n */\r\n function handleSwipeMove(event) {\r\n if (event.touches.length === 1) {\r\n swipingObject.curX = event.touches[0].pageX;\r\n swipingObject.curY = event.touches[0].pageY;\r\n } else {\r\n touchCancel();\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * setUpGalleryNavigationBar: sets up the navigation bar. It's call in a given\r\n * animation frame for it's use of getBoundingClientRect.\r\n * @param {object} data current state of the full image viewer.\r\n */\r\n function setUpGalleryNavigationBar(data) {\r\n let isActiveCollectionInsideViewport;\r\n const currentActiveCollection = galleryNavigation.querySelector('.' + tabActiveClass);\r\n if (currentActiveCollection) {\r\n currentActiveCollection.classList.remove(tabActiveClass);\r\n }\r\n getRightViewportLimit();\r\n if (data.Images) {\r\n isActiveCollectionInsideViewport = isSelectedTabInsideViewport(data);\r\n } else {\r\n isActiveCollectionInsideViewport = isElementInsideViewport(selectedCollection);\r\n }\r\n selectedCollection.classList.add(tabActiveClass);\r\n\r\n if (!isActiveCollectionInsideViewport) {\r\n galleryNavigation.scroll(selectedCollection.getBoundingClientRect().left, 0);\r\n }\r\n\r\n showLeftAndRightArrow();\r\n }\r\n\r\n /**\r\n * @public\r\n * render: renders the nav bar interactios.\r\n * @param {object} data current state of the full image viewer.\r\n */\r\n function render(data) {\r\n requestAnimationFrame(setUpGalleryNavigationBar.bind(this, data));\r\n }\r\n\r\n const eventsConfiguration = {\r\n letfArrow: {\r\n callbacks: [leftArrowClick],\r\n events: [eventToAttach],\r\n elements: queryArrowLeft,\r\n },\r\n rightArrow: {\r\n callbacks: [rightArrowClick],\r\n events: [eventToAttach],\r\n elements: queryArrowRight,\r\n },\r\n swipingStart: {\r\n callbacks: [handleSwipeStart],\r\n events: ['touchstart'],\r\n elements: queryNavigator,\r\n },\r\n swipingEnd: {\r\n callbacks: [handleSwipeEnd],\r\n events: ['touchend'],\r\n elements: queryNavigator,\r\n },\r\n swipingMove: {\r\n callbacks: [handleSwipeMove],\r\n events: ['touchmove'],\r\n elements: queryNavigator,\r\n },\r\n selectCollection: {\r\n callbacks: [selectActiveTab],\r\n events: ['click'],\r\n elements: queryNavigator + ' div li',\r\n },\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.GalleryTab\r\n */\r\n function GalleryTab() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n * @param {object} data information that was changed.\r\n */\r\n GalleryTab.update = function update(data, topic) {\r\n render(data);\r\n if (topic === 'onCollectionSet') {\r\n const selectedCollectionName = data.Name;\r\n trackerMedia.trackCollectionImpressionEvent(selectedCollectionName);\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n * showArrows: calculate limit of CTA and show arrow.\r\n */\r\n GalleryTab.showArrows = function showArrows() {\r\n getRightViewportLimit();\r\n showLeftAndRightArrow();\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.GalleryTab to the previous script.\r\n */\r\n GalleryTab.noConflict = function noConflict() {\r\n global.NewHomeSource.GalleryTab = previousGalleryTab;\r\n return GalleryTab;\r\n };\r\n\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n global.NewHomeSource.FullImageViewerState.add('onCollectionSet', GalleryTab);\r\n global.NewHomeSource.FullImageViewerState.add('onResize', GalleryTab);\r\n global.NewHomeSource.GalleryTab = GalleryTab;\r\n}(window));\r\n","(function otherMedia(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const otherMediaType = {\r\n virtualWalkthrough: 'VWT',\r\n interactiveFloorPlan: 'IFP',\r\n communityVideoTour: 'SVT',\r\n testimonialVideo: 'CVT',\r\n virtualTour: 'VIR'\r\n };\r\n const tdvEvent = {\r\n vrtualTour: 'HDVTCT',\r\n interactiveFloorPlan: 'HDPVCT',\r\n communityVideoTour: 'CDVID',\r\n homeVideoTour: 'HDVID',\r\n };\r\n const previousOtherMedia = global.NewHomeSource.FullImageViewer.OtherMedia;\r\n const languageResources = global.NewHomeSource.FullImageViewer.Config.languageResources;\r\n const title = languageResources.OtherMediaTitle;\r\n const subtitle = languageResources.OtherMediaSubtitle;\r\n const captionContainer = global.document.querySelector('[data-full-image-viewer-role=\"caption-container\"]');\r\n const otherMediaLogo = global.document.querySelector('[data-full-image-viewer-role=\"other-media-logo\"]');\r\n const container = global.document.querySelector('[data-full-image-viewer-role=\"other-media\"]');\r\n const mediaContainer = global.document.querySelector('[data-full-image-viewer-role=\"other-media-container\"]');\r\n const titleElement = global.document.querySelector('[data-full-image-viewer-role=\"other-media-title\"]');\r\n const otherMediaContent = global.document.querySelector('[data-full-image-viewer-role=\"other-media-content\"]');\r\n const subtitleElement = global.document.querySelector('[data-full-image-viewer-role=\"other-media-subtitle\"]');\r\n const swiperContainer = global.document.querySelector('[data-full-image-viewer-role=\"swiper-container\"]');\r\n const isCommunityDetail = global.document.querySelector('[data-is-community]').value;\r\n const playerBox = global.document.querySelector(global\r\n .NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n const dataAttributesTdv = global.NewHomeSource.FullImageViewer.Config.dataTdvAttributes;\r\n const getAttributeValue = global.NewHomeSource.FullImageViewer.Config.getAttributeValue;\r\n let tdvAttributes = '';\r\n\r\n for (let index = 0; index < dataAttributesTdv.length; index += 1) {\r\n const dataAttr = dataAttributesTdv[index];\r\n const value = getAttributeValue(dataAttr);\r\n if (value) {\r\n tdvAttributes += dataAttr + '=\"' + value + '\" ';\r\n }\r\n }\r\n\r\n const template = '
  • ' +\r\n '' +\r\n '{TITLE} ' +\r\n '
  • ';\r\n\r\n const logo = global.document.querySelector('[data-component=\"logo\"]');\r\n\r\n if (!mediaContainer) {\r\n return;\r\n }\r\n\r\n if (logo) {\r\n otherMediaLogo.src = logo.src;\r\n otherMediaLogo.alt = logo.alt;\r\n }\r\n\r\n subtitleElement.innerHTML = subtitle;\r\n titleElement.innerHTML = title + subtitleElement.outerHTML;\r\n\r\n function getTdvEvent(type) {\r\n switch (type) {\r\n case otherMediaType.virtualWalkthrough:\r\n return tdvEvent.vrtualTour;\r\n\r\n case otherMediaType.virtualTour:\r\n return tdvEvent.vrtualTour;\r\n\r\n case otherMediaType.interactiveFloorPlan:\r\n return tdvEvent.interactiveFloorPlan;\r\n\r\n case otherMediaType.communityVideoTour:\r\n return isCommunityDetail !== 'true' ? tdvEvent.homeVideoTour : tdvEvent.communityVideoTour;\r\n\r\n case otherMediaType.testimonialVideo:\r\n return isCommunityDetail !== 'true' ? tdvEvent.homeVideoTour : tdvEvent.communityVideoTour;\r\n\r\n default:\r\n }\r\n return '';\r\n }\r\n\r\n function createMediaLink(link, index) {\r\n mediaContainer.innerHTML += template.replace('{URL}', link.url)\r\n .replace('{TITLE}', link.title)\r\n .replace('{TYPE}', link.type)\r\n .replace('{ID}', link.id)\r\n .replace('{TDVEVENT}', getTdvEvent(link.type))\r\n .replace('{SEQUENCE}', index + 1);\r\n }\r\n\r\n function displayInCarousel(data) {\r\n mediaContainer.innerHTML = '';\r\n data.Images[0].links.forEach(createMediaLink);\r\n container.style.display = 'block';\r\n swiperContainer.classList.add('other__media--full');\r\n otherMediaContent.style.display = 'block';\r\n captionContainer.classList.add('visuallyhidden');\r\n }\r\n\r\n /**\r\n * @private\r\n * display: attaches the other media container element to the DOM.\r\n *\r\n * @param {object} data information that is needed to render the other media links.\r\n */\r\n function display(data) {\r\n if (swiperContainer) {\r\n displayInCarousel(data);\r\n return;\r\n }\r\n\r\n data.Images[0].links.forEach(createMediaLink);\r\n container.style.display = 'block';\r\n playerBox.classList.add('box--full-height');\r\n }\r\n\r\n /**\r\n * @private\r\n * hide: removes the other media container element from the DOM.\r\n */\r\n function hide() {\r\n container.style.display = 'none';\r\n if (swiperContainer) {\r\n swiperContainer.classList.remove('other__media--full');\r\n otherMediaContent.style.display = 'none';\r\n captionContainer.classList.remove('visuallyhidden');\r\n return;\r\n }\r\n\r\n if (container.parentElement) {\r\n mediaContainer.innerHTML = '';\r\n playerBox.classList.remove('box--full-height');\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * render: renders the mediaContainer.\r\n *\r\n * @param {object} data information that is needed to render the other media links.\r\n */\r\n function render(data) {\r\n if (data.Name.toLowerCase() === 'other') {\r\n display(data);\r\n } else {\r\n hide();\r\n }\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.OtherMedia\r\n */\r\n function OtherMedia() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n OtherMedia.update = function update(data, topic) {\r\n if (topic !== 'onCollectionSet') {\r\n return;\r\n }\r\n\r\n requestAnimationFrame(render.bind(this, data));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.OtherMedia to the previous script.\r\n */\r\n OtherMedia.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.OtherMedia = previousOtherMedia;\r\n return OtherMedia;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onCollectionSet', OtherMedia);\r\n global.NewHomeSource.FullImageViewer.OtherMedia = OtherMedia;\r\n}(window));\r\n","(function fullImageViewerMain(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.Event ||\r\n !global.NewHomeSource.FullImageViewerHeader ||\r\n !global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.CaptionBar ||\r\n !global.NewHomeSource.FilmStrip ||\r\n !global.NewHomeSource.ImageCounter ||\r\n !global.NewHomeSource.ImageViewer ||\r\n !global.NewHomeSource.ModalBackground ||\r\n !global.NewHomeSource.FullImageViewer.Config\r\n ) {\r\n return;\r\n }\r\n\r\n const previousFullImageViewerMain = global.NewHomeSource.FullImageViewerMain;\r\n const fullImageViewerData = JSON.parse(document.querySelector('[data-component=\"fullImageViewerData\"]').innerHTML);\r\n const triggerSelector = '[data-full-image-viewer-trigger=\"true\"]';\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n\r\n function close(event) {\r\n const container = global.NewHomeSource.FullImageViewer.Config.fullImageViewer;\r\n const trigger = global.document.querySelector(triggerSelector);\r\n\r\n if (trigger) {\r\n trigger.removeAttribute('data-full-image-viewer-trigger');\r\n }\r\n\r\n global.NewHomeSource.ModalBackground.destroyBackground();\r\n container.parentElement.removeChild(container);\r\n\r\n event.preventDefault();\r\n }\r\n\r\n /**\r\n * @private\r\n * onKeyDown: closes the full image viewer when the ESC key pressed.\r\n *\r\n * @param {KeyboardEvent} event with the information related to key pressed.\r\n */\r\n function onKeyDown(event) {\r\n if (event.keyCode !== 27) {\r\n return;\r\n }\r\n\r\n close(event);\r\n }\r\n\r\n const events = {\r\n close: {\r\n callbacks: [close],\r\n elements: '[data-full-image-viewer-role=\"close\"]',\r\n events: [eventToAttach],\r\n },\r\n keyboard: {\r\n callbacks: [onKeyDown],\r\n elements: '[data-component=\"full-image-viewer\"]',\r\n events: ['keydown'],\r\n },\r\n };\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewerMain\r\n */\r\n function FullImageViewerMain() {\r\n const trigger = global.document.querySelector(triggerSelector);\r\n\r\n global.NewHomeSource.Pipe();\r\n global.NewHomeSource.FullImageViewerHeader.appendInformation();\r\n global.NewHomeSource.FullImageViewerState.init(fullImageViewerData);\r\n global.NewHomeSource.FullImageViewerState.setImage(trigger);\r\n global.NewHomeSource.Event(events);\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewerMain to the previous script.\r\n */\r\n FullImageViewerMain.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewerMain = previousFullImageViewerMain;\r\n return FullImageViewerMain;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerMain = FullImageViewerMain;\r\n}(window));\r\n","(function scheduleTour(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n const previousScheduleTour = global.NewHomeSource.FullImageViewer.ScheduleTour;\r\n const languageResources = global.NewHomeSource.FullImageViewer.Config.languageResources;\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const panelActionContainer = global.document.querySelector('[data-panel-actions]');\r\n const backButton = global.document.querySelector('[data-component=\"close-form\"]');\r\n const closeButton = global.document.querySelector('[data-panel-form] [data-close-panel-action=\"true\"]');\r\n const queryPanelForm = '[data-panel-form]';\r\n const queryForTourTypes = '[data-requestTourOptions]';\r\n const queryForInPersonTab = '[data-inPersonTour-actions]';\r\n const queryForSelfGuidedTab = '[data-selfGuidedTour-actions]';\r\n const queryForVideoChatTab = '[data-videoChat-actions]';\r\n const queryForSelfGuidedContent = '#nhs_selfGuidedTourSection';\r\n const panelForm = global.document.querySelector(queryPanelForm);\r\n const mainContainer = global.NewHomeSource.FullImageViewer.Config.fullImageViewer;\r\n const guidedTourConfiguration = global.document.querySelector('[data-guided-tour-configuration]');\r\n const messages = {};\r\n\r\n if (languageResources) {\r\n const translationKeys = Object.keys(languageResources);\r\n\r\n for (let i = 0; i < translationKeys.length; i += 1) {\r\n messages[translationKeys[i]] = languageResources[translationKeys[i]];\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * stopBubbling: stop propagation of events.\r\n * @param {event} event the event that fired this callback.\r\n */\r\n function stopBubbling(event) {\r\n event.stopPropagation();\r\n }\r\n\r\n function setUpEventClose(element) {\r\n const button = element;\r\n const leadEvents = global.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n const step = panelForm.querySelector('[data-recommendations-box]') ? 'Step 3' : 'Step 2';\r\n button.dataset.ga4EventButton_name = leadEvents.ButtonNameClicked || '';\r\n button.dataset.ga4EventPosition = leadEvents.Position || '';\r\n button.dataset.ga4EventClick_target = step;\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * closeButtonForm: supports the action of closing the form.\r\n * @param {event} event the event that fired this callback.\r\n */\r\n function closeButtonForm(event) {\r\n panelActionContainer.removeAttribute('hidden');\r\n panelForm.setAttribute('hidden', 'true');\r\n panelForm.querySelector('[data-form-container]').remove();\r\n\r\n if (event) {\r\n const leadEvents = global.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n const target = event.target;\r\n event.preventDefault();\r\n\r\n target.dataset.ga4EventButton_name = leadEvents.ButtonNameClicked || '';\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * handleSelfGuidedTourContent: shows or hides the self guided tour content.\r\n */\r\n function handleSelfGuidedTourContent(isGoingToBeShown) {\r\n if (isGoingToBeShown && guidedTourConfiguration) {\r\n return;\r\n }\r\n\r\n const selfGuidedContent = panelForm.querySelector(queryForSelfGuidedContent);\r\n const elementsInSelector = panelForm\r\n .querySelectorAll('#nhs_scheduleTourSection, #nhs_contacBuilderSection, [data-commonFormSection]');\r\n for (let j = 0; j < elementsInSelector.length; j += 1) {\r\n elementsInSelector[j].style.display = isGoingToBeShown ? 'none' : 'block';\r\n }\r\n\r\n if (selfGuidedContent) {\r\n if (isGoingToBeShown) {\r\n if (global.lazyLoad) {\r\n global.lazyLoad.init();\r\n }\r\n selfGuidedContent.removeAttribute('hidden');\r\n } else {\r\n selfGuidedContent.setAttribute('hidden', '');\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * bindScheduleTourTabsEvents: binds the functions to every tour tab: in person, video chat, self guided.\r\n */\r\n function bindScheduleTourTabsEvents() {\r\n const oneOnOneTabButton = panelForm.querySelector(queryForInPersonTab);\r\n const guidedTourTabButton = panelForm.querySelector(queryForSelfGuidedTab);\r\n const videoChatTabButton = panelForm.querySelector(queryForVideoChatTab);\r\n\r\n if (oneOnOneTabButton) {\r\n oneOnOneTabButton.addEventListener(eventToAttach, () => {\r\n handleSelfGuidedTourContent(false);\r\n });\r\n }\r\n\r\n if (guidedTourTabButton) {\r\n guidedTourTabButton.addEventListener(eventToAttach, () => {\r\n handleSelfGuidedTourContent(true);\r\n });\r\n }\r\n\r\n if (videoChatTabButton) {\r\n videoChatTabButton.addEventListener(eventToAttach, () => {\r\n handleSelfGuidedTourContent(false);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * setFormValuesToDefault: Cleans up the lead form fields.\r\n */\r\n function setFormValuesToDefault() {\r\n const formTextValues = panelForm.querySelectorAll('input[type=\"text\"], input[type=\"email\"]');\r\n for (let i = 0; i < formTextValues.length; i += 1) {\r\n formTextValues[i].value = '';\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * Used to close the thank you modal.\r\n * @param {*} event The event.\r\n */\r\n function closeThankYouModal(event) {\r\n setUpEventClose(closeButton);\r\n closeButtonForm(event);\r\n const resetFormLink = document.querySelector('[data-reset-form-link]');\r\n resetFormLink.remove();\r\n closeButton.removeEventListener(eventToAttach, closeThankYouModal);\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * sendFormFunction: Sends the lead.\r\n * @param {event} event the event that fired this callback.\r\n */\r\n function sendFormFunction(event) {\r\n const leadEvents = global.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n const firedEvent = event;\r\n const formToGoBack = event.target.closest('[data-panel-form]').dataset.panelFormType === 'contactBuilder'\r\n ? '[data-contact-builder-panel-actions]' : '[data-schedule-panel-actions]';\r\n\r\n firedEvent.target.dataset.segmentButton_action =\r\n mainContainer.querySelector('#nhs_GetBrochure').dataset.segmentbutton_action;\r\n\r\n this.dataset.ga4IdentityButton_name = leadEvents.ButtonNameClicked || '';\r\n this.dataset.ga4IdentityPosition = leadEvents.Position || '';\r\n\r\n global.onClickSendForm(firedEvent, () => {\r\n const forgotPasswordLink = panelForm.querySelector('[data-forgotPassword]');\r\n\r\n if (forgotPasswordLink) {\r\n forgotPasswordLink.removeAttribute('hidden');\r\n forgotPasswordLink.querySelector('a').href += '&IsFullGallery=true';\r\n }\r\n\r\n panelActionContainer.setAttribute('hidden', '');\r\n backButton.setAttribute('hidden', '');\r\n closeButton.removeAttribute('hidden');\r\n\r\n const resetDataset = {\r\n event: 'true',\r\n ga4EventName: 'gallery_detail_pages',\r\n ga4EventButton_name: leadEvents.ButtonNameClicked || '',\r\n ga4EventClick_target: 'Reset form'\r\n };\r\n\r\n const resetFormLink = document.createElement('a');\r\n resetFormLink.setAttribute('data-reset-form-link', 'true');\r\n resetFormLink.innerHTML = messages.ResetForm;\r\n Object.assign(resetFormLink.dataset, resetDataset);\r\n panelForm.appendChild(resetFormLink);\r\n\r\n resetFormLink.onclick = function () {\r\n global.document.querySelector(formToGoBack).click();\r\n resetFormLink.parentElement.removeChild(resetFormLink);\r\n setFormValuesToDefault();\r\n };\r\n\r\n closeButton.addEventListener(eventToAttach, closeThankYouModal);\r\n global.NewHomeSource.FullImageViewer.MoreInfoPanel.closePanelActions();\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * bindEvents: binds the events.\r\n * @param {event} event the event that fired this callback.\r\n */\r\n function bindEvents() {\r\n const getBrochureCta = mainContainer.querySelector('#nhs_GetBrochure');\r\n const form = mainContainer.querySelector('form');\r\n backButton.onclick = closeButtonForm;\r\n const liveOutSideChackBox = mainContainer.querySelector('[name=live-outside]');\r\n liveOutSideChackBox.onchange = global.onChangeToggleZipInput.bind(this, liveOutSideChackBox);\r\n global.setupLeadForms(form);\r\n // Create a new custom event with the name 'modalOpened' and the detail property containing the modal name\r\n const modalOpened = new CustomEvent('modalOpened', {\r\n detail: {\r\n modal: form\r\n }\r\n });\r\n\r\n // Dispatch the event from the element that opens the modal\r\n document.dispatchEvent(modalOpened);\r\n\r\n if (getBrochureCta) {\r\n getBrochureCta.onclick = sendFormFunction;\r\n }\r\n if (!global.Mailcheck && typeof global.NHS.loadJs === 'function') {\r\n global.NHS.loadJs(document.getElementById('CtaDependencies').value, '');\r\n } else if (global.NewHomeSource && global.NewHomeSource.EmailDomainValidator) {\r\n global.NewHomeSource.EmailDomainValidator();\r\n }\r\n bindScheduleTourTabsEvents();\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.ScheduleTour\r\n */\r\n function ScheduleTour() {}\r\n\r\n /**\r\n * updateLegalConsentText will update the legal consent text by providing the right button\r\n * text of the form the user is interested in submitting.\r\n * @param {HTML} container where the legal consent text is placed.\r\n * @param {string} buttonText to be read in the legal consent text.\r\n */\r\n function updateLegalConsentText(container, buttonText) {\r\n const template = document.querySelector('[data-first-legal-consent-section-template]');\r\n const clone = template.content.cloneNode(true);\r\n const clonedFirstLegalConsentSection = clone.querySelector('[data-first-legal-consent-section]');\r\n const updatedtLegalConsentText =\r\n clonedFirstLegalConsentSection.innerHTML.replace('the button', `the ${buttonText} button`);\r\n\r\n clonedFirstLegalConsentSection.innerHTML = updatedtLegalConsentText;\r\n const currentLegalConsentSection = container.querySelector('[data-first-legal-consent-section]');\r\n currentLegalConsentSection.replaceWith(clonedFirstLegalConsentSection);\r\n }\r\n\r\n /**\r\n * @private\r\n *\r\n * setUpForm: prepares the form to be shown, either contact builder or schedule tour.\r\n * @param {isScheduleTour} bool a flag that indicates if the form is scheduleTour.\r\n */\r\n function setUpForm(isScheduleTour, event) {\r\n const formClone = document.querySelector('[data-component=\"full-image-viewer-scheduleTour-template\"]')\r\n .content.cloneNode(true);\r\n let querySelectorForSectionToRemove = '';\r\n let formType = '';\r\n let formTitle = '';\r\n let formButton = '';\r\n\r\n if (isScheduleTour) {\r\n querySelectorForSectionToRemove = '#nhs_contacBuilderSection';\r\n formType = 'scheduleTour';\r\n formTitle = messages.TitleForGalleryForm;\r\n formButton = messages.TitleForGalleryForm;\r\n } else {\r\n querySelectorForSectionToRemove = '#nhs_scheduleTourSection';\r\n formType = 'contactBuilder';\r\n formTitle = messages.ContactTheBuilder;\r\n formButton = messages.SubmitRequest;\r\n }\r\n\r\n formClone.querySelector(querySelectorForSectionToRemove).remove();\r\n const remainingForm = panelForm.querySelector('#nhs_LeadForm');\r\n if (remainingForm) {\r\n remainingForm.remove();\r\n }\r\n\r\n panelForm.appendChild(formClone);\r\n panelForm.querySelector('[data-component=\"full-image-viewer-title\"]').innerText = formTitle;\r\n panelForm.querySelector('[data-send-form] span').textContent = formButton;\r\n panelForm.setAttribute('data-panel-form-type', formType);\r\n panelForm.removeAttribute('hidden');\r\n panelForm.querySelector('[data-send-form] span').parentElement.dataset.segmentbutton_action =\r\n global.event.target.dataset.segmentEventButton_action;\r\n\r\n backButton.removeAttribute('hidden');\r\n closeButton.setAttribute('hidden', '');\r\n\r\n updateLegalConsentText(panelForm, formButton);\r\n\r\n if (isScheduleTour) {\r\n const phone = global.document.querySelector('[data-component=\"phone-number\"]');\r\n const containerElement = mainContainer.querySelector('[data-slider-component]');\r\n panelForm.querySelector(queryForTourTypes).removeAttribute('hidden');\r\n global.initDatePicker(containerElement, phone, '/');\r\n } else {\r\n handleSelfGuidedTourContent(false);\r\n panelForm.querySelector(queryForTourTypes).remove();\r\n panelForm.querySelector('form').dataset.nterNowStatus = 'hidden';\r\n }\r\n\r\n if (event) {\r\n const parametersElement = panelForm.querySelector('[data-form-parameters]');\r\n const parameters = JSON.parse(parametersElement.innerHTML);\r\n const leadAction = event.target.closest('button').dataset.leadAction;\r\n\r\n if (leadAction) {\r\n parameters.LeadAction = leadAction;\r\n parametersElement.innerHTML = JSON.stringify(parameters);\r\n }\r\n }\r\n\r\n bindEvents();\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * setUpContactBuilder: Sets up the contact builder form.\r\n */\r\n ScheduleTour.setUpScheduleTour = function setUpScheduleTour(event) {\r\n setUpForm(true, event);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * setUpContactBuilder: Sets up the contact builder form.\r\n */\r\n ScheduleTour.setUpContactBuilder = function setUpContactBuilder(event) {\r\n setUpForm(false, event);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.ScheduleTour to the previous script.\r\n */\r\n ScheduleTour.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.ScheduleTour = previousScheduleTour;\r\n return ScheduleTour;\r\n };\r\n\r\n const eventsConfiguration = {\r\n inputs: {\r\n callbacks: [stopBubbling],\r\n events: ['keydown'],\r\n elements: queryPanelForm,\r\n },\r\n };\r\n\r\n document.body.addEventListener('onConfirmationDisplayed', () => {\r\n closeThankYouModal();\r\n global.NewHomeSource.FullImageViewer.MoreInfoPanel.closePanelActions();\r\n });\r\n\r\n global.NewHomeSource.Event(eventsConfiguration);\r\n global.NewHomeSource.FullImageViewer.ScheduleTour = ScheduleTour;\r\n}(window));\r\n","/**\r\n * Summary: Set and manage a freebrochure form into the full image viewer\r\n */\r\n(function freeBrochureHandler(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n const previousFreeBrochureHandler =\r\n global.NewHomeSource.FullImageViewer.FreeBrochureHandler;\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const queryFreeBrochureCallToAction = '[data-component=\"full-image-viewer-free-brochure-cta\"]';\r\n let fieldsConfig = {};\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.FreeBrochureHandler\r\n */\r\n function FreeBrochureHandler() { }\r\n\r\n /**\r\n * @private\r\n * fillFields: calculate the DOM elements for the FIV.\r\n * Note: when the user closes the FIV, the template element\r\n * is deleted, so, we need calculate the new elements\r\n */\r\n function fillFields() {\r\n fieldsConfig = {\r\n backButton: global.document.querySelector('[data-close-modal]'),\r\n panelForm: global.document.querySelector('[data-panel-form]'),\r\n moreInfoButton: global.document.querySelector('[data-more-information-btn]'),\r\n elementsActions: global.document.querySelectorAll('[data-more-info]'),\r\n panelActionContainer: global.document.querySelector('[data-panel-actions]'),\r\n freeBrochureButton: global.document.querySelector(queryFreeBrochureCallToAction)\r\n };\r\n }\r\n\r\n function showThankYouModal(event) {\r\n const html = event.detail.htmlResponse;\r\n const isModalReadyToDisplay = event.detail.isModalReadyToDisplay;\r\n\r\n if (!fieldsConfig.panelForm || !html) {\r\n return;\r\n }\r\n\r\n fieldsConfig.backButton.click();\r\n\r\n if (isModalReadyToDisplay) {\r\n window.NewHomeSource.ModalLoader.displayModal();\r\n } else {\r\n const fragment = document.createRange().createContextualFragment(html);\r\n window.NewHomeSource.ModalLoader.createModal(fragment, fieldsConfig.freeBrochureButton);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * backFromFormEvent: supports the action of closing the form.\r\n */\r\n function backFromFormEvent(event) {\r\n event.preventDefault();\r\n\r\n const leadEvents = global.NewHomeSource.Modules.tagManager.getFromDataLayer('leadEvents') || {};\r\n const form = fieldsConfig.panelForm.querySelector('[data-form-container]');\r\n\r\n fieldsConfig.panelActionContainer.removeAttribute('hidden');\r\n fieldsConfig.panelForm.setAttribute('hidden', '');\r\n fieldsConfig.backButton.dataset.ga4EventButton_name = leadEvents.ButtonNameClicked || '';\r\n fieldsConfig.moreInfoButton.removeAttribute('hidden');\r\n\r\n if (form) {\r\n form.remove();\r\n }\r\n\r\n for (let index = 0; index < fieldsConfig.elementsActions.length; index += 1) {\r\n fieldsConfig.elementsActions[index].setAttribute('hidden', '');\r\n }\r\n\r\n fieldsConfig.backButton.removeEventListener(eventToAttach, backFromFormEvent);\r\n fieldsConfig.backButton.removeAttribute('hidden');\r\n fieldsConfig = {};\r\n }\r\n\r\n /**\r\n * Use the fetch API to get the HTML modal content from the server\r\n * @param {string} url\r\n * @returns the HTML as a raw string\r\n */\r\n async function fetchFreeBrochureForm(url) {\r\n const request = await fetch(url, {\r\n method: 'GET',\r\n headers: {\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n }\r\n });\r\n\r\n const response = await request.text();\r\n const fragment = document.createRange().createContextualFragment(response);\r\n return fragment;\r\n }\r\n\r\n /**\r\n * @public\r\n * setUpForm: Sets up the any free brochure form into any container\r\n * @param {HTMLElement} container DOM container element\r\n * @param {string} htmlContent Html content from fetch result\r\n */\r\n FreeBrochureHandler.Init = async function setUpForm(container, url) {\r\n if (!container || !url) {\r\n return;\r\n }\r\n\r\n fillFields();\r\n\r\n const fragment = await fetchFreeBrochureForm(url);\r\n const form = fragment.querySelector('[data-form-container]');\r\n const leadButton = form.querySelector('#nhs_GetBrochure');\r\n leadButton.dataset.isFullImageViewerLead = true;\r\n container.appendChild(form);\r\n // Create a new custom event with the name 'modalOpened' and the detail property containing the modal name\r\n const modalOpened = new CustomEvent('modalOpened', {\r\n detail: {\r\n modal: form\r\n }\r\n });\r\n\r\n // Dispatch the event from the element that opens the modal\r\n document.dispatchEvent(modalOpened);\r\n\r\n fieldsConfig.backButton.addEventListener(eventToAttach, backFromFormEvent);\r\n };\r\n\r\n /**\r\n * @public\r\n * noConflict: Returns control of NewHomeSource.FreeBrochureHandler to the previous script.\r\n */\r\n FreeBrochureHandler.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.FreeBrochureHandler = previousFreeBrochureHandler;\r\n return FreeBrochureHandler;\r\n };\r\n\r\n global.document.body.addEventListener('onThankYouModalLoaded', showThankYouModal);\r\n global.NewHomeSource.FullImageViewer.FreeBrochureHandler = FreeBrochureHandler;\r\n}(window));\r\n","(function zoom(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.Modules.ImageZoom ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Pipe\r\n ) {\r\n return;\r\n }\r\n\r\n const previousZoom = global.NewHomeSource.FullImageViewer.Zoom;\r\n const canvasElement = global.document.createElement('canvas');\r\n const zoomInQuery = '[data-full-image-viewer-role=\"zoom-in\"]';\r\n const zoomOutQuery = '[data-full-image-viewer-role=\"zoom-out\"]';\r\n const zoomInElement = global.document.querySelector(zoomInQuery);\r\n const zoomOutElement = global.document.querySelector(zoomOutQuery);\r\n const eventToAttach = global.NewHomeSource.FullImageViewer.Config.getClickOrTouchEvent();\r\n const querySwiperContianer = '[data-full-image-viewer-role=\"swiper-container\"]';\r\n const queryZoomControls = '[data-full-image-viewer-role=\"zoomControls\"]';\r\n const isDisplayedInCarousel = global.document.querySelector(querySwiperContianer);\r\n const widthAttribute = 'width';\r\n const heightAttribute = 'height';\r\n const hidden = 'hidden';\r\n let imageZoom;\r\n let imagesContainer = global.document\r\n .querySelector(global.NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n\r\n /**\r\n * @private\r\n * isSelected: function for getting the selected item of a given array of objects.\r\n * @param {object} element with the IsSelected boolean flag.\r\n */\r\n function isSelected(element) {\r\n return element.IsSelected;\r\n }\r\n\r\n /**\r\n * @private\r\n * setSizes: sets the width and height to the canvas element.\r\n * @param {object} data where we are going to grab the given width and height.\r\n */\r\n function setSizes(data) {\r\n canvasElement.setAttribute(widthAttribute, data.width);\r\n canvasElement.setAttribute(heightAttribute, data.height);\r\n canvasElement.classList.add('player__zoom-canvas');\r\n }\r\n\r\n /**\r\n * @private\r\n * getCarouselWidth: returns a container width for displaying a canvas element\r\n * in the best way given a device to show it\r\n * @param {object} size representing the result of a invocation on the getBoundingClientRect function.\r\n */\r\n function getCarouselWidth(size) {\r\n return (global.window.orientation === -90 || global.window.orientation === 90) ? size.width - 200 : size.width;\r\n }\r\n\r\n /**\r\n * @private\r\n * onOrientationChange: for carousel porpuses we listen to this event instead of loading a module as dekstops.\r\n * This will fired when an user roated her/his device 90 degrees, and is in charge of adjusting the canvas\r\n * element for the best UX given the device new position\r\n */\r\n function onOrientationChange() {\r\n canvasElement.remove();\r\n requestAnimationFrame(() => {\r\n const currentViewerState = global.NewHomeSource.FullImageViewerState.get();\r\n const currentImage = currentViewerState.images.find(isSelected);\r\n global.NewHomeSource.FullImageViewerState.setImage(currentImage);\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * displayZoomControls: displays or hides the zooming controls for the canvas element.\r\n * @param {object} zoomControls DOM element.\r\n * @param {string} displayValue for the display style attribute.\r\n * @param {string} functionForClassList could be add or remove to the classList.\r\n */\r\n function displayZoomControls(zoomControls, displayValue, functionForClassList) {\r\n const zoomControl = zoomControls;\r\n if (zoomControl) {\r\n zoomControl.style.display = displayValue;\r\n zoomControl.classList[functionForClassList]('zoom-controls-floorplan');\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * displayCanvas: attaches the canvas element to the DOM.\r\n */\r\n function displayCanvas() {\r\n imagesContainer = global.document\r\n .querySelector(global.NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n const zoomControls = global.document.querySelector(queryZoomControls);\r\n canvasElement.style.display = 'none';\r\n\r\n if (zoomControls) {\r\n const size = imagesContainer.getBoundingClientRect();\r\n const height = size.height - 40;\r\n const width = getCarouselWidth(size);\r\n\r\n canvasElement.setAttribute('width', width);\r\n canvasElement.setAttribute('height', height);\r\n\r\n global.addEventListener('orientationchange', onOrientationChange);\r\n }\r\n\r\n imageZoom = new global.NewHomeSource.Modules.ImageZoom(canvasElement, this.Source);\r\n imagesContainer.prepend(canvasElement);\r\n imagesContainer.classList.remove('player-box');\r\n\r\n imageZoom.picture.onerror = function () {\r\n imageZoom.picture.src = global.NewHomeSource.FullImageViewer.Config.defaultThumbs.NoPhoto;\r\n\r\n if (isDisplayedInCarousel) {\r\n imagesContainer.removeAttribute('data-rich-slide');\r\n imagesContainer.querySelector('PICTURE').appendChild(imageZoom.picture);\r\n } else {\r\n canvasElement.style.display = 'block';\r\n }\r\n\r\n zoomInElement.setAttribute(hidden, '');\r\n zoomOutElement.setAttribute(hidden, '');\r\n imagesContainer.classList.remove('swiper-slide-floorplan');\r\n displayZoomControls(zoomControls, 'none', 'remove');\r\n };\r\n\r\n imageZoom.picture.addEventListener('load', () => {\r\n if (imageZoom.picture.src === global.NewHomeSource.FullImageViewer.Config.defaultThumbs.NoPhoto) {\r\n return;\r\n }\r\n\r\n canvasElement.style.display = 'block';\r\n imagesContainer.classList.add('swiper-slide-floorplan');\r\n zoomInElement.removeAttribute(hidden);\r\n zoomOutElement.removeAttribute(hidden);\r\n displayZoomControls(zoomControls, 'flex', 'add');\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * resize: sets new values for the width and height of the canvas element.\r\n */\r\n function resize(data) {\r\n setSizes(data);\r\n\r\n if (imageZoom) {\r\n imageZoom.resize(canvasElement.getAttribute(widthAttribute), canvasElement.getAttribute(heightAttribute));\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * handleResize: checks if the topic message indicates a resize action is needed.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n function handleResize(data, topic) {\r\n if (topic !== 'onResize') {\r\n return true;\r\n }\r\n\r\n requestAnimationFrame(resize.bind(null, data));\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * hideCanvas: removes the canvas element from the DOM.\r\n */\r\n function hideCanvas() {\r\n if (!isDisplayedInCarousel) {\r\n imagesContainer.removeChild(canvasElement);\r\n imagesContainer.classList.add('player-box');\r\n } else {\r\n global.document.querySelector(queryZoomControls).style.display = 'none';\r\n imagesContainer.classList.remove('swiper-slide-floorplan');\r\n }\r\n zoomInElement.setAttribute(hidden, true);\r\n zoomOutElement.setAttribute(hidden, true);\r\n }\r\n\r\n /**\r\n * @private\r\n * render: creates and display the canvas object with the zoom and pan features.\r\n *\r\n * @param {object} data information of the object to be rendered.\r\n */\r\n function render(data) {\r\n imagesContainer = global.document\r\n .querySelector(global.NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n\r\n if (!imagesContainer) {\r\n return data;\r\n }\r\n\r\n requestAnimationFrame(displayCanvas.bind(data));\r\n imagesContainer.prepend(canvasElement);\r\n return data;\r\n }\r\n\r\n /**\r\n * @private\r\n * zoomIn: increases the dimensions of the image.\r\n */\r\n function zoomIn() {\r\n imageZoom.zoom(true);\r\n }\r\n\r\n /**\r\n * @private\r\n * zoomIn: increases the dimensions of the image.\r\n */\r\n function zoomOut() {\r\n imageZoom.zoom(false);\r\n }\r\n\r\n /**\r\n * @private\r\n * shouldBeIgnored: hides the Canvas element if the current element is not zoomable.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n function shouldBeIgnored(data) {\r\n const isCanvas = global.NewHomeSource.FullImageViewer.Config.isZoomableCollection(data);\r\n\r\n if (!isCanvas && canvasElement.parentElement) {\r\n hideCanvas(isCanvas);\r\n }\r\n return isCanvas;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.Zoom\r\n */\r\n function Zoom() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n Zoom.update = function update(data, topic) {\r\n global.NewHomeSource.Pipe.conditionalPipe(handleResize, shouldBeIgnored, render)(data, topic);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.Zoom to the previous script.\r\n */\r\n Zoom.noConflict = function noConflict() {\r\n global.NewHomeSource.Zoom = previousZoom;\r\n return Zoom;\r\n };\r\n\r\n const events = {\r\n zoomIn: {\r\n callbacks: [zoomIn],\r\n elements: zoomInQuery,\r\n events: [eventToAttach],\r\n },\r\n zoomOut: {\r\n callbacks: [zoomOut],\r\n elements: zoomOutQuery,\r\n events: [eventToAttach],\r\n },\r\n };\r\n\r\n global.NewHomeSource.Event(events);\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', Zoom);\r\n global.NewHomeSource.FullImageViewerState.add('onResize', Zoom);\r\n global.NewHomeSource.FullImageViewer.Zoom = Zoom;\r\n}(window));\r\n","(function performanceEvents(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewer.Config) {\r\n return;\r\n }\r\n\r\n const dataAttributesTdv = global.NewHomeSource.FullImageViewer.Config.dataTdvAttributes;\r\n const getAttributeValue = global.NewHomeSource.FullImageViewer.Config.getAttributeValue;\r\n const isBasic = global.document.querySelector('[data-is-basic]').value === 'True';\r\n const communityVideoEvent = isBasic ? 'CDVID' : 'CDEVCT';\r\n const dataDetailInfo = {};\r\n for (let index = 0; index < dataAttributesTdv.length; index += 1) {\r\n const attribute = dataAttributesTdv[index];\r\n const value = getAttributeValue(attribute);\r\n if (value) {\r\n dataDetailInfo[attribute.replace('data-', '')] = value;\r\n }\r\n }\r\n\r\n const previousPerformanceEvents = global.NewHomeSource.FullImageViewer.PerformanceEvents;\r\n\r\n function isHome() {\r\n return global.document.querySelector('[data-is-community]').value === 'False';\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.PerformanceEvents\r\n */\r\n function PerformanceEvents() {\r\n }\r\n\r\n /**\r\n * @public\r\n *\r\n * PerformanceEvents: logs the video play action.\r\n */\r\n PerformanceEvents.logVideo = function logVideo() {\r\n if (typeof document.body.dispatchEvent === 'function') {\r\n const data = dataDetailInfo;\r\n data.label = isHome() ? 'HDEVCT' : communityVideoEvent;\r\n data.eventType = 'tdvEvent';\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data\r\n }\r\n }));\r\n }\r\n };\r\n\r\n PerformanceEvents.update = function update(data) {\r\n if (!data.IsFrame) {\r\n return;\r\n }\r\n\r\n let label = '';\r\n switch (data.Type) {\r\n case 'VWT':\r\n label = 'HDVTCT';\r\n break;\r\n\r\n case 'IFP':\r\n label = 'HDPVCT';\r\n break;\r\n\r\n default:\r\n }\r\n if (label === '') {\r\n return;\r\n }\r\n\r\n const eventData = dataDetailInfo;\r\n eventData.label = label;\r\n eventData.eventType = 'tdvEvent';\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: eventData\r\n }\r\n }));\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.PerformanceEvents to the previous script.\r\n */\r\n PerformanceEvents.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.PerformanceEvents = previousPerformanceEvents;\r\n return PerformanceEvents;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', PerformanceEvents);\r\n global.NewHomeSource.FullImageViewer.PerformanceEvents = PerformanceEvents;\r\n}(window));\r\n","(function segmentEvents(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.FullImageViewer.Config ||\r\n !global.NewHomeSource.Modules.tagManager) {\r\n return;\r\n }\r\n\r\n /*\r\n * Dependencies as\r\n * if (!global.NewHomeSource.SegmentEvents) {\r\n * return;\r\n * }\r\n */\r\n const previousSegmentEvents = global.NewHomeSource.SegmentEvents;\r\n\r\n const imageCollection = 'Community';\r\n const mapCollection = 'Map';\r\n const tourCollection = 'Tour';\r\n const interiorCollection = 'Interior';\r\n const exteriorCollection = 'Exterior';\r\n const floorPlanCollection = 'FloorPlan';\r\n\r\n /**\r\n * @constructs NewHomeSource.SegmentEvents\r\n */\r\n function SegmentEvents() {\r\n }\r\n\r\n SegmentEvents.update = function update(data) {\r\n const eventForSegment = {\r\n eventType: 'segmentEvent',\r\n };\r\n\r\n switch (data.Collection) {\r\n case imageCollection:\r\n eventForSegment.event = 'Community Image Displayed';\r\n eventForSegment.image_url = data.Source;\r\n eventForSegment.image_sequence = data.Index;\r\n break;\r\n case mapCollection:\r\n eventForSegment.event = 'Community Map Displayed';\r\n eventForSegment.map_id = data.Id;\r\n eventForSegment.map_sequence = data.Index;\r\n break;\r\n case tourCollection:\r\n eventForSegment.event = '3D tour Displayed';\r\n eventForSegment.tour_id = data.Id;\r\n eventForSegment.tour_sequnce = data.Index;\r\n break;\r\n case exteriorCollection:\r\n case interiorCollection:\r\n eventForSegment.event = 'Home Image Displayed';\r\n eventForSegment.image_url = data.Source;\r\n eventForSegment.image_type = data.Collection;\r\n eventForSegment.image_sequence = data.Index;\r\n break;\r\n case floorPlanCollection:\r\n eventForSegment.event = 'Floorplan Displayed';\r\n eventForSegment.floorplan_url = data.Source;\r\n eventForSegment.floorplan_type = data.Type;\r\n eventForSegment.floorplan_sequence = data.Index;\r\n break;\r\n default:\r\n return;\r\n }\r\n\r\n if (typeof document.body.dispatchEvent === 'function') {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: eventForSegment\r\n }\r\n }));\r\n }\r\n };\r\n\r\n SegmentEvents.logVideo = function logVideo(data) {\r\n const page = global.NewHomeSource.Modules.tagManager.getFromDataLayer('pageType');\r\n const eventForSegment = {\r\n event: page === 'Home_Detail' || page === 'Home_Detail_Basic' ? 'Home Video Played' : 'Community Video Played',\r\n eventType: 'segmentEvent',\r\n video_id: data.VideoId,\r\n video_sequence: data.Index,\r\n };\r\n\r\n if (typeof document.body.dispatchEvent === 'function') {\r\n document.body.dispatchEvent(new CustomEvent('trackOnDemandEvent', {\r\n detail: {\r\n data: eventForSegment\r\n }\r\n }));\r\n }\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.SegmentEvents to the previous script.\r\n */\r\n SegmentEvents.noConflict = function noConflict() {\r\n global.NewHomeSource.SegmentEvents = previousSegmentEvents;\r\n return SegmentEvents;\r\n };\r\n\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', SegmentEvents);\r\n global.NewHomeSource.FullImageViewer.SegmentEvents = SegmentEvents;\r\n}(window));\r\n","(function video(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n global.NewHomeSource.FullImageViewer = global.NewHomeSource.FullImageViewer || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerState ||\r\n !global.NewHomeSource.videoPlayers.vimeo.Player ||\r\n !global.NewHomeSource.videoPlayers.youtube.Player ||\r\n !global.NewHomeSource.videoPlayers.brightcove.Player ||\r\n !global.NewHomeSource.FullImageViewer.PerformanceEvents ||\r\n !global.NewHomeSource.FullImageViewer.SegmentEvents\r\n ) {\r\n return;\r\n }\r\n\r\n let imagesContainer = global.document.querySelector(global\r\n .NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n const previousVideo = global.NewHomeSource.FullImageViewer.Video;\r\n const videoContainer = global.document.createElement('div');\r\n const widthAttribute = 'width';\r\n const heightAttribute = 'height';\r\n const videoPlayers = {\r\n brightcove: global.NewHomeSource.videoPlayers.brightcove.Player,\r\n vimeo: global.NewHomeSource.videoPlayers.vimeo.Player,\r\n youtube: global.NewHomeSource.videoPlayers.youtube.Player,\r\n };\r\n let videoElement;\r\n\r\n /**\r\n * @private\r\n * displayVideo: attaches the video element to the DOM.\r\n *\r\n * @param {function} callback to execute after the video container was added to the DOM.\r\n */\r\n function displayVideo(callback) {\r\n imagesContainer = global.document.querySelector(global\r\n .NewHomeSource.FullImageViewer.Config.queryImagesContainer);\r\n\r\n if (!imagesContainer) {\r\n return;\r\n }\r\n\r\n videoContainer.innerHTML = '';\r\n imagesContainer.prepend(videoContainer);\r\n callback(this);\r\n }\r\n\r\n /**\r\n * @private\r\n * findPlayer: returns the JavaScript object that knows how to handle the given video.\r\n *\r\n * @param {object} data with the video information.\r\n */\r\n function findPlayer(data) {\r\n const playerName = data.VideoType.toLowerCase();\r\n return videoPlayers[playerName];\r\n }\r\n\r\n /**\r\n * @private\r\n * hideVideo: removes the video element from the DOM.\r\n */\r\n function hideVideo() {\r\n if (videoContainer.parentElement) {\r\n videoContainer.parentElement.removeChild(videoContainer);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * insertPlayer: creates the player inside the video container.\r\n *\r\n * @param {object} data with the video information.\r\n */\r\n function insertPlayer(data) {\r\n const playerToUse = findPlayer(data);\r\n const width = videoContainer.getAttribute(widthAttribute);\r\n const height = videoContainer.getAttribute(heightAttribute);\r\n\r\n const handler = {\r\n playOnLoaded: true,\r\n onPlaying() {\r\n global.NewHomeSource.FullImageViewer.PerformanceEvents.logVideo(data);\r\n global.NewHomeSource.FullImageViewer.SegmentEvents.logVideo(data);\r\n }\r\n };\r\n\r\n videoElement = playerToUse.createContainer(width, height);\r\n videoContainer.innerHTML = '';\r\n videoContainer.prepend(videoElement);\r\n playerToUse(videoElement.id, data.VideoId, handler);\r\n }\r\n\r\n /**\r\n * @private\r\n * setSizes: sets the width and height to the canvas element.\r\n */\r\n function setSizes(data) {\r\n videoContainer.style.width = data.width + 'px';\r\n videoContainer.style.height = data.height + 'px';\r\n videoContainer.setAttribute(widthAttribute, data.width);\r\n videoContainer.setAttribute(heightAttribute, data.height);\r\n }\r\n\r\n /**\r\n * @private\r\n * resize: sets new values for the width and height of the canvas element.\r\n */\r\n function resize(data) {\r\n setSizes(data);\r\n }\r\n\r\n /**\r\n * @private\r\n * handleResize: checks if the topic message indicates a resize action is needed.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n function handleResize(data, topic) {\r\n if (topic !== 'onResize') {\r\n return true;\r\n }\r\n\r\n requestAnimationFrame(resize.bind(null, data));\r\n return false;\r\n }\r\n\r\n /**\r\n * @private\r\n * render: creates and display the video object using the player.\r\n *\r\n * @param {object} data information of the object to be rendered.\r\n */\r\n function render(data) {\r\n requestAnimationFrame(displayVideo.bind(data, insertPlayer));\r\n return !!data;\r\n }\r\n\r\n /**\r\n * @private\r\n * shouldBeIgnored: hides the Video element if the current element does not have a video ID.\r\n *\r\n * @param {object} data information that was changed.\r\n */\r\n function shouldBeIgnored(data) {\r\n const isVideo = !!data.VideoId;\r\n\r\n if (!isVideo && videoContainer.parentElement) {\r\n hideVideo();\r\n }\r\n\r\n return isVideo;\r\n }\r\n\r\n /**\r\n * @constructs NewHomeSource.FullImageViewer.Video\r\n */\r\n function Video() {\r\n }\r\n\r\n /**\r\n * @public\r\n * update: this method will be called by the Event Bus when the data is updated.\r\n *\r\n * @param {object} data information that was changed.\r\n * @param {string} topic that was triggered by the Event Bus.\r\n */\r\n Video.update = function update(data, topic) {\r\n global.NewHomeSource.Pipe.conditionalPipe(handleResize, shouldBeIgnored, render)(data, topic);\r\n };\r\n\r\n /**\r\n * @public\r\n *\r\n * noConflict: Returns control of NewHomeSource.FullImageViewer.Video to the previous script.\r\n */\r\n Video.noConflict = function noConflict() {\r\n global.NewHomeSource.FullImageViewer.Video = previousVideo;\r\n return Video;\r\n };\r\n\r\n videoContainer.id = 'fullImageViewerVideoContainer';\r\n global.NewHomeSource.FullImageViewerState.add('onImageSet', Video);\r\n global.NewHomeSource.FullImageViewerState.add('onResize', Video);\r\n global.NewHomeSource.FullImageViewer.Video = Video;\r\n}(window));\r\n","(function index(global) {\r\n 'use strict';\r\n\r\n global.NewHomeSource = global.NewHomeSource || {};\r\n\r\n if (!global.NewHomeSource.FullImageViewerMain) {\r\n return;\r\n }\r\n\r\n global.NewHomeSource.FullImageViewerMain();\r\n}(window));\r\n"]}