Files
swaous.asuscomm.com/site/skedul/main.js
Lazy Hippopotamus 099bfceb7e
All checks were successful
Swaous.Asuscomm Build / Build-Docker-Image (push) Successful in 35s
slight updates
2025-02-24 16:46:32 -05:00

104 lines
4.0 KiB
JavaScript

function tohours(mns) { // convert a value in minutes to a 24-hour timestamp, e.g. 330 -> 0530
let hour = Math.floor(mns / 60);
let minute = mns % 60;
return hour * 100 + minute;
}
function tomins(hrs) { // convert a value in 24-hour to minutes, the inverse of tohours
let hour = Math.floor(hrs / 100);
let minute = hrs % 100;
return hour * 60 + minute;
}
const daystart = tomins(1000);
function zpad(thing, zeroes) { // left-pad a string with zeroes
thing = "" + thing;
while (thing.length < zeroes) {
thing = "0" + thing;
}
return thing;
}
function tonicehrs(hrs) { // convert a value in 24-hour to a string (800 -> "08:00", 1645 -> "16:45")
let hour = Math.floor(hrs / 100);
if (hour > 12) {
hour -= 12;
}
let minute = hrs % 100;
return zpad(hour, 2) + ":" + zpad(minute, 2);
}
function tablesetup() {
for (var i = 0; i < 11 * 4; i ++) {
let row = document.createElement("tr");
let time = tonicehrs(tohours(daystart + i * 15))
row.innerHTML = `<td>${time}<span>${time}</span></td><td></td><td></td><td></td><td></td><td></td>`;
document.querySelector("#schedule > tbody").appendChild(row);
}
}
function setClassTo(el, c, map) {
el.querySelector(".cname").innerText = c.name;
el.querySelector(".ctype").innerText = c.type;
el.querySelector(".bloc").href = map[c.building];
el.querySelector(".building").innerText = c.building;
el.querySelector(".room").innerText = c.room;
el.querySelector(".start").innerText = tonicehrs(c.start_time);
el.querySelector(".end").innerText = tonicehrs(c.end_time);
}
window.addEventListener("load", async () => {
let data = await (await fetch("data.json")).json();
document.getElementById("year").innerHTML = data.year;
document.getElementById("semester").innerHTML = data.semester;
document.getElementById("credits").innerHTML = data.credits;
tablesetup();
let tbody = document.querySelector("#schedule > tbody")
let curday = new Date().getDay();
let firstClass = undefined;
let nextClass = undefined;
let lastClass = undefined;
let now = new Date();
let curTime = now.getMinutes() + now.getHours() * 100;
let curTimeSnap = Math.round((tomins(curTime) - daystart) / 15);
tbody.children[curTimeSnap].children[curday].classList.add("youarehere");
for (let cls of data.week) {
for (let day of cls.days) {
if (day == curday) {
if (firstClass == undefined || cls.start_time < firstClass.start_time) {
firstClass = cls;
}
if (lastClass == undefined || cls.end_time > lastClass.end_time) {
lastClass = cls;
}
if (cls.start_time > curTime) {
if (nextClass == undefined || cls.start_time < nextClass.start_time) {
nextClass = cls;
}
}
}
let start = Math.floor((tomins(cls.start_time) - daystart) / 15);
let el = tbody.children[start].children[day];
el.classList.add("class");
let rows = Math.floor((tomins(cls.end_time) - tomins(cls.start_time)) / 15);
el.rowSpan = rows;
for (var i = start + 1; i < start + rows; i ++) { // cull the tds that this td is overlapping
tbody.children[i].removeChild(tbody.children[i].children[day]);
}
el.classList.add(cls.type);
el.innerHTML = `<span class="coursename">${cls.name}</span><span class="coursetype">${cls.type}</span> at <a href="${data.maps[cls.building]}" about="blank">${cls.building}</a> ${cls.room}`
}
}
if (firstClass) {
setClassTo(document.getElementById("firstclass"), firstClass, data.maps);
}
if (nextClass) {
setClassTo(document.getElementById("nextclass"), nextClass, data.maps);
}
if (lastClass) {
setClassTo(document.getElementById("lastclass"), lastClass, data.maps);
}
});