/* $Id$ */

var courtQuAns = {
	
	DOM: {},
	ajax: {
		'query': {},
		'path': '/',
		'timeout': 30000
	},
	
	
	/**
	 * Объявляем внутренние переменные и обработчики сообытий
	 */
	init: function() {
		//Запоминаем часто используемые DOM-элементы
		this.setDOM();
		//Объявляем обработчики сообытий
		this.bind();
		//Адрес куда отправлять запрос
		this.ajax.path = this.DOM.$service.find('#js-qu_ans-form-ajax_path').val();
	},
	
	
	/**
	 * Запоминаем часто используемые DOM-элементы
	 */
	setDOM: function() {
		//Сервис
		this.DOM.$service = $('.js-qu_ans');
		//Форма добавления вопроса
		this.DOM.$form = this.DOM.$service.find('.js-form-send');
		//Поля формы
		this.DOM.$fields = this.DOM.$form.find('.js-qu_ans-field');
		//Кнопка Отправить
		this.DOM.$submit = this.DOM.$form.find('.js-qu_ans-submit');
		//Спинер загрузки
		this.DOM.$spiner = this.DOM.$form.children('.js-qu_ans-form-spiner');
		//Блок для сообщения о результатах запроса
		this.DOM.$status = this.DOM.$form.children('.js-qu_ans-form-status');
	},
	
	
	/**
	 * Объявляем обработчики сообытий
	 */
	bind: function() {
		//Обработчик клика на кнопку Отправить
		this._bindSubmit();
		//Обработчик установки фокуса в поле формы
		this._bindFieldFocus();
	},
	
	
	/**
	 * Обработчик клика на кнопку Отправить
	 */
	_bindSubmit: function() {
		var self = this;
		
		this.DOM.$form.delegate('.js-qu_ans-submit', 'click', function() {
			
			if (self.DOM.$submit.attr('disabled') != 'disabled') {
				var $fieldRequired = self.DOM.$fields.filter('.required');
				
				//Скрываем статус
				self.hideStatus();
				
				//Если поля заполнены верно
				if (courtMain.setFieldsCheck($fieldRequired)) {
					//Отправляем запрос на сохранение вопроса
					self.saveQu();
				}
			}
			
			return false;
		});
	},
	
	
	/**
	 * Обработчик установки фокуса в поле формы
	 */
	_bindFieldFocus: function() {
		var self = this;
		
		this.DOM.$form.delegate('.required', 'focus', function() {
			//Снимаем сообщения об ошибке
			courtMain.resetFieldError($(this));
			//Скрываем статус
			self.hideStatus();
		});
	},
	
	
	/**
	 * Функция отправки запроса на сохранение вопроса
	 */
	saveQu: function() {
		var self = this;
		
		//Составляем ajax-запрос
		this.setAjaxQuery();
		//Запускаем события, связанные с отправкой запроса
		this.setLoader(true);
		
		$.ajax({
			type: 'post',
			url: this.ajax.path,
			data: this.ajax.query,
			dataType: 'json',
			timeout: this.ajax.timeout,
			success: function(result) {
				if (result) {
					//Выводим сообщение об успешной отправки запроса
					self.showStatus(false);
					//Очищаем поля
					courtMain.clearFields(self.DOM.$fields);
				} else {
					//Выводим сообщение об ошибке
					self.showStatus(true);
				}
			},
			error: function() {
				//Выводим сообщение об ошибке
				self.showStatus(true);
			}
		});
	},
	
	
	/**
	 * Функция составляет из значений полей данные для ajax-запроса
	 */
	setAjaxQuery: function() {
		var i, $field, name, val,
			sum = this.DOM.$fields.length;
		
		for (i = 0; i < sum; i++) {
			$field = $(this.DOM.$fields[i]);
			val = $field.val();
			
			if (val) {
				name = $field.attr('name');
				this.ajax.query[name] = val;
			}
		}
	},
	
	
	/**
	 * Функция запускает события, связанные с отправкой запроса, 
	 * либо с его завершением
	 * 
	 * @param bool	isStart
	 */
	setLoader: function(isStart) {
		if (isStart) {
			//Вешаем отметку на форму
			this.DOM.$form.addClass('b-form-send--loader');
			//Расскрываем спинер загрузки
			this.DOM.$spiner.removeClass('g-hidden');
			//Блокируем поля и кнопку Отправить
			this.DOM.$fields.attr('disabled', 'disabled');
			this.DOM.$submit.attr('disabled', 'disabled');
			
		} else {
			//Снимаем отметку с формы
			this.DOM.$form.removeClass('b-form-send--loader');
			//Скрываем спинер загрузки
			this.DOM.$spiner.addClass('g-hidden');
			//Снимаем блок с полей и кнопки Отправить
			this.DOM.$fields.attr('disabled', '');
			this.DOM.$submit.attr('disabled', '');
		}
	},
	
	
	/**
	 * Функция расскрывает сообщение об успешной отправки запроса,
	 * либо сообщение об ошибке
	 * 
	 * @param bool	isError		TRUE - сообщение об ошибке
	 */
	showStatus: function(isError) {
		var message = isError ? 'Не удалось отправить вопрос. Повторите попытку через некоторое время.' : 'Ваш вопрос успешно отправлен.',
			selector = isError ? 'show_status error' : 'show_status';
		
		//Очищаем ajax-запрос
		this.ajax.query = {};
		//Запускаем события, связанные с завершением отправки запроса
		this.setLoader(false);
		//Расскрываем блок с сообщением
		this.DOM.$status
			.text(message)
			.show()
			.addClass(selector);
	},
	
	
	/**
	 * Функция скрывает сообщение о статусе отправки вопроса
	 */
	hideStatus: function() {
		if (this.DOM.$status.hasClass('show_status')) {
			this.DOM.$status
				.text('')
				.hide()
				.removeClass('show_status error');
		}
	}
}

$(function(){
	//Инициализируем методы и переменные сервиса
	if (courtMain) {
		courtQuAns.init();
	} else {
		//После загрузки общих скриптов
		$(document).bind('courtMainLoad', function() {
			courtQuAns.init();
		});
	}
});