{"id":14877,"date":"2026-04-08T10:36:03","date_gmt":"2026-04-08T08:36:03","guid":{"rendered":"https:\/\/www.coverfop.it\/?page_id=14877"},"modified":"2026-10-28T15:42:06","modified_gmt":"2026-10-28T14:42:06","slug":"prenotazione-aule","status":"publish","type":"page","link":"https:\/\/www.coverfop.it\/index.php\/prenotazione-aule\/","title":{"rendered":"prenotazione aule"},"content":{"rendered":"<div>\n<p>    <!-- ================================================================\n     COVERFOP \u2013 Widget Prenotazione Aule  (v5 \u2013 classe e gruppo, richiede plugin 1.4.0)\n     Versione: embeddabile in YOOtheme \/ WordPress (Custom HTML)\n\n     \u2500\u2500 CONFIGURAZIONE RAPIDA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n     CFP_API   \u2192  URL base del sito WordPress\n     CFP_TOKEN \u2192  token segreto (deve corrispondere al plugin)\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n================================================================ --><\/p>\n<div class=\"cfp__root\" id=\"cfpApp\">\n<style>\n.cfp__root *, .cfp__root *::before, .cfp__root *::after {\n  box-sizing: border-box; margin: 0; padding: 0;\n}\n.cfp__root {\n  --cfp-blu:    #1a3a5c;\n  --cfp-blu-m:  #2563a8;\n  --cfp-blu-l:  #e8f0fb;\n  --cfp-acc:    #e85d26;\n  --cfp-grigio: #f4f6f9;\n  --cfp-bordo:  #d0d8e4;\n  --cfp-testo:  #1e2a35;\n  --cfp-soft:   #5a6b7c;\n  --cfp-bianco: #ffffff;\n  \/* palette colori eventi calendario (4 colori a rotazione) *\/\n  --cfp-c1: #2563a8;\n  --cfp-c2: #16a34a;\n  --cfp-c3: #7c3aed;\n  --cfp-c4: #b45309;\n  font-family: 'Segoe UI', system-ui, sans-serif;\n  color: var(--cfp-testo);\n}<\/p>\n<p>\/* \u2500\u2500 TOPBAR \u2500\u2500 *\/\n.cfp__topbar {\n  background: var(--cfp-blu); color: #fff;\n  padding: .75rem 1.5rem;\n  display: flex; align-items: center; justify-content: space-between;\n  flex-wrap: wrap; gap: .5rem;\n  border-radius: 10px 10px 0 0;\n}\n.cfp__topbar-logo { font-size: 1.05rem; font-weight: 700; letter-spacing: .04em; }\n.cfp__topbar-logo span { color: var(--cfp-acc); }\n.cfp__topbar-nav { display: flex; gap: .4rem; }\n.cfp__topbar-nav button {\n  background: transparent; border: 1.5px solid rgba(255,255,255,.35);\n  color: #fff; padding: .35rem .9rem; border-radius: 6px;\n  cursor: pointer; font-size: .82rem; font-weight: 600;\n  transition: background .15s; font-family: inherit;\n}\n.cfp__topbar-nav button:hover,\n.cfp__topbar-nav button.cfp--active {\n  background: rgba(255,255,255,.15); border-color: rgba(255,255,255,.7);\n}<\/p>\n<p>\/* \u2500\u2500 LAYOUT \u2500\u2500 *\/\n.cfp__layout {\n  display: grid; grid-template-columns: 360px 1fr;\n  gap: 1.2rem; padding: 1.2rem;\n  background: var(--cfp-grigio); border-radius: 0 0 10px 10px;\n  align-items: start;\n}\n@media (max-width: 860px) { .cfp__layout { grid-template-columns: 1fr; } }<\/p>\n<p>\/* \u2500\u2500 CARD \u2500\u2500 *\/\n.cfp__card {\n  background: var(--cfp-bianco); border-radius: 10px;\n  box-shadow: 0 2px 12px rgba(0,0,0,.07); padding: 1.4rem;\n}\n.cfp__card-title {\n  font-size: 1rem; font-weight: 700; color: var(--cfp-blu);\n  margin-bottom: 1rem; padding-bottom: .6rem;\n  border-bottom: 2px solid var(--cfp-blu-l);\n  display: flex; align-items: center; gap: .4rem;\n}<\/p>\n<p>\/* \u2500\u2500 FORM \u2500\u2500 *\/\n.cfp__form { display: flex; flex-direction: column; gap: .9rem; }\n.cfp__row  { display: flex; gap: .7rem; }\n.cfp__row .cfp__field { flex: 1; }\n.cfp__field { display: flex; flex-direction: column; gap: .3rem; }\n.cfp__field label {\n  font-size: .73rem; font-weight: 700; color: var(--cfp-soft);\n  text-transform: uppercase; letter-spacing: .05em;\n}\n.cfp__field input,\n.cfp__field select,\n.cfp__field textarea {\n  border: 1.5px solid var(--cfp-bordo) !important;\n  border-radius: 7px !important; padding: .5rem .7rem !important;\n  font-size: .9rem !important; color: var(--cfp-testo) !important;\n  background: var(--cfp-bianco) !important;\n  transition: border-color .15s, box-shadow .15s;\n  width: 100% !important; font-family: inherit !important;\n  outline: none !important; box-shadow: none !important;\n}\n.cfp__field input:focus,\n.cfp__field select:focus,\n.cfp__field textarea:focus {\n  border-color: var(--cfp-blu-m) !important;\n  box-shadow: 0 0 0 3px rgba(37,99,168,.12) !important;\n}\n.cfp__field textarea { resize: vertical; min-height: 64px; }\n.cfp__ledwall { background: var(--cfp-blu-l); border-radius: 7px; padding: .6rem .7rem; }\n.cfp__ledwall .cfp__check { display: flex; align-items: center; gap: .45rem; font-size: .8rem; color: var(--cfp-blu); cursor: pointer; text-transform: none; letter-spacing: 0; }\n.cfp__ledwall .cfp__check input { width: auto !important; margin: 0; }\n.cfp__ledwall small { font-size: .7rem; color: var(--cfp-soft); }\n.cfp__nolw { display: inline-block; font-size: .62rem; font-weight: 700; color: #92400e; background: #fffbeb; border: 1px solid #fcd34d; border-radius: 4px; padding: 0 .3rem; margin-left: .3rem; }<\/p>\n<p>\/* banner edit mode *\/\n.cfp__edit-banner {\n  background: #fffbeb; border: 1.5px solid #fcd34d; border-radius: 7px;\n  padding: .5rem .75rem; font-size: .82rem; color: #92400e;\n  display: none; align-items: center; justify-content: space-between; gap: .5rem;\n}\n.cfp__edit-banner.cfp--show { display: flex; }\n.cfp__edit-banner button {\n  background: none; border: none; color: #92400e; cursor: pointer;\n  font-size: .8rem; font-weight: 700; text-decoration: underline;\n  font-family: inherit; padding: 0;\n}<\/p>\n<p>.cfp__btn-submit {\n  background: var(--cfp-blu); color: #fff; border: none;\n  border-radius: 7px; padding: .7rem 1.2rem;\n  font-size: .92rem; font-weight: 700; cursor: pointer;\n  width: 100%; font-family: inherit; letter-spacing: .03em;\n  transition: background .15s, opacity .15s; margin-top: .2rem;\n}\n.cfp__btn-submit:hover    { background: var(--cfp-blu-m); }\n.cfp__btn-submit:disabled { opacity: .55; cursor: default; }\n.cfp__btn-submit.cfp--edit-mode { background: #b45309; }\n.cfp__btn-submit.cfp--edit-mode:hover { background: #92400e; }<\/p>\n<p>\/* \u2500\u2500 SPINNER \u2500\u2500 *\/\n.cfp__spinner {\n  display: inline-block; width: 14px; height: 14px;\n  border: 2px solid rgba(255,255,255,.4);\n  border-top-color: #fff; border-radius: 50%;\n  animation: cfp-spin .7s linear infinite; vertical-align: middle;\n}\n@keyframes cfp-spin { to { transform: rotate(360deg); } }<\/p>\n<p>\/* \u2500\u2500 LOADER \u2500\u2500 *\/\n.cfp__loading-overlay {\n  display: none; text-align: center;\n  padding: 2rem; color: var(--cfp-soft); font-size: .88rem;\n}\n.cfp__loading-overlay.cfp--show { display: block; }<\/p>\n<p>\/* \u2500\u2500 CALENDARIO \u2500\u2500 *\/\n.cfp__cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: .8rem; }\n.cfp__cal-title  { font-size: 1rem; font-weight: 700; color: var(--cfp-blu); text-transform: capitalize; }\n.cfp__cal-nav { display: flex; gap: .3rem; }\n.cfp__cal-nav button {\n  background: var(--cfp-grigio); border: 1.5px solid var(--cfp-bordo);\n  color: var(--cfp-blu); width: 30px; height: 30px; border-radius: 6px;\n  cursor: pointer; font-size: .95rem;\n  display: flex; align-items: center; justify-content: center;\n  transition: background .12s; font-family: inherit;\n}\n.cfp__cal-nav button:hover { background: var(--cfp-blu-l); }\n.cfp__cal-nav button.cfp__btn-oggi { width: auto; padding: 0 .65rem; font-size: .74rem; font-weight: 700; }<\/p>\n<p>.cfp__weekdays { display: grid; grid-template-columns: repeat(7,1fr); text-align: center; margin-bottom: .25rem; }\n.cfp__weekdays span { font-size: .68rem; font-weight: 700; color: var(--cfp-soft); text-transform: uppercase; padding: .25rem 0; }<\/p>\n<p>.cfp__cal-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 3px; }\n.cfp__cell {\n  min-height: 90px; height: auto; max-height: 220px;\n  overflow-y: auto; overflow-x: hidden;\n  background: var(--cfp-grigio); border-radius: 5px;\n  padding: 3px; border: 1.5px solid transparent;\n  transition: border-color .12s;\n  display: flex; flex-direction: column;\n}\n.cfp__cell:hover    { border-color: var(--cfp-bordo); }\n.cfp__cell.cfp--other { opacity: .3; }\n.cfp__cell.cfp--today { background: var(--cfp-blu-l); border-color: var(--cfp-blu-m); }\n.cfp__daynum { font-size: .74rem; font-weight: 700; color: var(--cfp-soft); margin-bottom: 2px; flex-shrink: 0; }\n.cfp__cell.cfp--today .cfp__daynum { color: var(--cfp-blu); }<\/p>\n<p>.cfp__ev {\n  font-size: .62rem; font-weight: 600; border-radius: 3px;\n  padding: 2px 4px; margin-bottom: 2px; color: #fff;\n  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\n  cursor: pointer; line-height: 1.35; max-width: 100%; flex-shrink: 0;\n}\n.cfp__ev.cfp--c1 { background: var(--cfp-c1); }\n.cfp__ev.cfp--c2 { background: var(--cfp-c2); }\n.cfp__ev.cfp--c3 { background: var(--cfp-c3); }\n.cfp__ev.cfp--c4 { background: var(--cfp-c4); }\n.cfp__ev:hover { filter: brightness(1.15); }\n\/* eventi nel passato: grigi e non cliccabili *\/\n.cfp__ev.cfp--past { background: #9ca3af !important; cursor: default; opacity: .8; }\n.cfp__ev.cfp--past:hover { filter: none; }\n.cfp__ev-more { font-size: .6rem; color: var(--cfp-soft); cursor: pointer; padding: 1px 2px; }\n.cfp__ev-more:hover { text-decoration: underline; }<\/p>\n<p>\/* \u2500\u2500 LISTA \u2500\u2500 *\/\n.cfp__lista-filters { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-bottom: .8rem; }\n.cfp__lista-filters input,\n.cfp__lista-filters select {\n  border: 1.5px solid var(--cfp-bordo) !important; border-radius: 6px !important;\n  padding: .35rem .6rem !important; font-size: .8rem !important;\n  color: var(--cfp-testo) !important; background: var(--cfp-bianco) !important;\n  font-family: inherit !important;\n}\n.cfp__table { width: 100%; border-collapse: collapse; font-size: .82rem; }\n.cfp__table th { background: var(--cfp-blu-l); color: var(--cfp-blu); font-weight: 700; text-align: left; padding: .5rem .65rem; font-size: .72rem; text-transform: uppercase; letter-spacing: .04em; }\n.cfp__table td { padding: .55rem .65rem; border-bottom: 1px solid var(--cfp-bordo); vertical-align: middle; }\n.cfp__table tr:hover td { background: var(--cfp-grigio); }\n.cfp__badge { display: inline-block; padding: .15rem .5rem; border-radius: 12px; font-size: .7rem; font-weight: 700; color: #fff; }\n.cfp__badge.cfp--c1 { background: var(--cfp-c1); }\n.cfp__badge.cfp--c2 { background: var(--cfp-c2); }\n.cfp__badge.cfp--c3 { background: var(--cfp-c3); }\n.cfp__badge.cfp--c4 { background: var(--cfp-c4); }\n.cfp__btn-del {\n  background: none; border: none; color: #dc2626;\n  cursor: pointer; font-size: .9rem; padding: 2px 5px;\n  border-radius: 4px; font-family: inherit;\n}\n.cfp__btn-del:hover { background: #fef2f2; }\n.cfp__btn-edit {\n  background: none; border: none; color: var(--cfp-blu-m);\n  cursor: pointer; font-size: .9rem; padding: 2px 5px;\n  border-radius: 4px; font-family: inherit;\n}\n.cfp__btn-edit:hover { background: var(--cfp-blu-l); }\n.cfp__empty { text-align: center; padding: 2rem 1rem; color: var(--cfp-soft); font-size: .88rem; }<\/p>\n<p>\/* \u2500\u2500 MODAL \u2500\u2500 *\/\n.cfp__overlay {\n  position: fixed; inset: 0; background: rgba(0,0,0,.45);\n  display: flex; align-items: center; justify-content: center;\n  z-index: 99999; opacity: 0; pointer-events: none; transition: opacity .2s;\n}\n.cfp__overlay.cfp--open { opacity: 1; pointer-events: auto; }\n.cfp__modal {\n  background: #fff; border-radius: 12px; padding: 1.6rem;\n  min-width: 300px; max-width: 420px; width: 90%;\n  box-shadow: 0 8px 40px rgba(0,0,0,.18);\n  transform: translateY(16px); transition: transform .2s;\n}\n.cfp__overlay.cfp--open .cfp__modal { transform: translateY(0); }\n.cfp__modal h3 { font-size: 1rem; font-weight: 700; color: var(--cfp-blu); margin-bottom: .15rem; }\n.cfp__modal-sub { font-size: .8rem; color: var(--cfp-soft); margin-bottom: .9rem; }\n.cfp__modal-details { display: flex; flex-direction: column; gap: .45rem; }\n.cfp__det-row { display: flex; gap: .5rem; font-size: .86rem; align-items: flex-start; }\n.cfp__det-label { font-weight: 700; color: var(--cfp-soft); min-width: 80px; flex-shrink: 0; }\n.cfp__modal-actions { display: flex; justify-content: flex-end; gap: .5rem; margin-top: 1.1rem; flex-wrap: wrap; }\n.cfp__btn-modal-close {\n  background: var(--cfp-grigio); border: 1.5px solid var(--cfp-bordo);\n  color: var(--cfp-testo); padding: .45rem 1rem; border-radius: 6px;\n  cursor: pointer; font-size: .85rem; font-weight: 600; font-family: inherit;\n}\n.cfp__btn-modal-edit {\n  background: var(--cfp-blu-l); border: 1.5px solid var(--cfp-blu-m);\n  color: var(--cfp-blu); padding: .45rem 1rem; border-radius: 6px;\n  cursor: pointer; font-size: .85rem; font-weight: 600; font-family: inherit;\n}\n.cfp__btn-modal-edit:hover { background: #d0e3f7; }\n.cfp__btn-modal-del {\n  background: #fef2f2; border: 1.5px solid #fca5a5;\n  color: #dc2626; padding: .45rem 1rem; border-radius: 6px;\n  cursor: pointer; font-size: .85rem; font-weight: 600; font-family: inherit;\n}\n.cfp__btn-modal-del:hover { background: #fee2e2; }<\/p>\n<p>\/* \u2500\u2500 TOAST \u2500\u2500 *\/\n.cfp__toast {\n  position: fixed; bottom: 1.5rem; right: 1.5rem; background: #16a34a;\n  color: #fff; padding: .7rem 1.2rem; border-radius: 8px;\n  font-weight: 700; font-size: .85rem;\n  box-shadow: 0 4px 16px rgba(0,0,0,.2);\n  opacity: 0; transform: translateY(10px);\n  transition: opacity .25s, transform .25s;\n  pointer-events: none; z-index: 999999;\n}\n.cfp__toast.cfp--show  { opacity: 1; transform: translateY(0); }\n.cfp__toast.cfp--error { background: #dc2626; }<\/p>\n<p>\/* \u2500\u2500 ERRORI API \u2500\u2500 *\/\n.cfp__api-error {\n  background: #fef2f2; border: 1.5px solid #fca5a5; color: #991b1b;\n  border-radius: 8px; padding: .7rem 1rem; font-size: .83rem;\n  margin-bottom: .8rem; display: none;\n}\n.cfp__api-error.cfp--show { display: block; }\n<\/style>\n<p><!-- TOPBAR --><\/p>\n<div class=\"cfp__topbar\">\n<div class=\"cfp__topbar-logo\">COVER<span>FOP<\/span> &nbsp;|&nbsp; Prenotazione Aule<\/div>\n<nav class=\"cfp__topbar-nav\">\n    <button id=\"cfpBtnCal\"   class=\"cfp--active\" onclick=\"cfpShowView('cal')\">\ud83d\udcc5 Calendario<\/button><br \/>\n    <button id=\"cfpBtnLista\"                     onclick=\"cfpShowView('lista')\">\ud83d\udccb Lista<\/button><br \/>\n  <\/nav>\n<\/div>\n<div class=\"cfp__layout\">\n<p>  <!-- \u2500\u2500 FORM \u2500\u2500 --><\/p>\n<div class=\"cfp__card\">\n<div class=\"cfp__card-title\" id=\"cfpFormTitle\">\u270f\ufe0f Nuova prenotazione<\/div>\n<p>    <!-- banner edit mode --><\/p>\n<div class=\"cfp__edit-banner\" id=\"cfpEditBanner\">\n      <span>\u26a0\ufe0f Stai modificando una prenotazione esistente<\/span><br \/>\n      <button onclick=\"cfpCancelEdit()\">Annulla<\/button>\n    <\/div>\n<div class=\"cfp__api-error\" id=\"cfpFormErr\"><\/div>\n<form class=\"cfp__form\" id=\"cfpForm\" onsubmit=\"cfpSubmit(event)\">\n<div class=\"cfp__field\">\n        <label>Nome attivit\u00e0 \/ corso<\/label><br \/>\n        <input type=\"text\" id=\"cfpNome\" placeholder=\"es. Corso sicurezza \u2013 modulo 1\" required \/>\n      <\/div>\n<div class=\"cfp__field\">\n        <label>Prenotato da<\/label><br \/>\n        <input type=\"text\" id=\"cfpDa\" placeholder=\"Nome e cognome\" required \/>\n      <\/div>\n<div class=\"cfp__row\">\n<div class=\"cfp__field\">\n          <label>Data<\/label><br \/>\n          <input type=\"date\" id=\"cfpData\" required \/>\n        <\/div>\n<div class=\"cfp__field\">\n          <label>Aula<\/label><br \/>\n          <select id=\"cfpAula\" required><option value=\"\">\u2014 seleziona \u2014<\/option><option value=\"Aula 1\">Aula 1<\/option><option value=\"Aula 4\">Aula 4<\/option><option value=\"Aula 5\">Aula 5<\/option><option value=\"Aula 6\">Aula 6<\/option><option value=\"A. Docenti\">A. Docenti<\/option><option value=\"Aula 9\">Aula 9<\/option><option value=\"Aula 10\">Aula 10<\/option><option value=\"Aula MIRI\">Aula MIRI<\/option><option value=\"Aula 12\">Aula 12<\/option><option value=\"Aula 13\">Aula 13<\/option><option value=\"Aula 14\">Aula 14<\/option><option value=\"Aula 15\">Aula 15<\/option><option value=\"Aula 16\">Aula 16<\/option><option value=\"Aula 17\">Aula 17<\/option><option value=\"Aula 18\">Aula 18<\/option><option value=\"Aula 19\">Aula 19<\/option><option value=\"Aula 20\">Aula 20<\/option><option value=\"Aula 21\">Aula 21<\/option><option value=\"Aula 22\">Aula 22<\/option><option value=\"Aula 23\">Aula 23<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div class=\"cfp__row\">\n<div class=\"cfp__field\">\n          <label>Ora inizio<\/label><br \/>\n          <input type=\"time\" id=\"cfpInizio\" required \/>\n        <\/div>\n<div class=\"cfp__field\">\n          <label>Ora fine<\/label><br \/>\n          <input type=\"time\" id=\"cfpFine\" required \/>\n        <\/div>\n<\/p><\/div>\n<div class=\"cfp__field\">\n        <label>Note (opzionale)<\/label><br \/>\n        <textarea id=\"cfpNote\" placeholder=\"Attrezzature, numero partecipanti\u2026\"><\/textarea>\n      <\/div>\n<div class=\"cfp__row\">\n<div class=\"cfp__field\">\n          <label>Classe (se \u00e8 per una classe)<\/label><br \/>\n          <select id=\"cfpClasse\" onchange=\"cfpToggleGruppo()\"><option value=\"\">\u2014 nessuna: corso one-shot \u2014<\/option><\/select>\n        <\/div>\n<div class=\"cfp__field\" id=\"cfpGruppoBox\" style=\"display:none\">\n          <label>Gruppo<\/label><br \/>\n          <select id=\"cfpGruppo\"><option value=\"\">Tutta la classe<\/option><option value=\"A\">A \u2013 automazione<\/option><option value=\"I\">I \u2013 informatica<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div class=\"cfp__field cfp__ledwall\">\n        <label class=\"cfp__check\"><input type=\"checkbox\" id=\"cfpLedwall\" checked \/> Mostra sul ledwall<\/label><br \/>\n        <input type=\"text\" id=\"cfpSchermo\" placeholder=\"Nome sul ledwall (facoltativo, es. Corso sicurezza \u2013 modulo 1)\" \/><br \/>\n        <small>Togli la spunta per riunioni e attivit\u00e0 interne. Sullo schermo non compare mai chi ha prenotato.<\/small>\n      <\/div>\n<p>      <button type=\"submit\" class=\"cfp__btn-submit\" id=\"cfpBtnSubmit\">\u2705 Conferma prenotazione<\/button><br \/>\n    <\/form>\n<\/p><\/div>\n<p>  <!-- \u2500\u2500 COLONNA DESTRA \u2500\u2500 --><\/p>\n<div>\n    <!-- Vista Calendario --><\/p>\n<div class=\"cfp__card\" id=\"cfpCalView\">\n<div class=\"cfp__cal-header\">\n<div class=\"cfp__cal-title\" id=\"cfpCalTitle\"><\/div>\n<div class=\"cfp__cal-nav\">\n          <button onclick=\"cfpChangeMonth(-1)\">&#8592;<\/button><br \/>\n          <button class=\"cfp__btn-oggi\" onclick=\"cfpGoToday()\">Oggi<\/button><br \/>\n          <button onclick=\"cfpChangeMonth(1)\">&#8594;<\/button>\n        <\/div>\n<\/p><\/div>\n<div class=\"cfp__weekdays\">\n        <span>Lun<\/span><span>Mar<\/span><span>Mer<\/span><br \/>\n        <span>Gio<\/span><span>Ven<\/span><span>Sab<\/span><span>Dom<\/span>\n      <\/div>\n<div class=\"cfp__loading-overlay\" id=\"cfpCalLoader\">\u23f3 Caricamento prenotazioni\u2026<\/div>\n<div class=\"cfp__api-error\" id=\"cfpCalErr\"><\/div>\n<div class=\"cfp__cal-grid\" id=\"cfpGrid\"><\/div>\n<\/p><\/div>\n<p>    <!-- Vista Lista --><\/p>\n<div class=\"cfp__card\" id=\"cfpListaView\" style=\"display:none;\">\n<div class=\"cfp__card-title\" style=\"margin-bottom:.7rem;\">\ud83d\udccb Prenotazioni<\/div>\n<div class=\"cfp__lista-filters\">\n        <input type=\"date\" id=\"cfpFiltroData\" onchange=\"cfpRenderLista()\" title=\"Filtra per data\" \/><br \/>\n        <select id=\"cfpFiltroAula\" onchange=\"cfpRenderLista()\"><option value=\"\">Tutte le aule<\/option><option value=\"Aula 1\">Aula 1<\/option><option value=\"Aula 4\">Aula 4<\/option><option value=\"Aula 5\">Aula 5<\/option><option value=\"Aula 6\">Aula 6<\/option><option value=\"A. Docenti\">A. Docenti<\/option><option value=\"Aula 9\">Aula 9<\/option><option value=\"Aula 10\">Aula 10<\/option><option value=\"Aula MIRI\">Aula MIRI<\/option><option value=\"Aula 12\">Aula 12<\/option><option value=\"Aula 13\">Aula 13<\/option><option value=\"Aula 14\">Aula 14<\/option><option value=\"Aula 15\">Aula 15<\/option><option value=\"Aula 16\">Aula 16<\/option><option value=\"Aula 17\">Aula 17<\/option><option value=\"Aula 18\">Aula 18<\/option><option value=\"Aula 19\">Aula 19<\/option><option value=\"Aula 20\">Aula 20<\/option><option value=\"Aula 21\">Aula 21<\/option><option value=\"Aula 22\">Aula 22<\/option><option value=\"Aula 23\">Aula 23<\/option><\/select>\n      <\/div>\n<div class=\"cfp__loading-overlay\" id=\"cfpListaLoader\">\u23f3 Caricamento\u2026<\/div>\n<div class=\"cfp__api-error\" id=\"cfpListaErr\"><\/div>\n<div id=\"cfpListaCont\"><\/div>\n<\/p><\/div>\n<\/p><\/div>\n<\/div>\n<p><!-- Modal dettaglio --><\/p>\n<div class=\"cfp__overlay\" id=\"cfpOverlay\">\n<div class=\"cfp__modal\">\n<h3 id=\"cfpModalTitle\"><\/h3>\n<div class=\"cfp__modal-sub\"     id=\"cfpModalSub\"><\/div>\n<div class=\"cfp__modal-details\" id=\"cfpModalDet\"><\/div>\n<div class=\"cfp__modal-actions\">\n      <button class=\"cfp__btn-modal-del\"   id=\"cfpBtnDel\">\ud83d\uddd1 Elimina<\/button><br \/>\n      <button class=\"cfp__btn-modal-edit\"  id=\"cfpBtnEdit\">\u270f\ufe0f Modifica<\/button><br \/>\n      <button class=\"cfp__btn-modal-close\" id=\"cfpBtnClose\">Chiudi<\/button>\n    <\/div>\n<\/p><\/div>\n<\/div>\n<div class=\"cfp__toast\" id=\"cfpToast\"><\/div>\n<\/div>\n<p><!-- fine .cfp__root --><\/p>\n<p><script>\n(function () {\n  'use strict';<\/p>\n<p>  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n     CONFIGURA QUI\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\n  var CFP_API   = 'https:\/\/www.coverfop.it\/wp-json\/coverfop\/v1';\n  var CFP_TOKEN = '61BRV0tzdJ-RfNfldJqUv6q9anCdo3wC0pJ5XJMrAPs';\n  \/* indirizzo \/exec dello script del ledwall: da qui il modulo prende l'elenco delle classi *\/\n  var CFP_LEDWALL = 'https:\/\/script.google.com\/macros\/s\/AKfycby7VeiQrmdmaOiYVvcLbW7z5vWNBVoG3uotu-EShcJFLI5wmrTHCT1bWWy37JJbmAE\/exec';\n  \/* elenco di riserva, usato solo se lo script non risponde *\/\n  var CFP_CLASSI = ['OE\/OI 1\u00aa','OE\/OI 2\u00aa','OE\/OI 3\u00aa','TE\/TI 4\u00aa','OB 1\u00aa','OB 2\u00aa','OB 3\u00aa','TTE 4\u00aa',\n                    'OSS primo corso','OSS secondo corso','Agg. informatico GOL','Sommelier 1\u00b0 livello'];\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/<\/p>\n<p>  \/* lista ordinata delle aule \u2014 usata per assegnare il colore *\/\n  var AULE = [\n    'Aula 1','Aula 4','Aula 5','Aula 6','A. Docenti',\n    'Aula 9','Aula 10','Aula MIRI','Aula 12','Aula 13',\n    'Aula 14','Aula 15','Aula 16','Aula 17','Aula 18',\n    'Aula 19','Aula 20','Aula 21','Aula 22','Aula 23'\n  ];\n  var PALETTE = ['cfp--c1','cfp--c2','cfp--c3','cfp--c4'];<\/p>\n<p>  var pren   = [];\n  var year   = new Date().getFullYear();\n  var mon    = new Date().getMonth();\n  var selId  = null;\n  var editId = null;   \/* id prenotazione in modifica, null = nuova *\/<\/p>\n<p>  var MESI = ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',\n              'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];<\/p>\n<p>  \/* \u2500\u2500 helpers \u2500\u2500 *\/\n  function toStr(d) {\n    var y = d.getFullYear();\n    var m = String(d.getMonth() + 1).padStart(2,'0');\n    var g = String(d.getDate()).padStart(2,'0');\n    return y+'-'+m+'-'+g;\n  }\n  function fmtIT(s) { if(!s)return''; var p=s.split('-'); return p[2]+'\/'+p[1]+'\/'+p[0]; }\n  function esc(s)   { return String(s||'').replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\"\/g,'&quot;'); }<\/p>\n<p>  function aulaClass(p) {\n    var idx = AULE.indexOf(p.aula);\n    return PALETTE[((idx >= 0 ? idx : 0)) % 4];\n  }<\/p>\n<p>  \/* \u2500\u2500 API \u2500\u2500 *\/\n  function cfpFetch(path, opts) {\n    var headers = {'Content-Type':'application\/json'};\n    if (CFP_TOKEN) headers['X-CFP-Token'] = CFP_TOKEN;\n    return fetch(CFP_API + path, Object.assign({ headers: headers }, opts || {}));\n  }<\/p>\n<p>  function cfpLoadAll() {\n    showLoader('cal', true); hideErr('cal');\n    return cfpFetch('\/prenotazioni')\n      .then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); })\n      .then(function(data){ pren = Array.isArray(data) ? data : []; cfpRenderCal(); cfpRenderLista(); })\n      .catch(function(e){ showErr('cal','\u26a0\ufe0f Impossibile caricare le prenotazioni. Controlla che il plugin sia attivo.<br \/><small>'+esc(e.message)+'<\/small>'); })\n      .finally(function(){ showLoader('cal', false); });\n  }<\/p>\n<p>  \/* \u2500\u2500 toast \u2500\u2500 *\/\n  function toast(msg, err) {\n    var t = document.getElementById('cfpToast');\n    t.innerHTML = msg;\n    t.className = 'cfp__toast cfp--show'+(err?' cfp--error':'');\n    clearTimeout(t._tid);\n    t._tid = setTimeout(function(){ t.className='cfp__toast'; }, 3000);\n  }<\/p>\n<p>  \/* \u2500\u2500 loader \/ errori \u2500\u2500 *\/\n  function showLoader(scope, on) {\n    var el = scope==='lista' ? document.getElementById('cfpListaLoader') : document.getElementById('cfpCalLoader');\n    if(el) el.className = 'cfp__loading-overlay'+(on?' cfp--show':'');\n  }\n  function showErr(scope, msg) {\n    var ids = {cal:'cfpCalErr', lista:'cfpListaErr', form:'cfpFormErr'};\n    var el  = document.getElementById(ids[scope]||'cfpCalErr');\n    if(el){ el.innerHTML=msg; el.className='cfp__api-error cfp--show'; }\n  }\n  function hideErr(scope) {\n    var ids = {cal:'cfpCalErr', lista:'cfpListaErr', form:'cfpFormErr'};\n    var el  = document.getElementById(ids[scope]||'cfpCalErr');\n    if(el){ el.innerHTML=''; el.className='cfp__api-error'; }\n  }<\/p>\n<p>  \/* \u2500\u2500 viste \u2500\u2500 *\/\n  window.cfpShowView = function(v) {\n    var cal=document.getElementById('cfpCalView'), lista=document.getElementById('cfpListaView');\n    var bC=document.getElementById('cfpBtnCal'),   bL=document.getElementById('cfpBtnLista');\n    if(v==='cal'){\n      cal.style.display='block'; lista.style.display='none';\n      bC.classList.add('cfp--active'); bL.classList.remove('cfp--active');\n    } else {\n      cal.style.display='none'; lista.style.display='block';\n      bC.classList.remove('cfp--active'); bL.classList.add('cfp--active');\n      cfpRenderLista();\n    }\n  };<\/p>\n<p>  \/* \u2500\u2500 SUBMIT (nuova o modifica) \u2500\u2500 *\/\n  window.cfpSubmit = function(e) {\n    e.preventDefault(); hideErr('form');\n    var ini = document.getElementById('cfpInizio').value;\n    var fin = document.getElementById('cfpFine').value;\n    if(fin <= ini){ showErr('form','\u26a0\ufe0f L\\'ora di fine deve essere successiva all\\'inizio.'); return; }\n\n    var body = {\n      nome: document.getElementById('cfpNome').value.trim(),\n      da:   document.getElementById('cfpDa').value.trim(),\n      data: document.getElementById('cfpData').value,\n      aula: document.getElementById('cfpAula').value,\n      ini:  ini, fin: fin,\n      lab:  '',\n      note: document.getElementById('cfpNote').value.trim(),\n      ledwall: document.getElementById('cfpLedwall').checked,\n      classe: document.getElementById('cfpClasse').value,\n      gruppo: document.getElementById('cfpClasse').value.indexOf('\/') >= 0 ? document.getElementById('cfpGruppo').value : '',\n      schermo: document.getElementById('cfpSchermo').value.trim()\n    };<\/p>\n<p>    var btn = document.getElementById('cfpBtnSubmit');\n    btn.disabled = true;\n    btn.innerHTML = '<span class=\"cfp__spinner\"><\/span> Salvataggio\u2026';<\/p>\n<p>    var isEdit   = editId !== null;\n    var path     = isEdit ? '\/prenotazioni\/'+editId : '\/prenotazioni';\n    var method   = isEdit ? 'PUT' : 'POST';<\/p>\n<p>    cfpFetch(path, { method: method, body: JSON.stringify(body) })\n      .then(function(r){\n        if(!r.ok) return r.json().then(function(j){ throw new Error(j.message||'HTTP '+r.status); });\n        return r.json();\n      })\n      .then(function(p){\n        if(isEdit){\n          pren = pren.map(function(x){ return x.id==p.id ? p : x; });\n          toast('\u2705 Modifica salvata: '+esc(p.nome));\n        } else {\n          pren.push(p);\n          toast('\u2705 Prenotato: '+esc(p.nome)+' \u2013 '+fmtIT(p.data));\n        }\n        cfpResetForm();\n        cfpRenderCal(); cfpRenderLista();\n      })\n      .catch(function(err){ showErr('form','\u26a0\ufe0f Errore: '+esc(err.message)); })\n      .finally(function(){\n        btn.disabled = false;\n        btn.innerHTML = editId !== null ? '\ud83d\udcbe Salva modifiche' : '\u2705 Conferma prenotazione';\n      });\n  };<\/p>\n<p>  \/* \u2500\u2500 EDIT: avvio e reset \u2500\u2500 *\/\n  window.cfpStartEdit = function(id) {\n    var p = pren.filter(function(x){ return x.id==id; })[0];\n    if(!p) return;\n    cfpCloseModal();\n    editId = id;<\/p>\n<p>    document.getElementById('cfpNome').value   = p.nome  || '';\n    document.getElementById('cfpDa').value     = p.da    || '';\n    document.getElementById('cfpData').value   = p.data  || '';\n    document.getElementById('cfpAula').value   = p.aula  || '';\n    document.getElementById('cfpInizio').value = p.ini   || '';\n    document.getElementById('cfpFine').value   = p.fin   || '';\n    document.getElementById('cfpNote').value   = p.note  || '';\n    document.getElementById('cfpLedwall').checked = p.ledwall !== false;\n    document.getElementById('cfpSchermo').value   = p.schermo || '';\n    cfpEnsureClasse(p.classe || '');\n    document.getElementById('cfpClasse').value    = p.classe || '';\n    document.getElementById('cfpGruppo').value    = p.gruppo || '';\n    cfpToggleGruppo();<\/p>\n<p>    document.getElementById('cfpEditBanner').classList.add('cfp--show');\n    document.getElementById('cfpFormTitle').textContent = '\u270f\ufe0f Modifica prenotazione';\n    var btn = document.getElementById('cfpBtnSubmit');\n    btn.textContent = '\ud83d\udcbe Salva modifiche';\n    btn.classList.add('cfp--edit-mode');<\/p>\n<p>    \/* scrolla al form su mobile *\/\n    document.getElementById('cfpForm').scrollIntoView({ behavior:'smooth', block:'start' });\n  };<\/p>\n<p>  function cfpResetForm() {\n    editId = null;\n    document.getElementById('cfpForm').reset();\n    document.getElementById('cfpData').value = toStr(new Date());\n    document.getElementById('cfpLedwall').checked = true;\n    cfpToggleGruppo();\n    document.getElementById('cfpEditBanner').classList.remove('cfp--show');\n    document.getElementById('cfpFormTitle').textContent = '\u270f\ufe0f Nuova prenotazione';\n    var btn = document.getElementById('cfpBtnSubmit');\n    btn.textContent = '\u2705 Conferma prenotazione';\n    btn.classList.remove('cfp--edit-mode');\n    hideErr('form');\n  }<\/p>\n<p>  window.cfpCancelEdit = function() { cfpResetForm(); };<\/p>\n<p>  \/* \u2500\u2500 CALENDARIO \u2500\u2500 *\/\n  window.cfpChangeMonth = function(d) {\n    mon += d;\n    if(mon>11){mon=0;year++;} if(mon<0){mon=11;year--;}\n    cfpRenderCal();\n  };\n  window.cfpGoToday = function() {\n    var n=new Date(); year=n.getFullYear(); mon=n.getMonth(); cfpRenderCal();\n  };\n\n  function cfpRenderCal() {\n    document.getElementById('cfpCalTitle').textContent = MESI[mon]+' '+year;\n    var grid = document.getElementById('cfpGrid');\n    grid.innerHTML = '';\n    var todayStr = toStr(new Date());\n    var byDate = {};\n    pren.forEach(function(p){ byDate[p.data]=byDate[p.data]||[]; byDate[p.data].push(p); });\n\n    var first=new Date(year,mon,1), dow=(first.getDay()+6)%7;\n    var dim=new Date(year,mon+1,0).getDate(), prevDim=new Date(year,mon,0).getDate();\n    var total=Math.ceil((dow+dim)\/7)*7;\n\n    for(var i=0;i<total;i++){\n      var cell=document.createElement('div'); cell.className='cfp__cell';\n      var day, ds, other=false;\n      if(i<dow)          { day=prevDim-dow+i+1; ds=toStr(new Date(year,mon-1,day)); other=true; }\n      else if(i>=dow+dim){ day=i-dow-dim+1;     ds=toStr(new Date(year,mon+1,day)); other=true; }\n      else               { day=i-dow+1;          ds=toStr(new Date(year,mon,day)); }<\/p>\n<p>      if(other) cell.classList.add('cfp--other');\n      if(ds===todayStr) cell.classList.add('cfp--today');<\/p>\n<p>      var dn=document.createElement('div'); dn.className='cfp__daynum';\n      dn.textContent=day; cell.appendChild(dn);<\/p>\n<p>      var evs=byDate[ds]||[];\n      var MAX_EV = 10;\n      evs.slice(0,MAX_EV).forEach(function(p){\n        var isPast = p.data < todayStr;\n        var ev=document.createElement('div');\n        ev.className='cfp__ev '+(isPast ? 'cfp--past' : aulaClass(p));\n        ev.title = p.ini+'\u2013'+p.fin+' | '+p.aula+' | '+p.da+(p.note?' | '+p.note:'')+(isPast?' (passato)':'');\n        ev.textContent = p.ini+' ['+p.aula+'] '+p.nome;\n        if(!isPast) ev.onclick=(function(id){ return function(e){ e.stopPropagation(); cfpOpenModal(id); }; })(p.id);\n        cell.appendChild(ev);\n      });\n      if(evs.length>MAX_EV){\n        var more=document.createElement('div'); more.className='cfp__ev-more';\n        more.textContent='+'+(evs.length-MAX_EV)+' altri';\n        more.onclick=(function(d){ return function(){ cfpShowView('lista'); document.getElementById('cfpFiltroData').value=d; cfpRenderLista(); }; })(ds);\n        cell.appendChild(more);\n      }\n      grid.appendChild(cell);\n    }\n  }<\/p>\n<p>  \/* \u2500\u2500 LISTA \u2500\u2500 *\/\n  function cfpRenderLista() {\n    var fd=document.getElementById('cfpFiltroData').value;\n    var fa=document.getElementById('cfpFiltroAula').value;\n    var arr=pren.slice().sort(function(a,b){\n      return a.data!==b.data ? a.data.localeCompare(b.data) : a.ini.localeCompare(b.ini);\n    });\n    if(fd) arr=arr.filter(function(p){ return p.data===fd; });\n    if(fa) arr=arr.filter(function(p){ return p.aula===fa; });\n    var c=document.getElementById('cfpListaCont');\n    if(!arr.length){ c.innerHTML='<\/p>\n<div class=\"cfp__empty\">\ud83d\udced<br \/>Nessuna prenotazione trovata.<\/div>\n<p>'; return; }\n    var h='<\/p>\n<table class=\"cfp__table\">\n<thead>\n<tr>'\n      +'<\/p>\n<th>Data<\/th>\n<th>Attivit\u00e0<\/th>\n<th>Aula<\/th>\n<th>Orario<\/th>\n<th>Da<\/th>\n<th><\/th>\n<p>'\n      +'<\/tr>\n<\/thead>\n<tbody>';\n    var todayStr = toStr(new Date());\n    arr.forEach(function(p){\n      var cl=aulaClass(p);\n      var isPast = p.data < todayStr;\n      h+='\n\n<tr>'\n        +'<\/p>\n<td>'+fmtIT(p.data)+'<\/td>\n<p>'\n        +'<\/p>\n<td><strong>'+esc(p.nome)+'<\/strong>'+(p.ledwall===false?'<span class=\"cfp__nolw\">non sul ledwall<\/span>':'')+(p.classe?'<br \/><small style=\"color:#2563a8\">'+esc(p.classe)+(p.gruppo?' \u2013 gruppo '+esc(p.gruppo):'')+'<\/small>':'')+(p.note?'<br \/><small style=\"color:#5a6b7c\">'+esc(p.note)+'<\/small>':'')+'<\/td>\n<p>'\n        +'<\/p>\n<td><span class=\"cfp__badge '+(isPast?'':''+cl)+'\" style=\"'+(isPast?'background:#9ca3af':'')+'\">'+esc(p.aula)+'<\/span><\/td>\n<p>'\n        +'<\/p>\n<td style=\"'+(isPast?'color:#9ca3af':'')+'\">'+esc(p.ini)+' \u2013 '+esc(p.fin)+'<\/td>\n<p>'\n        +'<\/p>\n<td style=\"'+(isPast?'color:#9ca3af':'')+'\">'+esc(p.da)+'<\/td>\n<p>'\n        +'<\/p>\n<td style=\"white-space:nowrap\">'\n          +(isPast\n            ? '<span style=\"font-size:.72rem;color:#9ca3af;font-style:italic\">archiviato<\/span>'\n            : '<button class=\"cfp__btn-edit\" onclick=\"cfpStartEdit(\\''+p.id+'\\')\" title=\"Modifica\">\u270f\ufe0f<\/button>'\n              +'<button class=\"cfp__btn-del\"  onclick=\"cfpDelById(\\''+p.id+'\\')\"  title=\"Elimina\">\ud83d\uddd1<\/button>'\n          )\n        +'<\/td>\n<p>'\n        +'<\/tr>\n<p>';\n    });\n    h+='<\/tbody>\n<\/table>\n<p>';\n    c.innerHTML=h;\n  }\n  window.cfpRenderLista = cfpRenderLista;<\/p>\n<p>  \/* \u2500\u2500 MODAL \u2500\u2500 *\/\n  function cfpOpenModal(id) {\n    var p=pren.filter(function(x){ return x.id==id; })[0];\n    if(!p) return;\n    selId=id;\n    var isPast = p.data < toStr(new Date());\n    document.getElementById('cfpModalTitle').textContent = p.nome;\n    document.getElementById('cfpModalSub').textContent   = fmtIT(p.data)+' \u2014 '+p.aula+(isPast?' (passato)':'');\n    document.getElementById('cfpModalDet').innerHTML =\n      '\n\n<div class=\"cfp__det-row\"><span class=\"cfp__det-label\">Orario<\/span><span>'+esc(p.ini)+' \u2013 '+esc(p.fin)+'<\/span><\/div>\n<p>'+\n      '<\/p>\n<div class=\"cfp__det-row\"><span class=\"cfp__det-label\">Aula<\/span><span>'+esc(p.aula)+'<\/span><\/div>\n<p>'+\n      '<\/p>\n<div class=\"cfp__det-row\"><span class=\"cfp__det-label\">Prenotato da<\/span><span>'+esc(p.da)+'<\/span><\/div>\n<p>'+\n      (p.note?'<\/p>\n<div class=\"cfp__det-row\"><span class=\"cfp__det-label\">Note<\/span><span>'+esc(p.note)+'<\/span><\/div>\n<p>':'')+\n      (p.classe?'<\/p>\n<div class=\"cfp__det-row\"><span class=\"cfp__det-label\">Classe<\/span><span>'+esc(p.classe)+(p.gruppo?' \u2013 gruppo '+esc(p.gruppo):'')+'<\/span><\/div>\n<p>':'')+\n      '<\/p>\n<div class=\"cfp__det-row\"><span class=\"cfp__det-label\">Ledwall<\/span><span>'+(p.ledwall===false?'non mostrata':'mostrata'+(p.schermo?' come \u201c'+esc(p.schermo)+'\u201d':''))+'<\/span><\/div>\n<p>';\n    \/* nasconde le azioni per le prenotazioni gi\u00e0 passate *\/\n    document.getElementById('cfpBtnDel').style.display  = isPast ? 'none' : '';\n    document.getElementById('cfpBtnEdit').style.display = isPast ? 'none' : '';\n    document.getElementById('cfpOverlay').classList.add('cfp--open');\n  }<\/p>\n<p>  function cfpCloseModal() {\n    document.getElementById('cfpOverlay').classList.remove('cfp--open');\n    selId=null;\n  }<\/p>\n<p>  \/* \u2500\u2500 ELIMINA \u2500\u2500 *\/\n  window.cfpDelById = function(id) {\n    if(!confirm('Eliminare questa prenotazione?')) return;\n    cfpFetch('\/prenotazioni\/'+id, {method:'DELETE'})\n      .then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); })\n      .then(function(){\n        pren=pren.filter(function(p){ return p.id!=id; });\n        toast('\ud83d\uddd1 Prenotazione eliminata');\n        cfpRenderCal(); cfpRenderLista();\n      })\n      .catch(function(e){ toast('\u26a0\ufe0f Eliminazione fallita: '+e.message, true); });\n  };<\/p>\n<p>  \/* \u2500\u2500 EVENT LISTENERS \u2500\u2500 *\/\n  document.getElementById('cfpBtnDel').onclick   = function(){ if(selId){ cfpDelById(selId); cfpCloseModal(); } };\n  document.getElementById('cfpBtnEdit').onclick  = function(){ if(selId){ cfpStartEdit(selId); } };\n  document.getElementById('cfpBtnClose').onclick = cfpCloseModal;\n  document.getElementById('cfpOverlay').onclick  = function(e){ if(e.target===this) cfpCloseModal(); };<\/p>\n<p>  \/* \u2500\u2500 CLASSI (dal foglio del ledwall, con elenco di riserva) \u2500\u2500 *\/\n  function cfpFillClassi(list) {\n    var sel = document.getElementById('cfpClasse'), cur = sel.value, i, o;\n    while (sel.options.length > 1) sel.remove(1);\n    for (i = 0; i < list.length; i++) {\n      if (list[i] === 'Colloqui in presenza') continue;\n      o = document.createElement('option'); o.value = list[i]; o.textContent = list[i]; sel.appendChild(o);\n    }\n    sel.value = cur;\n  }\n  function cfpEnsureClasse(name) {\n    var sel = document.getElementById('cfpClasse'), i;\n    if (!name) return;\n    for (i = 0; i < sel.options.length; i++) if (sel.options[i].value === name) return;\n    var o = document.createElement('option'); o.value = name; o.textContent = name; sel.appendChild(o);\n  }\n  window.cfpToggleGruppo = function() {\n    var v = document.getElementById('cfpClasse').value;\n    document.getElementById('cfpGruppoBox').style.display = v.indexOf('\/') >= 0 ? '' : 'none';\n    if (v.indexOf('\/') < 0) document.getElementById('cfpGruppo').value = '';\n  };\n  cfpFillClassi(CFP_CLASSI);\n  fetch(CFP_LEDWALL)\n    .then(function(r){ return r.json(); })\n    .then(function(d){\n      \/* i corsi del foglio, esclusi i nomi delle prenotazioni one-shot aggiunte in coda dallo script *\/\n      var oneShot = (d.blocchi || []).filter(function(b){ return b.prenotazione; })\n                                     .map(function(b){ return b.corso; });\n      var names = (d.corsi || []).map(function(c){ return c.corso; })\n                                 .filter(function(n){ return oneShot.indexOf(n) < 0; });\n      if (names.length) cfpFillClassi(names);\n    })\n    .catch(function(){ \/* resta l'elenco di riserva *\/ });\n\n  \/* \u2500\u2500 INIT \u2500\u2500 *\/\n  document.getElementById('cfpData').value = toStr(new Date());\n  cfpLoadAll();\n\n})();\n<\/script><\/p>\n<\/div>\n<p><!--more--><br \/>\n<!-- {\"type\":\"layout\",\"children\":[{\"type\":\"section\",\"props\":{\"image_position\":\"center-center\",\"style\":\"default\",\"title_breakpoint\":\"xl\",\"title_position\":\"top-left\",\"title_rotation\":\"left\",\"vertical_align\":\"middle\",\"width\":\"default\"},\"children\":[{\"type\":\"row\",\"children\":[{\"type\":\"column\",\"props\":{\"image_position\":\"center-center\",\"position_sticky_breakpoint\":\"m\"},\"children\":[{\"type\":\"html\",\"props\":{\"content\":\"<!-- ================================================================\\n     COVERFOP \u2013 Widget Prenotazione Aule  (v5 \u2013 classe e gruppo, richiede plugin 1.4.0)\\n     Versione: embeddabile in YOOtheme \/ WordPress (Custom HTML)\\n\\n     \u2500\u2500 CONFIGURAZIONE RAPIDA \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n     CFP_API   \u2192  URL base del sito WordPress\\n     CFP_TOKEN \u2192  token segreto (deve corrispondere al plugin)\\n     \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\\n================================================================ -->\\n\\n<\/p>\n<div class=\\\"cfp__root\\\" id=\\\"cfpApp\\\">\\n\\n<\/p>\n<style>\\n.cfp__root *, .cfp__root *::before, .cfp__root *::after {\\n  box-sizing: border-box; margin: 0; padding: 0;\\n}\\n.cfp__root {\\n  --cfp-blu:    #1a3a5c;\\n  --cfp-blu-m:  #2563a8;\\n  --cfp-blu-l:  #e8f0fb;\\n  --cfp-acc:    #e85d26;\\n  --cfp-grigio: #f4f6f9;\\n  --cfp-bordo:  #d0d8e4;\\n  --cfp-testo:  #1e2a35;\\n  --cfp-soft:   #5a6b7c;\\n  --cfp-bianco: #ffffff;\\n  \/* palette colori eventi calendario (4 colori a rotazione) *\/\\n  --cfp-c1: #2563a8;\\n  --cfp-c2: #16a34a;\\n  --cfp-c3: #7c3aed;\\n  --cfp-c4: #b45309;\\n  font-family: 'Segoe UI', system-ui, sans-serif;\\n  color: var(--cfp-testo);\\n}\\n\\n\/* \u2500\u2500 TOPBAR \u2500\u2500 *\/\\n.cfp__topbar {\\n  background: var(--cfp-blu); color: #fff;\\n  padding: .75rem 1.5rem;\\n  display: flex; align-items: center; justify-content: space-between;\\n  flex-wrap: wrap; gap: .5rem;\\n  border-radius: 10px 10px 0 0;\\n}\\n.cfp__topbar-logo { font-size: 1.05rem; font-weight: 700; letter-spacing: .04em; }\\n.cfp__topbar-logo span { color: var(--cfp-acc); }\\n.cfp__topbar-nav { display: flex; gap: .4rem; }\\n.cfp__topbar-nav button {\\n  background: transparent; border: 1.5px solid rgba(255,255,255,.35);\\n  color: #fff; padding: .35rem .9rem; border-radius: 6px;\\n  cursor: pointer; font-size: .82rem; font-weight: 600;\\n  transition: background .15s; font-family: inherit;\\n}\\n.cfp__topbar-nav button:hover,\\n.cfp__topbar-nav button.cfp--active {\\n  background: rgba(255,255,255,.15); border-color: rgba(255,255,255,.7);\\n}\\n\\n\/* \u2500\u2500 LAYOUT \u2500\u2500 *\/\\n.cfp__layout {\\n  display: grid; grid-template-columns: 360px 1fr;\\n  gap: 1.2rem; padding: 1.2rem;\\n  background: var(--cfp-grigio); border-radius: 0 0 10px 10px;\\n  align-items: start;\\n}\\n@media (max-width: 860px) { .cfp__layout { grid-template-columns: 1fr; } }\\n\\n\/* \u2500\u2500 CARD \u2500\u2500 *\/\\n.cfp__card {\\n  background: var(--cfp-bianco); border-radius: 10px;\\n  box-shadow: 0 2px 12px rgba(0,0,0,.07); padding: 1.4rem;\\n}\\n.cfp__card-title {\\n  font-size: 1rem; font-weight: 700; color: var(--cfp-blu);\\n  margin-bottom: 1rem; padding-bottom: .6rem;\\n  border-bottom: 2px solid var(--cfp-blu-l);\\n  display: flex; align-items: center; gap: .4rem;\\n}\\n\\n\/* \u2500\u2500 FORM \u2500\u2500 *\/\\n.cfp__form { display: flex; flex-direction: column; gap: .9rem; }\\n.cfp__row  { display: flex; gap: .7rem; }\\n.cfp__row .cfp__field { flex: 1; }\\n.cfp__field { display: flex; flex-direction: column; gap: .3rem; }\\n.cfp__field label {\\n  font-size: .73rem; font-weight: 700; color: var(--cfp-soft);\\n  text-transform: uppercase; letter-spacing: .05em;\\n}\\n.cfp__field input,\\n.cfp__field select,\\n.cfp__field textarea {\\n  border: 1.5px solid var(--cfp-bordo) !important;\\n  border-radius: 7px !important; padding: .5rem .7rem !important;\\n  font-size: .9rem !important; color: var(--cfp-testo) !important;\\n  background: var(--cfp-bianco) !important;\\n  transition: border-color .15s, box-shadow .15s;\\n  width: 100% !important; font-family: inherit !important;\\n  outline: none !important; box-shadow: none !important;\\n}\\n.cfp__field input:focus,\\n.cfp__field select:focus,\\n.cfp__field textarea:focus {\\n  border-color: var(--cfp-blu-m) !important;\\n  box-shadow: 0 0 0 3px rgba(37,99,168,.12) !important;\\n}\\n.cfp__field textarea { resize: vertical; min-height: 64px; }\\n.cfp__ledwall { background: var(--cfp-blu-l); border-radius: 7px; padding: .6rem .7rem; }\\n.cfp__ledwall .cfp__check { display: flex; align-items: center; gap: .45rem; font-size: .8rem; color: var(--cfp-blu); cursor: pointer; text-transform: none; letter-spacing: 0; }\\n.cfp__ledwall .cfp__check input { width: auto !important; margin: 0; }\\n.cfp__ledwall small { font-size: .7rem; color: var(--cfp-soft); }\\n.cfp__nolw { display: inline-block; font-size: .62rem; font-weight: 700; color: #92400e; background: #fffbeb; border: 1px solid #fcd34d; border-radius: 4px; padding: 0 .3rem; margin-left: .3rem; }\\n\\n\/* banner edit mode *\/\\n.cfp__edit-banner {\\n  background: #fffbeb; border: 1.5px solid #fcd34d; border-radius: 7px;\\n  padding: .5rem .75rem; font-size: .82rem; color: #92400e;\\n  display: none; align-items: center; justify-content: space-between; gap: .5rem;\\n}\\n.cfp__edit-banner.cfp--show { display: flex; }\\n.cfp__edit-banner button {\\n  background: none; border: none; color: #92400e; cursor: pointer;\\n  font-size: .8rem; font-weight: 700; text-decoration: underline;\\n  font-family: inherit; padding: 0;\\n}\\n\\n.cfp__btn-submit {\\n  background: var(--cfp-blu); color: #fff; border: none;\\n  border-radius: 7px; padding: .7rem 1.2rem;\\n  font-size: .92rem; font-weight: 700; cursor: pointer;\\n  width: 100%; font-family: inherit; letter-spacing: .03em;\\n  transition: background .15s, opacity .15s; margin-top: .2rem;\\n}\\n.cfp__btn-submit:hover    { background: var(--cfp-blu-m); }\\n.cfp__btn-submit:disabled { opacity: .55; cursor: default; }\\n.cfp__btn-submit.cfp--edit-mode { background: #b45309; }\\n.cfp__btn-submit.cfp--edit-mode:hover { background: #92400e; }\\n\\n\/* \u2500\u2500 SPINNER \u2500\u2500 *\/\\n.cfp__spinner {\\n  display: inline-block; width: 14px; height: 14px;\\n  border: 2px solid rgba(255,255,255,.4);\\n  border-top-color: #fff; border-radius: 50%;\\n  animation: cfp-spin .7s linear infinite; vertical-align: middle;\\n}\\n@keyframes cfp-spin { to { transform: rotate(360deg); } }\\n\\n\/* \u2500\u2500 LOADER \u2500\u2500 *\/\\n.cfp__loading-overlay {\\n  display: none; text-align: center;\\n  padding: 2rem; color: var(--cfp-soft); font-size: .88rem;\\n}\\n.cfp__loading-overlay.cfp--show { display: block; }\\n\\n\/* \u2500\u2500 CALENDARIO \u2500\u2500 *\/\\n.cfp__cal-header { display: flex; align-items: center; justify-content: space-between; margin-bottom: .8rem; }\\n.cfp__cal-title  { font-size: 1rem; font-weight: 700; color: var(--cfp-blu); text-transform: capitalize; }\\n.cfp__cal-nav { display: flex; gap: .3rem; }\\n.cfp__cal-nav button {\\n  background: var(--cfp-grigio); border: 1.5px solid var(--cfp-bordo);\\n  color: var(--cfp-blu); width: 30px; height: 30px; border-radius: 6px;\\n  cursor: pointer; font-size: .95rem;\\n  display: flex; align-items: center; justify-content: center;\\n  transition: background .12s; font-family: inherit;\\n}\\n.cfp__cal-nav button:hover { background: var(--cfp-blu-l); }\\n.cfp__cal-nav button.cfp__btn-oggi { width: auto; padding: 0 .65rem; font-size: .74rem; font-weight: 700; }\\n\\n.cfp__weekdays { display: grid; grid-template-columns: repeat(7,1fr); text-align: center; margin-bottom: .25rem; }\\n.cfp__weekdays span { font-size: .68rem; font-weight: 700; color: var(--cfp-soft); text-transform: uppercase; padding: .25rem 0; }\\n\\n.cfp__cal-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 3px; }\\n.cfp__cell {\\n  min-height: 90px; height: auto; max-height: 220px;\\n  overflow-y: auto; overflow-x: hidden;\\n  background: var(--cfp-grigio); border-radius: 5px;\\n  padding: 3px; border: 1.5px solid transparent;\\n  transition: border-color .12s;\\n  display: flex; flex-direction: column;\\n}\\n.cfp__cell:hover    { border-color: var(--cfp-bordo); }\\n.cfp__cell.cfp--other { opacity: .3; }\\n.cfp__cell.cfp--today { background: var(--cfp-blu-l); border-color: var(--cfp-blu-m); }\\n.cfp__daynum { font-size: .74rem; font-weight: 700; color: var(--cfp-soft); margin-bottom: 2px; flex-shrink: 0; }\\n.cfp__cell.cfp--today .cfp__daynum { color: var(--cfp-blu); }\\n\\n.cfp__ev {\\n  font-size: .62rem; font-weight: 600; border-radius: 3px;\\n  padding: 2px 4px; margin-bottom: 2px; color: #fff;\\n  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;\\n  cursor: pointer; line-height: 1.35; max-width: 100%; flex-shrink: 0;\\n}\\n.cfp__ev.cfp--c1 { background: var(--cfp-c1); }\\n.cfp__ev.cfp--c2 { background: var(--cfp-c2); }\\n.cfp__ev.cfp--c3 { background: var(--cfp-c3); }\\n.cfp__ev.cfp--c4 { background: var(--cfp-c4); }\\n.cfp__ev:hover { filter: brightness(1.15); }\\n\/* eventi nel passato: grigi e non cliccabili *\/\\n.cfp__ev.cfp--past { background: #9ca3af !important; cursor: default; opacity: .8; }\\n.cfp__ev.cfp--past:hover { filter: none; }\\n.cfp__ev-more { font-size: .6rem; color: var(--cfp-soft); cursor: pointer; padding: 1px 2px; }\\n.cfp__ev-more:hover { text-decoration: underline; }\\n\\n\/* \u2500\u2500 LISTA \u2500\u2500 *\/\\n.cfp__lista-filters { display: flex; align-items: center; gap: .5rem; flex-wrap: wrap; margin-bottom: .8rem; }\\n.cfp__lista-filters input,\\n.cfp__lista-filters select {\\n  border: 1.5px solid var(--cfp-bordo) !important; border-radius: 6px !important;\\n  padding: .35rem .6rem !important; font-size: .8rem !important;\\n  color: var(--cfp-testo) !important; background: var(--cfp-bianco) !important;\\n  font-family: inherit !important;\\n}\\n.cfp__table { width: 100%; border-collapse: collapse; font-size: .82rem; }\\n.cfp__table th { background: var(--cfp-blu-l); color: var(--cfp-blu); font-weight: 700; text-align: left; padding: .5rem .65rem; font-size: .72rem; text-transform: uppercase; letter-spacing: .04em; }\\n.cfp__table td { padding: .55rem .65rem; border-bottom: 1px solid var(--cfp-bordo); vertical-align: middle; }\\n.cfp__table tr:hover td { background: var(--cfp-grigio); }\\n.cfp__badge { display: inline-block; padding: .15rem .5rem; border-radius: 12px; font-size: .7rem; font-weight: 700; color: #fff; }\\n.cfp__badge.cfp--c1 { background: var(--cfp-c1); }\\n.cfp__badge.cfp--c2 { background: var(--cfp-c2); }\\n.cfp__badge.cfp--c3 { background: var(--cfp-c3); }\\n.cfp__badge.cfp--c4 { background: var(--cfp-c4); }\\n.cfp__btn-del {\\n  background: none; border: none; color: #dc2626;\\n  cursor: pointer; font-size: .9rem; padding: 2px 5px;\\n  border-radius: 4px; font-family: inherit;\\n}\\n.cfp__btn-del:hover { background: #fef2f2; }\\n.cfp__btn-edit {\\n  background: none; border: none; color: var(--cfp-blu-m);\\n  cursor: pointer; font-size: .9rem; padding: 2px 5px;\\n  border-radius: 4px; font-family: inherit;\\n}\\n.cfp__btn-edit:hover { background: var(--cfp-blu-l); }\\n.cfp__empty { text-align: center; padding: 2rem 1rem; color: var(--cfp-soft); font-size: .88rem; }\\n\\n\/* \u2500\u2500 MODAL \u2500\u2500 *\/\\n.cfp__overlay {\\n  position: fixed; inset: 0; background: rgba(0,0,0,.45);\\n  display: flex; align-items: center; justify-content: center;\\n  z-index: 99999; opacity: 0; pointer-events: none; transition: opacity .2s;\\n}\\n.cfp__overlay.cfp--open { opacity: 1; pointer-events: auto; }\\n.cfp__modal {\\n  background: #fff; border-radius: 12px; padding: 1.6rem;\\n  min-width: 300px; max-width: 420px; width: 90%;\\n  box-shadow: 0 8px 40px rgba(0,0,0,.18);\\n  transform: translateY(16px); transition: transform .2s;\\n}\\n.cfp__overlay.cfp--open .cfp__modal { transform: translateY(0); }\\n.cfp__modal h3 { font-size: 1rem; font-weight: 700; color: var(--cfp-blu); margin-bottom: .15rem; }\\n.cfp__modal-sub { font-size: .8rem; color: var(--cfp-soft); margin-bottom: .9rem; }\\n.cfp__modal-details { display: flex; flex-direction: column; gap: .45rem; }\\n.cfp__det-row { display: flex; gap: .5rem; font-size: .86rem; align-items: flex-start; }\\n.cfp__det-label { font-weight: 700; color: var(--cfp-soft); min-width: 80px; flex-shrink: 0; }\\n.cfp__modal-actions { display: flex; justify-content: flex-end; gap: .5rem; margin-top: 1.1rem; flex-wrap: wrap; }\\n.cfp__btn-modal-close {\\n  background: var(--cfp-grigio); border: 1.5px solid var(--cfp-bordo);\\n  color: var(--cfp-testo); padding: .45rem 1rem; border-radius: 6px;\\n  cursor: pointer; font-size: .85rem; font-weight: 600; font-family: inherit;\\n}\\n.cfp__btn-modal-edit {\\n  background: var(--cfp-blu-l); border: 1.5px solid var(--cfp-blu-m);\\n  color: var(--cfp-blu); padding: .45rem 1rem; border-radius: 6px;\\n  cursor: pointer; font-size: .85rem; font-weight: 600; font-family: inherit;\\n}\\n.cfp__btn-modal-edit:hover { background: #d0e3f7; }\\n.cfp__btn-modal-del {\\n  background: #fef2f2; border: 1.5px solid #fca5a5;\\n  color: #dc2626; padding: .45rem 1rem; border-radius: 6px;\\n  cursor: pointer; font-size: .85rem; font-weight: 600; font-family: inherit;\\n}\\n.cfp__btn-modal-del:hover { background: #fee2e2; }\\n\\n\/* \u2500\u2500 TOAST \u2500\u2500 *\/\\n.cfp__toast {\\n  position: fixed; bottom: 1.5rem; right: 1.5rem; background: #16a34a;\\n  color: #fff; padding: .7rem 1.2rem; border-radius: 8px;\\n  font-weight: 700; font-size: .85rem;\\n  box-shadow: 0 4px 16px rgba(0,0,0,.2);\\n  opacity: 0; transform: translateY(10px);\\n  transition: opacity .25s, transform .25s;\\n  pointer-events: none; z-index: 999999;\\n}\\n.cfp__toast.cfp--show  { opacity: 1; transform: translateY(0); }\\n.cfp__toast.cfp--error { background: #dc2626; }\\n\\n\/* \u2500\u2500 ERRORI API \u2500\u2500 *\/\\n.cfp__api-error {\\n  background: #fef2f2; border: 1.5px solid #fca5a5; color: #991b1b;\\n  border-radius: 8px; padding: .7rem 1rem; font-size: .83rem;\\n  margin-bottom: .8rem; display: none;\\n}\\n.cfp__api-error.cfp--show { display: block; }\\n<\/style>\n<p>\\n\\n<!-- TOPBAR -->\\n<\/p>\n<div class=\\\"cfp__topbar\\\">\\n  <\/p>\n<div class=\\\"cfp__topbar-logo\\\">COVER<span>FOP<\/span> &nbsp;|&nbsp; Prenotazione Aule<\/div>\n<p>\\n  <\/p>\n<nav class=\\\"cfp__topbar-nav\\\">\\n    <button id=\\\"cfpBtnCal\\\"   class=\\\"cfp--active\\\" onclick=\\\"cfpShowView('cal')\\\">\ud83d\udcc5 Calendario<\/button>\\n    <button id=\\\"cfpBtnLista\\\"                     onclick=\\\"cfpShowView('lista')\\\">\ud83d\udccb Lista<\/button>\\n  <\/nav>\n<p>\\n<\/p><\/div>\n<p>\\n\\n<\/p>\n<div class=\\\"cfp__layout\\\">\\n\\n  <!-- \u2500\u2500 FORM \u2500\u2500 -->\\n  <\/p>\n<div class=\\\"cfp__card\\\">\\n    <\/p>\n<div class=\\\"cfp__card-title\\\" id=\\\"cfpFormTitle\\\">\u270f\ufe0f Nuova prenotazione<\/div>\n<p>\\n\\n    <!-- banner edit mode -->\\n    <\/p>\n<div class=\\\"cfp__edit-banner\\\" id=\\\"cfpEditBanner\\\">\\n      <span>\u26a0\ufe0f Stai modificando una prenotazione esistente<\/span>\\n      <button onclick=\\\"cfpCancelEdit()\\\">Annulla<\/button>\\n    <\/div>\n<p>\\n\\n    <\/p>\n<div class=\\\"cfp__api-error\\\" id=\\\"cfpFormErr\\\"><\/div>\n<p>\\n\\n    <\/p>\n<form class=\\\"cfp__form\\\" id=\\\"cfpForm\\\" onsubmit=\\\"cfpSubmit(event)\\\">\\n      <\/p>\n<div class=\\\"cfp__field\\\">\\n        <label>Nome attivit\u00e0 \/ corso<\/label>\\n        <input type=\\\"text\\\" id=\\\"cfpNome\\\" placeholder=\\\"es. Corso sicurezza \u2013 modulo 1\\\" required \/>\\n      <\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__field\\\">\\n        <label>Prenotato da<\/label>\\n        <input type=\\\"text\\\" id=\\\"cfpDa\\\" placeholder=\\\"Nome e cognome\\\" required \/>\\n      <\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__row\\\">\\n        <\/p>\n<div class=\\\"cfp__field\\\">\\n          <label>Data<\/label>\\n          <input type=\\\"date\\\" id=\\\"cfpData\\\" required \/>\\n        <\/div>\n<p>\\n        <\/p>\n<div class=\\\"cfp__field\\\">\\n          <label>Aula<\/label>\\n          <select id=\\\"cfpAula\\\" required>\\n<option value=\\\"\\\">\u2014 seleziona \u2014<\/option>\\n<option value=\\\"Aula 1\\\">Aula 1<\/option>\\n<option value=\\\"Aula 4\\\">Aula 4<\/option>\\n<option value=\\\"Aula 5\\\">Aula 5<\/option>\\n<option value=\\\"Aula 6\\\">Aula 6<\/option>\\n<option value=\\\"A. Docenti\\\">A. Docenti<\/option>\\n<option value=\\\"Aula 9\\\">Aula 9<\/option>\\n<option value=\\\"Aula 10\\\">Aula 10<\/option>\\n<option value=\\\"Aula MIRI\\\">Aula MIRI<\/option>\\n<option value=\\\"Aula 12\\\">Aula 12<\/option>\\n<option value=\\\"Aula 13\\\">Aula 13<\/option>\\n<option value=\\\"Aula 14\\\">Aula 14<\/option>\\n<option value=\\\"Aula 15\\\">Aula 15<\/option>\\n<option value=\\\"Aula 16\\\">Aula 16<\/option>\\n<option value=\\\"Aula 17\\\">Aula 17<\/option>\\n<option value=\\\"Aula 18\\\">Aula 18<\/option>\\n<option value=\\\"Aula 19\\\">Aula 19<\/option>\\n<option value=\\\"Aula 20\\\">Aula 20<\/option>\\n<option value=\\\"Aula 21\\\">Aula 21<\/option>\\n<option value=\\\"Aula 22\\\">Aula 22<\/option>\\n<option value=\\\"Aula 23\\\">Aula 23<\/option>\\n          <\/select>\\n        <\/div>\n<p>\\n      <\/p><\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__row\\\">\\n        <\/p>\n<div class=\\\"cfp__field\\\">\\n          <label>Ora inizio<\/label>\\n          <input type=\\\"time\\\" id=\\\"cfpInizio\\\" required \/>\\n        <\/div>\n<p>\\n        <\/p>\n<div class=\\\"cfp__field\\\">\\n          <label>Ora fine<\/label>\\n          <input type=\\\"time\\\" id=\\\"cfpFine\\\" required \/>\\n        <\/div>\n<p>\\n      <\/p><\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__field\\\">\\n        <label>Note (opzionale)<\/label>\\n        <textarea id=\\\"cfpNote\\\" placeholder=\\\"Attrezzature, numero partecipanti\u2026\\\"><\/textarea>\\n      <\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__row\\\">\\n        <\/p>\n<div class=\\\"cfp__field\\\">\\n          <label>Classe (se \u00e8 per una classe)<\/label>\\n          <select id=\\\"cfpClasse\\\" onchange=\\\"cfpToggleGruppo()\\\">\\n<option value=\\\"\\\">\u2014 nessuna: corso one-shot \u2014<\/option>\\n          <\/select>\\n        <\/div>\n<p>\\n        <\/p>\n<div class=\\\"cfp__field\\\" id=\\\"cfpGruppoBox\\\" style=\\\"display:none\\\">\\n          <label>Gruppo<\/label>\\n          <select id=\\\"cfpGruppo\\\">\\n<option value=\\\"\\\">Tutta la classe<\/option>\\n<option value=\\\"A\\\">A \u2013 automazione<\/option>\\n<option value=\\\"I\\\">I \u2013 informatica<\/option>\\n          <\/select>\\n        <\/div>\n<p>\\n      <\/p><\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__field cfp__ledwall\\\">\\n        <label class=\\\"cfp__check\\\"><input type=\\\"checkbox\\\" id=\\\"cfpLedwall\\\" checked \/> Mostra sul ledwall<\/label>\\n        <input type=\\\"text\\\" id=\\\"cfpSchermo\\\" placeholder=\\\"Nome sul ledwall (facoltativo, es. Corso sicurezza \u2013 modulo 1)\\\" \/>\\n        <small>Togli la spunta per riunioni e attivit\u00e0 interne. Sullo schermo non compare mai chi ha prenotato.<\/small>\\n      <\/div>\n<p>\\n      <button type=\\\"submit\\\" class=\\\"cfp__btn-submit\\\" id=\\\"cfpBtnSubmit\\\">\u2705 Conferma prenotazione<\/button>\\n    <\/form>\n<p>\\n  <\/p><\/div>\n<p>\\n\\n  <!-- \u2500\u2500 COLONNA DESTRA \u2500\u2500 -->\\n  <\/p>\n<div>\\n    <!-- Vista Calendario -->\\n    <\/p>\n<div class=\\\"cfp__card\\\" id=\\\"cfpCalView\\\">\\n      <\/p>\n<div class=\\\"cfp__cal-header\\\">\\n        <\/p>\n<div class=\\\"cfp__cal-title\\\" id=\\\"cfpCalTitle\\\"><\/div>\n<p>\\n        <\/p>\n<div class=\\\"cfp__cal-nav\\\">\\n          <button onclick=\\\"cfpChangeMonth(-1)\\\">&#8592;<\/button>\\n          <button class=\\\"cfp__btn-oggi\\\" onclick=\\\"cfpGoToday()\\\">Oggi<\/button>\\n          <button onclick=\\\"cfpChangeMonth(1)\\\">&#8594;<\/button>\\n        <\/div>\n<p>\\n      <\/p><\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__weekdays\\\">\\n        <span>Lun<\/span><span>Mar<\/span><span>Mer<\/span>\\n        <span>Gio<\/span><span>Ven<\/span><span>Sab<\/span><span>Dom<\/span>\\n      <\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__loading-overlay\\\" id=\\\"cfpCalLoader\\\">\u23f3 Caricamento prenotazioni\u2026<\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__api-error\\\" id=\\\"cfpCalErr\\\"><\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__cal-grid\\\" id=\\\"cfpGrid\\\"><\/div>\n<p>\\n    <\/p><\/div>\n<p>\\n\\n    <!-- Vista Lista -->\\n    <\/p>\n<div class=\\\"cfp__card\\\" id=\\\"cfpListaView\\\" style=\\\"display:none;\\\">\\n      <\/p>\n<div class=\\\"cfp__card-title\\\" style=\\\"margin-bottom:.7rem;\\\">\ud83d\udccb Prenotazioni<\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__lista-filters\\\">\\n        <input type=\\\"date\\\" id=\\\"cfpFiltroData\\\" onchange=\\\"cfpRenderLista()\\\" title=\\\"Filtra per data\\\" \/>\\n        <select id=\\\"cfpFiltroAula\\\" onchange=\\\"cfpRenderLista()\\\">\\n<option value=\\\"\\\">Tutte le aule<\/option>\\n<option value=\\\"Aula 1\\\">Aula 1<\/option>\\n<option value=\\\"Aula 4\\\">Aula 4<\/option>\\n<option value=\\\"Aula 5\\\">Aula 5<\/option>\\n<option value=\\\"Aula 6\\\">Aula 6<\/option>\\n<option value=\\\"A. Docenti\\\">A. Docenti<\/option>\\n<option value=\\\"Aula 9\\\">Aula 9<\/option>\\n<option value=\\\"Aula 10\\\">Aula 10<\/option>\\n<option value=\\\"Aula MIRI\\\">Aula MIRI<\/option>\\n<option value=\\\"Aula 12\\\">Aula 12<\/option>\\n<option value=\\\"Aula 13\\\">Aula 13<\/option>\\n<option value=\\\"Aula 14\\\">Aula 14<\/option>\\n<option value=\\\"Aula 15\\\">Aula 15<\/option>\\n<option value=\\\"Aula 16\\\">Aula 16<\/option>\\n<option value=\\\"Aula 17\\\">Aula 17<\/option>\\n<option value=\\\"Aula 18\\\">Aula 18<\/option>\\n<option value=\\\"Aula 19\\\">Aula 19<\/option>\\n<option value=\\\"Aula 20\\\">Aula 20<\/option>\\n<option value=\\\"Aula 21\\\">Aula 21<\/option>\\n<option value=\\\"Aula 22\\\">Aula 22<\/option>\\n<option value=\\\"Aula 23\\\">Aula 23<\/option>\\n        <\/select>\\n      <\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__loading-overlay\\\" id=\\\"cfpListaLoader\\\">\u23f3 Caricamento\u2026<\/div>\n<p>\\n      <\/p>\n<div class=\\\"cfp__api-error\\\" id=\\\"cfpListaErr\\\"><\/div>\n<p>\\n      <\/p>\n<div id=\\\"cfpListaCont\\\"><\/div>\n<p>\\n    <\/p><\/div>\n<p>\\n  <\/p><\/div>\n<p>\\n<\/p><\/div>\n<p>\\n\\n<!-- Modal dettaglio -->\\n<\/p>\n<div class=\\\"cfp__overlay\\\" id=\\\"cfpOverlay\\\">\\n  <\/p>\n<div class=\\\"cfp__modal\\\">\\n    <\/p>\n<h3 id=\\\"cfpModalTitle\\\"><\/h3>\n<p>\\n    <\/p>\n<div class=\\\"cfp__modal-sub\\\"     id=\\\"cfpModalSub\\\"><\/div>\n<p>\\n    <\/p>\n<div class=\\\"cfp__modal-details\\\" id=\\\"cfpModalDet\\\"><\/div>\n<p>\\n    <\/p>\n<div class=\\\"cfp__modal-actions\\\">\\n      <button class=\\\"cfp__btn-modal-del\\\"   id=\\\"cfpBtnDel\\\">\ud83d\uddd1 Elimina<\/button>\\n      <button class=\\\"cfp__btn-modal-edit\\\"  id=\\\"cfpBtnEdit\\\">\u270f\ufe0f Modifica<\/button>\\n      <button class=\\\"cfp__btn-modal-close\\\" id=\\\"cfpBtnClose\\\">Chiudi<\/button>\\n    <\/div>\n<p>\\n  <\/p><\/div>\n<p>\\n<\/p><\/div>\n<p>\\n\\n<\/p>\n<div class=\\\"cfp__toast\\\" id=\\\"cfpToast\\\"><\/div>\n<p>\\n<\/p><\/div>\n<p><!-- fine .cfp__root -->\\n\\n<script>\\n(function () {\\n  'use strict';\\n\\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n     CONFIGURA QUI\\n     \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\\n  var CFP_API   = 'https:\/\/www.coverfop.it\/wp-json\/coverfop\/v1';\\n  var CFP_TOKEN = '61BRV0tzdJ-RfNfldJqUv6q9anCdo3wC0pJ5XJMrAPs';\\n  \/* indirizzo \/exec dello script del ledwall: da qui il modulo prende l'elenco delle classi *\/\\n  var CFP_LEDWALL = 'https:\/\/script.google.com\/macros\/s\/AKfycby7VeiQrmdmaOiYVvcLbW7z5vWNBVoG3uotu-EShcJFLI5wmrTHCT1bWWy37JJbmAE\/exec';\\n  \/* elenco di riserva, usato solo se lo script non risponde *\/\\n  var CFP_CLASSI = ['OE\/OI 1\u00aa','OE\/OI 2\u00aa','OE\/OI 3\u00aa','TE\/TI 4\u00aa','OB 1\u00aa','OB 2\u00aa','OB 3\u00aa','TTE 4\u00aa',\\n                    'OSS primo corso','OSS secondo corso','Agg. informatico GOL','Sommelier 1\u00b0 livello'];\\n  \/* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 *\/\\n\\n  \/* lista ordinata delle aule \u2014 usata per assegnare il colore *\/\\n  var AULE = [\\n    'Aula 1','Aula 4','Aula 5','Aula 6','A. Docenti',\\n    'Aula 9','Aula 10','Aula MIRI','Aula 12','Aula 13',\\n    'Aula 14','Aula 15','Aula 16','Aula 17','Aula 18',\\n    'Aula 19','Aula 20','Aula 21','Aula 22','Aula 23'\\n  ];\\n  var PALETTE = ['cfp--c1','cfp--c2','cfp--c3','cfp--c4'];\\n\\n  var pren   = [];\\n  var year   = new Date().getFullYear();\\n  var mon    = new Date().getMonth();\\n  var selId  = null;\\n  var editId = null;   \/* id prenotazione in modifica, null = nuova *\/\\n\\n  var MESI = ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno',\\n              'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];\\n\\n  \/* \u2500\u2500 helpers \u2500\u2500 *\/\\n  function toStr(d) {\\n    var y = d.getFullYear();\\n    var m = String(d.getMonth() + 1).padStart(2,'0');\\n    var g = String(d.getDate()).padStart(2,'0');\\n    return y+'-'+m+'-'+g;\\n  }\\n  function fmtIT(s) { if(!s)return''; var p=s.split('-'); return p[2]+'\/'+p[1]+'\/'+p[0]; }\\n  function esc(s)   { return String(s||'').replace(\/&\/g,'&amp;').replace(\/<\/g,'&lt;').replace(\/>\/g,'&gt;').replace(\/\\\"\/g,'&quot;'); }\\n\\n  function aulaClass(p) {\\n    var idx = AULE.indexOf(p.aula);\\n    return PALETTE[((idx >= 0 ? idx : 0)) % 4];\\n  }\\n\\n  \/* \u2500\u2500 API \u2500\u2500 *\/\\n  function cfpFetch(path, opts) {\\n    var headers = {'Content-Type':'application\/json'};\\n    if (CFP_TOKEN) headers['X-CFP-Token'] = CFP_TOKEN;\\n    return fetch(CFP_API + path, Object.assign({ headers: headers }, opts || {}));\\n  }\\n\\n  function cfpLoadAll() {\\n    showLoader('cal', true); hideErr('cal');\\n    return cfpFetch('\/prenotazioni')\\n      .then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); })\\n      .then(function(data){ pren = Array.isArray(data) ? data : []; cfpRenderCal(); cfpRenderLista(); })\\n      .catch(function(e){ showErr('cal','\u26a0\ufe0f Impossibile caricare le prenotazioni. Controlla che il plugin sia attivo.<br \/><small>'+esc(e.message)+'<\/small>'); })\\n      .finally(function(){ showLoader('cal', false); });\\n  }\\n\\n  \/* \u2500\u2500 toast \u2500\u2500 *\/\\n  function toast(msg, err) {\\n    var t = document.getElementById('cfpToast');\\n    t.innerHTML = msg;\\n    t.className = 'cfp__toast cfp--show'+(err?' cfp--error':'');\\n    clearTimeout(t._tid);\\n    t._tid = setTimeout(function(){ t.className='cfp__toast'; }, 3000);\\n  }\\n\\n  \/* \u2500\u2500 loader \/ errori \u2500\u2500 *\/\\n  function showLoader(scope, on) {\\n    var el = scope==='lista' ? document.getElementById('cfpListaLoader') : document.getElementById('cfpCalLoader');\\n    if(el) el.className = 'cfp__loading-overlay'+(on?' cfp--show':'');\\n  }\\n  function showErr(scope, msg) {\\n    var ids = {cal:'cfpCalErr', lista:'cfpListaErr', form:'cfpFormErr'};\\n    var el  = document.getElementById(ids[scope]||'cfpCalErr');\\n    if(el){ el.innerHTML=msg; el.className='cfp__api-error cfp--show'; }\\n  }\\n  function hideErr(scope) {\\n    var ids = {cal:'cfpCalErr', lista:'cfpListaErr', form:'cfpFormErr'};\\n    var el  = document.getElementById(ids[scope]||'cfpCalErr');\\n    if(el){ el.innerHTML=''; el.className='cfp__api-error'; }\\n  }\\n\\n  \/* \u2500\u2500 viste \u2500\u2500 *\/\\n  window.cfpShowView = function(v) {\\n    var cal=document.getElementById('cfpCalView'), lista=document.getElementById('cfpListaView');\\n    var bC=document.getElementById('cfpBtnCal'),   bL=document.getElementById('cfpBtnLista');\\n    if(v==='cal'){\\n      cal.style.display='block'; lista.style.display='none';\\n      bC.classList.add('cfp--active'); bL.classList.remove('cfp--active');\\n    } else {\\n      cal.style.display='none'; lista.style.display='block';\\n      bC.classList.remove('cfp--active'); bL.classList.add('cfp--active');\\n      cfpRenderLista();\\n    }\\n  };\\n\\n  \/* \u2500\u2500 SUBMIT (nuova o modifica) \u2500\u2500 *\/\\n  window.cfpSubmit = function(e) {\\n    e.preventDefault(); hideErr('form');\\n    var ini = document.getElementById('cfpInizio').value;\\n    var fin = document.getElementById('cfpFine').value;\\n    if(fin <= ini){ showErr('form','\u26a0\ufe0f L\\\\'ora di fine deve essere successiva all\\\\'inizio.'); return; }\\n\\n    var body = {\\n      nome: document.getElementById('cfpNome').value.trim(),\\n      da:   document.getElementById('cfpDa').value.trim(),\\n      data: document.getElementById('cfpData').value,\\n      aula: document.getElementById('cfpAula').value,\\n      ini:  ini, fin: fin,\\n      lab:  '',\\n      note: document.getElementById('cfpNote').value.trim(),\\n      ledwall: document.getElementById('cfpLedwall').checked,\\n      classe: document.getElementById('cfpClasse').value,\\n      gruppo: document.getElementById('cfpClasse').value.indexOf('\/') >= 0 ? document.getElementById('cfpGruppo').value : '',\\n      schermo: document.getElementById('cfpSchermo').value.trim()\\n    };\\n\\n    var btn = document.getElementById('cfpBtnSubmit');\\n    btn.disabled = true;\\n    btn.innerHTML = '<span class=\\\"cfp__spinner\\\"><\/span> Salvataggio\u2026';\\n\\n    var isEdit   = editId !== null;\\n    var path     = isEdit ? '\/prenotazioni\/'+editId : '\/prenotazioni';\\n    var method   = isEdit ? 'PUT' : 'POST';\\n\\n    cfpFetch(path, { method: method, body: JSON.stringify(body) })\\n      .then(function(r){\\n        if(!r.ok) return r.json().then(function(j){ throw new Error(j.message||'HTTP '+r.status); });\\n        return r.json();\\n      })\\n      .then(function(p){\\n        if(isEdit){\\n          pren = pren.map(function(x){ return x.id==p.id ? p : x; });\\n          toast('\u2705 Modifica salvata: '+esc(p.nome));\\n        } else {\\n          pren.push(p);\\n          toast('\u2705 Prenotato: '+esc(p.nome)+' \u2013 '+fmtIT(p.data));\\n        }\\n        cfpResetForm();\\n        cfpRenderCal(); cfpRenderLista();\\n      })\\n      .catch(function(err){ showErr('form','\u26a0\ufe0f Errore: '+esc(err.message)); })\\n      .finally(function(){\\n        btn.disabled = false;\\n        btn.innerHTML = editId !== null ? '\ud83d\udcbe Salva modifiche' : '\u2705 Conferma prenotazione';\\n      });\\n  };\\n\\n  \/* \u2500\u2500 EDIT: avvio e reset \u2500\u2500 *\/\\n  window.cfpStartEdit = function(id) {\\n    var p = pren.filter(function(x){ return x.id==id; })[0];\\n    if(!p) return;\\n    cfpCloseModal();\\n    editId = id;\\n\\n    document.getElementById('cfpNome').value   = p.nome  || '';\\n    document.getElementById('cfpDa').value     = p.da    || '';\\n    document.getElementById('cfpData').value   = p.data  || '';\\n    document.getElementById('cfpAula').value   = p.aula  || '';\\n    document.getElementById('cfpInizio').value = p.ini   || '';\\n    document.getElementById('cfpFine').value   = p.fin   || '';\\n    document.getElementById('cfpNote').value   = p.note  || '';\\n    document.getElementById('cfpLedwall').checked = p.ledwall !== false;\\n    document.getElementById('cfpSchermo').value   = p.schermo || '';\\n    cfpEnsureClasse(p.classe || '');\\n    document.getElementById('cfpClasse').value    = p.classe || '';\\n    document.getElementById('cfpGruppo').value    = p.gruppo || '';\\n    cfpToggleGruppo();\\n\\n    document.getElementById('cfpEditBanner').classList.add('cfp--show');\\n    document.getElementById('cfpFormTitle').textContent = '\u270f\ufe0f Modifica prenotazione';\\n    var btn = document.getElementById('cfpBtnSubmit');\\n    btn.textContent = '\ud83d\udcbe Salva modifiche';\\n    btn.classList.add('cfp--edit-mode');\\n\\n    \/* scrolla al form su mobile *\/\\n    document.getElementById('cfpForm').scrollIntoView({ behavior:'smooth', block:'start' });\\n  };\\n\\n  function cfpResetForm() {\\n    editId = null;\\n    document.getElementById('cfpForm').reset();\\n    document.getElementById('cfpData').value = toStr(new Date());\\n    document.getElementById('cfpLedwall').checked = true;\\n    cfpToggleGruppo();\\n    document.getElementById('cfpEditBanner').classList.remove('cfp--show');\\n    document.getElementById('cfpFormTitle').textContent = '\u270f\ufe0f Nuova prenotazione';\\n    var btn = document.getElementById('cfpBtnSubmit');\\n    btn.textContent = '\u2705 Conferma prenotazione';\\n    btn.classList.remove('cfp--edit-mode');\\n    hideErr('form');\\n  }\\n\\n  window.cfpCancelEdit = function() { cfpResetForm(); };\\n\\n  \/* \u2500\u2500 CALENDARIO \u2500\u2500 *\/\\n  window.cfpChangeMonth = function(d) {\\n    mon += d;\\n    if(mon>11){mon=0;year++;} if(mon<0){mon=11;year--;}\\n    cfpRenderCal();\\n  };\\n  window.cfpGoToday = function() {\\n    var n=new Date(); year=n.getFullYear(); mon=n.getMonth(); cfpRenderCal();\\n  };\\n\\n  function cfpRenderCal() {\\n    document.getElementById('cfpCalTitle').textContent = MESI[mon]+' '+year;\\n    var grid = document.getElementById('cfpGrid');\\n    grid.innerHTML = '';\\n    var todayStr = toStr(new Date());\\n    var byDate = {};\\n    pren.forEach(function(p){ byDate[p.data]=byDate[p.data]||[]; byDate[p.data].push(p); });\\n\\n    var first=new Date(year,mon,1), dow=(first.getDay()+6)%7;\\n    var dim=new Date(year,mon+1,0).getDate(), prevDim=new Date(year,mon,0).getDate();\\n    var total=Math.ceil((dow+dim)\/7)*7;\\n\\n    for(var i=0;i<total;i++){\\n      var cell=document.createElement('div'); cell.className='cfp__cell';\\n      var day, ds, other=false;\\n      if(i<dow)          { day=prevDim-dow+i+1; ds=toStr(new Date(year,mon-1,day)); other=true; }\\n      else if(i>=dow+dim){ day=i-dow-dim+1;     ds=toStr(new Date(year,mon+1,day)); other=true; }\\n      else               { day=i-dow+1;          ds=toStr(new Date(year,mon,day)); }\\n\\n      if(other) cell.classList.add('cfp--other');\\n      if(ds===todayStr) cell.classList.add('cfp--today');\\n\\n      var dn=document.createElement('div'); dn.className='cfp__daynum';\\n      dn.textContent=day; cell.appendChild(dn);\\n\\n      var evs=byDate[ds]||[];\\n      var MAX_EV = 10;\\n      evs.slice(0,MAX_EV).forEach(function(p){\\n        var isPast = p.data < todayStr;\\n        var ev=document.createElement('div');\\n        ev.className='cfp__ev '+(isPast ? 'cfp--past' : aulaClass(p));\\n        ev.title = p.ini+'\u2013'+p.fin+' | '+p.aula+' | '+p.da+(p.note?' | '+p.note:'')+(isPast?' (passato)':'');\\n        ev.textContent = p.ini+' ['+p.aula+'] '+p.nome;\\n        if(!isPast) ev.onclick=(function(id){ return function(e){ e.stopPropagation(); cfpOpenModal(id); }; })(p.id);\\n        cell.appendChild(ev);\\n      });\\n      if(evs.length>MAX_EV){\\n        var more=document.createElement('div'); more.className='cfp__ev-more';\\n        more.textContent='+'+(evs.length-MAX_EV)+' altri';\\n        more.onclick=(function(d){ return function(){ cfpShowView('lista'); document.getElementById('cfpFiltroData').value=d; cfpRenderLista(); }; })(ds);\\n        cell.appendChild(more);\\n      }\\n      grid.appendChild(cell);\\n    }\\n  }\\n\\n  \/* \u2500\u2500 LISTA \u2500\u2500 *\/\\n  function cfpRenderLista() {\\n    var fd=document.getElementById('cfpFiltroData').value;\\n    var fa=document.getElementById('cfpFiltroAula').value;\\n    var arr=pren.slice().sort(function(a,b){\\n      return a.data!==b.data ? a.data.localeCompare(b.data) : a.ini.localeCompare(b.ini);\\n    });\\n    if(fd) arr=arr.filter(function(p){ return p.data===fd; });\\n    if(fa) arr=arr.filter(function(p){ return p.aula===fa; });\\n    var c=document.getElementById('cfpListaCont');\\n    if(!arr.length){ c.innerHTML='<\/p>\n<div class=\\\"cfp__empty\\\">\ud83d\udced<br \/>Nessuna prenotazione trovata.<\/div>\n<p>'; return; }\\n    var h='<\/p>\n<table class=\\\"cfp__table\\\">\n<thead>\n<tr>'\\n      +'<\/p>\n<th>Data<\/th>\n<th>Attivit\u00e0<\/th>\n<th>Aula<\/th>\n<th>Orario<\/th>\n<th>Da<\/th>\n<th><\/th>\n<p>'\\n      +'<\/tr>\n<\/thead>\n<tbody>';\\n    var todayStr = toStr(new Date());\\n    arr.forEach(function(p){\\n      var cl=aulaClass(p);\\n      var isPast = p.data < todayStr;\\n      h+='\n\n<tr>'\\n        +'<\/p>\n<td>'+fmtIT(p.data)+'<\/td>\n<p>'\\n        +'<\/p>\n<td><strong>'+esc(p.nome)+'<\/strong>'+(p.ledwall===false?'<span class=\\\"cfp__nolw\\\">non sul ledwall<\/span>':'')+(p.classe?'<br \/><small style=\\\"color:#2563a8\\\">'+esc(p.classe)+(p.gruppo?' \u2013 gruppo '+esc(p.gruppo):'')+'<\/small>':'')+(p.note?'<br \/><small style=\\\"color:#5a6b7c\\\">'+esc(p.note)+'<\/small>':'')+'<\/td>\n<p>'\\n        +'<\/p>\n<td><span class=\\\"cfp__badge '+(isPast?'':''+cl)+'\\\" style=\\\"'+(isPast?'background:#9ca3af':'')+'\\\">'+esc(p.aula)+'<\/span><\/td>\n<p>'\\n        +'<\/p>\n<td style=\\\"'+(isPast?'color:#9ca3af':'')+'\\\">'+esc(p.ini)+' \u2013 '+esc(p.fin)+'<\/td>\n<p>'\\n        +'<\/p>\n<td style=\\\"'+(isPast?'color:#9ca3af':'')+'\\\">'+esc(p.da)+'<\/td>\n<p>'\\n        +'<\/p>\n<td style=\\\"white-space:nowrap\\\">'\\n          +(isPast\\n            ? '<span style=\\\"font-size:.72rem;color:#9ca3af;font-style:italic\\\">archiviato<\/span>'\\n            : '<button class=\\\"cfp__btn-edit\\\" onclick=\\\"cfpStartEdit(\\\\''+p.id+'\\\\')\\\" title=\\\"Modifica\\\">\u270f\ufe0f<\/button>'\\n              +'<button class=\\\"cfp__btn-del\\\"  onclick=\\\"cfpDelById(\\\\''+p.id+'\\\\')\\\"  title=\\\"Elimina\\\">\ud83d\uddd1<\/button>'\\n          )\\n        +'<\/td>\n<p>'\\n        +'<\/tr>\n<p>';\\n    });\\n    h+='<\/tbody>\n<\/table>\n<p>';\\n    c.innerHTML=h;\\n  }\\n  window.cfpRenderLista = cfpRenderLista;\\n\\n  \/* \u2500\u2500 MODAL \u2500\u2500 *\/\\n  function cfpOpenModal(id) {\\n    var p=pren.filter(function(x){ return x.id==id; })[0];\\n    if(!p) return;\\n    selId=id;\\n    var isPast = p.data < toStr(new Date());\\n    document.getElementById('cfpModalTitle').textContent = p.nome;\\n    document.getElementById('cfpModalSub').textContent   = fmtIT(p.data)+' \u2014 '+p.aula+(isPast?' (passato)':'');\\n    document.getElementById('cfpModalDet').innerHTML =\\n      '\n\n<div class=\\\"cfp__det-row\\\"><span class=\\\"cfp__det-label\\\">Orario<\/span><span>'+esc(p.ini)+' \u2013 '+esc(p.fin)+'<\/span><\/div>\n<p>'+\\n      '<\/p>\n<div class=\\\"cfp__det-row\\\"><span class=\\\"cfp__det-label\\\">Aula<\/span><span>'+esc(p.aula)+'<\/span><\/div>\n<p>'+\\n      '<\/p>\n<div class=\\\"cfp__det-row\\\"><span class=\\\"cfp__det-label\\\">Prenotato da<\/span><span>'+esc(p.da)+'<\/span><\/div>\n<p>'+\\n      (p.note?'<\/p>\n<div class=\\\"cfp__det-row\\\"><span class=\\\"cfp__det-label\\\">Note<\/span><span>'+esc(p.note)+'<\/span><\/div>\n<p>':'')+\\n      (p.classe?'<\/p>\n<div class=\\\"cfp__det-row\\\"><span class=\\\"cfp__det-label\\\">Classe<\/span><span>'+esc(p.classe)+(p.gruppo?' \u2013 gruppo '+esc(p.gruppo):'')+'<\/span><\/div>\n<p>':'')+\\n      '<\/p>\n<div class=\\\"cfp__det-row\\\"><span class=\\\"cfp__det-label\\\">Ledwall<\/span><span>'+(p.ledwall===false?'non mostrata':'mostrata'+(p.schermo?' come \u201c'+esc(p.schermo)+'\u201d':''))+'<\/span><\/div>\n<p>';\\n    \/* nasconde le azioni per le prenotazioni gi\u00e0 passate *\/\\n    document.getElementById('cfpBtnDel').style.display  = isPast ? 'none' : '';\\n    document.getElementById('cfpBtnEdit').style.display = isPast ? 'none' : '';\\n    document.getElementById('cfpOverlay').classList.add('cfp--open');\\n  }\\n\\n  function cfpCloseModal() {\\n    document.getElementById('cfpOverlay').classList.remove('cfp--open');\\n    selId=null;\\n  }\\n\\n  \/* \u2500\u2500 ELIMINA \u2500\u2500 *\/\\n  window.cfpDelById = function(id) {\\n    if(!confirm('Eliminare questa prenotazione?')) return;\\n    cfpFetch('\/prenotazioni\/'+id, {method:'DELETE'})\\n      .then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); })\\n      .then(function(){\\n        pren=pren.filter(function(p){ return p.id!=id; });\\n        toast('\ud83d\uddd1 Prenotazione eliminata');\\n        cfpRenderCal(); cfpRenderLista();\\n      })\\n      .catch(function(e){ toast('\u26a0\ufe0f Eliminazione fallita: '+e.message, true); });\\n  };\\n\\n  \/* \u2500\u2500 EVENT LISTENERS \u2500\u2500 *\/\\n  document.getElementById('cfpBtnDel').onclick   = function(){ if(selId){ cfpDelById(selId); cfpCloseModal(); } };\\n  document.getElementById('cfpBtnEdit').onclick  = function(){ if(selId){ cfpStartEdit(selId); } };\\n  document.getElementById('cfpBtnClose').onclick = cfpCloseModal;\\n  document.getElementById('cfpOverlay').onclick  = function(e){ if(e.target===this) cfpCloseModal(); };\\n\\n  \/* \u2500\u2500 CLASSI (dal foglio del ledwall, con elenco di riserva) \u2500\u2500 *\/\\n  function cfpFillClassi(list) {\\n    var sel = document.getElementById('cfpClasse'), cur = sel.value, i, o;\\n    while (sel.options.length > 1) sel.remove(1);\\n    for (i = 0; i < list.length; i++) {\\n      if (list[i] === 'Colloqui in presenza') continue;\\n      o = document.createElement('option'); o.value = list[i]; o.textContent = list[i]; sel.appendChild(o);\\n    }\\n    sel.value = cur;\\n  }\\n  function cfpEnsureClasse(name) {\\n    var sel = document.getElementById('cfpClasse'), i;\\n    if (!name) return;\\n    for (i = 0; i < sel.options.length; i++) if (sel.options[i].value === name) return;\\n    var o = document.createElement('option'); o.value = name; o.textContent = name; sel.appendChild(o);\\n  }\\n  window.cfpToggleGruppo = function() {\\n    var v = document.getElementById('cfpClasse').value;\\n    document.getElementById('cfpGruppoBox').style.display = v.indexOf('\/') >= 0 ? '' : 'none';\\n    if (v.indexOf('\/') < 0) document.getElementById('cfpGruppo').value = '';\\n  };\\n  cfpFillClassi(CFP_CLASSI);\\n  fetch(CFP_LEDWALL)\\n    .then(function(r){ return r.json(); })\\n    .then(function(d){\\n      \/* i corsi del foglio, esclusi i nomi delle prenotazioni one-shot aggiunte in coda dallo script *\/\\n      var oneShot = (d.blocchi || []).filter(function(b){ return b.prenotazione; })\\n                                     .map(function(b){ return b.corso; });\\n      var names = (d.corsi || []).map(function(c){ return c.corso; })\\n                                 .filter(function(n){ return oneShot.indexOf(n) < 0; });\\n      if (names.length) cfpFillClassi(names);\\n    })\\n    .catch(function(){ \/* resta l'elenco di riserva *\/ });\\n\\n  \/* \u2500\u2500 INIT \u2500\u2500 *\/\\n  document.getElementById('cfpData').value = toStr(new Date());\\n  cfpLoadAll();\\n\\n})();\\n<\/script>\\n\"}}]}]}]}],\"version\":\"5.0.52\"} --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>COVERFOP &nbsp;|&nbsp; Prenotazione Aule \ud83d\udcc5 Calendario \ud83d\udccb Lista \u270f\ufe0f Nuova prenotazione \u26a0\ufe0f Stai modificando una prenotazione esistente Annulla Nome attivit\u00e0 \/ corso Prenotato da Data Aula \u2014 seleziona \u2014Aula 1Aula 4Aula 5Aula 6A. DocentiAula 9Aula 10Aula MIRIAula 12Aula 13Aula 14Aula 15Aula 16Aula 17Aula 18Aula 19Aula 20Aula 21Aula 22Aula 23 Ora inizio Ora fine Note (opzionale) [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"rs_blank_template":"","rs_page_bg_color":"","slide_template_v7":"","footnotes":""},"class_list":["post-14877","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/pages\/14877","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/comments?post=14877"}],"version-history":[{"count":16,"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/pages\/14877\/revisions"}],"predecessor-version":[{"id":15893,"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/pages\/14877\/revisions\/15893"}],"wp:attachment":[{"href":"https:\/\/www.coverfop.it\/index.php\/wp-json\/wp\/v2\/media?parent=14877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}