////////////////////////////////////////////////
///////////////// FormEnhancer /////////////////
////////////////////////////////////////////////


var FormEnhancer = Class.create({
	////////////////////// Initializer:
	initialize: function(submitURL, formObject, showErrorsBeforeSubmit, errorDiv){
		//alert("starting...")
		this.submitURL = submitURL;
		this.formObject = $(formObject);
		this.formObject.onsubmit = function(){ return false; }//observe('submit', this.checkForm.bindAsEventListener(this));
		this.errorDivName = errorDiv || "specialerrors";
		this.pflichtfelder = new Array();
		this.externeFehler = new Array();
		this.showErrors = showErrorsBeforeSubmit || false;
		this.enhanceForm();
		this.nurPLZ = false;
	},
	////////////////////// Enhancements:
	enhanceForm: function() {
		var elements = this.formObject.getElementsByTagName('div');
		var elementsLength = elements.length;
		for(i=0; i < elementsLength; i++) {

			var bezeichung = elements[i].className;
			if(bezeichung.include("input")) 		{ this.enhanceGeneral(elements[i]); elements[i].rel="normal"; }
			if(bezeichung.include("select")) 		{ this.enhanceAsSelect(elements[i]); elements[i].rel="normal"; }
			if(bezeichung.include("checkbox"))	 	{ this.enhanceAsCheckbox(elements[i]); elements[i].rel="normal"; }

		};
	},
	////////////////////// Definiton der Interaktivitäten
	enhanceGeneral: function(divElement, checkThisElement) {
		var inputElement = $(divElement.getElementsByTagName('input')[0]);
		//inputElement.observe('keyup', this.trimGeneral.bindAsEventListener(inputElement));
		inputElement.observe('blur', this.trimSpaces.bindAsEventListener(inputElement));
		inputElement.observe('blur', this.sendToSingleCheck.bindAsEventListener(inputElement, this));
	},
	enhanceAsSelect: function(divElement, checkThisElement) {
		var selectElement = $(divElement.getElementsByTagName('select')[0]);
		selectElement.observe('change', this.sendToSingleCheck.bindAsEventListener(selectElement, this));
	},
	enhanceAsCheckbox: function(divElement, checkThisElement) {
		var boxElement = $(divElement.getElementsByTagName('input')[0]);
		boxElement.observe('change', this.sendToSingleCheck.bindAsEventListener(boxElement, this));
	},
	/// Übergabe für Prüffunktion herleiten
	sendToSingleCheck: function(e, obj) {
		var div = $(e.target.parentNode);
		obj.isSingleInputValid(div);
	},
	////////////////////// Korrekturfunktionen bei der Eingabe / Auslagerung
	trimGeneral: function(e) {
		var pruefAusdruck =  /[^0-9]/
		while(e.target.value.match(pruefAusdruck)) {
			e.target.value = e.target.value.replace(pruefAusdruck,"");
		};
	},
	trimSpaces: function(e) {

		var tmp = "";
		var item_length = e.target.value.length;
		var item_length_minus_1 = e.target.value.length - 1;
		for (index = 0; index < item_length; index++) {
			if (e.target.value.charAt(index) != ' ') {
				tmp += e.target.value.charAt(index);
			} else {
				if (tmp.length > 0) {
					if (e.target.value.charAt(index+1) != ' ' && index != item_length_minus_1) {
						tmp += e.target.value.charAt(index);
					};
				};
			};
		};
		e.target.value = tmp;
	},
	////////////////////// Funktionen für externe Prüfungen
	removeREQ: function(div) {
		if (div.className.startsWith("REQ_")) {
			div.className = div.className.substr(4);
			//alert(div.className);
		};
	},
	addREQ: function(div) {
		if (!div.className.startsWith("REQ_")) {
			div.className = "REQ_"+div.className;
			//alert(div.className);
		};
	},
	addError: function(meldung) {
		this.externeFehler.push(meldung);
		//alert(this.externeFehler.inspect()+ "length: "+this.externeFehler.length);
	},
	removeError: function(meldung) {
		var temp = new Array();
		var anzahlFehler = this.externeFehler.length;
		for (i=0; i<anzahlFehler; i++) {
			if(this.externeFehler[i] != meldung) {
				temp.push(this.externeFehler[i]);
			};
		};
		this.externeFehler = temp;
		//alert(this.externeFehler.inspect()+ "    length: "+this.externeFehler.length);
	},
	////////////////////// Einfärben:
	highlightError: function(divElement, welcherTag) {
		var tagName = welcherTag || "input";
		if (this.showErrors && divElement.rel == "normal") {
				var inputElement = $(divElement.getElementsByTagName(tagName)[0]);
				var labelElement = $(divElement.getElementsByTagName('label')[0]);

				inputElement.morph('border-color:#f0785f');
				labelElement.morph('color:#ac422d');
				divElement.rel = "error";
		};
	},
	highlightValid: function(divElement, welcherTag) {
		if (divElement.rel == "error") {
				var tagName = welcherTag || "input";

				if(tagName == "checkbox") {
					var inputElement = $(divElement.getElementsByTagName(tagName)[0]);
					var labelElement = $(divElement.getElementsByTagName('label')[0]);
					var tickElement = false;
				} else {
					var inputElement = $(divElement.getElementsByTagName(tagName)[0]);
					var labelElement = $(divElement.getElementsByTagName('label')[0]);
					var tickElement = $(labelElement.getElementsByTagName('span')[0]);
				};

				inputElement.morph('border-color:#71ab34', {duration: 0.5,
															afterFinish: function() {
																inputElement.morph('border-color:#bcbcbd', {duration: 0.5});
															}});
				labelElement.morph('color:#5a872b', {duration: 0.5,
															afterFinish: function() {
																labelElement.morph('color:#666666', {duration: 0.5});
															}});
				if(tickElement) {
					tickElement.morph('opacity:100', {duration: 0.5,
																afterFinish: function() {
																	tickElement.morph('opacity:0', {duration: 0.5});
																}});
				};
				divElement.rel = "normal";
			};
	},
	////////////////////// Prüffunktionen:
	isSingleInputValid: function(divElement, senden) {
		var bezeichung = divElement.className;
		if(this.showErrors && bezeichung.include("REQ")) {
			var rueckgabe = false;
			var rueckgabeSenden = senden || true;


			if(bezeichung.include("input"))
			{
				var inputElement = $(divElement.getElementsByTagName('input')[0]);
				if (this.isFilledOut(inputElement.value) == true) 
				{
					if(inputElement.name == "plz")
					{
						reg1 = /^[0-9]{5,}/;
						if (!reg1.test(inputElement.value))
						{
							this.highlightError(divElement);
							this.nurPLZ = true;
						}
						else
						{
							this.highlightValid(divElement);
							this.nurPLZ = false;
							rueckgabe = true;
						}
					}
					else
					{
						this.highlightValid(divElement);
						rueckgabe = true;
					}
				} 
				else 
				{
					this.highlightError(divElement);
					this.nurPLZ = false;
				};
			};
			if(bezeichung.include("select"))
			{
				var selectElement = divElement.getElementsByTagName('select')[0];
				if (selectElement.options[0].selected != true) {
					this.highlightValid(divElement, 'select');
					rueckgabe = true;
				} else {
					this.highlightError(divElement, 'select');
				};
			};
			if(bezeichung.include("checkbox"))
			{
				var boxElement = $(divElement.getElementsByTagName('input')[0]);
				if (boxElement.checked == true) {
					this.highlightValid(divElement);
					rueckgabe = true;
				} else {
					this.highlightError(divElement);
				};
			};

			if (rueckgabeSenden) return rueckgabe;
		};
	},
	isFilledOut: function(value) {
		if (value.strip() != "") {
			return true;
		} else {
			return false;
		};
	},
	////////////////////// Gesamt-Prüfung: (onSubmit)
	checkForm: function() {
		//alert("checkForm");
		this.showErrors = true;
		var error = false;

		/////// Alle zu prüfenden Elemente in einem Array sammeln
		var elements = this.formObject.getElementsByTagName('div');
		var elementsLength = elements.length;
		for(i=0; i < elementsLength; i++) {
			if(elements[i].className.include('REQ')) {
				this.pflichtfelder.push(elements[i]);
			};
		};

		/////// Relevante Elemente prüfen

		var pflichtfelderLength = this.pflichtfelder.length;
		for(i=0; i < pflichtfelderLength; i++) {
			if (this.isSingleInputValid(this.pflichtfelder[i]) != true ) {
				error = true;
			};
		};
		if (error) 
		{
			var errorDiv = $(this.errorDivName);
			if (this.nurPLZ == true)
			{
				errorDiv.innerHTML = "Ihre Postleitzahl ist ung&uuml;ltig. Bitte 5-stellige Postleitzahl eingeben.";
			}
			else
			{
				errorDiv.innerHTML = "Bitte f&uuml;llen Sie vor dem Versenden alle rot markierten Felder aus.";
			//helpIE();
			}
		} 
		else 
		{

			this.formObject.submit();

			//var absenden = $('absenden');
			//absenden.style.display = "none";

/*			var errorDiv = $('specialerrors');
			errorDiv.innerHTML = ""
			errorDiv.style.color = "#303137";
			errorDiv.innerHTML = "Ihre Daten werden &uuml;bertragen..."
			//alert("Formular ist OK und wird versendet!");
			var inhalte = this.formObject.serialize();
			inhalte = encodeURI(inhalte);
			var url = this.submitURL+"?"+inhalte;
			//alert(url);
			new Ajax.Request(url, {
							method: 'post',
							onSuccess: function(transport) {
									//alert(transport.responseText);

									var bottom = $("bottom");
									bottom.innerHTML = transport.responseText;

								}
					});
*/
		};
		return false
	}
});
