var guestbookCustom = {
		DOM: {},
		ajax: {
			'query': {
				'qu': {}
			},
			'path': '/guestbook',
			'timeout': 30000
		},
		
		/**
		 * Объявляем события сервиса Гостевая книга
		 */
		init: function() {
			//Запоминаем DOM-элементы
			this.setDOM();
			//Объявляем события
			this.bind();
		},
		
		/**
		 * Запоминаем DOM-элементы
		 */
		setDOM: function() {
			//блок с гостевой
			this.DOM.$guestbook = $('.js-guestbook');
			//Форма добавления вопроса
			this.DOM.$form = this.DOM.$guestbook.find('.js-guestbook-form');
			//поля которые требует валидации
			this.DOM.$fields = this.DOM.$form.find('.required');
			//кнопка Отправить
			this.DOM.$submit = this.DOM.$form.find('.js-guestbook-submit');
		},
		
		
		/**
		 * Объявляем события
		 */
		bind: function() {
			//Обработчик клика на кнопку Отправить
			this._bindSubmit();
			//Обработчик установки фокуса в поле формы
			this._bindFieldFocus();
		},
		
		
		/**
		 * Обработчик клика на кнопку Отправить
		 */
		_bindSubmit: function() {
			var self = this;
			
			this.DOM.$form.delegate('.js-guestbook-submit', 'click', function() {
				
				if (self.DOM.$submit.attr('disabled') != 'disabled') {
					//Если поля заполнены верно
					if (self.setFieldsCheck(self.DOM.$fields)) {
						//Отправляем запрос на сохранение вопроса
						self.saveQu();
					}
				}
				
				return false;
			});
		},
		
		
		/**
		 * Обработчик установки фокуса в поле формы
		 */
		_bindFieldFocus: function() {
			var self = this;
			
			this.DOM.$form.delegate('.required', 'focus', function() {
				//Снимаем сообщения об ошибке
				self.resetFieldError($(this));
			});
		},
		
		
		/**
		 * Функция отправки запроса на сохранение вопроса
		 */
		saveQu: function() {
			var self = this;
			
			//Составляем ajax-запрос
			this.setAjaxQuery();
			
			$.ajax({
				type: 'post',
				url: this.ajax.path,
				data: this.ajax.query,
				dataType: 'json',
				timeout: this.ajax.timeout,
				success: function(result) {
					window.location = '/guestbook';
				},
				error: function() {
					window.location = '/guestbook';
				}
			});
		},
		
		
		/**
		 * Функция составляет из значений полей данные для ajax-запроса
		 */
		setAjaxQuery: function() {
			var i, $field, name, val,
				$fields = this.DOM.$form.find('textarea, input'),
				sum = $fields.length;
			
			for (i = 0; i < sum; i++) {
				$field = $($fields[i]);
				val = $field.val();
				
				if (val) {
					name = $field.attr('name');
					this.ajax.query.qu[name] = val;
				}
			}
			
			this.ajax.query.qu.pravo = Math.random();
		}, 
		
		
		/**
		 * Функция проверяет поля на заполненность и правильность заполнения и возвращает результат
		 * 
		 * @param obj	$fields		Поля для проверки
		 * 
		 * @return bool
		 */
		setFieldsCheck: function($fields) {
			var i, $checkField,
				result = true,
				//Кол-во полей
				sum = $fields.length;
			
			for (i = 0; i < sum; i++) {
				$checkField = $($fields[i]);
					
				//Проверяем поле
				if (!this.validField($checkField)) {
					result = false;
				}
			}
				
			return result;
		},
		
		
		/**
		 * Функция проверяет правильность введенного e-mail адреса и заполненность поля
		 * 
		 * @param obj	$field		Поле для проверки
		 * 
		 * @return bool
		 */
		validField: function($field) {
			var result = true;
			
			if ($field.hasClass('error')) {
				result = false;
				
			} else {
				if ($field.hasClass('mail-valid')) {
					//Проверяем правильность введенного e-mail адреса
					result = this.validMail($field);
					
				} else if ($field.hasClass('required')) {
					if (!$field.val()) {
						result = false;
						//Устанавливаем ошибку
						$field.addClass('error');
					}
				}
			}
			
			return result;
		},
		
		
		/**
		 * Функция проверяет правильность введенного e-mail адреса
		 * 
		 * @param obj	$field		Поле для проверки
		 * 
		 * @return bool
		 */
		validMail: function($field) {
			var value = $field.val(),
				pattern = new RegExp("[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?"),
				result = pattern.test(value);
				
			if (!result) {
				//Устанавливаем ошибку
				$field.addClass('error');
			}
			
			return result;
		},
		
		
		/**
		 * Функция снимает сообщение об ошибке с поля
		 */
		resetFieldError: function($field) {
			if ($field.hasClass('error')) {
				$field.removeClass('error');
			}
		}
}

$(function() {	
	guestbookCustom.init();
});