1document.addEventListener('DOMContentLoaded', function() { 2 if (!document.querySelector('#events_section')) return; 3 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ вÑе ÑлеменÑÑ ÑпиÑка ÑобÑÑий 4 const eventItems = document.querySelectorAll('.item_list_block_events_block'); 5 6 // ÐÐ°Ñ Ð¾Ð´Ð¸Ð¼ оÑновной блок, коÑоÑÑй бÑдем обновлÑÑÑ 7 const bigBlock = document.querySelector('.big_block_events_block'); 8 const bigDate = bigBlock.querySelector('.big_date'); 9 const bigTitle = bigBlock.querySelector('.big_title'); 10 const bigDescriptions = bigBlock.querySelector('.big_descriptions'); 11 const bigTimer = bigBlock.querySelector('.big_timer'); 12 const bigImage = bigBlock.querySelector('.big_block_events_block_image'); 13 14 // ID инÑеÑвала Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑаймеÑа 15 let timerInterval; 16 17 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°ÑÑ (из ÑоÑмаÑа DD.MM.YYYY в DD меÑÑÑа) 18 function formatDate(dateStr) { 19 // ÐÑовеÑÑем ÑоÑÐ¼Ð°Ñ Ð´Ð°ÑÑ 20 if (dateStr.includes('.')) { 21 // ФоÑÐ¼Ð°Ñ DD.MM.YYYY 22 const parts = dateStr.split('.'); 23 if (parts.length === 3) { 24 const day = parts[0];
25 const month = parseInt(parts[1], 10); 26 27 // ÐаÑÑив Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñми меÑÑÑев в ÑодиÑелÑном падеже 28 const monthNames = [ 29 'ÑнваÑÑ', 'ÑевÑалÑ', 'маÑÑа', 'апÑелÑ', 'маÑ', 'иÑнÑ', 30 'иÑлÑ', 'авгÑÑÑа', 'ÑенÑÑбÑÑ', 'окÑÑбÑÑ', 'ноÑбÑÑ', 'декабÑÑ' 31 ]; 32 33 return day + ' ' + monthNames[month - 1]; 34 } 35 } 36 37 // ÐÑли ÑоÑÐ¼Ð°Ñ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ DD.MM.YYYY или не ÑдалоÑÑ Ð¿ÑеобÑазоваÑÑ, 38 // возвÑаÑаем иÑÑ Ð¾Ð´Ð½ÑÑ ÑÑÑÐ¾ÐºÑ 39 return dateStr; 40 } 41 42 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿Ð°ÑÑинга даÑÑ Ð² JavaScript Date обÑÐµÐºÑ 43 function parseDate(dateStr) { 44 // ÐÑовеÑÑем два ÑоÑмаÑа даÑÑ: DD.MM.YYYY и "DD ÐеÑÑÑа" 45 if (dateStr.includes('.')) { 46 // ФоÑÐ¼Ð°Ñ DD.MM.YYYY 47 const parts = dateStr.split('.'); 48 if (parts.length === 3) { 49 const day = parseInt(parts[0], 10);
50 const month = parseInt(parts[1], 10) - 1; // меÑÑÑÑ Ð² JS наÑинаÑÑÑÑ Ñ 0 51 const year = parseInt(parts[2], 10); 52 53 return new Date(year, month, day, 0, 0, 0); // 00:00:00 54 //return new Date(year, month, day, 12, 0, 0); // 12:00:00 55 } 56 } else { 57 // ФоÑÐ¼Ð°Ñ "DD ÐеÑÑÑа" (напÑимеÑ, "05 апÑелÑ") 58 const parts = dateStr.trim().split(' '); 59 if (parts.length === 2) { 60 const day = parseInt(parts[0], 10); 61 62 // ÐаÑÑив Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñми меÑÑÑев в ÑодиÑелÑном падеже 63 const monthNames = [ 64 'ÑнваÑÑ', 'ÑевÑалÑ', 'маÑÑа', 'апÑелÑ', 'маÑ', 'иÑнÑ', 65 'иÑлÑ', 'авгÑÑÑа', 'ÑенÑÑбÑÑ', 'окÑÑбÑÑ', 'ноÑбÑÑ', 'декабÑÑ' 66 ]; 67 68 const month = monthNames.indexOf(parts[1]); 69 if (month !== -1) { 70 const currentYear = new Date().getFullYear(); 71 return new Date(currentYear, month, day, 12, 0, 0); // 12:00:00 72 } 73 } 74 } 75 76 // ÐÑли не ÑдалоÑÑ ÑаÑпознаÑÑ Ð´Ð°ÑÑ, возвÑаÑаем ÑекÑÑÑÑ Ð´Ð°ÑÑ 77 return new Date(); 78 } 79 80 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑаймеÑа 81 function updateTimer(targetDate) { 82 // ÐÑиÑаем пÑедÑдÑÑий инÑеÑвал, еÑли он бÑл 83 if (timerInterval) { 84 clearInterval(timerInterval); 85 } 86 87 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑаÑÑеÑа оÑÑавÑегоÑÑ Ð²Ñемени 88 function calculateTimeLeft() { 89 const now = new Date(); 90 const targetTime = new Date(targetDate); 91 92 // ÐÑли даÑа Ñже пÑоÑла, Ñо ÑÑÑанавливаем вÑÐµÐ¼Ñ Ð½Ð° Ð¿Ð¾Ð»Ð´ÐµÐ½Ñ ÑледÑÑÑего Ð´Ð½Ñ 93 if (targetTime < now) { 94 targetTime.setDate(targetTime.getDate() + 1); 95 } 96 97 const difference = targetTime - now; 98 99 // ÐÑли ÑазниÑа оÑÑиÑаÑелÑÐ½Ð°Ñ (даÑа Ñже пÑоÑла), возвÑаÑаем нÑли 100 if (difference <= 0) { 101 return { 102 days: 0, 103 hours: 0, 104 minutes: 0 105 }; 106 } 107 108 // РаÑÑÑиÑÑваем оÑÑавÑееÑÑ Ð²ÑÐµÐ¼Ñ 109 const days = Math.floor(difference / (1000 * 60 * 60 * 24)); 110 const hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)); 111 const minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)); 112 113 return { 114 days, 115 hours, 116 minutes 117 }; 118 } 119 120 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑаймеÑа 121 function displayTimer() { 122 const timeLeft = calculateTimeLeft(); 123 124 // ФоÑмаÑиÑÑем вÑвод Ñ Ð¿ÑавилÑнÑми оконÑаниÑми 125 const daysText = formatDeclension(timeLeft.days, ['денÑ', 'днÑ', 'дней']); 126 const hoursText = formatDeclension(timeLeft.hours, ['ÑаÑ', 'ÑаÑа', 'ÑаÑов']); 127 const minutesText = formatDeclension(timeLeft.minutes, ['минÑÑа', 'минÑÑÑ', 'минÑÑ']); 128 129 // ÐÑеобÑазÑем ÑиÑла в двÑзнаÑнÑй ÑоÑÐ¼Ð°Ñ 130 const daysFormatted = String(timeLeft.days).padStart(2, '0'); 131 const hoursFormatted = String(timeLeft.hours).padStart(2, '0'); 132 const minutesFormatted = String(timeLeft.minutes).padStart(2, '0'); 133 134 // Создаем HTML-ÑÑÑÑкÑÑÑÑ 135 bigTimer.innerHTML = ` 136 <div class="_day"> 137 <span class="num"> 138 ${daysFormatted} 139 </span> 140 <span class="text">${daysText}</span> 141 </div> 142 <div class="_hour">
143 <span class="num"> 144 ${hoursFormatted} 145 </span> 146 <span class="text">${hoursText}</span> 147 </div> 148 <div class="_minut"> 149 <span class="num"> 150 ${minutesFormatted} 151 </span> 152 <span class="text">${minutesText}</span> 153 </div> 154 `; 155 } 156 157 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð²ÑбоÑа пÑавилÑного ÑÐºÐ»Ð¾Ð½ÐµÐ½Ð¸Ñ Ñлова в завиÑимоÑÑи Ð¾Ñ ÑиÑла 158 function formatDeclension(number, titles) { 159 const cases = [2, 0, 1, 1, 1, 2]; 160 return titles[ 161 (number % 100 > 4 && number % 100 < 20) 162 ? 2 163 : cases[(number % 10 < 5) ? number % 10 : 5] 164 ]; 165 } 166 167 // ÐÑобÑажаем ÑÐ°Ð¹Ð¼ÐµÑ ÑÑÐ°Ð·Ñ 168 displayTimer(); 169 170 // ÐбновлÑем ÑÐ°Ð¹Ð¼ÐµÑ ÐºÐ°Ð¶Ð´ÑÑ Ð¼Ð¸Ð½ÑÑÑ 171 timerInterval = setInterval(displayTimer, 60000); 172 } 173 174 // ФÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑого блока даннÑми из маленÑкого 175 function updateBigBlock(item) { 176 // ÐолÑÑаем даннÑе из кликнÑÑого ÑлеменÑа 177 const smallDate = item.querySelector('.bl_date').textContent.trim(); 178 const smallTitle = item.querySelector('.bl_description').textContent.trim().replace('ÐабÑониÑоваÑÑ', '').trim(); 179 const smallDescription = item.querySelector('.hide_description') 180 ? item.querySelector('.hide_description').textContent.trim() 181 : ''; 182 const smallImage = item.querySelector('.bl_img img').getAttribute('src'); 183 184 // ФоÑмаÑиÑÑем даÑÑ Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ 185 const formattedDate = formatDate(smallDate); 186 187 // ÐбновлÑем даннÑе в болÑÑом блоке 188 bigDate.textContent = formattedDate; 189 bigTitle.textContent = smallTitle; 190 bigDescriptions.textContent = smallDescription; 191 192 // ÐбновлÑем изобÑажение, еÑли еÑÑÑ 193 if (smallImage && smallImage !== '') { 194 bigImage.setAttribute('src', smallImage); 195 } 196 197 // ÐаÑÑим даÑÑ Ð´Ð»Ñ ÑаймеÑа 198 const targetDate = parseDate(smallDate); 199 200 // ÐбновлÑем ÑÐ°Ð¹Ð¼ÐµÑ 201 updateTimer(targetDate); 202 } 203 204 // ÐобавлÑем обÑабоÑÑик клика Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑлеменÑа ÑпиÑка 205 eventItems.forEach(function(item) { 206 item.addEventListener('click', function() { 207 updateBigBlock(this); 208 }); 209 }); 210 211 // ÐниÑиализиÑÑем ÑÐ°Ð¹Ð¼ÐµÑ Ð´Ð»Ñ Ð¿ÐµÑвого ÑобÑÑÐ¸Ñ Ð¿Ñи загÑÑзке ÑÑÑаниÑÑ 212 if (eventItems.length > 0) { 213 updateBigBlock(eventItems[0]); 214 } 215 216}); 217 218 219
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.