var __alredy_check_element=new Array();

function validator(form,errors)
{
	if(typeof tinyMCE == "object") tinyMCE.triggerSave();
	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']+' обязательное поле'; break;
				case 'alpha': if(error['error_message']) ; else error['error_message']=error['tag_name'] + ' должно содержать только печатные символы'; break;
				case 'mail': if(error['error_message']) ; else error['error_message']='Неправильный почтовый адрес'; break;
				case 'int': if(error['error_message']) ; else error['error_message']='Введите тлько числа в поле '+error['tag_name']+''; break;
				case 'int_max': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' больше чем максимально разрешенное'; break;
				case 'int_min': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' меньше чем минимально разрешенное'; break;
				case 'float': if(error['error_message']) ; else error['error_message']='Только числа с точко разрешены в '+error['tag_name']+''; break;
				case 'float_max': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' больше чем максимально разрешенное'; break;
				case 'float_min': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' меньше чем минимально разрешенное'; break;
				case 'radio_not_check': if(error['error_message']) ; else error['error_message']='Выберите '+error['tag_name']+''; break;
				case 'select_require': if(error['error_message']) ; else error['error_message']='Выберите значение в поле '+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']='Минимум '+error['min']+' чекбоксов необходимо отметить в '+error['tag_name']+''; break;
				case 'equal': if(error['error_message']) ; else error['error_message']=error['tag_name']+' не совпадают'; break;
				case 'chars': if(error['error_message']) ; else error['error_message']='Введите больше чем'+error['chars']+' символов в поле '+error['tag_name']; break;
				case 'chars-strong': if(error['error_message']) ; else error['error_message']='Введите строго '+error['chars']+' символов в поле '+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);
		}
	}
	else
	{
		if(func!=null) return eval(func);
		else return true;
	}
}




function __checkfloat(v)
{
	var regexp=/[^0-9\.\-]+/
	var flag=0;
	if(v.match(regexp))
	{

		return true;
	}
	else
	{
		for(var i=0;i<v.length;i++)
		{	
			
			if(v.substring(i,i+1)==".") 
			{
				if(flag) return true;
				else flag=1;
			}
			if(i>0 && v.substring(i,i+1)=="-") 
			{
				return true;
			}
		}
	}
	return false
}



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'))
		{
			//check attribut exists
			//var teg=form.elements[i];
			//error['teg']=teg;

			var require=parseInt(teg.getAttribute('require'));
			if(isNaN(require)) { require=0;}

			//required
			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'))
			{

				//all
				if (text_type=="all")
				{


				}

				//only chars
				if (text_type=="alpha")
				{
					var regexp=/[^a-zA-Z\_\-\s,\.]+/
					if(teg.value.match(regexp))
					{
						error['error']='alpha';
						return error;
					}
				}


				//email
				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;
					}

				}

				//only 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;
						}
					}

				}
				
				
				
				
				//only int
				if (text_type=="float")
				{
					if(teg.getAttribute('min')) {imin=1;}
					if(teg.getAttribute('max')) {imax=1;}
					min=parseInt(teg.getAttribute('min'),10);
					max=parseInt(teg.getAttribute('max'),10);
					if (__checkfloat(teg.value))
					{
						error['error']='float';
						return error;
					}
					else
					{
						if(parseFloat(teg.value)>max && imax)
						{
							error['error']='float_max';
							return error;
						}
						else
						{
							require=1;
						}
						if(parseFloat(teg.value)<min && imin)
						{
							error['error']='float_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;
				}
			}

			if (chars=teg.getAttribute('chars-strong'))
			{
				if(require && teg.value.length!=parseInt(chars,10))
				{
					error['error']='chars-strong';
					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;
				}
			}



			//equal to fild with value
			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=="" || teg.value==0))
			{
				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);
}