Xeon.Core.namespace('Calculator');

Calculator.Region = function() {
	this.deposits = [];
	
	this.processXml = function(oXmlDom)
	{
		var oRoot = oXmlDom.documentElement;
		var aDeposits = oRoot.getElementsByTagName("deposit");
		for(var i = 0; i < aDeposits.length; i++) {
			var oDepositXml = aDeposits[i];
			
			var oDeposit = new Calculator.Deposit();
			oDeposit.id = oDepositXml.getAttribute('id');
			oDeposit.description = oDepositXml.getElementsByTagName('desc')[0].text;
			oDeposit.link = oDepositXml.getElementsByTagName('link')[0].text;
			var optionsContainer = oDepositXml.getElementsByTagName('options')[0];
			oDeposit.options = this.parseOptions(optionsContainer);
			var rateContainer = oDepositXml.getElementsByTagName('rates')[0];
			oDeposit.rates = this.parseRates(rateContainer);
			
			this.deposits.push(oDeposit);
		}
	};
	
	this.parseRates = function(oRateContainer)
	{
		var oRates = {
			aCurrency: [],
			minAmt: {},
			days: {},
			pct: {}
		};
		aRatesItems = oRateContainer.getElementsByTagName('rate');
		for(var i = 0; i < aRatesItems.length; i++) {
			var rateItem = aRatesItems[i];
			var currency = rateItem.getAttribute('currency'); 
			oRates.aCurrency.push(currency);

			var minAmtVal = Infinity;
			var daysMinVal = Infinity;
			var daysMaxVal = 0;

			oRates.pct[currency] = [];
			
			var aAmt = rateItem.getElementsByTagName('amt');			
			for(var j = 0; j < aAmt.length; j++) {
				var amt = aAmt[j];
				var amtMin = parseInt(amt.getAttribute('min'));
				var amtMax = (amt.getAttribute('max') != null) ? parseInt(amt.getAttribute('max')) : Infinity;
				if (minAmtVal > amtMin) {
					minAmtVal = amtMin;
				}
				
				var pctData = [];
				
				var aPct = amt.getElementsByTagName('pct');
				for(var k = 0; k < aPct.length; k++) {
					var pct = aPct[k];
					var dayMin = parseInt(pct.getAttribute('min'));
					var dayMax = parseInt(pct.getAttribute('max'));					
					var pctVal = parseFloat(pct.text) / 100.0; 
					
					if (daysMinVal > dayMin) {
						daysMinVal = dayMin;
					}
					if (daysMaxVal < dayMax) {
						daysMaxVal = dayMax;
					}
					pctData.push({ min: dayMin, max: dayMax, percent: pctVal })
				}
				oRates.pct[currency].push({ min: amtMin, max: amtMax, days: pctData });
			}
			oRates.minAmt[currency] = minAmtVal;  
			oRates.days[currency] = { min: daysMinVal, max: daysMaxVal };  
		}
		return oRates;
	};
	
	this.parseOptions = function(oOptionsContainer)
	{
		var oOptions = {};
		var aOtionItems = oOptionsContainer.getElementsByTagName('opt');
		for(var i = 0; i < aOtionItems.length; i++) {
			var optionItem = aOtionItems[i];
			var name = optionItem.getAttribute('name');
			oOptions[name] = optionItem.text; 
		}
		return oOptions;
	};
	
	this.filterSimilarDeposits = function(oDepositParam)
	{
		//filter by currency type
		var byCurencyType = [];
		for(var i = 0; i < this.deposits.length; i++) {
			var aCurrency = this.deposits[i].rates.aCurrency;
			for(var j = 0; j < aCurrency.length; j++) {
				if (aCurrency[j] == oDepositParam.currencyType) {
					byCurencyType.push(this.deposits[i]);					
					break;
				}
			}
		}		
		
		//filter by min amount
		var byMinAmt = [];
		for(var i = 0; i < byCurencyType.length; i++) {
			var minAmt = byCurencyType[i].rates.minAmt[oDepositParam.currencyType];
			if (oDepositParam.amountOnDeposit >= minAmt) {
				byMinAmt.push(byCurencyType[i]);
			}
		}
		
		//filter by parameters
		var byParameters = [];
		for(var i = 0; i < byMinAmt.length; i++) {
			if (byMinAmt[i].options.pay_period == oDepositParam.paymentOfPct ||
				byMinAmt[i].options.cap_of_pct == oDepositParam.capOfPct ||
				byMinAmt[i].options.write_down == oDepositParam.writeDown ||
				byMinAmt[i].options.resupply == oDepositParam.resupply) {
				byParameters.push(byMinAmt[i]);
			}
		}
		//byParameters = byMinAmt;
		
		//filter by period of deposit
		var byDepositPeriod = [];
		for(var i = 0; i < byParameters.length; i++) {
			var currencyInterval = byParameters[i].rates.days[oDepositParam.currencyType];
			if (oDepositParam.depositPeriod >= currencyInterval.min && 
				oDepositParam.depositPeriod <= currencyInterval.max) {
				byDepositPeriod.push(byParameters[i]);
			}
		}
		
		return byDepositPeriod;
	};
	
}
