1document.addEventListener('DOMContentLoaded', function() { 2 // Tjek om kalenderen findes på denne side 3 if (!document.getElementById('openingHoursCalendar')) { 4 return; // Afslut hvis kalenderen ikke findes 5 } 6 7 let currentMonth = new Date().getMonth(); 8 let currentYear = new Date().getFullYear(); 9 let openingHoursData = null; 10 11 // Hent åbningstider via AJAX 12 function fetchOpeningHours() { 13 jQuery.ajax({ 14 url: zoo_calendar.ajaxurl, 15 type: 'POST', 16 data: { 17 action: 'get_calendar_hours', 18 nonce: zoo_calendar.nonce 19 }, 20 success: function(response) { 21 if (response.success && response.data.hours) { 22 openingHoursData = response.data.hours; 23 loadCalendar(); 24 } 25 } 26 }); 27 } 28 29 // Opdater måned display 30 function updateMonthDisplay() { 31 const monthDisplay = document.getElementById('monthDisplay'); 32 if (monthDisplay) { 33 monthDisplay.textContent = zooTranslations.months[currentMonth] + ' ' + currentYear; 34 } 35 } 36 37 // Få åbningstider for en specifik dato 38 function getOpeningHoursForDate(year, month, day) { 39 // Nytårsaften er altid lukket 40 if (month === 11 && day === 31) { 41 return 'Lukket'; 42 } 43 44 // YYYY-MM-DD format med korrekt padding 45 const dateStr = year + '-' + 46 (month + 1).toString().padStart(2, '0') + '-' + 47 day.toString().padStart(2, '0'); 48 49 // Check for specielle datoer 50 if (openingHoursData && openingHoursData.special_dates && openingHoursData.special_dates[dateStr]) { 51 return openingHoursData.special_dates[dateStr]; 52 } 53 54 // Returner standard åbningstid for måneden 55 if (openingHoursData && openingHoursData.default_hours) { 56 return openingHoursData.default_hours[month + 1] || 'Lukket'; 57 } 58 59 return 'Lukket'; 60 } 61 62 // Bestem dot class baseret på åbningstider 63 function getDotClass(hours) { 64 if (hours === 'Lukket') return ''; 65 66 // Tildel klasse baseret på lukketid 67 if (hours.includes('-')) { 68 const closeTime = parseInt(hours.split('-')[1]); 69 70 if (closeTime === 13) return 'very-early'; // orange 71 if (closeTime === 15) return 'early'; // grøn 72 if (closeTime === 17) return 'normal'; // blå 73 if (closeTime === 18) return 'medium'; // gul 74 if (closeTime === 19) return 'late'; // lilla 75 if (closeTime >= 20) return 'very-late'; // pink 76 } 77 78 return ''; 79} 80 81 // Load kalender 82 // Load kalender 83function loadCalendar() { 84 updateMonthDisplay(); 85 86 const uniqueHours = new Set(); 87 let hasClosedDays = false; 88 const daysContainer = document.getElementById('calendarDays'); 89 if (!daysContainer) return; 90 91 daysContainer.innerHTML = ''; 92 93 // Beregn første og sidste dag i måneden 94 const firstDay = new Date(currentYear, currentMonth, 1); 95 const lastDay = new Date(currentYear, currentMonth + 1, 0); 96 const daysInMonth = lastDay.getDate(); 97 98 // Tilføj tomme celler for dage før første dag i måneden 99 const firstDayWeekday = (firstDay.getDay() + 6) % 7; // Konverter til mandag-først format 100 for (let i = 0; i < firstDayWeekday; i++) { 101 const emptyCell = document.createElement('div'); 102 emptyCell.className = 'empty-day'; 103 daysContainer.appendChild(emptyCell); 104 } 105 106 // Tilføj dage i måneden 107 for (let day = 1; day <= daysInMonth; day++) { 108 const dayCell = document.createElement('div'); 109 dayCell.className = 'calendar-day'; 110 111 // Hent åbningstid for denne specifikke dato 112 const openingHours = getOpeningHoursForDate(currentYear, currentMonth, day); 113 114 // Saml unikke åbningstider til legend 115// Saml unikke åbningstider til legend 116if (openingHours !== 'Lukket' && openingHours !== 'LUKKET') { 117 uniqueHours.add(openingHours); 118} else { 119 hasClosedDays = true; 120} 121 // Bestem dot class 122 const dotClass = getDotClass(openingHours); 123 124 // Opret html for dagen 125 if (openingHours !== 'LUKKET') { 126 dayCell.innerHTML = ` 127 <div class="day-number">${day}</div> 128 <div class="dots-container"> 129 <div class="dot ${dotClass}"></div> 130 </div> 131 `; 132 } else { 133 dayCell.innerHTML = `<div class="day-number">${day}</div>`; 134 } 135 136 daysContainer.appendChild(dayCell); 137 } 138 139 // Hvis hele måneden er lukket (ingen åbningstider men har lukkede dage), tilføj "Lukket" til legend 140 if (hasClosedDays) { 141 uniqueHours.add('LUKKET'); 142 } 143 144 // Opdater forklaring 145 updateLegend(uniqueHours); 146} 147 148 // Opdater forklaring 149 function updateLegend(uniqueHours) { 150 const legendContainer = document.getElementById('legendContainer'); 151 if (!legendContainer) return; 152 153 legendContainer.innerHTML = ''; 154 155 // Sorter efter lukketid 156 const sortedHours = Array.from(uniqueHours).sort((a, b) => { 157 if (a.includes('-') && b.includes('-')) { 158 const [, aClose] = a.split('-').map(Number); 159 const [, bClose] = b.split('-').map(Number); 160 return aClose - bClose; 161 } 162 return 0; 163 }); 164 165 // Opret legend items
166 sortedHours.forEach(hours => { 167 const dotClass = getDotClass(hours); 168 legendContainer.innerHTML += ` 169 <div class="legend-item"> 170 <div class="legend-dot ${dotClass}"></div> 171 <div class="legend-text">à bningstid: ${hours}</div> 172 </div> 173 `; 174 }); 175 } 176 177 // Event handlers for måned navigation 178 window.changeMonth = function(delta) { 179 currentMonth += delta; 180 181 if (currentMonth < 0) { 182 currentMonth = 11; 183 currentYear--; 184 } else if (currentMonth > 11) { 185 currentMonth = 0; 186 currentYear++; 187 } 188 189 loadCalendar(); 190 }; 191 192 // Initial load 193 fetchOpeningHours(); 194});
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.