let TEST_DATA = {} let INTERVAL_HANDLE = null; function print_time_left(t) { let timerS = document.getElementById("timer"); let hours = Math.floor(t / 3600); t -= hours * 3600; let minutes = Math.floor(t / 60); t -= minutes * 60; let seconds = t; timerS.innerHTML = String(hours).padStart(2, "0") + ":" + String(minutes).padStart(2, "0") + ":" + String(seconds).padStart(2, "0"); } function populate_infobox(test_data) { if (INTERVAL_HANDLE !== null) { clearInterval(INTERVAL_HANDLE); } let test_concluded = TEST_DATA["state"] === "concluded"; let game_nameS = document.getElementById("game_name"); let durationS = document.getElementById("duration"); let percentageS = document.getElementById("percentage"); game_nameS.innerHTML = test_data["gamename"]; if (test_concluded) { let summary = test_data["summary"]; let correct_answer_n = summary["correct_answer_n"]; let challenge_n = summary["challenge_n"]; let r = Math.ceil((correct_answer_n / challenge_n) * 100); percentageS.innerHTML = `${r}% (${correct_answer_n}/${challenge_n})`; let start_time = unix_time_to_human_readable(test_data["start_time"]); let end_time = unix_time_to_human_readable(test_data["end_time"]); durationS.value = `${start_time} - ${end_time}`; hide("ongoing-info"); show("concluded-info"); } else { if (test_data["time_limited"]) { let time_left_s = Number(test_data["end_limit_time"]) - Number(test_data["current_time"]); print_time_left(time_left_s); INTERVAL_HANDLE = setInterval(() => { time_left_s--; print_time_left(time_left_s); if (time_left_s <= 0) { populate_all(test_data["_id"]); clearInterval(INTERVAL_HANDLE); INTERVAL_HANDLE = null; } }, 1000); } show("ongoing-info"); hide("concluded-info"); } } function populate_challenges(test_data) { let test_display = document.getElementById("test_display"); test_display.innerHTML = ""; let test_concluded = TEST_DATA["state"] === "concluded"; let challenge_N = 0; test_data["challenges"].forEach((challenge) => { let challenge_N_snapshot = challenge_N; let challenge_box = document.createElement("section"); challenge_box.classList.add("challenge"); let question = document.createElement("span"); question.classList.add("question"); question.innerHTML = preprocess_inserts(challenge["question"]); let answer_container = document.createElement("section"); answer_container.classList.add("answer-container"); challenge_box.append(question, answer_container); let answer_N = 0; let player_answer = challenge["player_answer"]; player_answer = (player_answer !== "") ? Number(player_answer) : -1; challenge["answers"].forEach((answer) => { let answer_section = document.createElement("section"); answer_section.classList.add("answer"); let answer_radio = document.createElement("input"); answer_radio.type = "radio"; answer_radio.id = `${challenge_N}_${answer_N}`; answer_radio.name = `challenge_${challenge_N}`; answer_radio.disabled = test_concluded; let answer_N_snapshot = answer_N; answer_radio.addEventListener("input", () => { save_answer(challenge_N_snapshot, answer_N_snapshot); }); if (player_answer === answer_N) { answer_radio.checked = true; } let answer_text = document.createElement("label"); answer_text.innerHTML = preprocess_inserts(answer); answer_text.setAttribute("for", answer_radio.id); if (test_concluded && (challenge["correct_answer"] === answer_N)) { answer_text.classList.add("correct-answer") } answer_section.append(answer_radio, answer_text); answer_container.appendChild(answer_section); answer_N++; }); challenge_N++; test_display.appendChild(challenge_box); }); MathJax.typeset(); } function populate_all(test_id) { let req = { action: "get_test", testid: test_id } request(req).then(resp => { TEST_DATA = JSON.parse(resp); populate_challenges(TEST_DATA); populate_infobox(TEST_DATA); }); } function save_answer(chidx, aidx) { let req = { action: "save_answer", testid: TEST_DATA["_id"], challenge_index: chidx, answer_index: aidx, }; request(req); } function preprocess_inserts(str) { let code_delim = '`'; let parts = str.split(code_delim); let res = ""; for (let i = 0; i < parts.length; i++) { res += parts[i]; if (i % 2 === 0) { res += ""; } else { res += ""; } } return res; } function submit_test() { let req = { action: "submit_test", testid: TEST_DATA["_id"] } request(req).then(resp => { populate_all(TEST_DATA["_id"]); }); }