﻿var LoanCalculator = function(config)
{
	var PayMethods = {
		Auto: 0,
		Invoice: 1
	};
	
	var InvoicePayComission = 0.5;
	
	var Calculator = function()
	{
		var amount = null;
		var term = null;
		var payMethod = PayMethods.Auto;
		var rate = null;
		
		var setAmount = function(value)
		{
			amount = value;
			updateRate();
		};
		
		var setTerm = function(value)
		{
			term = value;
			updateRate();
		};
					
		var setPayMethod = function(value)
		{
			payMethod = value;
			updateRate();
		};			
		
		var updateRate = function()
		{
			rate = (amount && term) ? loanRateTable.findRate(term, amount) : null;
			
			if (rate == null)
			{
				return;
			}
			
			if (payMethod == PayMethods.Invoice)
			{
				rate += InvoicePayComission;
			}
		};
		
		return {
			amount: function()
			{
				if (arguments.length)
				{
					setAmount(arguments[0]);
				}
				else
				{
					return amount;					
				}
			},
			
			term: function()
			{
				if (arguments.length)
				{
					setTerm(arguments[0]);
				}
				else
				{
					return term;					
				}
			},
			
			payMethod: function()
			{
				if (arguments.length)
				{
					setPayMethod(arguments[0]);
				}
				else
				{
					return payMethod;					
				}
			},
			
			rate: function()
			{
				return rate;
			},
			
			monthlyPayment: function()
			{
				if (!(amount && term && rate))
				{
					return null;
				}
				
				var rawRate = (rate/12)/100;
				
				//final percent
				var p = Math.pow(1 + rawRate, term);				
				
	            var mp = (amount*rawRate)/(1 - (1/p));
				return mp;
			}
		};
	};
	
	//*******************************************************
	//*******************************************************	
	
	var calculator = new Calculator();
	
	var container = null;
	var amountInput = null;
	var termInput = null;
	var payMethodSelect = null;
	var rateInput = null;
	var monthlyPaymentInput = null;
	var calcButton = null;
	
	var loanRateTable = null;	
	
	var options = {
		selectors: {
			container: '#loanCalculator',
			inputs: {
				amount: '#loanAmount',
				term: '#loanTerm',
				payMethod: '#payMethod',
				rate: '#interestRate',
				monthlyPayment: '#monthlyPayment'
			},
			button: '#calculateButton',
			loanRateTable: '#loanRateTable'
		},
		texts: {
			rateNA: 'N/A',
			monthlyPaymentNA: 'N/A'
		}
	};
	
	//****************************************
	
	var init = function(config)
	{
		options = $.extend(true, options, config || {});
		
		initElements();
		setInitialView();		
		initEventHandlers();	
		
		updateViewAfterParamChange();	
	};
	
	var initElements = function()
	{
		container = $(options.selectors.container);
		amountInput = container.find(options.selectors.inputs.amount);
		termInput = container.find(options.selectors.inputs.term);
		payMethodSelect = container.find(options.selectors.inputs.payMethod);
		rateInput = container.find(options.selectors.inputs.rate);
		monthlyPaymentInput = container.find(options.selectors.inputs.monthlyPayment);
		calcButton = container.find(options.selectors.button);
		
		loanRateTable = new LoanRateTable($(options.selectors.loanRateTable));
	};
	
	var setInitialView = function()
	{
		$.each([rateInput, monthlyPaymentInput], function()
		{
			this.attr('readonly', 'readonly');
		});	
		
		$.each([amountInput, termInput, rateInput, monthlyPaymentInput], function()
		{
			this.val('');
		});
		
		payMethodSelect.val(calculator.payMethod());					
	};
	
	var initEventHandlers = function()
	{
		amountInput.focus(function()
		{
			this.select();
		})
		.blur(function()
		{
			var amount = parseFloat(amountInput.val());
			calculator.amount(amount);
			
			updateViewAfterParamChange();			
		});
		
		termInput.focus(function()
		{
			this.select();
		})
		.blur(function()
		{
			var term = parseFloat(termInput.val());
			calculator.term(term);
			
			updateViewAfterParamChange();
		});
		
		payMethodSelect.change(function()
		{
			calculator.payMethod(parseInt(payMethodSelect.val()));
			
			updateViewAfterParamChange();
		});
		
		calcButton.click(function(e)
		{			
			return false;
		});
	};
	
	var updateViewAfterParamChange = function()
	{
		setRateToInput();
		setMonthlyPaymentToInput();
	};
	
	var setRateToInput = function()
	{
		var rate = calculator.rate();
		var rateText = options.texts.rateNA;
		if (rate)
		{
			rateText = rate.toFixed(2);
		}
		rateInput.val(rateText);
	};
	
	var setMonthlyPaymentToInput = function()
	{
		var mp = calculator.monthlyPayment();
		var mpText = options.texts.monthlyPaymentNA;
		if (mp)
		{
			mpText = mp.toFixed(2);
		}
		monthlyPaymentInput.val(mpText);
	};
		
	//****************************************
	
	init(config);
	
	return {};
};
