function validator(form)
{
	error=check(form);
	switch(error['error'])
	{
		case 'require': if(error['error_message']) alert(error['error_message']); else alert('Поле `'+error['tag_name']+'` обязательное'); error['teg'].focus(); return false; break;
		
		case 'mail': if(error['error_message']) alert(error['error_message']); else alert('Некорректный почтовый адресс'); error['teg'].focus(); return false; break;

		case 'int': if(error['error_message']) alert(error['error_message']); else alert('В поле `'+error['tag_name']+'` введите число'); error['teg'].focus(); return false; break;
		case 'int_max': if(error['error_message']) alert(error['error_message']); else alert('Введенное в поле `'+error['tag_name']+'` число больше максимального значения'); error['teg'].focus(); return false; break;
		case 'int_min': if(error['error_message']) alert(error['error_message']); else alert('Введенное в поле `'+error['tag_name']+'` число меньше минимального значения'); error['teg'].focus(); return false; break;
		
		case 'radio_not_check': if(error['error_message']) alert(error['error_message']); else alert('Ни одно значение `'+error['tag_name']+'` не выбранно'); error['teg'].focus(); return false; break;

		case 'select_require': if(error['error_message']) alert(error['error_message']); else alert('Выберите значение в поле `'+error['tag_name']+'`'); error['teg'].focus(); return false; break;

		case 'checkbox_require': if(error['error_message']) alert(error['error_message']); else alert(error['tag_name']); error['teg'].focus(); return false; break;
		
		case 'checkbox_min': if(error['error_message']) alert(error['error_message']); else alert('Минимум '+error['min']+' checkbox требуется в поле `'+error['tag_name']+'`'); error['teg'].focus(); return false; break;

		case 'equal': if(error['error_message']) alert(error['error_message']); else alert(error['tag_name']+' не совпадают'); error['teg'].focus(); return false; break;
		
		case 'charss': if(error['error_message']) alert(error['error_message']); else alert( 'Please enter '+error['chars']+' digits '+error['tag_name']); error['teg'].focus(); return false; break;
		
		default: return true; break;
	}
}





function check(form)
{
//все элементы формы
	var radio_name_check= new Array();
	var checkbox_name_check= new Array();
	var error=new Array();
	for(var i=0;i<form.elements.length;i++)
	{
		tag_name=form.elements[i].getAttribute('tag_name');
		error['tag_name']=tag_name;

		error_message=form.elements[i].getAttribute('error_message');
		if(error_message) error['error_message']=error_message;
		else error['error_message']=false;

		//<input>
		if((form.elements[i].tagName=='INPUT') || (form.elements[i].tagName=='TEXTAREA'))
		{
			//проверка на существование атрибута
			var teg=form.elements[i];
			error['teg']=teg;
			
			var require=parseInt(teg.getAttribute('require'));
			if(isNaN(require)) { require=0;}
			
			//обязательное
			if(teg.type=="checkbox" && require && !teg.checked)
			{
				error['error']='checkbox_require';
				return error;
			}
			
			if(require && teg.value.length<1)
			{
				error['error']='require';
				return error;
			}
			//end
			if (text_type=teg.getAttribute('text_type'))
			{
				
				//любые символы
				if (text_type=="all")
				{
					
				
				}


				//мыло
				if (text_type=="mail" && (teg.value!=''))
				{
					var regexp=/[a-zA-Z0-9\_\.]+\@[a-zA-Z0-9\_\-]+\.[a-zA-Z0-9\_\.\-]+/
					if(!teg.value.match(regexp))
					{
						error['error']='mail';
						return error;
					}
				
				}
				
				//только int
				if (text_type=="int")
				{
					if(teg.getAttribute('min')) {imin=1;}
					if(teg.getAttribute('max')) {imax=1;}
					min=parseInt(teg.getAttribute('min'));
					max=parseInt(teg.getAttribute('max'));
					var regexp=/[^0-9\-]+/ 
					if (teg.value.match(regexp))
					{
						error['error']='int';
						return error;
					}
					else
					{
						if(parseInt(teg.value)>max && imax)
						{
							error['error']='int_max';
							return error;
						}
						else
						{
							require=1;
						}
						if(parseInt(teg.value)<min && imin)
						{
							error['error']='int_min';
							return error;
						}
						else
						{
							require=1;
						}
					}
	
				}
			}

			if (chars=teg.getAttribute('chars'))
			{
				if(require && teg.value.length<parseInt(chars,10))
				{
					error['error']='charss';
					error['chars']=parseInt(chars,10);
					return error;
				}
			}

			//блок radio button
			if ((radio_name=teg.getAttribute('radio_name')) && !radio_name_check[radio_name])
			{
				radio_name_check[radio_name]=true;
				var require=parseInt(teg.getAttribute('require'));
				if(isNaN(require)) { require=0;}
				var check=false;
				for(var ii=0;ii<form.elements.length;ii++)
				{
					if((form.elements[i].tagName=='INPUT') && (form.elements[ii].getAttribute('radio_name')==radio_name))
					{
						if(form.elements[ii].checked==true)
						{
							check=true;
						}
					}
				}
				if(require && !check)
				{
					error['error']='radio_not_check';
					return error;
				}
			}




			//блок checkbox button
			if ((checkbox_name=teg.getAttribute('checkbox_name')) && !checkbox_name_check[checkbox_name])
			{
				checkbox_name_check[checkbox_name]=true;
				var min=parseInt(teg.getAttribute('min'));
				if(isNaN(min)) { min=0;}
				
				var check=0;
				for(var ii=0;ii<form.elements.length;ii++)
				{
					if((form.elements[i].tagName=='INPUT') && (form.elements[ii].getAttribute('checkbox_name')==checkbox_name))
					{
						if(form.elements[ii].checked==true)
						{
							check++;
						}
					}
				}
				if(check<min)
				{
					error['min']=min;
					error['error']='checkbox_min';
					return error;
				}
			}



			//Еквивалентно
			if((equal=teg.getAttribute('equal')) && (teg.value!=''))
			{
				//alert(equal);
				for(var ii=0;ii<form.elements.length;ii++)
				{
					if((form.elements[i].tagName=='INPUT') && (form.elements[ii].getAttribute('equal')==equal))
					{
						//alert(form.elements[ii].value);
						if(form.elements[ii].value!=teg.value)
						{
							error['error']='equal';
							return error;
						}
					}
				}
				
			}
		}

		if(form.elements[i].tagName=='SELECT')
		{
			var teg=form.elements[i];
			error['teg']=teg;
			var require=parseInt(teg.getAttribute('require'));
			if(isNaN(require)) { require=0;}
			if(require && teg.value=="")
			{
				error['error']='select_require';
				return error;
			}

		}
	}
	error['error']=0;
	return error;
}



function dump(form)
{
	var name;
	for(var i=0;i<form.elements.length;i++)
	{
		//alert(form.elements[i].tagName);
		name=name + '\r\n' + form.elements[i].tagName;
	}
	alert(name);
}
