/**
 * Calculate a monthly interest factor.
 * @param int term Term in years
 * @param float interest Monthly interest rate, in decimal
 * @return float
 */
function interest_rate(term, interest) {
	var factor = 0;
	var base_rate = 1 + interest;
	var denominator = base_rate;

	for(var i = 0; i < (term * 12); ++i) {
		factor += (1 / denominator);
		denominator *= base_rate;
	}

	return factor;
}

/**
 * Calculate mortgage payment amounts.
 * @param jQuery $form
 * @return void
 */
function mortgagecalc($form) {
	// cache jQuery selectors
	if (typeof(mortgagecalc.$down)=='undefined') {
		mortgagecalc.$down = $('#down_payment');
		mortgagecalc.$financed = $('#financed');
		mortgagecalc.$pandi = $('#monthly_pandi');
		mortgagecalc.$pandipmi = $('#monthly');
		mortgagecalc.$total = $('#total_monthly');
		mortgagecalc.stripcommas = /[^0-9.]/;
	}

	var tax_pcnt = 0.0125; // 1.25%
	var pmi_pcnt = 0.0055; // 0.05%

	var $fields = $form.find(':input[name^=data[Finance]]');

	var sale_price = $fields.filter('[name$=[sale_price]]').val();
	var pcnt_down  = $fields.filter('[name$=[down_percent]]').val();
	var year_term  = $fields.filter('[name$=[year_term]]').val();
	var api        = $fields.filter('[name$=[annual_interest_percent]]').val();

	sale_price = parseInt(sale_price.replace(mortgagecalc.stripcommas, ''));
	pcnt_down  = parseInt(pcnt_down.replace(mortgagecalc.stripcommas, ''));
	year_term  = parseInt(year_term.replace(mortgagecalc.stripcommas, ''));
	api        = parseInt(api.replace(mortgagecalc.stripcommas, ''));

	var month_term = 12 * year_term;
	var down_payment = sale_price * 0.01 * pcnt_down;
	var financed = sale_price - down_payment;
	var monthly_interest = api * 0.00083333; // 1/12 * 1/100
	var monthly_factor = interest_rate(year_term, monthly_interest);
	var monthly_payment = financed / monthly_factor;

	var pmi = 0;
	if (pcnt_down < 20) {
		pmi = pmi_pcnt * financed;
	}

	pmi += monthly_payment;

	var tax = (1 + tax_pcnt) * pmi;

	mortgagecalc.$down.html(down_payment.toFixed(2));
	mortgagecalc.$financed.html(financed.toFixed(2));
	mortgagecalc.$pandi.html(monthly_payment.toFixed(2));
	mortgagecalc.$pandipmi.html(pmi.toFixed(2));
	mortgagecalc.$total.html(tax.toFixed(2));
}
