/*** getPayment ***/

function getPayment(principleField, termField, termOtherField, rateField, paymentField)
{
    //get and validate the values
	var principle = makeNumber(principleField.value, "Mortgage Amount") ;
	principleField.value = commaThis(principle) ; //display with commas for readability
	
	var term = termField.value ; //first try to get the term from the select
	if(term == "") { //if none selected, get it from the text box (other)
		term = makeNumber(termOtherField.value, "Mortgage Term") ;
	}
	if(term == "") { //there was no value in the text box, either
		alert("Please select or enter a mortgage term.") ;
		return false ;
	}
	//var term = makeNumber(termField.value, "Mortgage Term") ;
	//termField.value = term ;
	
	term = term * 12 ; // put in terms of months
	var rate = makeNumber(rateField.value, "Interest Rate") ;
	rateField.value = rate ;
	rate = rate * .01 / 12 ; //make not a percent then make monthly rate
	paymentField.value = commaCurrency(principle*(rate*Math.pow(1+rate,term))/(Math.pow(1+rate,term)-1)) ;
}//end of getPayment()


/*** affordAmount ***/

function affordAmount(incomeField, debtField, rateField, downPayField, stdPriceField, aggrPriceField)
{
    //get and validate the values
	var income = makeNumber(incomeField.value, "Income") ;
	incomeField.value = commaThis(income) ;
	var debt = makeNumber(debtField.value, "Debt") ;
	debtField.value = commaThis(debt) ;
	var rate = makeNumber(rateField.value, "Interest Rate") ;
	rateField.value = rate ;
	//rate = rate * .01 / 12 ; //make not a percent then make monthly rate
	var down = makeNumber(downPayField.value, "Down Payment") ;
	downPayField.value = down ;
	
	var amor = ((rate/100)/12) +1 ; //amoritization factor
	
	var stdPrice = getPrice(income, debt, amor, down, .28) ;
	stdPriceField.value = stdPrice;

	var aggrPrice = getPrice(income, debt, amor, down, .35) ;
	aggrPriceField.value = aggrPrice ;
	
}//end of affordAmount()

function getPrice(income, debt, amor, down, incomePerct)
{
    var monthlyPay = incomePerct*(income - debt) ; //maximum payment is incomePerct% of gross income - debt
    var price = ((monthlyPay * (1- Math.pow(amor, -360)))/(amor-1)) ;
    price = Number(price) + Number(down) ;
    price = commaCurrency(price) ;

    return price ;
}


/*** affordAmountPMI ***/

/*
calculates the price a buyer can afford based on income, debt, interest rate, tax rate, maintenance fee, and down payment %

logic:
PITI - taxes - maint fees - PMI = net payment
mortgage amount = m = net payment * (1-a^-n) / (a-1)
p = sale price
m = p - downPayment = p(1-downPayment%)
a is the amoriziation factor -- a constant
n is the term -- constant (at 360 in this case)

substitute the first formula for net payment in the price formula:
p = (PITI - taxes - maint fees - PMI) * (1-a^-n) / (a-1)

PMI is the PMI factor (which is based on the down payment %) times the loan amount [loan amount = p - downPayment = p(1-downPayment%) ]
also have to convert taxes, maint fees to monthly (/12)

Let X = 1-a^-n ; Y = a-1 (constants)
do lots of algebra
then:
p = [ (maintFees)(X) - 12(PITI)(X) ] / [-taxRate(X) - (PMIfactor)(1-downPayment%)(X) - 12Y(1-downPayment%) ]

*/

function affordAmountPMI(incomeField, debtField, rateField, taxRateField, maintFeeField, paymentField, stdPriceField, aggrPriceField, stdDownField, aggrDownField, stdLoanField, aggrLoanField, msgField)
{

    //get and validate the values
	var income = makeNumber(incomeField.value, "Income") ;
	incomeField.value = commaThis(income) ;
	var debt = makeNumber(debtField.value, "Debt") ;
	debtField.value = commaThis(debt) ;
	var rate = makeNumber(rateField.value, "Interest Rate") ;
	var taxRate = makeNumber(taxRateField.value, "Tax Rate") ;
	taxRate = taxRate / 100 ; //make it a percent
	var maintFee = makeNumber(maintFeeField.value, "Maintenance Fee") ;
	maintFeeField.value = maintFee ;
	var payment = paymentField.value ;

	if(payment == 0)
	{
		msgField.value = "Programs for very low down payments are available. Please contact Darrin directly." ;
		//clear other fields
		incomeField.value = "" ;
		debtField.value = "" ;
		rateField.value = "" ;
		taxRateField.value = "" ;
		maintFeeField.value = "" ;
		stdPriceField.value = "" ;
		aggrPriceField.value = "" ;
		stdDownField.value = "" ;
		aggrDownField.value = "" ;
		stdLoanField.value = "" ;
		aggrLoanField.value = "" ;	
		return ;
	}

	var amor = ((rate/100)/12) +1 ; //amoritization factor

	var stdPITI = allowPITI(income, debt, .28, .36) ;
	var aggrPITI = allowPITI(income, debt, .36, .45) ;

	//amoritization factor
	var amor = ((rate/100)/12) +1 ; 
	
	//determine PMI factor -- based on down payment %
	if(payment == 5)
		PMIfactor = .0078 ;
	else if (payment == 10)
		PMIfactor = .0052 ;
	else //payment = 15
		PMIfactor = 0 ;

	//get standard and aggressive prices and display	
	var stdPrice = getPricePMI(stdPITI, taxRate, maintFee, PMIfactor, payment, amor, 360) ;
	var aggrPrice = getPricePMI(aggrPITI, taxRate, maintFee, PMIfactor, payment, amor, 360) ;

	stdPriceField.value = commaCurrency(stdPrice) ;
	aggrPriceField.value = commaCurrency(aggrPrice) ;	

	//display required down payments
	var stdDown  = (payment / 100) * stdPrice ;
	stdDownField.value = commaCurrency(stdDown) ;
	var aggrDown =  (payment / 100) * aggrPrice ;
	aggrDownField.value = commaCurrency(aggrDown) ; 

	//display loan amounts
	stdLoanField.value = commaCurrency(stdPrice - stdDown) ;
	aggrLoanField.value = commaCurrency(aggrPrice - aggrDown) ;	
	
	if(payment == 15)
	{
		msgField.value = "For credit-worthy borrowers, First Place Bank offers 15% down with no PMI. (Less than credit-worthy borrowers may not qualify.)" ;
	}
	else {
		msgField.value = "" ;
	}	
}
//end of affordAmountPMI

/*** allowPITI ***/
// find the maximum allowable payment based on income and debt
// income * lowFactor = max payment
// income * highFactor = max payment + debt
// max payment is LOWER of these two
function allowPITI(income, debt, lowFactor, highFactor)
{
	var lowPay = income * lowFactor ;
	var highPay = (income * highFactor) - debt ;

	if(lowPay < highPay) {
		return lowPay ;
	}
	else {
		return highPay ;
	}
}//end allowPITI

/*** getPricePMI ***/
function getPricePMI(PITI, taxRate, maintFee, PMIfactor, payPct, amor, n)
{
	var X = 1 - (Math.pow(amor, -n)) ;
	var Y = amor - 1 ;

	payPct = payPct / 100 ; //turn down payment % to factor

	//price = numerator / denominator
	var num = (maintFee * X) - (12 * PITI * X) ;
	var den = (-taxRate * X) - (PMIfactor * (1-payPct) * X) - (12 * Y * (1-payPct)) ;

	return num / den ;

}//end getPricePMI

/*** borrowAmount ***/

function borrowAmount(paymentField, termField, termOtherField, rateField, amountField)
{
    var pay = makeNumber(paymentField.value, "Monthly Payment") ;
	paymentField.value = commaThis(pay) ;
	
	var term = termField.value ; //first try to get the term from the select
	if(term == "") { //if none selected, get it from the text box (other)
		term = makeNumber(termOtherField.value, "Mortgage Term") ;
	}
	if(term == "") { //there was no value in the text box, either
		alert("Please select or enter a mortgage term.") ;
		return ;
	}
	//var term = makeNumber(termField.value, "Term") ;
	//termField.value = term ;
	term = term * 12 ; //convert from years to months
	var rate = makeNumber(rateField.value, "Interest Rate") ;
	rateField.value = rate ;
	
	var amor = ((rate/100)/12) +1 ; //amoritization factor
	var amount = commaCurrency(((pay * (1- Math.pow(amor, -term)))/(amor-1))) ;
	
	amountField.value = amount ;

}//end borrowAmount


/*** makeNumber ***/

function makeNumber(result, fieldName){
    var newResult="", decpoint=0;
	var changeFlag = false ; //keep track of whether any letters were removed
	if(!isNaN(result)) return result;
	else result= ""+result; 
	for(i=0;i<result.length;i++)
	{
	    if( result.charAt(i) == "." || !isNaN (parseInt(result.charAt(i))) )
		{
		    newResult+=result.charAt(i); 
		}
		else if(result.charAt(i) != ",") //don't alert the user if a comma was removed
		{
		    changeFlag = true ;
		}
	}
  	if( isNaN(newResult) || newResult == "" )
	{ newResult = 0 ; }
	if(changeFlag == true) // letter was removed - alert user
	{ alert(fieldName + " was converted from " + result + " to " + commaThis(newResult) + ". If this is incorrect, please re-enter using numbers only.") ; }
	return parseFloat(newResult)
	
}//end of makeNumber()


/*** commaThis ***/

function commaThis(value){
    value=makeNumber(value);
	value+="";
	var dp= (value.indexOf(".") != -1)? value.indexOf("."):0;
	var trailing= (dp==0)? "":value.substring(dp,value.length);
	if(trailing) value=value.substring(0,dp);
	if(value.length>3)
	{
	    var offset=(value.length)%3;
		var block = (offset>0)? value.substring(offset,value.length):value;
		if (block.length>=6) block=block.substring(0,3)+","+block.substring(3,block.length);
		if(offset>0)
		{
		    return (value.substring(0,offset)+","+block+trailing);
		}else
		{
		    return block+trailing
		}
	}else
	{
	    return value+trailing
	}
} // end commaThis


/*** toCurrency ***/

function toCurrency (value, currency) {
	var is_neg=false 
	if(isNaN(value)) {alert("The value is not a number")}
	else
	{
	    if(!currency) currency=""; //could set to $ here
		var newValue = "" + Math.round (eval(value) * 100)
		if (newValue.charAt(0) =="-") is_neg=true;
		if(is_neg){newValue=newValue.substring(1)};
		while (newValue.length <= 2) {newValue = "0" + newValue}
		var dp = newValue.length - 2;
		newValue= currency+newValue.substring(0,dp) + "." + newValue.substring(dp,newValue.length);
		if (is_neg){newValue= "-"+newValue}
		return newValue
	}
}// end toCurrency()


/*** commaCurrency ***/

function commaCurrency(value){
    value=toCurrency(value);
	//value=value.substring(1); //removed b/c deleted $ from toCurrency
	value=commaThis(value);
	//value="$"+value;
	return value
} //end commaCurrency()


