function OnIntRateChange(oControl)
{
	var sValue;
	
	sValue = oControl.value;
	if (isNaN(Number(sValue)) || sValue == "")
		return;
	
	oControl.value = sValue + "%";
}

function OnClear(oControl)
{
	oControl.form.reset();
}

function OnCalculate()
{
	var nPayment;
	var nInterest;
	var nLoanAmount;
	var nTime;

	nLoanAmount = document.getElementById('frmCalcPayment').txtLoanAmount.value;
	if (isNaN(Number(nLoanAmount)) || nLoanAmount == "")
	{
		alert ("You must enter a numeric loan amount.");
		document.getElementById('frmCalcPayment').txtLoanAmount.focus();
		return;
	}

	nInterest = document.getElementById('frmCalcPayment').txtInterestRate.value;
	nInterest = String(nInterest).substr(0, nInterest.length - 1)
	if (isNaN(Number(nInterest)) || nInterest == "")
	{
		alert ("You must enter a numeric interest rate.");
		document.getElementById('frmCalcPayment').txtInterestRate.focus();
		return;
	}
	nInterest = nInterest / 100;
	
	nTime = document.getElementById('frmCalcPayment').txtYears.value;
	if (isNaN(Number(nTime)) || nTime == "")
	{
		alert ("You must enter a numeric number of years.");
		document.getElementById('frmCalcPayment').txtYears.focus();
		return;
	}		
	
	document.getElementById('frmCalcPayment').txtPayment.value = GetMonthlyPayment(nLoanAmount, nInterest, nTime);
}

function OnCalculateAfford()
{
	var nPayment;
	var nInterest;
	var nLoanAmount;
	var nTime;

	nPayment = document.getElementById('frmCalcPrincipal').txtPaymentAfford.value;
	if (isNaN(Number(nPayment)) || nPayment == "")
	{
		alert ("You must enter a numeric monthly payment.");
		document.getElementById('frmCalcPrincipal').txtPaymentAfford.focus();
		return;
	}

	nInterest = document.getElementById('frmCalcPrincipal').txtInterestAfford.value;
	nInterest = String(nInterest).substr(0, nInterest.length - 1)
	if (isNaN(Number(nInterest)) || nInterest == "")
	{
		alert ("You must enter a numeric interest rate.");
		document.getElementById('frmCalcPrincipal').txtInterestAfford.focus();
		return;
	}
	nInterest = nInterest / 100;
	
	nTime = document.getElementById('frmCalcPrincipal').txtYearsAfford.value;
	if (isNaN(Number(nTime)) || nTime == "")
	{
		alert ("You must enter a numeric number of years.");
		document.getElementById('frmCalcPrincipal').txtYearsAfford.focus();
		return;
	}		
	
	document.getElementById('frmCalcPrincipal').txtLoanAmountAfford.value = GetLoanAmount(nPayment, nInterest, nTime);
}

function OnCalculateRemain()
{
	var nPayment;
	var nInterest;
	var nPrincipal;
	var nPeriods;

	nPrincipal = document.getElementById('frmCalcTime').txtPrincipal.value;
	if (isNaN(Number(nPrincipal)) || nPrincipal == "")
	{
		alert ("You must enter a numeric value for principal.");
		document.getElementById('frmCalcTime').txtPrincipal.focus();
		return;
	}

	nPayment = document.getElementById('frmCalcTime').txtPayment.value;

	if (isNaN(Number(nPayment)) || nPayment == "")
	{
		alert ("You must enter a numeric monthly payment.");
		document.getElementById('frmCalcTime').txtPayment.focus();
		return;
	}

	nInterest = document.getElementById('frmCalcTime').txtInterest.value;
	nInterest = String(nInterest).substr(0, nInterest.length - 1)
	if (isNaN(Number(nInterest)) || nInterest == "")
	{
		alert ("You must enter a numeric interest rate.");
		document.getElementById('frmCalcTime').txtInterest.focus();
		return;
	}
	nInterest = nInterest / 100;
	
	document.getElementById('frmCalcTime').txtPaymentsLeft.value = GetPaymentsLeft(nPrincipal, nPayment, nInterest);
}

function RaiseToPower(nBase, nExp)
{
	return Math.pow(nBase, nExp)
}

function GetMonthlyPayment(nLoanAmount, nInterest, nTime)
{
	var nPayment;
	// no monthly compounding
	//nInterest = nInterest / 12;
	// apr compounded monthly
	nInterest = (RaiseToPower(1 + nInterest, 1/12)) - 1;
	nTime = nTime * 12;
	
	nPayment = (nInterest * nLoanAmount * RaiseToPower( 1 + nInterest, nTime))  / (RaiseToPower( 1 + nInterest, nTime) - 1)

	//return Math.round(nPayment);
	return sdCurrency(nPayment);
}

function OnRound(nNumber)
{
	sdRound(nNumber, -2);
	alert(sdCurrency(nNumber));
}


function sdRound(nNumber, nPlaces)
{
	var sNumber;
	var sReturn;
	var iDecimal;
	var iExp;
	var iExpNum;
	var sExp;
	var sBuildNumber;
	var iLen;
	var iIndex;
	var sChar;
	var sPrefix;
	var sSuffix;
	
	sNumber = new String(nNumber);

	// is it expressed as an exponent?
	iExp = sNumber.search("e");
	if (iExp != -1)
	{
		iLen = sNumber.length;
		sExp = sNumber.substr(iExp + 2, iLen - iExp - 1);
		iExpNum = Number(sExp);
		iDecimal = sNumber.search(/\./);
		if (iDecimal != -1)
		{
			// parse the exponential # to a normal #
			sBuildNumber = sNumber.substr(0, iExp);
			for (iIndex = sBuildNumber.length - iDecimal - 1; iIndex < iExpNum; iIndex++)
			{
				sBuildNumber = sBuildNumber + "0";
			}

			for (iIndex=1; iIndex < iExpNum + 1; iIndex++)
			{
				sPrefix = sBuildNumber.substr(0, iIndex) + sBuildNumber.substr(iIndex + 1, 1);
				sSuffix = sBuildNumber.substr(iIndex + 2, sBuildNumber.length - iIndex - 2);
				//sBuildNumber = sBuildNumber.substr(0, iIndex + 1) + "." + sBuildNumber.substr(iIndex + 2, sBuildNumber.length - iIndex - 2);
				sBuildNumber = sPrefix + "." + sSuffix;
			}
		}
		sNumber = sBuildNumber;
	}

	iDecimal = sNumber.search(/\./);
	
	if (iDecimal != -1)
	{
		// Rounding to a place that's higher than the original number
		if (sNumber.length - iDecimal + nPlaces <= 0)
			return 0;
					
		// Rounding decimal places
		if (nPlaces > 1)
		{
			// fill the end with 0's up to the # of places requested
			while (sNumber.length - 1 - iDecimal < nPlaces)
			{
				sNumber = sNumber + "0";
			}
			
			if (iDecimal == 0)
			{
				sNumber = "0" + sNumber;
				iDecimal = iDecimal + 1;
			}
			
			// Get the left side of the number
			sReturn = sNumber.substr(0, iDecimal + 1);
			
			// Get the right side of the number
			if ((sNumber.length - 1) - iDecimal > nPlaces)
			{
				sReturn = sReturn + sNumber.substr(iDecimal + 1, nPlaces + 1);
				sChar = sReturn.substr(sReturn.length - 1, 1);
				if (Number(sChar) >= 5)
				{
					sReturn = Number(sReturn) + RaiseToPower(10, nPlaces * -1);
				}
				sReturn = String(sReturn).substr(0, iDecimal + 1 + nPlaces);
			}
			else
			{
				sReturn = sReturn + sNumber.substr(iDecimal + 1, nPlaces);
			}
		}
		else	// TODO:  rounding to left of decimal
		{
			sReturn = sNumber;
		}
		
	}
	else
	{
		// Rounding to a place that's higher than the original number
		if (sNumber.length + nPlaces <= 0)
			return 0;
			
		if (nPlaces > 0)
		{
			sReturn = sNumber + ".";
			iDecimal = sReturn.length;
			while (sReturn.length < iDecimal + nPlaces)
			{
				sReturn = sReturn + "0";
			}
		}
		
	}

	return sReturn;
}

function sdCurrency(nNumber)
{
	var sNumber;
	var sTemp;
	var sTemp2;
	var iDecimal;
	var i;
	var x;
			
	// Round to 2 decimals
	sNumber = sdRound(nNumber, 2);

	iDecimal = String(sNumber).search(/\./);
	
	if (iDecimal != -1)
	{
		sTemp = String(sNumber).substr(0, iDecimal);
	}
	else
	{
		sTemp = sNumber;
	}

	// insert commas into sTemp
	x = 1;
	sTemp2 = "";
	for (i = String(sTemp).length - 1; i > -1; i--)
	{
		if ((x % 3) == 0 && (i != 0))
		{
			sTemp2 = "," + String(sTemp).substr(i, 1) + sTemp2;
		}
		else
		{
			sTemp2 = String(sTemp).substr(i, 1) + sTemp2;
		}
		x = x + 1;
	}
	
	if (iDecimal != -1)
	{
		sNumber = "$" + sTemp2 + String(sNumber).substr(String(sNumber).length - 3, 3);
	}
	else
	{
		sNumber = "$" + sTemp2;
	}
	
	return sNumber;
	
}

function GetLoanAmount(nPayment, nInterest, nTime)
{
	var nValue;
	
	// no monthly compounding
	//nInterest = nInterest / 12;
	// apr compounded monthly
	nInterest = (RaiseToPower(1 + nInterest, 1/12)) - 1;
	nTime = nTime * 12;
	
	nValue = (nPayment * (RaiseToPower(1+nInterest, nTime) - 1)) / (nInterest * RaiseToPower(1+nInterest, nTime))

	//return Math.round(nValue);
	return sdCurrency(nValue);
}

function GetPaymentsLeft(nPrincipal, nPayment, nInterest)
{
	var nValue;
	
	nInterest = (RaiseToPower(1 + nInterest, 1/12)) - 1;
	
	nValue = (Math.log(nPayment) - Math.log(nPayment - nPrincipal * nInterest)) / Math.log(1 + nInterest)

	return nValue;
}