/*

Использование скрипта автоматической проверки полей формы:

1. Во всех <input> элементах формы, требующих проверки на правильность заполнения необходимо прописать атрибут
			title: текстовое название поля (будет использоваться при выводе сообщения об ошибке).
            Если проверяемая форма состоит из единственного поля (input), атрибут title не требуется.			
2. Для каждого элемента формы необходимо создать метку вида:
		<label id="код_шаблона" for="id_элемента"></label>
	 Где:
		id_элемента: id элемента, для которого должно применяться правило проверки
		код_шаблона: шаблон, по которому будет осуществляться проверка

Доступные коды шаблонов:
	text:  поле проверяется только на наличие содержимого, без анализа самого содержимого
	int:   поле проверяется на соответствие типу int (целочисленная величина)
	float: поле проверяется на соответствие типу float (дробная числовая величина)
	email: поле проверяется на соответствие корректному адресу email
	phone: поле проверяется на соответствие корректному номеру телефона
           вида +7(495)222-2222 или 222-22-22 или 8 (495) 2222222 ну и т.п.
	alph:  поле проверяется на отсутствие символов русского алфавита и спецсимволов (допускаются цифры, латинские буквы большие и малые, а также точка (.) и дефис (-))
	select: поле проверяется на выбранность ненулевого элемента списка (option value != "")
	checkbox: поле проверяется на помеченность
	radio: поле проверяется на помеченность

Внимание: префикс "?" или "!" является обязательным в коде шаблона!

Префикс "?" обозначает необязательность заполнения поля.
Префикс "!" перед кодом обозначает обязательность заполнения поля.
Например "!phone" - обязательное поле типа "телефонный номер".
Постфикс ":xx" позволяет указать минимальную длину значения.
Например "!int:10" - обязательное числовое поле длинной не менее 10 символов (ИНН).
Префикс "=" перед кодом обозначает, что поле должно иметь значение, равное указанному полю после знака "=".
Например "!=pwd2" - обязательное поле, которое должно иметь такое же значение, как и поле pwd2.
Если префикс отсутствует и указан только код шаблона,
то поле проверяется на соответствие формату только если оно не пустое.

3.Вызов валидатора подключается на кнопку отправки формы (<input type="submit" />) :

<input type="submit" value="Отправить" onclick="return validateForm(this, 'Проверьте правильность заполнения следующих полей:');" />

или к форме (для формы, использующей метод get, в том числе, поиска):

<form id="search" method="get" action="/search/index.khtml" onsubmit="return validateForm(this, 'Введите поисковый запрос');">

4.Для подключения скрипта к странице в <head> следует добавить строку:

<script type="text/javascript" src="/js/ValidForm.js"></script>

5.Предупреждающий текст может быть задан как переменная в строке подключения к форме или в <head> страницы:

<script type="text/javascript">default_err_msg = 'Проверьте правильность заполнения следующих полей:';</script>

*/


var err_msg = "";
var err_obj = null;

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/, ''); };

function commitError(obj, msg) {
	err_obj = err_obj == null ? obj : err_obj;
	err_msg += '\n  '+msg;
}

function validateForm(f, err_text) {
	// initialization
	err_msg=err_text;
	if (err_msg==null) err_msg = default_err_msg;
	err_obj = null;
	// actually validating
	var label = f.getElementsByTagName('label');
//	for (var i=0; i<label.length; i++) {
//	alert(label[i].id);
//	}
//	for (var i=0; i<label.length; i++) {
	for (var i=0; i<label.length; i++) {
		if (!label[i].htmlFor) continue;
		// parsing rule
		var obj = f.elements[label[i].htmlFor];
		if (!obj) continue;
		var rule = label[i].id;
		var required = false;
		var prefix = rule.substr(0, 1);
		if (prefix == '!') required = true
		else if (prefix != '?') continue;
		rule = rule.substr(1, rule.length-1);
		var p = rule.split(':');
		rule = p[0];
		var minlength = (isNaN(parseInt(p[1]))) ? 0 : parseInt(p[1]);

		// checking rule
		if (rule.substr(0, 1) == '=') {
			var other_hand = rule = rule.substr(1, rule.length-1);
			if (required || (obj.value != '')) {
				var obj2 = f.elements[other_hand];
				if (required && (obj.value == '')) commitError(obj, obj.title);
				else if ((obj2) && (obj.value != obj2.value)) commitError(obj2, obj2.title);
			}
		} else
		switch (rule) {
			case 'text':
			case 'select':
				var value = obj.value.trim();

				if (!required && (obj.value == '')) break;
				if ((value == '') || (value.length < minlength)) commitError(obj, obj.title);
				break;
			case 'checkbox':
				var item_ok = 0;
				for (var j=0; j<obj.length; j++) {
					if (obj[j].checked) item_ok++;
				}
				if (required && ((item_ok < minlength) || (item_ok == 0))) commitError(obj[0], obj[0].title);
				break;
			case 'radio':
				var selected_item = -1;
				for (var j=0; j<obj.length; j++) {
					if (obj[j].checked) selected_item = j;
				}
				if (required && (selected_item == -1)) commitError(obj, obj[0].title);
				break;
			case 'int':
				var value = parseInt(obj.value);
				if (!required && (obj.value == '')) break;
				if (isNaN(value) || (value != obj.value.trim()) || ((value == 0) && required) || (obj.value.trim().length < minlength)) commitError(obj, obj.title);
				break;
			case 'float':
				var value = parseFloat(obj.value);
				if (!required && (obj.value == '')) break;
				if (isNaN(value) || (value != obj.value.trim()) || ((value == 0) && required)) commitError(obj, obj.title);
				break;
			case 'email':
				var value = obj.value.trim();
				if (!required && (obj.value == '')) break;
				if (!/^([a-zA-Z0-9_.+-])+@(([a-zA-Z0-9-])+.)+([a-zA-Z0-9]{2,6})+$/.test(value)) commitError(obj, obj.title);
				break;
			case 'phone':
				var value = obj.value.trim();
				if (!required && (obj.value == '')) break;
				if (!/^(\+?\d{1,3}?)?(\s)*(\(?\d{3}\)?)?(\s)*(\d{3}-?\d{2}-?\d{2})$/.test(value)) commitError(obj, obj.title);
				break;
			case 'alph':
				var value = obj.value.trim();
				if (!required && (obj.value == '')) break;
				if (!/^([a-zA-Z0-9.-])+$/.test(value)) commitError(obj, obj.title);
				break;
		}
	}

	// checking the results
	if (err_obj != null) {
		alert(err_msg);
		err_obj.focus();
		return false;
	}	else {
		return true;
	}
}

function processForm(f) {
	if (validateForm(f)) f.submit();
}
