
/*
  turn floating number into formatted currency string
*/

var tableData;     // array used to hold monthly table
var prince;        // principal entered
var rate;          // yearly interest rate
var years;         // years of loan term
var curYears;      // extra payment - current years
var curMonths;     // extra payment - current months
var curPrince;     // extra payment - current principal
var extraPay;      // extra montly payment
var summOnly;      // show only the summary - checkbox
var mRate;         // montly rate (calculated)
var months;        // months of term (calculated)
var mPayment;      // normal monthly payment (calculated)
var actualMonths;  // actual months with extra payment (calculated)
var totalInterest; // total interest payed lifetime (calculated)
var totalPayed;    // total money payed lifetime (calculated)
var monthsFromCur  // months til payoff from current (calculated)


/*
  called by the user, grabs input from fields, makes calculations,
  builds table, and then calls results functions
*/
function calc(){
	// Get form field values
	// --------------------------------
	prince    = parseFloat(get("principal").value);
	rate      = parseFloat(get("rate").value);
	years     = parseFloat(get("years").value);
	curYears  = parseFloat(get("curYears").value);
	curMonths = parseFloat(get("curMonths").value);
	curPrince = parseFloat(get("curPrince").value);
	extraPay  = parseFloat(get("extraPay").value);
	summOnly  = get("summOnly").checked;

	// Set initial conditions
	// --------------------------------
	// monthly interest rate
	mRate  = rate / (12*100);

	// months of loan term
	months = years * 12;

	// months currently at for extra payments
	curMonths = (curYears * 12) + curMonths;

	// normal monthly payment
	mPayment = prince * (mRate / (1-(Math.pow((1 + mRate), -months))));

	// initial counter values
	actualMonths = 1;
	totalInterest = 0;
	totalPayed = 0;
	monthsFromCur = 0;
  var remPrince = prince;
  
  if(curPrince > 0){ remPrince = curPrince; actualMonths = curMonths; }

	tableData = new Array();

	// Calculate monthly table
	// --------------------------------
	while(remPrince>0.01){
		var mIntPay = remPrince * mRate;                   // interest this month
		var mPrincePay = (mPayment - mIntPay);             // principal payed this month
		totalPayed += mIntPay + mPrincePay;

    if(curMonths <= actualMonths){
      mPrincePay += extraPay;
      totalPayed += extraPay;
  		var rowData = new Array();
  		rowData[0] = actualMonths;			      // month
  		rowData[1] = money(remPrince);	      // remaining principal
  		rowData[2] = money(mIntPay);		      // interest payed
  		rowData[3] = money(mPrincePay);	      // principal payed
  		rowData[4] = money(totalPayed);	      // total payed
  		tableData.push(rowData);
  	}

		remPrince -= mPrincePay;
		totalInterest += mIntPay;
		actualMonths++;
	}

	// Show results
	// --------------------------------
  hide("tableHeading");
  hide("yearsDiffPara");
  hide("intDiffShowPara");
  hide("intDiffNoShowPara");
  show("main");
  clearTag(get("drawTable"));

	drawResultText();

	if(!summOnly){
		show("drawingMsg");
		window.setTimeout("drawTable();",100);
	}
}


/*
  shows the result paragraph(s) depending on conditions.  is
  called by calc()
*/
function drawResultText(){
	//resultText = get("resultText");
	//clearTag(resultText);

	// normal total payment
	var normalTotalPay = mPayment * months;

	// normal total interest to be payed
	var normalInterest = normalTotalPay-prince;

	// actual total interest payed
	//var actualInterest = (mRate * curMonths * prince) + totalInterest;
	//alert("mRate*curMonths*prince="+(mRate*curMonths*prince)+", totalInterest="+totalInterest);

	// difference between normal and actual interest payed
	var interestDiff = normalInterest - totalInterest;

	// actual years taken
	var yearsTook = Math.round(((actualMonths-1)/12) * 10)/10;

	// years after current point taken
	var yearsFromNow = Math.round(((actualMonths-curMonths)/12) * 10)/10;

	// difference between normal and actual years taken
	var yearsDiff = Math.round((years - yearsTook) * 10)/10;

  putTextInTag("princeTxt",           money(prince));
  putTextInTag("rateTxt",             rate);
  putTextInTag("mPaymentTxt",         money(mPayment));
  putTextInTag("yearsTxt",            years);
  putTextInTag("monthsTxt",           months);
  putTextInTag("totalPayedTxt",       money(normalTotalPay));
  putTextInTag("normalInterestTxt",   money(normalInterest));
  putTextInTag("yearsTookTxt",        yearsTook);
  putTextInTag("yearsFromNowTxt",     yearsFromNow);
  putTextInTag("yearsDiffTxt",        yearsDiff);
  putTextInTag("actualInterestTxt",   money(totalInterest));
  putTextInTag("interestDiffTxt",     money(interestDiff));
  putTextInTag("interestFromNowTxt",  money(totalInterest));

  if(curPrince > 0 || extraPay > 0){ 
    show("yearsDiffPara");
    if(curPrince > 0){ show("intDiffNoShowPara"); }
    else             { show("intDiffShowPara"); }
  }
}


/*
  drawTable and makeRow are called by calc() to display the data
  stored in the tableData array
*/
function drawTable(){
	var drawTable = get("drawTable");
	var newTable = newFromTemplate("tableTemplate");
	clearTag(drawTable);
	drawTable.appendChild(newTable);
	var tableBody = newTable.appendChild(document.createElement("tbody"));
	for(var i=0; i<tableData.length; i++){
		var row = makeRow(tableData[i]);
		tableBody.appendChild(row);
	}
	showObject(newTable);
	show("tableHeading");
	hide("drawingMsg");
}

function makeRow(dataArray){
	var row = newFromTemplate("rowTemplate");
	for(var i=0; i<dataArray.length; i++){
		var cell = getTag(row, "td", i);
    cell.appendChild(makeText(dataArray[i]));
	}
	return row;
}


/*
  turn floating number into formatted currency string
*/
function money(num) {
	// adapted from original currency formatter
	// by Cyanide_7 (leo7278@hotmail.com)
	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));
	return (((sign)?'':'-') + num + '.' + cents);
}