1(function () { 2 3 if (typeof window.awasi === 'undefined') { 4 window.awasi = {}; 5 } 6 7 let recaptchaBadgeTimer; 8 9 /** 10 * Handle hover effect on footer links with custom colors. 11 * 12 * Set a custom CSS variable on the footer element when hovering over a link 13 * with custom background and foreground colors. 14 */ 15 window.awasi.handleFooterPropertyLinks = () => { 16 const footerElement = document.querySelector('.site-footer'); 17 const footerLinks = document.querySelectorAll('.site-footer__destionations-link'); 18 19 if (footerElement && footerLinks.length > 0) { 20 footerLinks.forEach(link => { 21 const backgroundColor = link.getAttribute('data-main-color'); 22 const foregroundColor = link.getAttribute('data-foreground-color'); 23 24 if (backgroundColor && foregroundColor) { 25 link.addEventListener('mouseenter', () => { 26 footerElement.style.setProperty('--_footer-background-color', 'var(' + backgroundColor + ')'); 27 footerElement.style.setProperty('--_footer-foreground-color', 'var(' + foregroundColor + ')'); 28 }); 29 30 link.addEventListener('mouseleave', () => { 31 footerElement.style.setProperty('--_footer-background-color', ''); 32 footerElement.style.setProperty('--_footer-foreground-color', ''); 33 }); 34 } 35 }); 36 } 37 } 38 39 /** 40 * Toggles the aria-expanded attribute of the footer destinations toggle button 41 * to show/hide the destinations list. 42 */ 43 window.awasi.handleFooterPropertyButton = () => { 44 const toggleButton = document.querySelector('.site-footer__destinations-toggle-button'); 45 const menuList = document.querySelector('.site-footer__destinations-list'); 46 47 if (toggleButton && menuList) { 48 toggleButton.addEventListener('click', (event) => { 49 event.preventDefault(); 50 const isExpanded = toggleButton.getAttribute('aria-expanded') === 'true'; 51 toggleButton.setAttribute('aria-expanded', !isExpanded); 52 }); 53 } 54 } 55 56 /** 57 * Toggles the is-scrolled class on the body element when the window's scrollY 58 * position exceeds 100px. 59 * 60 * @return {void} 61 */ 62 window.awasi.handleScroll = () => { 63 const isScrolled = window.scrollY > 100; 64 const hasDarkHeader = document.body.classList.contains('has-dark-header'); 65 66 document.body.classList.toggle('is-scrolled', isScrolled); 67 document.body.classList.add('is-recaptcha-badge-visible'); 68 clearTimeout(recaptchaBadgeTimer); 69 recaptchaBadgeTimer = setTimeout(() => { 70 document.body.classList.remove('is-recaptcha-badge-visible'); 71 }, 1200); 72 document.querySelector('.site-header__plan-trip-button').classList.toggle( 73 'awa-button--clear', 74 !isScrolled && !hasDarkHeader 75 ); 76 } 77 78 window.awasi.handleSkipLinkTarget = () => { 79 const mainElement = document.querySelector('main'); 80 81 if (!mainElement) { 82 return; 83 } 84 85 if (!mainElement.id) { 86 mainElement.id = 'main'; 87 } 88 89 if (!mainElement.hasAttribute('tabindex')) { 90 mainElement.setAttribute('tabindex', '-1'); 91 } 92 } 93 94 window.awasi.handleHeaderMenu = () => { 95 const menuToggleButton = document.querySelector('.site-header__menu-toggle'); 96 const headerNavigation = document.querySelector('.site-header__navigation'); 97 const headerElementsOutsideNavigation = document.querySelectorAll( 98 '.site-header__inner a, .site-header__inner button, .site-header__inner input, .site-header__inner select, .site-header__inner textarea, .site-header__inner [tabindex]' 99 ); 100 const setElementTabbable = (element, isTabbable) => { 101 if (element === menuToggleButton) { 102 return; 103 } 104 105 if (isTabbable) { 106 if (element.hasAttribute('data-awasi-original-tabindex')) { 107 const originalTabindex = element.getAttribute('data-awasi-original-tabindex'); 108 109 if (originalTabindex) { 110 element.setAttribute('tabindex', originalTabindex); 111 } else { 112 element.removeAttribute('tabindex'); 113 } 114 115 element.removeAttribute('data-awasi-original-tabindex'); 116 } 117 118 return; 119 } 120 121 if (!element.hasAttribute('data-awasi-original-tabindex')) { 122 element.setAttribute('data-awasi-original-tabindex', element.getAttribute('tabindex') || ''); 123 } 124 125 element.setAttribute('tabindex', '-1'); 126 }; 127 const setHeaderElementsOutsideNavigationState = (isExpanded) => { 128 headerElementsOutsideNavigation.forEach(element => { 129 setElementTabbable(element, !isExpanded); 130 }); 131 }; 132 const setHeaderNavigationState = (isExpanded) => { 133 if (!headerNavigation) { 134 return; 135 } 136 137 headerNavigation.toggleAttribute('inert', !isExpanded); 138 headerNavigation.setAttribute('aria-hidden', isExpanded ? 'false' : 'true'); 139 setHeaderElementsOutsideNavigationState(isExpanded); 140 }; 141 142 setHeaderNavigationState(false); 143 144 if (menuToggleButton) { 145 menuToggleButton.addEventListener('click', (event) => { 146 event.preventDefault(); 147 const isExpanded = menuToggleButton.getAttribute('aria-expanded') === 'true'; 148 const isScrolled = document.body.classList.contains('is-scrolled'); 149 const hasDarkHeader = document.body.classList.contains('has-dark-header'); 150 const buttonText = menuToggleButton.querySelector('.site-header__menu-toggle-text'); 151 const closeText = menuToggleButton.getAttribute('data-close-text'); 152 const defaultText = menuToggleButton.getAttribute('data-default-text'); 153 const planTripButton = document.querySelector('.site-header__plan-trip-button'); 154 155 if (buttonText && closeText && defaultText) { 156 buttonText.textContent = isExpanded ? defaultText : closeText; 157 } 158 159 menuToggleButton.setAttribute('aria-expanded', !isExpanded); 160 document.body.classList.toggle('is-menu-opened', !isExpanded); 161 setHeaderNavigationState(!isExpanded); 162 menuToggleButton.focus(); 163 planTripButton.classList.toggle('awa-button--clear', isExpanded && planTripButton && !hasDarkHeader && !isScrolled); 164 }); 165 } 166 167 const headerNavigationContent = document.querySelector('.site-header__navigation-content'); 168 169 const headerMenuItemToggles = document.querySelectorAll('.site-header__main-menu-nav-toggle'); 170
171 headerMenuItemToggles.forEach(toggle => { 172 toggle.addEventListener('click', (event) => { 173 event.preventDefault(); 174 const isExpanded = toggle.getAttribute('aria-expanded') === 'true'; 175 176 if (!isExpanded) { 177 headerMenuItemToggles.forEach(otherToggle => { 178 if (otherToggle !== toggle) { 179 otherToggle.setAttribute('aria-expanded', false); 180 otherToggle.closest('.site-header__main-menu-nav-item').classList.remove('is-opened'); 181 otherToggle.nextElementSibling.classList.add('is-hidden'); 182 } 183 }); 184 } 185 186 toggle.setAttribute('aria-expanded', !isExpanded); 187 toggle.nextElementSibling.classList.toggle('is-hidden', isExpanded); 188 toggle.closest('.site-header__main-menu-nav-item').classList.toggle('is-opened'); 189 190 }); 191 }); 192 193 const headerResortMenuToggle = document.querySelector('.is-resort-menu .site-header__main-menu-nav-toggle'); 194 if (headerResortMenuToggle) { 195 headerResortMenuToggle.addEventListener('click', (event) => { 196 event.preventDefault(); 197 198 if (headerNavigationContent) { 199 headerNavigationContent.classList.toggle('is-resort-menu-opened'); 200 } 201 }); 202 } 203 204 const mainMenu = document.querySelector('.site-header__main-menu-nav-list--level-0'); 205 206 if (mainMenu) { 207 const defaultImageUrl = mainMenu.getAttribute('data-image-url'); 208 const navigationImageDiv = document.querySelector('.site-header__navigation-image-list'); 209 210 if (navigationImageDiv && defaultImageUrl) { 211 const width = parseInt(mainMenu.getAttribute('data-image-width'), 10); 212 const height = parseInt(mainMenu.getAttribute('data-image-height'), 10); 213 const sizeAttrs = (Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0) ? ' width="' + width + '" height="' + height + '"' : ''; 214 215 navigationImageDiv.innerHTML = '<img src="' + defaultImageUrl + '" alt="Default menu image"' + sizeAttrs + ' class="site-header__navigation-image is-visible" data-id="main-image" />'; 216 } 217 } 218 219 const mainOptions = document.querySelectorAll('.site-header__main-menu-nav-item--level-0, .site-header__main-menu-nav-item--level-2'); 220 221 mainOptions.forEach(option => { 222 const imageUrl = option.getAttribute('data-image-url'); 223 const imageId = option.getAttribute('data-image-id'); 224 225 const altText = ((option.getAttribute('data-image-alt') || '').trim() || (option.querySelector('a')?.textContent || option.textContent || '')).replace(/\s+/g, ' ').trim(); 226 const width = parseInt(option.getAttribute('data-image-width'), 10); 227 const height = parseInt(option.getAttribute('data-image-height'), 10); 228 const sizeAttrs = (Number.isFinite(width) && width > 0 && Number.isFinite(height) && height > 0) ? ' width="' + width + '" height="' + height + '"' : ''; 229 230 const navigationImageDiv = document.querySelector('.site-header__navigation-image-list'); 231 232 if (navigationImageDiv && imageUrl && imageId) { 233 navigationImageDiv.innerHTML += '<img src="' + imageUrl + '" alt="' + altText.replace(/"/g, '"') + '"' + sizeAttrs + ' class="site-header__navigation-image" data-image-id="' + imageId + '" />'; 234 } 235 236 option.addEventListener('mouseenter', () => { 237 if (navigationImageDiv && imageUrl && imageId) { 238 const images = navigationImageDiv.querySelectorAll('.site-header__navigation-image:not([data-id="main-image"])'); 239 240 images.forEach(img => { 241 if (img.getAttribute('data-image-id') === imageId) { 242 img.classList.add('is-visible'); 243 } else { 244 img.classList.remove('is-visible'); 245 } 246 }); 247 } 248 }); 249 250 option.addEventListener('mouseleave', () => { 251 if (navigationImageDiv) { 252 const images = navigationImageDiv.querySelectorAll('.site-header__navigation-image:not([data-id="main-image"])'); 253 images.forEach(img => { 254 img.classList.remove('is-visible'); 255 }); 256 } 257 }); 258 }); 259 260 const resortLinks = document.querySelectorAll('.site-header__main-menu-nav-link--level-2'); 261 262 resortLinks.forEach(link => { 263 link.addEventListener('mouseenter', () => { 264 const foregroundColor = link.getAttribute('data-foreground-color'); 265 const backgroundColor = link.getAttribute('data-background-color'); 266 const contentClass = link.getAttribute('data-class'); 267 const siteHeader = document.querySelector('.site-header'); 268 const planTripButton = document.querySelector('.site-header__plan-trip-button'); 269 270 if (planTripButton) { 271 planTripButton.classList.add('awa-button--opposite'); 272 } 273 274 if (foregroundColor && backgroundColor && headerNavigationContent) { 275 headerNavigationContent.style.setProperty('--_navigation-fg-color', 'var(' + foregroundColor + ')'); 276 headerNavigationContent.style.setProperty('--_navigation-bg-color', 'var(' + backgroundColor + ')'); 277 } 278 279 if (contentClass && siteHeader) { 280 siteHeader.classList.add(contentClass);
281 siteHeader.classList.add('is-resort-menu-opened'); 282 } 283 284 }); 285 286 link.addEventListener('mouseleave', () => { 287 const contentClass = link.getAttribute('data-class'); 288 const siteHeader = document.querySelector('.site-header'); 289 const planTripButton = document.querySelector('.site-header__plan-trip-button'); 290 291 if (planTripButton) { 292 planTripButton.classList.remove('awa-button--opposite'); 293 } 294 295 if (headerNavigationContent) { 296 headerNavigationContent.style.setProperty('--_navigation-fg-color', ''); 297 headerNavigationContent.style.setProperty('--_navigation-bg-color', ''); 298 } 299 300 if (siteHeader && contentClass) { 301 siteHeader.classList.remove(contentClass); 302 siteHeader.classList.remove('is-resort-menu-opened'); 303 } 304 305 }); 306 }); 307 308 const languageSwitchers = document.querySelectorAll('.language-switcher__current'); 309 const languageSwitcherLists = document.querySelectorAll('.language-switcher__list'); 310 const setLanguageSwitcherState = (isExpanded) => { 311 languageSwitcherLists.forEach(list => { 312 list.toggleAttribute('inert', !isExpanded); 313 list.setAttribute('aria-hidden', isExpanded ? 'false' : 'true'); 314 }); 315 }; 316 317 setLanguageSwitcherState(false); 318 319 languageSwitchers.forEach(languageSwitcher => { 320 languageSwitcher.addEventListener('click', (event) => { 321 event.preventDefault(); 322 document.body.classList.toggle('is-language-switcher-opened'); 323 setLanguageSwitcherState(document.body.classList.contains('is-language-switcher-opened')); 324 }); 325 }); 326 327 // Handle GTranslate language links. 328 // Sub-directory mode (pro): base.js sets real hrefs, let the browser navigate. 329 // Cookie mode (free): set googtrans cookie and reload. 330 const languageLinks = document.querySelectorAll('.language-switcher a.nturl'); 331 languageLinks.forEach(link => { 332 link.addEventListener('click', (event) => { 333 document.body.classList.remove('is-language-switcher-opened'); 334 setLanguageSwitcherState(false); 335 336 const href = link.getAttribute('href'); 337 if (href && href !== '#') { 338 // Sub-directory mode: navigate to the URL set by base.js. 339 return; 340 } 341 342 // Cookie mode fallback. 343 event.preventDefault(); 344 const langCode = link.getAttribute('data-gt-lang'); 345 if (langCode) { 346 const defaultLang = document.documentElement.lang || 'en'; 347 document.cookie = 'googtrans=/' + defaultLang + '/' + langCode + '; path=/'; 348 document.cookie = 'googtrans=/' + defaultLang + '/' + langCode + '; path=/; domain=' + window.location.hostname; 349 window.location.reload(); 350 } 351 }); 352 }); 353 354 // if press ESC key close all menus 355 document.addEventListener('keydown', (event) => { 356 if (event.key === 'Escape') { 357 if (document.body.classList.contains('is-menu-opened')) { 358 menuToggleButton.click(); 359 } 360 document.body.classList.remove('is-language-switcher-opened'); 361 setLanguageSwitcherState(false); 362 } 363 }); 364 } 365 366 window.awasi.handleButtons = () => { 367 document.querySelectorAll('.awa-button').forEach(button => { 368 const backgroundImage = button.querySelector('.awa-button__button-background'); 369 if (!backgroundImage) { 370 const buttonText = button.textContent; 371 button.textContent = ''; 372 const textSpan = document.createElement('span'); 373 textSpan.classList.add('awa-button__button-text'); 374 textSpan.textContent = buttonText; 375 button.appendChild(textSpan); 376 377 const emptyButtonImage = document.createElement('span'); 378 emptyButtonImage.classList.add('awa-button__button-background'); 379 emptyButtonImage.classList.add('awa-button__button-background--default'); 380 button.prepend(emptyButtonImage); 381 const fullButtonImage = document.createElement('span'); 382 fullButtonImage.classList.add('awa-button__button-background'); 383 fullButtonImage.classList.add('awa-button__button-background--hover'); 384 button.prepend(fullButtonImage); 385 } 386 }); 387 } 388 389 window.awasi.showVideoModal = (video_url) => { 390 const videoModal = document.querySelector('.video-modal'); 391 const videoPlayer = videoModal.querySelector('.video-modal__player'); 392 const closeButton = videoModal.querySelector('.video-modal__close-button'); 393 394 if (videoModal && videoPlayer && closeButton) { 395 videoPlayer.src = video_url; 396 videoPlayer.load(); 397 videoPlayer.play(); 398 399 document.body.classList.add('show-video-modal'); 400 401 closeButton.addEventListener('click', (event) => { 402 event.preventDefault(); 403 videoPlayer.pause(); 404 videoPlayer.src = ''; 405 document.body.classList.remove('show-video-modal'); 406 }); 407 408 } 409 } 410 411 window.awasi.openBookingWidget = () => { 412 if (typeof window.bookNow === 'function') { 413 try { 414 window.bookNow(); 415 } catch (error) { 416 console.error('Error opening Selfbook widget:', error); 417 } 418 } else {
419 console.error('Selfbook widget not loaded (window.bookNow is not available)'); 420 } 421 } 422 423 window.awasi.handleBookingLinks = () => { 424 const bookingSelectors = [ 425 'a[href*="##booknow##"]', 426 '.site-header__plan-trip-button' 427 ]; 428 429 document.querySelectorAll(bookingSelectors.join(', ')).forEach(element => { 430 element.addEventListener('click', (event) => { 431 event.preventDefault(); 432 window.awasi.openBookingWidget(); 433 }); 434 }); 435 } 436 437 document.addEventListener("DOMContentLoaded", () => { 438 window.awasi.handleSkipLinkTarget(); 439 window.awasi.handleFooterPropertyLinks(); 440 window.awasi.handleFooterPropertyButton(); 441 window.awasi.handleHeaderMenu(); 442 window.awasi.handleButtons(); 443 window.awasi.handleBookingLinks(); 444 }); 445 446 window.addEventListener('scroll', () => { 447 window.awasi.handleScroll(); 448 }); 449})(); 450 451//# sourceMappingURL=awasi-twentyfive.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.