// Used with Loan Amortization Calculator

//   Copyright 2006, Michael J. Hill.  Used with permission.  www.javascript-demos.com */
//   Free use of the code so long as the above notice is kept intact */

var isTable = "";
var Pmt = "";
var prevVal = "";
var prinPaid = 0;
var intPaid = 0;
var cumulativeInt = 0;
var remainingPrin = 0;
var printable = "";

function insertCommas(isNum){

return isNum.toString().split('').reverse().join('').replace(/(\d{3})/g,'$1,').split('').reverse().join('').replace(/^,/,'');
}

function insertRow(isInt,isPrin,isBal){

var nInt = isInt.toString();
var nPrin = isPrin.toString();
var nBal = isBal.toString();
var index = isTable.rows.length;
var nextRow =  isTable.insertRow(index);
var isYear = nextRow.insertCell(0);
var isInt = nextRow.insertCell(1);
var isPrin = nextRow.insertCell(2);
var isBal = nextRow.insertCell(3)
isYear.innerHTML = index;
isYear.className = 'year';
isInt.innerHTML = insertCommas(nInt);
isInt.className = 'dollars';
isPrin.innerHTML = insertCommas(nPrin);
isPrin.className = 'dollars';
isBal.innerHTML = insertCommas(nBal);
isBal.className = 'dollars';
}

function calcAmortizSched(isForm){

var firstYearMonths = "";
var nRows = isTable.rows.length;
for (r=1; r<nRows; r++){isTable.deleteRow(1)}

if (isForm.nMonths.value < 12)
{
maxFirstYear = 12-isForm.firstMonth.value;
if (maxFirstYear >= isForm.nMonths.value)
{
 firstYearMonths = isForm.nMonths.value;
}
else 	{
firstYearMonths = maxFirstYear;
}
}
else {firstYearMonths = 12-isForm.firstMonth.value}

var midMonths = parseInt((isForm.nMonths.value-firstYearMonths)/12)*12;
var finalYearMonths = isForm.nMonths.value-firstYearMonths-midMonths;

var loanAmount = isForm.loan.value.replace(/(?!\,{2,})(,)/g,"");
remainingPrin = loanAmount;
prinPaid = 0;
cumulativeInt = 0;
intRate = isForm.APR.value/100/12;

for (i=0; i<firstYearMonths; i++)
{
intPaid = remainingPrin*intRate;
cumulativeInt += intPaid;
prinPaid = Pmt-intPaid;
remainingPrin = remainingPrin-prinPaid;
}
cumulativeInt = cumulativeInt.toFixed(2);
prinPaid = loanAmount-remainingPrin;
prinPaid = prinPaid.toFixed(2);
remainingPrin = remainingPrin.toFixed(2);
insertRow(cumulativeInt,prinPaid,remainingPrin);

prinPaid = 0;
cumulativeInt = 0;
n = 0;

for (i=0; i<midMonths; i++)
{
intPaid = remainingPrin*intRate;
cumulativeInt += intPaid;
prinPaid = Pmt-intPaid;
remainingPrin = remainingPrin-prinPaid;
n++;
if (n == 12)
{
cumulativeInt = cumulativeInt.toFixed(2);
prinPaid = Pmt*12-cumulativeInt;
prinPaid = prinPaid.toFixed(2);
remainingPrin = remainingPrin.toFixed(2);
insertRow(cumulativeInt,prinPaid,remainingPrin);
prinPaid = 0;
cumulativeInt = 0;
n=0;
}
}

for (i=0; i<finalYearMonths; i++)
{
intPaid = remainingPrin*intRate;
cumulativeInt += intPaid;
prinPaid = Pmt-intPaid;
remainingPrin = remainingPrin-prinPaid;
}
if (finalYearMonths != 0)
{
prinPaid = Pmt*finalYearMonths-cumulativeInt;
prinPaid = prinPaid.toFixed(2);
cumulativeInt = cumulativeInt.toFixed(2);
remainingPrin = remainingPrin.toFixed(2);
insertRow(cumulativeInt,prinPaid,remainingPrin);
}
}

function calcPayment(isForm){

isValid = true;
var tmp = isForm.loan.value.replace(/(?!\,{2,})(,)/g,"");
isForm.loan.value = insertCommas(tmp);
if (isNaN(tmp) || isNaN(isForm.nMonths.value) || isNaN(isForm.APR.value) || isForm.firstMonth.value == ''){isValid = false}
var Amt = parseFloat(tmp);
var IR = parseFloat(isForm.APR.value)/100/12;
var N = parseInt(isForm.nMonths.value);
Pmt = Amt*IR/(1-(Math.pow((1+IR),-N)));
Pmt = Pmt.toFixed(2);
if (!isValid || isNaN(Pmt)){alert('Incomplete input')}
else {
document.getElementById('isPmt').innerHTML = "$"+insertCommas(Pmt)+"&nbsp;&nbsp";
totalInt = ((Pmt*N)-Amt).toFixed(2);
document.getElementById('totInt').innerHTML = "$"+insertCommas(totalInt)+"&nbsp;&nbsp";
totalPmts = (Pmt*N).toFixed(2);
document.getElementById('totPmts').innerHTML = "$"+insertCommas(totalPmts)+"&nbsp;&nbsp";
loanStr = isForm.loan.value;
hasCents = /\./.test(loanStr);
if (!hasCents){isForm.loan.value = isForm.loan.value+".00"}
monthStr = isForm.nMonths.value;
fracMonth = /\./.test(monthStr)
if (fracMonth){isForm.nMonths.value = monthStr.substring(0,monthStr.indexOf("."))}
calcAmortizSched(isForm)
}
}

function clearForm(isField){

isField.value = "";
prinPaid = 0;
intPaid = 0;
cumulativeInt = 0;
remainingPrin = 0;
document.getElementById('isPmt').innerHTML = "-0-"+"&nbsp;&nbsp;";
document.getElementById('totInt').innerHTML = "-0-"+"&nbsp;&nbsp;";
document.getElementById('totPmts').innerHTML = "-0-"+"&nbsp;&nbsp;";
nRows = isTable.rows.length;
for (r=1; r<nRows; r++){isTable.deleteRow(1)}
}

function checkReset(isVal){

if (prevVal != "")
{
nRows = isTable.rows.length;
for (r=1; r<nRows; r++){isTable.deleteRow(1)}
}
prevVal = isVal;
}

function openPrintable(isForm){

if (printable != ""){printable.close()}
printable = window.open();
printable.document.open();
styleStr = "<style type='text\/css'>.year{Width:10%;Text-Align:Center;Font-Size:9pt}.dollars{Width:30%;Text-Align:Right;Font-Size:9pt;Body:margin-left:20px'}<\/style>"
printable.document.write(styleStr);
printable.document.write("<form name='prinForm' style='margin-left:35px'>")
printable.document.write(document.getElementById('nSubject').innerHTML+"<br>");
printable.document.write(document.getElementById('nLoan').innerHTML+"<br>");
printable.document.write(document.getElementById('nAPR').innerHTML+"<br>");
printable.document.write(document.getElementById('nMonth').innerHTML+"<br>");
printable.document.write(document.getElementById('nFirst').innerHTML+"<br>");
printable.document.write(document.getElementById('nPayment').innerHTML+"<br>");
printable.document.write(document.getElementById('nInterest').innerHTML+"<br>");
printable.document.write(document.getElementById('nTotal').innerHTML+"<br>");
printable.document.write(document.getElementById('container').innerHTML);
printable.document.getElementById('dispDiv').style.overflow = '';
printable.document.write("<\/form>");
printable.document.forms['prinForm']['subject'].value = isForm.subject.value;
printable.document.forms['prinForm']['loan'].value  = isForm.loan.value;
printable.document.forms['prinForm']['APR'].value  = isForm.APR.value;
printable.document.forms['prinForm']['nMonths'].value  = isForm.nMonths.value;
printable.document.forms['prinForm']['firstMonth'].selectedIndex = isForm.firstMonth.selectedIndex;
printable.document.forms['prinForm']['subject'].setAttribute('disabled',true);
printable.document.forms['prinForm']['loan'].setAttribute('disabled',true);
printable.document.forms['prinForm']['APR'].setAttribute('disabled',true);
printable.document.forms['prinForm']['nMonths'].setAttribute('disabled',true);
printable.document.forms['prinForm']['firstMonth'].setAttribute('disabled',true);
printable.document.forms['prinForm']['loan'].style.textAlign = 'right';
printable.document.forms['prinForm']['APR'].style.textAlign = 'right';
printable.document.forms['prinForm']['nMonths'].style.textAlign = 'right';
printable.document.close();
}

function init(){

document.forms[0].reset();
document.forms[0]['subject'].focus();
isTable = document.getElementById('amortizSched');
}

onload=init;
