﻿var LoanRateTable = function(rateHtmlTable)
{	
	var amounts = null;
	var terms = null;
	var rates = null;	
	
	var init = function()
	{
		readDataFromTable();
	};
	
	var readDataFromTable = function()
	{
		terms = [];
		amounts = [];
		rates = [];
					
		readTermData(rateHtmlTable.find('tr:eq(1)'));
		
		rateHtmlTable.find('tr:gt(1)').each(function()
		{
			readAmountAndRateData($(this));
		});
	};
	
	var readTermData = function(termRow)
	{
		termRow.find('td:gt(0)').each(function()
		{
			var term = parseTerm($(this).text());
			terms.push(term);
		});
	};
	
	var parseTerm = function(termString)
	{		
		var termPattern = /^(\s*)(\d+)(\s*)\-(\s*)(\d+)(\s*)$/;
		var match = $.trim(termString).match(termPattern);
		
		if (!match)
		{
			return null;			
		}
		
		return {
			min: parseInt(match[2]),
			max: parseInt(match[5])
		}
	};
	
	var readAmountAndRateData = function(dataRow)
	{
		var amount = parseAmount(dataRow.find('td:first').text());
		amounts.push(amount);
		
		var ratesRow = [];
			
		dataRow.find('td:gt(0)').each(function()
		{
			var rate = parseRate($(this).text());
			ratesRow.push(rate);
		});
		
		rates.push(ratesRow);
	};
	
	var parseAmount = function(amountString)
	{
		var amountPattern = /^(\s*)\$(\s*)([\d\,\.]+)(\s*)to(\s*)\$(\s*)([\d\,\.]+)(\s*)$/;
		var match = $.trim(amountString).match(amountPattern);
		
		if (!match)
		{
			return null;			
		}
		
		var clearAmountStr = function(str)
		{
			return str.replace(/\,/g,'');
		};
		
		return {
			min: parseInt(clearAmountStr(match[3])),
			max: parseInt(clearAmountStr(match[7]))
		};
	};
	
	var parseRate = function(rateStr)
	{
		var ratePattern = /^(\s*)([\d\.]+)\%(\s*)$/;
		var match = $.trim(rateStr).match(ratePattern);
		
		if (!match)
		{
			return null;			
		}
		
		return parseFloat(match[2]);
	}
		
	var findRate = function(term, amount)
	{
		var termIndex = findRateParamIndex(term, terms);
		var amountIndex = findRateParamIndex(amount, amounts);
		
		return ((termIndex > -1) && (amountIndex > -1)) ? rates[amountIndex][termIndex] : null;
	};
	
	var findRateParamIndex = function(param, paramList)
	{
		var preparedParam = Math.round(param);
		var paramIndex = -1;
		
		for(var i=0; i< paramList.length; i++)
		{
			var curParam = paramList[i]
			if ((curParam.min <= preparedParam) && (preparedParam <= curParam.max))
			{
				paramIndex = i;
				break;
			}
		}
		
		return paramIndex;
	};
		
	//***************************************************
	
	// initialize object
	init();
	
	//return public interface
	return {
		findRate: findRate
	};
};
