window._fValidator = 
{
	repeat_passwd : 'pakartokite slaptažodį',
	not_equal_passwd : 'Nesutampa slaptažodžiai.',
	field : 'Laukas',
	file : 'Failas',
	required : 'yra privalomas',
	bad_fill : 'neteisingai užpildytas',
	bad_date : 'Tokia data negalima.',
	class_error : 'highlight',
	frm_objects : {},
	// helpers
	$ : function(el) 
	{
		return document.getElementById(el);
	},
	$S : function (el)
	{
		return this.$(el).style;
	},
	errDesc : function(valResult, valType, el)
	{
		if (!valResult)
		{
			var errtext = '';
			switch (valType)
			{
				case 'regexp' :
					errtext = this.field + ' "' + this.$(this.form.id+'-k-'+el).firstChild.nodeValue + '" ' + this.bad_fill;
					break;
				case 'passwd' :
					errtext = this.not_equal_passwd;
					break;
				case 'date' :
					errtext = this.bad_date;
					break;
				default :
					errtext = this.field + ' "' + this.$(this.form.id+'-k-'+el).firstChild.nodeValue + '" ' + this.required;
			}
			if (this.$(this.form.id+'-errorcontainer'))
			{
				var errtextnode = document.createTextNode(errtext);
				this.$(this.form.id+'-errorcontainer').appendChild(errtextnode);
				this.$(this.form.id+'-errorcontainer').appendChild(document.createElement('br'));
				this.$S(this.form.id+'-errorcontainer').display = 'block';
			}
			else 
			{
				if (!this.$(this.form.id+'-e-'+el) || this.$(this.form.id+'-e-'+el) == 'undefined')
				{
					var errtextnode = document.createTextNode(errtext);
					var err = document.createElement('div');
					err.appendChild(errtextnode);
					err.id = this.form.id+'-e-'+el;
					err.className = this.class_error;
					this.$(this.form.id+'-v-'+el).insertBefore(err, this.$(this.form.id+'-v-'+el).firstChild);
				}
				else
				{
					this.$(this.form.id+'-e-'+el).firstChild.nodeValue = errtext;
				}
			}
			return false;
		}
		else if (this.$(this.form.id+'-e-'+el))
		{
			this.$(this.form.id+'-v-'+el).removeChild(this.$(this.form.id+'-e-'+el));
		}
		return true;
	},
	cleanErrors : function()
	{
		if (this.$(this.form.id+'-errorcontainer'))
		{
			this.$(this.form.id+'-errorcontainer').innerHTML = '';
			this.$S(this.form.id+'-errorcontainer').display = 'none';
		}
	},
	// validators
	checkMandText : function(el)
	{
		if (this.form[el].value)
		{
			return true;
		}
		return false;
	},
	checkMandSelect : function(el)
	{
		if (this.form[el].options[this.form[el].selectedIndex].value)
		{
			return true;
		}
		return false;
	},
	checkMandRadio : function(el)
	{
		if (!this.form[el])
		{
			el += '[]';
		}
		if (!this.form[el].length)
		{
			return this.form[el].checked;
		}
		for (i = 0; i < this.form[el].length; i++) 
		{
			if (this.form[el][i].checked)
			{
				return true;
			} 
		}
		return false;
	},
	checkMandDate : function(el)
	{
		if (this.form[el+'_year'].options[this.form[el+'_year'].selectedIndex].value
			&& this.form[el+'_month'].options[this.form[el+'_month'].selectedIndex].value
			&& this.form[el+'_day'].options[this.form[el+'_day'].selectedIndex].value)
		{
			return true;
		}
		return false;
	},
	checkPasswords : function(el)
	{
		if (this.form[el].value && this.form[el].value == this.form[el+'2'].value)
		{
			return true;
		}
		return false;
	},
	validateDate : function(el)
	{
		var y = this.form[el+'_year'].options[this.form[el+'_year'].selectedIndex].value;
		var m =	this.form[el+'_month'].options[this.form[el+'_month'].selectedIndex].value;
		var d =	this.form[el+'_day'].options[this.form[el+'_day'].selectedIndex].value;		
		if (this.checkMandDate(el))
		{
			var dayobj = new Date(y, m-1, d);
			if ((dayobj.getMonth()+1) == m && dayobj.getDate() == d && dayobj.getFullYear() == y)
			{
				return true;
			}
		}
		else if (!y	&& !m && !d)
		{
			return true;
		}
		return false;
	},
	validateText : function(el, regexp)
	{
		if (regexp.test(this.form[el].value))
		{
			return true;
		}
		return false;
	},
	processElement : function(el, obj, focus)
	{
		var result = true;
		var valType = obj.vt;
		var valResult = true;
		switch (obj.t)
		{
			case 'text' :
			case 'password' :
			case 'textarea' :
				valResult = this.checkMandText(el);
				if (valResult)
				{
					if (obj.r)
					{
						valType = 'regexp';
						valResult = this.validateText(el, obj.r);
					}
				}
				else if (valType != 'mand')
				{
					valResult = true;
				}
				break;
			case 'checkpassword' :
				valResult = this.checkMandText(el);
				if (valResult)
				{
					if (obj.r)
					{
						valType = 'regexp';
						valResult = this.validateText(el, obj.r);
					}
					if (valResult)
					{
						valType = 'passwd';
						valResult = this.checkPasswords(el);
					}
				}
				else if (valType != 'mand')
				{
					valResult = true;
				}
				break;
			case 'checkbox' :
			case 'radio' :
				valResult = this.checkMandRadio(el);
				break;
			case 'select' :
				valResult = this.checkMandSelect(el);
				break;
			case 'date' :
				valResult = this.checkMandDate(el);
				if (valResult)
				{
					valType = 'date';
					valResult = this.validateDate(el);
				}
				else if (valType != 'mand')
				{
					valResult = true;
				}
				break;
			case 'file' :
				valResult = this.checkMandText(el);
				break;
		}
		result = this.errDesc(valResult, valType, el);
		if (!result && focus)
		{
			location.href = '#' + this.form.id + ((this.$(this.form.id+'-errorcontainer')) ? '-errorcontainer' : '-k-'+el);
			if (this.form[el] && this.form[el].focus)
			{
				this.form[el].focus();
			}
		}

		return result;
	},
	process : function(frm)
	{
		this.form = frm;
		var result = true;
		var tmp_result = true;
		this.cleanErrors();
		for ( p in this.frm_objects) 
		{
			tmp_result = this.processElement(p, this.frm_objects[p], result);
			if (!tmp_result)
			{
				result = false;
			}
			
		}
		return result;
	}
}
