{"id":1073,"date":"2026-09-30T17:55:13","date_gmt":"2026-09-30T15:55:13","guid":{"rendered":"https:\/\/latourmedievale.fr\/?page_id=1073"},"modified":"2026-09-30T19:47:56","modified_gmt":"2026-09-30T17:47:56","slug":"liens-utiles","status":"publish","type":"page","link":"https:\/\/latourmedievale.fr\/index.php\/liens-utiles\/","title":{"rendered":"liens utiles"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Page en construction<\/p>\n\n\n<style data-wp-block-html=\"css\">\n#calendrier-disponibilites {\n    margin-top: 20px;\n    padding: 20px;\n    border-radius: 12px;\n    background: #111111;\n    color: #ffffff;\n}\n\n.calendrier-entete {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 15px;\n    margin-bottom: 20px;\n}\n\n.calendrier-entete h2 {\n    margin: 0;\n    color: #ffffff;\n    text-align: center;\n    font-size: 22px;\n}\n\n.calendrier-entete button {\n    width: 42px;\n    height: 42px;\n    border: 1px solid #ffffff;\n    border-radius: 8px;\n    background: #222222;\n    color: #ffffff;\n    font-size: 28px;\n    line-height: 1;\n    cursor: pointer;\n}\n\n.calendrier-entete button:hover,\n.calendrier-entete button:focus {\n    background: #444444;\n}\n\n\n.calendrier-semaines {\n    display: grid;\n    grid-template-columns: repeat(7, 1fr);\n    gap: 5px;\n    margin-bottom: 5px;\n    text-align: center;\n    font-size: 13px;\n    font-weight: bold;\n    color: #ffffff;\n}\n\n\n.grille-calendrier {\n    display: grid;\n    grid-template-columns: repeat(7, 1fr);\n    gap: 5px;\n}\n\n\n.jour-calendrier {\n    min-height: 48px;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 7px;\n    font-size: 14px;\n    position: relative;\n}\n\n\n.jour-vide {\n    background: transparent;\n}\n\n\n.jour-disponible {\n    background: #263526;\n    color: #ffffff;\n    border: 1px solid #6fa86f;\n}\n\n\n.jour-indisponible {\n    background: #3a3a3a;\n    color: #ffffff;\n    border: 2px solid #ffffff;\n    font-weight: bold;\n}\n\n\n.jour-disponible::after {\n    content: \"\u2713\";\n    position: absolute;\n    bottom: 3px;\n    right: 5px;\n    font-size: 10px;\n    font-weight: bold;\n}\n\n\n.jour-indisponible::after {\n    content: \"\u00d7\";\n    position: absolute;\n    bottom: 2px;\n    right: 5px;\n    font-size: 13px;\n    font-weight: bold;\n}\n\n\n.jour-aujourd-hui {\n    outline: 3px solid #ffffff;\n    outline-offset: -3px;\n}\n\n\n.legende-calendrier {\n    display: flex;\n    justify-content: center;\n    gap: 25px;\n    flex-wrap: wrap;\n    margin-top: 20px;\n    font-size: 13px;\n}\n\n\n.legende-calendrier > span {\n    display: inline-flex;\n    align-items: center;\n    gap: 7px;\n}\n\n\n.legende-disponible,\n.legende-indisponible {\n    width: 22px;\n    height: 22px;\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    border-radius: 4px;\n    font-weight: bold;\n}\n\n\n.legende-disponible {\n    background: #263526;\n    border: 1px solid #6fa86f;\n}\n\n\n.legende-indisponible {\n    background: #3a3a3a;\n    border: 2px solid #ffffff;\n}\n\n\n@media (max-width: 600px) {\n\n    #calendrier-disponibilites {\n        padding: 15px;\n    }\n\n    .calendrier-entete h2 {\n        font-size: 18px;\n    }\n\n    .jour-calendrier {\n        min-height: 42px;\n        font-size: 13px;\n    }\n\n    .calendrier-semaines {\n        font-size: 11px;\n    }\n\n}\n<\/style>\n\n<script data-wp-block-html=\"js\">\nsetTimeout(function () {\n\n    const grille = document.getElementById(\"grille-calendrier\");\n    const titre = document.getElementById(\"mois-annee\");\n    const boutonPrecedent = document.getElementById(\"mois-precedent\");\n    const boutonSuivant = document.getElementById(\"mois-suivant\");\n\n\n    if (!grille || !titre || !boutonPrecedent || !boutonSuivant) {\n        return;\n    }\n\n\n    let dateCalendrier = new Date();\n\n    dateCalendrier.setDate(1);\n\n\n    let datesIndisponibles = new Set();\n\n\n    const moisFrancais = [\n        \"janvier\",\n        \"f\u00e9vrier\",\n        \"mars\",\n        \"avril\",\n        \"mai\",\n        \"juin\",\n        \"juillet\",\n        \"ao\u00fbt\",\n        \"septembre\",\n        \"octobre\",\n        \"novembre\",\n        \"d\u00e9cembre\"\n    ];\n\n\n    function formatDate(date) {\n\n        const annee = date.getFullYear();\n        const mois = String(date.getMonth() + 1).padStart(2, \"0\");\n        const jour = String(date.getDate()).padStart(2, \"0\");\n\n        return annee + \"-\" + mois + \"-\" + jour;\n    }\n\n\n    function afficherCalendrier() {\n\n        const annee = dateCalendrier.getFullYear();\n        const mois = dateCalendrier.getMonth();\n\n\n        titre.textContent =\n            moisFrancais[mois] + \" \" + annee;\n\n\n        grille.innerHTML = \"\";\n\n\n        const premierJour = new Date(annee, mois, 1);\n\n        let jourSemaine = premierJour.getDay();\n\n\n        \/*\n         * JavaScript :\n         * dimanche = 0\n         * lundi = 1\n         *\n         * Notre calendrier commence lundi.\n         *\/\n\n        jourSemaine = jourSemaine === 0 ? 7 : jourSemaine;\n\n\n        \/*\n         * Cases vides avant le premier jour.\n         *\/\n\n        for (let i = 1; i < jourSemaine; i++) {\n\n            const caseVide = document.createElement(\"div\");\n\n            caseVide.className =\n                \"jour-calendrier jour-vide\";\n\n            grille.appendChild(caseVide);\n        }\n\n\n        const nombreJours =\n            new Date(annee, mois + 1, 0).getDate();\n\n\n        const aujourdHui = formatDate(new Date());\n\n\n        for (let jour = 1; jour <= nombreJours; jour++) {\n\n            const date = new Date(annee, mois, jour);\n\n            const dateTexte = formatDate(date);\n\n\n            const cellule = document.createElement(\"div\");\n\n            cellule.className =\n                \"jour-calendrier\";\n\n\n            \/*\n             * V\u00e9rification de la disponibilit\u00e9.\n             *\/\n\n            if (datesIndisponibles.has(dateTexte)) {\n\n                cellule.classList.add(\n                    \"jour-indisponible\"\n                );\n\n                cellule.setAttribute(\n                    \"aria-label\",\n                    jour + \" : indisponible\"\n                );\n\n                cellule.setAttribute(\n                    \"title\",\n                    \"Indisponible\"\n                );\n\n            } else {\n\n                cellule.classList.add(\n                    \"jour-disponible\"\n                );\n\n                cellule.setAttribute(\n                    \"aria-label\",\n                    jour + \" : disponible\"\n                );\n\n                cellule.setAttribute(\n                    \"title\",\n                    \"Disponible\"\n                );\n            }\n\n\n            \/*\n             * Aujourd'hui.\n             *\/\n\n            if (dateTexte === aujourdHui) {\n\n                cellule.classList.add(\n                    \"jour-aujourd-hui\"\n                );\n            }\n\n\n            cellule.textContent = jour;\n\n            grille.appendChild(cellule);\n        }\n    }\n\n\n    function chargerCalendriers() {\n\n        grille.innerHTML =\n            \"Lecture des disponibilit\u00e9s en cours...\";\n\n\n        fetch(\"\/wp-json\/tour-medievale\/v1\/calendriers\")\n            .then(function (reponse) {\n\n                if (!reponse.ok) {\n\n                    throw new Error(\n                        \"HTTP \" + reponse.status\n                    );\n                }\n\n                return reponse.json();\n            })\n            .then(function (donnees) {\n\n                if (\n                    !donnees.success ||\n                    !Array.isArray(\n                        donnees.dates_indisponibles\n                    )\n                ) {\n\n                    throw new Error(\n                        \"Donn\u00e9es de calendrier invalides\"\n                    );\n                }\n\n\n                \/*\n                 * Transformation en Set :\n                 * recherche rapide des dates.\n                 *\/\n\n                datesIndisponibles =\n                    new Set(\n                        donnees.dates_indisponibles\n                    );\n\n\n                afficherCalendrier();\n            })\n            .catch(function (erreur) {\n\n                grille.innerHTML =\n                    \"Impossible de charger les disponibilit\u00e9s.\";\n\n\n                console.log(\n                    \"Erreur calendrier :\",\n                    erreur\n                );\n            });\n    }\n\n\n    boutonPrecedent.addEventListener(\n        \"click\",\n        function () {\n\n            dateCalendrier.setMonth(\n                dateCalendrier.getMonth() - 1\n            );\n\n            afficherCalendrier();\n        }\n    );\n\n\n    boutonSuivant.addEventListener(\n        \"click\",\n        function () {\n\n            dateCalendrier.setMonth(\n                dateCalendrier.getMonth() + 1\n            );\n\n            afficherCalendrier();\n        }\n    );\n\n\n    chargerCalendriers();\n\n}, 500);\n<\/script>\n\n<div id=\"calendrier-disponibilites\">\n\n  <div class=\"calendrier-entete\">\n\n    <button type=\"button\" id=\"mois-precedent\" aria-label=\"Mois pr\u00e9c\u00e9dent\">\n      \u2039\n    <\/button>\n\n    <h2 id=\"mois-annee\"><\/h2>\n\n    <button type=\"button\" id=\"mois-suivant\" aria-label=\"Mois suivant\">\n      \u203a\n    <\/button>\n\n  <\/div>\n\n\n  <div class=\"calendrier-semaines\">\n    <div>Lun<\/div>\n    <div>Mar<\/div>\n    <div>Mer<\/div>\n    <div>Jeu<\/div>\n    <div>Ven<\/div>\n    <div>Sam<\/div>\n    <div>Dim<\/div>\n  <\/div>\n\n\n  <div id=\"grille-calendrier\" class=\"grille-calendrier\">\n    Chargement des disponibilit\u00e9s...\n  <\/div>\n\n\n  <div class=\"legende-calendrier\">\n\n    <span>\n      <span class=\"legende-disponible\">\u2713<\/span>\n      Disponible\n    <\/span>\n\n    <span>\n      <span class=\"legende-indisponible\">\u00d7<\/span>\n      Indisponible\n    <\/span>\n\n  <\/div>\n\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Page en construction \u2039 \u203a Lun Mar Mer Jeu Ven Sam Dim Chargement des disponibilit\u00e9s&#8230; \u2713 Disponible \u00d7 Indisponible<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-1073","page","type-page","status-publish","hentry"],"aioseo_notices":[],"featured_image_src":null,"_links":{"self":[{"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/pages\/1073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/comments?post=1073"}],"version-history":[{"count":4,"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/pages\/1073\/revisions"}],"predecessor-version":[{"id":1077,"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/pages\/1073\/revisions\/1077"}],"wp:attachment":[{"href":"https:\/\/latourmedievale.fr\/index.php\/wp-json\/wp\/v2\/media?parent=1073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}