if (typeof(Mitsuden.Events) == 'undefined') Mitsuden.Events = {};

/**
 * Календарь анонсов событий
 *
 */
Mitsuden.Events.Days = new Class({

	Implements: [Options, Events, NS.Semaphore],

	/**
	 * Опции
	 * @var {Hash}
	 */
	options:
	{	
		/**
		 * Контейнер
		 * @var {String|Element}
		 */
		'elContainer': null,
		
		/**
		 * Блок отображения даты
		 * @var {String|Element}
		 */
		'elDate': null,
		
		/**
		 * Кнопка следующего месяца
		 * @var {String|Element}
		 */
		'elDateNext': null,
		
		/**
		 * Кнопка предыдущего месяца
		 * @var {String|Element}
		 */
		'elDatePrev': null,
		
		/**
		 * Список дней недели
		 * @var {String|Element}
		 */
		'elWeekDays': null,

		/**
		 * Список дней месяца
		 * @var {String|Element}
		 */
		'elDays': null,
		
		/**
		 * Текущий месяц
		 * @var {Int}
		 */
		'month': null,
		
		/**
		 * Текущий год
		 * @var {Int}
		 */
		'year': null
	},
	
	/**
	 * Текущий месяц (начиная с 1)
	 * @var {Int}
	 */
	month: null,
	
	/**
	 * Текущий год
	 * @var {Int}
	 */
	year: null,

	/**
	 * Конструктор
	 * @param {Hash} options
	 */
	initialize: function(options)
	{
		this.setOptions(options);

		// Загрузка элементов из DOM
		this.options.elContainer = $(this.options.elContainer);
		this.options.elDate = $(this.options.elDate);
		this.options.elDateNext = $(this.options.elDateNext);
		this.options.elDatePrev = $(this.options.elDatePrev);
		this.options.elWeekDays = $(this.options.elWeekDays);
		this.options.elDays = $(this.options.elDays);

		// Дата
		var cDate = new Date();
		this.month = this.options.month || (cDate.getMonth() + 1);
		this.year = this.options.year || cDate.getFullYear();

		// Обновление блока отображения даты
		this._refreshDate();

		// Назначение обработчиков событий
		this._setEventHandlers();
	},
	
	/**
	 * Следующий месяц
	 */
	nextMonth: function()
	{
		this._increaseMonth();
	},
	
	/**
	 * Предыдущий месяц
	 */
	prevMonth: function()
	{
		this._increaseMonth(-1);
	},
	
	/**
	 * Назначение обработчиков событий
	 */
	_setEventHandlers: function()
	{
		// Перемотка даты
		this.options.elDateNext.addEvent('click', function(e){
			e.stop();
			this._increaseMonth();
		}.bind(this));
		this.options.elDatePrev.addEvent('click', function(e){
			e.stop();
			this._increaseMonth(-1);
		}.bind(this));

		// Скролл
		this.options.elContainer.addEvent('mousewheel', function(e){
			e.stop();
			this._increaseMonth(-e.wheel);
		}.bind(this));
	},
	
	/**
	 * Обновление блока даты
	 */
	_refreshDate: function()
	{
		// Блок даты
		var months = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'];
		var weekDays = ['пн', 'вт', 'ср', 'чт', 'пт', 'сб', 'вс'];

		// Дни недели и месяца
		var strWeekDays = '';
		var strDays = '';

		for (var day = 1, weekDay = 0; day <= 32 - new Date(this.year, this.month - 1, 32).getDate(); day++)
		{
			strWeekDays += '<li>' + weekDays[weekDay] + '</li>';
			strDays += '<li>' + day + '</li>';
			if (++weekDay == 7) weekDay = 0;
		}

		// Отображение изменений
		var o = {
			'property': 'opacity',
			'duration': 200,
			'onStart': this.setEnabled.bind(this, [false]),
			'onComplete': this.setEnabled.bind(this, [])
		};
		
		// Дата
		var fx1 = new Fx.Tween(this.options.elDate, o).start(1, 0).chain(function(){
			this.options.elDate.innerHTML = months[this.month - 1] + ' ' + this.year;
			fx1.start(0, 1);
		}.bind(this));

		// Дни недели
		var fx2 = new Fx.Tween(this.options.elWeekDays, o).start(1, 0).chain(function(){
			this.options.elWeekDays.innerHTML = strWeekDays;
			fx2.start(0, 1);
		}.bind(this));

		// Дни месяца
		var fx3 = new Fx.Tween(this.options.elDays, o).start(1, 0).chain(function(){
			this.options.elDays.innerHTML = strDays;
			fx3.start(0, 1);
		}.bind(this));
	},
	
	/**
	 * Изменение даты
	 * @param {Int} delta
	 */
	_increaseMonth: function(delta)
	{
		if (delta !== -1) delta = 1;
		
		if (this.isEnabled())
		{
			// Изменение месяца
			this.month += delta;
			if (this.month == (delta == 1 ? 13 : 0))
			{
				this.month = (delta == 1 ? 1 : 12);
				this.year += delta;
			}

			// Событие начала переключения
			this.fireEvent('start', { 'target': this });

			this._refreshDate();
		}
	}
});

