// Initialize the LoanCalculator object
LoanCalculator = function() {
	this.init();
};

LoanCalculator.prototype.init = function() { 
	this.write_div = document.getElementById( 'loan_calc' );
	// if the element exists, build the interface
	if (this.write_div) {
		this.buildInterface();
	}
};

// Build the LoanCalculator interface
LoanCalculator.prototype.buildInterface = function() {
	// Build the containing element from the CalcLib library and return the elements
	var els = buildTable( 'loan_calc', 'Auto Loan Calculator' );
	var inner = els[0];
	var table = els[1];
	var tbody = els[2];
	
	// The array of information used to build the table
	this.el_array = new Array();
	this.el_array['price'] = new Array( 'Vehicle Price', 'input' );
	this.el_array['down_payment'] = new Array( 'Down Payment', 'input' );
	this.el_array['tax'] = new Array( 'Tax Rate', 'input' );
	this.el_array['rate'] = new Array( 'Interest Rate (APR)', 'input' );
	this.el_array['term'] = new Array( 'Length of Loan', 'select' );
	this.el_array['payment'] = new Array( 'Monthly Payment', 'span' );
	this.el_array['amount_financed'] = new Array( 'Amount Financed', 'span' );
	this.el_array['payment_total'] = new Array( 'Total of Payments', 'span' );
	this.el_array['interest_paid'] = new Array( 'Interest Paid', 'span' );
	
	// Create the rows within the table
	for( var el in this.el_array) {
		var tr = document.createElement( 'tr' );
		var td1 = document.createElement( 'td' );
		td1.className = 'td-label';
		td1.innerHTML = this.el_array[el][0];
		tr.appendChild( td1 );
		var td2 = document.createElement( 'td' );
		td2.className = 'td-input';
		var elem = document.createElement( this.el_array[el][1] );
		elem.id = el;
		if (this.el_array[el][1] == 'input') {
			elem.type = 'text';
			elem.size = 8;
			//elem.onclick = function() { this.select(); };
		}
		if (this.el_array[el][1] == 'select') {
			this.buildTermSelector( elem );
		}
		
		td2.appendChild( elem );
		tr.appendChild( td2 );
		
		if (this.el_array[el][1] == 'span') {
			td2.colSpan = '2';	
			tr.className = 'tr-value';
		} else {
			var td3 = document.createElement( 'td' );
			td3.className = 'td-desc';
	
			switch(el) {
				case('rate'): case('tax'):
				td3.innerHTML = '%';
				break;
				case('term'):
				td3.innerHTML = 'Months';
				break;
			}
			tr.appendChild( td3 );
		}
		if (el == 'price') {
			var td4 = document.createElement( 'td' );
			td4.rowSpan = 9;
			td4.className = 'td-ad';
			this.buildAd( td4 );
			tr.appendChild( td4 );
		}
		tbody.appendChild( tr );	
	}
	this.createButtons( tbody );
	
	var disclaimer = document.createElement( 'div' );
	disclaimer.id = 'disclaimer';
	disclaimer.innerHTML = '<strong>Disclaimer:</strong> Though we believe our calculations to be sound, CarBuyingInfo.org makes no guarantee as to the accuracy of the above figures. Use of this tool does not constitute an offer of credit.';
	inner.appendChild( disclaimer );
	
	this.preFill();
};

LoanCalculator.prototype.buildAd = function( td4 ) {
	var a = document.createElement( 'a' );
	a.tabIndex = -1;
	a.href = 'http://www.jdoqocy.com/click-3080792-10531343';
	a.target = '_blank';
	
	var img = document.createElement( 'img' );
	img.src = 'http://www.awltovhc.com/image-3080792-10531343';
	img.alt = 'Bad Credit? No Credit? No Problem! Auto Loans';
	
	a.appendChild( img );
	td4.appendChild( a );
};

LoanCalculator.prototype.createButtons = function( tbody ) {
	var obj = this;
	var tr = document.createElement( 'tr' );
	var td = document.createElement( 'td' );
	td.colSpan = "4";
	td.className = 'td-buttons';
	td.align = 'right';
	var but_calc = document.createElement( 'button' );
	but_calc.innerHTML = 'Calculate';
	
	but_calc.onclick = function() { obj.calculate(); };
	var but_amor = document.createElement( 'button' );
	but_amor.innerHTML = 'Pay Schedule';
	but_amor.onclick = function() { obj.amortize(); };
	
	td.appendChild( but_calc );
	td.appendChild( but_amor );
	tr.appendChild( td );
	tbody.appendChild( tr );
};

LoanCalculator.prototype.buildTermSelector = function( sel ) {
	
	var term_array = new Array( '24', '36', '48', '60', '72', '84' );
	for (var i=0; i<term_array.length; i++) {
		sel.options[i] = new Option( term_array[i], term_array[i] );
		if (term_array[i] == '60') {
			sel.options[i].selected = true;
		}
	}
};
	
LoanCalculator.prototype.preFill = function() {
	document.getElementById( 'price' ).value = '20000';
	document.getElementById( 'down_payment' ).value = '2000';
	document.getElementById( 'tax' ).value = '8.5';
	document.getElementById( 'rate' ).value = '6.9';
	document.getElementById( 'price' ).focus();
	document.getElementById( 'price' ).select();
};

LoanCalculator.prototype.getValues = function() {
	this.price = document.getElementById( 'price' ).value.replace( ',', '');
	this.dp = document.getElementById( 'down_payment' ).value.replace( ',', '');
	this.tax = 1 +( document.getElementById( 'tax' ).value / 100 );
	this.loan = ( this.price * this.tax ) - this.dp;
	this.rate = document.getElementById( 'rate' ).value / 1200;
	this.term = document.getElementById( 'term' ).options[document.getElementById( 'term' ).selectedIndex].value;
};

LoanCalculator.prototype.calculate = function() {
	this.getValues();
	if (this.price != '' && this.price != 0 && !isNaN(this.price)) {
		
		var vals = this.equation( this.term, this.loan );	
		this.payment = vals[0];
		this.total = vals[1];
		this.tot_int = vals[2];
		
		document.getElementById( 'amount_financed' ).innerHTML = formatNumber( this.loan, true );
		document.getElementById( 'payment' ).innerHTML = formatNumber( this.payment, true );
		document.getElementById( 'payment_total' ).innerHTML = formatNumber( this.total, true );
		document.getElementById( 'interest_paid' ).innerHTML = formatNumber( this.tot_int, true );
		return true;
	} else {
		alert( 'Please enter a vehicle price!' );
		return false;
	}
};

LoanCalculator.prototype.equation = function( term, loan ) {
	if (this.rate == 0) {
		var payment = this.loan / this.term;
		var total = payment * this.term;
		var tot_int = 0;
	} else {
		var eq1 = Math.pow( (1 + this.rate), term );
		var payment = (this.loan * ( this.rate * eq1 / ( eq1 - 1) ));  
		var total = payment * term;
		var tot_int = ( payment * term ) - loan;
	}
		var vals = new Array( payment, total, tot_int );
		return vals;
};


LoanCalculator.prototype.amortize = function() {

	if( this.calculate() ) {
	var obj = this;
	if (!document.getElementById( 'amortize' )) { 
		var div = document.createElement( 'div' );
		div.id = 'amortize';
	} else {
		div = document.getElementById( 'amortize' )
		div.innerHTML = '';
	}
	
	this.buildSummary( div );
	
	div.innerHTML += '<table id="amortize_headings" width="96%"><tr><td class="td-month">Month</td><td>Balance</td><td>Principal</td><td>Interest</td><td>Total Interest</td></tr></table>';
	var inner = document.createElement( 'div' );
	inner.id = 'amortize_inner';
	var table = document.createElement( 'table' );
	table.id = 'amortize_table';
	table.width = '100%';
	var tbody = document.createElement("tbody");
	
	var loan = this.loan;
	var i_paid = 0;
	
	for (var i = this.term - 1; i >= 0; i--) { 
		var tr = document.createElement( 'tr' );
		if (i % 2 == 0) { 
			tr.className = 'alt-row';
		}
		var td1 = document.createElement( 'td' );
		td1.className = 'td-month';
		td1.innerHTML = this.term - i;
		
		var old_balance = new_balance;
		var p_paid = this.payment - ( loan*this.rate );
		var new_balance = loan - p_paid;
		var payment = this.payment;
		i_paid += this.payment - p_paid;
		loan = new_balance;
		
		var td2 = document.createElement( 'td' );
		if (i == 0) {
			payment = old_balance.toFixed(2)
			new_balance = 0;
			i_paid = this.tot_int;
		}
		td2.innerHTML = formatNumber( new_balance.toFixed(2), true );
		
		var td3 = document.createElement( 'td' );
		td3.innerHTML = formatNumber( p_paid, true );
		
		var td4 = document.createElement( 'td' );
		td4.innerHTML = formatNumber( this.payment - p_paid, true );
		
		var td5 = document.createElement( 'td' );
		td5.innerHTML =  formatNumber( i_paid, true );
		
		tr.appendChild( td1 );
		tr.appendChild( td2 );
		tr.appendChild( td3 );
		tr.appendChild( td4 );
		tr.appendChild( td5 );
		tbody.appendChild( tr );
	}
	table.appendChild( tbody );
	inner.appendChild( table );
	div.appendChild( inner );
	
	var but_div = document.createElement( 'div' );
	but_div.className = 'td-buttons';
	but_div.style.textAlign = 'right';
	
	var button = document.createElement( 'button' );
	button.innerHTML = 'Re-Calculate';
	button.onclick = function() { obj.reCalculate(); };
	but_div.appendChild( button );
	
	div.appendChild( but_div );
	
	if (!document.getElementById( 'amortize' )) { 
		var dis = document.getElementById( 'disclaimer' );
		dis.parentNode.insertBefore( div, dis );
	}
	document.getElementById( 'loan_calc_table' ).style.display = 'none';
	div.style.display = 'block';
	}
};

LoanCalculator.prototype.buildSummary = function( div ) {
	var f_array = new Array();
	f_array[0] = new Array( 'Monthly Payment', formatNumber( this.payment, true ) );
	f_array[1] = new Array( 'Length of Loan', this.term + ' Months' );
	f_array[2] = new Array( 'Interest Rate', (this.rate*1200).toFixed(2) + '%');
	f_array[3] = new Array( 'Loan Amount', formatNumber( this.loan, true ) );
	f_array[4] = new Array( 'Total of Payments', formatNumber( this.total, true ) );
	f_array[5] = new Array( 'Interest Paid', formatNumber( this.tot_int, true ) );

	
	var info = document.createElement( 'table' );
	info.width = '100%';
	var info_tb = document.createElement( 'tbody' );
	
	for (var i=0; i<f_array.length; i++) {
		if (i % 3 == 0) {
			this.tr = document.createElement( 'tr' );
			info_tb.appendChild( this.tr );
		}
		var td1 = document.createElement( 'td' );
		td1.className = 'sum-label';
		td1.innerHTML = f_array[i][0] + ':';
		this.tr.appendChild( td1 );
		
		var td2 = document.createElement( 'td' );
		td2.className = 'sum-value';
		td2.innerHTML = f_array[i][1];
		this.tr.appendChild( td2 );
	}
	
	info.appendChild( info_tb );
	div.appendChild( info );
	
};

LoanCalculator.prototype.reCalculate = function() {
	document.getElementById( 'amortize' ).style.display = 'none';
	document.getElementById( 'loan_calc_table' ).style.display = '';
};

loanCalc = new LoanCalculator();

