		
<!--

function Trim(s) 
{
  // Remove leading spaces and carriage returns
  while ((s.substring(0,1) == ' ') || (s.substring(0,1) == '\n') || (s.substring(0,1) == '\r')) {
    s = s.substring(1,s.length);
  }
  // Remove trailing spaces and carriage returns
  while ((s.substring(s.length-1,s.length) == ' ') || (s.substring(s.length-1,s.length) == '\n') || (s.substring(s.length-1,s.length) == '\r')) {
    s = s.substring(0,s.length-1);
  }
  return s;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

//Global variables
var gMonths = 0;
var gLoanPeriodInYears = 0;
var gLoanPrincipalAmount = 0;
var gBaseYear = 4;
var gBaseMonth = "Jan";
var gAnnualInterestRate = 0;
var gMonthlyPayments = 0;
var gTable2FirstYearLastBalance = 0;
var gInterestInFirstCalYear = 0;
var gHighestCumulativeInterest = 0;
var MonthNames;
var tableM;
var tableN;
var tableO;
var tableQ;

function formatNumber (num ) { 
	var numSave;
	numSave = num;
	if (numSave < 0) {
		num = num * (-1);
	}
	num = num.toString().replace(/\|\,/g,'');
	if(isNaN(num))
	num = "0";
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	if(cents<10)
	cents = "0" + cents;
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	num = num.substring(0,num.length-(4*i+3))+','+
	num.substring(num.length-(4*i+3));
	if (numSave >= 0) {
		return (((sign)?'':'-') + '' + num + '.' + cents);
	}
	else {
		return (((sign)?'':'-') + '' + num + '.' + cents) + ")";
	}
}

function pv(NumOfYears, Amount, Rate) {
	var d1, pw;
  	pw = Math.pow(1.0 / (1.0 + (Rate / 12)), NumOfYears * 12);
    d1 = (Amount * (1.0 - pw)) / (Rate / 12);
    return(d1);
}
    
/*function pmt(n, r, p) {
	return(-1*(((eval(r)*(eval(p)))/(1-Math.pow((1+eval(r)),eval(n)))-eval(r)*eval(p))/(1)));
}
*/
function pmt(AnnualInterestRate, YearsLength, Balance){
	var BAL = Balance;
	var INT = ((AnnualInterestRate/100) / 12);
	var MON = (YearsLength);
    var PMT = BAL * (INT / (1 - Math.pow(1 + INT, -MON)));
      
    return PMT;
}

  
function getBaseMonthIndex() {
	var i;
	for (i = 1; i <= 12; i++) {
		if (MonthNames[i].toUpperCase() == gBaseMonth.toUpperCase()) {
			return(i);		
		}
	}
	return(1);
}

function getIndexOfMonthJan() {
	var m;
	m = getBaseMonthIndex();
	if (m == 1) {
		return(1);
	}
	else {
		return(14 - m);
	}
}

function min2(a, b) {
	if (a < b) {
		return(a);
	}
	else {
		return(b);
	}
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

function clearByName(name, startn, endn) {
	var i;
	for (i = startn; i <= endn; i++) {
		document.getElementById(name + i).innerHTML = "";
	}
}

function getYearIncrVal() {
	if (getBaseMonthIndex() == 1) 
		return(1)
	else
		return(0);
}

function clearAll() {
	// First div
	clearByName("div_year", 1, 12);
	clearByName("div_month", 1, 12);
	clearByName("div_beginningbalance", 1, 12);
	clearByName("div_payments", 1, 12);
	clearByName("div_principal", 1, 12);
	clearByName("div_interest", 1, 12);
	clearByName("div_cumulativeprincipal", 1, 12);
	clearByName("div_cumulativeinterest", 1, 12);
	clearByName("div_endingbalance", 1, 12);
	
	//Second div
	clearByName("div_yearly_year", 1, 30);
	clearByName("div_yearly_beginningbalance", 1, 30);
	clearByName("div_yearly_payments", 1, 30);
	clearByName("div_yearly_principal", 1, 30);
	clearByName("div_yearly_interest", 1, 30);
	clearByName("div_yearly_cumulativeprincipal", 1, 30);
	clearByName("div_yearly_cumulativeinterest", 1, 30);
	clearByName("div_yearly_endingbalance", 1, 30);
       
}

function computeForm() {
	clearAll();
	initGlobals();
	if (gLoanPeriodInYears > 30) {
		alert("Loan Period should not be greater than 30!");
		document.getElementById("txt_LoanPeriodInYears").focus();
	}
	else if (Trim(document.getElementById("txt1").value) == "") {
		alert("Enter a valid Loan Principal Amount!");
		document.getElementById("txt1").focus();
	}
	else if (Trim(document.getElementById("txt_AnnualInterestRate").value) == "") {
		alert("Enter a valid Annual Interest Rate!");
		document.getElementById("txt_AnnualInterestRate").focus();
	}
	else if (Trim(document.getElementById("txt_LoanPeriodInYears").value) == "") {
		alert("Enter a valid Loan Period!");
		document.getElementById("txt_LoanPeriodInYears").focus();
	}
	else if (Trim(document.getElementById("txt_BaseYearOfLoan").value) == "") {
		alert("Enter a valid Base Year of Loan!");
		document.getElementById("txt_BaseYearOfLoan").focus();
	}
	else {
		computeHeader();
		computeInternalTables();
		computeTable1();
		computeTable2();
		computeSummary();
	}
}

function initGlobals() {
	if (document.getElementById("txt1").value != "") 
		gLoanPrincipalAmount = parseInt(document.getElementById("txt1").value);
	if (document.getElementById("txt_BaseYearOfLoan").value != "") 
		gBaseYear = parseInt(document.getElementById("txt_BaseYearOfLoan").value); 
	if (document.getElementById("txt_AnnualInterestRate").value != "") 
		gAnnualInterestRate = parseInt(document.getElementById("txt_AnnualInterestRate").value);
	if (document.getElementById("txt_LoanPeriodInYears").value != "") 
		gLoanPeriodInYears = parseInt(document.getElementById("txt_LoanPeriodInYears").value);
	gMonths = gLoanPeriodInYears  * 12;
    gBaseMonth = document.getElementById("cmb_BaseMonthOfLoan").options[document.getElementById("cmb_BaseMonthOfLoan").selectedIndex].text; 
}

function computeHeader() {

	// Declarations
	var vLoanPrincipalAmount = 0, vAnnualInterestRate = 0, vLoanPeriodInYears = 0;
	var vBaseYearOfLoan = 0;
	var vAnnualLoanPayments = 0, vInterestInFirstCalendar = 0;
	var vInterestOverTermOfLoan = 0, vSumOfAllPayments = 0;
	
	// Reading from controls
	if (document.getElementById("txt1").value != "") 
		vLoanPrincipalAmount = parseInt(document.getElementById("txt1").value);
	if (document.getElementById("txt_AnnualInterestRate").value != "") 
		vAnnualInterestRate = parseFloat(document.getElementById("txt_AnnualInterestRate").value);
	if (document.getElementById("txt_LoanPeriodInYears").value != "") 
		vLoanPeriodInYears = parseInt(document.getElementById("txt_LoanPeriodInYears").value);

	vBaseYearOfLoan = gBaseYear;
		
	// Calculations
//	gMonthlyPayments = pmt(gMonths, (vAnnualInterestRate / 100) / 12, vLoanPrincipalAmount);
	gMonthlyPayments = pmt(vAnnualInterestRate, gMonths, vLoanPrincipalAmount);
	document.getElementById("div_monthlypayments").innerHTML = formatNumber(gMonthlyPayments);

	vAnnualLoanPayments = gMonthlyPayments * 12;
	document.getElementById("div_annualloanpayments").innerHTML = formatNumber(vAnnualLoanPayments);
	
	vSumOfAllPayments = vInterestOverTermOfLoan + vLoanPrincipalAmount;
	document.getElementById("div_sumofallpayments").innerHTML = formatNumber(vSumOfAllPayments);
}

function computeInternalTables() {

	tableM = new Array(100);
	tableN = new Array(100);
	tableO = new Array(12);
	tableQ = new Array(12);
	
	MonthNames = new Array(12);
	// Months assigning
	MonthNames[1] = "Jan";
	MonthNames[2] = "Feb";	
	MonthNames[3] = "Mar";	
	MonthNames[4] = "Apr";	
	MonthNames[5] = "May";	
	MonthNames[6] = "Jun";	
	MonthNames[7] = "Jul";	
	MonthNames[8] = "Aug";	
	MonthNames[9] = "Sep";	
	MonthNames[10] = "Oct";	
	MonthNames[11] = "Nov";	
	MonthNames[12] = "Dec";	
	
	// Creating the Internal Reference table M and N w.r.t excel sheet table starting at M 195
	for (i = 1; i <= 30; i++) {
	
		// Calculating M	
		if (i == 1) {
			if (getBaseMonthIndex() == 1) {
				tableM[i] = 24;
			}
			else {
				tableM[i] = getIndexOfMonthJan() + 11;
			}
		}
		else {
			tableM[i] = min2(gMonths, tableM[i - 1] + 12);
		}
		// Calculating N
		tableN[i] = gMonths - tableM[i];
	}
	
	// Creating the Internal table O of excel sheet
	tableO[1] = getBaseMonthIndex();
	for (i = 2; i <= 12; i++) {
		if (tableO[i - 1] < 12) {
 			tableO[i] = tableO[i - 1] + 1;
 		}
 		else {
 			tableO[i] = 1;
 		}
	}
	
}

function computeTable1() {
	
	// Declarations
	var i = 0, j = 0, vLoanPrincipalAmount = 0, vAnnualInterestRate = 0;
	var tSum = 0;
	var BegBalances = new Array(12);
	var Principals = new Array(12);
	var CumulativePrincipals = new Array(12);
	var EndBalances = new Array(12);
	var Interests = new Array(12);
	var CumulativeInterests = new Array(12);
	
	// Reading from UI 
	if (document.getElementById("txt1").value != "") 
		vLoanPrincipalAmount = parseInt(document.getElementById("txt1").value);
	if (document.getElementById("txt_AnnualInterestRate").value != "")
		vAnnualInterestRate = parseInt(document.getElementById("txt_AnnualInterestRate").value);
		
	vBaseYearOfLoan = gBaseYear;
	
	for (i = 1; i <= 12; i++) {
		
		if (tableO[i] == 1) {
			if (i == 1) 
		    	document.getElementById("div_year" + i).innerHTML = vBaseYearOfLoan
		    else
			    document.getElementById("div_year" + i).innerHTML = vBaseYearOfLoan + 1;
	    }
    	document.getElementById("div_month" + i).innerHTML = MonthNames[tableO[i]];
    	
    	// Assigning to variables
    	if (i == 1) {
	    	BegBalances[i] = vLoanPrincipalAmount;
    	}
    	else {
	    	BegBalances[i] = EndBalances[i - 1];
    	}
    	Interests[i] = (BegBalances[i] * (vAnnualInterestRate / 12)) / 100;
    	Principals[i] = gMonthlyPayments - Interests[i];
    	
    	// Getting Cumulative Principals
    	tSum = 0;
    	for (j = 1; j <= i; j++) {
    		tSum = tSum + Principals[j];
    	}
    	CumulativePrincipals[i] = tSum;
    	
    	// Getting Cumulative Interests
    	tSum = 0;
    	for (j = 1; j <= i; j++) {
    		tSum = tSum + Interests[j];
    	}
    	CumulativeInterests[i] = tSum;
    	gHighestCumulativeInterest = CumulativeInterests[i];
    	
    	EndBalances[i] = BegBalances[i] - Principals[i];
    	
    	// Setting the global balance variable for processing by second table
    	if (tableO[i] == 12) {
	    	gTable2FirstYearLastBalance = EndBalances[i];
	    	gInterestInFirstCalYear = CumulativeInterests[i];
	    }
		    
    	// Assigning to UI
   		document.getElementById("div_beginningbalance" + i).innerHTML = formatNumber(BegBalances[i]);
    	document.getElementById("div_payments" + i).innerHTML = formatNumber(gMonthlyPayments);
   		document.getElementById("div_principal" + i).innerHTML = formatNumber(Principals[i]);
   		document.getElementById("div_cumulativeprincipal" + i).innerHTML = formatNumber(CumulativePrincipals[i]);
   		document.getElementById("div_interest" + i).innerHTML = formatNumber(Interests[i]);
   		document.getElementById("div_cumulativeinterest" + i).innerHTML = formatNumber(CumulativeInterests[i]);
   		document.getElementById("div_endingbalance" + i).innerHTML = formatNumber(EndBalances[i], 2);
    	
	}
	
}

function computeTable2() {

	// Declarations
	var i = 0; vBaseYear = 0, vNoOfYears = 0;
	var BegBalances = new Array(30);
	var EndBalances = new Array(30);
	var Payments = new Array(30); 
	var Principals = new Array(30); 
	var Interests = new Array(30); 
	var CumulativePrincipals = new Array(30); 
	var CumulativeInterests = new Array(30); 
		
	// Reading from UI
	if (document.getElementById("txt_LoanPeriodInYears").value != "") 
		vNoOfYears = parseInt(document.getElementById("txt_LoanPeriodInYears").value);
	
	vBaseYear = gBaseYear;
	
	// Processing
	for (i = 1; i <= (vNoOfYears - getYearIncrVal()); i++) {
		
		// Assigning to variables
		if (i == 1) {
			BegBalances[i] = gTable2FirstYearLastBalance;
			Payments[i] = gMonthlyPayments * 12;
		}
		else {
			BegBalances[i] = EndBalances[i - 1];
			Payments[i] = gMonthlyPayments * min2(12, tableN[i - 1]);
		}
		EndBalances[i] = pv(tableN[i] / 12, gMonthlyPayments, gAnnualInterestRate / 100);
		//extra condition
		if (i == (vNoOfYears - getYearIncrVal())) {
			EndBalances[i] = 0;
		}
		Principals[i] = BegBalances[i] - EndBalances[i];
		Interests[i] = Payments[i] - Principals[i];
		
		// Assigning to UI
   		document.getElementById("div_yearly_year" + i).innerHTML = i + vBaseYear;
   		document.getElementById("div_yearly_beginningbalance" + i).innerHTML = formatNumber(BegBalances[i]);
   		document.getElementById("div_yearly_payments" + i).innerHTML = formatNumber(Payments[i]);
   		document.getElementById("div_yearly_endingbalance" + i).innerHTML = formatNumber(EndBalances[i]);
   		document.getElementById("div_yearly_principal" + i).innerHTML = formatNumber(Principals[i]);
   		document.getElementById("div_yearly_interest" + i).innerHTML = formatNumber(Interests[i]);
		
	}
	
	for (i = 1; i <= (vNoOfYears - getYearIncrVal()); i++) {
	
		if (i == 1) {
			CumulativePrincipals[i] = gLoanPrincipalAmount - EndBalances[i];
			if (tableO[12] < 12) {
				CumulativeInterests[i] = (24 - tableO[12]) * gMonthlyPayments - CumulativePrincipals[i]; 
			}
			else { 
				CumulativeInterests[i] = (24 * gMonthlyPayments) - CumulativePrincipals[i]; 
			}
			
		}
		else {
			CumulativePrincipals[i] = CumulativePrincipals[i - 1] + Principals[i];
			CumulativeInterests[i] = CumulativeInterests[i - 1] + Interests[i];
		}
   		document.getElementById("div_yearly_cumulativeprincipal" + i).innerHTML = formatNumber(CumulativePrincipals[i]);
   		document.getElementById("div_yearly_cumulativeinterest" + i).innerHTML = formatNumber(CumulativeInterests[i]);
    	if (CumulativeInterests[i] > gHighestCumulativeInterest) {
    		gHighestCumulativeInterest = CumulativeInterests[i];
    	}

	}
	
}

function computeSummary() {
	document.getElementById("div_interestinfirstcalendaryear").innerHTML = formatNumber(gInterestInFirstCalYear);
	document.getElementById("div_interestovertermofloan").innerHTML = formatNumber(gHighestCumulativeInterest); 
	document.getElementById("div_sumofallpayments").innerHTML = formatNumber(gHighestCumulativeInterest + gLoanPrincipalAmount);
}
