function IsNumeric(sText)

{
   var ValidChars = "$0123456789,.";
   var IsNumber=1;
   var Char;
 
   for (i = 0; i < sText.length && IsNumber == true; i++) 
      { 
      Char = sText.charAt(i); 
      if (ValidChars.indexOf(Char) == -1) 
         {
         IsNumber = 0;
         }
      }
   return IsNumber;   
   }

function validate (theItem)
{
	if ((IsNumeric(theItem.value)==0) || (theItem.value == ""))
	{
			theItem.value = 0;
			calculateLoan();
	}
}


function calculateLoan(theItem)
{
	// Get fully numeric values
	calcAmount = parseFloat((document.getElementById('mortAmount').value).replace(/[^0-9\.]/gi, ''));
	calcInterest = (parseFloat((document.getElementById('mortInterest').value).replace(/[^0-9\.]/gi, '')))/100;
	calcTerm = parseFloat((document.getElementById('mortYears').value).replace(/[^0-9\.]/gi, ''));
	calcDown = parseFloat((document.getElementById('mortDown').value).replace(/[^0-9\.]/gi, ''));
		calcInsur = parseFloat((document.getElementById('insurYears').value).replace(/[^0-9\.]/gi, ''));
		calcTax = parseFloat((document.getElementById('taxYears').value).replace(/[^0-9\.]/gi, ''));

	// Months to pay, rounded to two decimals
	outPayments = (calcTerm * 12) * 100;
	outPayments = Math.round(outPayments)/100;

	// Mortgage calculation, rounded to two decimals
    if (document.getElementById('mortDownPercent').checked)
    {
        // Percentage
        outTotalAmount = calcAmount - (calcAmount * (calcDown / 100));
    } else {
        // Cash value
		outTotalAmount = calcAmount - calcDown;
    }
	
	//Interest Only Loan
	if (document.getElementById('inOnlyLoan').checked)
    { 
		calcInOnlyLoan = (outTotalAmount * calcInterest)/12;
		
	} else {
		calcInOnlyLoan = 0;
    }

	if (document.getElementById('inOnlyLoan').checked)
	{
		outMonthlyAmount = calcInOnlyLoan;
	}
	else
	{
		outMonthlyAmount = ((calcInterest/12)*(Math.pow((1+(calcInterest/12)),(calcTerm*12)))*outTotalAmount)/(-1+(Math.pow((1+(calcInterest/12)),(calcTerm*12))));
		outMonthlyAmount = outMonthlyAmount * 100;
		outMonthlyAmount = Math.round(outMonthlyAmount)/100;
	}
	outMonthlyAmount = outMonthlyAmount + (calcInsur/12);
	outMonthlyAmount = outMonthlyAmount + (calcTax/12);

	// Return results, and return 0 if it's a negative number (down payment > principal)
	if (outMonthlyAmount > 0)
	{
		document.getElementById('monthlyAmount').value = currency(outMonthlyAmount) ;
	} else {
		document.getElementById('monthlyAmount').value = 0;
	}
}

// From http://www.cs.adfa.edu.au/courses/ACSC3008/coursework/currency-coolnerds.html
function currency(anynum) {
   //-- Returns passed number as string in $xxx,xxx.xx format.
   anynum=eval(anynum)
   workNum=anynum;workStr=""+workNum
   if (workStr.indexOf(".")==-1){workStr+=".00"}
   dStr=workStr.substr(0,workStr.indexOf("."));dNum=dStr-0
   pStr=workStr.substr(workStr.indexOf("."))
   while (pStr.length<3){pStr+="0"}

   //--- Adds comma in thousands place.
   if (dNum>=1000) {
      dLen=dStr.length
      dStr=parseInt(""+(dNum/1000))+","+dStr.substring(dLen-3,dLen)
   }

   //-- Adds comma in millions place.
   if (dNum>=1000000) {
      dLen=dStr.length
      dStr=parseInt(""+(dNum/1000000))+","+dStr.substring(dLen-7,dLen)
   }
   retval = dStr + pStr 
   //-- Put numbers in parentheses if negative.
   if (anynum<0) {retval="("+retval+")"}
   
   return retval.substr(0,retval.indexOf("."))
}
