PageSourceSearch

https://awasi.com/patagonia/wp-content/themes/awasi-twentyfive/ass…/js/dist/awasi-twentyfive.js?ver=1791560520

js awasi.com collected 2026-10-09 21:33:33 UTC 16,381 bytes, 451 lines download raw bytes

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, '&quot;') + '"' + 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.