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.RATE.value, get_selection(oView.YEARS), 0, 0, get_selection(oView.FREQUENCY), 0 )
Mortgage.calcPeriods()
Mortgage.calcPayment()
Mortgage.calcInterest()
oView.PAYMENT.value = calcRound(Mortgage.Payment)
oView.INTEREST.value = calcRound(Mortgage.Interest)
setCookie("_Prin", Mortgage.Amount)
setCookie("_Int", Mortgage.Rate)
setCookie("_Freq",Mortgage.Frequency)
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) {
this.item1 = item1
this.item2 = item2
this.item3 = item3
this.item4 = item4
this.item5 = item5
this.item6 = item6
}
function Loan(Amount, Rate, Term, Payment, Interest, Frequency, Periods ) {
this.Amount = Amount
this.Rate = Rate
this.Term = Term
this.Payment = Payment
this.Interest = Interest
this.Frequency = Frequency
this.Periods = Periods
this.calcPeriods = calcPeriods
this.calcPayment = calcPayment
this.calcInterest = calcInterest
}
function calcPayment() {
//this.Payment = (this.Amount*((this.Rate/(this.Periods*100))/(1-(Math.pow(1+(this.Rate/(this.Periods*100)),((this.Term*this.Periods)*-1))))))
erate = Math.pow(1+(this.Rate/100)/2,2/this.Periods)-1;
this.Payment = this.Amount*erate/(1-Math.pow(1+erate,this.Periods*this.Term*-1));

}

function calcInterest() {
this.Interest = ((this.Payment*(this.Term*this.Periods))-this.Amount)
}
function calcPeriods() {
if (this.Frequency=="Monthly") { this.Periods=12 } else 
{ if (this.Frequency=="Semi-Monthly") { this.Periods=24 } else
{ if (this.Frequency=="Bi-Weekly") { this.Periods=26 } else
{this.Periods=52 }
}}}
function calcRound(num) {
result="$"+Math.floor(num)+"." 
n = result.length
if (num>1000 && num<999999) {  
result="$"+result.substring(1,n-4)+","+result.substring(n-4,n)
}
if (num>1000000) {  
result = "$"+result.substring(1,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)
}
//if (confirm("An Amortization Table calculates the periodic payment breakdown for each specific category listed.")) 
{
text = ("<hr />");
text = (text +"<table width='100%'>");
text = (text +"<TR><TD><strong>Year</strong></TD><TD><strong>Interest</strong></TD><TD><strong>Principal</strong></TD><TD><strong>Balance</strong></TD></TR>\n");
makeTable(oForm)
text = (text +"</TABLE>");

document.getElementById('results').innerHTML = text;
return(true)
}
  return(false)
}

function makeTable(oView) {
var currInt = 0
var currPrin = 0
prevBalance = Mortgage.Amount
//InterestRate = ( Mortgage.Rate /100) / Mortgage.Periods
InterestRate = erate


MonthlyPayment = Mortgage.Payment
currStart = get_selection(oView.START)
for(i=1;i<=30;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.01 ){
currBal = 0
}
text = (text +"<TR><TD>"+ currStart +"</TD><TD>"+ calcRound(currInt) +"&nbsp;</TD><TD>"+ calcRound(currPrin) +"&nbsp;</TD><TD>"+ calcRound(currBal)+"&nbsp;</TD></TR>");
currInt = 0
currPrin = 0
currStart = parseInt(currStart)
currStart += 1
if(currBal<=0) {
return(true)
}
}
return (true)
}

function setfocus() {
document.MORTGAGE.AMOUNT.focus()
document.MORTGAGE.AMOUNT.select()
}