Загрузка данных
// Длительность одного цикла сна - 90 минут
const CYCLE_LENGTH = 90;
// Время на засыпание - 15 минут
const FALL_ASLEEP_TIME = 15;
// Получаем элементы со страницы
const tabSleepNow = document.getElementById('tab-sleep-now');
const tabWakeUp = document.getElementById('tab-wake-up');
const panelSleepNow = document.getElementById('panel-sleep-now');
const panelWakeUp = document.getElementById('panel-wake-up');
const btnCalcNow = document.getElementById('btn-calc-now');
const btnCalcWake = document.getElementById('btn-calc-wake');
const wakeTimeInput = document.getElementById('wake-time');
const resultsContainer = document.getElementById('results-container');
const resultsTitle = document.getElementById('results-title');
const timesList = document.getElementById('times-list');
// --- ЛОГИКА ПЕРЕКЛЮЧЕНИЯ ВКЛАДОК ---
function switchTab(activeTab, inactiveTab, activePanel, inactivePanel) {
activeTab.classList.add('active');
inactiveTab.classList.remove('active');
activePanel.classList.add('active');
inactivePanel.classList.remove('active');
resultsContainer.classList.add('hidden');
}
tabSleepNow.addEventListener('click', () => {
switchTab(tabSleepNow, tabWakeUp, panelSleepNow, panelWakeUp);
});
tabWakeUp.addEventListener('click', () => {
switchTab(tabWakeUp, tabSleepNow, panelWakeUp, panelSleepNow);
});
// --- МАТЕМАТИКА И ВЫВОД РЕЗУЛЬТАТОВ ---
// Функция для форматирования времени (например, из 7:5 в 07:05)
function formatTime(date) {
let hours = date.getHours().toString().padStart(2, '0');
let minutes = date.getMinutes().toString().padStart(2, '0');
return `${hours}:${minutes}`;
}
// Функция отрисовки списка времени
function renderTimes(times, isWakeUpMode) {
timesList.innerHTML = '';
times.forEach(item => {
const li = document.createElement('li');
li.className = 'time-item';
// Зеленый цвет для оптимальных 5-6 циклов
if (item.cycles === 5 || item.cycles === 6) {
li.classList.add('optimal');
}
let cycleText = `(${item.cycles} циклов сна)`;
li.innerHTML = `
<span class="time-val">${formatTime(item.time)}</span>
<span class="time-cycles">${cycleText}</span>
`;
timesList.appendChild(li);
});
resultsContainer.classList.remove('hidden');
}
// Сценарий 1: Лечь прямо сейчас
btnCalcNow.addEventListener('click', () => {
let now = new Date();
// Добавляем 15 минут
now.setMinutes(now.getMinutes() + FALL_ASLEEP_TIME);
let sleepTimes = [];
for (let i = 6; i >= 1; i--) {
let cycleTime = new Date(now.getTime() + (i * CYCLE_LENGTH * 60000));
sleepTimes.push({ time: cycleTime, cycles: i });
}
resultsTitle.textContent = "Вам нужно проснуться в:";
renderTimes(sleepTimes, true);
});
// Сценарий 2: Проснуться в заданное время
btnCalcWake.addEventListener('click', () => {
if (!wakeTimeInput.value) return;
let [hours, minutes] = wakeTimeInput.value.split(':');
let wakeDate = new Date();
wakeDate.setHours(hours);
wakeDate.setMinutes(minutes);
let sleepTimes = [];
for (let i = 6; i >= 1; i--) {
let sleepTime = new Date(wakeDate.getTime() - (i * CYCLE_LENGTH * 60000) - (FALL_ASLEEP_TIME * 60000));
sleepTimes.push({ time: sleepTime, cycles: i });
}
resultsTitle.textContent = "Вам нужно лечь спать в:";
renderTimes(sleepTimes, false);
});