const validEntries = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"F", "E", "D", "D+", "C", "C+", "B", "B+", "A", "A+",
"f", "e", "d", "d+", "c", "c+", "b", "b+", "a", "a+",
"D.", "d.", "C.", "c.", "B.", "b.", "A.", "a."];
var rows = 4;
function addRow() {
for (var i = 0; i < 3; i++){
var newDiv = document.createElement('div');
newDiv.innerHTML = "
" + rows + "
";
newDiv.className = 'gpaInputs';
document.getElementById('gradesMain').appendChild(newDiv);
rows++;
}
}
function calculateGrade() {
var gradesElement = document.getElementById('gradesMain');
var gradesChildren = gradesElement.getElementsByTagName('input');
var cGpa = document.getElementById("total-gpa").value;
var cCredits = document.getElementById("total-credits").value;
var resultGpa;
var numGrades = 0;
var numCredits = 0;
var grades = [];
var credits = [];
var valid = true;
for (i = 0; i < gradesChildren.length; i++) {
if (gradesChildren[i].id == 'grade' && gradesChildren[i].value && gradesChildren[i + 1].value) {
grades.push(gradesChildren[i].value);
credits.push(gradesChildren[i + 1].value);
}
}
valid &= (cGpa >= 0 && cGpa <= 9);
for (var g in grades){
valid = valid && validEntries.includes(grades[g]) && credits[g] >= 0;
grades[g] = letterToNumber(grades[g]);
}
if (valid){
for (i = 0; i < grades.length; i++) {
numGrades = parseInt(numGrades) + parseInt(grades[i]) * parseInt(credits[i]);
numCredits = credits.reduce(function(pv, cv) { return parseInt(pv) + parseInt(cv); }, 0);
}
resultGpa = cCredits + numCredits != 0 ? (cCredits * cGpa + parseInt(numGrades)) / (parseInt(cCredits) + parseInt(numCredits)) : 0;
document.getElementById("gpa-results").style.display = "initial";
document.getElementById("error-message").innerHTML = "";
document.getElementById("credit-count").innerHTML = parseInt(cCredits) + parseInt(numCredits);
document.getElementById("grade-value").innerHTML = resultGpa.toFixed(2);
document.getElementById("grade-letter").innerHTML = numberToLetter(resultGpa);
}
else{
document.getElementById("gpa-results").style.display = "none";
document.getElementById("error-message").innerHTML = "At least one of your cells has an invalid entry. Please check whether or not you have filled in the right fields!";
document.getElementById("credit-count").innerHTML = "0";
document.getElementById('grade-value').innerHTML = "0";
document.getElementById('grade-letter').innerHTML = "0";
}
}
function toGradePoint(grades, credits) {
var grade = 0;
var numCredits = 0;
for (i = 0; i < grades.length; i++) {
grade = parseInt(grade) + parseInt(grades[i]) * parseInt(credits[i]);
numCredits = credits.reduce(function(pv, cv) { return parseInt(pv) + parseInt(cv); }, 0);
}
if (numCredits > 0) {
return grade / numCredits;
}
else {
return 0;
}
}
function numberToLetter(grade) {
grade = Math.floor(parseInt(grade));
switch (parseInt(grade)) {
case 9:
return "A+";
case 8:
return "A";
case 7:
return "B+";
case 6:
return "B";
case 5:
return "C+";
case 4:
return "C";
case 3:
return "D+";
case 2:
return "D";
case 1:
return "E";
case 0:
return "F";
}
}
function letterToNumber(letterGrade) {
switch (letterGrade)
{
case 'A+':
case 'A.':
case 'a.':
case 'a+':
return 9;
case 'A':
case 'a':
return 8;
case 'B+':
case 'B.':
case 'b+':
case 'b.':
return 7;
case 'B':
case 'b':
return 6;
case 'C+':
case 'C.':
case 'c.':
case 'c+':
return 5;
case 'C':
case 'c':
return 4;
case 'D+':
case 'D.':
case 'd+':
case 'd.':
return 3;
case 'D':
case 'd':
return 2;
case 'E':
case 'e':
return 1;
case 'F':
case 'f':
return 0;
default:
return letterGrade;
}
}
function clearInput() {
var gradesElement = document.getElementById('gradesMain');
var gradesChildren = gradesElement.getElementsByTagName('*');
document.getElementById("gpa-results").style.display = "none";
document.getElementById('grade-value').innerHTML = '0';
document.getElementById('grade-letter').innerHTML = '0';
document.getElementById("credit-count").innerHTML = "0";
document.getElementById("total-gpa").value = "0";
document.getElementById("total-credits").value = "0";
for (i = 0; i < gradesChildren.length; i++)
{
if (gradesChildren[i].id == 'grade' || gradesChildren[i].id == 'credit')
{
gradesChildren[i].value = '0';
}
}
}