var WEEKDAYS = ["Пн", "Вт", "Ср", "Чт", "Пт", "Сб", "Вс"]; var MONTHS = [ "Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь" ]; var now = new Date(); var view = { year: now.getFullYear(), month: now.getMonth() }; var selected = null; var gridEl = document.getElementById("grid"); var monthNameEl = document.getElementById("monthName"); var hintEl = document.getElementById("hint"); function pad(n) { return (n < 10 ? "0" : "") + n; } function fmt(d) { return pad(d.getDate()) + "." + pad(d.getMonth() + 1) + "." + d.getFullYear(); } function renderWeekdays() { document.getElementById("weekdays").innerHTML = WEEKDAYS.map(function (w) { return "" + w + ""; }).join(""); } function render() { monthNameEl.textContent = MONTHS[view.month] + " " + view.year; var first = new Date(view.year, view.month, 1); var startPad = (first.getDay() + 6) % 7; var daysInMonth = new Date(view.year, view.month + 1, 0).getDate(); var prevDays = new Date(view.year, view.month, 0).getDate(); var html = ""; for (var i = startPad - 1; i >= 0; i--) { html += '
' + (prevDays - i) + "
"; } for (var d = 1; d <= daysInMonth; d++) { var cls = "day"; var date = new Date(view.year, view.month, d); var isToday = date.getFullYear() === now.getFullYear() && date.getMonth() === now.getMonth() && date.getDate() === now.getDate(); if (isToday) cls += " today"; if (selected && fmt(date) === fmt(selected)) cls += " selected"; html += '
' + d + "
"; } var endPad = 7 - ((startPad + daysInMonth) % 7); if (endPad < 7) { for (var j = 1; j <= endPad; j++) { html += '
' + j + "
"; } } gridEl.innerHTML = html; } function changeMonth(delta) { view.month += delta; if (view.month < 0) { view.month = 11; view.year--; } if (view.month > 11) { view.month = 0; view.year++; } selected = null; render(); } function goToday() { now = new Date(); view = { year: now.getFullYear(), month: now.getMonth() }; selected = null; render(); } gridEl.addEventListener("click", function (e) { var day = e.target.closest(".day"); if (!day || day.classList.contains("empty")) return; selected = new Date(view.year, view.month, parseInt(day.textContent, 10)); hintEl.textContent = "Выбрано: " + fmt(selected); render(); }); document.getElementById("prev").addEventListener("click", function () { changeMonth(-1); }); document.getElementById("next").addEventListener("click", function () { changeMonth(1); }); document.getElementById("today").addEventListener("click", goToday); renderWeekdays(); render();