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'; } } }