/*** CONSTANT START***/
//The years this calculator won't work on are pre-1998 years.
var NA_YEAR = 1998;
var CURRENT_YEAR = 2009;
var THRESHOLD = 14999.99;
var INFLATION = new Array(4,2,0); // 2% or 4%
var CURRENT_INFLATION_RATE = 0; //current inflation rate is 0%.
/*** END CONSTANTS***/

	  if(window.addEventListener){  
	    window.addEventListener('load', studentLoanCalcReset, true);
	  } else if(window.attachEvent){
		window.attachEvent('onload',studentLoanCalcReset);
	  } else {
		window.onload=studentLoanCalcReset;
	  }


//main function
function init()
{
	displayResets();
	changeSelectBorderColors();
	document.getElementById('result').innerHTML = "";
	document.getElementById('result').style.display = "";
	document.getElementById('studentCalcErr').innerHTML = "";
	document.getElementById('studentCalcErr').style.display = "none";
	//store user input into variables.
	var loanSize = Number(document.studentCalcFrm.loanSize.value.replace(/,/,""));
	var currentSalary = Number(document.studentCalcFrm.currentSalary.value.replace(/,/,""));
	var loanStart = Number(document.studentCalcFrm.loanStarted.options[document.studentCalcFrm.loanStarted.selectedIndex].value);
	var expToGraduate = null;
	var country = null;
	
	if(chkIfNewStudents(loanStart))
	{
		expToGraduate = Number(document.studentCalcFrm.expToGraduate.options[document.studentCalcFrm.expToGraduate.selectedIndex].value);
		country = document.studentCalcFrm.studentCountry.options[document.studentCalcFrm.studentCountry.selectedIndex].value;
	}
	
	if(chkInput(loanSize,currentSalary,loanStart,expToGraduate,country))
	{
		startCalc(loanSize,currentSalary,loanStart,expToGraduate,country);
	}
	
	
	return false;
}

function chkIfNewStudents(loanStart)
{
	//check to see if students got loan out after 2006 
	if(loanStart > 2006)
	{
		return true;
	}
	return false;
}
//checks that the data inputed into the form is valid if not returns false.
function chkInput(lnSize,currSal,lnStr,expToGraduate,country)		
{
	var check = true;
	var output = "";
	output += "Please enter the following:";
	output += "<ol>";

	if(!(!isNaN(lnStr) && lnStr != 0))
	{
		check = false;
		/* output error msg here to user */
		output += "<li>Year you took out your first loan<\/li>"
		document.studentCalcFrm.loanStarted.style.border = "1px solid red";
	}
	if(expToGraduate != null && ( isNaN(expToGraduate) || document.studentCalcFrm.expToGraduate.selectedIndex == 0))
	{
		check = false;
		output += "<li>Expect to graduate</li>";
		document.studentCalcFrm.expToGraduate.style.border = "1px solid red";
	}
	if(country != null && document.studentCalcFrm.studentCountry.selectedIndex == 0)
	{
		check = false;
		output += "<li>Country</li>";
		document.studentCalcFrm.studentCountry.style.border = "1px solid red";
	}
	
	if(!(!isNaN(currSal) && currSal > 0))
	{
		check = false;
		/* output error msg here to user */
		output += "<li>Salary<\/li>";
		document.studentCalcFrm.currentSalary.style.border = "1px solid red";
	}
	if(!(!isNaN(lnSize) && lnSize > 0))
	{
		check = false;
		/* output error msg here to user */
		output += "<li>Loan balance<\/li>";
		document.studentCalcFrm.loanSize.style.border = "1px solid red";
	}
	output += "<\/ol>";
	if(!check)
	{
		document.getElementById('result').style.display = "none";
		document.getElementById('result').innerHTML = "";
		
		document.getElementById('studentCalcErr').innerHTML = output;
		document.getElementById('studentCalcErr').style.border = "1px dashed red";
		document.getElementById('studentCalcErr').style.display = "block";
		//document.getElementById('studentCalcErr').style.height = "200px";
	}
	return check;
}

//function carries out main operations such as calculating num years to pay off and outputting the data to the user etc.
function startCalc(lnSize,currSal,lnStr,expToGraduate,country)
{
	var lnWipedOff = 45;
	if(expToGraduate != null)
	{
		lnWipedOff = 25;
		if(country == "scotland")
		{
			lnWipedOff = 35;
		}
	}
	calcNumPayments(lnSize,currSal,lnStr,lnWipedOff);
}

function calcNumPayments(totalCost, salary,lnStr,lnWipedOff)
{
	if(checkSalaryIsFine(salary))
	{
		var data = "";
		var numDays = getNumDays(salary,totalCost,CURRENT_INFLATION_RATE);
		var howLongArry = getYMWD(numDays);
		if(lnStr >= 1999 && lnStr <= 2006 && parseInt(howLongArry[0]) > 45)
		{
			//tell user that because you'll be over 65 you won't hav to pay student debt back because it will be wiped clean.
			notPayingOffStudentLoanOutput()
		}
		else if((lnStr >= 2007 && lnStr <= 2012) &&parseInt(howLongArry[0]) > lnWipedOff)
		{
			loanWipedOffOutput(lnWipedOff);
		}
		else
		{
			data += dataToOutput(howLongArry,CURRENT_INFLATION_RATE);
			//output here.		
			displayDataToUser(data);
		}
	}
	else
	{
		outputEarnUnderThreshold();
	}
}

function getYMWD(numDays)
{
	var years = 0;
	var months = 0;
	var weeks = 0;
	var days = 0;
	for(var i = 0; i <= numDays; i++)
	{
		days++;
		if(days == 7)
		{
			weeks++;
			if(weeks == 4)
			{
				months++;
				if(months == 12)
				{
					years++;
					months = 0;
				}
				weeks = 0;
			}
			days = 0;
		}
	}
	
	var outpt = new Array(years,months,weeks,days);
	return outpt;
}

function getNumDays(salary,totalCost,inf)
{
	var counter = 0;
	var sizeOfPayment = 0;
	while(sizeOfPayment <= totalCost)
	{
		sizeOfPayment += (((((9/100) * (salary-THRESHOLD))/12)/4)/7);
		//increase salary by inflation rate.
		salary += inf/100 * (salary/12/4/7);
		//increase cost by inflation as well.
		totalCost += inf/100 * ((((totalCost/12)/4)/7));
		//console.log("salary: "+salary.toFixed(2)+"\t\tLoan: "+totalCost.toFixed(2));
		counter++;
		
		if(counter > (45 * 365))
		{
			//alert("getNumDays() break");
			break;
		}
	}
	return counter;
}
function checkSalaryIsFine(salary)
{
	if(salary > THRESHOLD)
	{
		return true;
	}
	return false;
}

function dataToOutput(timeLeft,inf)
{
	//get date to output
	var loanPayedDate = new Date();
	var todaysDate = new Date();
	//console.log("dataToOutput() todaysDate: "+todaysDate.getFullYear() + "\ntimeLeft: "+parseInt(timeLeft[0]));
	loanPayedDate.setFullYear(parseInt(todaysDate.getFullYear()) + parseInt(timeLeft[0]));
	loanPayedDate.setMonth(parseInt(todaysDate.getMonth()) + parseInt(timeLeft[1]) /*-1*/);
	loanPayedDate.setDate(parseInt(todaysDate.getDate()) + (parseInt(timeLeft[3]) + (parseInt(timeLeft[2]) * 7)));
	var data="<img src=\"http://images2.moneysavingexpert.com/images/studentcalc/resultstext.jpg\" style=\"margin: 0px; padding: 0px; font-size: 18pt; color: rgb(247, 148, 29); text-align: left;\"/>";
	//data += "<span style=\"color:#454545;font-family:arial,sans-serif;font-size:10pt;font-weight:bold;\">It will take <strong style=\"color:blue;\">"+timeLeft[0]+"</strong> years and <strong style=\"color:blue;\">"+timeLeft[1]+"</strong> months<br \/><br \/></span>";
	
	var year = loanPayedDate.getFullYear();
	var monthName = getMonthName(loanPayedDate.getMonth());
	//if(timeLeft[1] == 11) { timeLeft[0] += 1; timeLeft[1] = 0;}
	var numYears = timeLeft[0] == 1 ? "year" : "years";
	var numMonths = timeLeft[1] == 1 ? "month" : "months";
//	data += "<span style=\"color:#454545;font-family:arial,sans-serif;font-size:10pt;font-weight:bold;\">You will pay of your student loan on <strong style=\"color:blue;\">"+monthName+" "+year+"<\/strong><br \/></span>";
	data += "<p style=\"color:#454545;font-family:arial,sans-serif;font-size:10pt;font-weight:bold;\">Your student loan-free date is <span style=\"font-weight:bolder;font-size:15px;color:blue;\">"+monthName+"<\/span> <span style=\"font-weight:bolder;font-size:15px;color:blue;\">"+year+"<\/span>, as it will take<\/p>";
	data += "<p style=\"font-weight:bold;font-size:20px;text-align:center;color:blue;font-family:arial,sans-serif;\">"+timeLeft[0]+" "+numYears+" and "+(timeLeft[1]) /*plus one because of Date only months 0-11)+" months */+" "+numMonths+"</p>";
	data += "<p style=\"color:#454545;font-family:arial,sans-serif;font-size:10pt;font-weight:bold;\">until it's paid off. <\/p>"
	data += "<p style=\"color:#454545;font-family:arial,sans-serif;font-size:10pt;font-weight:bold;\">But remember, student loans are the cheapest form of long term debt so don't be disheartened if you've got a while to go.<\/p>";
	
	data += "<p style=\"text-align:left;font-size:10pt;\"><span style=\"color:red;font-weight:bold;\">Warning!<\/span> <em>This is a rough calculation and assumes that your salary always rises with the rate of inflation.</em><\/p>";
	return data;
}

function displayDataToUser(data)
{
	document.getElementById('result').innerHTML = data;
	document.getElementById('result').style.border = "5px solid #FEE0A1";
	document.getElementById('result').style.display = "block";
	document.getElementById('result').style.height = "300px";
	document.getElementById('result').style.width = "400px";
	document.getElementById('result').style.textAlign = "center";
}

function getMonthName(month)
{
	switch(month)
	{
		case 0: 
			return "January";
		case 1:
			return "February";
		case 2:
			return "March";
		case 3:
			return "April";
		case 4:
			return "May";
		case 5:
			return "June";
		case 6:
			return "July";
		case 7: 
			return "August";
		case 8:
			return "September";
		case 9:
			return "October";
		case 10:
			return "November";
		case 11:
			return "December";
	}
	return false;
}

function getDateOfPayOff(year)
{
	var todaysDate = new Date();
	var futureDate = new Date();
	futureDate.setDate(todaysDate.getDay()+1);
	var ret = futureDate.getDay() + "/" + futureDate.getMonth() + "/" + futureDate.getYear();
	return ret;
}

function hideStudentLoanCalcInfo(pubId)
{
	document.getElementById(pubId).style.display = "none";
}

function studentLoanPopUpDiv(pubId)
{
	document.getElementById(pubId).style.display = "block";
}

//reset
function studentLoanCalcReset()
{

	//hide other select boxex that don't need to be shown
	document.getElementById('expToGraduate').style.display = "none";
	document.getElementById('studentCountry').style.display = "none";
	
	document.studentCalcFrm.loanSize.value = "";
	//document.studentCalcFrm.loanSize.style.border = "";
	document.studentCalcFrm.currentSalary.value = "";
	//document.studentCalcFrm.currentSalary.style.border = "";
	document.getElementById('result').innerHTML = "";
	document.getElementById('studentCalcErr').innerHTML = "";
	document.getElementById('result').style.display = "none";
	document.getElementById('studentCalcErr').style.display = "none";
	
	
	
	//reset select's
	document.studentCalcFrm.studentCountry.selectedIndex = 0;
	document.studentCalcFrm.loanStarted.selectedIndex = 0;
	document.studentCalcFrm.expToGraduate.selectedIndex = 0;
	
	
	//hide reset buttons
	document.getElementById('studentLoanResetTop').style.display = "none";
	document.getElementById('studentLoanResetBottom').style.display = "none";
	
	changeSelectBorderColors();
}

function displayResets()
{
	document.getElementById('studentLoanResetTop').style.display = "block";
	document.getElementById('studentLoanResetBottom').style.display = "block";
}

//additions to the form (UPDATE SECTION)
function checkDate()
{
	var display = "";
	if(parseInt(document.studentCalcFrm.loanStarted.options[document.studentCalcFrm.loanStarted.selectedIndex].value) >= 2007)
	{
		display = "block";
	}
	else
	{
		display = "none";
		//hide studentCountry dropdown as well
		document.getElementById('studentCountry').style.display = "none";
	}
	
	if(display == "block")
	{
		var select = document.studentCalcFrm.expToGraduate;
		var optionHtml = "";
		var i = 0;
		//first remove all options
		for(var n = 1; n < select.options.length; n++)
		{
			select.remove(n);
		}
		
		switch(parseInt(document.studentCalcFrm.loanStarted.options[document.studentCalcFrm.loanStarted.selectedIndex].value))
		{
			case 2007: 
			{
				select.options[++i] = new Option("07/08",2008);
			}
			case 2008:
			{
				select.options[++i] = new Option("08/09",2009);
			}
		}
		select.options[++i] = new Option("09/10",2010);
		select.options[++i] = new Option("10/11",2011);		
		select.options[++i] = new Option("11/12",2012);
	}
	document.getElementById('expToGraduate').style.display = display;
	whichCountry(display);
}


function whichCountry(val)
{
	document.studentCalcFrm.studentCountry.selectedIndex = 0;
	document.getElementById('studentCountry').style.display = val;
}

function changeSelectBorderColors()
{
	//change back select border colors.
	document.studentCalcFrm.studentCountry.style.border = "";
	document.studentCalcFrm.expToGraduate.style.border = "";
	document.studentCalcFrm.loanStarted.style.border = "";	
	
	//change input box border colors
	document.studentCalcFrm.currentSalary.style.border = "1px solid #3F94B3";
	document.studentCalcFrm.loanSize.style.border = "1px solid #3F94B3";
}

//OUTPUTS
function outputEarnUnderThreshold()
{
	var output="";
	output += "<img src=\"http://images2.moneysavingexpert.com/images/studentcalc/resultstext.jpg\" style=\"margin: 0px; padding: 0px; font-size: 18pt; color: rgb(247, 148, 29); text-align: left;\"/><br />";
	output += "<span class=\"underThresholdTxt\">As you earn under the &pound;15,000 repayment threshold, you do not have to make repayments.<br \/><br \/><\/span>";
	output += "<span class=\"underThresholdTxt\">If you continue to earn under &pound;15,000, the entire balance will be wiped clean:<\/span>";
	output += "<ul id=\"underThresholdUL\">";
	output += "	<li>When you reach 65 if you first took out a loan between Sept 98 and Aug 06<\/li>";
	output += "	<li>25 years after the first April you finished university if you took out your first loan in or after Sept 06 unless you took your loan out in Scotland from Sept 07 onwards, then it's 35 years<br \/><\/li>";
	output += "<\/ul>";

	document.getElementById('result').innerHTML = output;
	//document.getElementById('result').innerHTML = "<span style=\"color:#454545;font-family:arial,sans-serif;font-size:10pt;font-weight:bold;\">As you earn under the &pound;15,000 repayment threshold, you do not have to make repayments.</span>";
	document.getElementById('result').style.border = "1px solid #FEE0A1";
	document.getElementById('result').style.display = "block";
	document.getElementById('result').style.height = "300px";
	document.getElementById('result').style.width = "400px";
	document.getElementById('result').style.textAlign = "left";
}

function notPayingOffStudentLoanOutput()
{
	var data = "<img src=\"http://images2.moneysavingexpert.com/images/studentcalc/resultstext.jpg\" style=\"margin: 0px; padding: 0px; font-size: 18pt; color: rgb(247, 148, 29); text-align: left;\"/><br /><span style=\"font-family:Arial;font-size:15px;color:#454545;padding-top:30px;padding-bottom:5px;\">It looks like you'll be over the age of 65 before your loan has cleared so the balance will be cancelled on your 65th birthday.<\/span>";
	document.getElementById('result').innerHTML = data;
	document.getElementById('result').style.border = "5px solid #FEE0A1";
	document.getElementById('result').style.display = "block";
	document.getElementById('result').style.height = "100px";
	document.getElementById('result').style.width = "400px";
	document.getElementById('result').style.textAlign = "center";
}

function loanWipedOffOutput(years)
{
	var data = "<img src=\"http://images2.moneysavingexpert.com/images/studentcalc/resultstext.jpg\" style=\"margin: 0px; padding: 0px; font-size: 18pt; color: rgb(247, 148, 29); text-align: left;\"/><br /><span style=\"font-family:Arial;font-size:15px;color:#454545;padding-top:30px;\">Because you'll be paying over "+years+" years your loan will be wiped off.<\/span>";
	document.getElementById('result').innerHTML = data;
	document.getElementById('result').style.border = "5px solid #FEE0A1";
	document.getElementById('result').style.display = "block";
	document.getElementById('result').style.height = "100px";
	document.getElementById('result').style.width = "400px";
	document.getElementById('result').style.textAlign = "center";
}