var __alredy_check_element=new Array();

function validator(form,errors)
{
	var flagflag=0;
	var flagerror=0
	var error_message=new Array();
	if(typeof errors != 'undefined')
	{
		if(errors.length>0)
		{
			flagerror=1;
		}
	}
	else var errors=new Array();
	var func=form.getAttribute('custom_check');
	var method=form.getAttribute('show_errors');
	
	for(flagflag;flagflag<1;)
	{
		flagflag=1;
		error=__validator_check(form);
		if(error['error'])
		{
			flagflag=0;
			flagerror=1;
			switch(error['error'])
			{
				case 'require': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' is required'; break;
				case 'alpha': if(error['error_message']) ; else error['error_message']=error['tag_name'] + ' must be literal'; break;
				case 'mail': if(error['error_message']) ; else error['error_message']='Email is incorrect'; break;
				case 'int': if(error['error_message']) ; else error['error_message']='Please enter only digits to '+error['tag_name']+' field'; break;
				case 'int_max': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' is greater than maximum possible value'; break;
				case 'int_min': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' is less than minimum possible value'; break;
				case 'radio_not_check': if(error['error_message']) ; else error['error_message']='Please chose '+error['tag_name']+''; break;
				case 'select_require': if(error['error_message']) ; else error['error_message']='Please select '+error['tag_name']+''; break;
				case 'checkbox_require': if(error['error_message']) ; else error['error_message']=error['tag_name']; break;
				case 'checkbox_min': if(error['error_message']) ; else error['error_message']='Minimum '+error['min']+' checkbox require in '+error['tag_name']+''; break;
				case 'equal': if(error['error_message']) ; else error['error_message']=error['tag_name']+' doesn\'t match'; break;
				case 'chars': if(error['error_message']) ; else error['error_message']='Please enter '+error['chars']+' digits '+error['tag_name']; break;
				case 'custom_check': break;
			}
			errors[errors.length]=error;
		}
	}
	__alredy_check_element=new Array();

	if(flagerror)
	{
		if(method=="alert" || method==null)
		{
			alert(errors[0].error_message);
			errors[0].teg.focus();
			return false;
		}
		else
		{
			return eval(method);
		}
		alert("А сюда как попали???");
	}
	else 
	{
		if(func!=null) return eval(func);
		else return true;
	}

	alert("А сюда как попали???");
}





function __validator_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++)
	{
		if(form.elements[i].disabled==true) continue;
		if(__alredy_check_element[i]==true) continue;
		else __alredy_check_element[i]=true;

		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;
		
		var teg=form.elements[i];
		error['teg']=teg;

		//<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=="alpha")
				{
					var regexp=/[^a-zA-Z\_\-\s,\.]+/
					if(teg.value.match(regexp))
					{
						error['error']='alpha';
						return error;
					}
				}


				//мыло
				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'),10);
					max=parseInt(teg.getAttribute('max'),10);
					var regexp=/[^0-9\-]+/ 
					if (teg.value.match(regexp))
					{
						error['error']='int';
						return error;
					}
					else
					{
						if(parseInt(teg.value,10)>max && imax)
						{
							error['error']='int_max';
							return error;
						}
						else
						{
							require=1;
						}
						if(parseInt(teg.value,10)<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']='chars';
					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;
			}

		}

		if(custom_check=teg.getAttribute('custom_check'))
		{
			//alert(i+'='+form.elements[i].tagName);
			ret=eval(custom_check);
			if(typeof(ret)=='boolean')
			{
				if(ret)
				{
					error['error']='custom_check';
					return error;
				}
			}
			else if(typeof(ret)=='string')
			{
				
				error['error']='custom_check';
				error['error_message']=ret;
				return error;
			}
		}
	}
	error=false;
	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);
}
