		
	var refinancingRate = 0;
	var oWrapper = null;
	var oDepositParams = null;
	var oTaxationParams = null;
	var oRegions = {};
	
	var oSimilarDepositTable = null;
	var oDepositDetailTable = null;
	var oPayScheduleTable = null;
	
	var oCurrency = {
		rub: 'Рубли',
		usd: 'Доллар США',
		euro: 'Евро'	
	};
	
	var aYesNo = ['Нет', 'Да'];
	
	var oPaymentOfPercents = {
		daily : 'Ежедневно',
		monthly : 'Ежемесячно',
		quarterly: 'Ежеквартально',
		end: 'В конце срока'	
	};
	
	function requestRefinancingRate() {
		var oXmlHttp = zXmlHttp.createRequest();
		var oDate = new Date();
		oXmlHttp.open("get", "/calc/server/process.php", true);
		oXmlHttp.onreadystatechange = function () {
			if (oXmlHttp.readyState == 4) {
				if (oXmlHttp.status == 200) {
					var result = parseFloat(oXmlHttp.responseText);
					if (result != 'NaN') {
						refinancingRate = result;
					}
					changeTaxationParams();
				} else {
					alert("Найдена ошибка: " + oXmlHttp.statusText);
				}
			}            
		};
		oXmlHttp.send(null);
	}
	
	function displayTaxInfo()
	{
		document.getElementById('d_deposit_currency_type').innerHTML = oCurrency[oTaxationParams.currency];
		document.getElementById('d_tax_rate').innerHTML = (oTaxationParams.taxRate * 100) + '%';
		document.getElementById('d_min_notax_rate_exchange').innerHTML = (oTaxationParams.minNotaxRateExchange * 100) + '%';
		document.getElementById('d_min_notax_rate_rub').innerHTML = (oTaxationParams.minNotaxRateRub * 100) + '%';
		document.getElementById('d_refinancing_rate').innerHTML = (oTaxationParams.refinancingRate * 100) + '%';
	}
	
	function recalcDepositValues()
	{
		oDepositParams.fill(oWrapper);
		oTaxationParams.fill(oDepositParams);
	}
	
	function changeTaxationParams()
	{
		recalcDepositValues();
		displayTaxInfo();
	}
	
	function detailsDepositInfo(event)
	{
		var elem = Xeon.Event.element(event);
		var depositId = elem.id.substring("d_deposit_".length, elem.id.length);
		var currentRegion = oRegions[oDepositParams.region];
		if (typeof currentRegion != "undefined") {
			//console.dir(currentRegion);
			for(var i = 0; i < currentRegion.deposits.length; i++) {
				if (currentRegion.deposits[i].id == depositId) {
					oDepositDetailTable.hide();
					oPayScheduleTable.clearBody();
					var oPaySchedule = currentRegion.deposits[i].getPaySchedule(oDepositParams, oTaxationParams);
					oDepositDetailTable.fillDetailInfo(currentRegion.deposits[i], oDepositParams, oTaxationParams, oPaySchedule);				
					for (var j = 0; j < oPaySchedule.periods.length; j++) {
						var ps = oPaySchedule.periods[j];										
						oPayScheduleTable.addRow([
							dateToStr(ps.periodBeginDate) + ' - ' + dateToStr(ps.periodEndDate),
							Math.round(ps.calc.pctByPeriod),
							Math.round(ps.calc.payTax),
							Math.round(ps.calc.payPctByPeriod),
							0,
							0,
							Math.round(ps.calc.amtRemains),
							Math.round(ps.calc.taxBase)
						]);
					}
					oPayScheduleTable.addRow([
											  'Всего',
											  Math.round(oPaySchedule.calc.pctByPeriod),
											  Math.round(oPaySchedule.calc.payTax),
											  Math.round(oPaySchedule.calc.payPctByPeriod),
											  0,
											  0,
											  Math.round(oPaySchedule.calc.amtRemains),
											  Math.round(oPaySchedule.calc.taxBase)
										  ]);
					
					oDepositDetailTable.show();
					break;
				}
			}
		}
	}
	
	function calcSimilarDeposits(oRegion)
	{
		var similarDeposits = oRegion.filterSimilarDeposits(oDepositParams);
		oDepositDetailTable.hide();
		oSimilarDepositTable.hide();
		oSimilarDepositTable.clearBody();
		for(var i = 0; i < similarDeposits.length; i++) {
			var depositPct = similarDeposits[i].getDepositPercent(oDepositParams);
			var summPct = Math.round(similarDeposits[i].getSummPct(oDepositParams, depositPct));
			var hitPct = similarDeposits[i].getPctOfHit(oDepositParams);
			var cells = [
			  i+1,
			  similarDeposits[i].description,
			  (depositPct * 100).toFixed(1) + "%",
			  summPct,
			  oDepositParams.amountOnDeposit + summPct,
			  (hitPct * 100).toFixed(1) + "%" 
			];
			oSimilarDepositTable.addRow(similarDeposits[i].id, cells, detailsDepositInfo);
		}
		oSimilarDepositTable.show();
	}
	
	function processXML(oXmlDom)
	{
		var oRegion = new Calculator.Region();
		oRegion.processXml(oXmlDom);
		oRegions[oDepositParams.region] = oRegion;
		calcSimilarDeposits(oRegion);
	}
	
	function displaySimilarDeposits()
	{
		recalcDepositValues();
		if (typeof oRegions[oDepositParams.region] == "undefined") {
			Xeon.Xml.loadFromFile("/calc/xml/" +  oDepositParams.region + ".xml", "processXML");
		} else {
			calcSimilarDeposits(oRegions[oDepositParams.region]);
		}
	}
	
	function d_init()
	{
		oWrapper = new Calculator.ControlWrapper('d_deposit_calc_form');
		oDepositParams = new DepositParams();
		oTaxationParams = new TaxationParams();
	
		requestRefinancingRate();
		
		Xeon.Event.observe(oWrapper.getElement('d_resident'), 'change', changeTaxationParams);
		Xeon.Event.observe(oWrapper.getElement('d_currency_type'), 'change', changeTaxationParams);
		Xeon.Event.observe(oWrapper.getElement('d_calculate'), 'click', displaySimilarDeposits);
	
		changeTaxationParams();
	
		oSimilarDepositTable = new Calculator.SimilarDepositsRenderer('d_similar_deposits', 'd_similar_deposits_tbl');
		oDepositDetailTable = new Calculator.DepositDetailRenderer('d_pay_schedule', 'd_deposit_detail_tbl');
		oPayScheduleTable = new Calculator.PayScheduleRenderer('d_pay_schedule_tbl');
	
		// set current date to open deposit date
		oWrapper.getElement('d_open_date').value = dateToStr(new Date());     
	}
