// Логика калькулятора
var CalcLogic = function(realtime) {
	this.realtime = !!realtime;
	return this;
}
CalcLogic.prototype = {
	// Внутренние переменные
	_currency		: "rur",	// Выбранная валюта
	_currency_ru	: "рублей",
	_isAnnuitet		: true,	// Тип платежа (аннуитетный и дифференцированный)
	_credit_summ	: 0,		// Сумма кредита
	_credit_period	: 12,		// Срок кредита
	_credit_rate	: 20,		// Процентная ставка
	
	_calculation	: [],		// Расчет

	// Флаг "в реальном времени"
	realtime		: false,

	// Установить валюту по переключателю, на входе - массив из трёх элементов
	setCurrency		: function(spl) {
		this._currency = spl[1];
		
		if(spl[1] == 'rub')
		{
			this._currency_ru = "рублей";
		}
		
		if(spl[1] == 'usd')
		{
			this._currency_ru = "долларов США";
		}
		
		if(spl[1] == 'euro')
		{
			this._currency_ru = "евро";
		}
		 
		this.proceedTable();
	},
	// Установить тип платежа
	setAnnuitet		: function(flag) {
		this._isAnnuitet = !!parseInt(flag, 10);
		this.proceedTable();
	},
	// Установить значение
	setVal			: function(name, value) {
		this[name] = value;
		this.proceedTable();
	},
	round			: function(number) {
		return Math.ceil(100 * number) / 100;
	},
	// Рассчет таблицы
	proceedTable	: function() {
		this.hideTable();
		if (isNaN(this._credit_summ) || isNaN(this._credit_period) || isNaN(this._credit_rate)) return false;
		
		if (this._isAnnuitet) {
			// Аннуитетный платеж?		
			this._calculation = {
				"ОбщаяСуммаВыплат" : 0,
				"ЕжемесячныйПлатеж": 0,
				"ВыплатыПоМесяцам" : []
			};
			// Рассчет ежемесячного платежа
			var _f = {};
			_f["i"] = this._credit_rate / 12; // процентная ставка в 1 месяц
			_f["i/100"] = _f["i"] / 100; // тоже, но в дробях
			_f["n"] = this._credit_period;
			_f["K"] = _f["i/100"] * Math.pow(1 + _f["i/100"], _f["n"]) / (Math.pow(1 + _f["i/100"], _f["n"]) - 1);
//			console.log(_f["K"]);
			// Заполнение полей
			var _vars = {};
			_vars["СуммаПлатежа"] = _f["K"] * this._credit_summ;
			_vars["ОбщаяСуммаВыплат"] = this.round(_vars["СуммаПлатежа"]) * this._credit_period;
			_vars["СуммаОсновногоДолга"] = this._credit_summ / this._credit_period;
			_vars["ОстатокЗадолженности"] = this._credit_summ;
			for (var i = 1; i <= this._credit_period; i++) {
				_vars["СуммаПроцентов"] = _vars["ОстатокЗадолженности"] * _f["i/100"];
				_vars["СуммаОсновногоДолга"] = _vars["СуммаПлатежа"] - _vars["СуммаПроцентов"];
				_vars["ОстатокЗадолженности"] = _vars["ОстатокЗадолженности"] - _vars["СуммаОсновногоДолга"];				

				this._calculation["ВыплатыПоМесяцам"][this._calculation["ВыплатыПоМесяцам"].length] = {
					"Месяц"					: i,
					"СуммаОсновногоДолга"	: number_format(this.round(_vars["СуммаОсновногоДолга"]), 2, ",", " "),
					"СуммаПроцентов"		: number_format(this.round(_vars["СуммаПроцентов"]), 2, ",", " "),
					"СуммаПлатежа"			: number_format(this.round(_vars["СуммаПлатежа"]), 2, ",", " "),
					"ОстатокЗадолженности"	: number_format(this.round(_vars["ОстатокЗадолженности"]), 2, ",", " ")
				};
			}
			this._calculation["ОбщаяСуммаВыплат"] = _vars["ОбщаяСуммаВыплат"];
			this._calculation["ЕжемесячныйПлатеж"] = number_format(this.round(_vars["СуммаПлатежа"]), 2, ",", " ");
		} else {
			// Дифференцированный платеж
			this._calculation = {
				"ОбщаяСуммаВыплат" : 0,
				"ЕжемесячныйПлатеж": 0,
				"ВыплатыПоМесяцам" : []
			};
			var _vars = {};
			_vars["СуммаОсновногоДолга"] = this._credit_summ / this._credit_period;
			_vars["ОстатокЗадолженности"] = this._credit_summ;
			for (var i = 1; i <= this._credit_period; i++) {
				_vars["СуммаПроцентов"] = (_vars["ОстатокЗадолженности"] / 365) * 30 * (this._credit_rate / 100);
				_vars["СуммаПлатежа"] = _vars["СуммаОсновногоДолга"] + _vars["СуммаПроцентов"];
				_vars["ОстатокЗадолженности"] = _vars["ОстатокЗадолженности"] - _vars["СуммаОсновногоДолга"];
				
				this._calculation["ВыплатыПоМесяцам"][this._calculation["ВыплатыПоМесяцам"].length] = {
					"Месяц"					: i,
					"СуммаОсновногоДолга"	: number_format(this.round(_vars["СуммаОсновногоДолга"]), 2, ",", " "),
					"СуммаПроцентов"		: number_format(this.round(_vars["СуммаПроцентов"]), 2, ",", " "),
					"СуммаПлатежа"			: number_format(this.round(_vars["СуммаПлатежа"]), 2, ",", " "),
					"ОстатокЗадолженности"	: number_format(this.round(_vars["ОстатокЗадолженности"]), 2, ",", " ")
				};
				this._calculation["ОбщаяСуммаВыплат"] += this.round(_vars["СуммаПлатежа"]);
			}
			this._calculation["ОбщаяСуммаВыплат"] = this.round(this._calculation["ОбщаяСуммаВыплат"]);
			this._calculation["ЕжемесячныйПлатеж"] = "" + this._calculation["ВыплатыПоМесяцам"][0]["СуммаПлатежа"] + " ... " + this._calculation["ВыплатыПоМесяцам"][this._calculation["ВыплатыПоМесяцам"].length - 1]["СуммаПлатежа"]
		}
		// Если в реальном времени, отображаем таблицу
		if (this.realtime) this.showTable();
	},
	// Отобразить таблицу
	showTable		: function() {
		var _rows = "";
		for (var i = 0; i < this._calculation["ВыплатыПоМесяцам"].length; i++) {
			var _row = this._calculation["ВыплатыПоМесяцам"][i];
			_rows += '<tr' + (i%2 == 1 ? ' class="odd"' : '') +  '>\
				<td class="first">' + _row["Месяц"] + '.</td>\
				<td>' + _row["СуммаОсновногоДолга"] + '</td>\
				<td>' + _row["СуммаПроцентов"] + '</td>\
				<td>' + _row["СуммаПлатежа"] + '</td>\
				<td>' + _row["ОстатокЗадолженности"] + '</td>\
			</tr>';
			if (i % 12 == 11) {
				_rows += '<tr><td colspan="5" class="year_break"><!-- --></td></tr>';
			}
		}
		var _payment_block = jQuery('#c_payment_block');
		var _table = jQuery('#c_graph_payment');
		_table.find('tr:gt(0)').remove();
		_table.find('tr').eq(0).after(_rows);
		_payment_block.show();
		
		var _info_block = jQuery('#c_info_block');
		var _span = _info_block.find('span').eq(0);
		_span.html(this._calculation["ЕжемесячныйПлатеж"] + " " + this._currency_ru);
		_info_block.show();
	},
	// Скрыть таблицы
	hideTable		: function() {
		jQuery('#c_info_block').hide();
		jQuery('#c_payment_block').hide();
	},
	
	// noop
	noop : function () { /**/ }
};
// Инициализация калькулятора
var Calculator = new CalcLogic(1);

// Инициализация графических элементов на странице
jQuery(function($){
	// Выпадающий селект
	$('div').click(function() {
		if ($(this).hasClass('test:not(.hover)') && $('.choose-ul ul').not(':animated')) {
			$('.choose-ul').css('z-index','1');
			$('.choose-ul ul').css('z-index','2');
			$(this).parent().css('z-index','2'); 
			$('.choose-ul ul').slideUp();
			$(this).parent().children('ul').slideDown();
			$('.choose-ul div').removeClass('hover');
			$(this).addClass('hover');
			return false;
		} else {
			setTimeout("$('.choose-ul div').removeClass('hover')",400);
			$('.choose-ul ul').slideUp();
		}    
	});
	
	// Выбор города
	$('div.choose-ul ul li').click(function(){
		$('#choose_div1').html($(this).html());
		$('#c_city_id').val($(this).attr('title')).change(); // TODO: отработка события изменения значения
	});

	// Переключатель валюты
	$('div.radio_switcher a').click(function(){
		// подсвечивание текущей валюты
		var $parent = $(this).parent();
		$parent.parent().find('div[class*=_active]').each(function(){
			this.className = this.className.replace("_active", "");
		});		
		$parent.each(function(){
			this.className = this.className + "_active";
		});
		var spl = this.name.split('_');
		if (spl.length == 3 && spl[0] == 'currency') {
			Calculator.setCurrency(spl);
		} else if (spl.length == 2 && spl[0] == 'annuitet') {
			Calculator.setAnnuitet(spl[1]);
		}
		return false;
	});
	
	// Сумма кредита
	$('#c_credit_summ').change(function(){
		var val = this.value;
		if (!isNaN(val)) { Calculator.setVal('_credit_summ', parseFloat(val, 10)); }
	}).change();
	// Срок кредита
	$('#c_credit_period').change(function(){
		var val = this.value;
		if (!isNaN(val)) { Calculator.setVal('_credit_period', parseFloat(val, 10)); }
	}).change();
	// Кредитная ставка
	$('#c_credit_rate').change(function(){
		var val = this.value;
		if (!isNaN(val)) { Calculator.setVal('_credit_rate', parseFloat(val, 10)); }
	}).change();
});


// Функция-аналог number_format в php
function number_format(number, decimals, dec_point, thousands_sep) {
    number = (number+'').replace(',', '').replace(' ', '');
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

function show_filial_text(id)
{
	if($('#filial_text'+id).is(':hidden'))
	{
		$('#filial_text'+id).show();
	}
	else
	{
		$('#filial_text'+id).hide();
	}
}
