        // Initialize course specific variables
        let courseScores: {[index: string]: any} = {};
        let courseMaxScores: {[index: string]: any} = {};
        let courseIndexes: {[index: string]: any} = {};
        courses.forEach(course =>
        {
            courseScores[course.name] = 0;
            courseMaxScores[course.name] = 0;
            courseIndexes[course.name] = course.assignments.length - 1;
        });

        // Compute the rows data
        let rows: {[index: string]: any}[] = [];
        dates.forEach(date =>
        {
            // Define row object
            let row: {[index: string]:any} = {'date': date.toLocaleDateString('en-US')};

            // Loop through courses
            courses.forEach(course =>
            {
                // Reversed loop through the assignments
                for (let r = courseIndexes[course.name]; r >= 0; r--)
                {
                    let assignment = course.assignments[r];

                    // If assignment should be displayed
                    if (assignment.complete != 'Complete') continue;

                    // Date is being looked at
                    let assignmentDate = new Date(assignment.date);
                    if (assignmentDate.getTime() == date.getTime())
                    {
                        // Detect grading method and record scores
                        if (course.grading.method == 'TOTAL_MEAN')
                        {
                            courseScores[course.name] += assignment.score;
                            courseMaxScores[course.name] += assignment.scoreMax;
                        }
                        else if (course.grading.method == 'PERCENT_TYPE')
                        {
                            let scale = course.grading.weightingMap[assignment.type];
                            courseScores[course.name] += assignment.score * scale;
                            courseMaxScores[course.name] += assignment.scoreMax * scale;
                        }
                    }

                    // Not now
                    else if (assignmentDate > date)
                    {
                        courseIndexes[course.name] = r;
                        break;
                    }
                }

                // Add average to the row
                row[course.name] = courseScores[course.name] / courseMaxScores[course.name] * 100;
            });

            // Add it to the array
            rows.push(row);
        });


                else if (course.grading.method == 'PERCENT_TYPE')
                {
                    let typeScores: {[index: string]: any} = {};
                    let typeCounts: {[index: string]: any} = {};

                    // Loop through assignments
                    course.assignments.forEach(assignment =>
                    {
                        // If assignment should be displayed
                        if (assignment.complete != 'Complete') return;

                        // Date is being looked at
                        let assignmentDate = new Date(assignment.date);
                        if (assignmentDate.getTime() < date.getTime())
                        {
                            // Record scores
                            if (typeScores[assignment.type] == undefined) typeScores[assignment.type] = 0;
                            typeScores[assignment.type] += assignment.score / assignment.scoreMax;

                            if (typeCounts[assignment.type] == undefined) typeCounts[assignment.type] = 0;
                            typeCounts[assignment.type] ++;
                        }
                    });

                    let score = 0;

                    // Count
                    for (let type in typeScores)
                    {
                        score += typeScores[type] * course.grading.weightingMap[type] / typeCounts[type];
                        console.log(type);
                    }

                    // Add average to the row
                    row[course.name] = score * 100;
                }
