{"id":530,"date":"2026-06-02T19:50:38","date_gmt":"2026-06-02T17:50:38","guid":{"rendered":"https:\/\/www.enricomariaporru.it\/tridentina\/?page_id=530"},"modified":"2026-07-06T15:07:09","modified_gmt":"2026-07-06T13:07:09","slug":"elementor-530","status":"publish","type":"page","link":"https:\/\/www.enricomariaporru.it\/tridentina\/","title":{"rendered":"Elementor #530"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"530\" class=\"elementor elementor-530\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c934b57 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"c934b57\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-508cbe1 elementor-widget elementor-widget-shortcode\" data-id=\"508cbe1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n        <style>\n        .empwa-container {\n            display: inline-block;\n            margin: 10px 0;\n        }\n        .empwa-install-btn {\n            display: none; \/* Rivelato via JS solo se installabile *\/\n            background-color: #e74c3c; \/* Rosso flat stile dashboard *\/\n            color: #ffffff !important;\n            border: none;\n            border-radius: 10px; \/* Bordo arrotondato moderno *\/\n            padding: 18px 24px;\n            font-size: 15px;\n            font-weight: 700;\n            text-transform: uppercase;\n            letter-spacing: 0.5px;\n            cursor: pointer;\n            text-align: center;\n            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n            transition: background-color 0.2s ease, transform 0.1s ease;\n            min-width: 150px;\n            line-height: 1.3;\n            text-decoration: none;\n        }\n        .empwa-install-btn:hover {\n            background-color: #c0392b; \/* Rosso scuro al passaggio mouse *\/\n        }\n        .empwa-install-btn:active {\n            transform: scale(0.98); \/* Feedback pressione meccanica *\/\n        }\n        <\/style>\n\n        <script>\n        document.addEventListener('DOMContentLoaded', () => {\n            let deferredPrompt;\n            const buttons = document.querySelectorAll('.empwa-install-btn');\n\n            window.addEventListener('beforeinstallprompt', (e) => {\n                e.preventDefault();\n                deferredPrompt = e;\n                buttons.forEach(b => b.style.display = 'block');\n            });\n\n            buttons.forEach(btn => {\n                btn.addEventListener('click', async () => {\n                    if (!deferredPrompt) return;\n                    deferredPrompt.prompt();\n                    const { outcome } = await deferredPrompt.userChoice;\n                    if (outcome === 'accepted') {\n                        deferredPrompt = null;\n                        buttons.forEach(b => b.style.display = 'none');\n                    }\n                });\n            });\n\n            window.addEventListener('appinstalled', () => {\n                buttons.forEach(b => b.style.display = 'none');\n            });\n        });\n        <\/script><div class=\"empwa-container\">\n            <button class=\"empwa-install-btn\">Installa l&#039; app<\/button>\n         <\/div><\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d3d24eb elementor-widget elementor-widget-html\" data-id=\"d3d24eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"it-cal-header-info\">\n    <h1>Sancta Missa<\/h1> <h3>( rito romano antico )<\/h3>\n    <div class=\"it-cal-divider\"><\/div>\n<\/div>\n\n<style>\n    .it-cal-header-info {\n        background: #fdfaf6;\n        border: 2px solid #0035b5;\n        border-radius: 8px;\n        padding: 40px 20px;\n        text-align: center;\n        margin-bottom: 20px;\n        font-family: serif;\n        box-shadow: 0 4px 15px rgba(0,0,0,0.05);\n    }\n\n    .it-cal-header-info h1 {\n        color: #0035b5;\n        font-size: 2.5em;\n        margin: 0;\n        text-transform: uppercase;\n        letter-spacing: 2px;\n        font-weight: bold;\n    }\n\n    .it-cal-divider {\n        height: 2px;\n        background: #e8e2d6;\n        width: 150px;\n        margin: 15px auto 0;\n        position: relative;\n    }\n\n    .it-cal-divider::after {\n        content: \"\";\n        position: absolute;\n        top: -12px;\n        left: 50%;\n        transform: translateX(-50%);\n        background: #fdfaf6;\n        padding: 0 10px;\n        color: #b35a44;\n        font-size: 1.2em;\n    }\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d1bf1f3 elementor-hidden-mobile elementor-widget-tablet__width-inherit elementor-widget elementor-widget-shortcode\" data-id=\"d1bf1f3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n    <div id=\"it-cal-wrapper-desktop\" class=\"it-cal-wrapper-instance it-cal-desktop-wrapper\">\n        <div class=\"it-cal-selector-bar\">\n            <button class=\"it-cal-btn-prev\">\u25c0 Precedente<\/button>\n            <h2 class=\"it-cal-monthTitle\"><\/h2>\n            <button class=\"it-cal-btn-next\">Successivo \u25b6<\/button>\n        <\/div>\n\n        <div class=\"it-cal-container\">\n            \n            <div class=\"it-cal-grid-container\"><\/div>\n        <\/div>\n\n        <div class=\"it-modal\">\n            <div class=\"it-modal-content\">\n                <span class=\"it-close\">&times;<\/span>\n                \n                <div class=\"it-modal-scroll-area\">\n                    <div class=\"modal-top-bar\">\n                        <div class=\"it-cal-dropdown-container\">\n                            <button class=\"it-cal-hamburger-btn\">\u2630 Seleziona Liturgia<\/button>\n                            <div class=\"it-cal-dropdown-content\"><\/div>\n                        <\/div>\n\n                        <div class=\"modal-admin-controls\">\n                                                    <\/div>\n                    <\/div>\n\n                    <div class=\"it-cal-loading\" style=\"display:none; text-align:center; padding: 40px; font-style:italic; font-size:1.1em; color:#555;\">Caricamento in corso...<\/div>\n                    <div class=\"it-cal-display-area\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <style>\n        \/* STILI COMUNI CONDIVISI *\/\n        .it-cal-wrapper-instance { width: 100%; font-family: 'Georgia', serif; color: #222; }\n        .it-cal-selector-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; background: #5F7AB9; padding: 10px; border-radius: 6px; color: white; }\n        .it-cal-selector-bar button { background: #4a6194; color: white; border: none; padding: 8px 15px; cursor: pointer; border-radius: 4px; font-weight: bold; }\n        .it-cal-selector-bar button:hover { background: #3b4e78; }\n        .it-cal-selector-bar h2 { margin: 0; font-size: 1.4em; }\n        .it-cal-container { background: #fdfaf6; border: 1px solid #e8e2d6; border-radius: 8px; padding: 15px; }\n        .it-cal-creator-box { display: none; background: #fffcf9; padding: 20px; border: 2px solid #5F7AB9; border-radius: 8px; margin-bottom: 20px; }\n        .it-cal-row { display: flex; gap: 15px; margin-bottom: 15px; flex-wrap: wrap; }\n        .it-cal-field-group { display: flex; flex-direction: column; }\n        .it-cal-field-group label { font-size: 0.85em; font-weight: bold; color: #6d5c52; margin-bottom: 5px; }\n        .it-cal-checkbox-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; background: #fff; padding: 10px; border: 1px solid #ccc; border-radius: 4px; }\n        .it-cal-checkbox-grid label { font-weight: normal; font-size: 0.9em; display: flex; align-items: center; gap: 5px; cursor: pointer; color: #222 !important; }\n        .it-cal-btn-submit { background: #27ae60; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-weight: bold; }\n        .it-cal-btn-cancel { background: #7f8c8d; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-weight: bold; }\n        \n        .it-cal-grid-header { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; font-weight: bold; background: #efe9de; padding: 8px 0; border-bottom: 2px solid #e8e2d6; }\n        .it-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); background-color: #e8e2d6; gap: 1px; width: 100%; box-sizing: border-box; }\n        .it-cal-day { min-height: 100px; background: #fdfaf6; padding: 6px; position: relative; box-sizing: border-box; display: flex; flex-direction: column; justify-content: space-between; border: 1px solid #f3eee5; }\n        .it-cal-day.clickable { cursor: pointer; transition: opacity 0.2s; }\n        .it-cal-day.clickable:hover { opacity: 0.85; }\n        .it-cal-day.empty { background: #f4eee3; cursor: default; }\n        .it-cal-day-number { font-weight: bold; font-size: 1.1em; }\n        .it-cal-day-label { font-size: 0.75em; font-style: italic; margin-top: 4px; line-height: 1.2; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; }\n\n        .it-modal { display: none; position: fixed; z-index: 2147483647 !important; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.85); justify-content: center; align-items: center; padding: 15px; box-sizing: border-box; }\n        .it-modal-content { background: #ffffff !important; color: #222222 !important; border-radius: 8px; width: 100%; max-width: 1000px; height: 85vh; position: relative; border: 1px solid #333; display: flex; flex-direction: column; overflow: hidden; }\n        .it-close { font-size: 32px; cursor: pointer; font-weight: bold; position: absolute; right: 20px; top: 12px; color: #333; z-index: 1000; }\n        .it-modal-scroll-area { padding: 25px; overflow-y: auto; width: 100%; box-sizing: border-box; display: flex; flex-direction: column; flex: 1; position: relative; }\n        .modal-top-bar { margin-bottom: 15px; border-bottom: 2px solid #efe9de; padding-bottom: 15px; display: flex; justify-content: space-between; align-items: center; padding-right: 40px;}\n        \n        .it-cal-dropdown-container { position: relative; display: inline-block; }\n        .it-cal-hamburger-btn { background: #5F7AB9; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; font-weight: bold; font-size: 0.9em; }\n        .it-cal-dropdown-content { display: none; position: absolute; left: 0; top: 100%; background-color: #ffffff; min-width: 240px; box-shadow: 0px 8px 16px rgba(0,0,0,0.2); z-index: 200; border-radius: 4px; border: 1px solid #5F7AB9; margin-top: 5px; }\n        .it-cal-dropdown-content button { color: #333 !important; padding: 11px 16px; text-decoration: none; display: block; background: none; border: none; width: 100%; text-align: left; cursor: pointer; border-bottom: 1px solid #efe9de; font-family: serif; font-size: 0.95em; }\n        .it-cal-dropdown-content button:hover { background-color: #efe9de; }\n        .it-cal-dropdown-content button.active { background-color: #5F7AB9; color: white !important; font-weight: bold; }\n        .it-cal-dropdown-content.show { display: block; }\n        .it-cal-nav-btn { color: white; border:none; padding: 8px 14px; cursor: pointer; border-radius: 4px; font-size: 0.85em; font-weight: bold; }\n        .rubrica-rossa { color: #bc281e !important; font-weight: 500; }\n\n        \/* ==========================================\n           CONFIGURAZIONE ORIGINALE (DESKTOP \/ TABLET)\n           ========================================== *\/\n        .it-cal-desktop-wrapper .it-cal-display-area { font-size: 1.05em; line-height: 1.6; color: #222222 !important; background: #ffffff !important; margin-top: 15px; width: 100%; overflow-x: auto; }\n        .it-cal-desktop-wrapper .it-cal-display-area form { width: 100% !important; margin: 0 !important; padding: 0 !important; }\n        .it-cal-desktop-wrapper .it-cal-display-area table { width: 100% !important; border-collapse: collapse !important; border: none !important; margin-bottom: 20px !important; table-layout: fixed; }\n        .it-cal-desktop-wrapper .it-cal-display-area tr { background: transparent !important; }\n        .it-cal-desktop-wrapper .it-cal-display-area td { width: 50% !important; vertical-align: top !important; padding: 10px 20px !important; border: none !important; box-sizing: border-box; }\n        .it-cal-desktop-wrapper .it-cal-display-area td:first-child { border-right: 1px solid #e8e2d6 !important; font-style: italic; color: #444; } \n        .it-cal-desktop-wrapper .it-cal-display-area td:last-child { color: #111; }\n\n        \/* Breakpoint abbassato a 599px per proteggere i tablet da 8 pollici *\/\n        @media screen and (max-width: 599px) {\n            .it-cal-desktop-wrapper .it-cal-grid-header, .it-cal-desktop-wrapper .it-cal-grid { grid-template-columns: repeat(7, 1fr); }\n            .it-cal-desktop-wrapper .it-cal-day { min-height: 60px; padding: 4px; }\n            .it-cal-desktop-wrapper .it-cal-day-label { display: none; }\n            .it-cal-desktop-wrapper .it-cal-checkbox-grid { grid-template-columns: repeat(2, 1fr); }\n            .it-cal-desktop-wrapper .it-cal-display-area table, .it-cal-desktop-wrapper .it-cal-display-area tr, .it-cal-desktop-wrapper .it-cal-display-area td { display: block !important; width: 100% !important; }\n            .it-cal-desktop-wrapper .it-cal-display-area td:first-child { border-right: none !important; border-bottom: 1px dashed #d16464 !important; margin-bottom: 12px; padding-bottom: 12px !important; }\n        }\n\n        \/* ==========================================\n           NUOVA CONFIGURAZIONE SMARTPHONE (FLIP\/SWIPE)\n           ========================================== *\/\n        .it-cal-mobile-wrapper .it-cal-grid-header, .it-cal-mobile-wrapper .it-cal-grid { grid-template-columns: repeat(7, 1fr); }\n        .it-cal-mobile-wrapper .it-cal-day { min-height: 60px; padding: 4px; }\n        .it-cal-mobile-wrapper .it-cal-day-label { display: none; }\n        .it-cal-mobile-wrapper .it-cal-checkbox-grid { grid-template-columns: repeat(2, 1fr); }\n\n        .it-cal-mobile-wrapper .it-cal-display-area { \n            display: grid !important; \n            grid-template-columns: 100% 100% !important; \n            overflow-x: auto !important; \n            scroll-snap-type: x mandatory !important; \n            width: 100% !important; \n            font-size: 1.3em !important; \n            line-height: 1.7 !important;\n            -webkit-overflow-scrolling: touch;\n        }\n        \n        .it-cal-mobile-wrapper .it-cal-display-area::-webkit-scrollbar { display: none; }\n\n        .it-cal-mobile-wrapper .it-cal-display-area form,\n        .it-cal-mobile-wrapper .it-cal-display-area table,\n        .it-cal-mobile-wrapper .it-cal-display-area tbody,\n        .it-cal-mobile-wrapper .it-cal-display-area tr { \n            display: contents !important; \n            border: none !important; \/* Rimozione totale bordi nativi del server *\/\n        }\n\n        .it-cal-mobile-wrapper .it-cal-display-area td { \n            scroll-snap-align: start !important; \n            width: 100% !important; \n            box-sizing: border-box !important; \n            padding: 15px 20px !important; \n            background: #ffffff !important;\n            border: none !important; \/* Rimozione totale bordi tra le celle *\/\n        }\n\n        .it-cal-mobile-wrapper .it-cal-display-area td:nth-child(odd) { \n            font-style: italic; \n            color: #333333; \n            border: none !important; \/* Cancellata riga grigia orizzontale *\/\n        }\n        .it-cal-mobile-wrapper .it-cal-display-area td:nth-child(even) { \n            color: #111111; \n            border: none !important; \/* Cancellata riga grigia orizzontale *\/\n        }\n    <\/style>\n\n    <script>\n    (function() {\n        const mode = 'desktop';\n        const API_URL = 'https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/posts';\n        const AJAX_URL = 'https:\/\/www.enricomariaporru.it\/tridentina\/wp-admin\/admin-ajax.php';\n        const NONCE = 'c2ac02acdc';\n        const CAN_EDIT = false;\n\n        let databaseEventi = [];\n        let loadedBlocks = {};\n        \n        let now = new Date();\n        let currentVisualDate = new Date(now.getFullYear(), now.getMonth(), 1);\n        let activeSelectedDateStr = ''; \n\n        const nomiMesi = [\"Gennaio\", \"Febbraio\", \"Marzo\", \"Aprile\", \"Maggio\", \"Giugno\", \"Luglio\", \"Agosto\", \"Settembre\", \"Ottobre\", \"Novembre\", \"Dicembre\"];\n        const giorniSettimana = [\"Dom\", \"Lun\", \"Mar\", \"Mer\", \"Gio\", \"Ven\", \"Sab\"];\n\n        const wrapper = document.getElementById(`it-cal-wrapper-${mode}`);\n        if (!wrapper) return;\n\n        const monthTitle = wrapper.querySelector('.it-cal-monthTitle');\n        const gridContainer = wrapper.querySelector('.it-cal-grid-container');\n        const modal = wrapper.querySelector('.it-modal');\n        const modalBody = modal.querySelector('.it-cal-display-area');\n        const loading = modal.querySelector('.it-cal-loading');\n        const dropdownContent = modal.querySelector('.it-cal-dropdown-content');\n        const hamburgerBtn = modal.querySelector('.it-cal-hamburger-btn');\n        const closeModalBtn = modal.querySelector('.it-close');\n        \n        const creatorBox = wrapper.querySelector('.it-cal-creator-box');\n        const evDateInput = wrapper.querySelector('.ev-date');\n        const evLabelInput = wrapper.querySelector('.ev-label-custom');\n        const evColorInput = wrapper.querySelector('.ev-color');\n        const submitBtn = wrapper.querySelector('.it-cal-btn-submit');\n        const cancelBtn = wrapper.querySelector('.it-cal-btn-cancel');\n        const editOptsBtn = modal.querySelector('.btn-edit-opts');\n\n        function getBlockID(dateStr) {\n            const date = new Date(dateStr);\n            const startOfYear = new Date(date.getFullYear(), 0, 1);\n            const diff = Math.floor((date - startOfYear) \/ (1000 * 60 * 60 * 24));\n            return `CAL_ANNUAL_${date.getFullYear()}_B${Math.floor(diff \/ 21) + 1}`;\n        }\n\n        function getContrastYIQ(hexcolor){\n            if (!hexcolor) return '#222222';\n            hexcolor = hexcolor.replace(\"#\", \"\");\n            if(hexcolor.length === 3) hexcolor = hexcolor.replace(\/(.)\/g, '$1$1');\n            const r = parseInt(hexcolor.substr(0,2),16), g = parseInt(hexcolor.substr(2,2),16), b = parseInt(hexcolor.substr(4,2),16);\n            return (((r*299)+(g*587)+(b*114))\/1000 >= 135) ? '#222222' : '#ffffff';\n        }\n\n        async function caricaDatiMeseCorrente(anno, mese) {\n            let bIDsInMese = new Set();\n            let dataIter = new Date(anno, mese, 1);\n            while (dataIter.getMonth() === mese) {\n                const dateStr = `${dataIter.getFullYear()}-${String(dataIter.getMonth()+1).padStart(2,'0')}-${String(dataIter.getDate()).padStart(2,'0')}`;\n                bIDsInMese.add(getBlockID(dateStr));\n                dataIter.setDate(dataIter.getDate() + 1);\n            }\n\n            for(let bid of bIDsInMese) {\n                if (loadedBlocks[bid]) continue; \n                try {\n                    const res = await fetch(`${API_URL}?search=${bid}&status=publish&_cb=${Date.now()}`);\n                    const posts = await res.json();\n                    if(posts.length > 0) {\n                        loadedBlocks[bid] = posts[0].id;\n                        const raw = posts[0].content.rendered.replace(\/<[^>]*>\/g, '').trim();\n                        const blockData = JSON.parse(decodeURIComponent(escape(atob(raw))));\n                        blockData.forEach(ev => {\n                            if(!databaseEventi.find(e => e.tag === ev.tag)) databaseEventi.push(ev);\n                        });\n                    } else { loadedBlocks[bid] = \"new\"; }\n                } catch(e) { loadedBlocks[bid] = \"new\"; }\n            }\n            renderCalendario();\n        }\n\n        wrapper.querySelector('.it-cal-btn-prev').addEventListener('click', function() {\n            currentVisualDate.setMonth(currentVisualDate.getMonth() - 1);\n            caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n        });\n\n        wrapper.querySelector('.it-cal-btn-next').addEventListener('click', function() {\n            currentVisualDate.setMonth(currentVisualDate.getMonth() + 1);\n            caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n        });\n\n        function renderCalendario() {\n            if(!gridContainer || !monthTitle) return;\n\n            const anno = currentVisualDate.getFullYear();\n            const mese = currentVisualDate.getMonth();\n\n            monthTitle.innerText = `${nomiMesi[mese]} ${anno}`;\n            gridContainer.innerHTML = '';\n\n            const headerGrid = document.createElement('div');\n            headerGrid.className = 'it-cal-grid-header';\n            giorniSettimana.forEach(g => {\n                const gd = document.createElement('div'); gd.innerText = g; headerGrid.appendChild(gd);\n            });\n            gridContainer.appendChild(headerGrid);\n\n            const grid = document.createElement('div');\n            grid.className = 'it-cal-grid';\n\n            const primoGiornoMese = new Date(anno, mese, 1).getDay();\n            const totaleGiorniMese = new Date(anno, mese + 1, 0).getDate();\n\n            for (let i = 0; i < primoGiornoMese; i++) {\n                const emptyDiv = document.createElement('div');\n                emptyDiv.className = 'it-cal-day empty';\n                grid.appendChild(emptyDiv);\n            }\n\n            for (let d = 1; d <= totaleGiorniMese; d++) {\n                const iterDate = new Date(anno, mese, d);\n                const tag = `ID-CAL-${anno}-${mese+1}-${d}`;\n                const dateStr = `${anno}-${String(mese+1).padStart(2,'0')}-${String(d).padStart(2,'0')}`;\n                \n                const ev = databaseEventi.find(e => e.tag === tag);\n                const dayDiv = document.createElement('div');\n                dayDiv.className = 'it-cal-day clickable';\n\n                if (ev && ev.color) {\n                    dayDiv.style.backgroundColor = ev.color;\n                    dayDiv.style.color = getContrastYIQ(ev.color);\n                } else {\n                    if (iterDate.getDay() === 0) { \n                        dayDiv.style.backgroundColor = \"#fcebe8\";\n                        dayDiv.style.color = \"#bc281e\";\n                    }\n                }\n\n                dayDiv.addEventListener('click', () => apriPopLiturgia(dateStr, tag));\n\n                let labelFesta = (ev && ev.label) ? ev.label : '';\n                dayDiv.innerHTML = `\n                    <span class=\"it-cal-day-number\">${d}<\/span>\n                    <span class=\"it-cal-day-label\">${labelFesta}<\/span>\n                `;\n                grid.appendChild(dayDiv);\n            }\n            gridContainer.appendChild(grid);\n        }\n\n        async function loadLiturgiaContent(dateStr, tipo, command = '') {\n            modalBody.innerHTML = '';\n            loading.style.display = 'block';\n\n            const parti = dateStr.split('-');\n            const formattedDate = `${parti[1]}-${parti[2]}-${parti[0]}`;\n\n            try {\n                const res = await fetch(`${AJAX_URL}?action=it_cal_fetch_liturgia&date=${formattedDate}&tipo=${tipo}&command=${command}`);\n                const data = await res.json();\n                loading.style.display = 'none';\n\n                if (data.success && data.data.html) {\n                    modalBody.innerHTML = data.data.html;\n                    modalBody.scrollLeft = 0;\n                } else {\n                    const errorMsg = data.data || \"Nessun dato ritornato o errore nel parsing.\";\n                    modalBody.innerHTML = `<p style=\"color:#bc281e; padding:30px; text-align:center; font-weight:bold;\">${errorMsg}<\/p>`;\n                }\n            } catch (e) {\n                loading.style.display = 'none';\n                modalBody.innerHTML = `<p style=\"color:#bc281e; padding:30px; text-align:center; font-weight:bold;\">Errore asincrono di runtime.<\/p>`;\n            }\n        }\n\n        function apriPopLiturgia(dateStr, tag) {\n            activeSelectedDateStr = dateStr;\n            const ev = databaseEventi.find(e => e.tag === tag);\n            \n            dropdownContent.innerHTML = '';\n\n            const btnMissa = document.createElement('button');\n            btnMissa.innerText = \"Santa Messa (Missa)\";\n            btnMissa.className = \"active\";\n            btnMissa.addEventListener('click', function() {\n                selezionaVoceMenuHamburger(this, dropdownContent);\n                loadLiturgiaContent(dateStr, 'missa');\n            });\n            dropdownContent.appendChild(btnMissa);\n\n            if (ev && ev.oreAbilitate && Array.isArray(ev.oreAbilitate)) {\n                ev.oreAbilitate.forEach(ora => {\n                    const btnOra = document.createElement('button');\n                    btnOra.innerText = ora;\n                    btnOra.addEventListener('click', function() {\n                        selezionaVoceMenuHamburger(this, dropdownContent);\n                        loadLiturgiaContent(dateStr, 'officium', ora);\n                    });\n                    dropdownContent.appendChild(btnOra);\n                });\n            }\n\n            modal.style.display = 'flex';\n            loadLiturgiaContent(dateStr, 'missa');\n        }\n\n        function selezionaVoceMenuHamburger(buttonAttivo, parent) {\n            parent.querySelectorAll('button').forEach(b => b.classList.remove('active'));\n            buttonAttivo.classList.add('active');\n            parent.classList.remove(\"show\");\n        }\n\n        hamburgerBtn.addEventListener('click', function(e) {\n            e.stopPropagation();\n            dropdownContent.classList.toggle(\"show\");\n        });\n\n        closeModalBtn.addEventListener('click', function() {\n            modal.style.display = 'none';\n        });\n\n        if (CAN_EDIT && editOptsBtn) {\n            editOptsBtn.addEventListener('click', function() {\n                modal.style.display = 'none';\n                creatorBox.style.display = 'block';\n\n                evDateInput.value = activeSelectedDateStr;\n                const parti = activeSelectedDateStr.split('-');\n                const tag = `ID-CAL-${parti[0]}-${parseInt(parti[1])}-${parseInt(parti[2])}`;\n                const ev = databaseEventi.find(e => e.tag === tag);\n\n                evLabelInput.value = ev ? (ev.label || '') : '';\n                evColorInput.value = ev ? (ev.color || '#ffffff') : '#ffffff';\n                creatorBox.querySelectorAll('.ore-checkbox').forEach(cb => {\n                    cb.checked = ev ? (ev.oreAbilitate || []).includes(cb.value) : false;\n                });\n                creatorBox.scrollIntoView({ behavior: 'smooth' });\n            });\n\n            submitBtn.addEventListener('click', async function() {\n                const dateInput = evDateInput.value;\n                if(!dateInput) return alert(\"Seleziona data\");\n\n                const oreAbilitate = [];\n                creatorBox.querySelectorAll('.ore-checkbox:checked').forEach(cb => {\n                    oreAbilitate.push(cb.value);\n                });\n\n                const parti = dateInput.split('-');\n                const tag = `ID-CAL-${parti[0]}-${parseInt(parti[1])}-${parseInt(parti[2])}`;\n                \n                const configGiornoObj = {\n                    tag: tag,\n                    date: dateInput,\n                    label: evLabelInput.value,\n                    color: evColorInput.value,\n                    oreAbilitate: oreAbilitate\n                };\n\n                const bid = getBlockID(dateInput);\n                const oldIdx = databaseEventi.findIndex(e => e.tag === tag);\n                if(oldIdx !== -1) databaseEventi[oldIdx] = configGiornoObj; else databaseEventi.push(configGiornoObj);\n\n                const blockEvents = databaseEventi.filter(e => getBlockID(e.date) === bid);\n                const jsonString = btoa(unescape(encodeURIComponent(JSON.stringify(blockEvents))));\n                const postId = loadedBlocks[bid];\n\n                const url = (postId && postId !== \"new\") ? `${API_URL}\/${postId}` : API_URL;\n                const payload = { title: bid, content: jsonString, status: 'publish' };\n\n                const res = await fetch(url, {\n                    method: (postId && postId !== \"new\") ? 'PUT' : 'POST',\n                    headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': NONCE },\n                    body: JSON.stringify(payload)\n                });\n\n                if(res.ok) {\n                    creatorBox.style.display = 'none';\n                    caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n                } else {\n                    alert(\"Errore nel salvataggio dei metadati.\");\n                }\n            });\n\n            cancelBtn.addEventListener('click', function() {\n                creatorBox.style.display = 'none';\n            });\n        }\n\n        document.addEventListener('click', function(event) {\n            if (!event.target.matches('.it-cal-hamburger-btn')) {\n                if (dropdownContent.classList.contains('show')) {\n                    dropdownContent.classList.remove('show');\n                }\n            }\n        });\n\n        caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n    })();\n    <\/script>\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2aae08d elementor-hidden-desktop elementor-hidden-tablet elementor-widget elementor-widget-shortcode\" data-id=\"2aae08d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n    <div id=\"it-cal-wrapper-mobile\" class=\"it-cal-wrapper-instance it-cal-mobile-wrapper\">\n        <div class=\"it-cal-selector-bar\">\n            <button class=\"it-cal-btn-prev\">\u25c0 Precedente<\/button>\n            <h2 class=\"it-cal-monthTitle\"><\/h2>\n            <button class=\"it-cal-btn-next\">Successivo \u25b6<\/button>\n        <\/div>\n\n        <div class=\"it-cal-container\">\n            \n            <div class=\"it-cal-grid-container\"><\/div>\n        <\/div>\n\n        <div class=\"it-modal\">\n            <div class=\"it-modal-content\">\n                <span class=\"it-close\">&times;<\/span>\n                \n                <div class=\"it-modal-scroll-area\">\n                    <div class=\"modal-top-bar\">\n                        <div class=\"it-cal-dropdown-container\">\n                            <button class=\"it-cal-hamburger-btn\">\u2630 Seleziona Liturgia<\/button>\n                            <div class=\"it-cal-dropdown-content\"><\/div>\n                        <\/div>\n\n                        <div class=\"modal-admin-controls\">\n                                                    <\/div>\n                    <\/div>\n\n                    <div class=\"it-cal-loading\" style=\"display:none; text-align:center; padding: 40px; font-style:italic; font-size:1.1em; color:#555;\">Caricamento in corso...<\/div>\n                    <div class=\"it-cal-display-area\"><\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <style>\n        \/* STILI COMUNI CONDIVISI *\/\n        .it-cal-wrapper-instance { width: 100%; font-family: 'Georgia', serif; color: #222; }\n        .it-cal-selector-bar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; background: #5F7AB9; padding: 10px; border-radius: 6px; color: white; }\n        .it-cal-selector-bar button { background: #4a6194; color: white; border: none; padding: 8px 15px; cursor: pointer; border-radius: 4px; font-weight: bold; }\n        .it-cal-selector-bar button:hover { background: #3b4e78; }\n        .it-cal-selector-bar h2 { margin: 0; font-size: 1.4em; }\n        .it-cal-container { background: #fdfaf6; border: 1px solid #e8e2d6; border-radius: 8px; padding: 15px; }\n        .it-cal-creator-box { display: none; background: #fffcf9; padding: 20px; border: 2px solid #5F7AB9; border-radius: 8px; margin-bottom: 20px; }\n        .it-cal-row { display: flex; gap: 15px; margin-bottom: 15px; flex-wrap: wrap; }\n        .it-cal-field-group { display: flex; flex-direction: column; }\n        .it-cal-field-group label { font-size: 0.85em; font-weight: bold; color: #6d5c52; margin-bottom: 5px; }\n        .it-cal-checkbox-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; background: #fff; padding: 10px; border: 1px solid #ccc; border-radius: 4px; }\n        .it-cal-checkbox-grid label { font-weight: normal; font-size: 0.9em; display: flex; align-items: center; gap: 5px; cursor: pointer; color: #222 !important; }\n        .it-cal-btn-submit { background: #27ae60; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-weight: bold; }\n        .it-cal-btn-cancel { background: #7f8c8d; color: white; border: none; padding: 10px 20px; border-radius: 4px; cursor: pointer; font-weight: bold; }\n        \n        .it-cal-grid-header { display: grid; grid-template-columns: repeat(7, 1fr); text-align: center; font-weight: bold; background: #efe9de; padding: 8px 0; border-bottom: 2px solid #e8e2d6; }\n        .it-cal-grid { display: grid; grid-template-columns: repeat(7, 1fr); background-color: #e8e2d6; gap: 1px; width: 100%; box-sizing: border-box; }\n        .it-cal-day { min-height: 100px; background: #fdfaf6; padding: 6px; position: relative; box-sizing: border-box; display: flex; flex-direction: column; justify-content: space-between; border: 1px solid #f3eee5; }\n        .it-cal-day.clickable { cursor: pointer; transition: opacity 0.2s; }\n        .it-cal-day.clickable:hover { opacity: 0.85; }\n        .it-cal-day.empty { background: #f4eee3; cursor: default; }\n        .it-cal-day-number { font-weight: bold; font-size: 1.1em; }\n        .it-cal-day-label { font-size: 0.75em; font-style: italic; margin-top: 4px; line-height: 1.2; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; }\n\n        .it-modal { display: none; position: fixed; z-index: 2147483647 !important; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.85); justify-content: center; align-items: center; padding: 15px; box-sizing: border-box; }\n        .it-modal-content { background: #ffffff !important; color: #222222 !important; border-radius: 8px; width: 100%; max-width: 1000px; height: 85vh; position: relative; border: 1px solid #333; display: flex; flex-direction: column; overflow: hidden; }\n        .it-close { font-size: 32px; cursor: pointer; font-weight: bold; position: absolute; right: 20px; top: 12px; color: #333; z-index: 1000; }\n        .it-modal-scroll-area { padding: 25px; overflow-y: auto; width: 100%; box-sizing: border-box; display: flex; flex-direction: column; flex: 1; position: relative; }\n        .modal-top-bar { margin-bottom: 15px; border-bottom: 2px solid #efe9de; padding-bottom: 15px; display: flex; justify-content: space-between; align-items: center; padding-right: 40px;}\n        \n        .it-cal-dropdown-container { position: relative; display: inline-block; }\n        .it-cal-hamburger-btn { background: #5F7AB9; color: white; border: none; padding: 8px 16px; border-radius: 4px; cursor: pointer; font-weight: bold; font-size: 0.9em; }\n        .it-cal-dropdown-content { display: none; position: absolute; left: 0; top: 100%; background-color: #ffffff; min-width: 240px; box-shadow: 0px 8px 16px rgba(0,0,0,0.2); z-index: 200; border-radius: 4px; border: 1px solid #5F7AB9; margin-top: 5px; }\n        .it-cal-dropdown-content button { color: #333 !important; padding: 11px 16px; text-decoration: none; display: block; background: none; border: none; width: 100%; text-align: left; cursor: pointer; border-bottom: 1px solid #efe9de; font-family: serif; font-size: 0.95em; }\n        .it-cal-dropdown-content button:hover { background-color: #efe9de; }\n        .it-cal-dropdown-content button.active { background-color: #5F7AB9; color: white !important; font-weight: bold; }\n        .it-cal-dropdown-content.show { display: block; }\n        .it-cal-nav-btn { color: white; border:none; padding: 8px 14px; cursor: pointer; border-radius: 4px; font-size: 0.85em; font-weight: bold; }\n        .rubrica-rossa { color: #bc281e !important; font-weight: 500; }\n\n        \/* ==========================================\n           CONFIGURAZIONE ORIGINALE (DESKTOP \/ TABLET)\n           ========================================== *\/\n        .it-cal-desktop-wrapper .it-cal-display-area { font-size: 1.05em; line-height: 1.6; color: #222222 !important; background: #ffffff !important; margin-top: 15px; width: 100%; overflow-x: auto; }\n        .it-cal-desktop-wrapper .it-cal-display-area form { width: 100% !important; margin: 0 !important; padding: 0 !important; }\n        .it-cal-desktop-wrapper .it-cal-display-area table { width: 100% !important; border-collapse: collapse !important; border: none !important; margin-bottom: 20px !important; table-layout: fixed; }\n        .it-cal-desktop-wrapper .it-cal-display-area tr { background: transparent !important; }\n        .it-cal-desktop-wrapper .it-cal-display-area td { width: 50% !important; vertical-align: top !important; padding: 10px 20px !important; border: none !important; box-sizing: border-box; }\n        .it-cal-desktop-wrapper .it-cal-display-area td:first-child { border-right: 1px solid #e8e2d6 !important; font-style: italic; color: #444; } \n        .it-cal-desktop-wrapper .it-cal-display-area td:last-child { color: #111; }\n\n        \/* Breakpoint abbassato a 599px per proteggere i tablet da 8 pollici *\/\n        @media screen and (max-width: 599px) {\n            .it-cal-desktop-wrapper .it-cal-grid-header, .it-cal-desktop-wrapper .it-cal-grid { grid-template-columns: repeat(7, 1fr); }\n            .it-cal-desktop-wrapper .it-cal-day { min-height: 60px; padding: 4px; }\n            .it-cal-desktop-wrapper .it-cal-day-label { display: none; }\n            .it-cal-desktop-wrapper .it-cal-checkbox-grid { grid-template-columns: repeat(2, 1fr); }\n            .it-cal-desktop-wrapper .it-cal-display-area table, .it-cal-desktop-wrapper .it-cal-display-area tr, .it-cal-desktop-wrapper .it-cal-display-area td { display: block !important; width: 100% !important; }\n            .it-cal-desktop-wrapper .it-cal-display-area td:first-child { border-right: none !important; border-bottom: 1px dashed #d16464 !important; margin-bottom: 12px; padding-bottom: 12px !important; }\n        }\n\n        \/* ==========================================\n           NUOVA CONFIGURAZIONE SMARTPHONE (FLIP\/SWIPE)\n           ========================================== *\/\n        .it-cal-mobile-wrapper .it-cal-grid-header, .it-cal-mobile-wrapper .it-cal-grid { grid-template-columns: repeat(7, 1fr); }\n        .it-cal-mobile-wrapper .it-cal-day { min-height: 60px; padding: 4px; }\n        .it-cal-mobile-wrapper .it-cal-day-label { display: none; }\n        .it-cal-mobile-wrapper .it-cal-checkbox-grid { grid-template-columns: repeat(2, 1fr); }\n\n        .it-cal-mobile-wrapper .it-cal-display-area { \n            display: grid !important; \n            grid-template-columns: 100% 100% !important; \n            overflow-x: auto !important; \n            scroll-snap-type: x mandatory !important; \n            width: 100% !important; \n            font-size: 1.3em !important; \n            line-height: 1.7 !important;\n            -webkit-overflow-scrolling: touch;\n        }\n        \n        .it-cal-mobile-wrapper .it-cal-display-area::-webkit-scrollbar { display: none; }\n\n        .it-cal-mobile-wrapper .it-cal-display-area form,\n        .it-cal-mobile-wrapper .it-cal-display-area table,\n        .it-cal-mobile-wrapper .it-cal-display-area tbody,\n        .it-cal-mobile-wrapper .it-cal-display-area tr { \n            display: contents !important; \n            border: none !important; \/* Rimozione totale bordi nativi del server *\/\n        }\n\n        .it-cal-mobile-wrapper .it-cal-display-area td { \n            scroll-snap-align: start !important; \n            width: 100% !important; \n            box-sizing: border-box !important; \n            padding: 15px 20px !important; \n            background: #ffffff !important;\n            border: none !important; \/* Rimozione totale bordi tra le celle *\/\n        }\n\n        .it-cal-mobile-wrapper .it-cal-display-area td:nth-child(odd) { \n            font-style: italic; \n            color: #333333; \n            border: none !important; \/* Cancellata riga grigia orizzontale *\/\n        }\n        .it-cal-mobile-wrapper .it-cal-display-area td:nth-child(even) { \n            color: #111111; \n            border: none !important; \/* Cancellata riga grigia orizzontale *\/\n        }\n    <\/style>\n\n    <script>\n    (function() {\n        const mode = 'mobile';\n        const API_URL = 'https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/posts';\n        const AJAX_URL = 'https:\/\/www.enricomariaporru.it\/tridentina\/wp-admin\/admin-ajax.php';\n        const NONCE = 'c2ac02acdc';\n        const CAN_EDIT = false;\n\n        let databaseEventi = [];\n        let loadedBlocks = {};\n        \n        let now = new Date();\n        let currentVisualDate = new Date(now.getFullYear(), now.getMonth(), 1);\n        let activeSelectedDateStr = ''; \n\n        const nomiMesi = [\"Gennaio\", \"Febbraio\", \"Marzo\", \"Aprile\", \"Maggio\", \"Giugno\", \"Luglio\", \"Agosto\", \"Settembre\", \"Ottobre\", \"Novembre\", \"Dicembre\"];\n        const giorniSettimana = [\"Dom\", \"Lun\", \"Mar\", \"Mer\", \"Gio\", \"Ven\", \"Sab\"];\n\n        const wrapper = document.getElementById(`it-cal-wrapper-${mode}`);\n        if (!wrapper) return;\n\n        const monthTitle = wrapper.querySelector('.it-cal-monthTitle');\n        const gridContainer = wrapper.querySelector('.it-cal-grid-container');\n        const modal = wrapper.querySelector('.it-modal');\n        const modalBody = modal.querySelector('.it-cal-display-area');\n        const loading = modal.querySelector('.it-cal-loading');\n        const dropdownContent = modal.querySelector('.it-cal-dropdown-content');\n        const hamburgerBtn = modal.querySelector('.it-cal-hamburger-btn');\n        const closeModalBtn = modal.querySelector('.it-close');\n        \n        const creatorBox = wrapper.querySelector('.it-cal-creator-box');\n        const evDateInput = wrapper.querySelector('.ev-date');\n        const evLabelInput = wrapper.querySelector('.ev-label-custom');\n        const evColorInput = wrapper.querySelector('.ev-color');\n        const submitBtn = wrapper.querySelector('.it-cal-btn-submit');\n        const cancelBtn = wrapper.querySelector('.it-cal-btn-cancel');\n        const editOptsBtn = modal.querySelector('.btn-edit-opts');\n\n        function getBlockID(dateStr) {\n            const date = new Date(dateStr);\n            const startOfYear = new Date(date.getFullYear(), 0, 1);\n            const diff = Math.floor((date - startOfYear) \/ (1000 * 60 * 60 * 24));\n            return `CAL_ANNUAL_${date.getFullYear()}_B${Math.floor(diff \/ 21) + 1}`;\n        }\n\n        function getContrastYIQ(hexcolor){\n            if (!hexcolor) return '#222222';\n            hexcolor = hexcolor.replace(\"#\", \"\");\n            if(hexcolor.length === 3) hexcolor = hexcolor.replace(\/(.)\/g, '$1$1');\n            const r = parseInt(hexcolor.substr(0,2),16), g = parseInt(hexcolor.substr(2,2),16), b = parseInt(hexcolor.substr(4,2),16);\n            return (((r*299)+(g*587)+(b*114))\/1000 >= 135) ? '#222222' : '#ffffff';\n        }\n\n        async function caricaDatiMeseCorrente(anno, mese) {\n            let bIDsInMese = new Set();\n            let dataIter = new Date(anno, mese, 1);\n            while (dataIter.getMonth() === mese) {\n                const dateStr = `${dataIter.getFullYear()}-${String(dataIter.getMonth()+1).padStart(2,'0')}-${String(dataIter.getDate()).padStart(2,'0')}`;\n                bIDsInMese.add(getBlockID(dateStr));\n                dataIter.setDate(dataIter.getDate() + 1);\n            }\n\n            for(let bid of bIDsInMese) {\n                if (loadedBlocks[bid]) continue; \n                try {\n                    const res = await fetch(`${API_URL}?search=${bid}&status=publish&_cb=${Date.now()}`);\n                    const posts = await res.json();\n                    if(posts.length > 0) {\n                        loadedBlocks[bid] = posts[0].id;\n                        const raw = posts[0].content.rendered.replace(\/<[^>]*>\/g, '').trim();\n                        const blockData = JSON.parse(decodeURIComponent(escape(atob(raw))));\n                        blockData.forEach(ev => {\n                            if(!databaseEventi.find(e => e.tag === ev.tag)) databaseEventi.push(ev);\n                        });\n                    } else { loadedBlocks[bid] = \"new\"; }\n                } catch(e) { loadedBlocks[bid] = \"new\"; }\n            }\n            renderCalendario();\n        }\n\n        wrapper.querySelector('.it-cal-btn-prev').addEventListener('click', function() {\n            currentVisualDate.setMonth(currentVisualDate.getMonth() - 1);\n            caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n        });\n\n        wrapper.querySelector('.it-cal-btn-next').addEventListener('click', function() {\n            currentVisualDate.setMonth(currentVisualDate.getMonth() + 1);\n            caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n        });\n\n        function renderCalendario() {\n            if(!gridContainer || !monthTitle) return;\n\n            const anno = currentVisualDate.getFullYear();\n            const mese = currentVisualDate.getMonth();\n\n            monthTitle.innerText = `${nomiMesi[mese]} ${anno}`;\n            gridContainer.innerHTML = '';\n\n            const headerGrid = document.createElement('div');\n            headerGrid.className = 'it-cal-grid-header';\n            giorniSettimana.forEach(g => {\n                const gd = document.createElement('div'); gd.innerText = g; headerGrid.appendChild(gd);\n            });\n            gridContainer.appendChild(headerGrid);\n\n            const grid = document.createElement('div');\n            grid.className = 'it-cal-grid';\n\n            const primoGiornoMese = new Date(anno, mese, 1).getDay();\n            const totaleGiorniMese = new Date(anno, mese + 1, 0).getDate();\n\n            for (let i = 0; i < primoGiornoMese; i++) {\n                const emptyDiv = document.createElement('div');\n                emptyDiv.className = 'it-cal-day empty';\n                grid.appendChild(emptyDiv);\n            }\n\n            for (let d = 1; d <= totaleGiorniMese; d++) {\n                const iterDate = new Date(anno, mese, d);\n                const tag = `ID-CAL-${anno}-${mese+1}-${d}`;\n                const dateStr = `${anno}-${String(mese+1).padStart(2,'0')}-${String(d).padStart(2,'0')}`;\n                \n                const ev = databaseEventi.find(e => e.tag === tag);\n                const dayDiv = document.createElement('div');\n                dayDiv.className = 'it-cal-day clickable';\n\n                if (ev && ev.color) {\n                    dayDiv.style.backgroundColor = ev.color;\n                    dayDiv.style.color = getContrastYIQ(ev.color);\n                } else {\n                    if (iterDate.getDay() === 0) { \n                        dayDiv.style.backgroundColor = \"#fcebe8\";\n                        dayDiv.style.color = \"#bc281e\";\n                    }\n                }\n\n                dayDiv.addEventListener('click', () => apriPopLiturgia(dateStr, tag));\n\n                let labelFesta = (ev && ev.label) ? ev.label : '';\n                dayDiv.innerHTML = `\n                    <span class=\"it-cal-day-number\">${d}<\/span>\n                    <span class=\"it-cal-day-label\">${labelFesta}<\/span>\n                `;\n                grid.appendChild(dayDiv);\n            }\n            gridContainer.appendChild(grid);\n        }\n\n        async function loadLiturgiaContent(dateStr, tipo, command = '') {\n            modalBody.innerHTML = '';\n            loading.style.display = 'block';\n\n            const parti = dateStr.split('-');\n            const formattedDate = `${parti[1]}-${parti[2]}-${parti[0]}`;\n\n            try {\n                const res = await fetch(`${AJAX_URL}?action=it_cal_fetch_liturgia&date=${formattedDate}&tipo=${tipo}&command=${command}`);\n                const data = await res.json();\n                loading.style.display = 'none';\n\n                if (data.success && data.data.html) {\n                    modalBody.innerHTML = data.data.html;\n                    modalBody.scrollLeft = 0;\n                } else {\n                    const errorMsg = data.data || \"Nessun dato ritornato o errore nel parsing.\";\n                    modalBody.innerHTML = `<p style=\"color:#bc281e; padding:30px; text-align:center; font-weight:bold;\">${errorMsg}<\/p>`;\n                }\n            } catch (e) {\n                loading.style.display = 'none';\n                modalBody.innerHTML = `<p style=\"color:#bc281e; padding:30px; text-align:center; font-weight:bold;\">Errore asincrono di runtime.<\/p>`;\n            }\n        }\n\n        function apriPopLiturgia(dateStr, tag) {\n            activeSelectedDateStr = dateStr;\n            const ev = databaseEventi.find(e => e.tag === tag);\n            \n            dropdownContent.innerHTML = '';\n\n            const btnMissa = document.createElement('button');\n            btnMissa.innerText = \"Santa Messa (Missa)\";\n            btnMissa.className = \"active\";\n            btnMissa.addEventListener('click', function() {\n                selezionaVoceMenuHamburger(this, dropdownContent);\n                loadLiturgiaContent(dateStr, 'missa');\n            });\n            dropdownContent.appendChild(btnMissa);\n\n            if (ev && ev.oreAbilitate && Array.isArray(ev.oreAbilitate)) {\n                ev.oreAbilitate.forEach(ora => {\n                    const btnOra = document.createElement('button');\n                    btnOra.innerText = ora;\n                    btnOra.addEventListener('click', function() {\n                        selezionaVoceMenuHamburger(this, dropdownContent);\n                        loadLiturgiaContent(dateStr, 'officium', ora);\n                    });\n                    dropdownContent.appendChild(btnOra);\n                });\n            }\n\n            modal.style.display = 'flex';\n            loadLiturgiaContent(dateStr, 'missa');\n        }\n\n        function selezionaVoceMenuHamburger(buttonAttivo, parent) {\n            parent.querySelectorAll('button').forEach(b => b.classList.remove('active'));\n            buttonAttivo.classList.add('active');\n            parent.classList.remove(\"show\");\n        }\n\n        hamburgerBtn.addEventListener('click', function(e) {\n            e.stopPropagation();\n            dropdownContent.classList.toggle(\"show\");\n        });\n\n        closeModalBtn.addEventListener('click', function() {\n            modal.style.display = 'none';\n        });\n\n        if (CAN_EDIT && editOptsBtn) {\n            editOptsBtn.addEventListener('click', function() {\n                modal.style.display = 'none';\n                creatorBox.style.display = 'block';\n\n                evDateInput.value = activeSelectedDateStr;\n                const parti = activeSelectedDateStr.split('-');\n                const tag = `ID-CAL-${parti[0]}-${parseInt(parti[1])}-${parseInt(parti[2])}`;\n                const ev = databaseEventi.find(e => e.tag === tag);\n\n                evLabelInput.value = ev ? (ev.label || '') : '';\n                evColorInput.value = ev ? (ev.color || '#ffffff') : '#ffffff';\n                creatorBox.querySelectorAll('.ore-checkbox').forEach(cb => {\n                    cb.checked = ev ? (ev.oreAbilitate || []).includes(cb.value) : false;\n                });\n                creatorBox.scrollIntoView({ behavior: 'smooth' });\n            });\n\n            submitBtn.addEventListener('click', async function() {\n                const dateInput = evDateInput.value;\n                if(!dateInput) return alert(\"Seleziona data\");\n\n                const oreAbilitate = [];\n                creatorBox.querySelectorAll('.ore-checkbox:checked').forEach(cb => {\n                    oreAbilitate.push(cb.value);\n                });\n\n                const parti = dateInput.split('-');\n                const tag = `ID-CAL-${parti[0]}-${parseInt(parti[1])}-${parseInt(parti[2])}`;\n                \n                const configGiornoObj = {\n                    tag: tag,\n                    date: dateInput,\n                    label: evLabelInput.value,\n                    color: evColorInput.value,\n                    oreAbilitate: oreAbilitate\n                };\n\n                const bid = getBlockID(dateInput);\n                const oldIdx = databaseEventi.findIndex(e => e.tag === tag);\n                if(oldIdx !== -1) databaseEventi[oldIdx] = configGiornoObj; else databaseEventi.push(configGiornoObj);\n\n                const blockEvents = databaseEventi.filter(e => getBlockID(e.date) === bid);\n                const jsonString = btoa(unescape(encodeURIComponent(JSON.stringify(blockEvents))));\n                const postId = loadedBlocks[bid];\n\n                const url = (postId && postId !== \"new\") ? `${API_URL}\/${postId}` : API_URL;\n                const payload = { title: bid, content: jsonString, status: 'publish' };\n\n                const res = await fetch(url, {\n                    method: (postId && postId !== \"new\") ? 'PUT' : 'POST',\n                    headers: { 'Content-Type': 'application\/json', 'X-WP-Nonce': NONCE },\n                    body: JSON.stringify(payload)\n                });\n\n                if(res.ok) {\n                    creatorBox.style.display = 'none';\n                    caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n                } else {\n                    alert(\"Errore nel salvataggio dei metadati.\");\n                }\n            });\n\n            cancelBtn.addEventListener('click', function() {\n                creatorBox.style.display = 'none';\n            });\n        }\n\n        document.addEventListener('click', function(event) {\n            if (!event.target.matches('.it-cal-hamburger-btn')) {\n                if (dropdownContent.classList.contains('show')) {\n                    dropdownContent.classList.remove('show');\n                }\n            }\n        });\n\n        caricaDatiMeseCorrente(currentVisualDate.getFullYear(), currentVisualDate.getMonth());\n    })();\n    <\/script>\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Sancta Missa ( rito romano antico )<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-530","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/pages\/530","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/comments?post=530"}],"version-history":[{"count":46,"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/pages\/530\/revisions"}],"predecessor-version":[{"id":634,"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/pages\/530\/revisions\/634"}],"wp:attachment":[{"href":"https:\/\/www.enricomariaporru.it\/tridentina\/wp-json\/wp\/v2\/media?parent=530"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}