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 = "<div class='row-number'>" + rows + "</div><input class='input-box' type='text' name='mytext[]' id='grade' value='0'><input class='input-box' type='text' name='mytext[]' id='credit' value='0'>";
        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';
        }
    }
}