Exam Timetables
Access and manage examination timetables for UCE, UACE, internal, and mock exams. Real-time editing with unlimited year support.
Real-time updates
UCE Examination Timetable
Term I, 2025
| Date | Day | Time | Subject | Paper | Venue |
|---|---|---|---|---|---|
| Loading timetable... | |||||
All examinations start promptly at the scheduled time. Students should arrive 30 minutes before the examination.
Admin Control
Quick Actions
Year Management
Add / Edit Exam
Add New Exam
Data Management
Action completed
`);
printWindow.document.close();
printWindow.print();
document.title = originalTitle;
}
// Event Listeners
document.addEventListener('DOMContentLoaded', () => {
initData();
renderTimetable();
// Flatpickr date picker
flatpickr("#examDate", {
dateFormat: "Y-m-d",
minDate: "today",
onChange: function(selectedDates, dateStr, instance) {
// Date selected
}
});
// Admin panel toggle
const adminToggle = document.getElementById('adminToggleBtn');
const adminPanel = document.getElementById('adminPanel');
const closeAdmin = document.getElementById('closeAdminBtn');
adminToggle.addEventListener('click', () => {
adminPanel.classList.toggle('active');
adminToggle.classList.toggle('active');
resetForm();
});
closeAdmin.addEventListener('click', () => {
adminPanel.classList.remove('active');
adminToggle.classList.remove('active');
});
// Selector changes
document.getElementById('examTypeSelect').addEventListener('change', () => {
renderTimetable();
updateYearManager();
});
document.getElementById('termSelect').addEventListener('change', renderTimetable);
document.getElementById('applyYearBtn').addEventListener('click', renderTimetable);
document.getElementById('yearSelect').addEventListener('change', renderTimetable);
// Admin buttons
document.getElementById('addExamBtn').addEventListener('click', () => {
resetForm();
adminPanel.classList.add('active');
adminToggle.classList.add('active');
});
document.getElementById('editExamBtn').addEventListener('click', editSelectedExam);
document.getElementById('deleteExamBtn').addEventListener('click', deleteSelectedExam);
document.getElementById('addYearBtn').addEventListener('click', addNewYear);
document.getElementById('exportExcelBtn').addEventListener('click', exportToExcel);
document.getElementById('exportJsonBtn').addEventListener('click', exportBackup);
document.getElementById('importBackupBtn').addEventListener('click', importBackup);
document.getElementById('clearAllBtn').addEventListener('click', clearAllData);
document.getElementById('printBtn').addEventListener('click', printTimetable);
document.getElementById('importFileInput').addEventListener('change', handleFileImport);
// Save exam form
document.getElementById('saveExamBtn').addEventListener('click', () => {
const examData = {
date: document.getElementById('examDate').value,
time: document.getElementById('examTime').value,
subject: document.getElementById('examSubject').value,
paper: document.getElementById('examPaper').value,
venue: document.getElementById('examVenue').value
};
if (!examData.date || !examData.subject || !examData.venue) {
showToast('Please fill in all required fields', true);
return;
}
if (currentEditId) {
updateExam(currentEditId, examData);
} else {
addExam(examData);
}
resetForm();
});
});
// Scroll Animation
const faders = document.querySelectorAll('.fade-up');
const appearOptions = { threshold: 0.2, rootMargin: "0px 0px -20px 0px" };
const appearOnScroll = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
appearOnScroll.unobserve(entry.target);
}
});
}, appearOptions);
faders.forEach(el => appearOnScroll.observe(el));
