function FormValidator(formReference)
{
	this.formReference = formReference;
	this.errorHeader = new String();
	this.errorFooter = new String();
	this.errorMessage = new String();
	this.rulesCounter = 0;
	this.rules = new Array();
	this.failed = false;
	
	/**
	 * Setzt die überschrift der Fehlermeldung
	 */ 
	this.setErrorHeader = function(errorHeader)
	{
		this.errorHeader = errorHeader+"\n";
	}
	
	/**
	 * Setzt die Abschlussabsatz der Fehlermeldung
	 */
	this.setErrorFooter = function(errorFooter)
	{
		this.errorFooter = errorFooter+"\n";
	}
	
	/**
	 * Bindet an eine Formularelementreferenz einen validator.
	 * @param elementReference - HTML Formular-Element Referenz
	 * @param validator - Instanz-Referenz eines Validator-Plugins
	 */
	this.addRuleByElementReference = function(elementReference,validatorCallback)
	{
		this.rules[this.rulesCounter] = {reference: elementReference,validator: validatorCallback};
		this.rulesCounter++;
	}
	
	/**
	 * Bindet an eine Formularelementreferenz einen validator.
	 * @param elementReference - HTML Formular-Element Name 
	 *                          (Formular-Referenz muss in dem fall in dem Konstruktor angegeben werden)
	 * @param validator - Instanz-Referenz eines Validator-Plugins
	 */
	this.addRuleByElementName = function(elementName,validatorCallback)
	{
		this.rules[this.rulesCounter] = {reference: this.formReference[elementName],validator: validatorCallback};
		this.rulesCounter++;
	}

	/**
	 * Validiert alle Formular-Element bildungen. Falls ein Validierungsfehler auftritt, werden für alle
	 * Validierungsfehler eine Warnnachricht erstellt (abrufbar mit .getErrorMessage())
	 * 
	 * @return false bei Validierungsfehlern, true im Erfolgsfall.
	 */
	this.validateForm = function()
	{
		for (i=0; i<this.rulesCounter; i++)
		{
			this.errorMessage += this.rules[i].validator.validate(this.rules[i].reference);			
		}
		
		if (this.errorMessage == "")
		{
			this.failed = false;
			return (true);
		}
		else
		{
			this.failed = true;
			this.errorMessage = this.errorHeader+this.errorMessage+this.errorFooter;
		}
		return (false);
	}
	
	/**
	 * @return fehlermeldung als String, oder null falls Validierung erfolgreich war.
	 */ 
	this.getErrorMessage = function()
	{
		if (this.failed)
			return (this.errorMessage)
		else
			return (null);
	}
}


//////////////////////////////////////////////////////////////////////////////////////////////
// Plugins für FormValidator

function TextLengthValidator(minLenght, maxLenght, errorMessage)
{
	this.errorMessage = errorMessage;
	this.minLenght = minLenght;
	this.maxLenght = maxLenght;
	
	this.validate = function(formReference)
	{
		if (formReference.value.length < this.minLenght || formReference.value.length > this.maxLenght)
			return (this.errorMessage+"\n")
		return ("");
	}
}

function IntegerLengthValidator(minLen,maxLen,errorMessage)
{
	this.minLen = minLen;
	this.maxLen = maxLen;
	this.errorMessage = errorMessage;
	
	this.validate = function(formReference)
	{
		if (!formReference.value.match(new RegExp ("[0-9]+")))
			return (this.errorMessage+"\n");
		if (this.minLen != 0 && this.maxLen != 0)
		{
			if (formReference.value < this.minLen || formReference.value > this.maxLen)
				return (this.errorMessage+"\n");
		}
		return ("");
	}
}

/**
 * PLZ Validator-Plugin
 */
function PLZValidator(errorMessage)
{
	this.errorMessage = errorMessage;
	this.validate = function(formReference)
	{
		if (!formReference.value.match(new RegExp ("[0-9]+")))
			return (this.errorMessage+"\n");
		if (formReference.value.length != 5)
				return (this.errorMessage+"\n");
		return ("");
	}
}

function EmailValidator(errorMessage)
{
	this.errorMessage = errorMessage;
	this.validate = function(formReference)
	{
		if (!formReference.value.match(new RegExp (".+@.+[.].+")))
			return (this.errorMessage+"\n");
		return ("");
	}
}

function OptionalEmailValidator(errorMessage)
{
	this.errorMessage = errorMessage;
	this.validate = function(formReference)
	{
		if (!formReference.value || formReference.value=="") return ("");
		if (!formReference.value.match(new RegExp ("(.+@.+[.].+)")))
			return (this.errorMessage+"\n");
		return ("");
	}
}

function SelectValidator(errorMessage)
{
	this.errorMessage = errorMessage;
	
	this.validate = function(elementReference)
	{
		if (elementReference.selectedIndex == -1)
			return (this.errorMessage+"\n");
		else
			return ("");
	}
}

function PhoneValidator(errorMessage)
{
	this.errorMessage = errorMessage;
	
	this.validate = function(elementReference)
	{
		if (!elementReference.value || elementReference.value=="") return ("");
		
		if (!elementReference.value.match(new RegExp ("^0[0-9]+-[0-9]+$")))
			return (this.errorMessage+"\n");
		return (""); 
	}
}
