var courtVKS = {
	
	DOM: {},
	
	
	/**
	 * Объявляем внутренние переменные и обработчики сообытий
	 */
	init: function() {
		//Запоминаем часто используемые DOM-элементы
		this.setDOM();
		//Объявляем обработчики сообытий
		this.bind();
		//Переопределяем метод изменения расположения всплывающего окна
		courtVKSPopup.setPopupPosition = this.redefinitionFn({
			'name': 'setPopupPosition'
		});
		//Объявляем объект всплывающего окна
		courtVKSPopup.init();
	},
	
	
	/**
	 * Запоминаем часто используемые DOM-элементы
	 */
	setDOM: function() {
		this.DOM.$document = $(document);
		//Страница сервиса
		this.DOM.$service = $('.js-vks');
		//Элементы календаря
		this._setDOMCalendar();
	},
	
	
	/**
	 * Запоминаем часто используемые DOM-элементы календаря
	 */
	_setDOMCalendar: function() {
		//Контейнер, в котором располагается календарь
		this.DOM.$container = this.DOM.$service.find('.js-vks-calendar');
		//Панель управления над календарем
		this.DOM.$panel = this.DOM.$service.find('.js-court_calendar-control_panel');
		//Календарь
		this.DOM.$calendar = this.DOM.$service.find('.js-court_calendar-body');
		//Шапка календаря (список наименований дней недели)
		this.DOM.$daysName = this.DOM.$calendar.find('.js-court_calendar-body-head');
		//Дни календаря
		this.DOM.$days = this.DOM.$service.find('.js-vks-day');
		//Для запоминания выбранного дня
		this.DOM.$selectDay = null;
		//Для запоминания дня, над которым расположен курсор
		this.DOM.$hoverDay = null;
		//Тень для календаря
		this.DOM.$shadow = this.DOM.$service.find('.js-vks-shadow');
	},
	
	
	/**
	 * Объявляем обработчики сообытий
	 */
	bind: function() {
		var self = this;
		
		this.DOM.$container
			//Обработчик событие загрузки календаря при смене месяца
			.bind('calendarChange', function(){
				//Переопределяем часто используемые DOM-элементы календаря
				self._setDOMCalendar();
			})
			//Обработчик клика по дню в календаре
			.delegate('.js-vks-day.active', 'click', function(){ 
				var $this = $(this),
					param = {};
				
				if (!self.DOM.$selectDay) {
					param = {
						'showPopup': true,
						'loadMeetings': true
					}
					//Запоминаем выбранный день
					self.DOM.$selectDay = $this;
				} else if (!$this.hasClass('calendar-selected')) {
					param = {
						'hidePopup': true,
						'hideShadow': false
					}
				}
				
				//Объявляем событие клика по дню в календаре
				self.DOM.$service.trigger('courtVKSDayClick', [param]);
			});
		
		this.DOM.$service.delegate('.js-vks-shadow', 'click', function(){
			courtVKS.DOM.$service.trigger('courtVKSDayClick', [{
				'hidePopup': true,
				'hideShadow': false
			}]);
		});
	},
	
	
	/**
	 * Функция устанавливает тень на календарь
	 */
	showShadow: function() {
		this.DOM.$shadow.removeClass('g-hidden');
	},
	
	
	/**
	 * Функция снимает тень с календаря
	 */
	hideShadow: function() {
		this.DOM.$shadow.addClass('g-hidden');
	},
	
	
	/**
	 * Возвращает функцию по названию метода
	 * 
	 * @param str	param.name
	 * 
	 * @reutrn str
	 */
	redefinitionFn: function(param) {
		return courtVKSPopupBlock[param.name] || '';
	}
}

var courtVKSPopupBlock = {
	
	/**
	 * Функция устанавливает расположение всплывающего окна относительно выбранного дня
	 * и отображает нужный указатель
	 * 
	 * @return this
	 */
	setPopupPosition: function() {
		var //Определяем в какой колонке страницы расположен сервис
			offset = courtVKS.DOM.$service.offset().left,
			leftCol = offset <= courtVKS.DOM.$document.width() / 4 ? true : false,
			//Параметры дня в календаре
			param = courtVKS.DOM.$selectDay.get(0).onclick(),
			//ячейка календаря выбранного дня
			$cell = courtVKS.DOM.$selectDay.parent(),
			//Размеры элементов календаря
			size = {
				'head': {
					'height': courtVKS.DOM.$panel.parent().height() + courtVKS.DOM.$daysName.height()
				},
				'cell': {
					'width': $cell.width(),
					'height': $cell.height()
				},
				'popup': {
					'width': courtVKSPopup.DOM.$popup.width(),
					'height': courtVKSPopup.DOM.$popup.height()
				}
			},
			//Отступы сверху и слево для всплывающего окна
			pos = {
				'top': size.head.height + (param.pos.week + 1) * size.cell.height - (size.popup.height + size.cell.height) / 2 - 20,
				'left': leftCol ? (param.pos.day + 1) * size.cell.width : param.pos.day * size.cell.width - size.popup.width - 40
			},
			//Класс курсора, который необходимо отобразить
			cursor = leftCol ? '.arrow-left' : '.arrow-right';
		
		//Устанавливаем расположение окна
		courtVKSPopup.DOM.$popup.css(pos);
		//Скрываем все курсора, кроме того, который должен отображаться
		courtVKSPopup.DOM.popup.$cursors
				.not(cursor)
				.addClass('g-hidden');
		
		return this;
	}
};

$(function(){
	//Инициализируем методы и переменные объекта сервиса
	courtVKS.init();
});