/* CALENDAR
***************************************************************************************************/
var Calendar = Class.create(
{
//
// Constructor
//
	initialize: function(monthsStr, year, month, currentYear, currentMonth, events, htmlIdent)
	{
	//{ Fields
		this.htmlIdent = "";
		if(htmlIdent != undefined){
			this.htmlIdent = htmlIdent;
		}
		this.element = $('calendar');
		this.calendarEventContainer = $('calendar-event-container');
		this.daysContainer = $('calendar-days-container');

		this.monthsStr = $H(monthsStr);
		this.year = year;
		this.month = month;
		this.currentYear = currentYear;
		this.currentMonth = currentMonth;
		this.events =$H(events);
		this.content = "";
		this.eventResponseText = null;

		this.hintBox = $('calendar-events-list-box');
		this.transactions = new RequestTransactionsManager(this.element);
		this.calendarEventTransactions = new RequestTransactionsManager(this.calendarEventContainer);
		//{ Controls
		this.nextMonthButton = pageControlsManager.getControl(this.htmlIdent + 'calendar-month-next');
		this.nextMonthButton.setStatus("enabled");
		this.prevMonthButton = pageControlsManager.getControl(this.htmlIdent + 'calendar-month-prev');
		this.prevMonthButton.setStatus("enabled");
		this.curMonthButton = pageControlsManager.getControl(this.htmlIdent + 'calendar-current-date');
		$('calendar-current-date').removeClassName('hidden');
		if(year != currentYear || month != currentMonth){
			this.curMonthButton.setStatus("enabled");
		} else {
			this.curMonthButton.setStatus("hidden");
		}
		this.days = new Array();
		this._createDaysButtons();
		//}
	//}
	//{ Other
		// pageControlsManager.registerElements(new PageControlType('div.event-box-contents div.events-list-header a', "JsButton"));
		// this.closeHintBoxButton = pageControlsManager.getControl(this.htmlIdent + 'calendar-close-hintbox');
		// this.closeHintBoxButton.setStatus("enabled");

	//}
	//{ Delegates
		//{ Controls events
		var nextMonthButtonClickDelegate = function(){
			this._onNextMonthButtonClick();
		}.bind(this);

		var previousMonthButtonClickDelegate = function(){
			this._onPreviousMonthButtonClick();
		}.bind(this);

		var currentMonthButtonClickDelegate = function(){
			this._onCurrentMonthButtonClick();
		}.bind(this);
		//}

		//{ Class events
		var refreshDelegate = function(event){
			this._refresh();
		}.bind(this);

		var unblockDelegate = function(event){
			this._unblockCalendar();
		}.bind(this);
		//}

		this._onFailureHandler = function(){
			alert("Ошибка! Невозможно обработать. Проверьте ваше Internet соединение")
			$(this.htmlIdent + 'discussform').fire('Calendar:failureRequest');
		}.bind(this);

	//}
	//{ Observing to events
		//Transactions
		Event.observe(this.element, 'RequestTransactionsManager:transactionsComplete', refreshDelegate);
		Event.observe(this.element, 'RequestTransactionsManager:transactionsComplete', unblockDelegate);

		//Form events
		Event.observe(this.nextMonthButton.element, 'Control:click', nextMonthButtonClickDelegate);
		Event.observe(this.prevMonthButton.element, 'Control:click', previousMonthButtonClickDelegate);
		Event.observe(this.curMonthButton.element, 'Control:click', currentMonthButtonClickDelegate);
		// Event.observe(this.closeHintBoxButton.element, 'Control:click', this._hideEventsList.bind(this));
		// Event.observe(this.closeHintBoxButton.element, 'Control:mouseover', this._onEventBoxMouseOver.bind(this));
		Event.observe(this.hintBox, 'mouseover', this._onEventBoxMouseOver.bind(this));
		Event.observe(this.hintBox, 'mouseout', this._onEventBoxMouseOut.bind(this));
	//}

		//Current element
		this.selectDay = null;
	},
//
//{  INNER METHODS
//
//{ Creating
	_createDaysButtons: function()
	{
		var dayButtonFocusDelegate = function(event){
			this._showEventsList(event.memo.elem, event.memo.number);
		}.bind(this);

		var dayButtonLostFocusDelegate = function(event){
			this.timerId = window.setTimeout(this._hideEventsList.bind(this), 400);
		}.bind(this);

		this.days = pageControlsManager.getControlsByElements($$('div#calendar-days-container a.eventday'));
		for(var i=0; i<this.days.length; i++){
			this.days[i].setEventParams({elem: this.days[i].element, number: this.days[i].id.replace('calendar-day', '')});
			Event.observe(this.days[i].element, 'click', this._clickEventsByDay.bindAsEventListener(this));
		}
		pageControlsManager.setStatus(this.days, "enabled");
	},
//}


	_showEventsByDay: function(event){
		this.showEvents(event.target);
		Event.stop(event);
	},


	showEvents: function(day){
		var elementContainer = $('calendar-event-container');

		if (this.selectDay != null)
			this.selectDay.removeClassName('calendar-select-day');
		this.selectDay = $(day);
		this.selectDay.addClassName('calendar-select-day');


		var updateWrapEvent = function() {
			var selectEvent = $('day-'+day.innerHTML.strip());
			if (selectEvent == null) {return;}

			$('wrap-event').update(selectEvent.innerHTML.strip());

			new Effect.BlindDown(elementContainer, {
				queue: {position: 'end', scope: 'scope-calendar-event'},
				duration: 0.5,
				afterFinish: this._unblockCalendar.bindAsEventListener(this)
			});
		}.bind(this)

		new Effect.BlindUp(elementContainer, {
			queue: {position: 'end', scope: 'scope-calendar-event'},
			duration: 0.5,
			afterFinish: updateWrapEvent
		});
	},

	_clickEventsByDay: function(event){
		this._disableCalendar();
		$('calendar-current-date').setStyle({color: '#fccaa2'});;
		var selectEvent = $('day-'+event.target.innerHTML.strip());
		if (Effect.Queues.get('scope-calendar-event').effects.length > 0) {
			Event.stop(event);
			return;
		}
		this._showEventsByDay(event);
 	},


 	_disableCalendar: function()
	{
		this.nextMonthButton.setStatus("disabled");
		this.prevMonthButton.setStatus("disabled");
		if(this.year != this.currentYear || this.month != this.currentMonth){
			this.curMonthButton.setStatus("disabled");
		}
	},


//{ Blocking
	_blockCalendar: function()
	{
		this.nextMonthButton.setStatus("disabled");
		this.prevMonthButton.setStatus("disabled");
		if(this.year != this.currentYear || this.month != this.currentMonth){
			this.curMonthButton.setStatus("disabled");
		}

		this.daysContainer.innerHTML = '<div id="calendar-loader"></div>';
		$('calendar-loader').setStyle({display: 'block'});
	},

	_unblockCalendar: function()
	{
		this.nextMonthButton.setStatus("enabled");
		this.prevMonthButton.setStatus("enabled");
		if(this.year != this.currentYear || this.month != this.currentMonth){
			this.curMonthButton.setStatus("enabled");
		}
		$('calendar-current-date').setStyle({color: '#fe7200'});
	},
//}

//{ Data
	_refresh: function(content)
	{
		pageControlsManager.destroyControls(this.days);
		this.daysContainer.innerHTML = this.content;
		$('calendar-month-name').update(this.monthsStr.get(this.month) + ' / ' + this.year.toString().substr(2,2));
		// this.days = pageControlsManager.registerElements(new PageControlType('div#calendar-days-container a.eventday', "PageControlElement"));
		this._createDaysButtons();
	},
//}

//{ Visual
	//{ Events list pop-up box
	_showEventsList: function(dayElement, day)
	{
		if (this.timerId) {
			window.clearTimeout(this.timerId);
		}

		var _showEventListDelayed = function(){
			var calendarEventsListBox = $('calendar-events-list-box');
			$$('body')[0].appendChild(calendarEventsListBox);
			calendarEventsListBox.style.left = Element.cumulativeOffsetFixed(dayElement).left - 196 + 'px';
			calendarEventsListBox.style.top = Element.cumulativeOffsetFixed(dayElement).top - 100 + 'px';
			$('calendar-events-list-box').addClassName('visible-block');

			var dayEvents = this.events.get(day);

			var calendarEventsList = $('calendar-events-list');
			calendarEventsList.update('');
			var curEvent;
			for(i = 0; i < dayEvents.length; i++){
				curEvent = new Hash(dayEvents[i]);
				calendarEventsItemDt = document.createElement('dt');
				calendarEventsItemDt.innerHTML = curEvent.get('order');
				calendarEventsItemDd = document.createElement('dd');
				calendarEventsItemDd.innerHTML = '<a href="/event/item.html?id=' + curEvent.get('id_event') + '">' + curEvent.get('name') + '</a>';
				calendarEventsList.appendChild(calendarEventsItemDt);
				calendarEventsList.appendChild(calendarEventsItemDd);
			}
		}.bind(this);

		this.timerId = window.setTimeout(_showEventListDelayed, 300);
	},

	_hideEventsList: function()
	{
		this.hintBox.removeClassName('visible-block');
	},
	//}
//}

//}


//
//{ Events handlers
//
	//{ Next month button click
	_onNextMonthButtonClick: function()
	{
		this.nextMonthButton.setStatus("disabled");
		month = this.month + 1;
		if(month > 12){
			this.year++;
			month = 1;
		}

		this._getPage(this.year, month);
	},
	//}
	//{ Previous month button click
	_onPreviousMonthButtonClick: function()
	{
		this.prevMonthButton.setStatus("disabled");
		month = this.month - 1;
		if(month < 1){
			this.year--;
			month = 12;
		}

		this._getPage(this.year, month);
	},
	//}
	//{ Current month button click
	_onCurrentMonthButtonClick: function()
	{
		this.curMonthButton.setStatus("active");
		if(this.currentMonth != this.month || this.currentYear != this.year){
			this._getPage(this.currentYear, this.currentMonth);
		}
	},
	//}
	_onEventBoxMouseOver: function()
	{
		if (this.timerId) {
			window.clearTimeout(this.timerId);
		}
	},

	_onEventBoxMouseOut: function(elem, id)
	{
		this.timerId = window.setTimeout(this._hideEventsList.bind(this), 400);
	},
//}

//
//{ REQUESTS
//
	//{ Get page
	_getPage: function(year, month)
	{
		this._blockCalendar();
		this.transactions.add();
		this.calendarEventTransactions.add();

		var onSuccessHandler = function(transport, json){
			if (json == null){
				showFatalError(transport.responseText);
				return;
			}
			this.content = transport.responseText;
			this.events = $H(json.events);
			this.year = year;
			this.month = month;
			if(year != this.currentYear || month != this.currentMonth){
				this.curMonthButton.setStatus("enabled");
			} else {
				this.curMonthButton.setStatus("hidden");
			}
			this.transactions.remove();
		}.bind(this);

		var params = new Hash({year: year, month: month});

		new Ajax.Request('/calendar/getpage.html', {
			parameters: params.toQueryString(),
			onSuccess: onSuccessHandler,
			onFailure: this._onFailureHandler
		});



		var onSuccessHandlerEvent = function(transport){
			this.eventResponseText = transport.responseText;
			$('event-container-hide').update(this.eventResponseText);
			this.calendarEventTransactions.remove();
		}.bind(this);

		var paramsEvent = new Hash({date: year + '-' + month});

		new Effect.BlindUp($('calendar-event-container'), {
			duration: 0.5
		});

		new Ajax.Request('/event/list.html', {
			method: 'get',
			parameters: paramsEvent.toQueryString(),
			onSuccess: onSuccessHandlerEvent,
			onFailure: this._onFailureHandler
		});


	}
	//}
//}
});
CtPage.registerScript("Calendar");