var __alredy_check_element=new Array();

function validator(form,lang,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();
	
	if(typeof lang == 'undefined')
	{
		var lang=0;
	}
	
	
	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(lang)
			{
				case 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;
					}
				break;
				
				default:
					switch(error['error'])
					{
						case 'require': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' required'; break;
                        case 'alpha': if(error['error_message']) ; else error['error_message']='Field '+error['tag_name'] + ' should contain only symbols'; break;
                        case 'mail': if(error['error_message']) ; else error['error_message']='Incorrect email address'; break;
                        case 'int': if(error['error_message']) ; else error['error_message']='Please check value for '+error['tag_name']+''; break;
                        case 'int_max': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' value is more that required'; break;
                        case 'int_min': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' value is less than required'; break;
                        case 'float': if(error['error_message']) ; else error['error_message']='Please check value in '+error['tag_name']+''; break;
                        case 'float_max': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' value more than allowed'; break;
                        case 'float_min': if(error['error_message']) ; else error['error_message']=''+error['tag_name']+' less than required value'; break;
                        case 'radio_not_check': if(error['error_message']) ; else error['error_message']='Please select '+error['tag_name']+''; break;
                        case 'select_require': if(error['error_message']) ; else error['error_message']='Please select value for '+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']+' are required to be checked for '+error['tag_name']+''; break;
                        case 'equal': if(error['error_message']) ; else error['error_message']=error['tag_name']+' mismatch'; break;
                        case 'chars': if(error['error_message']) ; else error['error_message']='Enter more than '+error['chars']+' symbols to '+error['tag_name']; break;
                        case 'chars-strong': if(error['error_message']) ; else error['error_message']='Enter '+error['chars']+' symbols to '+error['tag_name']; break;
                        case 'custom_check': break;
					}
				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 is_array(obj)
{
	if(obj.getAttribute)
	{
		return false;
	}
	else
	{
		return true;
	}
	return false;
}



function __validator_check(form)
{
	var radio_name_check= new Array();
	var checkbox_name_check= new Array();
	var error=new Array();
	var check_allow;
	
	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;
		
		//poverka na to neobhodimo li proveryat element po ystanovlennim znacheniyam v drygom elemente
		var iftag=teg.getAttribute('iftag');
				
		check_allow=true;
		if(iftag)
		{
			var iftagvalue=teg.getAttribute('iftagvalue');

			var searchvalue=false;

			if(is_array(form.elements[iftag]))
			{
				for( ifcount in form.elements[iftag])
				{
					if(form.elements[iftag][ifcount].checked) searchvalue=form.elements[iftag][ifcount].value;
				}
			}
			else
			{
				searchvalue=form.elements[iftag].value;
			}
			if(searchvalue && iftagvalue && (searchvalue!=iftagvalue))	{check_allow=false;}
			else if( !(searchvalue && !(searchvalue=="0" || searchvalue=="")) ) check_allow=false;
			//alert(tag_name+":"+check_allow+":"+searchvalue);
			//alert( (searchvalue && !(searchvalue=="0" || searchvalue=="")));
		}
		
		//<input>
		if(check_allow)
		{
			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 (teg.value.length>0 && 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=="")
				{
					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);
}