
var courseNum = prompt("How many courses are you taking this semester?","4");
var college = true;

// THE selectControl FUNCTION SETS THE FOCUS ON AND PLACES THE CURSOR IN THE FIRST INPUT BOX OF THE COURSE FORM. 
function selectControl(obj)
{
	obj.select();
	obj.focus();
}

// THE round3 FUNCTION ROUNDS num TO THREE DECIMAL PLACES 
function round3(num) 
{
	var rounded = Math.round(num*1000)/1000;

  	// If result is a whole number, append a ".0" to it
  	if (rounded == Math.round(rounded)) 
	{
    		rounded = "" + rounded + ".0";
  	}
  	return rounded;
}

// THE evalGPA FUNCTION GETS THE INPUT FROM THE COURSE FORM, CONVERTS IT FROM A STRING INTO A 
// NUMBER WITH THE parseFloat FUNCTION, COMPUTES THE TOTALS, AND WRITES THE TOTAL TO THE APPROPRIATE 
// FIELDS ON THE FORM.
function evalGPA()
{
    	var totalPoints = 0;
    	var totalCourse = 0;
    	var totalCredits = 0;
	var finalGPA = 0;

    	for (var i = 0; i < courseNum; i++)
      	{
        	if (document.forms[i].gradePoints.value.length)
          	{
            		totalCourse++;
            		totalCredits += parseFloat(document.forms[i].credits.value);
            		totalPoints += parseFloat(document.forms[i].gradePoints.value);
          	}
      	}

    	if (totalCourse && totalPoints)
      	{
        	document.result.totalCredits.value = round3(totalCredits);
		document.result.totalPoints.value = round3(totalPoints);
        	finalGPA = round3(totalPoints / totalCredits);
		if( finalGPA >4 ) finalGPA = "4.0";
		document.result.GPA.value = finalGPA;
      	}
}

// THE resetGPA FUNCTION RESETS SET ALL FIELDS ON THE FORM TO BLANK
function resetGPA()
{
    	for (var i = 0; i < courseNum; i++)
      	{
        	document.forms[i].credits.value = "";
        	document.forms[i].grade.value = "";
        	document.forms[i].weighted.checked = false;
        	document.forms[i].gradePoints.value = "";
      	}

    	document.result.totalCredits.value = "";
    	document.result.totalPoints.value = "";
    	document.result.GPA.value = "";
    	document.current.cumCredits.value = "";
    	document.current.cumPoints.value = "";
    	document.current.cumGPA.value = "";
    	document.projected.projectCredits.value = "";
    	document.projected.projectPoints.value = "";
    	document.projected.projectGPA.value = "";
	document.course0.credits.focus();
}

// THE computeForm CALCULATES THE GRADE POINTS FOR THE COURSE AND WRITES IT TO THE FORM.
function computeForm(form) 
{
  	var points = 0
  	with( form ) 
	{
    		if (form.credits.value.length != 0 && grade.value.length != 0) 
		{
      			if (grade.value == "A+") points = 4.333
      			else if (grade.value == "A")  points = 4
      			else if (grade.value == "A-") points = 3.667
      			else if (grade.value == "B+") points = 3.333
      			else if (grade.value == "B")  points = 3
      			else if (grade.value == "B-") points = 2.667
      			else if (grade.value == "C+") points = 2.333
      			else if (grade.value == "C")  points = 2
      			else if (grade.value == "C-") points = 1.667
      			else if (grade.value == "D+") points = 1.333
      			else if (grade.value == "D")  points = 1
      			else if (grade.value == "D-") points = 0.667
			else if (grade.value == "F")  points = 0
			// THE FOLLOWING GRADES ARE NOT CALCULATED IN THE GPA
      			else if (grade.value == "AU" || 
				 grade.value == "CR" || 
				 grade.value == "IN" || 
				 grade.value == "LA" || 
				 grade.value == "NR" ||
				 grade.value == "S" ||
				 grade.value == "U" ||
				 grade.value == "W") 
			{
        			gradePoints.value = "";
				return;
      			}
      			else points = 0

      			form.gradePoints.value = round3(points * parseFloat(form.credits.value))
    		}
  	}
}

// THE checkCredits FUNCTION EVALUATES THE CREDIT NUMBERS ENTERED IN THE FORM TO SEE IF THEY ARE APPROPRIATE.
function checkCredits(form)
{
    	var error = false;
    	var str = form.credits.value;

    	for (var i = 0; i < str.length; i++)
      	{
        	var checkStr = str.substring(i, i + 1);

        	if ((checkStr < "0" || checkStr >"9") && checkStr != '.') error = true
      	}

    	if( error )
      	{
        	alert("Invalid number!");
        	form.credits.value = "";
        	form.credits.focus();
      	}
    	else
      		computeForm(form)
}

// THE checkGrade FUNCTION EVALUATES THE GRADES ENTERED IN THE FORM TO SEE IF THEY ARE APPROPRIATE.
function checkGrade(form)
{
    	var error = false;
    	var str = form.grade.value.toUpperCase();

        if( str != 'A+' && str != 'A' && str != 'A-' && 
	    str != 'B+' && str != 'B' && str != 'B-' && 
            str != 'C+' && str != 'C' && str != 'C-' && 
	    str != 'D+' && str != 'D' && str != 'D-' &&
	    str != 'F' && str != 'AU' && str != 'CR' &&
	    str != 'IN' && str != 'LA' && str != 'NR' &&
	    str != 'S' && str != 'U' && str != 'W' )
	{
		error = true
	}

    	if( error )
      	{
        	alert("Invalid letter!");
        	form.grade.value = "";
        	form.grade.focus();
      	}
    	else
      	{
         	form.grade.value = str;
         	computeForm(form)
      	}
}

// THE checkCumCredits FUNCTION EVALUATES THE CREDIT NUMBERS ENTERED IN THE FORM TO SEE IF THEY ARE APPROPRIATE.
function checkCumCredits(form)
{
    	var error = false;
    	var str = form.cumCredits.value;

    	for (var i = 0; i < str.length; i++)
      	{
        	var checkStr = str.substring(i, i + 1);

        	if ((checkStr < "0" || checkStr >"9") && checkStr != '.') error = true
      	}

    	if( error )
      	{
        	alert("Invalid number!");
        	form.cumCredits.value = "";
        	form.cumCredits.focus();
      	}
}

// THE checkCumPoints FUNCTION EVALUATES THE CREDIT NUMBERS ENTERED IN THE FORM TO SEE IF THEY ARE APPROPRIATE.
function checkCumPoints(form)
{
    	var error = false;
    	var str = form.cumPoints.value;

    	for (var i = 0; i < str.length; i++)
      	{
        	var checkStr = str.substring(i, i + 1);

        	if ((checkStr < "0" || checkStr >"9") && checkStr != '.') error = true
      	}

    	if (error)
      	{
        	alert("Invalid number!");
        	form.cumPoints.value = "";
        	form.cumPoints.focus();
      	}
}

// THE computeCurrent FUNCTION COMPUTES THE STUDENT'S CURRENT GPA FROM CURRENT HOURS AND CURRENT POINTS ENTERED BY THE STUDENT
function computeCurrent(form)
{
    	var currCredits = parseFloat(form.cumCredits.value);
    	var currPoints = parseFloat(form.cumPoints.value);

    	form.cumGPA.value = round3(currPoints / currCredits);
}

function computeProjected(form)
{
    	var semCredits = parseFloat(document.result.totalCredits.value);
    	var semPoints = parseFloat(document.result.totalPoints.value);
    	var currCredits = parseFloat(document.current.cumCredits.value);
    	var currPoints = parseFloat(document.current.cumPoints.value);
 
    	form.projectCredits.value = round3(semCredits + currCredits);
    	form.projectPoints.value  = round3(semPoints + currPoints);
    	form.projectGPA.value = round3((semPoints + currPoints) / (semCredits +currCredits))
}

