{"id":1451,"date":"2025-12-14T14:37:31","date_gmt":"2025-12-14T14:37:31","guid":{"rendered":"https:\/\/myarchery.it\/allenamento\/?page_id=1451"},"modified":"2025-12-28T13:10:55","modified_gmt":"2025-12-28T13:10:55","slug":"diario-gare-2","status":"publish","type":"page","link":"https:\/\/myarchery.it\/allenamento\/diario-gare-2\/","title":{"rendered":"Diario Gare"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1451\" class=\"elementor elementor-1451\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-de434de elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"de434de\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d378198\" data-id=\"d378198\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-273de90 elementor-view-default elementor-widget elementor-widget-icon\" data-id=\"273de90\" data-element_type=\"widget\" data-widget_type=\"icon.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-icon-wrapper\">\n\t\t\t<div class=\"elementor-icon\">\n\t\t\t<i aria-hidden=\"true\" class=\"far fa-edit\"><\/i>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b03ff4a elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"b03ff4a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- ===== STILE CARD ===== -->\n<style>\n.card-gara {\n  background: #ffffff;\n  border-radius: 10px;\n  padding: 14px;\n  margin-bottom: 14px;\n  box-shadow: 0 2px 6px rgba(0,0,0,0.08);\n  font-size: 14px;\n}\n\n.card-gara.outdoor {\n  border-left: 5px solid #2c7be5;\n}\n\n.card-gara.indoor {\n  border-left: 5px solid #28a745;\n}\n\n.card-gara .header {\n  display: flex;\n  justify-content: space-between;\n  font-weight: bold;\n  margin-bottom: 6px;\n}\n\n.card-gara .punti {\n  font-size: 20px;\n  font-weight: bold;\n  margin: 6px 0;\n}\n\n.card-gara .condizioni span {\n  display: inline-block;\n  background: #f1f1f1;\n  border-radius: 12px;\n  padding: 4px 8px;\n  font-size: 12px;\n  margin: 3px 4px 0 0;\n}\n\n.card-gara .note {\n  margin-top: 6px;\n  font-style: italic;\n  color: #555;\n}\n<\/style>\n\n<!-- ===== FORM GARA ===== -->\n<form id=\"garaForm\">\n  <label>Data gara<\/label><br>\n  <input type=\"date\" id=\"data\" required><br><br>\n\n  <label>Tipo gara<\/label><br>\n  <select id=\"tipo\">\n    <option value=\"Indoor\">Indoor<\/option>\n    <option value=\"Outdoor\">Outdoor<\/option>\n  <\/select><br><br>\n\n  <label>Punti gara<\/label><br>\n  <input type=\"number\" id=\"punti\" min=\"0\"><br><br>\n\n  <div id=\"campiIndoor\">\n    <label>Condizioni Indoor<\/label><br>\n    <select id=\"indoorCondizioni\" multiple size=\"8\">\n      <option>Ambiente caldo<\/option>\n      <option>Ambiente freddo<\/option>\n      <option>Bene illuminato<\/option>\n      <option>Poco illuminato<\/option>\n      <option>Sufficientemente illuminato<\/option>\n      <option>Rumoroso<\/option>\n      <option>Tranquillo<\/option>\n      <option>Area riposo<\/option>\n    <\/select><br><br>\n  <\/div>\n\n  <div id=\"campiOutdoor\">\n    <label>Condizioni Outdoor<\/label><br>\n    <select id=\"outdoorCondizioni\" multiple size=\"7\">\n      <option>Tempo soleggiato<\/option>\n      <option>Tempo nuvoloso<\/option>\n      <option>Pioggia<\/option>\n      <option>Vento forte<\/option>\n      <option>Brezza<\/option>\n      <option>Orientamento campo buono<\/option>\n      <option>Sole di fronte<\/option>\n    <\/select><br><br>\n  <\/div>\n\n  <label>Note gara<\/label><br>\n  <textarea id=\"note\"><\/textarea><br><br>\n\n  <button type=\"submit\">Salva Gara<\/button>\n<\/form>\n\n<hr>\n\n<!-- ===== DASHBOARD ===== -->\n<div id=\"dashboardGare\"><\/div>\n\n<!-- ===== FILTRI ===== -->\n<div style=\"margin:10px 0;\">\n  <select id=\"filtroAnno\"><\/select>\n  <select id=\"filtroTipo\">\n    <option value=\"all\">Tutte<\/option>\n    <option value=\"Indoor\">Indoor<\/option>\n    <option value=\"Outdoor\">Outdoor<\/option>\n  <\/select>\n<\/div>\n\n<!-- ===== LISTE ===== -->\n<h3>Gare Attuali<\/h3>\n<div id=\"listaGare\"><\/div>\n\n<button id=\"resetGare\">Reset Gare (archivia)<\/button>\n\n<hr>\n\n<h3>Gare Passate<\/h3>\n<div id=\"garePassate\"><\/div>\n\n<hr>\n\n<!-- ===== BACKUP ===== -->\n<h3>Backup locale<\/h3>\n<button id=\"backupGare\">Backup gare<\/button>\n<button id=\"restoreGare\">Ripristina backup<\/button>\n<input type=\"file\" id=\"fileBackup\" accept=\".json\" style=\"display:none;\">\n\n<!-- ===== SCRIPT ===== -->\n<script>\nconst form = document.getElementById('garaForm');\nconst lista = document.getElementById('listaGare');\nconst listaPassate = document.getElementById('garePassate');\nconst resetBtn = document.getElementById('resetGare');\n\nconst tipoSelect = document.getElementById('tipo');\nconst indoorBox = document.getElementById('campiIndoor');\nconst outdoorBox = document.getElementById('campiOutdoor');\n\nconst filtroAnno = document.getElementById('filtroAnno');\nconst filtroTipo = document.getElementById('filtroTipo');\n\nfunction toggleCondizioni() {\n  indoorBox.style.display = tipoSelect.value === 'Indoor' ? 'block' : 'none';\n  outdoorBox.style.display = tipoSelect.value === 'Outdoor' ? 'block' : 'none';\n}\ntipoSelect.onchange = toggleCondizioni;\ntoggleCondizioni();\n\nfunction getSelectedOptions(select) {\n  return Array.from(select.selectedOptions).map(o => o.value);\n}\n\nfunction gruppoPerAnno(gare) {\n  return gare.reduce((acc, g) => {\n    const anno = new Date(g.data).getFullYear();\n    acc[anno] = acc[anno] || [];\n    acc[anno].push(g);\n    return acc;\n  }, {});\n}\n\nfunction calcolaMedia(gare) {\n  return gare.length\n    ? (gare.reduce((s, g) => s + Number(g.punti), 0) \/ gare.length).toFixed(1)\n    : 0;\n}\n\nfunction renderDashboard(gare) {\n  const box = document.getElementById('dashboardGare');\n  if (!gare.length) return box.innerHTML = '';\n  box.innerHTML = `\n    <div class=\"card-gara\">\n      <strong>Totale gare:<\/strong> ${gare.length}<br>\n      <strong>Media punti:<\/strong> ${calcolaMedia(gare)}\n    <\/div>`;\n}\n\nfunction renderLista(container, gare) {\n  container.innerHTML = '';\n\n  if (filtroAnno.value !== 'all') {\n    gare = gare.filter(g => new Date(g.data).getFullYear() == filtroAnno.value);\n  }\n  if (filtroTipo.value !== 'all') {\n    gare = gare.filter(g => g.tipo === filtroTipo.value);\n  }\n\n  const gruppi = gruppoPerAnno(gare);\n  Object.keys(gruppi).sort((a,b)=>b-a).forEach(anno => {\n    const h = document.createElement('h4');\n    h.textContent = `Anno ${anno}`;\n    container.appendChild(h);\n\n    gruppi[anno].forEach(g => {\n      const card = document.createElement('div');\n      card.className = `card-gara ${g.tipo.toLowerCase()}`;\n      card.innerHTML = `\n        <div class=\"header\"><span>${g.data}<\/span><span>${g.tipo}<\/span><\/div>\n        <div class=\"punti\">Punti: ${g.punti}<\/div>\n        <div class=\"condizioni\">${g.condizioni.map(c=>`<span>${c}<\/span>`).join('')}<\/div>\n        <div class=\"note\">${g.note||''}<\/div>`;\n      container.appendChild(card);\n    });\n  });\n}\n\nfunction caricaGare() {\n  const gare = JSON.parse(localStorage.getItem('gare')) || [];\n  const passate = JSON.parse(localStorage.getItem('gare_passate')) || [];\n\n  const anni = [...new Set(gare.map(g => new Date(g.data).getFullYear()))];\n  filtroAnno.innerHTML = `<option value=\"all\">Tutti gli anni<\/option>`;\n  anni.forEach(a => filtroAnno.innerHTML += `<option>${a}<\/option>`);\n\n  renderDashboard(gare);\n  renderLista(lista, gare);\n  renderLista(listaPassate, passate);\n}\n\nform.onsubmit = e => {\n  e.preventDefault();\n  const gare = JSON.parse(localStorage.getItem('gare')) || [];\n  gare.push({\n    data: data.value,\n    tipo: tipoSelect.value,\n    punti: punti.value,\n    condizioni: tipoSelect.value === 'Indoor'\n      ? getSelectedOptions(indoorCondizioni)\n      : getSelectedOptions(outdoorCondizioni),\n    note: note.value\n  });\n  localStorage.setItem('gare', JSON.stringify(gare));\n  form.reset(); toggleCondizioni(); caricaGare();\n};\n\nresetBtn.onclick = () => {\n  if (!confirm('Archiviare tutte le gare?')) return;\n  const gare = JSON.parse(localStorage.getItem('gare')) || [];\n  const passate = JSON.parse(localStorage.getItem('gare_passate')) || [];\n  localStorage.setItem('gare_passate', JSON.stringify(passate.concat(gare)));\n  localStorage.removeItem('gare');\n  caricaGare();\n};\n\n\/* BACKUP *\/\nbackupGare.onclick = () => {\n  const data = {\n    gare: JSON.parse(localStorage.getItem('gare'))||[],\n    gare_passate: JSON.parse(localStorage.getItem('gare_passate'))||[]\n  };\n  const blob = new Blob([JSON.stringify(data,null,2)],{type:'application\/json'});\n  const a = document.createElement('a');\n  a.href = URL.createObjectURL(blob);\n  a.download = 'backup_gare.json';\n  a.click();\n};\n\nrestoreGare.onclick = () => fileBackup.click();\nfileBackup.onchange = e => {\n  const r = new FileReader();\n  r.onload = () => {\n    const d = JSON.parse(r.result);\n    localStorage.setItem('gare', JSON.stringify(d.gare||[]));\n    localStorage.setItem('gare_passate', JSON.stringify(d.gare_passate||[]));\n    caricaGare();\n  };\n  r.readAsText(e.target.files[0]);\n};\n\nfiltroAnno.onchange = filtroTipo.onchange = caricaGare;\ncaricaGare();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-80df776 elementor-widget elementor-widget-html\" data-id=\"80df776\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"dashboardGare\"><\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Data gara Tipo gara IndoorOutdoor Punti gara Condizioni Indoor Ambiente caldoAmbiente freddoBene illuminatoPoco illuminatoSufficientemente illuminatoRumorosoTranquilloArea riposo Condizioni Outdoor Tempo soleggiatoTempo nuvolosoPioggiaVento forteBrezzaOrientamento campo buonoSole di fronte Note gara Salva Gara TutteIndoorOutdoor Gare Attuali Reset Gare (archivia) Gare Passate Backup locale Backup gare Ripristina backup<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1451","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/pages\/1451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/comments?post=1451"}],"version-history":[{"count":76,"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/pages\/1451\/revisions"}],"predecessor-version":[{"id":1866,"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/pages\/1451\/revisions\/1866"}],"wp:attachment":[{"href":"https:\/\/myarchery.it\/allenamento\/wp-json\/wp\/v2\/media?parent=1451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}