var cache = "";
// Normalize float vals, "10.00" => "10"; "10.20" => "10.2", then make sure we have an actual number
function CheckFloatField(field) {
	var val = field.value;
	val = val.sub(/0*$/,''); val = val.sub(/\.*$/,'');
	if("" + parseFloat(val) != val) field.value = field.defaultValue;
}


function CheckIntField(field) {
	var val = field.value;
	if("" + parseInt(val) != val) field.value = field.defaultValue;
}


function CheckDollarField(field) {
	var flt = ReadDollarField(field);
	if(isNaN(flt)) field.value = cache;	// whatwhatwhatwhatwhat?
	else {
		str = FloatToDollarString(flt);
		field.value = str;
	}
}

// Remove $ and , from float value
function ReadDollarField(field) {
	var str = field.value;
	str = str.replace(/[\$,]/g,'');
	return parseFloat(str);
}

function FloatToDollarString(flt) {
	// round off to nearest dollar, add commas
	var str = "" + Math.round(flt)
	pos = str.length;  // str.indexOf(".");
	pos -= 4;
	while(pos >= 0) {
		str = str.substring(0,pos+1) + "," + str.substring(pos+1, str.length);
		pos -= 3;
	}
	return str;
}

function resetValues(frm) {
	frm.price.value = "150000";
	frm.downpay.value = "15000";
	frm.downpayperc.value = "10";
	frm.termMonths.value = "360";
	frm.termYears.value = "30";
	frm.intYear.value="5.5";
	RecalcMonthlyPay(frm);
}

function recalcTermMonths(frm) {
	var tYr = parseFloat(frm.termYears.value);
	var tMon = Math.round(tYr * 12.0);
	tYr = parseFloat(tMon) / 12.0;
	frm.termYears.value = "" + tYr;
	frm.termMonths.value = "" + tMon;
}

function recalcTermYears(frm) {
	var tMon = parseInt(frm.termMonths.value);
	var tYr = parseFloat(tMon) / 12.0;
	frm.termYears.value = "" + tYr;
	frm.termMonths.value = "" + tMon;
}

function RecalcMonthlyPay(frm) {
	var Principle  = ReadDollarField(frm.price) - ReadDollarField(frm.downpay);
	var AnnualInt  = parseFloat(frm.intYear.value);
	var MonthlyInt = AnnualInt / (12.0 * 100.0);
	var LenMonths  = parseInt(frm.termMonths.value);

	if(MonthlyInt == 0)
		var MonthlyPay = Principle / LenMonths;
	else
		var MonthlyPay = Principle * ( MonthlyInt / ( 1 - Math.pow((1 + MonthlyInt), -LenMonths) ) );
	MonthlyPay = Math.round(MonthlyPay * 100) / 100;
	frm.payMonth.value = FloatToDollarString(MonthlyPay);
}


function RecalcDownPay(frm) {
	var AnnualInt  = parseFloat(frm.intYear.value);
	var MonthlyInt = AnnualInt / (12.0 * 100.0);
	var LenMonths  = parseInt(frm.termMonths.value);
	var MonthlyPay = ReadDollarField(frm.payMonth);
	var Principle  = ReadDollarField(frm.price) - ReadDollarField(frm.downpay);
	var OldDownPay = ReadDollarField(frm.downpay);
	var EffPrinciple;

	if(MonthlyInt == 0)
		EffPrinciple = MonthlyPay * LenMonths;
	else
		EffPrinciple = MonthlyPay * ((1 - Math.pow((1 + MonthlyInt), -LenMonths)) / MonthlyInt);

	var NewDownPay = OldDownPay + (Principle - EffPrinciple);
	frm.downpay.value = "" + NewDownPay;
	CheckDollarField(frm.downpay);
	RecalcDownPayPerc(frm);
	RecalcMonthlyPay(frm);
}


function RecalcDownPayPerc(frm) {
	var HomePrice  = ReadDollarField(frm.price);
	var DownPay = ReadDollarField(frm.downpay);
	var DownPayPerc = 100 * DownPay / HomePrice;

	if(DownPayPerc >= 0  &&  DownPayPerc <= 100) {
		var DownPayPercStr = "" + DownPayPerc;
		var pos = DownPayPercStr.indexOf(".");
		if(DownPayPercStr.length > pos + 4)
			DownPayPercStr = DownPayPercStr.substring(0,pos+4);
		frm.downpayperc.value = DownPayPercStr;
	} else if(DownPayPerc < 0) {
		frm.downpayperc.value = "0";
		RecalcDownPayAmount(frm);
	} else {
		frm.downpayperc.value = "100";
		RecalcDownPayAmount(frm);
	}
}

function RecalcDownPayAmount(frm) {
	var HomePrice  = ReadDollarField(frm.price);
	var DownPayPerc = parseFloat(frm.downpayperc.value);
	if(DownPayPerc < 0) {
		frm.downpayperc.value = "0";
		RecalcDownPayAmount(frm)
	} else if(DownPayPerc > 100) {
		frm.downpayperc.value = "100";
		RecalcDownPayAmount(frm)
	} else {
		var DownPay = HomePrice * (DownPayPerc / 100);
		DownPay = FloatToDollarString(DownPay);
		frm.downpay.value = "" + DownPay;
	}
}
