var validate = {
	/** Highlight Farben für ein Fehlerfeld */
	HColors : new Array("#FCFECC", "#FCFECC","#FCFECC","#FFFFFF"),

	/** Highlight Farben intensitaet */
	intensity : 0,

	/** Highlight Farben aktiviert */
	aktiv : null,

	/** Metadaten für die Validierung, bzgl Dokumentation siehe wiki */
	elementMetas: {},

	/** Check Identifier für Längenbegrenzung */
	CHECK_LENGTH: "length",

	/** Check Identifier für Längenbegrenzung */
	CHECK_REQUIRED: "required",

	/** Check Identifier für Längenbegrenzung */
	CHECK_NUMBER: "number",

	/** Check Identifier für die erforderliche Auswahl von einem Element in einer Liste */
	CHECK_SELECT_ONE: "selectone",
	
	/** Parameter für maximale Länge */
	PARAM_MAXLENGTH: "maxLength",

	/** Parameter für Stellen vor dem Komma */
	PARAM_PRECISION_BEFORE_COMMA: "precisionBeforeComma",

	/** Parameter für Nachkommastellen */
	PARAM_PRECISION_AFTER_COMMA: "precisionAfterComma",

	getElementMeta: function(elementId) {
		var elementMeta = validate.elementMetas[elementId];
		if (immo.isEmpty(elementMeta)) {
			validate.elementMetas[elementId] = {};
			validate.elementMetas[elementId]["checks"] = {};
			elementMeta = validate.elementMetas[elementId];
		}
		return elementMeta;
	},

	registerCheckLength: function(elementId, errorAnchorName, maxLength, errorLabelId) {
		if (immo.isEmpty(maxLength)) {
			maxLength = 16;
		}
		validate.getElementMeta(elementId)[validate.PARAM_MAXLENGTH] = maxLength;
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_LENGTH);
	},


	registerCheckRequired: function(elementId, errorAnchorName, errorLabelId) {
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_REQUIRED);
	},


	registerCheckNumber: function(elementId, errorAnchorName, errorLabelId) {
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_NUMBER);
	},

	registerCheckInteger: function(elementId, errorAnchorName, errorLabelId) {
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_BEFORE_COMMA] = 20;
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_AFTER_COMMA] = 0;
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_NUMBER);
	},

	registerCheckYear: function(elementId, errorAnchorName, errorLabelId) {
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_BEFORE_COMMA] = 4;
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_AFTER_COMMA] = 0;
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_NUMBER);
	},


	registerCheckMoney: function(elementId, errorAnchorName, precisionAfterComma, errorLabelId) {
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_BEFORE_COMMA] = 10;
		if (immo.isStringEmpty(precisionAfterComma)) {
			precisionAfterComma = 2;
		}
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_AFTER_COMMA] = precisionAfterComma;
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_NUMBER);
	},


	registerCheckRoom: function(elementId, errorAnchorName, errorLabelId) {
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_BEFORE_COMMA] = 4;
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_AFTER_COMMA] = 1;
		validate.registerDelegate(elementId, errorAnchorName,errorLabelId, validate.CHECK_NUMBER);
	},


	registerSelectOne: function(elementId, errorAnchorName, errorLabelId) {
		validate.registerDelegate(elementId, errorAnchorName,errorLabelId, validate.CHECK_SELECT_ONE);
	},
	
	
	registerCheckArea: function(elementId, errorAnchorName, errorLabelId) {
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_BEFORE_COMMA] = 9;
		validate.getElementMeta(elementId)[validate.PARAM_PRECISION_AFTER_COMMA] = 2;
		validate.registerDelegate(elementId, errorAnchorName, errorLabelId, validate.CHECK_NUMBER);
	},


	registerDelegate: function(elementId, errorAnchorName, errorLabelId, checkIdentifier) {
		validate.getElementMeta(elementId)["elementId"] = elementId;
		validate.getElementMeta(elementId)["checks"][checkIdentifier] = checkIdentifier;
		if (typeof errorAnchorName == "undefined") {
			errorAnchorName = null;
		}
		if (typeof errorLabelId == "undefined") {
			errorLabelId = null;
		}
		validate.getElementMeta(elementId)["errorAnchorName"] = errorAnchorName;
		validate.getElementMeta(elementId)["errorLabelId"] = errorLabelId;
		var element = document.getElementById(elementId);
		immo.addEvent(element, "keyup", validate.eventCheckCall);
		immo.addEvent(element, "blur", validate.eventCheckCall);
	},


	eventCheckCall: function(event) {
		var elementId = null;
		if (event.target) {
			// Mozilla
			elementId = this.id;
			// oder event.target.id
		}
		else {
			// Internet Explorer
			elementId = event.srcElement.id;
		}
		var elementMeta = validate.getElementMeta(elementId);
		validate.validateField(elementMeta);
	},


	validateField: function(elementMeta) {
		var checksValid = true;
		var elementError = document.getElementById(elementMeta.elementId + "_error");
		if(elementError == null){
			elementError = document.getElementById("_error");
		}
		var elementErrorLabelId = document.getElementById(elementMeta.errorLabelId);

		for (var checkIdentifierKey in elementMeta["checks"]) {
			var checkIdentifier= elementMeta["checks"][checkIdentifierKey];
			var result = validate.dispatchElementValidation(elementMeta, checkIdentifier);
			checksValid &= result.valid;
			if (!result.valid) {
				// Fehler einblenden
				if(elementError != null){
					elementError.innerHTML = result.message;
					elementError.style.display = "block";
				}
				if(elementErrorLabelId != null){
					elementErrorLabelId.className = "contenthlerror";
				}
				break;
			}
		}
		if (checksValid) {
			// Fehler ausblenden
			if(elementError != null){
				elementError.style.display = "none";
			}
			if(elementErrorLabelId != null){
				elementErrorLabelId.className = "contenthlsmall";
			}
		}
		return checksValid;
	},


	validateFields: function() {
		var result = true;
		for (var elementMetaKey in validate.elementMetas) {
			var elementMeta = validate.elementMetas[elementMetaKey];
			var checksValid = validate.validateField(elementMeta);
			if (!checksValid) {
				if (!immo.isEmpty(elementMeta.errorAnchorName)) {
					var url = window.location.href;
					url = url.substring(url.indexOf("#"), url.lastIndexOf());
					window.location.href = url + "#" + elementMeta.errorAnchorName;
				}
				if(validate.aktiv == null){
					validate.aktiv = window.setInterval("validate.highlightOptions('"+elementMetaKey+"')", 250);
				}
				result = false;
				break;
			}
		}
		return result;
	},


	dispatchElementValidation: function(elementMeta, checkIdentifier) {
		var element = document.getElementById(elementMeta.elementId);
		if (!immo.isEmpty(element)) {
			var value = element.value;
			if (checkIdentifier == validate.CHECK_LENGTH) {
				return validate.validateLength(elementMeta, element, value);
			}
			else if (checkIdentifier == validate.CHECK_NUMBER) {
				return validate.validateNumber(elementMeta, element, value);
			}
			else if (checkIdentifier == validate.CHECK_REQUIRED) {
				return validate.validateRequired(elementMeta, element, value);
			}
			else if (checkIdentifier == validate.CHECK_SELECT_ONE) {
				return validate.validateSelectOne(elementMeta, element, value);
			}
		}
	},


	validateLength: function(elementMeta, element, value) {
		var maxLength = elementMeta[validate.PARAM_MAXLENGTH];
		var result = new Object();
		result.valid = value.length <= maxLength;
		result.message = "Bitte reduzieren Sie Ihre Eingabe auf " + maxLength + " Zeichen.";
		return result;
	},


	validateNumber: function(elementMeta, element, value) {
		var result = new Object();
		var regexClauseAfterComma = "(,[0-9]*)?";  // Nachkommastellenpruefung
		var re = new RegExp("^ *[0-9]*" + regexClauseAfterComma + " *$");
		if (!re.test(value)) {
			result.valid = false;
			result.message = "Bitte geben Sie nur Ziffern ein!";
			return result;
		}

		var precisionAfterComma = elementMeta[validate.PARAM_PRECISION_AFTER_COMMA];
		if ((precisionAfterComma != null) && (typeof precisionAfterComma != "undefined")) {
			if (precisionAfterComma == 0) {
				regexClauseAfterComma = "";  // Nachkommastellenpruefung "ausschalten" für nachfolgende Schritte
				var re = new RegExp("^ *[0-9]* *$");
				if (!re.test(value)) {
					result.valid = false;
					result.message = "Bitte geben Sie nur Ziffern ein.";
					return result;
				}
			}
			else {
				var re = new RegExp("^ *[0-9]*,?[0-9]{0," + precisionAfterComma + "} *$");
				if (!re.test(value)) {
					result.valid = false;
					if (precisionAfterComma > 1) {
						result.message = "Bitte geben Sie nur " + precisionAfterComma + " Nachkommastellen ein.";
					}
					else {
						result.message = "Bitte geben Sie nur eine Nachkommastelle ein.";
					}
					return result;
				}
			}
		}

		var precisionBeforeComma = elementMeta[validate.PARAM_PRECISION_BEFORE_COMMA];
		if ((precisionBeforeComma != null) && (typeof precisionBeforeComma != "undefined")) {
			var re = new RegExp("^ *[0-9]{0," + precisionBeforeComma + "}" + regexClauseAfterComma + " *$");
			if (!re.test(value)) {
				result.valid = false;
				if (precisionBeforeComma > 1) {
					result.message = "Bitte geben Sie nur " + precisionBeforeComma + " Ziffern ein.";
				}
				else {
					result.message = "Bitte geben Sie nur eine Ziffer ein.";
				}
				return result;
			}
		}

		result.valid = true;
		return result;
	},


	validateRequired: function(elementMeta, element, value) {
		var result = new Object();
		if (immo.isStringEmpty(value)) {
			result.valid = false;
			result.message = "Bitte füllen Sie das Feld aus.";
			return result;
		}
		result.valid = true;
		return result;
	},


	validateSelectOne: function(elementMeta, element, value) {
		var result = new Object();
		if (element.selectedIndex == -1) {
			result.valid = false;
			result.message = "Wählen Sie bitte eine Option aus.";
			return result;
		}
		result.valid = true;
		return result;
	},


	highlightOptions:function (elementid){
		var element = document.getElementById(elementid);
		element.style.backgroundColor = validate.HColors[validate.intensity];

		validate.intensity++;
		if(validate.intensity > validate.HColors.length){
			window.clearInterval(validate.aktiv);
			validate.aktiv = null;
			validate.intensity = 0;
		}
	}
}
