<!--
/* Mortgage calculation script

*/
window.onerror=null
bState = true
oReq = new Collection("AMOUNT","RATE","","","","")
oVal = new Collection("AMOUNT","RATE","","","","")
oTst = new Collection("N","N","","","","")

function controller(oForm, oBtn) {
while (bState) {
	if (!Required(oForm))
	break

	if (!Validate(oForm))
	break
	
	if (!SetValue(oForm))
	break
	
	if (!NewPage(oForm, oBtn))
	break
	
	if (bState) {
		bState = false
	}
}
	bState = true
}

function Required(oView) {
	for (i in oView) {
		for (j in oReq) {
			if (i==oReq[j]) {
				if (isMissing(oView[i])) {
					return(false)
				}
			}
		}
	}
return(true)
}

function Validate(oView) {
	for (i in oView) {
		for (j in oVal) {
			if (i==oVal[j] && oTst[j]=="N") {
				if (isTest(oView[i], oTst[j])) {
					return(false)
				}
			}
		}
	}
	return(true)
}

function SetValue(oView) {
	Mortgage = new Loan(oView.AMOUNT.value, oView.CURRENCY.value, oView.RATE.value, oView.DOWN.value, get_selection(oView.YEARS), 0, 0, get_selection(oView.FREQUENCY), 0, oView.CHARGES.value, oView.TAXES.value )
	Mortgage.calcPeriods()
	Mortgage.calcLoan()
	Mortgage.calcExtras()
	Mortgage.calcPayment()
	Mortgage.calcInterest()

	oView.LOANTOTAL.value = calcRound(Mortgage.LoanTotal)
	oView.EXTRAS.value = calcRound(Mortgage.Extras)
	oView.PAYMENT.value = calcRound(Mortgage.Payment)
	oView.INTEREST.value = calcRound(Mortgage.Interest)

	setCookie("_Prin", Mortgage.Amount)
	setCookie("_Curr", Mortgage.Currency)
	setCookie("_Int", Mortgage.Rate)
	setCookie("_Year", Mortgage.Term)
	setCookie("_Tot", Mortgage.Interest)

	return(true)
}

function isMissing(oCtrl) {
	if (oCtrl.value == "") {
		alert("You have left a required value blank. Please type a number")
		oCtrl.focus()
		oCtrl.select()

		return(true)
	}
	else
	{
		return(false)
	}
}

function isTest(oCtrl, oTest) {
	if (oTest=="N" && !isNumber(oCtrl.value) ) {
		alert(oCtrl.value+" contains an invalid character. Please type a number")
		oCtrl.focus()
		oCtrl.select()
	
		return(true)
	}
	else
	{
		return(false)
	}
}

function isNumber(input) {
	for (var i=0;i<input.length;i++) {
		var oneChar = input.substring(i, i+1)
		if (oneChar < "0" || oneChar > "9") {
			if (oneChar != "." ) {
				return(false)
			}
		}
	}
	return(true)
}

function Collection(item1, item2, item3, item4, item5, item6, item7, item8) {
this.item1 = item1
this.item2 = item2
this.item3 = item3
this.item4 = item4
this.item5 = item5
this.item6 = item6
this.item7 = item7
this.item8 = item8
}

function Loan(Amount, Currency, Rate, Down, Term, Payment, Interest, Frequency, Periods, Charges, Taxes ) {
this.Amount = Amount
this.Currency = Currency
this.Rate = Rate
this.Down = Down
this.Term = Term
this.Payment = Payment
this.Interest = Interest
this.Frequency = Frequency
this.Periods = Periods
this.Charges = Charges
this.Taxes = Taxes
this.calcPeriods = calcPeriods
this.calcLoan = calcLoan
this.calcPayment = calcPayment
this.calcExtras = calcExtras
this.calcInterest = calcInterest
}

function calcLoan() {
	this.LoanTotal = (this.Amount*(1-(this.Down/100)))
	this.DownPayment = (this.Amount*(this.Down/100))
}

function calcPayment() {
	this.Payment = (this.LoanTotal*((this.Rate/(this.Periods*100))/(1-(Math.pow(1+(this.Rate/(this.Periods*100)),((this.Term*this.Periods)*-1))))))
	this.PeriodPayment = (parseInt(this.Charges) + parseInt(this.Taxes) + parseFloat(this.Payment))
}

function calcInterest() {
	this.Interest = ((this.Payment*(this.Term*this.Periods))-this.LoanTotal)
}

function calcPeriods() {
	if (this.Frequency=="Monthly" || this.Frequency=="Mensuel" ) { this.Periods=12 } else { this.Periods=26 }
}

function calcExtras() {
	this.Extras = (parseInt(this.Charges)+parseInt(this.Taxes))
}

function calcRound(num) {
	result=Math.floor(num)+"."
	n = result.length
	if (num>1000 && num<999999) {
		result=result.substring(0,n-4)+","+result.substring(n-4,n)
	}
	if (num>1000000) {
		result = result.substring(0,n-7)+","+result.substring(n-7,n-4)+","+result.substring(n-4,n)
	}
	var cents=100*(num-Math.floor(num))+0.5
	result += Math.floor(cents/10)
	result += Math.floor(cents%10)
	return(result)
}

function select_item(name, value) {
	this.name = name
	this.value = value
}

function get_selection(select_object) {
	contents = new select_item()
	for(var i=0;i<select_object.options.length;i++)
		if(select_object.options[i].selected == true) {
			contents.name = select_object.options[i].text
			contents.value = select_object.options[i].value
		}
	return(contents.name)
}

function setCookie (name, value ) {
	document.cookie = name + "=" + escape (value) + "; path=/";
}

function NewPage(oForm, oBtn) {
if (oBtn.name == "cmdCalc") {
return(false)
}
var vInterestTable = new Array();
var vPrincipalTable = new Array();
var vYearTable = new Array();

// Show the amortisation table
makeTable(oForm, vInterestTable, vPrincipalTable, vYearTable);

// Show the amortisation chart
makeChart(oForm, vInterestTable, vPrincipalTable, vYearTable, "lineplotGraph");

return(true)
}

function makeChart(oView, vInterestTable, vPrincipalTable, vYearTable, oDIV) {

var linegraph = new JSGraph();

// Define the graph and all components !
linegraph.graphLeftPaddingOverride = 30;
linegraph.yAxis(2, 160, '#8B0000');
linegraph.xAxis(2, 300, '#8B0000');
linegraph.addBackground('#FFE9E6');
linegraph.addTrellis(40, 1, '#FF0000', 'blah1','tahoma,sans-serif',9);
linegraph.addTrellis(80, 1, '#FF0000', 'blah2','tahoma,sans-serif',9);
linegraph.addTrellis(120, 1, '#FF0000', 'blah3','tahoma,sans-serif',9);
linegraph.addTrellis(160, 1, '#FF0000', 'blah4','tahoma,sans-serif',9);

linegraph.addLinePlot( vInterestTable[0] );
for (i=1;i<vInterestTable.length;i++)
{
linegraph.addLinePlot( vInterestTable[i] ,1,'maroon',1,vYearTable[i],'tahoma,sans-serif','maroon',9);
}

linegraph.newLinePlot();
linegraph.addLinePlot( vPrincipalTable[0] );
for (i=1;i<vPrincipalTable.length;i++)
{
linegraph.addLinePlot( vPrincipalTable[i] ,1,'#0000FF',1);
//document.write(vInterestTable[i] + "<br >");
//document.write(vPrincipalTable[i] + "<br >");
}

// Create the graph !
linegraph.makeGraph();
linegraph.showGraph( oDIV );

return(true);

}


function makeTable(oView, vInterestTable, vPrincipalTable, vYearTable) {
//get reference to the table on the form
var tbody = document.getElementById( "mortgage_tbody" );

// build a loop to remove any and all existing children of mortgage_tbody EXCEPT the header !
//    var para = document.getElementById("example2");
//    var boldElm = document.getElementById("example2B");
//    var removed = para.removeChild(boldElm);

var currInt = 0
var currPrin = 0
var currCount = 1
var currBoolean = true

prevBalance = Mortgage.LoanTotal
InterestRate = ( Mortgage.Rate /100) / Mortgage.Periods
MonthlyPayment = Mortgage.Payment
currStart = get_selection(oView.START)
for(i=1;i<=40;i++) {
for(j=1;j<=Mortgage.Periods;j++) {
periodInt = prevBalance * InterestRate
periodPrin = MonthlyPayment - periodInt
currBal = prevBalance - periodPrin
currInt += periodInt
currPrin += periodPrin
prevBalance = currBal
}
if( currBal <= 0 ){
currBal = 0
}

//create a row
var trow = document.createElement( "tr" );
trow.setAttribute( "id", "trow" );
if( currBoolean ){
	trow.setAttribute( "class", "odd" );
	currBoolean = false;
}
else {
	trow.setAttribute( "class", "even" );
	currBoolean = true;
}

tbody.appendChild( trow );
//create cells
var tdata1 = document.createElement( "td" );
var tdata2 = document.createElement( "td" );
var tdata3 = document.createElement( "td" );
var tdata4 = document.createElement( "td" );
var tdata5 = document.createElement( "td" );
	tdata1.setAttribute( "class", "center" );
	tdata2.setAttribute( "class", "center" );
	tdata3.setAttribute( "class", "right" );
	tdata4.setAttribute( "class", "right" );
	tdata5.setAttribute( "class", "right" );
var tdata1Text = document.createTextNode( currCount );
var tdata2Text = document.createTextNode( currStart );
var tdata3Text = document.createTextNode( calcRound(currInt) );
var tdata4Text = document.createTextNode( calcRound(currPrin) );
var tdata5Text = document.createTextNode( calcRound(currBal) );
tdata1.appendChild( tdata1Text );
tdata2.appendChild( tdata2Text );
tdata3.appendChild( tdata3Text );
tdata4.appendChild( tdata4Text );
tdata5.appendChild( tdata5Text );
trow.appendChild( tdata1 );
trow.appendChild( tdata2 );
trow.appendChild( tdata3 );
trow.appendChild( tdata4 );
trow.appendChild( tdata5 );

vInterestTable.push( calcRound(currInt) );
vPrincipalTable.push( calcRound(currPrin) );
vYearTable.push( currStart );

currInt = 0
currPrin = 0
currStart = parseInt(currStart)
currStart += 1
currCount += 1
if(currBal<=0) {
return(true)
}
}
return (true)
}

function setfocus() {
	document.MORTGAGE.AMOUNT.focus()
	document.MORTGAGE.AMOUNT.select()
}