{"version":3,"file":"js/hotel_gallery_modal-1b0b81d416eb4ab3ba3a.chunk.js","mappings":"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","sources":["webpack://cms-web/./app/frontend/src/shared/hotel_gallery_modal/ lazy ^\\.\\/.*\\.scss$ chunkName: [request] namespace object","webpack://cms-web/./app/frontend/src/shared/hotel_gallery_modal/hotel_gallery_modal.js","webpack://cms-web/./app/frontend/src/shared/hotel_gallery_modal/hotel_gallery_modal.analytics.js"],"sourcesContent":["var map = {\n\t\"./hotel_gallery_modal.scss\": [\n\t\t32947,\n\t\t50727\n\t],\n\t\"./hotel_gallery_modal_commons.scss\": [\n\t\t9298,\n\t\t21442\n\t],\n\t\"./hotel_gallery_modal_mobile.scss\": [\n\t\t28598,\n\t\t63868\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 28620;\nmodule.exports = webpackAsyncContext;","import Swiper from 'swiper'\nimport { Navigation, Pagination } from 'swiper/modules'\nimport YouTubePlayer from 'youtube-player'\n\nimport { currentDevice } from '../../core/utils/currentDevice'\nimport { buildCSSFileName } from '../../lazy_wrappers/lazy_assets_loader'\nimport BottomSheet from '../../shared/bottom_sheet/bottom_sheet'\nimport { PENDING_CLASS } from '../../utils/blocks_load_classes'\nimport { copyToClipboardNew } from '../../utils/copy_to_clipboard'\nimport on from '../../utils/events_delegation'\nimport inViewport from '../../utils/inViewport'\nimport fastbooking from '../fastbooking/ibh_fastbooking'\nimport { hideHeaderStickyHotel } from '../header_sticky_hotel/header_sticky_hotel'\nimport loaderSpinner from '../loader_spinner/loader_spinner'\nimport Modal from '../modal/modal'\n\nimport { initializeUtagEvents } from './hotel_gallery_modal.analytics'\n\nconst MODAL_GALLERY_SELECTOR = '.js-hotel-gallery-modal'\nconst MODAL_FULLSCREEN_GALLERY_SELECTOR = '.hotel-fullscreen-gallery-modal'\nconst MODAL_ID = 'hotel-gallery-modal'\nconst BLOCK_SELECTOR = '#hotel-gallery-modal'\nconst TRIGGER_SELECTOR = '.js-open-hotel-gallery'\nconst TRIGGER_FULLSCREEN_GALLERY = '.js-open-fullscreen-gallery'\nconst SWIPER_TEMPLATE_CLASS = 'external'\nconst FOOTER_MODAL_FULLSCREEN = '.hotel-gallery-image-caption'\nconst VIDEO_SELECTOR = '.js-video-youtube'\n\nlet swiper\nlet videoPlayers = []\n\n/**\n * Updates the footer description based on the active slide in the swiper.\n *\n * This function retrieves the description from the currently active slide in the swiper\n * and updates the content of a specified footer element within the gallery container.\n * If no description is found, the footer content will be cleared.\n *\n * @param {Object} swiper - The Swiper instance that contains the slides and the active index.\n * @param {HTMLElement} block - The block element from which the gallery container is derived.\n * @param {string} selector - The CSS selector used to find the footer element within the gallery container.\n */\nfunction updateFooterDescription(swiper, block, selector) {\n const { activeIndex, slides } = swiper\n const activeSlide = slides[activeIndex]\n\n if (!activeSlide) return\n\n const description = activeSlide.dataset.description || ''\n\n const footerDescription = block.closest('.js-gallery-container').querySelector(selector)\n\n if (footerDescription) {\n footerDescription.innerHTML = ''\n footerDescription.textContent = description\n }\n}\n\n/**\n * Initializes YouTube video players for each slide in the swiper.\n *\n * This function iterates over the swiper slides, checks if the slide contains a YouTube video iframe,\n * and initializes a YouTubePlayer instance for that iframe. The player instances are stored in an array\n * along with their respective slide index.\n *\n * @param {Object} swiper - The Swiper instance that contains the slides.\n */\nfunction initializeVideoPlayers(swiper) {\n videoPlayers = swiper.slides\n .map((slide, index) => {\n const iframe = slide.querySelector(VIDEO_SELECTOR)\n if (iframe) {\n const player = YouTubePlayer(iframe)\n return { player, index }\n }\n return null\n })\n .filter(player => player !== null)\n}\n\n/**\n * Handles the playback status of YouTube videos in the swiper.\n *\n * This function mutes and plays the video on the currently active slide and pauses the videos on\n * all other slides. It ensures that only the video on the active slide is playing.\n *\n * The videos start silently due to the policy of the browsers not to disturb the user.\n *\n * @param {Object} swiper - The Swiper instance that contains the slides and determines the active slide.\n */\nfunction handlerStatusVideo(swiper) {\n const activeIndex = swiper.activeIndex\n\n videoPlayers.forEach(({ player, index }) => {\n if (index === activeIndex) {\n // Mute and play the video on the active slide\n player.mute()\n player.playVideo().catch(error => {\n console.error('Error playing video:', error)\n })\n } else {\n // Pause the video on non-active slides\n player.pauseVideo()\n }\n })\n}\n\nasync function newSwiper(block, initialSlide) {\n const swiperContainer = `${block} .js-swiper-${SWIPER_TEMPLATE_CLASS}`\n const container = document.querySelector(swiperContainer)\n\n const galleryContainer = container.closest('.js-gallery-container')\n const swiperPagination = galleryContainer.querySelector('.js-gallery-image-footer .js-swiper-pagination')\n const swiperNavigationNext = container.querySelector(':scope > .js-swiper-button-next')\n const swiperNavigationPrev = container.querySelector(':scope > .js-swiper-button-prev')\n\n Swiper.use([Navigation, Pagination])\n\n swiper = new Swiper(container, {\n initialSlide: parseInt(initialSlide, 10),\n slidesPerView: 1,\n spaceBetween: 0,\n loop: false,\n pagination: {\n el: swiperPagination,\n type: 'custom',\n renderCustom(swiper, current, total) {\n // Templates\n const currentItem = swiperPagination.querySelector('.swiper-pagination-current')\n const totalItems = swiperPagination.querySelector('.swiper-pagination-total')\n\n // Add Template\n currentItem.innerHTML = current\n totalItems.innerHTML = total\n return swiperPagination.innerHTML\n },\n },\n navigation: {\n nextEl: swiperNavigationNext,\n prevEl: swiperNavigationPrev,\n },\n lazyPreloadPrevNext: 1,\n on: {\n init() {\n updateFooterDescription(this, galleryContainer, FOOTER_MODAL_FULLSCREEN)\n initializeVideoPlayers(this)\n handlerStatusVideo(this)\n },\n slideChange() {\n handlerStatusVideo(this)\n updateFooterDescription(this, galleryContainer, FOOTER_MODAL_FULLSCREEN)\n },\n },\n })\n}\n\nfunction initFullscreenGallery(block) {\n const allSlides = block?.querySelectorAll(TRIGGER_FULLSCREEN_GALLERY)\n if (!allSlides) return\n\n const triggerFullscreenGallery = Array.from(allSlides)\n triggerFullscreenGallery.forEach(element => {\n element.addEventListener('click', e => {\n const item = e.target.dataset.slideIndex || 0\n\n Modal.show('hotel-fullscreen-gallery-modal', {\n onShow: modal => {\n newSwiper(`#${modal.id}`, item)\n },\n onClose: () => {\n // Stop all videos and reset the state\n videoPlayers.forEach(({ player }) => player.stopVideo())\n videoPlayers = []\n\n // Reset initial slide values\n swiper.slideTo(0, 0)\n },\n awaitCloseAnimation: true,\n })\n })\n })\n}\n\nconst getOffsetTop = element => {\n if (!element) return 0\n return getOffsetTop(element.offsetParent) + element.offsetTop\n}\n\nfunction scrollTo(modal, destinationSelector) {\n const destinationElement = modal.querySelector(destinationSelector)\n\n if (!destinationElement) return\n\n const offsetTop = getOffsetTop(destinationElement)\n const headerHeight = modal.querySelector('.js-gallery-header').offsetHeight + 16\n const calculatedTop = offsetTop - headerHeight\n modal.querySelector('#hotel-gallery-modal-content').scrollTo({ top: calculatedTop, behavior: 'smooth' })\n}\n\nfunction initAnchorLinks() {\n const modal = document.querySelector(BLOCK_SELECTOR)\n\n if (!modal) return\n\n const links = modal.querySelectorAll('.js-gallery-anchor')\n\n links.forEach(link => {\n link.addEventListener('click', e => {\n e.preventDefault()\n const target = e.target\n const destination = target.getAttribute('href')\n\n scrollTo(modal, destination)\n })\n })\n\n // Set anchor link as active based on visible section\n modal.querySelectorAll('.js-gallery-section').forEach(section => {\n inViewport(\n section,\n element => {\n if (element.isIntersecting) {\n // Remove active class from old active menu item\n modal.querySelector(`.js-menu-item-in-bar.is-active`)?.classList.remove('is-active')\n\n // Add active class to current menu item\n modal\n .querySelector(`.js-gallery-anchor[href=\"#${section.id}\"]`)\n ?.closest('.menu_item')\n ?.classList.add('is-active')\n }\n },\n {\n threshold: 0.5,\n }\n )\n })\n}\n\nfunction initVideos() {\n const modal = document.querySelector(BLOCK_SELECTOR)\n\n if (!modal) return\n\n // Show video iframe and hide video picture block in mobile devices\n const videoContainer = modal.querySelector('.js-hotel-gallery-video-container')\n videoContainer?.querySelectorAll('.js-hotel-gallery-video').forEach(video => {\n const videoPicture = video.querySelector('.js-hotel-gallery-video-image')\n const videoIframe = video.querySelector('.js-hotel-gallery-video-iframe')\n videoPicture.addEventListener('click', () => {\n videoPicture.classList.add('hidden')\n videoIframe.classList.remove('hidden')\n })\n })\n}\n\nfunction initBottomSheet() {\n // Instantiate the class and init\n const showSheetBtn = document.querySelector('.js-show-sheet:not([data-bottom-sheet-initialized])')\n if (showSheetBtn) {\n new BottomSheet({\n showButton: showSheetBtn,\n })\n }\n\n // Copy url to clipboard function for bottom sheet link\n const copyUrlbutton = document.querySelector('.js-copy-to-clipboard')\n copyUrlbutton?.addEventListener('click', () => {\n const url = window.location\n copyToClipboardNew(url)\n })\n}\n\nfunction showModal(afterShowCallback = false) {\n Modal.show(MODAL_ID, {\n onShow(modal) {\n ScrollLock.on()\n afterShowCallback && afterShowCallback(modal)\n },\n onClose() {\n ScrollLock.off()\n },\n awaitCloseAnimation: true,\n })\n}\n\nfunction addDataIndexSlide(block) {\n const allSlides = block?.querySelectorAll(TRIGGER_FULLSCREEN_GALLERY)\n\n if (!allSlides) return\n\n allSlides.forEach((slide, index) => {\n slide.setAttribute('data-slide-index', index)\n })\n}\n\nfunction openGalleryModal(callback = false) {\n const block = document.querySelector(BLOCK_SELECTOR)\n\n initializeUtagEvents(block)\n\n if (block && block.querySelector(`.${PENDING_CLASS}`)) {\n loaderSpinner.show()\n const cssName = buildCSSFileName('hotel_gallery_modal')\n import(\n /* webpackChunkName: '[request]' */\n `./${cssName}.scss`\n )\n .then(() => {\n showModal(modal => {\n loaderSpinner.hide()\n\n const pendingElement = block.querySelector(`.${PENDING_CLASS}`)\n if (pendingElement) {\n pendingElement.classList.remove(PENDING_CLASS)\n }\n callback && callback(modal)\n })\n })\n .catch(() => {})\n } else {\n showModal(modal => {\n callback && callback(modal)\n })\n }\n\n initAnchorLinks()\n initVideos()\n initBottomSheet()\n addDataIndexSlide(block)\n\n // No fullscreen on mobile\n currentDevice.isMobile || initFullscreenGallery(block)\n}\n\nexport function openGallery(eventOrElement) {\n let target\n\n // Determining whether it is an event or a direct element\n // If it has event it is from Vue if not Vanilla\n if (eventOrElement instanceof Event) {\n eventOrElement.preventDefault()\n target = eventOrElement.target.closest(TRIGGER_SELECTOR)\n } else {\n target = eventOrElement\n }\n\n if (!target) return\n\n let galleryTagId\n const imageId = target.dataset.id\n\n if ('galleryTagId' in target.dataset) {\n galleryTagId = target.closest('.js-gallery-photos').dataset.galleryTagId\n }\n\n openGalleryModal(modal => {\n if (galleryTagId) {\n scrollTo(modal, `#gallery-tag-${galleryTagId}`)\n } else if (imageId) {\n scrollTo(modal, `#gallery-image-${imageId}`)\n }\n })\n}\n\nexport function init() {\n const galleryTriggers = document.querySelectorAll(TRIGGER_SELECTOR)\n\n if (!galleryTriggers) return\n\n galleryTriggers.forEach(trigger => {\n trigger.addEventListener('click', e => openGallery(e))\n })\n\n // Manage sticky fastbooking\n on({\n eventName: 'click',\n selector: `${MODAL_GALLERY_SELECTOR} .btn-floating-fastbooking, ${MODAL_FULLSCREEN_GALLERY_SELECTOR} .btn-floating-fastbooking`,\n handler() {\n Modal.closeAll()\n\n setTimeout(function () {\n fastbooking.openStickyFastbooking()\n\n if (!currentDevice.isMobile) {\n hideHeaderStickyHotel()\n fastbooking.openDates()\n }\n })\n },\n })\n}\n","import { getPageVariation } from '../../core/analytics/shared.analytics'\nimport { sendUtagEvent } from '../../core/analytics/utag_events'\nimport { cleaned_title } from '../../utils/utilities'\nimport { isDestiniaForm } from '../fastbooking/fastbooking.analytics'\n\nexport function initializeUtagEvents(gallery) {\n const fhiPageType = document.querySelector('html').dataset.fhiTest\n IB.VisitorSessionId.initNewVisitorSessionId()\n\n gallery?.querySelectorAll('.js-gallery-videos .hotel-gallery__slider .is-video').forEach(photoVideoElement => {\n photoVideoElement.addEventListener('click', () => {\n const name = 'hotel_multimedia_photos'\n const cat = 'hotel information'\n const act = 'see multimedia info'\n const lbl = 'photos'\n const purpose = 'inspiration'\n const structure = 'popup'\n sendUtagEvent({\n data: {\n event_name: name,\n event_cat: cat,\n event_act: act,\n event_lbl: lbl,\n event_purpose: purpose,\n event_structure: structure,\n page_variation: fhiPageType,\n page_images_clicked: '1',\n },\n })\n })\n })\n\n gallery?.querySelectorAll('.js-gallery-section .hotel-gallery__grid .is-tour').forEach(photoVideoElement => {\n photoVideoElement.addEventListener('click', () => {\n const name = 'hotel_multimedia_photos'\n const cat = 'hotel information'\n const act = 'see multimedia info'\n const lbl = 'photos'\n const purpose = 'inspiration'\n const structure = 'popup'\n sendUtagEvent({\n data: {\n event_name: name,\n event_cat: cat,\n event_act: act,\n event_lbl: lbl,\n event_purpose: purpose,\n event_structure: structure,\n page_variation: fhiPageType,\n page_images_clicked: '1',\n },\n })\n })\n })\n\n document.querySelector('.utag-floating-fastbooking')?.addEventListener(\n 'click',\n () => {\n const event_name = isDestiniaForm() ? 'searcher_flight_hotel' : 'searcher_hotel'\n const event_cat = isDestiniaForm() ? 'searcher fly' : 'searcher'\n const event_act = 'scroll to fastbooking'\n const event_purpose = 'booking'\n const event_lbl = 'popup'\n const event_structure = 'popup'\n const page_variation = getPageVariation()\n sendUtagEvent({\n data: {\n event_name,\n event_cat,\n event_act,\n event_lbl,\n event_purpose,\n event_structure,\n page_variation,\n },\n })\n },\n { once: true }\n )\n gallery\n ?.querySelectorAll('.js-gallery-section .hotel-gallery__grid .hotel-gallery__image-wrap')\n .forEach(photoVideoElement => {\n photoVideoElement.addEventListener('click', () => {\n const name = 'hotel_multimedia_photos'\n const cat = 'hotel information'\n const act = 'see multimedia info'\n const lbl = 'photos'\n const purpose = 'inspiration'\n const structure = 'popup'\n sendUtagEvent({\n data: {\n event_name: name,\n event_cat: cat,\n event_act: act,\n event_lbl: lbl,\n event_purpose: purpose,\n event_structure: structure,\n page_variation: fhiPageType,\n page_images_clicked: '1',\n },\n })\n })\n })\n\n gallery?.querySelectorAll('.utag-swiper-button-next, .utag-swiper-button-prev').forEach(arrowButtons => {\n arrowButtons.addEventListener('click', () => {\n const pageVariation = document.querySelector('html').dataset.fhiTest === undefined ? 'rational' : 'inmersive'\n sendUtagEvent({\n data: {\n event_name: 'hotel_multimedia_photos',\n event_cat: 'hotel information',\n event_act: 'see multimedia info',\n event_lbl: 'photos',\n event_purpose: 'inspiration',\n event_structure: 'popup',\n page_variation: pageVariation,\n },\n })\n })\n })\n\n // BOTTOM SHEET UTAG EVENT (MOBILE)\n const shareButton = gallery?.querySelector('.js-utag-share')\n shareButton?.addEventListener('click', e => {\n const hotelName = utag_data.hotel_name !== undefined ? cleaned_title(utag_data.hotel_name) : ''\n\n sendUtagEvent({\n data: {\n event_name: 'share_hotel',\n event_cat: 'hotel_information',\n event_act: 'share hotel',\n event_lbl: hotelName,\n event_structure: 'sticky',\n event_purpose: 'inspiration',\n },\n })\n })\n}\n"],"names":["map","webpackAsyncContext","req","__webpack_require__","o","Promise","resolve","then","e","Error","code","ids","id","keys","Object","module","exports","MODAL_GALLERY_SELECTOR","MODAL_FULLSCREEN_GALLERY_SELECTOR","MODAL_ID","BLOCK_SELECTOR","TRIGGER_SELECTOR","TRIGGER_FULLSCREEN_GALLERY","SWIPER_TEMPLATE_CLASS","FOOTER_MODAL_FULLSCREEN","VIDEO_SELECTOR","swiper","videoPlayers","updateFooterDescription","block","selector","activeIndex","slides","activeSlide","description","dataset","footerDescription","closest","querySelector","innerHTML","textContent","handlerStatusVideo","forEach","_ref","player","index","mute","playVideo","catch","error","console","pauseVideo","async","newSwiper","initialSlide","swiperContainer","container","document","galleryContainer","swiperPagination","swiperNavigationNext","swiperNavigationPrev","Swiper","use","Navigation","Pagination","parseInt","slidesPerView","spaceBetween","loop","pagination","el","type","renderCustom","current","total","currentItem","totalItems","navigation","nextEl","prevEl","lazyPreloadPrevNext","on","init","this","slide","iframe","YouTubePlayer","filter","initializeVideoPlayers","slideChange","getOffsetTop","element","offsetParent","offsetTop","scrollTo","modal","destinationSelector","destinationElement","calculatedTop","offsetHeight","top","behavior","showModal","afterShowCallback","arguments","length","undefined","Modal","show","onShow","ScrollLock","onClose","off","awaitCloseAnimation","openGalleryModal","callback","gallery","fhiPageType","fhiTest","IB","VisitorSessionId","initNewVisitorSessionId","querySelectorAll","photoVideoElement","addEventListener","sendUtagEvent","data","event_name","event_cat","event_act","event_lbl","event_purpose","event_structure","page_variation","page_images_clicked","isDestiniaForm","getPageVariation","once","arrowButtons","pageVariation","shareButton","hotelName","utag_data","hotel_name","cleaned_title","initializeUtagEvents","PENDING_CLASS","loaderSpinner","cssName","buildCSSFileName","hide","pendingElement","classList","remove","link","preventDefault","destination","target","getAttribute","section","inViewport","isIntersecting","add","threshold","initAnchorLinks","videoContainer","video","videoPicture","videoIframe","initVideos","showSheetBtn","BottomSheet","showButton","copyUrlbutton","url","window","location","copyToClipboardNew","initBottomSheet","allSlides","setAttribute","addDataIndexSlide","currentDevice","isMobile","Array","from","item","slideIndex","_ref2","stopVideo","slideTo","initFullscreenGallery","openGallery","eventOrElement","galleryTagId","Event","imageId","galleryTriggers","trigger","eventName","handler","closeAll","setTimeout","fastbooking","openStickyFastbooking","hideHeaderStickyHotel","openDates"],"sourceRoot":""}