// Validator Class 1.0
// Matej Posinković 18.2.2006

formValidator =
{
	exec: function(validationSet, config)
	{
		//najprej preverim config nastavitve
		if(!formValidator.CheckConfig(config))
			return false;

		//inicializiram potrebne variable
		var validationSuccessfull = 1;
		var errorBox = document.getElementById(config.idErrorMessageBox);

		for(var i in validationSet)
		{
			//prekinem izvajanje, če niso polja pravilno zapisana ter povezana s html-jem
			if(!formValidator.CheckField(i, validationSet))
				return false;

			//vse štima in nadaljujem
			var fieldToHighlight = document.getElementById(i + '_label');

			//sfiltriram commonRegexp, če je vključen
			if(commonRegexp) validationSet[i]['regexp'] = this.ConvertCommonRegexp(validationSet[i]['regexp']);
			if(formValidator.CheckFieldData(i,validationSet[i]))
			{
				fieldToHighlight.className = config.errorNormalClass;
				document.getElementById(i + '_errormsg').style.display = 'none';
			}
			else
			{
				fieldToHighlight.className = config.errorHighlightClass;
				document.getElementById(i + '_errormsg').innerHTML = validationSet[i]['error'];
				document.getElementById(i + '_errormsg').style.display = 'block';
				validationSuccessfull = 0;
			}
		}

		if(validationSuccessfull == 1)
			return true;
		else
		{
			//v errorBox podam sporočilo
			errorBox.style.display = 'block';
			return false;
		}
	},

	ConvertCommonRegexp: function(regexpName)
	{
		//alert(regexpName + ' + ' + commonRegexp[regexpName]);
		if(commonRegexp[regexpName]) return commonRegexp[regexpName];
		else return regexpName;
	},

	CheckFieldData: function(id_field, selected_field)
	{
		var field = document.getElementById(id_field);

		//imam več opcij za regexp:
		//	- checkbox: preverim ali je checkbox checked
		//	- equal to: preverim če sta si polji enaki
		//	- not equal to: če sta polji manjši ali večji; glavno polje mora biti večje od primerjanega
		//	- multi_select: če je več checkboxov ali radio gumbov, ter želim, da je vsaj eden označen
		//	- navaden regular expression
		if(selected_field['regexp'] == "checkbox")
			return field.checked;
		else if(selected_field['regexp'] == "equal_to")
		{
			var compared_field = document.getElementById(selected_field['field_equal_to']);
			if(compared_field.value == field.value)
				return true;
			else
				return false;
		}
		else if(selected_field['regexp'] == "not_equal_to")
		{
			var compared_field = document.getElementById(selected_field['field_not_equal_to']);

			if(eval(field.value) <= eval(compared_field.value))
				return true;
			else
				return false;
		}
		else if(selected_field['regexp'] == "multi_select")
		{
			tagType = document.getElementById(id_field + '_1').type;
			var isset = 0;

			for(j = 1; j <= selected_field['num_tags']; j++)
			{
				if(tagType == 'checkbox')
				{
					if(document.getElementById(id_field + '_' + j).checked)
						isset++;
				}
				else if(tagType == 'radio')
				{
					if(document.getElementById(id_field + '_' + j).checked)
						isset++;
				}
			}
			if(isset)
				return true;
			else
				return false;
		}
		else
		{
			return field.value.match(selected_field['regexp']);
		}
	},

	CheckField: function(fieldName,validationSet)
	{
		//prvo kot prvo preverim vsa osnovna polja, ki so
		// - pravilo s katerim vrednotim podatek
		// - polje kamor vnašam podatek (regexp ne sme biti multi_select, saj to preverjam kasneje in se polja malo drugače imenujejo)
		// - napaka v primeru da vnos ni primiren
		// - polje kamor vpišem napako
		// - besedilo polja, ki ga obarva v primeru napake
		if(!validationSet[fieldName]['regexp'])
		{
			alert('Property "regexp" in ' + fieldName + ' is not specified!');
			return false;
		}
		if(!document.getElementById(fieldName) && (validationSet[fieldName]['regexp'] != 'multi_select'))
		{
			alert('Field ' + fieldName + ' does not exist!');
			return false;
		}
		if(!validationSet[fieldName]['error'])
		{
			alert('Property "error" in ' + fieldName + ' is not specified!');
			return false;
		}
		if(!document.getElementById(fieldName + '_errormsg'))
		{
			alert('Field "' + fieldName + '_errormsg" does not exist!');
			return false;
		}
		if(!document.getElementById(fieldName + '_label'))
		{
			alert('Field "' + fieldName + '_label" does not exist!');
			return false;
		}

		//preverim še posebna regexp polja
		if(validationSet[fieldName]['regexp'] == 'multi_select')
		{
			if(!validationSet[fieldName]['num_tags'])
			{
				alert('Property "num_tags" in ' + fieldName + ' is not specified!');
				return false;
			}
			else
			{
				for(j = 1; j <= validationSet[fieldName]['num_tags']; j++)
				{
					if(!document.getElementById(fieldName + '_' + j))
						alert('Field ' + fieldName + '_' + j + ' does not exist!');
				}
			}
		}
		if(validationSet[fieldName]['regexp'] == 'equal_to')
		{
			if(!validationSet[fieldName]['field_equal_to'])
			{
				alert('Property "field_equal_to" in ' + fieldName + ' is not specified!');
				return false;
			}
			//preverim ali obstaja polje s katerim ga želim enačiti
			if(!document.getElementById(validationSet[fieldName]['field_equal_to']))
			{
				alert('Field ' + validationSet[fieldName]['field_equal_to'] + ' does not exist!');
				return false;
			}
		}
		if(validationSet[fieldName]['regexp'] == 'not_equal_to')
		{
			if(!validationSet[fieldName]['field_not_equal_to'])
			{
				alert('Property "field_not_equal_to" in ' + fieldName + ' is not specified!');
				return false;
			}
			//preverim ali obstaja polje s katerim ga želim enačiti
			if(!document.getElementById(validationSet[fieldName]['field_not_equal_to']))
			{
				alert('Field ' + validationSet[fieldName]['field_not_equal_to'] + ' does not exist!');
				return false;
			}
		}

		return true;
	},

	CheckConfig: function(config)
	{
		//preverim če sem vnesel vse potrebne podatke
		if(!config.idErrorMessageBox)
		{
			alert('Property "idErrorMessageBox" in config is not defined!');
			return false;
		}
		if(!config.errorHighlightClass)
		{
			alert('Property "errorHighlightClass" in config is not defined!');
			return false;
		}
		if(!config.errorNormalClass)
		{
			alert('Property "errorNormalClass" in config is not defined!');
			return false;
		}

		//pogledam ali je errorbox definiran
		if(!document.getElementById(config.idErrorMessageBox))
		{
			alert('Field ' + config.idErrorMessageBox + ' does not exist!');
			return false;
		}

		return true;
	}
}
