﻿var FormValidation =	{
	init: function()	{
		var forms = document.getElementsByTagName("form");
		for (var i = 0; i < forms.length; i++)	{
			Core.addEventListener(forms[i], "submit", FormValidation.submitListener);
		}
	},
	
	rules:	{
		required: /./,
		requiredNotWhitespace: /\S/,
		positiveInteger: /^\d*[1-9]\d*$/,
		positiveOrZeroInteger: /^\d+$/,
		integer: /^-?\d+$/,
		decimal: /^-?\d+([,|\.]\d+)?$/,
		email: /^[\w\.\-]+@([\w\-]+\.)+[a-zA-Z]+$/,
		telephone: /^(\+\d+)?( |\-|\.)?(\(?\d+\)?)?( |\-|\.)?(\d+( |\-|\.)?)*\d+$/
	},
	
	errors:	{
		required: "Bitte füllen Sie dieses erforderliche Feld aus.",
		requiredNotWhitespace: "Bitte füllen Sie dieses erforderliche Feld aus.",
		positiveInteger: "Dieses Feld darf nur positive, ganzzahlige Werte enthalten.",
		positiveOrZeroInteger: "Dieses Feld darf nur einen nicht negativen, ganzzahligen Wert enthalten.",
		integer: "Dieses Feld darf nur einen ganzzahligen Wert enthalten.",
		decimal: "Dieses Feld darf nur eine Zahl enthalten.",
		email: "Bitte geben Sie eine gültige E-Mail-Adresse an.",
		telephone: "Bitte geben Sie eine gültige Telefonnummer an."
	},
	
	submitListener: function(event)	{
		var fields = this.elements;
		for (var i = 0; i < fields.length; i++)	{
			var className = fields[i].className;
			var classRegExp = /(^| )(\S+)( |$)/g;
			var classResult;
			while (classResult = classRegExp.exec(className))	{
				var oneClass = classResult[2];
				var rule = FormValidation.rules[oneClass];
				if (typeof rule != "undefined")	{
					if (!rule.test(fields[i].value))	{
						fields[i].focus();
						alert(FormValidation.errors[oneClass]);
						Core.preventDefault(event);
						return;
					}
				}
			}
		}

		// if form validates, send the data
		var form = this;

		try	{
			var requester = new XMLHttpRequest();
		}
		catch (error)	{
			try	{
				var requester = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (error)	{
				var requester = null;
			}
		}

		if (requester != null)	{
			form._timer = setTimeout(function()	{
				requester.abort();
				FormValidation.writeError("Der Server braucht zu lange, um zu antworten.");
			}, 1000000);

			var parameters = "submitby=ajax";
			var formElements = [];
			var textareas = form.getElementsByTagName("textarea");
			for (var i = 0; i < textareas.length; i++)	{
				formElements[formElements.length] = textareas[i];
			}
	
			var selects = form.getElementsByTagName("select");
			for (var i = 0; i < selects.length; i++)	{
				formElements[formElements.length] = selects[i];
			}
	
			var inputs = form.getElementsByTagName("input");
			for (var i = 0; i < inputs.length; i++)	{
				var inputType = inputs[i].getAttribute("type");
				if (inputType == null || inputType == "text" || inputType == "hidden" || (typeof inputs[i].checked != "undefined" && inputs[i].checked == true))	{
					formElements[formElements.length] = inputs[i];
				}
			}
	
			for (var i = 0; i < formElements.length; i++)	{
				var elementName = formElements[i].getAttribute("name");
				if (elementName != null && elementName != "")	{
					parameters += "&" + elementName + "=" + encodeURIComponent(formElements[i].value);
				}
			}
	
//			requester.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			requester.open("POST", form.getAttribute("action"), true);
			requester.onreadystatechange = function()	{
				clearTimeout(form._timer);
				if (requester.readyState == 4) {
					if (requester.status == 200 || requester.status == 304)	{
						FormValidation.writeSuccess(form);
					}
					else	{
						FormValidation.writeError("Der Server konnte nicht erreicht werden.");
					}
				}
			};
			requester.send(parameters);
			Core.preventDefault(event);
		}
	},

	writeSuccess: function(form)	{
		var newP = document.createElement("p");
		newP.setAttribute("id", "success");
		newP.appendChild(document.createTextNode(
		"Ihre Nachricht wurde erfolgreich übermittelt."));
		form.parentNode.replaceChild(newP, form);
	},
	
	writeError: function(errorMsg)	{
		alert(errorMsg);
	}
}

Core.start(FormValidation);
