/* 
Jquery FeedBack v1.1.0 (WEBDELO)

Описание: Библиотека автоматизации проверки и ajax-отправки форм обратной связи.
Разработчик: Попов Андрей Юрьевич
Дата: 28.06.2010
Сайт: www.webdelo.org
Требования: 
 - jquery v1.4.2
 - jquery.form.js v2.36.0
 - jquery.webdelo.modal.js v1.1.0
 - jquery.webdelo.functions.js v1.1.0
*/ 
// КОНФИГУРАЦИЯ
var sendButtonId = 'send_form'; // ID кнопки отправки формы
var elementsClass = 'feedback_elements'; // класс для обозначения функциональных полей формы
var imagesClass = 'status_img'; // класс изображений статусов
var imagesStatus = false; // тип оповещение о незаполнении полей с помощью изображений статусов полей
var formId = 'feedback-form'; // HTML ID тэга <form>
var captchaImageId = 'captcha_image'; // HTML ID изображения каптчи формы (в случае, если каптча не используется, установить значение false.

// функция проверки данных и отправки ajax
webdeloFeedBack = function(){
	$('#'+sendButtonId).click(function(){
		// проверяем валидность заполнения элементов
		if (!webdeloCheckForms(elementsClass, imagesStatus, imagesClass)) {
			return false;
		};
		// отправляем форму на сервер ajax-запросом
		webdeloAjaxFeedBack();
	});
}

webdeloAjaxFeedBack = function(){
	// составляем объект управления запросом
	var ajaxOptions = { 
		// элемент span, который обновляется по ответу
		beforeSubmit: webdeloAjaxFeedBackRequest, // функция, вызываемая перед передачей 
		success: webdeloAjaxFeedBackResult, // функция, вызываемая при получении ответа
		dataType: "json", // тип данных ответа сервера
		timeout: 9000 // тайм-аут
	};
	$('#'+formId).ajaxSubmit(ajaxOptions);
}

// функция, вызываемая перед началом AJAX запроса отправки формы
webdeloAjaxFeedBackRequest = function(){
	// выводим сообщение о передаче данных...
	webdeloLoading('Подождите... Данные передаются на сервер.');
};

// функция, вызываемая после окончания AJAX запроса отправки формы
webdeloAjaxFeedBackResult = function(result){
	// выводим результат добавления
	if (result['result']==false) {
		webdeloError(result['message']);
		// если используется каптча, то обновляем изображение.
		if (captchaImageId) {
			webdeloGetCaptcha(captchaImageId);
		}
	} else {
		webdeloSuccess(result['message']);
		$('#'+formId).clearForm();
		// сбрасываем все изображения статусов форм и данные в полях формы
		$('img.'+imagesClass).fadeOut(500).delay(500);
		webdeloGetCaptcha(captchaImageId);
	}
};

// функция проверки страницы по массиву форм (генерация статуса проверки, сброс иконок статуса форм, проверка и вывод сообщения)
webdeloCheckForms = function(elementsClass, imagesStatus, imagesClass){
	// обнуляем служебные переменные
	var errorForms = null;
	var curCompId = null;
	var curCompVal = null;
	var curCompProperty = null;
	var curCompType = null;
	var curCompTitle = null;
	
	// изменяем статус
	// сбрасываем все изображения статусов форм
	if (imagesStatus) {
		$('.'+imagesClass).fadeOut(500).delay(500);
	}
	// проверяем в цикле все указанные в массиве формы
	$('.'+elementsClass).each(function (index) {
		curCompId = $(this).attr('id');
		curCompVal = $(this).val();
		curCompTitle = $(this).attr('title');
		curCompProperty = $('#'+curCompId+'_property').val();
		curCompType = $('#'+curCompId+'_property').attr('name');
		if (imagesStatus) {
			// если запущен алгоритм вывода изображений статусов
			if (!webdeloCheckForm(curCompId, curCompType)) {
				errorForms=true;
				webdeloError("Заполните все обязательные поля!");
			}
		} else {
			// если запущен режим вывода сообщений о незаполнении.
			if ((!curCompVal && curCompType=='critical') || (curCompVal==curCompTitle && curCompType=='critical')) {
				webdeloError(curCompProperty);
				errorForms=true;
				return false;
			}
			// если тип поля email, то проверяем валидность введённого адреса почты
			if (!webdeloCheckMail(curCompVal) && curCompId=='email' && curCompVal) {
				webdeloError('Неправильно заполнено поле электронного адреса.');
				errorForms=true;
				return false;
			}
		}
	});

	// если есть ошибки заполенние, то прерываем отправку
	if (errorForms) {
		return false;
	} else {
		return true;
	}
}

// функция проверки переданного компонента
webdeloCheckForm = function(component, type){
	var componentValue = $("#"+component).val();
	var componentTitle = $("#"+component).attr('title');
	if (!componentValue || (componentValue==componentTitle && type=='critical')) {
		webdeloShowStatusImg(component, "false");
		// если тип поля email, то проверяем валидность введённого адреса почты
		if (!webdeloCheckMail(component) && component=='email') {
			return false;
		}
		// если значимость заполнения формы критическая, то возвращаем false. Если не принципиальное, то true.
		if (type=='critical') {
			return false;
		} else {
			return true;
		}
	} else {
		webdeloShowStatusImg(component, "true");
		return true;
	}
}

// функция отображения изображения статуса заполнения формы
webdeloShowStatusImg = function(component, status, delay_time){
	// значение задержки по умолчанию
	delay_time= delay_time || 0;
	// скрываем все изображения статусов для данного компонента
	$("#"+component+"_true").fadeOut(50).delay(delay_time);
	$("#"+component+"_false").fadeOut(50).delay(delay_time);
	// отображаем изображение указанного статуса
	$("#"+component+"_"+status).fadeIn("slow");
	return true;
}

$(document).ready(function(){
	webdeloFeedBack();
});
