function CalendSelector(el, index){
	var container = el,
		input = container.find('input'),
		real = input.clone(true),
		selector = container.find('div.calendar-selector'),
		dd = container,//container.find('dd:eq(0)'),
		timer = null,
		months = ["января", "февраля", "марта", "апреля", "мая", "июня", "июля", "августа", "сентября", "октября", "ноября", "декабря"],
		dt = new Date(),
		y = dt.getFullYear(),
		m = dt.getMonth() + 1,
		d = dt.getDate();

	real[0].clone = true;

	var closeContainer = function(evt){
		if(!container.data('lock')){
			dd.removeClass('show-cal').addClass('close-cal');
			$.browser.msie && dd.find('div').css({ // Fix for IE7
				zoom: '0'
			});
			if(!evt){
				input.blur();
			}
		}
	};

	input.attr('name', input.attr('name') + 'Text').attr('autocomplete', 'off');
	real.removeAttr('id').css({ display: 'none' }).appendTo(container);
	input.data('clear', function(){
		input.val('');
		real.val('');
		container.data('selector').control.cur = selector.attr('date');
		container.data('selector').control.generate();
		container.data('lock', false);
		closeContainer();
	});

	input.focus(function(){
		dd.removeClass('close-cal').addClass('show-cal');
		$.browser.msie && dd.find('div').css({ // Fix for IE7
			zoom: '1'
		});
	}).blur(function(){
		closeContainer(true);
	}).keypress(function(event){
		event.preventDefault();
	}).mouseenter(function(){
		if(timer){
			clearTimeout(timer);
		}
		container.data('lock', false);
	}).mouseleave(function(){
		container.data('lock', true);
	}).keyup(function(event){
		switch(event.keyCode){
			case 8:
			case 32:
				input.data('clear')();
				break;
			default:
				return true;
		}
	});

	container.find('span.input-wrap > img').click(function(){
		input.focus();
	});

	selector.attr('date', (d < 10 ? '0' : '') + d + '.' + (m < 10 ? '0' : '') + m + '.' + y);
	selector.mouseenter(function(){
		if(timer){
			clearTimeout(timer);
		}
		container.data('lock', true);
	}).mouseleave(function(){
		timer = setTimeout(closeContainer, 700);
		container.data('lock', false);
	});
	var _this = this;
	this.control = new СalendControl(selector, function(str, dt){
		input.val(dt.getDate() + ' ' + months[dt.getMonth()] + ' ' + dt.getFullYear());
		real.val(str);
		container.data('lock', false);
		closeContainer(null);
		//_this.control.generate();
	}, input.val(), index);

	return this;
}

function СalendControl(obj, callback, cur, second){
	this.obj = obj;
	this.callback = callback;
	this.now = new Date();
	this.cur = cur || obj.attr('date');
	this.min = new Date(2010, 0, 1);
	this.max = new Date(this.now.getFullYear(), this.now.getMonth(), this.now.getDate());
	this.min.compare = new Date(this.min.getFullYear(), this.min.getMonth(), 1);
	this.max.plusYears = obj.attr('plus_years');
	this.cur = this.cur ? this.parse(this.cur) : new Date(this.max);
	
	this.url = '#';
	this.sel = new Date(this.cur.getFullYear(), this.cur.getMonth(), 1);
	this.names = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"];

	if(obj){
		// если нам нужно делать максимальной не сегодняшнюю дату, а еще на "плюс сколько-то лет" смотреть
		if(this.max.plusYears){
			this.max = new Date(new Date(this.now.getFullYear() + this.max.plusYears, this.now.getMonth(), this.now.getDate()));
		}

		this.obj.month = $('.mon', this.obj);
		this.obj.year = $('.yyyy', this.obj);
		this.obj.body = $('table tbody', this.obj);
		
		$('a:first', this.obj.month).bind('click', {
			obj: this,
			cmd: 'monthPrev'
		}, this.onSet);
		$('a:last', this.obj.month).bind('click', {
			obj: this,
			cmd: 'monthNext'
		}, this.onSet);

		$('a:first', this.obj.year).bind('click', {
			obj: this,
			cmd: 'yearPrev'
		}, this.onSet);
		$('a:last', this.obj.year).bind('click', {
			obj: this,
			cmd: 'yearNext'
		}, this.onSet);
	}

	this.generate();
}

СalendControl.prototype = {
	onSet: function(evt){
		if(evt){
			evt.preventDefault();
		}
		if(this.className.indexOf('disabled') == -1){
			evt.data.obj.sel = evt.data.obj[evt.data.cmd]();
			evt.data.obj.generate();
		}
	},
	parse: function(str){
		var parts = str.match(/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/);
		return new Date(parts[3], parts[2] - 1, parts[1]);
	},
	onClick: function(evt){
		evt.preventDefault();
		var str = $(this).attr('href').match(/#([0-9\.]+)$/)[1];
		evt.data.cur = evt.data.parse(str);
		evt.data.sel = new Date(evt.data.cur.getFullYear(), evt.data.cur.getMonth(), 1);

		if(evt.data.second){
			evt.data.second.min = evt.data.cur;
			evt.data.max = evt.data.second.cur;
			evt.data.second.generate();
		} else if(evt.data.first){
			evt.data.first.max = evt.data.cur;
			evt.data.min = evt.data.first.cur;
			evt.data.first.generate();
		}
		
		evt.data.generate();
		evt.data.callback(str, evt.data.cur);
	},
	generate: function(){
		var html = '<tr>',
			dt = new Date(this.sel),
			last = 0,
			month = dt.getMonth() + 1,
			str = (month < 10 ? '0' + month : month) + '.' + dt.getFullYear();

		html += this.emptyCells(dt.getDay() == 0 ? 6 : dt.getDay() - 1);
		for(var i = 1; i < 32; i++){
			dt.setDate(i);
			if(!dt || dt.getDate() != i){
				break;
			}

			last = dt.getDay();
			var day = dt.getDate();
			if(day < 10){
				day = '0' + day;
			}

			if(last == 1 && i != 1){
				html += '<tr>';
			}
			if(dt > this.max || dt < this.min){
				html += '<td><span>' + dt.getDate() + '</span></td>';
			} else {
				var sel = (+dt == +this.cur) ? 'sel ' : '',
					url = this.url + day + '.' + str;
				sel += (+dt == +this.max) ? 'cur ' : '';
				if(sel != ''){
					sel = ' class="' + sel + '"';
				}
				html += '<td' + sel + '><a href="' + url + '">' + dt.getDate() + '</a></td>';
			}
			if(last == 0){
				html += '</tr>';
			}
		}


		if(last != 0){
			html += this.emptyCells(7 - last);
		}

		html += '</tr>';

		this.obj.body.html(html).find('td > a').bind('click', this, this.onClick);

		this.obj.body.find('tr:last').addClass('last');

		$('span', this.obj.month).html(this.names[this.sel.getMonth()]);
		$('span', this.obj.year).html(this.sel.getFullYear());

		$('a:first', this.obj.month).attr('class', (this.monthPrev() < this.min.compare) ? 'disabled' : '');
		$('a:first', this.obj.year).attr('class', (this.yearPrev() < this.min.compare) ? 'disabled' : '');

		$('a:last', this.obj.month).attr('class', (this.monthNext() > this.max) ? 'disabled' : '');
		$('a:last', this.obj.year).attr('class', (this.yearNext() > this.max) ? 'disabled' : '');
	},
	emptyCells: function(cnt){
		var str = '';
		for(var i = 0; i < cnt; i++){
			str += '<td><span><!-- --></span></td>';
		}
		return str;
	},
	monthPrev: function(){
		var month = this.sel.getMonth();
		return new Date(this.sel.getFullYear() - (month == 0 ? 1 : 0), month == 0 ? 11 : month - 1, 1);
	},
	monthNext: function(){
		var month = this.sel.getMonth();
		return new Date(this.sel.getFullYear() + (month == 11 ? 1 : 0), month == 11 ? 0 : month + 1, 1);
	},
	yearPrev: function(){
		var year = this.sel.getFullYear();
		return new Date(year - 1, this.sel.getMonth(), 1);
	},
	yearNext: function(){
		var year = this.sel.getFullYear();
		return new Date(year + 1, this.sel.getMonth(), 1);
	}
};

var cache = null;

$('.calendGroup').each(function(){
	var periods = $('div.close-cal', this);
	var first = new CalendSelector(periods.eq(0), 1);
	periods.eq(0).data('selector', first);
	var second = new CalendSelector(periods.eq(1), 0);
	periods.eq(1).data('selector', second);

	second.control.first = first.control;
	first.control.second = second.control;
	
	periods.each(function(){
		var input = $(this).find('input')[0];
		!input.clone && $(input).val() && $(this).find('td.sel > a').click();
	});
});

$('i.calendar').click(function(){
	$(this).prev('input').trigger('focus');
});

$('i.refresh').each(function(i){
	$(this).click(function(){
		$(this).parent().find('input').data('clear')();
		var date, index;
		if(i % 2 == 0){
			date = new Date();
			index = 1;
		} else {
			date = new Date(2010, 0, 1);
			index = 0;
		}
		var calendarGroup = $(this).closest('.calendGroup');
		var calendar = calendarGroup.find('div.close-cal').eq(index);
		calendar.data('selector').control[(index % 2 == 0) ? 'min' : 'max'] = dt;
		calendar.data('selector').control.generate();
	});
});

$(function (){
	// reseting of form fields

	var resetButton = $('input[name=cancel], input[name=reset]'),
		formToReset = resetButton.closest('form'),
		calendars = formToReset.find('.calendar-selector input:text');

	resetButton.bind('click', function (e){
		var currentCalendarInput;

		if(this.name == 'reset'){
			e.preventDefault();
		}
		formToReset.clearForm();

		for(var i = 0, l = calendars.length; i < l; i++){
			currentCalendarInput = $(calendars[i]);
			currentCalendarInput.data('clear')();
		}
	});
});

$.fn.clearForm = function(){
	return this.each(function(){
		var type = this.type, tag = this.tagName.toLowerCase();
		if(tag == 'form'){
			return $(':input', this).clearForm();
		}
		if(type == 'text' || type == 'password' || tag == 'textarea'){
			this.value = '';
		}
		else {
			if(type == 'checkbox' || type == 'radio'){
				this.checked = false;
			}
			else {
				if(tag == 'select'){
					this.selectedIndex = 0;
				}
			}
		}
	});
};


/**
 * Выбор места жительства (с AJAX-подгрузкой списков регионов/городов по ходу выбора)
 */
var residenceSelectManager = (function (){
	var CONFIG = {
		url : {
			region : '/geo/find_regions?country_id={id}',
			city : '/geo/find_cities?region_id={id}'
		},
		tmpl : '<option value="{id}">{name}</option>',
		errorBlockSelector : '.err'
	},
		_container, _selects, _submitButton;

	/**
	 * Находит селекты внутри контейнера и вешает на "onchange" подгрузку данных в след. селект
	 */
	function bindEvents(){
		_selects = _container.find('select');

		_selects
			.bind('change', function (){
			var currentControl = $(this),
				currentValue = currentControl.val(),
				valueIsNotDefault = (parseInt(currentValue, 10) !== 0),
				nextControl = currentControl.next('select');

			if(nextControl.length && valueIsNotDefault){
				loadData(nextControl, currentValue);
			}

			_container
				.nextAll(CONFIG.errorBlockSelector)
				.remove(); // если были ошибки валидации формы, при изменении селекта они по-любому исчезнут
		})
			// мы должны задизейблить первую строку в первом селекте, данные в который вставляются сервером при загрузке страницы
			// (мы не можем сразу поставить "disabled" в шаблоне, потому что тогда первая строка селекта не будет выбрана и пользователь не
			// увидит побудительного сообщения "Выберите страну")
			.first()
			.find('option:first-child')
			.attr('disabled', 'disabled');
	}

	/**
	 * Загружает данные по данной стране/региону (соответственно, регионы/города) в данный селект
	 *
	 * @param {Object} control контрол (селект), куда будем загружать данные
	 * @param {Object} requestId значение (value) селекта, в котором была выбрана страна/регион, для которых будем грузить данные - т.е. id страны/региона
	 */
	function loadData(control, requestId){
		var defaultRow = control.find('option:first-child'), // запоминаем строчку "Выберите..."
			nextControl = control.next('select'),
			controlType = control.attr('id').replace('_id', ''), // определяем тип контрола ("region" или "city")
			url = CONFIG.url[controlType].supplant({ id : requestId }),
			newHtml;

		_selects.attr('disabled', 'disabled');
		_submitButton.attr('disabled', 'disabled');

		$.getJSON(url, function (data){
			newHtml = parseData(data);

			control
				.html(newHtml)
				.prepend(defaultRow)// вставляем строчку "Выберите..."
				/* .removeAttr('disabled') */
				.val(0); // делаем первую строчку ("Выберите...") - выделенной

			_selects.removeAttr('disabled');
			_submitButton.removeAttr('disabled');

			control
				.nextAll('select')
				.val(0)
				.attr('disabled', 'disabled'); // если еще правее есть контролы, задизейбливаем их
		});
	}

	function parseData(data){
		var currentData,
			tmpl = CONFIG.tmpl,
			htmlCache = [ ];

		for(var i = 0, l = data.length; i < l; i++){
			currentData = data[i];
			htmlCache.push(tmpl.supplant(currentData));
		}

		return htmlCache.join(' ');
	}

	return {
		/**
		 * @param {jQuery} container
		 */
		init : function (container){
			if(!container.length){
				return false;
			}

			_container = container;
			_submitButton = container.closest('form').find('input:submit');

			bindEvents();
		}
	};
})();


String.prototype.supplant = function (o){
	return this.replace(/{([^{}]*)}/g,
		function (a, b){
			var r = o[b];
			return typeof r === 'string' || typeof r === 'number' ? r : a;
		}
		);
};


$(document).ready(function(){
	residenceSelectManager.init($('#residenceSelect'));
});

$(function(){
	var $lines = $('.edit-good .line');

	var types = {
		usericon: 'desc_short desc_full time_start time_end time_show_start time_show_end time_invitation',
		merchandise: 'sms_short_number link time_start time_end time_show_start time_show_end time_invitation'
	};

	for(var type in types){
		if(types.hasOwnProperty(type)){
			var currentType = types[type];
			types[type] = '[name="' + currentType.split(' ').join('"], [name="') + '"]';
		}
	}
	
	$('#selectGoodsType').bind('change', function(){
		$lines.show();
		types.hasOwnProperty(this.value) && $lines.find(types[this.value]).closest('.line').hide();
	}).trigger('change');
});
