

/*** CALCULATOR LOGIC  (NOT WRITTEN BUT CLEANED BY CADE CANNON) ****/


/*** RENT VS BUYING ****/
function Cleanit(InputString){
	OutputString = "";
	for (i=0;i<InputString.length;i++){
	  	var chr = InputString.substring(i,i+1);
		if ((chr=="0") || (chr=="1") || (chr=="2") || (chr=="3") || (chr=="4") || (chr=="5") || (chr=="6") || (chr=="7") || (chr=="8") || (chr=="9") || (chr==".")){				
			OutputString = OutputString + chr;
		}
	}
	return (OutputString);
}
// Round off and insert decimal point in output
function Dec(q){
	b = ""+Math.round(q*100);
	c = b.substring(0,b.length-2);
	d = b.substring(b.length-2,b.length);
	return (c+"."+d);
}

function Base1(k, n){
	b = 1;
	for (j=0;j<n;j++){
	  	b = b*(1+k);
	}
	return b;
}

function calculateRentOrBuy(form)
{
	// convert input values to all numerals
	form.b_rent.value = Cleanit(form.b_rent.value);
	form.b_savings.value = Cleanit(form.b_savings.value);
	form.b_rate.value = Cleanit(form.b_rate.value);
	form.b_points.value = Cleanit(form.b_points.value);
	form.b_costs.value = Cleanit(form.b_costs.value);
	form.b_tax.value = Cleanit(form.b_tax.value);
	form.b_insurance.value = Cleanit(form.b_insurance.value);
	// check input values and convert to numbers if OK
	flag = 0;
	if (form.b_rent.value == ""){flag = 1;form.b_rent.value ="????"}
	else {pmt = parseFloat(form.b_rent.value)}
	if (form.b_savings.value == ""){sav = 0}
	else {sav = parseFloat(form.b_savings.value)}
	if (form.b_rate.value == ""){i = 0}
	else {i = parseFloat(form.b_rate.value)}
	if (form.b_points.value == ""){pnt = 0}
	else {pnt = parseFloat(form.b_points.value)}
	if (form.b_costs.value == ""){cst = 0}
	else {cst = parseFloat(form.b_costs.value)}
	if (form.b_tax.value == ""){tax = 0}
	else {tax = parseFloat(form.b_tax.value)}
	if (form.b_insurance.value == ""){ins = 0}
	else {ins = parseFloat(form.b_insurance.value)}
	// get number of payments and set balloon payment value to 0
	var a = form.b_term.selectedIndex;
	n = parseFloat(form.b_term.options[a].value);
	fv = 0;
	if (flag == 0){
		piti = pmt-((tax/12)+(ins/12));
		if (i > 0){
			k = i/1200;
			c = Base1(k,n);
			mamt = Dec(piti*((1-(1/c))/k)+fv/c);
		}
		else{
			mamt = Dec(piti*n + fv);
		}
		housecost = Dec(mamt-(mamt*(pnt/100))-cst+sav);
		 
		if (sav > (mamt*(pnt/100))+cst){
			downpayment = sav-(mamt*(pnt/100))-cst;
			downpercent = (downpayment/housecost)*100;
		}
		else{
			downpayment = 0
		}
		form.b_mortamt.value = "$" + mamt;
		form.b_housecost.value = "$" + housecost;
		if (downpayment == 0){
			form.b_down.value = "None";
			form.b_downpercent.value = "None";
		}	
		else{
			form.b_down.value = "$" + Dec(downpayment);
			form.b_downpercent.value = Dec(downpercent) + "%";
		}
	}
	else{
		alert("You must enter a monthly rent payment.");
	}
}

function clearRvBForm(form)
{
	form.b_rent.value = "";
	form.b_savings.value = "";
	form.b_rate.value = "";
	form.b_points.value = "";
	form.b_costs.value = "";
	form.b_tax.value = "";
	form.b_insurance.value = "";
	form.b_mortamt.value = "";
	form.b_housecost.value = "";
	form.b_down.value = "";
	form.b_downpercent.value = "";
}

/****   AFFORD CALCULATOR *****/
function edValue(element) {
	var lField = ltrim(rtrim(String(element.value)));

    myReg=new RegExp("^[0-9]*\\.?[0-9]*$"); 
        if (!(myReg.test(lField) && lField!='.')) {
			alert("Please enter valid numerical data in all fields!");
			return false;
		}

	element.value=lField; 
	return true;
}


function rtrim(argvalue){
	while (1){
		if (argvalue.substring(argvalue.length - 1, argvalue.length) != " "){
			break;
		}
		argvalue = argvalue.substring(0, argvalue.length - 1);
	}
	return argvalue;
}

function ltrim(argvalue){
	while(1){
    	if (argvalue.substring(0, 1) != " "){ 
			break;
		}
		argvalue = argvalue.substring(1, argvalue.length);
  	}
	return argvalue;
}

function trim(str){
	return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}  

function calculateHowMuchCanIAfford(form){
	var tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9, tmp10, tmp11;
  	if(trim(form.income.value) != "" && trim(form.other.value) != "" && trim(form.taxes.value) != "" && trim(form.insurance.value) != "" && trim(form.auto.value) != "" && trim(form.cards.value) != "" && trim(form.term.value) != "" && trim(form.rate.value) != ""){							 
		tmp12 = Math.round(eval(form.income.value * .28) + eval(form.other.value * .28) - form.taxes.value - form.insurance.value);
		tmp13 = Math.round(eval(form.income.value * .36) + eval(form.other.value * .36) - form.taxes.value -  form.insurance.value - form.auto.value - form.cards.value);
	
		if (tmp12 > tmp13){
			form.payment.value = tmp13
		}
		else{
			form.payment.value = tmp12
		}
	
		tmp1 = parseFloat(form.rate.value);
		if (isNaN(tmp1)) tmp1=0;
		tmp2 = parseFloat(form.term.value);
		if (isNaN(tmp2)) tmp2=0;
		tmp3 = parseFloat(form.payment.value);
		if (isNaN(tmp3)) tmp3=0;
		tmp4 = parseFloat(tmp1 / 1200); 
		tmp5 = parseFloat(tmp2 * 12);
		tmp6 = parseFloat(1 + tmp4);
		tmp7 = parseFloat(Math.pow(tmp6, tmp5));
		tmp8 = parseFloat(1 / tmp7);
		tmp9 = parseFloat(1 - tmp8);
		tmp10 = parseFloat(tmp9 / tmp4);
		tmp11 = parseFloat(tmp3 * tmp10);
		form.amount.value = Math.round(tmp11);
	
	}
	else{
		alert("Please enter valid numerical data in all fields!");
		return false;
	}
}

function checkInput(input, min, max, msg)
{   
	msg = msg + " field has invalid data: " + input.value;
	var lField = ltrim(rtrim(String(input.value)));
    myeareg=new RegExp("^[$]?[0-9]*\\.?[0-9]"); 
	if (!(myeareg.test(lField) && lField!='.'))
	{          
		alert("Only numeric values are allowed!");
		input.focus();
		input.select();
		return false;
	}   	
	var num = parseFloat(input.value);
	if (num < min || max < num)
	{        
		alert(msg + " not in range [" + min + ".." + max + "]"); 
		return false;    
	}      
		return true;
}


function calculateIncomeQualifications(form){
    if((trim(form.mortAmt.value) != "" && trim(form.numYears.value) != "" && trim(form.propTax.value) != "" && trim(form.debt.value) != "" && trim(form.mortRate.value) != "")){   	
		var tmp1,tmp2, tmp3, tmp4, tmp5, tmp6 ,tmp7, tmp8, tmp9, tmp10, tmp11, tmp12, tmp13, tmp14, tmp15
		tmp1 = parseFloat(form.mortAmt.value);
		if (isNaN(tmp1)) tmp1=0;
			tmp2 = parseFloat(form.numYears.value);
		if (isNaN(tmp2)) tmp2=0;
			tmp3 = parseFloat(form.mortRate.value);
		if (isNaN(tmp3)) tmp3=0;
			tmp4 = parseFloat(form.propTax.value);
		if (isNaN(tmp4)) tmp4=0;
			tmp5 = parseFloat(form.debt.value);
		if (isNaN(tmp5)) tmp5=0;
			tmp6 = 0;
	
		tmp7 = tmp4/12;
		tmp8= tmp5;
		tmp9 = tmp3/1200;
		tmp10= tmp2 * 12;
		tmp11 = (1 + tmp9);
		for(i=1; i < tmp10; i++){
			tmp11 = tmp11 * (1 + tmp9);
		}
		tmp12  = tmp1 * tmp11 * tmp9 / (tmp11 - 1);
		tmp13 = tmp12 + tmp7 + tmp8;
		tmp14= (tmp12 + tmp7) / 0.28;
		tmp15 = tmp13 / 0.35;
		
		if(tmp14 > tmp15){
			tmp6 = 12 * tmp14;
		}
		else{
			tmp6 = 12 * tmp15;
		}
		form.mortPay.value = Math.round(tmp12);
		form.totalPay.value = Math.round(tmp13);
		form.reqdSal.value = Math.round(tmp6);
	}
}

function floor(number){
	return Math.floor(number*Math.pow(10,2) + 0.5)/Math.pow(10,2);
}

function calculateMonthlyPayments(form){
	  var mi = form.IR.value / 1200;
	  var base = 1;
	  var mbase = 1 + mi;
	  for (i=0; i < form.YR.value * 12; i++){
		base = base * mbase
	  }
	  form.PI.value = floor(form.LA.value * mi / ( 1 - (1/base)))
	  form.MT.value = floor(form.AT.value / 12)
	  form.MI.value = floor(form.AI.value / 12)
	  var dasum = form.LA.value * mi / ( 1 - (1/base)) + form.AT.value / 12 + form.AI.value / 12;
	  form.MP.value = floor(dasum);
}