// осуществляет валидацию формы
function validate(plugin_id)
{
	var str = "";
	var elements = document.getElementsByTagName('input');
	// цикл по всем элементам формы
	for(var i = 0; i < elements.length; i++) 
	{
		// если задан plugin_id
		if (!isNaN(plugin_id))
		{
			if (!is_plugin_elem(plugin_id, elements[i]))
			{
				continue;
			}
		}

		// проверяем, имеется ли образец
		var pattern = elements[i].getAttribute('pattern');
		if (pattern == 'password')
		{
			// проверяем, видимый ли элемент - скрытые проверять не надо
			if(is_visible(elements[i]))
			{
				if(elements[i].value.length == 0)
				{
					str += "Пароль не может быть пустым.\n";
					// подсказка пользователю путем смены цвета фона;
					elements[i].style.background = "#f28d3a";
				}
				else
				{
					// проверяем совпадают ли пароли
					pattern = /^(.*)\[1\]$/;
					pattern.test(elements[i].name);
					confirm_password = get_element_by_name(RegExp.$1 + '[2]');
					if(elements[i].value != confirm_password.value)
					{
						str += "Пароли не совпадают.\n";
						elements[i].style.background = "#f28d3a";
						confirm_password.style.background = "#f28d3a";
					}
				}
			}
		}
		else if (pattern != null) 
		{
			// проверяем, видимый ли элемент - скрытые проверять не надо
			if(is_visible(elements[i]))
			{
				var value = elements[i].value;
				// валидация значения элемента, используя образец
				var offendingChar = value.match(pattern);

				// если встечен недопустимый символ или элемент оставлен пустым
				if(value.length == 0)
				{
					var caption  = elements[i].caption;
					str += "Поле '"+ caption+"' должно быть заполнено.\n";
					// подсказка пользователю путем смены цвета фона;
					elements[i].style.background = "#f28d3a";
				}
				else if(offendingChar == null) 
				{
					// показываем сообщения об ошибках
					var caption  = elements[i].caption;
					str += "Неверно заполнено поле '"+ caption + "': " +elements[i].getAttribute('ErrorMsg') +".\n";
					// подсказка пользователю путем смены цвета фона;
					elements[i].style.background = "#f28d3a";
				}
			}
		}  
	} 

	// проверяем SELECT'ы
	elements = document.getElementsByTagName('select');
	for(var i = 0; i < elements.length; i++) 
	{
		// проверяем, видимый ли элемент
		if(is_visible(elements[i]))
		{
			var errorMsg = elements[i].getAttribute('ErrorMsg');
			if (errorMsg != null) 
			{
				var value = elements[i].value;
				if(value <= 0)
				{
					// показываем сообщения об ошибках
					var caption  = elements[i].caption;
					str += "Не выбрано значение в списке '"+ caption + "'.\n";
					// подсказка пользователю путем смены цвета фона; 
					elements[i].style.background = "#f28d3a";
				}
			}
		}
	}

	if (str != "") 
	{
		// не посылаем форму
		alert(str);
		return false;
	} 
	else 
	{
		// значения формы правильны; посылаем
		return true;
	}
}

function do_submit(elem)
{
	var form_validator = document.getElementById("form_submitter");

	if (!validate())
	{
		elem.disabled=false;
		return false;
	}
	
	if(form_validator)
	{
		form_validator.click();
	}
}


// проверка видимый ли элемент
function is_visible(element)
{
	if(element.disabled)
		return false;
	// Проходимся от заданного элемента до самого корня документа (до тэгов body или html) в поисках предка, 
	// имеющего visibility: hidden или display: none.
	// Если такой элемент есть, то значит элемент невидимый.
	while((element.nodeName != 'BODY') && (element.nodeName != 'HTML'))
	{
//		alert(element.nodeName+':\nvisibility - '+element.style.visibility+'\ndisplay - '+element.style.display);
		// если находим невидимого родителя, то и элемент невидимый
		if(element.style.visibility == 'hidden' || element.style.display == 'none')
			return false;
		element = element.parentNode;
	}
	// если дошли до корня - то элемент видимый
	return true;
}

function submit_on_enter(elem, event)
{
	if(event.keyCode == 13)
	{
		elem.disabled = true;
		do_submit(elem);
	}
}

// проверяет является ли заданный элемент элементом заданного плагина
function is_plugin_elem(plugin_id, elem)
{
	var pattern = "^"+plugin_id+"[a-zA-Z0-9_\\[\\]]+$"; 
	return elem.name.match(pattern);
}