var courtReception = {
	
	DOM: {},
	ajax: {
		'query': {
			'saveData': {},
			'loadReceptions': {}
		},
		'path': {
			'saveData': '/',
			'loadReceptions': '/'
		},
		'timeout': 30000
	},
	isPopupProcess: false,
	//Для запоминания данных списка приемов из базы по выбранной дате
	receptions: [],
	
	
	/**
	 * Объявляем внутренние переменные и обработчики сообытий
	 */
	init: function() {
		//Запоминаем часто используемые DOM-элементы
		this.setDOM();
		//Объявляем обработчики сообытий
		this.bind();
		//Адрес куда отправлять запрос для получения данных
		this.ajax.path.loadReceptions = this.DOM.popup.$graph.children('#js-reception-popup-ajax_get').val();
		//Адрес куда отправлять запрос для сохранения данных
		this.ajax.path.saveData = this.DOM.popup.$form.children('#js-reception-popup-ajax_save').val();
		//Объявляем событие загрузки объекта сервиса
		this.DOM.$document.trigger('courtReceptionLoad');
	},
	
	
	/**
	 * Запоминаем часто используемые DOM-элементы
	 */
	setDOM: function() {
		this.DOM.$window = $(window);
		this.DOM.$document = $(document);
		//Страница сервиса
		this.DOM.$service = $('.js-reception');
		
		//Элементы календаря
		this._setDOMCalendar();
		//Элементы всплывающего окна
		this._setDOMPopup();
		//Запоминаем шаблон элемента списка заседаний
		this._setDOMPopupItemTemplate();
	},
	
	
	/**
	 * Запоминаем часто используемые DOM-элементы календаря
	 */
	_setDOMCalendar: function() {
		//Панель управления над календарем
		this.DOM.$panel = this.DOM.$service.find('.js-court_calendar-control_panel');
		//Контейнер, в котором располагается календарь
		this.DOM.$container = this.DOM.$service.find('.js-reception-calendar');
		//Календарь
		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-reception-front-day');
		//Для запоминания выбранного дня
		this.DOM.$selectDay = null;
		//Для запоминания дня, над которым расположен курсор
		this.DOM.$hoverDay = null;
	},
	
	
	/**
	 * Запоминаем часто используемые DOM-элементы всплывающего окна
	 */
	_setDOMPopup: function() {
		//Всплывающее окно
		this.DOM.$popup = this.DOM.$service.find('.js-court-popup');
		//Элементы всплывающего окна
		this.DOM.popup = {
			//Указатели с краю окна
			$cursors: this.DOM.$popup.find('.js-court-popup-arrow'),
			//Блок "График приемов"
			$graph: this.DOM.$popup.find('.js-reception-popup-graph'),
			//Форма всплывающего окна
			$form: this.DOM.$popup.find('.js-reception-popup-form'),
			//Статус отправки данных
			$status: this.DOM.$popup.find('.js-reception-popup-status'),
			//Спинер загрузки
			$spiner: this.DOM.$popup.find('.js-reception-popup-spiner')
		};
		//График приемов
		this.DOM.popup.graph = {
			$list: this.DOM.popup.$graph.find('.js-reception-popup-list')
		}
		//Форма всплывающего окна
		this.DOM.popup.form = {
			$fields: this.DOM.popup.$form.find('.js-reception-popup-field')
		}
		//Заголовок и текст статуса
		this.DOM.popup.status = {
			$title: this.DOM.popup.$status.children('.js-reception-popup-status-title'),
			$text: this.DOM.popup.$status.children('.js-reception-popup-status-text')
		}
	},
	
	
	/**
	 * Запоминаем шаблон элемента списка заседаний
	 */
	_setDOMPopupItemTemplate: function() {
		var $template = this.DOM.popup.graph.$list.find('.js-reception-popup-template-item');
		
		//Меняем селекторы в шаблоне
		$template
			.removeClass('g-hidden js-reception-popup-template-item')
			.addClass('b-reception-popup-item js-reception-popup-item');
		
		this.DOM.popup.graph.$itemTemplate = $template;
		
		//Удаляем шаблон элемента списка заседаний
		$template.remove();
	},
	
	
	/**
	 * Объявляем обработчики сообытий
	 */
	bind: function() {
		//Обработчик изменения размеров окна браузера
		this._bindWindowResize();
		//Обработчик нажатия клавиш
		this._bindKey();
		//Обработчик события загрузки календаря при смене месяца
		this._bindCalendarChange();
		//Объявляем обработчики сообытий для календаря
		this._bindCalendar();
		//Объявляем обработчики сообытий для всплывающего окна
		this._bindPopup();
	},
	
	
	/**
	 * Обработчик события загрузки календаря при смене месяца
	 */
	_bindCalendarChange: function() {
		var self = this;
		
		this.DOM.$container.bind('calendarChange', function(){
			//Переопределяем часто используемые DOM-элементы календаря
			self._setDOMCalendar();
		});
	},
	
	
	/**
	 * Обработчик изменения размеров окна браузера
	 */
	_bindWindowResize: function() {
		var self = this;
		
		this.DOM.$window.resize(function(){
			//Меняем расположение всплывающего окна относительно выбранного дня, если календарь открыт
			if (!self.DOM.$calendar.hasClass('g-hidden') && self.DOM.$selectDay) {
				self.setPopupPosition();
			}
		});
	},
	
	
	/**
	 * Обработчик нажатия клавиш
	 */
	_bindKey: function() {
		var self = this;
		
		this.DOM.$document.keyup(function(e) {
			var keycode = (window.event) ? e.keyCode : e.which ;
			
			switch (keycode) {
				//Кнопка Esc
				case 27: 
					if (!self.DOM.$popup.hasClass('g-hidden') && !self.isPopupProcess) {
						//Скрываем всплывающее окно
						self.hidePopup({
							'hideShadow': true
						});
					}
					break
			}
		});
	},
	
	
	/**
	 * Объявляем обработчики сообытий для календаря
	 */
	_bindCalendar: function() {
		//Обработчик наведения курсора на день в календаре
		this._bindCalendarDaysHover();
		//Обработчик нажатия на день в календаре
		this._bindCalendarDaysClick();
	},
	
	
	/**
	 * Объявляем обработчики сообытий для всплывающего окна
	 */
	_bindPopup: function() {
		//Обработчик движения курсора по всплывающему окну (для очистки this.DOM.$hoverDay)
		this._bindPopupHover();
		//Обработчик клика по кнопке закрытия всплывающего окна
		this._bindPopupClose();
		//Обработчик клика по приему в списке приемов
		this._bindPopupListClick();
		//Обработчик установки фокуса в поле формы
		this._bindPopupFieldFocus();
		//Обработчик клика по кнопке Отправить заявку
		this._bindPopupSubmit();
	},
	
	
	/**
	 * Обработчик наведения курсора на день в календаре
	 */
	_bindCalendarDaysHover: function() {
		var self = this;
		
		this.DOM.$container.delegate('.js-reception-front-day.active', 'hover', function() {
			var $this = $(this),
				isShadow = !self.DOM.$calendar.hasClass('calendar-hide') ? true : false;
			
			//Запоминаем день, над которым расположен курсор
			self.DOM.$hoverDay = $this;
			
			if (isShadow) {
				$this
					.find('.js-reception-day-hover')
					.toggleClass('g-hidden');
			}
		});
	},
	
	
	/**
	 * Обработчик нажатия на день в календаре
	 */
	_bindCalendarDaysClick: function() {
		var self = this;
		
		this.DOM.$container.delegate('.js-reception-front-day.active', 'click', function(){
			var $this = $(this);
			
			if (!self.DOM.$selectDay) {
				//Запоминаем выбранный день
				self.DOM.$selectDay = $this;
				//Запоминаем выбранную дату для ajax-запроса
				self.ajax.query.saveData.date = self.DOM.$selectDay.get(0).onclick().date;
				self.ajax.query.loadReceptions.date = self.ajax.query.saveData.date;
				//Расскрываем всплывающее окно
				self.showPopup({
					'loadReceptions': true
				});
			} else if (!$this.hasClass('day-selected')) {
				//Если клик произведен по любому другому дню, кроме выбранного,
				//скрываем всплывающее окно
				self.hidePopup({
					'hideShadow': false
				});
			}
		});
	},
	
	
	/**
	 * Обработчик движения курсора по всплывающему окну (для очистки this.DOM.$hoverDay)
	 */
	_bindPopupHover: function() {
		var self = this;
		
		this.DOM.$service.delegate('.js-court-popup', 'hover', function(){
			self.DOM.$hoverDay = null;
		});
	},
	
	
	/**
	 * Обработчик клика по кнопке закрытия всплывающего окна
	 */
	_bindPopupClose: function() {
		var self = this;
		
		this.DOM.$popup.delegate('.js-court-popup-close', 'click', function(){
			if (!self.isPopupProcess) {
				if (self.checkReceptions() && !self.DOM.popup.$form.hasClass('g-hidden')) {
					//Скрываем форму и возвращаемся к графику приемов
					self
						.hidePopupForm()
						.showPopupList();
				} else {
					//Скрываем всплывающее окно
					self.hidePopup({
						'hideShadow': true
					});
				}
			}
		});
	},
	
	
	/**
	 * Обработчик клика по приему в списке приемов
	 */
	_bindPopupListClick: function() {
		var self = this;
		
		this.DOM.popup.graph.$list.delegate('.js-reception-popup-item', 'click', function(){
			self
				.hidePopupList()
				.showPopupForm()
				.setPopupPosition();
		});
	},
	
	
	/**
	 * Обработчик установки фокуса в поле формы
	 */
	_bindPopupFieldFocus: function() {
		this.DOM.popup.$form.delegate('.required', 'focus', function() {
			//Снимаем сообщения об ошибке
			courtMain.resetFieldError($(this));
		});
	},
	
	
	/**
	 * Обработчик клика по кнопке Отправить заявку
	 */
	_bindPopupSubmit: function() {
		var self = this;
		
		this.DOM.popup.$form.delegate('.js-form-submit', 'click', function(){
			var $fieldRequired = self.DOM.popup.form.$fields.filter('.required');
			
			//Если все поля заполнены верно
			if (courtMain.setFieldsCheck($fieldRequired)) {
				//Отправляем запрос на сохранение данных
				self.saveData();
			}
			
			return false;
		});
	},
	
	
	/**
	 * Функция отправки запроса на сохранение заявки
	 * 
	 * @param fn	param.callback
	 * @param obj	param.message
	 */
	saveData: function(param) {
		var self = this;
		
		this.isPopupProcess = true;
		//Составляем ajax-запрос и скрываем форму
		this
			.setAjaxQuery()
			.hidePopupForm()
			.showPopupSpiner()
			.setPopupPosition();
		
		$.ajax({
			type: 'post',
			url: this.ajax.path.saveData,
			data: this.ajax.query.saveData,
			dataType: 'json',
			timeout: this.ajax.timeout,
			success: function(result) {
				var status = {};
				
				if (result) {
					//Обработчик успешной отправки запроса
					if (param && param.callback) {
						param.callback(self.ajax.query.saveData);
					}
					//Расскрываем статус отправки данных
					status = {
						'isError': false,
						'message': 'Уведомление об отправке заявления будет выслано на указанный вами e-mail.<br />В случае принятия заявления с вами свяжутся дополнительно по телефону или электронной почте.'
					};
					
					if (param && param.message && param.message.success) {
						status.message = param.message.success;
					}
				} else {
					//Выводим сообщение об ошибке
					status = {
						'isError': true,
						'message': 'При отправке запроса произошла ошибка.<br />Попробуйте воспользоваться сервисом позже. Если ошибка повторится, обратитесь в службу технической поддержки.'
					};
					
					if (param && param.message && param.message.unsuccess) {
						status.message = param.message.unsuccess;
					}
				}
				
				//Расскрываем статус отправки данных
				self
					.hidePopupSpiner()
					.showPopupStatus(status)
					.setPopupPosition();
				self.isPopupProcess = false;
				//Очищаем ajax-запрос
				self.ajax.query.saveData = {};
			},
			error: function() {
				//Выводим сообщение об ошибке
				self
					.hidePopupSpiner()
					.showPopupStatus({
						'isError': true,
						'message': 'При отправке запроса произошла ошибка.<br />Попробуйте воспользоваться сервисом позже. Если ошибка повторится, обратитесь в службу технической поддержки.'
					})
					.setPopupPosition();
				self.isPopupProcess = false;
				//Очищаем ajax-запрос
				self.ajax.query.saveData = {};
			}
		});
	},
	
	
	/**
	 * Функция расскрывает всплывающее окно
	 * 
	 * @param bool	param.loadReceptions	TRUE - загружать список приемов
	 */
	showPopup: function(param) {
		//Блокируем возможность смены месяца в календаре
		courtCalendar.load = false;
		//Оставляем активной ячейку выбранного дня
		this.DOM.$selectDay.addClass('day-selected');
		//Добавляем тень к выбранному дню
		this.DOM.$selectDay
				.find('.js-reception-day-hover')
				.removeClass('g-hidden');
		//Вешаем тень на весь календарь
		this.DOM.$calendar.addClass('calendar-hide');
		//Отображаем всплывающее окно
		this.DOM.$popup.removeClass('g-hidden');
		
		if (param.loadReceptions) {
			//Отправляем запрос на получение графика заседаний
			this.loadReceptions();
		} else {
			//Расскрываем форму
			this
				.showPopupForm()
				.setPopupPosition();
		}
	},
	
	
	/**
	 * Функция расскрывает список приемов во всплывающем окне
	 * 
	 * @return this
	 */
	showPopupList: function() {
		//Расскрываем список заседаний
		this.DOM.popup.$graph.removeClass('g-hidden');
		//Устанавливаем расположение всплывающего окна относительно выбранного дня и
		//кастомный скролл для списка заседаний
		this
			.setPopupPosition()
			.setPopupListScroll();
		
		return this;
	},
	
	
	/**
	 * Функция расскрывает форму всплывающего окна
	 * 
	 * @return this
	 */
	showPopupForm: function() {
		this.DOM.popup.$form.removeClass('g-hidden');
		
		return this;
	},
	
	
	/**
	 * Функция расскрывает спинер загрузки при отправки ajax-запроса
	 * 
	 * @return this
	 */
	showPopupSpiner: function() {
		this.DOM.popup.$spiner.removeClass('g-hidden');
		
		return this;
	},
	
	
	/**
	 * Функция расскрывает статус отправки ajax-запроса
	 * 
	 * @param bool	param.isError	TRUE - статус ошибки
	 * @param str	param.message	текст статуса
	 * 
	 * @return this
	 */
	showPopupStatus: function(param) {
		//Расскрываем сообщение об ошибке отправки данных
		this.DOM.popup.$status.removeClass('g-hidden');
		
		if (param.isError) {
			this.DOM.popup.$status.addClass('error');
		}
		
		//Заполняем поля статуса
		$.each(this.DOM.popup.status, function(name){
			if (name == '$title') {
				$(this).text(param.isError ? 'Ошибка' : 'Данные отправлены');
			} else {
				$(this).html(param.message);
			}
		});
		
		return this;
	},
	
	
	/**
	 * Функция скрытия всплывающего окна
	 * 
	 * @param bool	param.hideShadow		TRUE - скрыть тень внутри ячейки после закрытия окна
	 */
	hidePopup: function(param) {
		var isHoverDaySelected = (this.DOM.$hoverDay && !this.DOM.$hoverDay.hasClass('day-selected')) ? true : false;
		var isHoverDay = this.DOM.$hoverDay ? true : false,
			isHoverDaySelected = (isHoverDay && this.DOM.$hoverDay.hasClass('day-selected')) ? true : false;
		
		//Разблокируем возможность смены месяца в календаре
		courtCalendar.load = true;
		//Снимаем тень с календаря
		this.DOM.$calendar.removeClass('calendar-hide');
		
		if (param.hideShadow || !isHoverDaySelected) {
			//Скрываем тень у выбранного дня, если курсор установлен над другим днем
			this.DOM.$selectDay
					.find('.js-reception-day-hover')
					.addClass('g-hidden');
			
			if (isHoverDay && !isHoverDaySelected) {
				//Расскрываем тень у дня, над которым установлен курсор и который не был выбран
				this.DOM.$hoverDay
					.find('.js-reception-day-hover')
					.removeClass('g-hidden');
			}
		}

		//Снимаем отметку активности с выбранного дня
		this.DOM.$selectDay.removeClass('day-selected');
		//Убираем запомненный выбранный день
		this.DOM.$selectDay = null;
		//Скрываем всплывающее окно
		this.DOM.$popup.addClass('g-hidden');
		//Убираем стили позиционирования у окна
		this.DOM.$popup.attr('style', null);
		//Расскрываем все курсоры всплывающего окна
		this.DOM.popup.$cursors.removeClass('g-hidden');
		//Скрываем блоки всплывающего окна
		this
			.hidePopupList({
				listClear: this.receptions.length ? true : false
			})
			.hidePopupForm()
			.hidePopupSpiner()
			.hidePopupStatus();
		//Устанавливаем стилизованный скролл в начало
		this.resetPopupListScroll();
		//Очищаем запомненный список приемов
		this.receptions = [];
		//Объявляем событие скрытия всплывающего окна
		this.DOM.$popup.trigger('courtReceptionHidePopup');
	},
	
	
	/**
	 * Функция скрывает блок списка приемов
	 * 
	 * @param bool	param.listClear		TRUE - очистить список приемов
	 * 
	 * @return this
	 */
	hidePopupList: function(param) {
		this.DOM.popup.$graph.addClass('g-hidden');
		
		if (param && param.listClear) {
			//Очищаем список приемов
			this.DOM.popup.graph.$list.html('');
		}
		
		return this;
	},
	
	
	/**
	 * Функция скрывает форму всплывающего окна
	 * 
	 * @return this
	 */
	hidePopupForm: function() {
		this.DOM.popup.$form.addClass('g-hidden');
		//Очищаем поля
		courtMain.clearFields(this.DOM.popup.form.$fields);
		
		return this;
	},
	
	
	/**
	 * Функция скрывает спинер загрузки после отправки ajax-запроса
	 * 
	 * @return this
	 */
	hidePopupSpiner: function() {
		this.DOM.popup.$spiner.addClass('g-hidden');
		
		return this;
	},
	
	
	/**
	 * Функция скрывает сообщение о результатах отправки ajax-запроса
	 * 
	 * @return this
	 */
	hidePopupStatus: function() {
		//Скрываем сообщение об ошибке отправки данных и удаляем метки
		this.DOM.popup.$status
			.addClass('g-hidden')
			.removeClass('error');
		//Очищаем поля заголовка и сообщения
		$.each(this.DOM.popup.status, function(){
			$(this).text('');
		});
		
		return this;
	},
	
	
	/**
	 * Функция добавляет список приемов во всплывающее окно
	 * 
	 * @return this
	 */
	setPopupList: function() {
		var self = this;
		
		//Добавляем прием в список
		for (var p in this.receptions) {
			if (p == 'indexOf') {
				continue;
			}
			
			//Добавляем заполненный шаблон
			this.DOM.popup.graph.$list.append(function(index, html){
				var $template = self.DOM.popup.graph.$itemTemplate.clone(),
					//Данные по заседанию
					data = self.receptions[p];
				
				//Время приема
				$template
					.find('.js-reception-popup-item-time')
					.text(data.time);
				//Судья
				$template
					.find('.js-reception-popup-item-fio')
					.text(data.fio);
				
				return $template;
			});
		}
		
		return this;
	},
	
	
	/**
	 * Функция устанавливает расположение всплывающего окна относительно выбранного дня
	 * и отображает нужный указатель
	 * 
	 * @return this
	 */
	setPopupPosition: function() {
		var //Расположение выбранного дня в календаре
			dayParam = this.DOM.$selectDay.get(0).onclick(),
			//Ширина и высоты ячейки календаря выбранного дня
			daySize = {
				'width': this.DOM.$selectDay.outerWidth(),
				'height': this.DOM.$selectDay.outerHeight()
			},
			//Отступы сверху и слево от окна календаря для выбранного дня
			dayPosition = {
				'top': dayParam.week * daySize.height,
				'left': dayParam.day * daySize.width,
				'right': (6 - dayParam.day) * daySize.width
			},
			//Ширина и высоты всплывающего окна
			popupSize = {
				'width': this.DOM.$popup.width(),
				'height': this.DOM.$popup.height()
			},
			//Высота шапки страницы 
			headContentHeight = this.DOM.$panel.height() + this.DOM.$daysName.height() + 1,
			//Отступы
			offset = {
				//Вертикальный для первой строки
				'top': headContentHeight + daySize.height + 14,
				//Вертикальный для средних строк
				'topMiddle': headContentHeight + dayPosition.top - popupSize.height / 2 + daySize.height / 2 - 13,
				//Вертикальный для последней строки
				'bottom': daySize.height + 16,
				//Горизонтальный для угловых ячеек
				'corner': 20,
				//Горизонтальный для средних ячеек первой и последней строк
				'leftCenter': dayPosition.left - popupSize.width / 2 + daySize.width / 2 - 15,
				//Горизонтальный для первых 3 дней средних строк
				'left': dayPosition.left + daySize.width + 15 + dayParam.day * 3,
				//Горизонтальный для последних 4 дней средних строк
				'right': dayPosition.right + daySize.width + 15 + (6 - dayParam.day) * 3
			},
			//Определяем все виды отступов всплывающего окна для дней календаря 
			//и расположение курсора
			paramOffset = {
				//Первый день первой недели (колонка календря)
				'topLeft': {
					'top': offset.top,
					'left': offset.corner,
					'cursor': 'left_top'
				},
				//Средние дни первой недели (колонки календря)
				'topLeftMiddle': {
					'top': offset.top,
					'left': offset.leftCenter,
					'cursor': 'top'
				},
				//Последний день первой недели (колонка календря)
				'topRight': {
					'top': offset.top,
					'right': offset.corner,
					'cursor': 'right_top'
				},
				//Первые 3 дня средних недель
				'topMiddleLeft': {
					'top': offset.topMiddle,
					'left': offset.left,
					'cursor': 'left'
				},
				//Последние 4 дня средних недель
				'topMiddleRight': {
					'top': offset.topMiddle,
					'right': offset.right,
					'cursor': 'right'
				},
				//Первый день последней недели (колонка календря)
				'bottomLeft': {
					'bottom': offset.bottom,
					'left': offset.corner,
					'cursor': 'left_bottom'
				},
				//Средние дни последней недели (колонки календря)
				'bottomLeftMiddle': {
					'bottom': offset.bottom,
					'left': offset.leftCenter,
					'cursor': 'bottom'
				},
				//Последний день последней недели (колонка календря)
				'bottomRight': {
					'bottom': offset.bottom,
					'right': offset.corner,
					'cursor': 'right_bottom'
				}
			},
			//Стили для расположения окна
			style = paramOffset[dayParam.pos],
			//Класс курсора, который необходимо отобразить
			cursor = '.arrow-' + paramOffset[dayParam.pos].cursor;
		
		//Устанавливаем расположение окна
		this.DOM.$popup.css(style);
		//Скрываем все курсора, кроме того, который должен отображаться
		this.DOM.popup.$cursors
				.not(cursor)
				.addClass('g-hidden');
		
		return this;
	},
	
	
	/**
	 * Функция устанавливает стилизованный скролл для списка заседаний
	 */
	setPopupListScroll: function() {
		courtMain.setCustomScroll(
			this.DOM.popup.$graph.find('.js-reception-popup-graph-body').get(0)
		);
	},
	
	
	/**
	 * Функция устанавливает стилизованный скролл в начало
	 */
	resetPopupListScroll: function() {
		var $wrapper = this.DOM.popup.$graph.find('.js-reception-popup-graph-body');
		
		if ($wrapper.hasClass('flexcrollactive')) {
			courtMain.resetCustomScroll($wrapper.get(0));
		}
	},
	
	
	/**
	 * Функция составляет из значений полей данные для ajax-запроса
	 * 
	 * @return this
	 */
	setAjaxQuery: function() {
		var i, $field, name, val,
			sum = this.DOM.popup.form.$fields.length;
		
		for (i = 0; i < sum; i++) {
			$field = this.DOM.popup.form.$fields.eq(i);
			val = $field.val();
			
			if (val) {
				name = $field.attr('name');
				this.ajax.query.saveData[name] = val;
			}
		}
		
		return this;
	},
	
	
	/**
	 * Функция проверяет и возвращает TRUE, если в списке приемов, есть хотя бы один прием
	 * 
	 * @return bool;
	 */
	checkReceptions: function() {
		return this.receptions && this.receptions.length > 0 ? true : false;
	},
	
	
	/**
	 * Функция отправляет запрос на сервер для получения списка приемов по выбранной дате
	 */
	loadReceptions: function() {
		var self = this;
		
		this.isPopupProcess = true;
		this.receptions = [];
		//Расскрываем спинер
		this
			.showPopupSpiner()
			.setPopupPosition();
		
		$.ajax({
			type: 'post',
			url: this.ajax.path.loadReceptions,
			data: this.ajax.query.loadReceptions,
			dataType: 'json',
			success: function(receptions) {
				if (receptions) {
					//Запоминаем список мероприятий из базы по выбранной дате
					self.receptions = receptions;
					
					if (self.receptions.length > 0) {
						//Расскрываем список заседаний
						self
							.hidePopupSpiner()
							.setPopupList()
							.showPopupList()
							.setPopupPosition();
					} else {
						//Расскрываем форму
						self
							.hidePopupSpiner()
							.showPopupForm()
							.setPopupPosition();
					}
					
				} else {
					//Расскрываем сообщение об ошибке отправки данных
					self
						.hidePopupSpiner()
						.showPopupStatus({
							'isError': true,
							'message': 'Список приемов за выбранную дату получить не удалось.<br />Попробуйте воспользоваться сервисом позже.'
						})
						.setPopupPosition();
				}
				self.isPopupProcess = false;
				//Очищаем ajax-запрос
				self.ajax.query.loadReceptions = {};
			},
			error: function() {
				//Расскрываем сообщение об ошибке отправки данных
				self
					.hidePopupSpiner()
					.showPopupStatus({
						'isError': true,
						'message': 'Во время отправки запроса произошла ошибка.<br /><br />Попробуйте воспользоваться сервисом позже. Если ошибка повторится, обратитесь в службу технической поддержки.'
					})
					.setPopupPosition();
				self.isPopupProcess = false;
				//Очищаем ajax-запрос
				self.ajax.query.loadReceptions = {};
			}
		});
	}
}

$(function(){
	//Инициализируем методы и переменные объекта сервиса
	if (courtPopup.DOM.popup) {
		courtReception.init();
	} else {
		//После загрузки скриптов шаблона всплывающего окна
		$(document).bind('courtPopupLoad', function() {
			courtReception.init();
		});
	}
});