{"id":2238,"date":"2026-02-24T08:39:37","date_gmt":"2026-02-24T07:39:37","guid":{"rendered":"https:\/\/cumarcheologia.it\/dove-mangiare\/"},"modified":"2026-02-24T08:39:37","modified_gmt":"2026-02-24T07:39:37","slug":"dove-mangiare","status":"publish","type":"page","link":"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/","title":{"rendered":"Dove mangiare"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2238\" class=\"elementor elementor-2238 elementor-2208\" data-elementor-settings=\"[]\">\n\t\t\t\t\t\t<div class=\"elementor-inner\">\n\t\t\t\t\t\t\t<div class=\"elementor-section-wrap\">\n\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a55d779 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a55d779\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t\t\t<div class=\"elementor-row\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d1a6f2d\" data-id=\"d1a6f2d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-column-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-34db57f elementor-widget elementor-widget-shortcode\" data-id=\"34db57f\" data-element_type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-shortcode\">\n<style>\n.pagination-controls .btn-link {\n    padding: 0.375rem 0.75rem;\n}\n.pagination-controls .btn-link:disabled {\n    opacity: 0.4;\n    cursor: not-allowed;\n    pointer-events: none;\n}\n.pagination-controls .btn-link:not(:disabled):hover {\n    text-decoration: underline !important;\n}\n\n\/* Stili per i popup della mappa *\/\n.entourance-custom-popup .leaflet-popup-content-wrapper {\n    padding: 0 !important;\n    border-radius: 12px !important;\n    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15) !important;\n    overflow: hidden;\n    background: white;\n}\n\n.entourance-custom-popup .leaflet-popup-content {\n    margin: 0 !important;\n    width: 100% !important;\n}\n\n.entourance-map-popup {\n    min-width: 250px;\n}\n\n.entourance-map-popup .popup-image {\n    margin: 0;\n    line-height: 0;\n    position: relative;\n}\n\n.entourance-map-popup .popup-image img {\n    display: block;\n    width: 100%;\n}\n\n\/* Stile per il pulsante con sfondo bianco e bordo *\/\n.entourance-map-popup .popup-link-btn {\n    transition: all 0.3s ease !important;\n}\n\n.entourance-map-popup .popup-link-btn:hover {\n    background: var(--gyg-primary, #007bff) !important;\n    color: white !important;\n    transform: translateY(-2px);\n    box-shadow: 0 4px 12px rgba(0, 123, 255, 0.3);\n}\n\n.entourance-custom-popup .leaflet-popup-tip-container {\n    margin-top: -1px;\n}\n\n\/* Pulsante di chiusura migliorato *\/\n.entourance-custom-popup .leaflet-popup-close-button {\n    position: absolute !important;\n    top: 8px !important;\n    right: 8px !important;\n    width: 32px !important;\n    height: 32px !important;\n    background: white !important;\n    border-radius: 50% !important;\n    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15) !important;\n    color: #666 !important;\n    font-size: 20px !important;\n    font-weight: bold !important;\n    padding: 0 !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    z-index: 1000 !important;\n    border: 2px solid #f0f0f0 !important;\n    transition: all 0.2s ease !important;\n    line-height: 1 !important;\n    text-decoration: none !important;\n}\n\n.entourance-custom-popup .leaflet-popup-close-button:hover {\n    background: #f8f9fa !important;\n    color: #333 !important;\n    border-color: #ddd !important;\n    transform: scale(1.1);\n    box-shadow: 0 3px 12px rgba(0, 0, 0, 0.2) !important;\n    text-decoration: none !important;\n}\n\n\/* Placeholder per immagini mancanti *\/\n.card-img-placeholder {\n    height: 200px;\n    width: 100%;\n    background: linear-gradient(135deg, rgba(var(--gyg-primary-rgb, 0, 123, 255), 0.15), rgba(var(--gyg-primary-rgb, 0, 123, 255), 0.25)) !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n}\n\n.card-img-placeholder i {\n    color: white !important;\n    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.1));\n}\n\n\/* Lazy loading styles *\/\n.lazy-img {\n    background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);\n    background-size: 200% 100%;\n    animation: loading 1.5s infinite;\n    min-height: 200px;\n}\n\n.lazy-img.loaded {\n    animation: none;\n    background: none;\n}\n\n@keyframes loading {\n    0% {\n        background-position: 200% 0;\n    }\n    100% {\n        background-position: -200% 0;\n    }\n}\n<\/style>\n\n<div class=\"entourance-product-list entourance-plugin container py-4\">\n    <!-- Skip Link per accessibilit\u00e0 -->\n    <a href=\"#entourance-main-content\" class=\"skip-link sr-only-focusable\">Salta al contenuto principale<\/a>\n\n    <!-- Tabs -->\n        \n        <ul class=\"nav nav-tabs mb-4\" id=\"entouranceTab\" role=\"tablist\">\n                        <li class=\"nav-item\" role=\"presentation\">\n                    <button class=\"nav-link active\" id=\"entourance-list-tab\" data-entourance-toggle=\"tab\" data-bs-target=\"#list\" type=\"button\" role=\"tab\" aria-controls=\"list\" aria-selected=\"true\">\n                        List                    <\/button>\n                <\/li>\n                                <li class=\"nav-item\" role=\"presentation\">\n                    <button class=\"nav-link \" id=\"entourance-map-tab\" data-entourance-toggle=\"tab\" data-bs-target=\"#map\" type=\"button\" role=\"tab\" aria-controls=\"map\" aria-selected=\"false\">\n                        Map                    <\/button>\n                <\/li>\n                    <\/ul>\n        \n    <div class=\"tab-content\" id=\"entouranceTabContent\" role=\"region\" aria-label=\"Contenuto principale della lista prodotti\">\n                <div class=\"tab-pane fade show active\" id=\"list\" role=\"tabpanel\" aria-labelledby=\"list-tab\">\n            <!-- Lista prodotti -->\n            <div class=\"row mb-4\">\n                                <div class=\"col-md-4\">\n                    <div class=\"input-group\">\n                        <label for=\"searchInput\" class=\"sr-only\">Cerca prodotti<\/label>\n                        <input type=\"text\" class=\"form-control\" id=\"searchInput\" placeholder=\"Search...\" aria-label=\"Cerca prodotti\" aria-describedby=\"searchHelp\">\n                        <button class=\"btn btn-outline-secondary\" type=\"button\" id=\"searchButton\" aria-label=\"Esegui ricerca\">\n                            <i class=\"fas fa-search\" aria-hidden=\"true\"><\/i>\n                        <\/button>\n                    <\/div>\n                    <div id=\"searchHelp\" class=\"sr-only\">Digita il nome del prodotto che stai cercando<\/div>\n                <\/div>\n                                <!-- FILTRO TAG -->\n                                <!-- \/FILTRO TAG -->\n                                <div class=\"col-md-4\">\n                    <label for=\"categoryFilter\" class=\"sr-only\">Filtra per categoria<\/label>\n                    <select class=\"form-select\" id=\"categoryFilter\" aria-label=\"Filtra prodotti per categoria\">\n                        <option value=\"\">All categories<\/option>\n                    <\/select>\n                <\/div>\n                                                                            <\/div>\n            <div class=\"row\" id=\"productList\">\n                <!-- Le card verranno inserite qui dinamicamente -->\n            <\/div>\n                        <template id=\"cardTemplate\">\n                <div class=\"col-lg-4 col-md-6 col-12 mb-4\">\n                    <a href=\"#\" class=\"card-link\">\n                        <div class=\"card h-100\">\n                            <div class=\"card-img-wrapper\">\n                                <img data-src=\"\" class=\"card-img-top lazy-img\" alt=\"\" style=\"height: 200px; width: 100%; object-fit: cover;\" loading=\"lazy\">\n                            <\/div>\n                            <div class=\"card-body d-flex flex-column\">\n                                <div class=\"card-meta d-flex justify-content-between align-items-center mb-2\">\n                                    <div class=\"duration\"><\/div>\n                                    <div class=\"price\"><\/div>\n                                <\/div>\n                                <h5 class=\"card-title\"><\/h5>\n                            <\/div>\n                            <div class=\"card-footer\">\n                                <div class=\"badges-wrapper d-flex justify-content-between align-items-center\">\n                                    <span class=\"badge type-badge\"><\/span>\n                                    <span class=\"badge category-badge\"><\/span>\n                                <\/div>\n                                <div class=\"past-event-badge mt-2\" style=\"display: none;\">\n                                    <span class=\"badge bg-dark text-white\">\n                                        <i class=\"fas fa-clock me-1\"><\/i>\n                                        <span class=\"past-event-text\"><\/span>\n                                    <\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/a>\n                <\/div>\n            <\/template>\n        <\/div>\n                        <div class=\"tab-pane fade \" id=\"map\" role=\"tabpanel\" aria-labelledby=\"map-tab\">\n            <!-- Filtro per categoria nella mappa -->\n                        <div class=\"row mb-4\">\n                <div class=\"col-md-4\">\n                    <select class=\"form-select\" id=\"mapCategoryFilter\">\n                        <option value=\"\">All categories<\/option>\n                    <\/select>\n                <\/div>\n            <\/div>\n                        <div id=\"entouranceMap\" class=\"entourance-map-container\"><\/div>\n        <\/div>\n                    <\/div>\n<\/div>\n\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    const apiUrl = \"https:\\\/\\\/api.marche.entourance.com\\\/api\\\/public\\\/eatery?lang=en_EN&realm=21\";\n    \n    \/\/ Estrai il server base dall'URL API\n    const apiUrlObj = new URL(apiUrl);\n    const apiBaseUrl = apiUrlObj.origin;\n    \n    \/\/ Funzione per generare l'URL della cover usando l'endpoint specifico\n    function getCoverImageUrl(product, contentType) {\n        if (!product || !product.id) return null;\n        \/\/ Gli eventi usano l'endpoint experience per le cover\n        let coverType = contentType === 'event' ? 'experience' : contentType;\n        \/\/ Experience supplier usa camelCase nell'endpoint API\n        if (coverType === 'experience-supplier') {\n            coverType = 'experienceSupplier';\n        }\n        return `${apiBaseUrl}\/api\/public\/${coverType}\/${product.id}\/cover`;\n    }\n    \n    \/\/ Pixel trasparente 1x1 come placeholder\n    const transparentPixel = 'data:image\/svg+xml,%3Csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 1 1\"%3E%3C\/svg%3E';\n    \n    \/\/ Intersection Observer per lazy loading delle immagini\n    const imageObserver = new IntersectionObserver((entries, observer) => {\n        entries.forEach(entry => {\n            if (entry.isIntersecting) {\n                const img = entry.target;\n                const coverUrl = img.dataset.src;\n                \n                if (coverUrl && coverUrl !== '' && coverUrl !== transparentPixel) {\n                    img.src = coverUrl;\n                    \n                    img.onload = function() {\n                        img.classList.add('loaded');\n                    };\n                    \n                    observer.unobserve(img);\n                }\n            }\n        });\n    }, {\n        root: null,\n        rootMargin: '100px', \/\/ Inizia a caricare 100px prima che l'immagine entri nel viewport\n        threshold: 0.01\n    });\n    \n    \/\/ Funzione per ottenere l'icona appropriata in base al tipo di contenuto\n    function getContentTypeIcon(product, contentType) {\n        \/\/ Determina il tipo effettivo del prodotto\n        let type = contentType;\n        if (product.type_ent_product) {\n            type = product.type_ent_product;\n        } else if (product.type === 'event') {\n            type = 'event';\n        } else if (product.type === 'package') {\n            type = 'package';\n        }\n        \n        \/\/ Mappa i tipi alle icone FontAwesome\n        const iconMap = {\n            'experience': 'fa-hiking',\n            'event': 'fa-calendar-alt',\n            'package': 'fa-suitcase-rolling',\n            'poi': 'fa-map-marker-alt',\n            'host': 'fa-home',\n            'eatery': 'fa-utensils',\n            'itinerary': 'fa-route',\n            'experience-supplier': 'fa-handshake',\n            'experienceSupplier': 'fa-handshake',\n            'article': 'fa-newspaper'\n        };\n        \n        return iconMap[type] || 'fa-image';\n    }\n    \n    \/\/ Tipo di contenuto corrente (experience, poi, host, eatery, itinerary)\n    const contentType = 'eatery';\n    \n    const searchInput = document.getElementById('searchInput');\n    const searchButton = document.getElementById('searchButton');\n    const categoryFilter = document.getElementById('categoryFilter');\n    const subcategoryFilter = document.getElementById('subcategoryFilter');\n    const locationFilter = document.getElementById('locationFilter');\n    const productList = document.getElementById('productList');\n    const cardTemplate = document.getElementById('cardTemplate');\n    const paginationControls = document.getElementById('paginationControls');\n    const prevPageBtn = document.getElementById('prevPage');\n    const nextPageBtn = document.getElementById('nextPage');\n    const currentPageNum = document.getElementById('currentPageNum');\n    const totalPagesSpan = document.getElementById('totalPages');\n    \n    \/\/ Filtri per il calendario\n    const calendarSearchInput = document.getElementById('calendarSearchInput');\n    const calendarSearchButton = document.getElementById('calendarSearchButton');\n    const calendarCategoryFilter = document.getElementById('calendarCategoryFilter');\n    const calendarSubcategoryFilter = document.getElementById('calendarSubcategoryFilter');\n    const calendarLocationFilter = document.getElementById('calendarLocationFilter');\n    const calendarList = document.getElementById('calendarList');\n\n    \/\/ Filtro per la mappa\n    const mapCategoryFilter = document.getElementById('mapCategoryFilter');\n\n    \/\/ Filtro temporale per il calendario\n    const calendarTimeFilter = document.getElementById('calendarTimeFilter');\n    const monthNavigation = document.getElementById('monthNavigation');\n    const prevMonth = document.getElementById('prevMonth');\n    const nextMonth = document.getElementById('nextMonth');\n    const currentMonthDisplay = document.getElementById('currentMonthDisplay');\n\n    \/\/ Filtri per le stelle (solo per host)\n    const starsFilter = document.getElementById('starsFilter');\n    const starsFilterContainer = document.getElementById('starsFilterContainer');\n    const calendarStarsFilter = document.getElementById('calendarStarsFilter');\n    const calendarStarsFilterContainer = document.getElementById('calendarStarsFilterContainer');\n\n    \/\/ Filtro per il tag\n    const tagFilter = document.getElementById('tagFilter');\n\n    \/\/ Imposta il valore di default del filtro temporale dal parametro dello shortcode\n    const calendarDefaultFilter = 'future';\n    if (calendarTimeFilter) {\n        calendarTimeFilter.value = calendarDefaultFilter;\n    }\n    \n    \/\/ Mostra o nasconde la navigazione mensile in base al filtro di default\n    if (monthNavigation) {\n        if (calendarDefaultFilter === 'month') {\n            monthNavigation.style.display = 'block';\n        } else {\n            monthNavigation.style.display = 'none';\n        }\n    }\n\n    let translations = {};\n    let allProducts = [];\n    let filteredProducts = [];\n    let currentPage = 1;\n    const itemsPerPage = null;\n    const paginationEnabled = false;\n    let loading = false;\n    let endOfList = false;\n    \n    \/\/ Esponi le variabili globalmente per debug\n    window.entouranceDebug = {\n        get allProducts() { return allProducts; },\n        get filteredProducts() { return filteredProducts; },\n        get itemsPerPage() { return itemsPerPage; },\n        get currentPage() { return currentPage; }\n    };\n\n    \/\/ Variabili per la navigazione mensile\n    let currentMonth = new Date().getMonth();\n    let currentYear = new Date().getFullYear();\n\n    \/\/ Array per le traduzioni delle etichette di interfaccia\n    const uiTranslations = {\n        'it_IT': {\n            'all_categories': 'Tutte le categorie',\n            'all_subcategories': 'Tutte le sottocategorie',\n            'search': 'Cerca',\n            'location': 'Localit\u00e0',\n            'category': 'Categoria',\n            'no_results': 'Nessun risultato trovato',\n            'list': 'Lista',\n            'map': 'Mappa',\n            'calendar': 'Calendario',\n            'past_events': 'Eventi Passati'\n        },\n        'en_EN': {\n            'all_categories': 'All categories',\n            'all_subcategories': 'All subcategories',\n            'search': 'Search',\n            'location': 'Location',\n            'category': 'Category',\n            'no_results': 'No results found',\n            'list': 'List',\n            'map': 'Map',\n            'calendar': 'Calendar',\n            'past_events': 'Past Events'\n        }\n    };\n\n    \/\/ Funzione per ottenere la traduzione dell'interfaccia\n    function getUITranslation(key) {\n        let currentLang = 'en_US';\n        \/\/ Normalizza en_US e en_GB a en_EN\n        if (currentLang === 'en_US' || currentLang === 'en_GB') {\n            currentLang = 'en_EN';\n        }\n        return uiTranslations[currentLang]?.[key] || key;\n    }\n\n    \/\/ Funzione per generare l'URL in base al tipo\n    function generateUrl(product, type) {\n        let baseUrl = \"https:\\\/\\\/cumarcheologia.it\\\/en\\\/\";\n        const slug = product.slug || product.id;\n        \n        \/\/ Verifica se Polylang \u00e8 attivo\n        const isPolylangActive = false;\n        const polylangLang = '';\n        \n        \/\/ Se Polylang \u00e8 attivo e la lingua non \u00e8 italiano, aggiungi il prefisso lingua se non c'\u00e8 gi\u00e0\n        if (isPolylangActive && polylangLang && polylangLang !== 'it') {\n            \/\/ Verifica se il baseUrl include gi\u00e0 il prefisso della lingua\n            const langPrefix = `\/${polylangLang}\/`;\n            const langPrefixNoTrailing = `\/${polylangLang}`;\n            \n            \/\/ Se non include gi\u00e0 il prefisso, aggiungilo\n            if (!baseUrl.includes(langPrefix) && !baseUrl.endsWith(langPrefixNoTrailing)) {\n                \/\/ Rimuovi lo slash finale se presente\n                if (baseUrl.endsWith('\/')) {\n                    baseUrl = baseUrl.slice(0, -1);\n                }\n                baseUrl = `${baseUrl}\/${polylangLang}`;\n            }\n        }\n        \n        let url = '';\n        switch(type) {\n            case 'experience':\n                url = `${baseUrl}\/experience\/${slug}`;\n                break;\n            case 'event':\n                url = `${baseUrl}\/event\/${slug}`;\n                break;\n            case 'eatery':\n                url = `${baseUrl}\/eatery\/${slug}`;\n                break;\n            case 'host':\n                url = `${baseUrl}\/host\/${slug}`;\n                break;\n            case 'article':\n                url = `${baseUrl}\/article\/${slug}`;\n                break;\n            case 'itinerary':\n                url = `${baseUrl}\/itinerary\/${slug}`;\n                break;\n            case 'poi':\n                url = `${baseUrl}\/poi\/${slug}`;\n                break;\n            case 'experienceSupplier':\n            case 'experience-supplier':\n                url = `${baseUrl}\/service\/${slug}`;\n                break;\n            default:\n                return '#';\n        }\n        \n        \/\/ Se Polylang \u00e8 attivo, non aggiungere parametri lang manuali\n        \/\/ Polylang gestisce automaticamente gli URL multilingua\n        if (!isPolylangActive) {\n            \/\/ Solo se Polylang non \u00e8 attivo, usa la logica precedente\n            let currentLang = 'en_US';\n            \/\/ Normalizza en_US e en_GB a en_EN\n            if (currentLang === 'en_US' || currentLang === 'en_GB') {\n                currentLang = 'en_EN';\n            }\n            \n            if (currentLang !== 'it_IT') {\n                url += `?lang=${currentLang}`;\n            }\n        }\n        \n        return url;\n    }\n\n    \/\/ Carica le traduzioni dal file JSON\n    async function loadTranslations() {\n        const cacheUrl = 'https:\/\/cumarcheologia.it\/wp-content\/uploads\/entourance-wp-plugin\/cache\/cache-en_EN.json';\n        \n        try {\n            const response = await fetch(cacheUrl);\n            if (!response.ok) {\n                \/\/ Se il file non esiste, usa un oggetto vuoto invece di lanciare un errore\n                console.warn('Translation file not found, using empty translations');\n                translations = { translations: {} };\n                return;\n            }\n            translations = await response.json();\n        } catch (error) {\n            console.warn('Error loading translations, using empty translations:', error);\n            \/\/ Usa traduzioni vuote invece di interrompere\n            translations = { translations: {} };\n        }\n    }\n\n    \/\/ Funzione per tradurre il tipo di contenuto\n    function translateType(type) {\n        if (!translations || !translations.translations) {\n            return type;\n        }\n        const formattedType = type.charAt(0).toUpperCase() + type.slice(1);\n        return translations.translations[formattedType] || formattedType;\n    }\n\n    \/\/ Funzione per tradurre una stringa generica\n    function translateString(key) {\n        const currentLang = 'en_US';\n        \n        \/\/ Gestione speciale per experience-supplier\/experienceSupplier\n        if (key === 'experience-supplier' || key === 'experienceSupplier') {\n            return currentLang === 'it_IT' ? 'Servizio' : 'Service';\n        }\n        \n        \/\/ Gestione speciale per event\n        if (key === 'event') {\n            return currentLang === 'it_IT' ? 'Evento' : 'Event';\n        }\n        \n        \/\/ Gestione speciale per itinerary\n        if (key === 'itinerary') {\n            return currentLang === 'it_IT' ? 'Itinerario' : 'Itinerary';\n        }\n        \n        \/\/ Gestione speciale per article\n        if (key === 'article') {\n            return currentLang === 'it_IT' ? 'Articolo' : 'Article';\n        }\n        \n        \/\/ Gestione speciale per host\n        if (key === 'host') {\n            return currentLang === 'it_IT' ? 'Alloggio' : 'Host';\n        }\n        \n        \/\/ Gestione speciale per eatery\n        if (key === 'eatery') {\n            return currentLang === 'it_IT' ? 'Locale' : 'Eatery';\n        }\n        \n        \/\/ Gestione speciale per travel (usato per package)\n        if (key === 'travel') {\n            return currentLang === 'it_IT' ? 'Viaggio' : 'Travel';\n        }\n        \n        if (!translations || !translations.translations) {\n            return key;\n        }\n        return translations.translations[key] || key;\n    }\n\n    \/\/ Funzione per tradurre la categoria\n    function translateCategory(category, type) {\n        const currentLang = 'en_US';\n        \n        \/\/ Prima prova a utilizzare le traduzioni delle experience (che sono pi\u00f9 complete)\n        if (translations && translations.translations && translations.translations.OPTIONMAPS && translations.translations.OPTIONMAPS.Experience) {\n            const experienceCategories = translations.translations.OPTIONMAPS.Experience.category || {};\n            if (experienceCategories[category]) {\n                return experienceCategories[category];\n            }\n        }\n        \n        \/\/ Gestione speciale per eventi con traduzioni specifiche\n        if (type === 'event') {\n            const eventCategories = {\n                'it_IT': {\n                    'Associazioni': 'Associazioni',\n                    'Cultura': 'Cultura',\n                    'Musica': 'Musica',\n                    'Territorio': 'Territorio',\n                    'Arte': 'Arte',\n                    'Bimbi': 'Bimbi',\n                    'Storia': 'Storia',\n                    'Comune': 'Comune',\n                    'Danza': 'Danza',\n                    'Solidariet\u00e0': 'Solidariet\u00e0',\n                    'Teatro': 'Teatro',\n                    'Sagre': 'Sagre',\n                    'Enogastronomia': 'Enogastronomia',\n                    'Cinema': 'Cinema',\n                    'Sport': 'Sport',\n                    \/\/ Categorie effettive dall'API\n                    'sport_e_avventura': 'Sport e Avventura',\n                    'cultura_e_arte': 'Cultura e Arte',\n                    'musica_e_spettacolo': 'Musica e Spettacolo',\n                    'gastronomia': 'Gastronomia',\n                    'famiglia_e_bambini': 'Famiglia e Bambini',\n                    'natura_e_ambiente': 'Natura e Ambiente',\n                    'storia_e_tradizione': 'Storia e Tradizione',\n                    'relax_e_benessere': 'Relax e Benessere',\n                    'spettacoli_e_concerti': 'Spettacoli e Concerti',\n                    'fiere_e_congressi': 'Fiere e Congressi',\n                    'religione_e_spiritualit\u00e0': 'Religione e Spiritualit\u00e0',\n                    'tecnologia_e_innovazione': 'Tecnologia e Innovazione',\n                    'educazione_e_formazione': 'Educazione e Formazione',\n                    'salute_e_medicina': 'Salute e Medicina',\n                    'viaggi_e_turismo': 'Viaggi e Turismo'\n                },\n                'en_US': {\n                    'Associazioni': 'Associations',\n                    'Cultura': 'Culture',\n                    'Musica': 'Music',\n                    'Territorio': 'Territory',\n                    'Arte': 'Art',\n                    'Bimbi': 'Kids',\n                    'Storia': 'History',\n                    'Comune': 'Municipality',\n                    'Danza': 'Dance',\n                    'Solidariet\u00e0': 'Solidarity',\n                    'Teatro': 'Theater',\n                    'Sagre': 'Festivals',\n                    'Enogastronomia': 'Food & Wine',\n                    'Cinema': 'Cinema',\n                    'Sport': 'Sports',\n                    \/\/ Categorie effettive dall'API\n                    'sport_e_avventura': 'Sports & Adventure',\n                    'cultura_e_arte': 'Culture & Art',\n                    'musica_e_spettacolo': 'Music & Entertainment',\n                    'gastronomia': 'Gastronomy',\n                    'famiglia_e_bambini': 'Family & Kids',\n                    'natura_e_ambiente': 'Nature & Environment',\n                    'storia_e_tradizione': 'History & Tradition',\n                    'relax_e_benessere': 'Relax & Wellness',\n                    'spettacoli_e_concerti': 'Shows & Concerts',\n                    'fiere_e_congressi': 'Fairs & Conferences',\n                    'religione_e_spiritualit\u00e0': 'Religion & Spirituality',\n                    'tecnologia_e_innovazione': 'Technology & Innovation',\n                    'educazione_e_formazione': 'Education & Training',\n                    'salute_e_medicina': 'Health & Medicine',\n                    'viaggi_e_turismo': 'Travel & Tourism'\n                },\n                'en_EN': {\n                    'Associazioni': 'Associations',\n                    'Cultura': 'Culture',\n                    'Musica': 'Music',\n                    'Territorio': 'Territory',\n                    'Arte': 'Art',\n                    'Bimbi': 'Kids',\n                    'Storia': 'History',\n                    'Comune': 'Municipality',\n                    'Danza': 'Dance',\n                    'Solidariet\u00e0': 'Solidarity',\n                    'Teatro': 'Theater',\n                    'Sagre': 'Festivals',\n                    'Enogastronomia': 'Food & Wine',\n                    'Cinema': 'Cinema',\n                    'Sport': 'Sports',\n                    \/\/ Categorie effettive dall'API\n                    'sport_e_avventura': 'Sports & Adventure',\n                    'cultura_e_arte': 'Culture & Art',\n                    'musica_e_spettacolo': 'Music & Entertainment',\n                    'gastronomia': 'Gastronomy',\n                    'famiglia_e_bambini': 'Family & Kids',\n                    'natura_e_ambiente': 'Nature & Environment',\n                    'storia_e_tradizione': 'History & Tradition',\n                    'relax_e_benessere': 'Relax & Wellness',\n                    'spettacoli_e_concerti': 'Shows & Concerts',\n                    'fiere_e_congressi': 'Fairs & Conferences',\n                    'religione_e_spiritualit\u00e0': 'Religion & Spirituality',\n                    'tecnologia_e_innovazione': 'Technology & Innovation',\n                    'educazione_e_formazione': 'Education & Training',\n                    'salute_e_medicina': 'Health & Medicine',\n                    'viaggi_e_turismo': 'Travel & Tourism'\n                }\n            };\n            \n            const langCategories = eventCategories[currentLang] || eventCategories['it_IT'];\n            return langCategories[category] || category;\n        }\n        \n        \/\/ Fallback per altri tipi\n        if (!translations || !translations.translations || !translations.translations.OPTIONMAPS) {\n            return category;\n        }\n        const formattedType = type.charAt(0).toUpperCase() + type.slice(1);\n        const typeMap = translations.translations.OPTIONMAPS[formattedType] || {};\n        return typeMap.category?.[category] || typeMap.type?.[category] ||category;\n    }\n\n    \/\/ Funzione per estrarre le date di inizio e fine dal PRIMO periodo\n    function getProductDateRange(product) {\n        if (!product.availability || !Array.isArray(product.availability) || product.availability.length === 0) {\n            return null;\n        }\n        \n        \/\/ Prendi il primo availability\n        const avail = product.availability[0];\n        let hasNullYear = false;\n        \n        \/\/ Controlla prima se ci sono periods\n        if (avail.periods && Array.isArray(avail.periods) && avail.periods.length > 0) {\n            const period = avail.periods[0]; \/\/ Usa solo il PRIMO periodo\n            if (period.begin && period.end) {\n                \/\/ Il year \u00e8 al livello del period, non dentro begin\/end\n                if (period.year === null || period.year === undefined) {\n                    hasNullYear = true;\n                }\n                \n                \/\/ Usa l'anno specifico se presente, altrimenti usa l'anno corrente\n                const year = (period.year !== null && period.year !== undefined) \n                    ? period.year \n                    : new Date().getFullYear();\n                \n                const startDate = new Date(year, period.begin.month - 1, period.begin.day);\n                const endDate = new Date(year, period.end.month - 1, period.end.day);\n                \n                return { start: startDate, end: endDate, hasNullYear: hasNullYear };\n            }\n        }\n        \n        \/\/ Altrimenti controlla se ci sono days (per compatibilit\u00e0)\n        if (avail.days && Array.isArray(avail.days) && avail.days.length > 0) {\n            const day = avail.days[0]; \/\/ Usa solo il PRIMO giorno\n            if (day.begin) {\n                if (day.year === null || day.year === undefined) {\n                    hasNullYear = true;\n                }\n                \n                const year = (day.year !== null && day.year !== undefined) \n                    ? day.year \n                    : new Date().getFullYear();\n                const startDate = new Date(year, day.begin.month - 1, day.begin.day);\n                \n                \/\/ Se c'\u00e8 day.end, usalo, altrimenti la fine \u00e8 uguale all'inizio\n                let endDate;\n                if (day.end) {\n                    endDate = new Date(year, day.end.month - 1, day.end.day);\n                } else {\n                    endDate = startDate;\n                }\n                \n                return { start: startDate, end: endDate, hasNullYear: hasNullYear };\n            }\n        }\n        \n        return null;\n    }\n\n    \/\/ Funzione per formattare le date\n    function formatDateRange(dateRange) {\n        if (!dateRange) return '';\n        \n        const { start, end, hasNullYear } = dateRange;\n        \n        \/\/ Se year \u00e8 null, non mostrare l'anno\n        const dateOptions = hasNullYear \n            ? { day: '2-digit', month: '2-digit' }\n            : { day: '2-digit', month: '2-digit', year: 'numeric' };\n        \n        const startStr = start.toLocaleDateString('it-IT', dateOptions);\n        \n        \/\/ Se inizio e fine sono lo stesso giorno, mostra solo una data\n        if (start.toDateString() === end.toDateString()) {\n            return startStr;\n        }\n        \n        const endStr = end.toLocaleDateString('it-IT', dateOptions);\n        \n        return `${startStr} - ${endStr}`;\n    }\n\n    \/\/ Funzione per determinare se un evento \u00e8 passato\n    function isEventPast(product) {\n        if (!product.availability || !Array.isArray(product.availability) || product.availability.length === 0) {\n            return false;\n        }\n        \n        const now = new Date();\n        let hasFuturePeriods = false;\n        let hasNullYear = false;\n        \n        for (const availability of product.availability) {\n            \/\/ Controlla i periods\n            if (availability.periods && Array.isArray(availability.periods)) {\n                for (const period of availability.periods) {\n                    \/\/ Se year \u00e8 null, non considerare l'evento come passato\n                    if (period.year === null || period.year === undefined) {\n                        hasNullYear = true;\n                    }\n                    \n                    if (period.end && (period.year !== null && period.year !== undefined)) {\n                        const year = period.year;\n                        const endDate = new Date(\n                            year,\n                            (period.end.month || now.getMonth() + 1) - 1,\n                            period.end.day || now.getDate()\n                        );\n                        \n                        \/\/ Se almeno un periodo \u00e8 nel futuro, l'evento non \u00e8 passato\n                        if (endDate >= now) {\n                            hasFuturePeriods = true;\n                        }\n                    }\n                }\n            }\n            \n            \/\/ Controlla i days per compatibilit\u00e0\n            if (availability.days && Array.isArray(availability.days)) {\n                for (const day of availability.days) {\n                    \/\/ Se year \u00e8 null, non considerare l'evento come passato\n                    if (day.year === null) {\n                        hasNullYear = true;\n                    }\n                    \n                    if (day.begin && day.year && day.year !== null) {\n                        const eventDate = new Date(\n                            day.year,\n                            (day.begin.month || now.getMonth() + 1) - 1,\n                            day.begin.day || now.getDate()\n                        );\n                        \n                        \/\/ Se almeno un giorno \u00e8 nel futuro, l'evento non \u00e8 passato\n                        if (eventDate >= now) {\n                            hasFuturePeriods = true;\n                        }\n                    }\n                }\n            }\n        }\n        \n        \/\/ Se year \u00e8 null, non mostrare come \"evento passato\"\n        if (hasNullYear) {\n            return false;\n        }\n        \n        \/\/ L'evento \u00e8 passato solo se NON ci sono periodi futuri\n        return !hasFuturePeriods;\n    }\n\n    \/\/ Funzione per ottenere il nome del mese\n    function getMonthName(month, year) {\n        const months = {\n            'it_IT': ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', \n                     'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre'],\n            'en_EN': ['January', 'February', 'March', 'April', 'May', 'June',\n                     'July', 'August', 'September', 'October', 'November', 'December']\n        };\n        let currentLang = 'en_US';\n        \/\/ Normalizza en_US e en_GB a en_EN\n        if (currentLang === 'en_US' || currentLang === 'en_GB') {\n            currentLang = 'en_EN';\n        }\n        return months[currentLang][month] + ' ' + year;\n    }\n\n    \/\/ Funzione per aggiornare la visualizzazione del mese corrente\n    function updateMonthDisplay() {\n        if (currentMonthDisplay) {\n            currentMonthDisplay.textContent = getMonthName(currentMonth, currentYear);\n        }\n    }\n\n    \/\/ Funzione per gestire la visibilit\u00e0 del filtro stelle\n    function updateStarsFilterVisibility() {\n        const selectedCategory = categoryFilter ? categoryFilter.value : '';\n        const selectedCalendarCategory = calendarCategoryFilter ? calendarCategoryFilter.value : '';\n        \n        \/\/ Mostra\/nascondi filtro stelle nel tab lista\n        if (starsFilterContainer) {\n            if (selectedCategory === 'hotel') {\n                starsFilterContainer.style.display = 'block';\n            } else {\n                starsFilterContainer.style.display = 'none';\n                if (starsFilter) starsFilter.value = '';\n            }\n        }\n        \n        \/\/ Mostra\/nascondi filtro stelle nel tab calendario\n        if (calendarStarsFilterContainer) {\n            if (selectedCalendarCategory === 'hotel') {\n                calendarStarsFilterContainer.style.display = 'block';\n            } else {\n                calendarStarsFilterContainer.style.display = 'none';\n                if (calendarStarsFilter) calendarStarsFilter.value = '';\n            }\n        }\n    }\n\n    \/\/ Funzione per filtrare i prodotti per periodo temporale\n    function filterProductsByTime(products) {\n        const timeFilter = calendarTimeFilter ? calendarTimeFilter.value : 'future'; \/\/ Default a 'future'\n        \n        if (timeFilter === 'all') {\n            return products;\n        }\n        \n        const now = new Date();\n        now.setHours(0, 0, 0, 0); \/\/ Inizio del giorno corrente\n        \n        const currentWeekStart = new Date(now);\n        currentWeekStart.setDate(now.getDate() - now.getDay()); \/\/ Inizio settimana (domenica)\n        currentWeekStart.setHours(0, 0, 0, 0);\n        \n        const currentWeekEnd = new Date(currentWeekStart);\n        currentWeekEnd.setDate(currentWeekStart.getDate() + 6); \/\/ Fine settimana (sabato)\n        currentWeekEnd.setHours(23, 59, 59, 999);\n        \n        const currentMonthStart = new Date(currentYear, currentMonth, 1);\n        const currentMonthEnd = new Date(currentYear, currentMonth + 1, 0, 23, 59, 59, 999);\n        \n        return products.filter(product => {\n            if (!product.availability || !Array.isArray(product.availability) || product.availability.length === 0) {\n                return false;\n            }\n            \n            \/\/ Trova la data di inizio pi\u00f9 vicina e la data di fine pi\u00f9 lontana\n            let earliestStart = null;\n            let latestEnd = null;\n            \n            product.availability.forEach(avail => {\n                \/\/ Controlla se ci sono periods\n                if (avail.periods && Array.isArray(avail.periods)) {\n                    avail.periods.forEach(period => {\n                        if (period.begin && period.end) {\n                            const year = (period.year !== null && period.year !== undefined) \n                                ? period.year \n                                : new Date().getFullYear();\n                            const startDate = new Date(year, period.begin.month - 1, period.begin.day);\n                            const endDate = new Date(year, period.end.month - 1, period.end.day);\n                            \n                            if (!earliestStart || startDate < earliestStart) {\n                                earliestStart = startDate;\n                            }\n                            if (!latestEnd || endDate > latestEnd) {\n                                latestEnd = endDate;\n                            }\n                        }\n                    });\n                }\n                \n                \/\/ Controlla anche se ci sono days (per compatibilit\u00e0)\n                if (avail.days && Array.isArray(avail.days) && avail.days.length > 0) {\n                    avail.days.forEach(day => {\n                        if (day.begin && day.year) {\n                            const startDate = new Date(day.year, day.begin.month - 1, day.begin.day);\n                            if (!earliestStart || startDate < earliestStart) {\n                                earliestStart = startDate;\n                            }\n                            \/\/ Per i days, assumiamo che la fine sia la stessa data di inizio\n                            if (!latestEnd || startDate > latestEnd) {\n                                latestEnd = startDate;\n                            }\n                        }\n                    });\n                }\n            });\n            \n            if (!earliestStart) {\n                return false;\n            }\n            \n            switch (timeFilter) {\n                case 'future':\n                    \/\/ Eventi futuri: inizio o fine maggiore della data di oggi\n                    return earliestStart >= now || (latestEnd && latestEnd >= now);\n                case 'week':\n                    return earliestStart >= currentWeekStart && earliestStart <= currentWeekEnd;\n                case 'month':\n                    return earliestStart >= currentMonthStart && earliestStart <= currentMonthEnd;\n                default:\n                    return true;\n            }\n        });\n    }\n\n    \/\/ Sovrascrivo displayProducts per supportare infinite scroll e paginazione\n    async function displayProducts(products, reset = false) {\n        await loadTranslations();\n        if (reset) {\n            productList.innerHTML = '';\n            currentPage = 1;\n            endOfList = false;\n        }\n        \n        \/\/ Calcola l'indice di inizio e fine\n        let start = 0;\n        let end = products.length;\n        let toShow = [];\n        \n        if (paginationEnabled && itemsPerPage) {\n            \/\/ Modalit\u00e0 paginazione classica: mostra solo la pagina corrente\n            const totalPages = Math.max(1, Math.ceil(products.length \/ itemsPerPage));\n            start = (currentPage - 1) * itemsPerPage;\n            end = start + itemsPerPage;\n            toShow = products.slice(start, end);\n            \n            \/\/ Aggiorna i controlli di paginazione\n            if (paginationControls) {\n                paginationControls.style.display = products.length > itemsPerPage ? 'flex' : 'none';\n                if (currentPageNum) currentPageNum.textContent = currentPage;\n                if (totalPagesSpan) totalPagesSpan.textContent = totalPages;\n                \n                \/\/ Aggiorna lo stato dei bottoni\n                if (prevPageBtn) {\n                    prevPageBtn.disabled = currentPage <= 1;\n                    prevPageBtn.setAttribute('aria-disabled', currentPage <= 1);\n                }\n                if (nextPageBtn) {\n                    nextPageBtn.disabled = currentPage >= totalPages;\n                    nextPageBtn.setAttribute('aria-disabled', currentPage >= totalPages);\n                }\n            }\n            \n            \/\/ In modalit\u00e0 paginazione, svuota sempre la lista\n            productList.innerHTML = '';\n        } else if (itemsPerPage) {\n            \/\/ Modalit\u00e0 infinite scroll\n            start = 0;\n            end = currentPage * itemsPerPage;\n            toShow = products.slice(0, end);\n            \/\/ Nascondi i controlli di paginazione\n            if (paginationControls) paginationControls.style.display = 'none';\n        } else {\n            \/\/ Mostra tutti i prodotti\n            toShow = products;\n            if (paginationControls) paginationControls.style.display = 'none';\n        }\n        \/\/ Aggiorna le opzioni del filtro categorie (come gi\u00e0 presente)\n        if (categoryFilter) {\n            const selectedCategory = categoryFilter.value;\n            const shortcodeType = 'eatery';\n            \/\/ Per gli host ed eatery usa type, per gli altri usa category\n            let categories;\n            if (shortcodeType === 'host' || shortcodeType === 'eatery') {\n                categories = [...new Set(allProducts.map(p => p.type).filter(Boolean))];\n            } else {\n                categories = [...new Set(allProducts.map(p => p.category).filter(Boolean))];\n            }\n            \n            categoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_categories')}<\/option>`;\n            categories.forEach(category => {\n                const option = document.createElement('option');\n                option.value = category;\n                option.textContent = translateCategory(category, 'eatery');\n                if (category === selectedCategory) {\n                    option.selected = true;\n                }\n                categoryFilter.appendChild(option);\n            });\n        }\n\n        \/\/ Aggiorna le opzioni del filtro sottocategorie in base alla categoria selezionata\n        if (subcategoryFilter) {\n            const selectedCategory = categoryFilter ? categoryFilter.value : '';\n            const selectedSubcategory = subcategoryFilter.value;\n            \n            \/\/ Filtra i prodotti per la categoria selezionata\n            let filteredForSubcategory = allProducts;\n            if (selectedCategory) {\n                filteredForSubcategory = allProducts.filter(p => p.category === selectedCategory || p.type === selectedCategory);\n            }\n            \n            const subcategories = [...new Set(filteredForSubcategory.map(p => p.subcategory).filter(Boolean))];\n            subcategoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_subcategories')}<\/option>`;\n            subcategories.forEach(subcategory => {\n                const option = document.createElement('option');\n                option.value = subcategory;\n                option.textContent = subcategory;\n                if (subcategory === selectedSubcategory) {\n                    option.selected = true;\n                }\n                subcategoryFilter.appendChild(option);\n            });\n        }\n\n        \/\/ Aggiorna le opzioni del filtro categorie del calendario\n        if (calendarCategoryFilter) {\n            const selectedCalendarCategory = calendarCategoryFilter.value;\n            const shortcodeType = 'eatery';\n            \/\/ Per gli host ed eatery usa type, per gli altri usa category\n            let categories;\n            if (shortcodeType === 'host' || shortcodeType === 'eatery') {\n                categories = [...new Set(allProducts.map(p => p.type).filter(Boolean))];\n            } else {\n                categories = [...new Set(allProducts.map(p => p.category).filter(Boolean))];\n            }\n            calendarCategoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_categories')}<\/option>`;\n            categories.forEach(category => {\n                const option = document.createElement('option');\n                option.value = category;\n                option.textContent = translateCategory(category, 'eatery');\n                if (category === selectedCalendarCategory) {\n                    option.selected = true;\n                }\n                calendarCategoryFilter.appendChild(option);\n            });\n        }\n\n        \/\/ Aggiorna le opzioni del filtro sottocategorie del calendario in base alla categoria selezionata\n        if (calendarSubcategoryFilter) {\n            const selectedCalendarCategory = calendarCategoryFilter ? calendarCategoryFilter.value : '';\n            const selectedCalendarSubcategory = calendarSubcategoryFilter.value;\n            \n            \/\/ Filtra i prodotti per la categoria selezionata\n            let filteredForCalendarSubcategory = allProducts;\n            if (selectedCalendarCategory) {\n                filteredForCalendarSubcategory = allProducts.filter(p => p.category === selectedCalendarCategory || p.type === selectedCalendarCategory);\n            }\n            \n            const subcategories = [...new Set(filteredForCalendarSubcategory.map(p => p.subcategory).filter(Boolean))];\n            calendarSubcategoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_subcategories')}<\/option>`;\n            subcategories.forEach(subcategory => {\n                const option = document.createElement('option');\n                option.value = subcategory;\n                option.textContent = subcategory;\n                if (subcategory === selectedCalendarSubcategory) {\n                    option.selected = true;\n                }\n                calendarSubcategoryFilter.appendChild(option);\n            });\n        }\n\n        \/\/ Aggiorna le opzioni del filtro localit\u00e0 del calendario\n        const selectedCalendarLocation = calendarLocationFilter ? calendarLocationFilter.value : '';\n        const locations = [...new Set(allProducts.map(p => p.location).filter(Boolean))];\n        if (calendarLocationFilter) {\n            calendarLocationFilter.innerHTML = `<option value=\"\">${getUITranslation('location')}<\/option>`;\n            locations.forEach(location => {\n                const option = document.createElement('option');\n                option.value = location;\n                option.textContent = location;\n                if (location === selectedCalendarLocation) {\n                    option.selected = true;\n                }\n                calendarLocationFilter.appendChild(option);\n            });\n        }\n\n        \/\/ Aggiorna le opzioni del filtro categorie della mappa\n        if (mapCategoryFilter) {\n            const selectedMapCategory = mapCategoryFilter.value;\n            const shortcodeType = 'eatery';\n            \/\/ Per gli host ed eatery usa type, per gli altri usa category\n            let categories;\n            if (shortcodeType === 'host' || shortcodeType === 'eatery') {\n                categories = [...new Set(allProducts.map(p => p.type).filter(Boolean))];\n            } else {\n                categories = [...new Set(allProducts.map(p => p.category).filter(Boolean))];\n            }\n            mapCategoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_categories')}<\/option>`;\n            categories.forEach(category => {\n                const option = document.createElement('option');\n                option.value = category;\n                option.textContent = translateCategory(category, 'eatery');\n                if (category === selectedMapCategory) {\n                    option.selected = true;\n                }\n                mapCategoryFilter.appendChild(option);\n            });\n        }\n\n        if (toShow.length === 0) {\n            productList.innerHTML = `<div class=\"col-12 text-center\"><p>${getUITranslation('no_results')}<\/p><\/div>`;\n            endOfList = true;\n            return;\n        }\n        \n        \/\/ In modalit\u00e0 paginazione, renderizza tutte le card\n        \/\/ In modalit\u00e0 infinite scroll, renderizza solo le nuove card\n        let cardsToRender = paginationEnabled ? toShow : toShow.slice(productList.childElementCount);\n        \n        \/\/ Per eventi ed esperienze, separa futuri e passati (solo quando non ci sono filtri attivi)\n        let futureProducts = [];\n        let pastProducts = [];\n        let shouldSeparate = false;\n        \n        if ((contentType === 'event' || contentType === 'experience') && reset && cardsToRender.length > 0) {\n            \/\/ Separa solo se siamo nella lista principale (reset = true) e per eventi\/esperienze\n            cardsToRender.forEach(product => {\n                if (isEventPast(product)) {\n                    pastProducts.push(product);\n                } else {\n                    futureProducts.push(product);\n                }\n            });\n            \n            \/\/ Abilita la separazione solo se ci sono sia eventi futuri che passati\n            shouldSeparate = futureProducts.length > 0 && pastProducts.length > 0;\n            \n            if (shouldSeparate) {\n                \/\/ Inverti l'ordine dei passati (pi\u00f9 recenti prima)\n                pastProducts.reverse();\n            }\n        }\n        \n        \/\/ Renderizza le card\n        const productsToLoop = shouldSeparate ? futureProducts : cardsToRender;\n        \n        productsToLoop.forEach(product => {\n            const card = cardTemplate.content.cloneNode(true);\n            \/\/ Immagine\n            const img = card.querySelector('img');\n            const imgWrapper = card.querySelector('.card-img-wrapper');\n            \n            \/\/ Usa l'endpoint specifico per la cover\n            const coverUrl = getCoverImageUrl(product, contentType);\n            if (coverUrl) {\n                \/\/ Imposta src con pixel trasparente e data-src con l'URL reale per lazy loading\n                img.src = transparentPixel;\n                img.dataset.src = coverUrl;\n                img.alt = product.title || product.name;\n                \n                \/\/ Gestisci l'errore di caricamento (404)\n                img.onerror = function() {\n                    this.remove();\n                    const placeholder = document.createElement('div');\n                    placeholder.className = 'card-img-placeholder';\n                    const icon = getContentTypeIcon(product, contentType);\n                    placeholder.innerHTML = `<i class=\"fas ${icon} fa-4x\"><\/i>`;\n                    imgWrapper.appendChild(placeholder);\n                };\n            } else {\n                \/\/ Sostituisco l'immagine con un placeholder\n                img.remove();\n                const placeholder = document.createElement('div');\n                placeholder.className = 'card-img-placeholder';\n                const icon = getContentTypeIcon(product, contentType);\n                placeholder.innerHTML = `<i class=\"fas ${icon} fa-4x\"><\/i>`;\n                imgWrapper.appendChild(placeholder);\n            }\n            \/\/ Date e Prezzo\n            const duration = card.querySelector('.duration');\n            const price = card.querySelector('.price');\n            const dateRange = getProductDateRange(product);\n            if (dateRange) {\n                duration.innerHTML = `<i class=\"fas fa-calendar\"><\/i> ${formatDateRange(dateRange)}`;\n            }\n            if (product.price) {\n                price.innerHTML = `<i class=\"fas fa-euro-sign\"><\/i> ${product.price}`;\n            }\n            \/\/ Titolo\n            const title = card.querySelector('.card-title');\n            title.textContent = product.title || product.name;\n            \/\/ Tipo tradotto\n            const typeBadge = card.querySelector('.type-badge');\n            \/\/ Usa sempre il tipo dello shortcode, ma se \u00e8 experience e product.type \u00e8 package, usa 'travel'\n            let displayType = 'eatery';\n            if (displayType === 'experience' && product.type === 'package') {\n                displayType = 'travel';\n            }\n            typeBadge.textContent = translateString(displayType);\n            \/\/ Categoria tradotta\n            const categoryBadge = card.querySelector('.category-badge');\n            let category = '';\n            \/\/ Per gli host ed eatery usa type, per gli altri usa category\n            if ('eatery' === 'event' && product.event_categories && product.event_categories.length > 0) {\n                \/\/ Per gli eventi, prendi la prima categoria dalle event_categories\n                category = product.event_categories[0].name || '';\n            } else if ('eatery' === 'host' || 'eatery' === 'eatery') {\n                \/\/ Per gli host ed eatery, usa type invece di category\n                category = product.type || 'eatery' || '';\n            } else {\n                category = product.category || 'eatery' || '';\n            }\n            \/\/ Usa sempre il tipo dello shortcode\n            const categoryType = 'eatery';\n            categoryBadge.textContent = translateCategory(category, categoryType);\n            \n            \/\/ Controlla se l'evento \u00e8 passato (solo per eventi)\n            const pastEventBadge = card.querySelector('.past-event-badge');\n            const pastEventText = card.querySelector('.past-event-text');\n            if (pastEventBadge && pastEventText) {\n                \/\/ Mostra il badge solo per eventi (type='event' o experience con type='event')\n                const isEvent = contentType === 'event' || (contentType === 'experience' && product.type === 'event');\n                if (isEvent && isEventPast(product)) {\n                    pastEventBadge.style.display = 'block';\n                    const pastEventLabel = (translations && translations.translations && translations.translations.past_event) \n                        ? translations.translations.past_event \n                        : 'Evento passato';\n                    pastEventText.textContent = pastEventLabel;\n                } else {\n                    pastEventBadge.style.display = 'none';\n                }\n            }\n            \n            \/\/ Link\n            const cardLink = card.querySelector('.card-link');\n            \/\/ Usa sempre il tipo dello shortcode\n            const linkType = 'eatery';\n            cardLink.href = generateUrl(product, linkType);\n            productList.appendChild(card);\n        });\n        \n        \/\/ Se ci sono eventi passati da mostrare, aggiungi separatore e renderizzali\n        if (shouldSeparate && pastProducts.length > 0) {\n            const separator = document.createElement('div');\n            separator.className = 'col-12 mt-4 mb-3';\n            separator.innerHTML = `<h3 class=\"text-muted border-bottom pb-2\">${getUITranslation('past_events') || 'Eventi Passati'}<\/h3>`;\n            productList.appendChild(separator);\n            \n            pastProducts.forEach(product => {\n                const card = cardTemplate.content.cloneNode(true);\n                \/\/ Immagine\n                const img = card.querySelector('img');\n                const imgWrapper = card.querySelector('.card-img-wrapper');\n                \n                \/\/ Usa l'endpoint specifico per la cover\n                const coverUrl = getCoverImageUrl(product, contentType);\n                if (coverUrl) {\n                    img.src = transparentPixel;\n                    img.dataset.src = coverUrl;\n                    img.alt = product.title || product.name;\n                    img.onerror = function() {\n                        this.remove();\n                        const placeholder = document.createElement('div');\n                        placeholder.className = 'card-img-placeholder';\n                        const icon = getContentTypeIcon(product, contentType);\n                        placeholder.innerHTML = `<i class=\"fas ${icon} fa-4x\"><\/i>`;\n                        imgWrapper.appendChild(placeholder);\n                    };\n                } else {\n                    img.remove();\n                    const placeholder = document.createElement('div');\n                    placeholder.className = 'card-img-placeholder';\n                    const icon = getContentTypeIcon(product, contentType);\n                    placeholder.innerHTML = `<i class=\"fas ${icon} fa-4x\"><\/i>`;\n                    imgWrapper.appendChild(placeholder);\n                }\n                \n                \/\/ Date e Prezzo\n                const duration = card.querySelector('.duration');\n                const price = card.querySelector('.price');\n                const dateRange = getProductDateRange(product);\n                if (dateRange) {\n                    duration.innerHTML = `<i class=\"fas fa-calendar\"><\/i> ${formatDateRange(dateRange)}`;\n                }\n                if (product.price) {\n                    price.innerHTML = `<i class=\"fas fa-euro-sign\"><\/i> ${product.price}`;\n                }\n                \n                \/\/ Titolo\n                const title = card.querySelector('.card-title');\n                title.textContent = product.title || product.name;\n                \n                \/\/ Tipo tradotto\n                const typeBadge = card.querySelector('.type-badge');\n                let displayType = 'eatery';\n                if (displayType === 'experience' && product.type === 'package') {\n                    displayType = 'travel';\n                }\n                typeBadge.textContent = translateString(displayType);\n                \n                \/\/ Categoria tradotta\n                const categoryBadge = card.querySelector('.category-badge');\n                let category = '';\n                if ('eatery' === 'event' && product.event_categories && product.event_categories.length > 0) {\n                    category = product.event_categories[0].name || '';\n                } else if ('eatery' === 'host' || 'eatery' === 'eatery') {\n                    \/\/ Per gli host ed eatery, usa type invece di category\n                    category = product.type || 'eatery' || '';\n                } else {\n                    category = product.category || 'eatery' || '';\n                }\n                const categoryType = 'eatery';\n                categoryBadge.textContent = translateCategory(category, categoryType);\n                \n                \/\/ Badge evento passato (solo per eventi)\n                const pastEventBadge = card.querySelector('.past-event-badge');\n                const pastEventText = card.querySelector('.past-event-text');\n                if (pastEventBadge && pastEventText) {\n                    \/\/ Mostra il badge solo per eventi (type='event' o experience con type='event')\n                    const isEvent = contentType === 'event' || (contentType === 'experience' && product.type === 'event');\n                    if (isEvent) {\n                        pastEventBadge.style.display = 'block';\n                        const pastEventLabel = (translations && translations.translations && translations.translations.past_event) \n                            ? translations.translations.past_event \n                            : 'Evento passato';\n                        pastEventText.textContent = pastEventLabel;\n                    } else {\n                        pastEventBadge.style.display = 'none';\n                    }\n                }\n                \n                \/\/ Link\n                const cardLink = card.querySelector('.card-link');\n                const linkType = 'eatery';\n                cardLink.href = generateUrl(product, linkType);\n                productList.appendChild(card);\n            });\n        }\n        \n        \/\/ Osserva tutte le immagini lazy appena aggiunte\n        const lazyImages = productList.querySelectorAll('img.lazy-img[data-src]:not([data-observed])');\n        lazyImages.forEach(img => {\n            img.dataset.observed = 'true'; \/\/ Marca come gi\u00e0 osservata per evitare duplicati\n            imageObserver.observe(img);\n        });\n        \n        \/\/ Se abbiamo mostrato tutti i prodotti, segna fine lista\n        if (toShow.length >= products.length) {\n            endOfList = true;\n        }\n        \/\/ Applica l'altezza uniforme dopo che tutte le card sono state renderizzate\n        setTimeout(() => {\n            const cards = productList.querySelectorAll('.card');\n            const rows = Math.ceil(cards.length \/ 3);\n            for (let i = 0; i < rows; i++) {\n                const rowCards = Array.from(cards).slice(i * 3, (i + 1) * 3);\n                const maxHeight = Math.max(...rowCards.map(card => card.offsetHeight));\n                rowCards.forEach(card => {\n                    card.style.height = `${maxHeight}px`;\n                });\n            }\n        }, 100);\n    }\n\n    \/\/ Gestori paginazione\n    if (prevPageBtn && paginationEnabled && itemsPerPage) {\n        prevPageBtn.addEventListener('click', function(e) {\n            e.preventDefault();\n            if (currentPage > 1 && !this.disabled) {\n                currentPage--;\n                \/\/ Non passare reset=true perch\u00e9 non vogliamo resettare currentPage\n                displayProducts(filteredProducts.length ? filteredProducts : allProducts, false);\n                \/\/ Scroll verso l'alto della lista\n                const listContainer = document.querySelector('.entourance-product-list');\n                if (listContainer) {\n                    listContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                }\n            }\n        });\n    }\n    \n    if (nextPageBtn && paginationEnabled && itemsPerPage) {\n        nextPageBtn.addEventListener('click', function(e) {\n            e.preventDefault();\n            const products = filteredProducts.length ? filteredProducts : allProducts;\n            const totalPages = Math.ceil(products.length \/ itemsPerPage);\n            if (currentPage < totalPages && !this.disabled) {\n                currentPage++;\n                \/\/ Non passare reset=true perch\u00e9 non vogliamo resettare currentPage\n                displayProducts(products, false);\n                \/\/ Scroll verso l'alto della lista\n                const listContainer = document.querySelector('.entourance-product-list');\n                if (listContainer) {\n                    listContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });\n                }\n            }\n        });\n    }\n\n    \/\/ Infinite scroll handler (solo se paginazione non abilitata)\n    if (!paginationEnabled) {\n        window.addEventListener('scroll', function() {\n            if (loading || endOfList || !itemsPerPage) return;\n            if ((window.innerHeight + window.scrollY) >= (document.body.offsetHeight - 200)) {\n                loading = true;\n                currentPage++;\n                displayProducts(filteredProducts.length ? filteredProducts : allProducts).then(() => {\n                    loading = false;\n                });\n            }\n        });\n    }\n\n    \/\/ Funzione per ordinare i prodotti\n    function sortProducts(products) {\n        const orderField = 'title';\n        const orderDirection = 'ASC';\n        \n        \/\/ Se non c'\u00e8 un ordinamento specificato e siamo su eventi o esperienze, ordina per data\n        if (!orderField && (contentType === 'event' || contentType === 'experience')) {\n            return sortProductsByAvailability(products);\n        }\n        \n        if (!orderField) {\n            return products; \/\/ Nessun ordinamento richiesto\n        }\n        \n        const sorted = [...products]; \/\/ Crea una copia per non modificare l'array originale\n        \n        sorted.sort((a, b) => {\n            let valueA, valueB;\n            \n            \/\/ Ottieni i valori in base al campo\n            switch(orderField) {\n                case 'name':\n                case 'title':\n                    valueA = (a.title || a.name || '').toLowerCase();\n                    valueB = (b.title || b.name || '').toLowerCase();\n                    break;\n                case 'price':\n                    valueA = parseFloat(a.price) || 0;\n                    valueB = parseFloat(b.price) || 0;\n                    break;\n                case 'category':\n                    valueA = (a.category || '').toLowerCase();\n                    valueB = (b.category || '').toLowerCase();\n                    break;\n                case 'type':\n                    valueA = (a.type || '').toLowerCase();\n                    valueB = (b.type || '').toLowerCase();\n                    break;\n                case 'stars':\n                    valueA = parseInt(a.stars) || 0;\n                    valueB = parseInt(b.stars) || 0;\n                    break;\n                default:\n                    \/\/ Campo generico\n                    valueA = (a[orderField] || '').toString().toLowerCase();\n                    valueB = (b[orderField] || '').toString().toLowerCase();\n            }\n            \n            \/\/ Confronta i valori\n            let comparison = 0;\n            if (valueA < valueB) {\n                comparison = -1;\n            } else if (valueA > valueB) {\n                comparison = 1;\n            }\n            \n            \/\/ Applica la direzione dell'ordinamento\n            return orderDirection.toUpperCase() === 'DESC' ? -comparison : comparison;\n        });\n        \n        return sorted;\n    }\n\n    \/\/ Modifica filterProducts per resettare la lista e la paginazione\n    function filterProducts() {\n        const searchTerm = searchInput ? searchInput.value.toLowerCase() : '';\n        const selectedCategory = categoryFilter ? categoryFilter.value : '';\n        const selectedSubcategory = subcategoryFilter ? subcategoryFilter.value : '';\n        const selectedLocation = locationFilter ? locationFilter.value : '';\n        const selectedStars = starsFilter ? starsFilter.value : '';\n        const selectedTag = tagFilter ? tagFilter.value : '';\n        \n        filteredProducts = allProducts.filter(product => {\n            const matchesSearch = !searchTerm || (product.title || product.name).toLowerCase().includes(searchTerm);\n            \/\/ Per gli host usa type, per gli altri usa category\n            let matchesCategory = true;\n            if (selectedCategory) {\n                if ('eatery' === 'host') {\n                    matchesCategory = product.type === selectedCategory;\n                } else {\n                    matchesCategory = product.category === selectedCategory;\n                }\n            }\n            const matchesSubcategory = !selectedSubcategory || product.subcategory === selectedSubcategory;\n            const matchesLocation = !selectedLocation || product.location === selectedLocation;\n            const matchesStars = !selectedStars || (product.stars && product.stars.toString() === selectedStars);\n            const matchesTag = !selectedTag ||\n                (Array.isArray(product.tags) && product.tags.includes(selectedTag)) ||\n                (typeof product.tags === 'string' && product.tags.split(',').map(t => t.trim()).includes(selectedTag));\n            \n            return matchesSearch && matchesCategory && matchesSubcategory && matchesLocation && matchesStars && matchesTag;\n        });\n        \n        \/\/ Applica l'ordinamento prima di visualizzare\n        filteredProducts = sortProducts(filteredProducts);\n        \n        displayProducts(filteredProducts, true);\n    }\n\n    \/\/ Funzione per filtrare i prodotti del calendario\n    function filterCalendarProducts() {\n        const searchTerm = calendarSearchInput ? calendarSearchInput.value.toLowerCase() : '';\n        const selectedCategory = calendarCategoryFilter ? calendarCategoryFilter.value : '';\n        const selectedSubcategory = calendarSubcategoryFilter ? calendarSubcategoryFilter.value : '';\n        const selectedLocation = calendarLocationFilter ? calendarLocationFilter.value : '';\n        const selectedStars = calendarStarsFilter ? calendarStarsFilter.value : '';\n        const timeFilter = calendarTimeFilter ? calendarTimeFilter.value : 'future';\n        \n        let calendarFilteredProducts = allProducts.filter(product => {\n            const matchesSearch = !searchTerm || (product.title || product.name).toLowerCase().includes(searchTerm);\n            \/\/ Per gli host usa type, per gli altri usa category\n            let matchesCategory = true;\n            if (selectedCategory) {\n                if ('eatery' === 'host') {\n                    matchesCategory = product.type === selectedCategory;\n                } else {\n                    matchesCategory = product.category === selectedCategory;\n                }\n            }\n            const matchesSubcategory = !selectedSubcategory || product.subcategory === selectedSubcategory;\n            const matchesLocation = !selectedLocation || product.location === selectedLocation;\n            const matchesStars = !selectedStars || (product.stars && product.stars.toString() === selectedStars);\n            return matchesSearch && matchesCategory && matchesSubcategory && matchesLocation && matchesStars;\n        });\n        \n        \/\/ Applica il filtro temporale\n        calendarFilteredProducts = filterProductsByTime(calendarFilteredProducts);\n        \n        updateCalendarView(calendarFilteredProducts);\n    }\n\n    \/\/ Funzione per filtrare i prodotti della mappa\n    function filterMapProducts() {\n        const selectedCategory = mapCategoryFilter ? mapCategoryFilter.value : '';\n        const mapFilteredProducts = allProducts.filter(product => {\n            \/\/ Per gli host usa type, per gli altri usa category\n            let matchesCategory = true;\n            if (selectedCategory) {\n                if ('eatery' === 'host') {\n                    matchesCategory = product.type === selectedCategory;\n                } else {\n                    matchesCategory = product.category === selectedCategory;\n                }\n            }\n            return matchesCategory;\n        });\n        updateLeafletMap(mapFilteredProducts);\n    }\n\n    \/\/ Carica le traduzioni prima di tutto\n    loadTranslations().then(() => {\n        loadProducts();\n    }).catch(error => {\n        console.warn('Error loading translations:', error);\n        loadProducts(); \/\/ Carica comunque i prodotti anche se le traduzioni falliscono\n    });\n    \n    \/\/ Funzione per caricare i prodotti\n    function loadProducts() {\n        fetch(apiUrl)\n    .then(response => response.json())\n        .then(data => {\n            allProducts = data;\n            \n            \/\/ Filtra per tipo dello shortcode\n            const shortcodeType = 'eatery';\n            \n            \/\/ IMPORTANTE: Per gli host, eatery, poi, experience e itinerary, non filtriamo per tipo\n            \/\/ perch\u00e9 l'endpoint API restituisce gi\u00e0 solo quelli e il campo \"type\" \n            \/\/ rappresenta la categoria o il sottotipo (es. per host: hotel, b&b; per experience: event; per itinerary: il tipo di itinerario)\n            if (shortcodeType !== 'host' && shortcodeType !== 'eatery' && shortcodeType !== 'poi' && shortcodeType !== 'experience' && shortcodeType !== 'itinerary') {\n                allProducts = allProducts.filter(product => {\n                    \/\/ Se il prodotto ha un tipo specifico, deve corrispondere al tipo dello shortcode\n                    if (product.type && product.type !== shortcodeType) {\n                        return false;\n                    }\n                    return true;\n                });\n            }\n            \n            \/\/ Se non ci sono prodotti del tipo richiesto, mostra un messaggio\n            if (allProducts.length === 0) {\n                const noProductsMessage = document.createElement('div');\n                noProductsMessage.className = 'alert alert-info text-center';\n                noProductsMessage.innerHTML = `<i class=\"fas fa-info-circle\"><\/i> Nessun ${shortcodeType} trovato.`;\n                \n                \/\/ Trova il container appropriato\n                const productListContainer = document.getElementById('entourance-product-list');\n                if (productListContainer) {\n                    productListContainer.appendChild(noProductsMessage);\n                } else {\n                    \/\/ Fallback: aggiungi al body\n                    document.body.appendChild(noProductsMessage);\n                }\n            }\n            \n            \/\/ Filtra per categoria se specificata\n                        \n            \/\/ Applica l'ordinamento ai prodotti caricati\n            allProducts = sortProducts(allProducts);\n            \n            filteredProducts = [];\n            displayProducts(allProducts, true);\n            \/\/ Aggiorna la visibilit\u00e0 del filtro stelle dopo il caricamento\n            updateStarsFilterVisibility();\n            \/\/ Applica il filtro temporale di default al calendario\n            filterCalendarProducts();\n            \n            \/\/ Inizializza la mappa se il tab mappa \u00e8 attivo\n            setTimeout(function() {\n                const mapElement = document.getElementById('map');\n                if (mapElement && mapElement.classList.contains('active')) {\n                    updateLeafletMap(allProducts);\n                }\n            }, 300);\n        })\n        .catch(error => {\n            console.error('Error loading products:', error);\n            productList.innerHTML = `<div class=\"col-12 text-center\"><p>Error loading products<\/p><\/div>`;\n        });\n    }\n\n    \/\/ Event listeners per i filtri\n    if (categoryFilter) {\n        categoryFilter.addEventListener('change', function() {\n            if (this.value === '') {\n                if (searchInput) searchInput.value = '';\n                if (subcategoryFilter) subcategoryFilter.value = '';\n                if (locationFilter) locationFilter.value = '';\n                if (starsFilter) starsFilter.value = '';\n                if (tagFilter) tagFilter.value = '';\n            }\n            \/\/ Aggiorna il filtro sottocategorie quando cambia la categoria\n            if (subcategoryFilter) {\n                const selectedCategory = this.value;\n                const selectedSubcategory = subcategoryFilter.value;\n                \n                \/\/ Filtra i prodotti per la categoria selezionata\n                let filteredForSubcategory = allProducts;\n                if (selectedCategory) {\n                    filteredForSubcategory = allProducts.filter(p => p.category === selectedCategory || p.type === selectedCategory);\n                }\n                \n                const subcategories = [...new Set(filteredForSubcategory.map(p => p.subcategory).filter(Boolean))];\n                subcategoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_subcategories')}<\/option>`;\n                subcategories.forEach(subcategory => {\n                    const option = document.createElement('option');\n                    option.value = subcategory;\n                    option.textContent = subcategory;\n                    subcategoryFilter.appendChild(option);\n                });\n            }\n            \/\/ Aggiorna la visibilit\u00e0 del filtro stelle\n            updateStarsFilterVisibility();\n            filterProducts();\n        });\n    }\n    if (subcategoryFilter) {\n        subcategoryFilter.addEventListener('change', filterProducts);\n    }\n    if (locationFilter) {\n        locationFilter.addEventListener('change', filterProducts);\n    }\n    if (starsFilter) {\n        starsFilter.addEventListener('change', filterProducts);\n    }\n    if (tagFilter) {\n        tagFilter.addEventListener('change', filterProducts);\n    }\n    if (searchInput) {\n        searchInput.addEventListener('input', filterProducts);\n    }\n    if (searchButton) {\n        searchButton.addEventListener('click', filterProducts);\n    }\n\n    \/\/ Event listeners per i filtri del calendario\n    if (calendarCategoryFilter) {\n        calendarCategoryFilter.addEventListener('change', function() {\n            if (this.value === '') {\n                if (calendarSearchInput) calendarSearchInput.value = '';\n                if (calendarSubcategoryFilter) calendarSubcategoryFilter.value = '';\n                if (calendarLocationFilter) calendarLocationFilter.value = '';\n                if (calendarStarsFilter) calendarStarsFilter.value = '';\n            }\n            \/\/ Aggiorna il filtro sottocategorie del calendario quando cambia la categoria\n            if (calendarSubcategoryFilter) {\n                const selectedCategory = this.value;\n                const selectedSubcategory = calendarSubcategoryFilter.value;\n                \n                \/\/ Filtra i prodotti per la categoria selezionata\n                let filteredForSubcategory = allProducts;\n                if (selectedCategory) {\n                    filteredForSubcategory = allProducts.filter(p => p.category === selectedCategory || p.type === selectedCategory);\n                }\n                \n                const subcategories = [...new Set(filteredForSubcategory.map(p => p.subcategory).filter(Boolean))];\n                calendarSubcategoryFilter.innerHTML = `<option value=\"\">${getUITranslation('all_subcategories')}<\/option>`;\n                subcategories.forEach(subcategory => {\n                    const option = document.createElement('option');\n                    option.value = subcategory;\n                    option.textContent = subcategory;\n                    calendarSubcategoryFilter.appendChild(option);\n                });\n            }\n            \/\/ Aggiorna la visibilit\u00e0 del filtro stelle\n            updateStarsFilterVisibility();\n            filterCalendarProducts();\n        });\n    }\n    if (calendarSubcategoryFilter) {\n        calendarSubcategoryFilter.addEventListener('change', filterCalendarProducts);\n    }\n    if (calendarLocationFilter) {\n        calendarLocationFilter.addEventListener('change', filterCalendarProducts);\n    }\n    if (calendarStarsFilter) {\n        calendarStarsFilter.addEventListener('change', filterCalendarProducts);\n    }\n    if (calendarSearchInput) {\n        calendarSearchInput.addEventListener('input', filterCalendarProducts);\n    }\n    if (calendarSearchButton) {\n        calendarSearchButton.addEventListener('click', filterCalendarProducts);\n    }\n\n    \/\/ Event listener per il filtro temporale\n    if (calendarTimeFilter) {\n        calendarTimeFilter.addEventListener('change', function() {\n            if (this.value === 'month') {\n                if (monthNavigation) monthNavigation.style.display = 'block';\n                updateMonthDisplay();\n            } else {\n                if (monthNavigation) monthNavigation.style.display = 'none';\n            }\n            filterCalendarProducts();\n        });\n    }\n\n    \/\/ Event listeners per la navigazione mensile\n    if (prevMonth) {\n        prevMonth.addEventListener('click', function() {\n            currentMonth--;\n            if (currentMonth < 0) {\n                currentMonth = 11;\n                currentYear--;\n            }\n            updateMonthDisplay();\n            filterCalendarProducts();\n        });\n    }\n\n    if (nextMonth) {\n        nextMonth.addEventListener('click', function() {\n            currentMonth++;\n            if (currentMonth > 11) {\n                currentMonth = 0;\n                currentYear++;\n            }\n            updateMonthDisplay();\n            filterCalendarProducts();\n        });\n    }\n\n    \/\/ Event listener per il filtro della mappa\n    if (mapCategoryFilter) {\n        mapCategoryFilter.addEventListener('change', filterMapProducts);\n    }\n\n    \/\/ Funzione helper per estrarre le coordinate da un prodotto\n    function getProductCoordinates(product) {\n        let lat = null, lng = null;\n        \/\/ Caso 1: product.coordinates = {type: 'Point', coordinates: [lat, lng]} \n        if (product.coordinates && typeof product.coordinates === 'object' && Array.isArray(product.coordinates.coordinates)) {\n            \/\/ L'API sembra usare [latitude, longitude] invece del formato GeoJSON standard\n            lat = product.coordinates.coordinates[0]; \/\/ latitude\n            lng = product.coordinates.coordinates[1]; \/\/ longitude\n        }\n        \/\/ Caso 2: product.coordinates = [lat, lng] (array semplice)\n        else if (Array.isArray(product.coordinates) && product.coordinates.length === 2) {\n            \/\/ Assumo [latitude, longitude]\n            lat = product.coordinates[0]; \/\/ latitude\n            lng = product.coordinates[1]; \/\/ longitude\n        }\n        \/\/ Caso 3: fallback su latitude\/longitude o lat\/lng\n        else if ((product.latitude && product.longitude) || (product.lat && product.lng)) {\n            lat = product.latitude || product.lat;\n            lng = product.longitude || product.lng;\n        }\n        \n        return { lat, lng };\n    }\n\n    \/\/ Funzione per aggiornare la mappa Leaflet con i marker dei prodotti\n    let leafletMap = null;\n    function updateLeafletMap(products) {\n        const mapDiv = document.getElementById('entouranceMap');\n        if (!mapDiv) {\n            console.warn('Elemento mappa non trovato');\n            return;\n        }\n        \n        \/\/ Verifica che Leaflet sia caricato\n        if (typeof L === 'undefined') {\n            console.error('Leaflet non \u00e8 caricato');\n            return;\n        }\n        \n        \/\/ Fix per le icone di default di Leaflet (applica sempre, anche se Leaflet era gi\u00e0 presente)\n        if (L.Icon && L.Icon.Default) {\n            delete L.Icon.Default.prototype._getIconUrl;\n            L.Icon.Default.mergeOptions({\n                iconRetinaUrl: 'https:\/\/cumarcheologia.it\/wp-content\/plugins\/entourance-wp-plugin\/lib\/leaflet\/images\/marker-icon-2x.png',\n                iconUrl: 'https:\/\/cumarcheologia.it\/wp-content\/plugins\/entourance-wp-plugin\/lib\/leaflet\/images\/marker-icon.png',\n                shadowUrl: 'https:\/\/cumarcheologia.it\/wp-content\/plugins\/entourance-wp-plugin\/lib\/leaflet\/images\/marker-shadow.png'\n            });\n        }\n        \n        if (leafletMap) {\n            leafletMap.remove();\n        }\n        \n        \/\/ Inizializza la mappa con un centro di default\n        leafletMap = L.map('entouranceMap').setView([41.8719, 12.5674], 6); \/\/ Centro Italia\n        L.tileLayer('https:\/\/{s}.tile.openstreetmap.org\/{z}\/{x}\/{y}.png', {\n            attribution: '&copy; <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap<\/a> contributors'\n        }).addTo(leafletMap);\n        \n        \/\/ Crea un bounds per il fit automatico\n        const bounds = L.latLngBounds();\n        let hasValidMarkers = false;\n        const validProducts = [];\n        \n        products.forEach(product => {\n            const { lat, lng } = getProductCoordinates(product);\n            \n            if (lat && lng && !isNaN(lat) && !isNaN(lng)) {\n                const marker = L.marker([lat, lng]).addTo(leafletMap);\n                \n                \/\/ Crea un popup con immagine e stile migliorato\n                const coverUrl = getCoverImageUrl(product, contentType);\n                const productTitle = product.title || product.name || 'Senza titolo';\n                const productUrl = (product.slug || product.id) ? generateUrl(product, 'eatery') : '#';\n                \n                let popupContent = '<div class=\"entourance-map-popup\">';\n                \n                \/\/ Immagine\n                if (coverUrl) {\n                    popupContent += `\n                        <div class=\"popup-image\">\n                            <img src=\"${coverUrl}\" alt=\"${productTitle}\" style=\"width: 100%; height: 150px; object-fit: cover;\" loading=\"lazy\">\n                        <\/div>\n                    `;\n                }\n                \n                \/\/ Contenuto\n                popupContent += '<div class=\"popup-content\" style=\"padding: 16px;\">';\n                popupContent += `<h4 style=\"margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: #333; line-height: 1.4;\">${productTitle}<\/h4>`;\n                \n                \/\/ Categoria o tipo - tradotto\n                if (product.category || product.type) {\n                    const categoryKey = product.category || product.type;\n                    const categoryLabel = translateString(categoryKey);\n                    popupContent += `<p style=\"margin: 0 0 12px 0; font-size: 13px; color: #666;\"><i class=\"fas fa-tag\" style=\"margin-right: 4px;\"><\/i>${categoryLabel}<\/p>`;\n                }\n                \n                \/\/ Pulsante\n                if (productUrl !== '#') {\n                    popupContent += `<a href=\"${productUrl}\" class=\"popup-link-btn\" style=\"display: inline-block; width: 100%; padding: 10px 16px; background: white; color: var(--gyg-primary, #007bff); text-decoration: none; border-radius: 6px; font-size: 14px; font-weight: 500; text-align: center; border: 2px solid var(--gyg-primary, #007bff); transition: all 0.3s; box-sizing: border-box;\">Vai alla scheda <i class=\"fas fa-arrow-right\" style=\"margin-left: 4px;\"><\/i><\/a>`;\n                }\n                \n                popupContent += '<\/div><\/div>';\n                \n                marker.bindPopup(popupContent, {\n                    maxWidth: 280,\n                    minWidth: 250,\n                    className: 'entourance-custom-popup',\n                    closeButton: true\n                });\n                \n                \/\/ Estendi i bounds con questo marker\n                bounds.extend([lat, lng]);\n                hasValidMarkers = true;\n                validProducts.push(product);\n            }\n        });\n        \n        \/\/ Forza il ricalcolo delle dimensioni della mappa (necessario quando viene mostrata dopo essere stata nascosta)\n        setTimeout(function() {\n            if (leafletMap) {\n                leafletMap.invalidateSize();\n            }\n        }, 100);\n        \n        \/\/ Applica il fit bounds se ci sono marker validi\n        if (hasValidMarkers && bounds.isValid()) {\n            if (validProducts.length === 1) {\n                \/\/ Per un singolo marker, usa setView con zoom pi\u00f9 vicino\n                const { lat, lng } = getProductCoordinates(validProducts[0]);\n                if (lat && lng) {\n                    leafletMap.setView([lat, lng], 14); \/\/ Zoom pi\u00f9 vicino per un singolo marker\n                }\n            } else {\n                \/\/ Per pi\u00f9 marker, usa fitBounds\n                leafletMap.fitBounds(bounds, {\n                    padding: [20, 20], \/\/ Padding per evitare che i marker tocchino i bordi\n                    maxZoom: 16 \/\/ Zoom massimo per evitare zoom eccessivi\n                });\n            }\n        }\n    }\n\n    \/\/ Aggiorna la mappa quando si passa al tab \"Mappa\"\n    \/\/ Nota: Questo listener \u00e8 un fallback. La logica principale \u00e8 nella funzione activateTab()\n    const mapTab = document.getElementById('entourance-map-tab');\n    if (mapTab) {\n        mapTab.addEventListener('click', function(e) {\n            \/\/ Usa i prodotti filtrati se ci sono, altrimenti tutti\n            setTimeout(function() {\n                const productsToShow = filteredProducts.length ? filteredProducts : allProducts;\n                updateLeafletMap(productsToShow);\n            }, 350);\n        });\n    }\n\n    \/\/ Aggiorna il calendario quando si passa al tab \"Calendario\"\n    const calendarTab = document.getElementById('entourance-calendar-tab');\n    if (calendarTab) {\n        calendarTab.addEventListener('click', function() {\n            \/\/ Applica il filtro temporale di default quando si apre il tab calendario\n            setTimeout(function() {\n                filterCalendarProducts();\n            }, 200);\n        });\n    }\n\n    \/\/ Funzione per ordinare i prodotti per data di fine (o data unica se begin == end)\n    function sortProductsByAvailability(products) {\n        return products.sort((a, b) => {\n            \/\/ Usa getProductDateRange per ottenere le date corrette\n            const aDateRange = getProductDateRange(a);\n            const bDateRange = getProductDateRange(b);\n            \n            \/\/ Prodotti senza date vanno alla fine\n            if (!aDateRange && !bDateRange) return 0;\n            if (!aDateRange) return 1;\n            if (!bDateRange) return -1;\n            \n            \/\/ Ordina per data di fine (end)\n            return aDateRange.end - bDateRange.end;\n        });\n    }\n\n    \/\/ Funzione per visualizzare i prodotti nel tab calendario\n    function updateCalendarView(products) {\n        const calendarList = document.getElementById('calendarList');\n        if (!calendarList || !cardTemplate) return;\n        \n        calendarList.innerHTML = '';\n        \n        if (products.length === 0) {\n            calendarList.innerHTML = `<div class=\"col-12 text-center\"><p>${getUITranslation('no_results')}<\/p><\/div>`;\n            return;\n        }\n        \n        const timeFilter = calendarTimeFilter ? calendarTimeFilter.value : 'future';\n        \n        \/\/ Se il filtro \u00e8 su \"Tutti\", separa eventi futuri e passati\n        if (timeFilter === 'all') {\n            const now = new Date();\n            now.setHours(0, 0, 0, 0);\n            \n            \/\/ Separa eventi futuri e passati\n            const futureEvents = [];\n            const pastEvents = [];\n            \n            products.forEach(product => {\n                if (isEventPast(product)) {\n                    pastEvents.push(product);\n                } else {\n                    futureEvents.push(product);\n                }\n            });\n            \n            \/\/ Ordina eventi futuri (data crescente)\n            const sortedFuture = sortProductsByAvailability(futureEvents);\n            \n            \/\/ Ordina eventi passati (data decrescente - pi\u00f9 recenti prima)\n            const sortedPast = sortProductsByAvailability(pastEvents).reverse();\n            \n            \/\/ Mostra eventi futuri\n            sortedFuture.forEach(product => {\n                renderCalendarCard(product, calendarList);\n            });\n            \n            \/\/ Se ci sono eventi passati, aggiungi separatore e mostrali\n            if (sortedPast.length > 0) {\n                const separator = document.createElement('div');\n                separator.className = 'col-12 mt-4 mb-3';\n                separator.innerHTML = `<h3 class=\"text-muted border-bottom pb-2\">${getUITranslation('past_events') || 'Eventi Passati'}<\/h3>`;\n                calendarList.appendChild(separator);\n                \n                sortedPast.forEach(product => {\n                    renderCalendarCard(product, calendarList);\n                });\n            }\n        } else {\n            \/\/ Per altri filtri, ordina normalmente\n            const sortedProducts = sortProductsByAvailability(products);\n            sortedProducts.forEach(product => {\n                renderCalendarCard(product, calendarList);\n            });\n        }\n        \n        \/\/ Osserva tutte le immagini lazy appena aggiunte nel calendario\n        const lazyImages = calendarList.querySelectorAll('img.lazy-img[data-src]:not([data-observed])');\n        lazyImages.forEach(img => {\n            img.dataset.observed = 'true';\n            imageObserver.observe(img);\n        });\n    }\n    \n    \/\/ Funzione helper per renderizzare una card del calendario\n    function renderCalendarCard(product, container) {\n            const card = cardTemplate.content.cloneNode(true);\n            \n            \/\/ Immagine\n            const img = card.querySelector('img');\n            const imgWrapper = card.querySelector('.card-img-wrapper');\n            \n            \/\/ Usa l'endpoint specifico per la cover\n            const coverUrl = getCoverImageUrl(product, contentType);\n            if (coverUrl) {\n                \/\/ Imposta src con pixel trasparente e data-src con l'URL reale per lazy loading\n                img.src = transparentPixel;\n                img.dataset.src = coverUrl;\n                img.alt = product.title || product.name;\n                \n                \/\/ Gestisci l'errore di caricamento (404)\n                img.onerror = function() {\n                    this.remove();\n                    const placeholder = document.createElement('div');\n                    placeholder.className = 'card-img-placeholder';\n                    const icon = getContentTypeIcon(product, contentType);\n                    placeholder.innerHTML = `<i class=\"fas ${icon} fa-4x\"><\/i>`;\n                    imgWrapper.appendChild(placeholder);\n                };\n            } else {\n                \/\/ Sostituisco l'immagine con un placeholder\n                img.remove();\n                const placeholder = document.createElement('div');\n                placeholder.className = 'card-img-placeholder';\n                const icon = getContentTypeIcon(product, contentType);\n                placeholder.innerHTML = `<i class=\"fas ${icon} fa-4x\"><\/i>`;\n                imgWrapper.appendChild(placeholder);\n            }\n            \n            \/\/ Date e Prezzo\n            const duration = card.querySelector('.duration');\n            const price = card.querySelector('.price');\n            const dateRange = getProductDateRange(product);\n            if (dateRange) {\n                duration.innerHTML = `<i class=\"fas fa-calendar\"><\/i> ${formatDateRange(dateRange)}`;\n            }\n            \n            if (product.price) {\n                price.innerHTML = `<i class=\"fas fa-euro-sign\"><\/i> ${product.price}`;\n            }\n\n            \/\/ Titolo\n            const title = card.querySelector('.card-title');\n            title.textContent = product.title || product.name;\n\n            \/\/ Tipo tradotto\n            const typeBadge = card.querySelector('.type-badge');\n            \/\/ Usa sempre il tipo dello shortcode, ma se \u00e8 experience e product.type \u00e8 package, usa 'travel'\n            let displayType = 'eatery';\n            if (displayType === 'experience' && product.type === 'package') {\n                displayType = 'travel';\n            }\n            typeBadge.textContent = translateString(displayType);\n\n            \/\/ Categoria tradotta\n            const categoryBadge = card.querySelector('.category-badge');\n            let category = '';\n            \/\/ Per gli host ed eatery usa type, per gli altri usa category\n            if ('eatery' === 'event' && product.event_categories && product.event_categories.length > 0) {\n                \/\/ Per gli eventi, prendi la prima categoria dalle event_categories\n                category = product.event_categories[0].name || '';\n            } else if ('eatery' === 'host' || 'eatery' === 'eatery') {\n                \/\/ Per gli host ed eatery, usa type invece di category\n                category = product.type || 'eatery' || '';\n            } else {\n                category = product.category || 'eatery' || '';\n            }\n            \/\/ Usa sempre il tipo dello shortcode\n            const categoryType = 'eatery';\n            categoryBadge.textContent = translateCategory(category, categoryType);\n            \n            \/\/ Controlla se l'evento \u00e8 passato (solo per eventi)\n            const pastEventBadge = card.querySelector('.past-event-badge');\n            const pastEventText = card.querySelector('.past-event-text');\n            if (pastEventBadge && pastEventText) {\n                \/\/ Mostra il badge solo per eventi (type='event' o experience con type='event')\n                const isEvent = contentType === 'event' || (contentType === 'experience' && product.type === 'event');\n                if (isEvent && isEventPast(product)) {\n                    pastEventBadge.style.display = 'block';\n                    const pastEventLabel = (translations && translations.translations && translations.translations.past_event) \n                        ? translations.translations.past_event \n                        : 'Evento passato';\n                    pastEventText.textContent = pastEventLabel;\n                } else {\n                    pastEventBadge.style.display = 'none';\n                }\n            }\n\n            \/\/ Link\n            const cardLink = card.querySelector('.card-link');\n            \/\/ Usa sempre il tipo dello shortcode\n            const linkType = 'eatery';\n            cardLink.href = generateUrl(product, linkType);\n\n            container.appendChild(card);\n    }\n\n    \/\/ Aggiorna la mappa ogni volta che cambia la lista filtrata\n    function updateGlobalProducts() {\n        window.allProducts = allProducts;\n        window.filteredProducts = filteredProducts;\n        \/\/ Se la mappa \u00e8 visibile, aggiorna subito\n        const mapElement = document.getElementById('map');\n        if (mapElement && mapElement.classList.contains('active')) {\n            updateLeafletMap(filteredProducts.length ? filteredProducts : allProducts);\n        }\n    }\n    \/\/ Chiama updateGlobalProducts dopo ogni fetch e filtro\n    \/\/ ... inserisci updateGlobalProducts() nei punti giusti nel codice JS esistente ...\n\n    \/\/ Gestione manuale dei tab: mostra solo la tab attiva e aggiorna la classe 'active' sui bottoni\n    \/\/ IMPORTANTE: Usa selettori specifici per i tab di Entourance per non interferire con altri tab della pagina\n    const entouranceContainer = document.querySelector('.entourance-product-list');\n    if (!entouranceContainer) return;\n    \n    const availableTabs = entouranceContainer.querySelectorAll('#entouranceTab button[data-entourance-toggle=\"tab\"]');\n    if (availableTabs.length > 1) {\n        \/\/ Solo se ci sono pi\u00f9 tab, gestisci la navigazione\n        availableTabs.forEach(function(tabEl){\n          tabEl.addEventListener('click', function (event) {\n            event.preventDefault();\n            event.stopPropagation();\n            event.stopImmediatePropagation();\n            activateTab(this);\n          }, true);\n          \n          \/\/ Gestione navigazione da tastiera\n          tabEl.addEventListener('keydown', function(event) {\n            const tabs = Array.from(entouranceContainer.querySelectorAll('#entouranceTab button[data-entourance-toggle=\"tab\"]'));\n            const currentIndex = tabs.indexOf(this);\n            \n            switch(event.key) {\n              case 'ArrowLeft':\n                event.preventDefault();\n                const prevTab = tabs[currentIndex - 1] || tabs[tabs.length - 1];\n                prevTab.focus();\n                break;\n              case 'ArrowRight':\n                event.preventDefault();\n                const nextTab = tabs[currentIndex + 1] || tabs[0];\n                nextTab.focus();\n                break;\n              case 'Home':\n                event.preventDefault();\n                tabs[0].focus();\n                break;\n              case 'End':\n                event.preventDefault();\n                tabs[tabs.length - 1].focus();\n                break;\n              case 'Enter':\n              case ' ':\n                event.preventDefault();\n                activateTab(this);\n                break;\n            }\n          });\n        });\n        \n        \/\/ Attiva automaticamente il primo tab disponibile\n        function activateFirstAvailableTab() {\n          if (availableTabs.length > 0) {\n            \/\/ Rimuovi 'active' da tutti i bottoni di Entourance\n            availableTabs.forEach(function(btn){\n              btn.classList.remove('active');\n              btn.setAttribute('aria-selected', 'false');\n            });\n            \/\/ Nascondi tutte le tab-pane di Entourance\n            entouranceContainer.querySelectorAll('#entouranceTabContent .tab-pane').forEach(function(pane){\n              pane.classList.remove('show', 'active');\n            });\n            \/\/ Attiva il primo tab disponibile\n            const firstTab = availableTabs[0];\n            firstTab.classList.add('active');\n            firstTab.setAttribute('aria-selected', 'true');\n            const target = firstTab.getAttribute('data-bs-target');\n            if (target) {\n              const pane = entouranceContainer.querySelector(target);\n              if (pane) {\n                pane.classList.add('show', 'active');\n              }\n            }\n          }\n        }\n\n        \/\/ Chiama la funzione per attivare il primo tab disponibile\n        activateFirstAvailableTab();\n    }\n    \n    \/\/ Funzione per attivare un tab di Entourance\n    function activateTab(tabEl) {\n      \/\/ Rimuovi 'active' da tutti i bottoni di Entourance\n      entouranceContainer.querySelectorAll('#entouranceTab button[data-entourance-toggle=\"tab\"]').forEach(function(btn){\n        btn.classList.remove('active');\n        btn.setAttribute('aria-selected', 'false');\n      });\n      \/\/ Aggiungi 'active' al bottone cliccato\n      tabEl.classList.add('active');\n      tabEl.setAttribute('aria-selected', 'true');\n      \/\/ Nascondi tutte le tab-pane di Entourance\n      entouranceContainer.querySelectorAll('#entouranceTabContent .tab-pane').forEach(function(pane){\n        pane.classList.remove('show', 'active');\n      });\n      \/\/ Attiva la tab corretta\n      var target = tabEl.getAttribute('data-bs-target');\n      if (target) {\n        var pane = entouranceContainer.querySelector(target);\n        if (pane) {\n          pane.classList.add('show', 'active');\n          \n          \/\/ Se \u00e8 il tab della mappa, aggiorna la mappa\n          if (target === '#map') {\n            setTimeout(function() {\n              const productsToShow = filteredProducts.length ? filteredProducts : allProducts;\n              if (productsToShow.length > 0) {\n                updateLeafletMap(productsToShow);\n              }\n            }, 350);\n          }\n          \n          \/\/ Se \u00e8 il tab del calendario, filtra i prodotti\n          if (target === '#calendar') {\n            setTimeout(function() {\n              filterCalendarProducts();\n            }, 100);\n          }\n        }\n      }\n    }\n});\n<\/script> <\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-68b4a16 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"68b4a16\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t\t\t<div class=\"elementor-row\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-df6996e\" data-id=\"df6996e\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-column-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-03c9d2c elementor-widget elementor-widget-image\" data-id=\"03c9d2c\" data-element_type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"elementor-image\">\n\t\t\t\t\t\t\t\t\t\t<img width=\"1024\" height=\"227\" src=\"https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo-1024x227.jpg\" class=\"attachment-large size-large\" alt=\"\" loading=\"lazy\" srcset=\"https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo-1024x227.jpg 1024w, https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo-300x67.jpg 300w, https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo-768x171.jpg 768w, https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo.jpg 1472w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" itemprop=\"image\" \/>\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"Salta al contenuto principale List Map Cerca prodotti Digita il nome del prodotto che stai cercando Filtra per categoria All categories All categories","protected":false},"author":7,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.0.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Dove mangiare - Area Archeologica LA CUMA - Monte Rinaldo<\/title>\n<link rel=\"canonical\" href=\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dove mangiare - Area Archeologica LA CUMA - Monte Rinaldo\" \/>\n<meta property=\"og:url\" content=\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/\" \/>\n<meta property=\"og:site_name\" content=\"Area Archeologica LA CUMA - Monte Rinaldo\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo-1024x227.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/cumarcheologia.it\/#website\",\"url\":\"https:\/\/cumarcheologia.it\/\",\"name\":\"Area Archeologica LA CUMA - Monte Rinaldo\",\"description\":\"Vivi la tua esperienza\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/cumarcheologia.it\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/cumarcheologia.it\/wp-content\/uploads\/2026\/02\/banner_con_testo.jpg\",\"width\":1472,\"height\":327},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/#webpage\",\"url\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/\",\"name\":\"Dove mangiare - Area Archeologica LA CUMA - Monte Rinaldo\",\"isPartOf\":{\"@id\":\"https:\/\/cumarcheologia.it\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/#primaryimage\"},\"datePublished\":\"2026-02-24T07:39:37+00:00\",\"dateModified\":\"2026-02-24T07:39:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cumarcheologia.it\/en\/\",\"url\":\"https:\/\/cumarcheologia.it\/en\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/\",\"url\":\"https:\/\/cumarcheologia.it\/en\/dove-mangiare\/\",\"name\":\"Dove mangiare\"}}]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/pages\/2238"}],"collection":[{"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/comments?post=2238"}],"version-history":[{"count":0,"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/pages\/2238\/revisions"}],"wp:attachment":[{"href":"https:\/\/cumarcheologia.it\/en\/wp-json\/wp\/v2\/media?parent=2238"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}