<!DOCTYPE html>
<html lang="en">
<head>

    <!-- Google tag (gtag.js) -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3LVTJJSRW0"></script>
    <script>
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());

        gtag('config', 'G-3LVTJJSRW0');
    </script>

    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Escape Game Finder – Find an available escape game tonight</title>
    <meta name="description" content="Find an available escape game tonight or tomorrow near you. Compare real-time availability across Europe.">
    <meta name="robots" content="index, follow">
    <link rel="canonical" href="https://escapegamefinder.com/sitemap.xml">

    <!-- Open Graph -->
    <meta property="og:type" content="website">
    <meta property="og:site_name" content="Escape Game Finder">
    <meta property="og:title" content="Escape Game Finder – Find an available escape game tonight">
    <meta property="og:description" content="Find an available escape game tonight or tomorrow near you. Compare real-time availability across Europe.">
    <meta property="og:url" content="https://escapegamefinder.com/sitemap.xml">
    <meta property="og:locale" content="en_GB">

    <!-- Twitter Card -->
    <meta name="twitter:card" content="summary">
    <meta name="twitter:title" content="Escape Game Finder – Find an available escape game tonight">
    <meta name="twitter:description" content="Find an available escape game tonight or tomorrow near you. Compare real-time availability across Europe.">

    <!-- JSON-LD -->
    <script type="application/ld+json">{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Escape Game Finder",
  "url": "https://escapegamefinder.com",
  "description": "Find an available escape game tonight or tomorrow near you. Compare real-time availability across Europe.",
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "https://escapegamefinder.com/sitemap.xml/search?city={city}"
    },
    "query-input": "required name=city"
  }
}</script>

    <link rel="stylesheet" href="/css/mycss1.css;jsessionid=E704359B50C30B94BA26B0486C69842C" />
    <link rel="stylesheet" href="/css/mycss2.css;jsessionid=E704359B50C30B94BA26B0486C69842C" />
    <link rel="stylesheet" href="/css/mycss3.css;jsessionid=E704359B50C30B94BA26B0486C69842C" />
    <link rel="stylesheet" href="/css/contact.css;jsessionid=E704359B50C30B94BA26B0486C69842C" />
    <link rel="stylesheet" href="/css/videogames.css;jsessionid=E704359B50C30B94BA26B0486C69842C" />
    <link rel="stylesheet" href="/css/tower-defense.css;jsessionid=E704359B50C30B94BA26B0486C69842C">


    <!-- Google Tag Manager -->
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
            new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-M73RCHFH');</script>
    <!-- End Google Tag Manager -->

</head>

<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-05H89T9N96"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'G-05H89T9N96');
    gtag('config', 'AW-1007693020');
</script>
<body>
<!-- Header -->


<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-M73RCHFH"
                  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->

<!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-05H89T9N96"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-05H89T9N96'); </script>



<header>
    <div class="header-container">
        <a href="/en;jsessionid=E704359B50C30B94BA26B0486C69842C" class="logo">
            <div class="logo-icon"></div>
            <span class="logo-text">Escape Game</span>
            <span class="logo-text-dark">Finder</span>
        </a>

        <!-- Burger -->
        <button class="burger" id="burgerBtn" aria-label="Menu">
            <span></span>
            <span></span>
            <span></span>
        </button>


        <nav id="navMenu">
            <a href="#escapes-games">Escape Games</a>
            <div class="nav-dropdown">
                <button class="nav-dropdown-toggle" aria-expanded="false" aria-haspopup="true">
                    <span>Video Games</span>
                    <svg class="dropdown-chevron" width="12" height="12" viewBox="0 0 12 12" fill="none">
                        <path d="M2 4l4 4 4-4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
                    </svg>
                </button>
                <ul class="nav-dropdown-menu" role="menu">
                    <li role="none">
                        <a href="/en/videogames;jsessionid=E704359B50C30B94BA26B0486C69842C" role="menuitem">Jeux</a>
                    </li>
                    <li role="none">
                        <a href="/en/solutions;jsessionid=E704359B50C30B94BA26B0486C69842C" role="menuitem">Solutions</a>
                    </li>
                </ul>
            </div>
            <a href="/en/about;jsessionid=E704359B50C30B94BA26B0486C69842C">About</a>
            <a href="/en/contact;jsessionid=E704359B50C30B94BA26B0486C69842C" class="connexion-btn">Contact</a>


<!--            <nav class="lang-switch">-->
<!--                <a th:each="lang : ${allLanguages}"-->
<!--                   th:href="@{/{l}(l=${lang})}"-->
<!--                   th:classappend="${language} == ${lang} ? 'active' : ''">-->
<!--                    <img  loading="lazy" th:src="${flagUrls[__${lang}__]}" width="28" th:alt="${changerDeLangue } + ' ' + ${lang}">-->
<!--                </a>-->
<!--            </nav>-->

            <!-- Language button -->
            <button class="lang-btn" id="openLangModal">
                <img src="https://hatscripts.github.io/circle-flags/flags/gb.svg" alt="Lang" />
                <span>EN</span>
            </button>

        </nav>
    </div>
</header>



<div class="layout-page">

    <div>


    <!-- Hero Section -->

    <section class="hero">

    <!-- Ambient orbs -->
    <div class="hero-orb hero-orb-1"></div>
    <div class="hero-orb hero-orb-2"></div>

    <div class="hero-container">

        <!-- Label chip -->
        <div class="hero-label">
            <span>🔐</span>
            <span>Escape Game Finder</span>
        </div>

        <!-- Title (injected from i18n as HTML) -->
        <div><h1>QUICKLY FIND AN AVAILABLE <span class="highlight">ESCAPE GAME</span></h1></div>

        <!-- Subtitle -->
        <p>Puzzles, Adventure, Thrills at your fingertips!</p>

        <!-- ── SEARCH WIDGET ── -->
        <form action="/en/search;jsessionid=E704359B50C30B94BA26B0486C69842C" method="post" id="searchForm">

            <div class="search-widget">

                <!-- Filter tabs -->
                <div class="search-tabs">
                    <button type="button" class="search-tab filter-btn active" data-filter="ce-soir">
                        <span class="filter-icon clock-icon"></span>
                        <span>TONIGHT</span>
                    </button>
                    <button type="button" class="search-tab filter-btn inactive" data-filter="demain-soir">
                        <span class="filter-icon moon-icon"></span>
                        <span>TOMORROW NIGHT</span>
                    </button>
                    <button type="button" class="search-tab filter-btn inactive" data-filter="autre-date" id="autreDateBtn">
                        <span class="filter-icon calendar-icon"></span>
                        <span>OTHER DATE</span>
                    </button>
                </div>

                <!-- City + Search row -->
                <div class="search-bar-row">

                    <!-- City picker -->
                    <button type="button" class="city-picker-btn filter-btn inactive" data-filter="ville">
                        <span class="city-icon">📍</span>
                        <div class="city-text">
                            <span class="city-label">Destination</span>
                            <span class="city-name" id="cityDisplayName">Columbus</span>
                        </div>
                        <svg class="city-chevron" viewBox="0 0 24 24" width="15" height="15" fill="none"
                             stroke="currentColor" stroke-width="2.5"
                             stroke-linecap="round" stroke-linejoin="round">
                            <polyline points="6 9 12 15 18 9"/>
                        </svg>
                    </button>

                    <!-- Search CTA -->
                    <button class="search-submit-btn" type="submit">
                        <svg viewBox="0 0 24 24" width="17" height="17" fill="none"
                             stroke="currentColor" stroke-width="2.5"
                             stroke-linecap="round" stroke-linejoin="round">
                            <circle cx="11" cy="11" r="8"/>
                            <line x1="21" y1="21" x2="16.65" y2="16.65"/>
                        </svg>
                        <span>SEARCH</span>
                    </button>

                </div>
            </div>

            <!-- Hidden form inputs -->
            <input type="hidden" name="dateOption" id="dateOptionInput">
            <input type="hidden" name="city"       id="cityInput">
            <input type="hidden" name="country"    id="countryInput">
            <input type="hidden" name="date"       id="dateHidden">
            <input type="hidden" name="time"       id="timeHidden">
            <input type="hidden" name="timezone"   id="timezoneInput">
            <input type="hidden" name="latitude"   id="latitudeInput">
            <input type="hidden" name="longitude"  id="longitudeInput">

        </form>

    </div>
</section>


    <script defer src="/js/search.js;jsessionid=E704359B50C30B94BA26B0486C69842C">

    </script>


</div>

</div>




<script>
    async function getLocation() {



        if (!navigator.geolocation) {
            alert("Géolocalisation non supportée");
            return;
        }

        navigator.geolocation.getCurrentPosition(
            async (position) => {
                try {
                    // (optionnel UX) feedback utilisateur
                    const btn = document.querySelector('button[onclick="getLocation()"]');
                    if (btn) {
                        btn.disabled = true;
                        btn.textContent = "Détection en cours...";
                    }

                    // Appel backend
                    const res = await fetch('/location', {
                        method: 'POST',
                        credentials: 'same-origin',
                        headers: { 'Content-Type': 'application/json' },
                        body: JSON.stringify({
                            latitude: position.coords.latitude,
                            longitude: position.coords.longitude
                        })
                    });

                    localStorage.setItem('locationMode', 'geo');


                    if (!res.ok) {
                        throw new Error("HTTP " + res.status);
                    }

                    const data = await res.json(); // { country, city }

                    userLatitude = position.coords.latitude;
                    userLongitude = position.coords.longitude;

                    // Use selectCity function with geolocation data
                    if (data.city) {
                        selectCity(data.city, data.country, getCountryLabel(data.country), true);
                    }

                    // Fermer la popup
                    closeCityModal();

                } catch (e) {
                    console.error("Erreur JS :", e);
                    alert("Impossible de détecter la ville/pays.");
                } finally {
                    // Rétablir le bouton
                    const btn = document.querySelector('button[onclick="getLocation()"]');
                    if (btn) {
                        btn.disabled = false;
                        // btn.textContent = "📍 Partager ma position";
                    }
                }
            },
            (error) => {
                console.error("Erreur de géolocalisation", error);

                if (error.code === 1) {
                    showGeoDenied();
                } else {
                    showGeoDenied('other');
                }
            }
        );

        const block = document.getElementById('manualCitySelection');
        block?.classList.remove('show');

    }

    function showGeoDenied(type) {
        const banner  = document.getElementById('geo-denied-banner');
        const steps   = document.getElementById('geo-denied-steps');
        const actions = document.getElementById('geo-modal-actions');
        if (!banner || !steps) return;

        const s = (id) => document.getElementById(id)?.innerHTML || '';

        const ua = navigator.userAgent.toLowerCase();
        let browserSteps;

        if (type === 'other') {
            browserSteps = [s('gd-other-1'), s('gd-other-2')];
        } else if (ua.includes('firefox')) {
            browserSteps = [s('gd-firefox-1'), s('gd-firefox-2'), s('gd-firefox-3'), s('gd-firefox-4')];
        } else if (ua.includes('safari') && !ua.includes('chrome')) {
            browserSteps = [s('gd-safari-1'), s('gd-safari-2'), s('gd-safari-3'), s('gd-safari-4')];
        } else {
            browserSteps = [s('gd-chrome-1'), s('gd-chrome-2'), s('gd-chrome-3')];
        }

        steps.innerHTML = browserSteps.map((text, i) =>
            `<div class="geo-step"><span class="geo-step-num">${i + 1}</span><span class="geo-step-text">${text}</span></div>`
        ).join('');
        banner.style.display = 'block';
        if (actions) actions.style.display = 'none';
    }

    function hideGeoDenied() {
        const banner  = document.getElementById('geo-denied-banner');
        const actions = document.getElementById('geo-modal-actions');
        if (banner)  banner.style.display  = 'none';
        if (actions) actions.style.display = '';
    }
</script>



<!-- Popular Section -->
<section class="popular-section">
    <div class="popular-container">
        <h2 class="popular-title">Popular escape games</h2>
        <!-- Content will go here -->
    </div>
</section>

<!-- ================================================================ -->
<!-- PUBLICITÉ — Batman Escape                                         -->
<!-- ================================================================ -->
<section class="batman-ad-section" aria-label="Publicité sponsorisée — Batman Escape">

    <!-- Lien couvrant toute la section -->
    <a class="batman-ad-fulllink"
       href="https://c3po.link/QwsdwxmUzf"
       target="_blank"
       rel="noopener sponsored"
       aria-label="Batman Escape — Réserver maintenant"></a>

    <!-- Bats flottants en arrière-plan -->
    <div class="batman-bg-bats" aria-hidden="true">
        <span class="batman-bat bat-1">🦇</span>
        <span class="batman-bat bat-2">🦇</span>
        <span class="batman-bat bat-3">🦇</span>
        <span class="batman-bat bat-4">🦇</span>
    </div>

    <div class="batman-ad-inner">
        <div class="batman-ad-grid">

            <!-- Colonne gauche : texte + CTA -->
            <div class="batman-ad-content">

                <div class="batman-ad-badge">
                    <span class="batman-badge-dot"></span>
                    Partenaire sponsorisé
                </div>

                <h2 class="batman-ad-title">
                    <span class="batman-logo-sym" aria-hidden="true">🦇</span>
                    Batman<br>Escape
                </h2>

                <p class="batman-ad-tagline">L'aventure ultime t'attend dans les ombres de Gotham</p>

                <p class="batman-ad-desc">
                    Plonge dans l'univers sombre du Chevalier Noir. Tu as 60 minutes pour déjouer
                    les plans du Joker et sauver Gotham City. Une expérience immersive, intense
                    et inoubliable pour toute l'équipe.
                </p>

                <div class="batman-ad-stats">
                    <div class="batman-stat">
                        <span class="batman-stat-value">60</span>
                        <span class="batman-stat-label">minutes</span>
                    </div>
                    <div class="batman-stat-sep"></div>
                    <div class="batman-stat">
                        <span class="batman-stat-value">2–6</span>
                        <span class="batman-stat-label">joueurs</span>
                    </div>
                    <div class="batman-stat-sep"></div>
                    <div class="batman-stat">
                        <span class="batman-stat-value">★ 4.9</span>
                        <span class="batman-stat-label">avis</span>
                    </div>
                    <div class="batman-stat-sep"></div>
                    <div class="batman-stat">
                        <span class="batman-stat-value">Expert</span>
                        <span class="batman-stat-label">difficulté</span>
                    </div>
                </div>

                <div class="batman-ad-actions">
                    <a href="https://c3po.link/QwsdwxmUzf" class="batman-ad-cta" target="_blank" rel="noopener sponsored">
                        <span>Réserver maintenant</span>
                        <svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true">
                            <path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" stroke-width="2"
                                  stroke-linecap="round" stroke-linejoin="round"/>
                        </svg>
                    </a>
                    <span class="batman-ad-hint">Places limitées · Disponible dès maintenant</span>
                </div>

            </div>

            <!-- Colonne droite : visuel -->
            <div class="batman-ad-visual">
                <a class="batman-ad-img-wrap"
                   href="https://c3po.link/QwsdwxmUzf"
                   target="_blank"
                   rel="noopener sponsored"
                   aria-label="Batman Escape — Voir l'expérience">
                    <img src="https://batman-escape-assets-2.cdn.ooeo.net/ZfgavMmUzjad_UTP_PSR18419Art.jpg?auto=format%2Ccompress&rect=816%2C0%2C1100%2C1281&w=320"
                          alt="Batman Escape — Salle d'escape game immersive thème Gotham"
                         class="batman-ad-img"
                         loading="lazy">
                    <div class="batman-img-overlay" aria-hidden="true"></div>
                    <div class="batman-symbol-bg" aria-hidden="true">🦇</div>
                    <div class="batman-ad-price-tag">
                        <span class="batman-price-from">Jusqu'à</span>
                        <span class="batman-price-amount">6</span>
                        <span class="batman-price-per">Joueurs</span>
                    </div>
                    <div class="batman-img-cta-hint" aria-hidden="true">
                        <svg width="14" height="14" viewBox="0 0 16 16" fill="none">
                            <path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" stroke-width="2"
                                  stroke-linecap="round" stroke-linejoin="round"/>
                        </svg>
                        Voir l'expérience
                    </div>
                </a>
            </div>

        </div>
    </div>
</section>



<!-- ========================= -->
<!-- Publicité livre Amazon -->
<!-- ========================= -->
<!--<section class="amazon-ad-section" th:if="${publicite != null}">-->
<!--    <div class="amazon-ad-container">-->

<!--        <h2 class="amazon-ad-title" th:text="${publicite.name}">Livre recommandé</h2>-->

<!--        <div class="amazon-ad-grid">-->
<!--            &lt;!&ndash; Image + bouton &ndash;&gt;-->
<!--            <a class="amazon-ad-book" th:href="${publicite.url}" target="_blank" rel="noopener">-->
<!--                <img class="amazon-ad-book-img" th:src="${publicite.imageUrl}" alt="Livre Amazon">-->
<!--                <div class="amazon-ad-cta">Voir sur Amazon</div>-->
<!--            </a>-->

<!--            &lt;!&ndash; Avis + video &ndash;&gt;-->
<!--            <div class="amazon-ad-content">-->
<!--                <div class="amazon-ad-rating-row">-->
<!--                    <div class="amazon-ad-subtitle">Avis</div>-->

<!--                    <a class="amazon-ad-video"-->
<!--                       th:if="${publicite.urlVideo != null && !#strings.isEmpty(publicite.urlVideo)}"-->
<!--                       th:href="${publicite.urlVideo}"-->
<!--                       target="_blank" rel="noopener">-->
<!--                        🎥 Voir la vidéo-->
<!--                    </a>-->
<!--                </div>-->

<!--                &lt;!&ndash; Carousel avis &ndash;&gt;-->
<!--                <div class="avis-carousel" id="avisCarousel" th:if="${publicite.publicitesAvis != null && !publicite.publicitesAvis.isEmpty()}">-->
<!--                    <button class="avis-btn prev" type="button" onclick="prevAvis()">‹</button>-->

<!--                    <div class="avis-slides">-->
<!--                        <div class="avis-slide"-->
<!--                             th:each="avis,iter : ${publicite.publicitesAvis}"-->
<!--                             th:classappend="${iter.index == 0} ? 'active' : ''">-->
<!--                            <div class="avis-note">-->
<!--                                <span th:text="${avis.note}">4.8</span>/5 ⭐-->
<!--                            </div>-->
<!--                            <p class="avis-desc" th:text="${avis.dessription}">-->
<!--                                Livre incroyable, super clair !-->
<!--                            </p>-->
<!--                        </div>-->
<!--                    </div>-->

<!--                    <button class="avis-btn next" type="button" onclick="nextAvis()">›</button>-->
<!--                </div>-->

<!--                &lt;!&ndash; Galerie images &ndash;&gt;-->
<!--                <div class="amazon-gallery" th:if="${publicite.images != null && !publicite.images.isEmpty()}">-->
<!--                    <div class="amazon-gallery-title">Galerie</div>-->

<!--                    <div class="amazon-gallery-row">-->
<!--                        <img th:each="img,iter : ${publicite.images}"-->
<!--                             th:src="${img}"-->
<!--                             class="amazon-gallery-img"-->
<!--                             th:attr="data-index=${iter.index}"-->
<!--                             onclick="openGalleryModal(this)">-->
<!--                    </div>-->
<!--                </div>-->

<!--            </div>-->
<!--        </div>-->
<!--    </div>-->
<!--</section>-->


<section class="amazon-ad-section">
    <div class="amazon-ad-container">

        <!-- Enhanced header with category badge -->
        <div class="ad-header">
            <span class="ad-badge">category</span>
            <h2 class="amazon-ad-title">Escape Game Interactif à l’École de Sorcellerie</h2>
        </div>

        <div class="amazon-ad-grid">

            <!-- Enhanced book card with hover effects -->
            <div class="amazon-ad-book-wrapper">
                <a class="amazon-ad-book" href="https://www.amazon.fr/Alraz-Interactif-Sorcellerie-aventures-immersives-ebook/dp/B0CXJSKFLG" target="_blank" rel="noopener">
                    <div class="book-image-container">
                        <img class="amazon-ad-book-img"
                             src="https://m.media-amazon.com/images/I/81FnulGOi2L._SL1500_.jpg"
                             alt="Escape Game Interactif à l’École de Sorcellerie"
                             loading="lazy">
                        <div class="image-overlay">
                            <span class="overlay-text">View details</span>
                        </div>
                    </div>
                    <div class="amazon-ad-cta">
                        <span class="cta-icon">🛒</span>
                        <span>View on Amazon</span>
                    </div>
                </a>

<!--                &lt;!&ndash; Price display if available &ndash;&gt;-->
<!--                <div class="price-tag" th:if="${publicite.price}">-->
<!--                    <span class="price-amount" th:text="${publicite.price}">19,99 €</span>-->
<!--                </div>-->
            </div>

            <!-- Enhanced content section -->
            <div class="amazon-ad-content">

                <!-- Rating & Video row with better layout -->
                <div class="amazon-ad-rating-row">
                    <div class="rating-header">
                        <div class="amazon-ad-subtitle">Customer reviews</div>
                        <div class="rating-summary" >
                            <span class="rating-stars">⭐⭐⭐⭐⭐</span>
                            <span class="rating-count">245 avis</span>
                        </div>
                    </div>

                    

                    <a class="connexion-btn" style="color: black"
                       href="https://www.amazon.fr/Alraz-Interactif-Sorcellerie-aventures-immersives-ebook/dp/B0CXJSKFLG" target="_blank" rel="noopener">
                        <span>View on Amazon</span>
                    </a>
                </div>

                <!-- Enhanced carousel with better navigation -->
                <div class="avis-carousel"
                     id="avisCarousel">

                    <div class="carousel-header">
                        <div class="carousel-indicators">
                            <span class="indicator active"
                                  onclick="goToAvis(this)" data-index="0"></span><span class="indicator"
                                  onclick="goToAvis(this)" data-index="1"></span><span class="indicator"
                                  onclick="goToAvis(this)" data-index="2"></span>
                        </div>
                    </div>

                    <div class="avis-slides">
                        <div class="avis-slide active">

                            <div class="avis-header">
                                <div class="avis-note">
                                    <span class="note-value">5.0</span>
                                    <span class="note-max">/5</span>
                                    <span class="stars-display">⭐</span>
                                </div>
<!--                                <div class="avis-author" th:if="${avis.author}" th:text="${avis.author}">Jean D.</div>-->
                            </div>

                            <p class="avis-desc">Les illustrations sont superbes et le jeu me semble très complet J&#39;ai bien aimé le côté interactif avec les QR codes et les énigmes à résoudre. C&#39;est bien pour les enfants mais je pense qu&#39;il est plus intéressant de le faire en famille pour vraiment en profiter pleinement. Certaines éngimes sont difficiles et ensemble, c&#39;est tout simplement plus fun.</p>

<!--                            <div class="avis-date" th:if="${avis.date}" th:text="${avis.date}">12 janvier 2025</div>-->
                            <div class="avis-date" >12 janvier 2025</div>
                        </div>
                        <div class="avis-slide">

                            <div class="avis-header">
                                <div class="avis-note">
                                    <span class="note-value">5.0</span>
                                    <span class="note-max">/5</span>
                                    <span class="stars-display">⭐</span>
                                </div>
<!--                                <div class="avis-author" th:if="${avis.author}" th:text="${avis.author}">Jean D.</div>-->
                            </div>

                            <p class="avis-desc">J’ai beaucoup apprécié ce livre-escape game pour son univers de sorcellerie très immersif et ses énigmes intelligentes. J’ai aimé résoudre les défis, décoder les runes et utiliser le smartphone pour avancer dans l’histoire. C’est ludique, original et captivant, aussi bien pour jouer seul qu’en famille.</p>

<!--                            <div class="avis-date" th:if="${avis.date}" th:text="${avis.date}">12 janvier 2025</div>-->
                            <div class="avis-date" >12 janvier 2025</div>
                        </div>
                        <div class="avis-slide">

                            <div class="avis-header">
                                <div class="avis-note">
                                    <span class="note-value">4.8</span>
                                    <span class="note-max">/5</span>
                                    <span class="stars-display">⭐</span>
                                </div>
<!--                                <div class="avis-author" th:if="${avis.author}" th:text="${avis.author}">Jean D.</div>-->
                            </div>

                            <p class="avis-desc">Perso, je comprends rien aux escape games. Je l’ai pris pour mon fils, qui lui m’en a dit du bien, et ça l’a bien occupé, donc je fais passer sa recommandation ! Pour ma part, tout ce que je peux dire, c’est que je l’ai feuilleté et que, en tout cas, les illustrations sont jolies.</p>

<!--                            <div class="avis-date" th:if="${avis.date}" th:text="${avis.date}">12 janvier 2025</div>-->
                            <div class="avis-date" >12 janvier 2025</div>
                        </div>
                    </div>

                    <button class="avis-btn prev"
                            type="button"
                            onclick="prevAvis()"
                            aria-label="Avis précédent">
                        <span>‹</span>
                    </button>
                    <button class="avis-btn next"
                            type="button"
                            onclick="nextAvis()"
                            aria-label="Avis suivant">
                        <span>›</span>
                    </button>
                </div>

                <!-- Gallery with thumbnails grid -->
                <div class="amazon-gallery">
                    <div class="amazon-gallery-header">
                        <div class="amazon-gallery-title">
                            <span class="gallery-icon">🖼️</span>
                            <span>Photo gallery</span>
                        </div>
                        <span class="gallery-count">4 images</span>
                    </div>

                    <div class="amazon-gallery-grid">
                        <!-- Show first 4 images (or less if fewer exist) -->
                        
                            <div class="gallery-item"
                                 onclick="openGalleryModalAtIndex(0)" data-index="0">
                                <img src="https://m.media-amazon.com/images/S/aplus-media-library-service-media/b06a1437-a4cb-446a-8637-e2bbcb34399d.__CR0,0,970,600_PT0_SX970_V1___.jpg"
                                     class="amazon-gallery-img"
                                     alt="Image 1"
                                     loading="lazy" data-index="0">
                                <div class="gallery-item-overlay">
                                    <span class="zoom-icon">🔍</span>
                                </div>
                            </div>
                        
                            <div class="gallery-item"
                                 onclick="openGalleryModalAtIndex(1)" data-index="1">
                                <img src="https://m.media-amazon.com/images/S/aplus-media-library-service-media/354212c3-ebc4-48e6-9c8e-d780fbd0164b.__CR0,0,970,600_PT0_SX970_V1___.jpg"
                                     class="amazon-gallery-img"
                                     alt="Image 2"
                                     loading="lazy" data-index="1">
                                <div class="gallery-item-overlay">
                                    <span class="zoom-icon">🔍</span>
                                </div>
                            </div>
                        
                            <div class="gallery-item"
                                 onclick="openGalleryModalAtIndex(2)" data-index="2">
                                <img src="https://m.media-amazon.com/images/S/aplus-media-library-service-media/5239fc3b-edbf-4309-ab7e-f5a617b2f5a0.__CR0,0,970,600_PT0_SX970_V1___.jpg"
                                     class="amazon-gallery-img"
                                     alt="Image 3"
                                     loading="lazy" data-index="2">
                                <div class="gallery-item-overlay">
                                    <span class="zoom-icon">🔍</span>
                                </div>
                            </div>
                        
                            <div class="gallery-item"
                                 onclick="openGalleryModalAtIndex(3)" data-index="3">
                                <img src="https://m.media-amazon.com/images/S/aplus-media-library-service-media/563a5033-14c9-45db-8233-b4d04da5a926.__CR0,0,970,600_PT0_SX970_V1___.jpg"
                                     class="amazon-gallery-img"
                                     alt="Image 4"
                                     loading="lazy" data-index="3">
                                <div class="gallery-item-overlay">
                                    <span class="zoom-icon">🔍</span>
                                </div>
                            </div>
                        

                        <!-- "See more" button when more than 4 images -->
                        
                    </div>

                    <!-- Hidden images for modal (index >= 4) -->
                    <div class="gallery-hidden-images" style="display: none;">
                        
                            
                        
                            
                        
                            
                        
                            
                        
                    </div>
                </div>

<!--                &lt;!&ndash; Product highlights if available &ndash;&gt;-->
<!--                <div class="product-highlights" th:if="${publicite.highlights != null && !publicite.highlights.isEmpty()}">-->
<!--                    <div class="highlights-title">Points clés</div>-->
<!--                    <ul class="highlights-list">-->
<!--                        <li th:each="highlight : ${publicite.highlights}" th:text="${highlight}">-->
<!--                            ✓ Contenu de qualité professionnelle-->
<!--                        </li>-->
<!--                    </ul>-->
<!--                </div>-->

            </div>
        </div>
    </div>
</section>

<!-- Enhanced Gallery Modal -->
<div class="gallery-modal" id="galleryModal">
    <div class="gallery-modal-content">
        <button class="gallery-close" onclick="closeGalleryModal()" aria-label="Fermer">✕</button>

        <div class="gallery-main-container">
            <img class="gallery-main-img" id="galleryMainImg" src="" alt="Image agrandie">
        </div>

        <button class="gallery-nav prev" onclick="galleryPrev()" aria-label="Image précédente">‹</button>
        <button class="gallery-nav next" onclick="galleryNext()" aria-label="Image suivante">›</button>

        <div class="gallery-footer">
            <div class="gallery-dots" id="galleryDots"></div>
            <div class="gallery-counter">
                <span id="currentImageIndex">1</span> / <span id="totalImages">5</span>
            </div>
        </div>
    </div>
</div>

<!-- ========================= -->
<!-- Modal Galerie -->
<!-- ========================= -->
<!--<div class="gallery-modal" id="galleryModal">-->
<!--    <div class="gallery-modal-content">-->
<!--        <button class="gallery-close" onclick="closeGalleryModal()">✕</button>-->

<!--        <button class="gallery-nav prev" onclick="prevGallery()">‹</button>-->

<!--        <img id="galleryMainImage" class="gallery-main-img" src="" alt="Image">-->

<!--        <button class="gallery-nav next" onclick="nextGallery()">›</button>-->

<!--        <div class="gallery-dots" id="galleryDots"></div>-->
<!--    </div>-->
<!--</div>-->





<!-- Enhanced Modal for Date Selection -->
<div id="dateModal" class="modal">
    <div class="modal-content date-picker-modal">
        <div class="modal-header">
            <h3 class="modal-title">📅 <span>Choose a date</span></h3>
            <button class="close-btn" id="closeModal" type="button">&times;</button>
        </div>

        <form id="dateForm">
            <div class="date-picker-scroll">
                <!-- Calendar -->
                <div class="calendar-container">
                    <div class="calendar-header">
                        <button type="button" class="calendar-nav-btn" id="prevMonth">
                            <span>‹</span>
                        </button>
                        <span class="calendar-month-year" id="calendarMonthYear">Janvier 2025</span>
                        <button type="button" class="calendar-nav-btn" id="nextMonth">
                            <span>›</span>
                        </button>
                    </div>
                    <div class="calendar-weekdays" id="calendarWeekdays">
                        <span></span>
                        <span></span>
                        <span></span>
                        <span></span>
                        <span></span>
                        <span></span>
                        <span></span>
                    </div>
                    <div class="calendar-days" id="calendarDays">
                        <!-- Days will be generated by JavaScript -->
                    </div>
                </div>

                <!-- Time Selection -->
                <div class="time-selection">
                    <label class="time-label">🕐 <span>Preferred time</span></label>
                    <div class="time-slots" id="timeSlots">
                        <button type="button" class="time-slot" data-time="14:00">14h00</button>
                        <button type="button" class="time-slot" data-time="15:00">15h00</button>
                        <button type="button" class="time-slot" data-time="16:00">16h00</button>
                        <button type="button" class="time-slot" data-time="17:00">17h00</button>
                        <button type="button" class="time-slot" data-time="18:00">18h00</button>
                        <button type="button" class="time-slot" data-time="19:00">19h00</button>
                        <button type="button" class="time-slot active" data-time="20:00">20h00</button>
                        <button type="button" class="time-slot" data-time="21:00">21h00</button>
                        <button type="button" class="time-slot" data-time="22:00">22h00</button>
                    </div>
                    <!-- Hidden inputs for form submission -->
                    <input type="hidden" id="dateInput" name="date">
                    <input type="hidden" id="timeInput" name="time" value="20:00">
                </div>

                <!-- Selected Summary -->
                <div class="date-summary" id="dateSummary">
                    <span class="summary-icon">✓</span>
                    <span class="summary-text" id="summaryText">Select a date</span>
                </div>
            </div>

            <!-- Actions -->
            <div class="modal-actions">
                <button type="button" class="modal-btn secondary" id="cancelBtn">Cancel</button>
                <button type="submit" class="modal-btn primary" id="validateDateBtn">
                    <span>Confirm</span>
                    <span class="btn-arrow">→</span>
                </button>
            </div>
        </form>
    </div>
</div>

<!-- Modal for City Selection -->
<div id="cityModal" class="modal">



    <div id="defaultCountry" style="display:none;">United States</div>
    <div id="defaultCity" style="display:none;">Columbus</div>


    <div class="modal-content">

        <!-- Bandeau : permission géolocalisation refusée -->
        <div id="geo-denied-banner" style="display:none;">

            <!-- Header sombre avec icône -->
            <div class="geo-denied-header">
                <button class="geo-denied-close" onclick="hideGeoDenied()" aria-label="Fermer">
                    <svg width="12" height="12" viewBox="0 0 14 14" fill="none">
                        <path d="M1 1l12 12M13 1L1 13" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>
                    </svg>
                </button>

                <!-- Icône animée -->
                <div class="geo-denied-icon-wrap">
                    <div class="geo-denied-pulse-ring"></div>
                    <div class="geo-denied-pulse-ring ring-2"></div>
                    <div class="geo-denied-icon-circle">
                        <svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round">
                            <rect x="3" y="11" width="18" height="11" rx="2.5"/>
                            <path d="M7 11V7a5 5 0 0 1 10 0v4"/>
                            <circle cx="12" cy="16" r="1.5" fill="#fff" stroke="none"/>
                        </svg>
                    </div>
                </div>

                <p class="geo-denied-title">Location blocked</p>
                <p class="geo-denied-subtitle">Your browser denied access to your location</p>
            </div>

            <!-- Corps : étapes + CTA -->
            <div class="geo-denied-body">

                <p class="geo-denied-desc">Follow these steps to allow it:</p>

                <!-- Étapes numérotées (remplies par JS depuis #geo-i18n) -->
                <div class="geo-denied-steps" id="geo-denied-steps"></div>

                <!-- Séparateur -->
                <div class="geo-denied-divider"><span>or</span></div>

                <!-- CTA manuel -->
                <button class="geo-denied-manual" onclick="hideGeoDenied(); showManualCitySelection();">
                    <span class="geo-denied-manual-icon">
                        <svg width="15" height="15" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
                            <path d="M12 2C8.13 2 5 5.13 5 9c0 5.25 7 13 7 13s7-7.75 7-13c0-3.87-3.13-7-7-7z"/>
                            <circle cx="12" cy="9" r="2.5"/>
                        </svg>
                    </span>
                    <span>Choose my city manually</span>
                    <svg class="geo-denied-manual-arrow" width="14" height="14" viewBox="0 0 16 16" fill="none">
                        <path d="M3 8h10M9 4l4 4-4 4" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
                    </svg>
                </button>

                <!-- Conteneur i18n pour les étapes JS -->
                <div id="geo-i18n" style="display:none" aria-hidden="true">
                    <span id="gd-chrome-1">Click the 🔒 icon to the left of the address bar.</span>
                    <span id="gd-chrome-2">Next to <strong>Location</strong>, select <strong>Allow</strong>.</span>
                    <span id="gd-chrome-3">Reload the page and click the button again.</span>
                    <span id="gd-firefox-1">Click the 🔒 (or ℹ️) icon to the left of the address bar.</span>
                    <span id="gd-firefox-2">Select <strong>Permissions</strong>.</span>
                    <span id="gd-firefox-3">Next to <strong>Access your location</strong>, choose <strong>Allow</strong>.</span>
                    <span id="gd-firefox-4">Reload the page and try again.</span>
                    <span id="gd-safari-1">Go to your device <strong>Settings</strong>.</span>
                    <span id="gd-safari-2">Then <strong>Safari › Location</strong>.</span>
                    <span id="gd-safari-3">Select <strong>While using the app</strong>.</span>
                    <span id="gd-safari-4">Return to the page and try again.</span>
                    <span id="gd-other-1">Check that geolocation is enabled on your device.</span>
                    <span id="gd-other-2">Reload the page and try again.</span>
                </div>

            </div>

        </div>

        <!-- Boutons -->
        <div class="modal-actions" id="geo-modal-actions">
            <button onclick="getLocation()" class="modal-btn primary" id="geoBtn">
                📍 <span>Enable my location</span>
            </button>


            <button onclick="showManualCitySelection()" class="modal-btn secondary">
                🏙️ <span>Choose my city manually</span>
            </button>
        </div>

        <!-- PANEL MANUEL -->
        <div id="manualCitySelection" class="manual-panel">

            <div class="city-selection">

                <div class="search-city-autocomplete">
                    <input type="text" id="citySearch"
                           placeholder="Rechercher par ville ou code postal (ex: Paris, 75000...)"
                           class="city-search-input"
                           autocomplete="off">
                    <div id="citySearchResults" class="city-search-results"></div>
                </div>

            </div>

        </div>
    </div>

</div>


<div id="ytModal" class="yt-modal" aria-hidden="true">
    <div class="yt-modal__backdrop" data-close="true"></div>

    <div class="yt-modal__content" role="dialog" aria-modal="true" aria-label="Vidéo">
        <button class="yt-modal__close" type="button" data-close="true" aria-label="Fermer">×</button>

        <div class="yt-modal__ratio">
            <!-- YouTube iframe -->
            <iframe id="ytFrame"
                    src=""
                    title="YouTube video player"
                    frameborder="0"
                    allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
                    allowfullscreen
                    style="display: none;"></iframe>

            <!-- Direct video player (MP4, WebM, etc.) -->
            <video id="videoPlayer"
                   src=""
                   controls
                   autoplay
                   playsinline
                   style="display: none;">
                Votre navigateur ne supporte pas la lecture de vidéos.
            </video>
        </div>
    </div>
</div>





<script>
    function showManualCitySelection() {
        localStorage.setItem('locationMode', 'manual');

        const panel = document.getElementById('manualCitySelection');
        if (!panel) return;

        panel.classList.add('show');

        // Focus on the search input
        const searchInput = document.getElementById('citySearch');
        if (searchInput) {
            searchInput.value = '';
            searchInput.focus();
        }

        // Clear previous results
        const resultsContainer = document.getElementById('citySearchResults');
        if (resultsContainer) {
            resultsContainer.innerHTML = '';
            resultsContainer.classList.remove('show');
        }
    }


</script>



<script>
    // Hardcoded list of cities


</script>





<script>
    const burger = document.getElementById('burgerBtn');
    const nav = document.getElementById('navMenu');

    burger.addEventListener('click', () => {
        burger.classList.toggle('active');
        nav.classList.toggle('show');
    });

    // Fermer le menu au clic sur un lien (UX mobile)
    nav.querySelectorAll('a').forEach(link => {
        link.addEventListener('click', () => {
            burger.classList.remove('active');
            nav.classList.remove('show');
        });
    });

    // Dropdown "Jeux Vidéo"
    const dropdown = nav.querySelector('.nav-dropdown');
    if (dropdown) {
        const toggle = dropdown.querySelector('.nav-dropdown-toggle');
        toggle.addEventListener('click', (e) => {
            e.stopPropagation();
            const isOpen = dropdown.classList.toggle('open');
            toggle.setAttribute('aria-expanded', isOpen);
        });

        // Fermer si clic en dehors
        document.addEventListener('click', () => {
            dropdown.classList.remove('open');
            toggle.setAttribute('aria-expanded', false);
        });

        dropdown.addEventListener('click', (e) => e.stopPropagation());
    }
</script>






<div id="langModal" class="modal">
    <div class="modal-content lang-modal">

        <div class="modal-header">
            <h3 class="modal-title">Choisir la langue</h3>
            <button class="close-btn" id="closeLangModal">&times;</button>
        </div>

        <div class="lang-grid">
            <a href="/fr;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/fr.svg" alt="fr" />
                <span>FR</span>
            </a><a href="/es;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/es.svg" alt="es" />
                <span>ES</span>
            </a><a href="/en;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/gb.svg" alt="en" />
                <span>EN</span>
            </a><a href="/de;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/de.svg" alt="de" />
                <span>DE</span>
            </a><a href="/it;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/it.svg" alt="it" />
                <span>IT</span>
            </a><a href="/pt;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/pt.svg" alt="pt" />
                <span>PT</span>
            </a><a href="/zh;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/cn.svg" alt="zh" />
                <span>ZH</span>
            </a><a href="/ar;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/sa.svg" alt="ar" />
                <span>AR</span>
            </a><a href="/ja;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/jp.svg" alt="ja" />
                <span>JA</span>
            </a><a href="/nl;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/nl.svg" alt="nl" />
                <span>NL</span>
            </a><a href="/sq;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/al.svg" alt="sq" />
                <span>SQ</span>
            </a><a href="/bg;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/bg.svg" alt="bg" />
                <span>BG</span>
            </a><a href="/hr;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/hr.svg" alt="hr" />
                <span>HR</span>
            </a><a href="/cs;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/cz.svg" alt="cs" />
                <span>CS</span>
            </a><a href="/da;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/dk.svg" alt="da" />
                <span>DA</span>
            </a><a href="/et;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/ee.svg" alt="et" />
                <span>ET</span>
            </a><a href="/fi;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/fi.svg" alt="fi" />
                <span>FI</span>
            </a><a href="/el;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/gr.svg" alt="el" />
                <span>EL</span>
            </a><a href="/hu;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/hu.svg" alt="hu" />
                <span>HU</span>
            </a><a href="/id;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/id.svg" alt="id" />
                <span>ID</span>
            </a><a href="/nb;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/no.svg" alt="nb" />
                <span>NB</span>
            </a><a href="/pl;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/pl.svg" alt="pl" />
                <span>PL</span>
            </a><a href="/ro;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/ro.svg" alt="ro" />
                <span>RO</span>
            </a><a href="/ru;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/ru.svg" alt="ru" />
                <span>RU</span>
            </a><a href="/sr;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/rs.svg" alt="sr" />
                <span>SR</span>
            </a><a href="/sl;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/si.svg" alt="sl" />
                <span>SL</span>
            </a><a href="/sv;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/se.svg" alt="sv" />
                <span>SV</span>
            </a><a href="/th;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/th.svg" alt="th" />
                <span>TH</span>
            </a><a href="/tr;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/tr.svg" alt="tr" />
                <span>TR</span>
            </a><a href="/vi;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/vn.svg" alt="vi" />
                <span>VI</span>
            </a><a href="/ko;jsessionid=E704359B50C30B94BA26B0486C69842C"
               class="lang-item">

                <img src="https://hatscripts.github.io/circle-flags/flags/kr.svg" alt="ko" />
                <span>KO</span>
            </a>
        </div>

    </div>
</div>




<script>
    const openLangModal = document.getElementById('openLangModal');
    const closeLangModal = document.getElementById('closeLangModal');
    const langModal = document.getElementById('langModal');

    openLangModal.addEventListener('click', () => {
        langModal.classList.add('show');
    });

    closeLangModal.addEventListener('click', () => {
        langModal.classList.remove('show');
    });

    langModal.addEventListener('click', e => {
        if (e.target === langModal) {
            langModal.classList.remove('show');
        }
    });
</script>






<script src="/js/youtube.js;jsessionid=E704359B50C30B94BA26B0486C69842C">

</script>




<!--<script>-->
<!--    // ======== AVIS CAROUSEL ========-->
<!--    let avisIndex = 0;-->

<!--    function updateAvisCarousel() {-->
<!--        const slides = document.querySelectorAll('#avisCarousel .avis-slide');-->
<!--        if (!slides || slides.length === 0) return;-->

<!--        slides.forEach(s => s.classList.remove('active'));-->
<!--        slides[avisIndex].classList.add('active');-->
<!--    }-->

<!--    function nextAvis() {-->
<!--        const slides = document.querySelectorAll('#avisCarousel .avis-slide');-->
<!--        if (!slides || slides.length === 0) return;-->
<!--        avisIndex = (avisIndex + 1) % slides.length;-->
<!--        updateAvisCarousel();-->
<!--    }-->

<!--    function prevAvis() {-->
<!--        const slides = document.querySelectorAll('#avisCarousel .avis-slide');-->
<!--        if (!slides || slides.length === 0) return;-->
<!--        avisIndex = (avisIndex - 1 + slides.length) % slides.length;-->
<!--        updateAvisCarousel();-->
<!--    }-->

<!--    // Auto-slide avis (optionnel)-->
<!--    setInterval(() => {-->
<!--        const carousel = document.getElementById('avisCarousel');-->
<!--        if (carousel) nextAvis();-->
<!--    }, 5500);-->


<!--    // ======== GALLERY MODAL ========-->
<!--    let galleryImages = [];-->
<!--    let galleryIndex = 0;-->

<!--    function openGalleryModal(imgEl) {-->
<!--        const all = document.querySelectorAll('.amazon-gallery-img');-->
<!--        galleryImages = Array.from(all).map(i => i.src);-->

<!--        galleryIndex = parseInt(imgEl.dataset.index || "0");-->
<!--        renderGallery();-->
<!--        document.getElementById('galleryModal').classList.add('show');-->
<!--    }-->

<!--    function closeGalleryModal() {-->
<!--        document.getElementById('galleryModal').classList.remove('show');-->
<!--    }-->

<!--    function renderGallery() {-->
<!--        const main = document.getElementById('galleryMainImage');-->
<!--        main.src = galleryImages[galleryIndex];-->

<!--        // dots-->
<!--        const dots = document.getElementById('galleryDots');-->
<!--        dots.innerHTML = "";-->

<!--        galleryImages.forEach((_, idx) => {-->
<!--            const d = document.createElement('div');-->
<!--            d.className = 'gallery-dot' + (idx === galleryIndex ? ' active' : '');-->
<!--            d.onclick = () => { galleryIndex = idx; renderGallery(); };-->
<!--            dots.appendChild(d);-->
<!--        });-->
<!--    }-->

<!--    function nextGallery() {-->
<!--        if (!galleryImages.length) return;-->
<!--        galleryIndex = (galleryIndex + 1) % galleryImages.length;-->
<!--        renderGallery();-->
<!--    }-->

<!--    function prevGallery() {-->
<!--        if (!galleryImages.length) return;-->
<!--        galleryIndex = (galleryIndex - 1 + galleryImages.length) % galleryImages.length;-->
<!--        renderGallery();-->
<!--    }-->

<!--    // fermer au clic hors contenu-->
<!--    document.getElementById('galleryModal')?.addEventListener('click', (e) => {-->
<!--        if (e.target.id === 'galleryModal') closeGalleryModal();-->
<!--    });-->

<!--    // escape pour fermer-->
<!--    document.addEventListener('keydown', (e) => {-->
<!--        const modal = document.getElementById('galleryModal');-->
<!--        if (!modal?.classList.contains('show')) return;-->

<!--        if (e.key === 'Escape') closeGalleryModal();-->
<!--        if (e.key === 'ArrowRight') nextGallery();-->
<!--        if (e.key === 'ArrowLeft') prevGallery();-->
<!--    });-->
<!--</script>-->

<script>
    // =============================
    // ENHANCED CAROUSEL FUNCTIONALITY
    // =============================

    let currentAvisIndex = 0;
    let avisSlides = [];
    let avisCarousel = null;

    // Initialize carousel on page load
    document.addEventListener('DOMContentLoaded', function() {
        initAvisCarousel();
        initGallery();
    });

    function initAvisCarousel() {
        avisCarousel = document.getElementById('avisCarousel');
        if (!avisCarousel) return;

        avisSlides = Array.from(avisCarousel.querySelectorAll('.avis-slide'));
        if (avisSlides.length === 0) return;

        // Auto-play carousel every 5 seconds
        setInterval(() => {
            nextAvis();
        }, 5000);

        // Add keyboard navigation
        document.addEventListener('keydown', (e) => {
            if (!avisCarousel) return;

            if (e.key === 'ArrowLeft') {
                prevAvis();
            } else if (e.key === 'ArrowRight') {
                nextAvis();
            }
        });
    }

    function nextAvis() {
        if (!avisSlides || avisSlides.length === 0) return;

        currentAvisIndex = (currentAvisIndex + 1) % avisSlides.length;
        updateAvisDisplay();
    }

    function prevAvis() {
        if (!avisSlides || avisSlides.length === 0) return;

        currentAvisIndex = (currentAvisIndex - 1 + avisSlides.length) % avisSlides.length;
        updateAvisDisplay();
    }

    function goToAvis(indicatorElement) {
        const index = parseInt(indicatorElement.dataset.index);
        if (isNaN(index)) return;

        currentAvisIndex = index;
        updateAvisDisplay();
    }

    function updateAvisDisplay() {
        // Update slides
        avisSlides.forEach((slide, index) => {
            slide.classList.toggle('active', index === currentAvisIndex);
        });

        // Update indicators
        const indicators = document.querySelectorAll('.carousel-indicators .indicator');
        indicators.forEach((indicator, index) => {
            indicator.classList.toggle('active', index === currentAvisIndex);
        });
    }

    // =============================
    // ENHANCED GALLERY MODAL
    // =============================

    let currentGalleryIndex = 0;
    let galleryImages = [];
    let galleryModal = null;

    function initGallery() {
        galleryModal = document.getElementById('galleryModal');
        if (!galleryModal) {
            console.error('Gallery modal not found!');
            return;
        }

        // Collect all gallery images
        const galleryImgs = document.querySelectorAll('.amazon-gallery-img');
        galleryImages = Array.from(galleryImgs).map(img => img.src);
        console.log('Gallery initialized with', galleryImages.length, 'images');

        // Create gallery dots
        const dotsContainer = document.getElementById('galleryDots');
        if (dotsContainer && galleryImages.length > 0) {
            dotsContainer.innerHTML = '';
            galleryImages.forEach((_, index) => {
                const dot = document.createElement('span');
                dot.className = 'gallery-dot';
                dot.onclick = () => goToGalleryImage(index);
                dotsContainer.appendChild(dot);
            });
        }

        // Update total images count
        const totalImagesEl = document.getElementById('totalImages');
        if (totalImagesEl) {
            totalImagesEl.textContent = galleryImages.length;
        }

        // Add keyboard navigation for modal
        document.addEventListener('keydown', (e) => {
            if (!galleryModal || !galleryModal.classList.contains('show')) return;

            if (e.key === 'Escape') {
                closeGalleryModal();
            } else if (e.key === 'ArrowLeft') {
                galleryPrev();
            } else if (e.key === 'ArrowRight') {
                galleryNext();
            }
        });

        // Close modal when clicking outside
        galleryModal.addEventListener('click', (e) => {
            if (e.target === galleryModal) {
                closeGalleryModal();
            }
        });
    }

    function openGalleryModal(imgElement) {
        console.log('openGalleryModal called', imgElement);

        // Make sure gallery is initialized
        if (!galleryModal || galleryImages.length === 0) {
            initGallery();
        }

        const index = parseInt(imgElement.dataset.index);
        console.log('Image index:', index, 'Total images:', galleryImages.length);

        if (isNaN(index)) {
            console.error('Invalid image index');
            return;
        }

        currentGalleryIndex = index;
        updateGalleryDisplay();

        if (galleryModal) {
            console.log('Opening modal');
            galleryModal.classList.add('show');
            document.body.style.overflow = 'hidden'; // Prevent background scrolling
        } else {
            console.error('Gallery modal is null');
        }
    }

    function openGalleryModalAtIndex(index) {
        console.log('openGalleryModalAtIndex called with index:', index);

        if (isNaN(index) || index < 0) {
            console.error('Invalid index:', index);
            return;
        }

        // Make sure gallery is initialized
        if (!galleryModal || galleryImages.length === 0) {
            initGallery();
        }

        currentGalleryIndex = Math.min(index, galleryImages.length - 1);
        console.log('currentGalleryIndex:', currentGalleryIndex, 'galleryImages:', galleryImages.length);

        updateGalleryDisplay();

        if (galleryModal) {
            console.log('Opening modal');
            galleryModal.classList.add('show');
            document.body.style.overflow = 'hidden';
        } else {
            console.error('Gallery modal is null after init');
        }
    }

    function closeGalleryModal() {
        if (galleryModal) {
            galleryModal.classList.remove('show');
            document.body.style.overflow = ''; // Restore scrolling
        }
    }

    function galleryNext() {
        if (galleryImages.length === 0) return;

        currentGalleryIndex = (currentGalleryIndex + 1) % galleryImages.length;
        updateGalleryDisplay();
    }

    function galleryPrev() {
        if (galleryImages.length === 0) return;

        currentGalleryIndex = (currentGalleryIndex - 1 + galleryImages.length) % galleryImages.length;
        updateGalleryDisplay();
    }

    function goToGalleryImage(index) {
        currentGalleryIndex = index;
        updateGalleryDisplay();
    }

    function updateGalleryDisplay() {
        // Update main image
        const mainImg = document.getElementById('galleryMainImg');
        if (mainImg && galleryImages[currentGalleryIndex]) {
            mainImg.src = galleryImages[currentGalleryIndex];
            mainImg.alt = `Image ${currentGalleryIndex + 1}`;
        }

        // Update dots
        const dots = document.querySelectorAll('#galleryDots .gallery-dot');
        dots.forEach((dot, index) => {
            dot.classList.toggle('active', index === currentGalleryIndex);
        });

        // Update counter
        const currentIndexEl = document.getElementById('currentImageIndex');
        if (currentIndexEl) {
            currentIndexEl.textContent = currentGalleryIndex + 1;
        }
    }

    // =============================
    // TOUCH SWIPE SUPPORT
    // =============================

    let touchStartX = 0;
    let touchEndX = 0;

    // Add touch support for carousel
    if (typeof avisCarousel !== 'undefined' && avisCarousel) {
        avisCarousel.addEventListener('touchstart', (e) => {
            touchStartX = e.changedTouches[0].screenX;
        }, { passive: true });

        avisCarousel.addEventListener('touchend', (e) => {
            touchEndX = e.changedTouches[0].screenX;
            handleSwipe('carousel');
        }, { passive: true });
    }

    // Add touch support for gallery modal
    document.addEventListener('DOMContentLoaded', () => {
        const modal = document.getElementById('galleryModal');
        if (modal) {
            modal.addEventListener('touchstart', (e) => {
                touchStartX = e.changedTouches[0].screenX;
            }, { passive: true });

            modal.addEventListener('touchend', (e) => {
                touchEndX = e.changedTouches[0].screenX;
                handleSwipe('gallery');
            }, { passive: true });
        }
    });

    function handleSwipe(type) {
        const swipeThreshold = 50;
        const diff = touchStartX - touchEndX;

        if (Math.abs(diff) < swipeThreshold) return;

        if (type === 'carousel') {
            if (diff > 0) {
                nextAvis();
            } else {
                prevAvis();
            }
        } else if (type === 'gallery') {
            if (diff > 0) {
                galleryNext();
            } else {
                galleryPrev();
            }
        }
    }

    // =============================
    // SMOOTH SCROLL FOR GALLERY
    // =============================

    function initGalleryScroll() {
        const galleryRow = document.querySelector('.amazon-gallery-row');
        if (!galleryRow) return;

        let isDown = false;
        let startX;
        let scrollLeft;

        galleryRow.addEventListener('mousedown', (e) => {
            isDown = true;
            galleryRow.style.cursor = 'grabbing';
            startX = e.pageX - galleryRow.offsetLeft;
            scrollLeft = galleryRow.scrollLeft;
        });

        galleryRow.addEventListener('mouseleave', () => {
            isDown = false;
            galleryRow.style.cursor = 'grab';
        });

        galleryRow.addEventListener('mouseup', () => {
            isDown = false;
            galleryRow.style.cursor = 'grab';
        });

        galleryRow.addEventListener('mousemove', (e) => {
            if (!isDown) return;
            e.preventDefault();
            const x = e.pageX - galleryRow.offsetLeft;
            const walk = (x - startX) * 2;
            galleryRow.scrollLeft = scrollLeft - walk;
        });
    }

    // Initialize gallery scroll on page load
    document.addEventListener('DOMContentLoaded', initGalleryScroll);

    // =============================
    // LAZY LOADING IMAGES
    // =============================

    document.addEventListener('DOMContentLoaded', () => {
        const images = document.querySelectorAll('img[loading="lazy"]');

        if ('IntersectionObserver' in window) {
            const imageObserver = new IntersectionObserver((entries, observer) => {
                entries.forEach(entry => {
                    if (entry.isIntersecting) {
                        const img = entry.target;
                        img.classList.add('loaded');
                        observer.unobserve(img);
                    }
                });
            });

            images.forEach(img => imageObserver.observe(img));
        }
    });

    // =============================
    // ANALYTICS TRACKING (OPTIONAL)
    // =============================

    function trackAdInteraction(action, label) {
        // Implement your analytics tracking here
        // Example with Google Analytics:
        // gtag('event', action, {
        //     event_category: 'Amazon Ad',
        //     event_label: label
        // });

        console.log(`Ad Interaction: ${action} - ${label}`);
    }

    // Track clicks on CTA buttons
    document.addEventListener('DOMContentLoaded', () => {
        const ctaButton = document.querySelector('.amazon-ad-cta');
        if (ctaButton) {
            ctaButton.addEventListener('click', () => {
                trackAdInteraction('click', 'View on Amazon');
            });
        }

        const videoLink = document.querySelector('.amazon-ad-video');
        if (videoLink) {
            videoLink.addEventListener('click', () => {
                trackAdInteraction('click', 'Watch Video');
            });
        }
    });
</script>

<!-- Google Maps API (loaded only on results page) -->



<!-- ============================================================
     DESIGN V3 — Animations & Interactions
============================================================ -->
<script>
(function () {
    'use strict';

    /* ── Scroll progress bar ── */
    const progressBar = document.createElement('div');
    progressBar.className = 'scroll-progress';
    document.body.prepend(progressBar);

    window.addEventListener('scroll', () => {
        const max = document.documentElement.scrollHeight - window.innerHeight;
        progressBar.style.width = (max > 0 ? (window.scrollY / max) * 100 : 0) + '%';
    }, { passive: true });

    /* ── Header scroll-aware ── */
    const header = document.querySelector('header');
    if (header) {
        const onScroll = () => header.classList.toggle('scrolled', window.scrollY > 10);
        window.addEventListener('scroll', onScroll, { passive: true });
        onScroll(); // init
    }

    /* ── Card entrance (IntersectionObserver) ── */
    document.addEventListener('DOMContentLoaded', () => {
        const cards = document.querySelectorAll('.airbnb-card');
        if (!cards.length) return;

        const io = new IntersectionObserver((entries) => {
            entries.forEach(e => {
                if (e.isIntersecting) {
                    e.target.classList.add('is-visible');
                    io.unobserve(e.target);
                }
            });
        }, { threshold: 0.1, rootMargin: '0px 0px -40px 0px' });

        cards.forEach(c => io.observe(c));
    });

    /* ── City display sync ── */
    document.addEventListener('DOMContentLoaded', () => {
        const cityNameEl = document.getElementById('cityDisplayName');
        if (!cityNameEl) return;

        // Watch the hidden cityInput for changes
        const cityInput = document.getElementById('cityInput');
        if (cityInput) {
            const updateDisplay = () => {
                if (cityInput.value) cityNameEl.textContent = cityInput.value;
            };
            new MutationObserver(updateDisplay).observe(cityInput, { attributes: true, attributeFilter: ['value'] });
            cityInput.addEventListener('change', updateDisplay);
        }
    });

    /* ── Search tab → filter-btn sync ── */
    document.addEventListener('DOMContentLoaded', () => {
        // search-tab elements also carry filter-btn class; the existing
        // search.js already manages active/inactive on filter-btn, so the
        // tab underline follows automatically.
    });

    /* ── Ripple on search-submit-btn ── */
    document.addEventListener('DOMContentLoaded', () => {
        const btn = document.querySelector('.search-submit-btn');
        if (!btn) return;
        btn.addEventListener('click', e => {
            const r = document.createElement('span');
            r.className = 'btn-ripple';
            const rect = btn.getBoundingClientRect();
            const size = Math.max(rect.width, rect.height);
            r.style.cssText = `width:${size}px;height:${size}px;left:${e.clientX-rect.left-size/2}px;top:${e.clientY-rect.top-size/2}px`;
            btn.appendChild(r);
            r.addEventListener('animationend', () => r.remove());
        });
    });

    /* ── Hero search-tabs ↔ filter-btn sync ──
       The city-picker-btn also has data-filter="ville".
       We extend search.js behaviour to update cityDisplayName. */
    document.addEventListener('DOMContentLoaded', () => {
        // Intercept selectCity (defined in search.js) to update the display
        const _origSelectCity = window.selectCity;
        if (typeof _origSelectCity === 'function') {
            window.selectCity = function(city, country, countryLabel, isGeo) {
                _origSelectCity.call(this, city, country, countryLabel, isGeo);
                const el = document.getElementById('cityDisplayName');
                if (el && city) el.textContent = city;
            };
        }
    });

})();

/* ── Heart / wishlist toggle ── */
function toggleHeart(btn) {
    btn.classList.toggle('liked');
    if (btn.classList.contains('liked')) {
        btn.textContent = '❤️';
    } else {
        btn.textContent = '♡';
    }
}
</script>

<!-- ── FOOTER ── -->
<footer class="site-footer">
    <div class="footer-inner">

        <div class="footer-brand">
            <a href="/en;jsessionid=E704359B50C30B94BA26B0486C69842C" class="footer-logo">
                <span class="footer-logo-icon">🔐</span>
                <span>Escape Game <strong>Finder</strong></span>
            </a>
            <p>Find your next escape game in seconds.</p>
        </div>

        <div class="footer-col">
            <h4>Navigation</h4>
            <a href="/en;jsessionid=E704359B50C30B94BA26B0486C69842C">Home</a>
            <a href="/en/contact;jsessionid=E704359B50C30B94BA26B0486C69842C">Contact</a>
        </div>

        <div class="footer-col">
            <h4>Legal</h4>
            <a href="/en/terms;jsessionid=E704359B50C30B94BA26B0486C69842C">Terms &amp; Conditions</a>
            <a href="/en/privacy;jsessionid=E704359B50C30B94BA26B0486C69842C">Privacy Policy</a>
        </div>

    </div>
    <div class="footer-bottom">
        <span>© 2026 Escape Game Finder. All rights reserved.</span>
    </div>
</footer>

</body>
</html>
