//Function to get date
function get_day(d){
if(!d) d = new Date();
const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
let output = days[d.getDay()] + ", " + months[d.getMonth()] + " " + d.getDate();
switch(d.getDate()){
case 1:
output += "st";
break;
case 2:
output += "nd";
break;
case 3:
output += "rd";
break;
default:
output += "th";
}
return output;
}
function hide_dialog(selector){
const obj = document.querySelector(selector);
if(obj) obj.innerHTML = "";
else console.log("hide_dialog: bad selector: \"" + selector + "\"");
}
document.querySelector(".banner").innerText = get_day();
function clear_all(){
for(const element of document.querySelectorAll(".column")){
element.innerHTML = "";
}
}
/* Load from database */
function draw_class(entry){
if(!(entry instanceof Array)){
console.log(entry);
console.log("Error loading classes");
return;
}
const id = entry[0];
const description = entry[1];
const code = entry[2];
const column_bool = entry[3];
const url = entry[4];
const columns = document.querySelectorAll(".column");
const insert_column = columns[column_bool];
//class_html
/*
*/
let class_html = "" +
"" + //box to draw add_assignment dialog in
""; //ul box to draw assignments in
insert_column.innerHTML += class_html;
}
function draw_assignment(entry){
if(!(entry instanceof Array)){
console.log(entry);
console.log("Error loading assignment");
return;
}
let id = entry[0];
let class_id = entry[1];
let due_date = entry[2];
let due_date_alt = entry[3];
let desc = entry[4];
let color = entry[5];
let highlight = entry[6];
let done = entry[7];
let link = entry[8];
//custom element handling (based on php)
/*
if($due_date != "ASAP" && $due_date != ""){
$due_date_pieces = explode(" ", $due_date);
$due_date_num = date('z', mktime(0, 0, 0, substr($due_date_pieces[1], 0, 2), substr($due_date_pieces[1], 3, 2), date('Y')));
if($due_date_num - date('z') <= 1 && $color != "black" && $color != "brown") $color = "red";
if((!$done && ($due_date_num - date('z') <= 0)) || ($highlight == "orange" && ($due_date_num - date('z') <= 7))) $highlight = "yellow";
}
if($highlight != "none" && $color == "gray") $color = "black";
if($done){
$color = "green";
$highlight = "none";
}
*/
if(!highlight) highlight = "none";
let due_date_pieces;
let due_date_object;
if(due_date){
due_date_pieces = due_date.split("-");
due_date_object = new Date(due_date_pieces[0], due_date_pieces[1]-1, due_date_pieces[2]);
}
if(highlight != "none" && color == "gray") color = "black";
if(done == 1){
color = "green";
highlight = "none";
}
const box = document.querySelector("#assignment_list_" + class_id);
/* reference:
print "";
if($done) print " ✔"; // "✅";
print "";
print ($due_date != "" ? "$due_date: " : "") . "$desc";
print "";
print "";
*/
const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
let assignment_html = "";
if(done == 1) assignment_html += " ✔";
assignment_html += "";
if(due_date){
assignment_html += days[due_date_object.getDay()] + ", ";
if(due_date_object.getMonth()+1 < 11) assignment_html += "0";
assignment_html += due_date_object.getMonth()+1 + "/";
if(due_date_object.getDate()+1 < 11) assignment_html += "0";
assignment_html += due_date_object.getDate()
}
else assignment_html += due_date_alt;
assignment_html += ": ";
if(link) assignment_html += "";
assignment_html += desc;
if(link) assignment_html += "";
assignment_html += "" +
"" +
"" +
"" +
"" +
" " +
""; //box to draw add_assignment dialog in
box.innerHTML += assignment_html;
}
function load_data(mode){
let type;
if(mode == "classes") type = "load_classes";
else if(mode == "assignments") type = "load_assignments";
else{
console.log("Error: Unknown data to load. Only \"classes\" and \"assignments\" are supported arguments");
return;
}
let url = "backend/backend.php";
let data = "type=" + type;
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
console.log(JSON.parse(this.response));
for(const entry of JSON.parse(this.response)){
if(mode == "classes") draw_class(entry);
else if(mode == "assignments") draw_assignment(entry);
}
}
xhttp.send(data);
}
/* add a new class */
//show dialog
function draw_add_class(id){
let box;
if(!id) box = document.querySelector("#add_class_box");
else box = document.querySelector("#add_assignment_box_" + id);
const add_class_html = document.querySelector("#add_class_html").innerHTML;
const buttons = "" +
"";
box.innerHTML = add_class_html;
box.querySelector(".submit_box").innerHTML = buttons;
}
//hide dialog
function hide_add_class(id){
if(!id) hide_dialog("#add_class_box");
else hide_dialog("#add_assignment_box_" + id);
}
//submit dialog
function submit_add_class(id){
const code = document.querySelector("[name = add_class_id]").value;
const name = document.querySelector("[name = add_class_desc]").value;
const link = document.querySelector("[name = add_class_link]").value;
const location = document.querySelector("[name = add_class_location]").value;
//check that class ID is not null
if(code == ""){
alert("Missing Class ID");
return;
}
//TODO create array instead
let url = "backend/backend.php";
let data = "type=save_class" +
"&add_class_desc=" + encodeURIComponent(name) +
"&add_class_id=" + encodeURIComponent(code) +
"&add_class_location=" + encodeURIComponent(location) +
"&add_class_link=" + encodeURIComponent(link);
if(id) data += "&id=" + encodeURIComponent(id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
if(this.response.indexOf("Success") > -1){
if(!id) alert("Successfully added class '" + code + "'");
hide_add_class(id);
clear_all();
load_data("classes");
load_data("assignments");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
/* add assignment to class */
//show dialog
function draw_add_assignment(id, ass_id){
let box;
if(!ass_id) box = document.querySelector("#add_assignment_box_" + id);
else box = document.querySelector("#edit_assignment_box_" + ass_id);
const add_assignment_html = document.querySelector("#add_assignment_html").innerHTML;
const buttons = "" +
"";
box.innerHTML = add_assignment_html;
box.querySelector(".submit_box").innerHTML = buttons;
}
//hide dialog
function hide_add_assignment(id, ass_id){
if(!ass_id) hide_dialog("#add_assignment_box_" + id);
else hide_dialog("#edit_assignment_box_" + ass_id);
}
//submit dialog
function submit_add_assignment(id, ass_id){
let box;
if(!ass_id) box = document.querySelector("#add_assignment_box_" + id);
else box = document.querySelector("#edit_assignment_box_" + ass_id);
const class_id = id;
const due_date = box.querySelector("[name = add_due_date]").value; //formatted YYYY-MM-DD
const due_date_alt = box.querySelector("[name = add_due_date_alt]").value;
const desc = box.querySelector("[name = add_desc]").value;
const color = box.querySelector("[name = add_color]").value;
const highlight = box.querySelector("[name = add_highlight]").value;
const link = box.querySelector("[name = add_link]").value;
//check that desc is not null
if(desc == ""){
alert("Missing Assignment Description/Title");
return;
}
let url = "backend/backend.php";
//TODO create array instead
let data = "type=save_assignment" +
"&add_class_id=" + encodeURIComponent(class_id) +
"&add_due_date=" + encodeURIComponent(due_date) +
"&add_due_date_alt=" + encodeURIComponent(due_date_alt) +
"&add_desc=" + encodeURIComponent(desc) +
"&add_color=" + encodeURIComponent(color) +
"&add_highlight=" + encodeURIComponent(highlight) +
"&add_link=" + encodeURIComponent(link);
if(ass_id) data += "&id=" + encodeURIComponent(ass_id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, true);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
if(this.response.indexOf("Success") > -1){
if(!id) alert("Successfully added assignment '" + desc + "'");
hide_add_assignment(id);
clear_all();
load_data("classes");
load_data("assignments");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
/* edit a class */
function draw_edit_class(id){
draw_add_class(id);
//load values
let url = "backend/backend.php";
let data = "type=load_classes" +
"&id=" + encodeURIComponent(id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
const response = JSON.parse(this.response);
if(response[0] instanceof Array){
document.querySelector("[name = add_class_id]").value = response[0][2];
document.querySelector("[name = add_class_desc]").value = response[0][1];
document.querySelector("[name = add_class_link]").value = response[0][4];
document.querySelector("[name = add_class_location]").value = (response[0][3] == "0" ? "left" : "right");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
/* delete a class */
function delete_class(id){
let prompt = confirm("Are you sure you want to delete this class?");
if(!prompt) return;
//note that classes are not deleted, just set to hidden
let url = "backend/backend.php";
let data = "type=delete_class" +
"&id=" + encodeURIComponent(id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
if(this.response.indexOf("Success") > -1){
clear_all();
load_data("classes");
load_data("assignments");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
/* edit an assignment */
function draw_edit_assignment(id, ass_id){
draw_add_assignment(id, ass_id);
//load values
const box = document.querySelector("#edit_assignment_box_" + ass_id);
let url = "backend/backend.php";
let data = "type=load_assignments" +
"&id=" + encodeURIComponent(ass_id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
console.log(this.response);
const response = JSON.parse(this.response);
if(response[0] instanceof Array){
box.querySelector("[name = add_due_date]").value = response[0][2];
box.querySelector("[name = add_due_date_alt]").value = response[0][3];
box.querySelector("[name = add_desc]").value = response[0][4];
box.querySelector("[name = add_color]").value = response[0][5];
box.querySelector("[name = add_highlight]").value = response[0][6];
box.querySelector("[name = add_link]").value = response[0][8];
}
};
xhttp.send(data);
return false;
}
/* clone an assignment */
function clone_assignment(id){
let url = "backend/backend.php";
let data = "type=clone_assignment" +
"&id=" + encodeURIComponent(id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
if(this.response.indexOf("Success") > -1){
clear_all();
load_data("classes");
load_data("assignments");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
/* toggle assignment complete */
function toggle_done(id){
const box = document.querySelector("#edit_assignment_box_" + id);
let url = "backend/backend.php";
let data = "type=toggle_done" +
"&id=" + encodeURIComponent(id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
if(this.response.indexOf("Success") > -1){
clear_all();
load_data("classes");
load_data("assignments");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
/* delete an assignment */
function delete_assignment(id){
let prompt = confirm("Are you sure you want to delete this assignment?");
if(!prompt) return;
//note that classes are not deleted, just set to hidden
let url = "backend/backend.php";
let data = "type=delete_assignment" +
"&id=" + encodeURIComponent(id);
console.log(data);
let xhttp = new XMLHttpRequest();
xhttp.open("POST", url, false);
xhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhttp.onload = function(){
if(this.response.indexOf("Success") > -1){
clear_all();
load_data("classes");
load_data("assignments");
}
console.log(this.response);
};
xhttp.send(data);
return false;
}
load_data("classes");
load_data("assignments");