// Validator Class 1.0
// Matej Posinković 18.2.2006

formValidator =
{
	exec: function(validationSet, config)
	{
		//sem notri spravim error message, ki ga prikažem na koncu
		var error_msg = '';
		var validationSuccessfull = 1;
		var errorBox = document.getElementById(config.idErrorMessageBox);

		//takoj preprečim izvajanje, če je kaj narobe z errorboxom
		if(!formValidator.CheckErrorBox(errorBox, config))
			return false;

		for(var i in validationSet)
		{
			//takoj preprečim 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(validationSet[i]['highlight']);

			if(formValidator.CheckData(i,validationSet[i]))
			{
				fieldToHighlight.className = config.errorNormalClass;
			}
			else
			{
				fieldToHighlight.className = config.errorHighlightClass;
				error_msg += validationSet[i]['error'] + '<br />' ;
				validationSuccessfull = 0;
			}
		}

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

	CheckData: 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(field.value <= 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)
	{

		//takoj ustavim zadevo, če polje ne obstaja; imam dve polji
		//multi select kjer zgeneriram več polij
		//ter vsa ostala, kjer je le eno polje pomembno
		if((validationSet[fieldName]['regexp'] == 'multi_select') && validationSet[fieldName]['num_tags'])
		{
			for(j = 1; j <= validationSet[fieldName]['num_tags']; j++)
			{
				if(!document.getElementById(fieldName + '_' + j))
					alert('Field ' + fieldName + '_' + j + ' does not exist!');
			}
		}
		else
		{
			if(!document.getElementById(fieldName))
			{
				alert('Field ' + fieldName + ' does not exist!');
				return false;
			}
		}

		if(!validationSet[fieldName]['regexp'])
		{
			alert('Property "regexp" in ' + fieldName + ' is not specified!');
			return false;
		}
		if(!validationSet[fieldName]['error'])
		{
			alert('Property "error" in ' + fieldName + ' is not specified!');
			return false;
		}
		if(!document.getElementById(validationSet[fieldName]['highlight']))
		{
			if(!validationSet[fieldName]['highlight'])
				alert('Property "highlight" in ' + fieldName + ' is not specified!');
			else
				alert('Field ' + validationSet[fieldName]['highlight'] + ' does not exist!');
			return false;
		}
		
		//še posebna polja
		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;
			}
		}
		if(validationSet[fieldName]['regexp'] == 'multi_select')
		{
			if(!validationSet[fieldName]['num_tags'])
			{
				alert('Property "num_tags" in ' + fieldName + ' is not specified!');
				return false;
			}
		}

		return true;
	},

	CheckErrorBox: function(errorBox, config)
	{
		//takoj preprečim izvajanje, če ni errorboxa
		if(!errorBox)
		{
			if(!config.idErrorMessageBox)
				alert('Property "idErrorMessageBox" in config is not defined!');
			else
				alert('Field ' + config.idErrorMessageBox + ' does not exist!');
			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;
		}
		
		return true;
	}
}
