1document.addEventListener('DOMContentLoaded', function () { 2 let calendarEl = document.getElementById('events-calendar'); 3 let eventsContainer = document.querySelector('.events-calendar-items'); 4 5 if (!calendarEl) return; 6 7 let selectedDate = null; // keep track of clicked date 8 9 let calendar = new FullCalendar.Calendar(calendarEl, { 10 initialView: 'dayGridMonth', 11 locale: 'RO', 12 firstDay: 1, 13 showNonCurrentDates: false, 14 contentHeight: 'auto', 15 dayMaxEvents: true, 16 events: [], 17 headerToolbar: { 18 left: 'title', 19 center: 'prevYear,prev,today,next,nextYear', 20 right: '', 21 }, 22 buttonText: { 23 today: 'AstÄzi', 24 }, 25 26 // highlight clicked day + load events 27 dateClick: function (info) { 28 selectedDate = info.dateStr; 29 calendar.render(); 30 displayEvents(info.dateStr); 31 }, 32 33 // assign class to selected cell 34 dayCellClassNames: function (arg) { 35 const cellDate = arg.date.toLocaleDateString('en-CA'); // YYYY-MM-DD in local time 36 if (cellDate === selectedDate) { 37 return ['fc-day-selected']; 38 } 39 return []; 40 }, 41 42 // detect navigation (today button included) 43 datesSet: function (info) { 44 const todayStr = new Date().toLocaleDateString('en-CA'); 45 46 // if the view is exactly "today", reset selection 47 if (info.start <= new Date() && new Date() < info.end && selectedDate !== todayStr) { 48 selectedDate = todayStr; 49 displayEvents(todayStr); 50 calendar.render(); 51 } 52 }, 53 54 customButtons: { 55 prevYear: { 56 text: '«', 57 click: function () { 58 calendar.incrementDate({ years: -1 }); // go back 1 year 59 } 60 }, 61 nextYear: { 62 text: '»', 63 click: function () { 64 calendar.incrementDate({ years: 1 }); // go forward 1 year 65 } 66 } 67 }, 68 }); 69 70 calendar.render(); 71 72 // --- Function to display posts --- 73 function displayEvents(dateStr) { 74 fetch(`${calendarData.rest_url}&date=${dateStr}`) 75 .then(res => res.json()) 76 .then(events => { 77 dateStrDisplayed = dateStr.replace(/(\d{4})-(\d{2})-(\d{2})/, '$3.$2.$1') 78 eventsContainer.innerHTML = `<div class="events-calendar-date-header">${dateStrDisplayed}</div>`; 79 if (events.length) { 80 events.forEach(ev => { 81 date = "" 82 date_start = ev.acf.data_inceput ? ev.acf.data_inceput.replace(/(\d{4})(\d{2})(\d{2})/, '$3.$2.$1') : "" 83 date_end = ev.acf.data_final ? ev.acf.data_final.replace(/(\d{4})(\d{2})(\d{2})/, '$3.$2.$1') : "" 84 let title = ev.title.rendered.charAt(0).toUpperCase() + ev.title.rendered.slice(1); 85 if (ev.acf.data_inceput === ev.acf.data_final) { 86 date = date_start ? date_start : date_end 87 } else { 88 date = `${date_start} ${(date_start && date_end) ? "-" : ""} ${date_end}` 89 } 90 details = ev.acf.detalii ? `<p><b>Detalii:</b> <br>${ev.acf.detalii}</p>` : ''; 91 92 /* <div class="events-calendar-date-wrapper"> 93 <span class="events-calendar-date">${date.trim()}</span> 94 </div> */ 95 eventsContainer.innerHTML += ` 96 <div class="events-calendar-item"> 97 <div class="events-calendar-header"> 98 <h4>${title}</h4> 99 </div> 100 <div> 101 <p><b>DatÄ:</b> ${date.trim()}</p> 102 <p><b>Organizator:</b> ${ev.acf.organizator}</p> 103 <p><b>LocaÈie:</b> ${ev.acf.loc_de_desfaÈurare}</p> 104 <p><b>ParticipanÈi:</b> ${(ev.acf.participa.split("\n").length > 1) ? '<br>' : ''}${ev.acf.participa}</p> 105 ${details} 106 </div> 107 </div> 108 `; 109 }); 110 } else { 111 eventsContainer.innerHTML += `<div class="events-calendar-item"><h5 class="events-calendar-no-events">Nu a fost gÄsit niciun eveniment în data selectatÄ (${dateStrDisplayed}).</h5></div>`; 112 } 113 }); 114 } 115 116 function displayLastEvents(numberOfEvents = 3, containerId = 'last-events-container') { 117 fetch(`${calendarData.rest_url}&last=${numberOfEvents}`) 118 .then(res => res.json()) 119 .then(events => { 120 const container = document.getElementById(containerId); 121 if (!container) { 122 console.error(`Container with ID '${containerId}' not found`); 123 return; 124 } 125 126 container.innerHTML = `<div class="events-calendar-date-header">Ultimele evenimente</div>`; 127 128 if (events.length) {
129 events.forEach(ev => { 130 let date = ""; 131 let date_start = ev.acf.data_inceput ? ev.acf.data_inceput.replace(/(\d{4})(\d{2})(\d{2})/, '$3.$2.$1') : ""; 132 let date_end = ev.acf.data_final ? ev.acf.data_final.replace(/(\d{4})(\d{2})(\d{2})/, '$3.$2.$1') : ""; 133 let title = ev.title.rendered.charAt(0).toUpperCase() + ev.title.rendered.slice(1); 134 135 if (ev.acf.data_inceput === ev.acf.data_final) { 136 date = date_start ? date_start : date_end; 137 } else { 138 date = `${date_start} ${(date_start && date_end) ? "-" : ""} ${date_end}`; 139 } 140 141 details = ev.acf.detalii ? `<p><b>Detalii:</b> <br>${ev.acf.detalii}</p>` : ''; 142 143 container.innerHTML += ` 144 <div class="events-calendar-item"> 145 <div class="events-calendar-header"> 146 <h4>${title}</h4> 147 </div> 148 <div> 149 <p><b>DatÄ:</b> ${date.trim()}</p> 150 <p><b>Organizator:</b> ${ev.acf.organizator}</p> 151 <p><b>LocaÈie:</b> ${ev.acf.loc_de_desfaÈurare}</p> 152 <p><b>ParticipanÈi:</b> ${(ev.acf.participa.split("\n").length > 1) ? '<br>' : ''}${ev.acf.participa}</p> 153 ${details} 154 </div> 155 </div> 156 `; 157 }); 158 } else { 159 container.innerHTML += `<div class="events-calendar-item"><h5 class="events-calendar-no-events">Nu au fost gÄsite evenimente recente.</h5></div>`; 160 } 161 }) 162 .catch(error => { 163 console.error(`Error fetching last ${numberOfEvents} events:`, error); 164 const container = document.getElementById(containerId); 165 if (container) { 166 container.innerHTML = `<div class="events-calendar-item"><h5 class="events-calendar-no-events">Eroare la încÄrcarea evenimentelor.</h5></div>`; 167 } 168 }); 169 } 170 171 // --- Highlight today + load events on page load --- 172 const todayStr = new Date().toLocaleDateString('en-CA'); 173 selectedDate = todayStr; 174 displayEvents(todayStr); 175 displayLastEvents(3); 176 calendar.render(); 177}); 178 179
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.