﻿function validateForm(formName, checkableValues, submit)
{
	if(checkableValues == null) checkableValues = 0;
	if(submit == null) submit = false;
	
	doc = (formName == null) ? eval("document") : eval("document.forms['" + formName + "']");

	/**
	* 	<input type='hidden' name='validate_field'
	*		value='<FORMFIELD>'
	*		title='<VALIDATIONTYPE>, <...>|custom'
	*		src='<ERRORMSGFIELD>, <...>|none|nomsg'>
	*		class='<CUSTOM VALIDATIONFUNCTION>'
			id='<UNIQUE VALIDATE_FIELD ID>'
			lang='<DEPEND ON VALIDATE_FIELD VALUE>|none'>
			accept ='<DEPEND FIELD CONDITIONS>|none'>
	*	<input type='hidden' name='<ERRORMSGFIELD>' value='<ERRORMESSAGE>'>
	*/
	
	for(i = 0; i < doc.getElementsByName("validate_field").length; i++)
	{
		var fieldValue 		= ""; //Leeren
		var dependValue 	= "";

		var valField 		= doc.getElementsByName("validate_field")[i];
		var valType			= valField.title;
		var valId			= valField.id;
		var valDepend		= valField.lang;

		if(valDepend != "none")
		{
			var valDependField 	= doc.getElementById(valDepend);

			var dependName		= valDependField.value;
			var dependField		= doc.getElementsByName(dependName)[0];
			var dependValue		= trimString(dependField.value);
			var dependTagName	= dependField.tagName;

			if(valField.accept == "") valField.accept = "1";

			var dependCond	= valField.accept.split(",");

			if(dependTagName == "INPUT")
			{
				dependTagName = dependTagName + "_" + dependField.getAttribute("type", "false");
			}

			dependTagName = dependTagName.toLowerCase();
		}

		var errorMsgField = valField.src;

		//Hotfix - Firefox liefert src mit absoluter Pfadangabe
		errorMsgField = errorMsgField.indexOf("\/") != -1
				? trimString(errorMsgField.substring(errorMsgField.lastIndexOf("\/")+1, errorMsgField.length))
				: errorMsgField;

		if(errorMsgField.indexOf("none") == -1)
		{
			try
			{
				var msg;
				var errorMsgPart = new Array();

				var a_errorMsgField = errorMsgField.split(",");

				for(msg = 0; msg < a_errorMsgField.length; msg++)
				{
					var _errorMsgPart = doc.getElementsByName(trimString(a_errorMsgField[msg]))[0];

					if(a_errorMsgField[msg] == "nomsg")
					{
						errorMsgPart[msg] = "nomsg";
						continue;
					}
					
					if(typeof(_errorMsgPart) == "undefined")
					{
						errorMsgField = "none";
						break;
					}
					else
					{
						errorMsgPart[msg] = _errorMsgPart.value;
					}
				}
			}
			catch(e) {};
		}

		var fieldName 		= valField.value;
		var field			= doc.getElementsByName(fieldName)[0];
		var fieldValue		= trimString(field.value);
		var fieldTagName	= field.tagName;
		var fieldStatus		= field.getAttribute("disabled", "false");

		if(fieldStatus == true) continue;

		if(fieldTagName == "INPUT")
		{
			fieldTagName = fieldTagName + "_" + field.getAttribute("type", "false");
		}

		fieldTagName = fieldTagName.toLowerCase();

		if(fieldTagName == "select")
		{
			var l = field.parentNode.parentNode.childNodes.length;

			for(x = l-1; x >= 0; x--)
			{
				var errorField = field.parentNode.parentNode.childNodes[x];

				if(errorField.tagName == "TD") break;
			}
		}
		else
		{
			var errorField = field.parentNode;
		}

		if(valType != "custom")
		{
			if(valType != "none")
			{
				var validation = defaultValidation(valType, fieldTagName, fieldValue, dependValue, fieldName, 0);
			}
			else
			{
				var validation = true;
			}
		}
		else
		{
			var valFunc 	= valField.className;
			var validation 	= eval(valFunc);
		}

		validation = String(validation);

		var failed = false;
		
		if(validation.indexOf("failed") != -1)
		{
			var failed = true;
			var _error		= validation.split("_");
			var errorNumber	= parseInt(_error[1]);

			if(valDepend != "none")
			{
				var dependValidation = defaultValidation(valType, dependTagName, dependValue, fieldValue, fieldName, 1);

				dependValidation = String(dependValidation);

				if(dependCond[errorNumber] == 1 && dependValidation.indexOf("failed") == -1) continue;
				if(dependCond[errorNumber] == 0 && dependValidation.indexOf("failed") != -1) continue;
			}

			var error = true;

			if(typeof(remField) == "undefined") var remField = field;

			try
			{
				var isError = doc.getElementById("validate_error_" + i);

				if(isError == null && fieldTagName != "input_checkbox" && fieldTagName != "input_radio"
				&& fieldName.indexOf("date") == -1)
				{
					var errorElement 	= doc.createElement("span");
					var errorData 		= doc.createTextNode("*");
									
					var errorId			= doc.createAttribute("id");

					errorId.nodeValue 	= "validate_error_" + i;

					//null-Abprüfung wegen div-Feld ergänzt (04.01.2006)
					if(errorField.getAttribute('width', 'false') != "" && errorField.getAttribute('width', 'false') != null)
					{
						var errorWidth = errorField.getAttribute("width", "false");

						var errorStyle = doc.createAttribute("style");

						//errorStyle.nodeValue	= "position:absolute;left:" + eval(errorWidth + "+5") +"px;top:2px;";
						//errorElement.setAttributeNode(errorStyle);
					}
				
					errorElement.setAttributeNode(errorId);
					errorElement.appendChild(errorData);
					errorElement.style.color = '#FF3333';
					errorElement.style.marginLeft = '3px';
					
					if(errorField.childNodes[errorField.childNodes.length-1].getAttribute("id") != null)
					{
						if(errorField.childNodes[errorField.childNodes.length-1].getAttribute("id").indexOf("validate_error") != -1)
						{
							errorElement.style.display = 'none';	//Falls schon ein * in der Zeile vorhanden ist
						}
					}
					
					errorField.appendChild(errorElement);
				}
				else
				{
					delete(isError);
				}
			}
			catch(e) {};
		}
		else
		{
			try
			{
				var isError = doc.getElementById("validate_error_" + i);

				errorField.removeChild(isError);
				
				//ausgeblendete Fehler (*) auf selber Zeile einblenden
				var nextError = doc.getElementById("validate_error_" + (i+1));
				
				if(typeof(nextError) != "undefined")
				{
					if(nextError.style.display == "none")
					{
						nextError.style.display = 'inline';
					}	
				}								
			}
			catch(e) {};

			errorMsgPart[errorNumber] = '';
		}

		//Meldungen nur im Fehlerfall verarbeiten
		if(failed == true)
		{
			//keine Meldung erwünscht
			if(errorMsgField == "nomsg" || errorMsgPart[errorNumber] == "nomsg")
			{
				continue;
			}
			
			if(typeof(errorMsg) != "undefined" && errorMsg.indexOf(errorMsgPart[errorNumber]) != -1)
			{
				errorMsgPart[errorNumber] = '';
			}
	
			while(typeof(errorMsgPart[errorNumber]) == "undefined")
			{
				if(errorNumber == 0)
				{
					errorMsgField = "none";
					break;
				}
	
				errorNumber--;
			}
	
			//alert("A:" + i + ":" + valId + " - " + errorMsg + " T: " + typeof(errorMsg) + " M: " + errorMsgField);
			
			var errorMsg = errorMsgField != "none"
			? ((typeof(errorMsg) != "undefined") ? (errorMsg + "\n") : '') + errorMsgPart[errorNumber]
			: "default_msg";
			
			//alert("B:" + i + ":" + valId + " - "  + errorMsg + " T: " + typeof(errorMsg) + " M: " + errorMsgField);
	
			errorMsg = trimString(errorMsg);
		}
	}

	if(error == true)
	{
		if(typeof(errorMsg) != "undefined")
		{
			if(errorMsg.indexOf("default_msg") != -1)
			{
				alert("Einige Felder wurden falsch bzw. nicht oder nur unvollständig ausgefüllt!");
			}
			else
			{
				alert(errorMsg);
			}
		}

		remField.focus();
		return false;
	}

	if(checkableValues == 1)
	{
		setCheckableValues(formName, 0);
	}

	if(submit == true) document.forms[0].submit();

	return true;
}

function defaultValidation(valType, fieldTagName, fieldValue, fieldValue2, fieldName, dep)
{
	var a_valType = valType.split(",");

	var vT = '';

	for(vT = 0; vT < a_valType.length; vT++)
	{
		//Prüfung auf leer
		if((a_valType[vT].indexOf("empty") != -1)			//Fehler, wenn leer
		|| (a_valType[vT].indexOf("empty_valid") != -1))	//Leer erwünscht, weitere Tests überspringen
		{
			switch(fieldTagName)
			{
				case "input_text":
				case "input_file":
				case "input_password":
				case "textarea":	var valCondition 	= "";  	break;

				case "select":		var valCondition 	= 0;	break;
			}

			if(fieldValue == valCondition)
			{
				if(a_valType[vT].indexOf("empty_valid") != -1)
				{
					break;
				}
				else
				{
					return "failed_" + vT;		
				}
			}			
		}
		
		if(a_valType[vT].indexOf("mail") != -1) //Mail-Adresse
		{
			var regex = /^([a-zA-Z0-9][a-zA-Z0-9_.-]*)\@([a-zA-Z0-9]([a-zA-Z0-9_.-]*)\.)*([a-zA-Z0-9][a-zA-Z0-9_.-]*\.)[a-zA-Z]{2,4}$/;

			if(fieldValue.search(regex) == -1 && fieldValue != '')
			{
				return "failed_" + vT;
			}
		}

		if(a_valType[vT].indexOf("length") != -1) //Zeichenlänge
		{
			var tmp 		= a_valType[vT].split("_");

			var length_wanted 	= tmp[1];
			var length_given	= fieldValue.length;

			if(length_given < length_wanted) return "failed_" + vT;
		}

		if(a_valType[vT].indexOf("isnan") != -1) //Überprüfung ob gültige Zahl
		{
			if(isNaN(fieldValue))
			{
				return "failed_" + vT;
			}
			else
			{
				var tmp = a_valType[vT].split("_");

				if(!eval(fieldValue + tmp[1]))
				{
					return "failed_" + vT;
				}
			}

		}

		if(a_valType[vT].indexOf("equal") != -1) //Vergleich zweier Felder
		{
			if(fieldValue != fieldValue2) return "failed_" + vT;
		}

		if(a_valType[vT].indexOf("ext") != -1) //Dateiendung
		{
			var tmp 		= a_valType[vT].split("_");

			var ext_wanted 	= tmp[1];
			var ext_given	= fieldValue.substring((fieldValue.lastIndexOf(".") + 1), fieldValue.length);

			ext_given = ext_given.toLowerCase();

			if(ext_given != ext_wanted && fieldValue != '') return "failed_" + vT;
		}

		if(a_valType[vT].indexOf("check") != -1) //Checkbox (-Array)
		{
			var chkField = doc.getElementsByName(fieldName);

			var i = 0;

			for(i=0; i < chkField.length; i++)
			{
				if(chkField[i].checked == true)
				{
					return true;
					break;
				}
			}

			return "failed_" + vT;
		}

		if(a_valType[vT].indexOf("date_valid") != -1 && dep == 0) //Datumgültigkeit / -formatierung
		{
			if(fieldValue != "")
			{
				var chkDate = check_date(fieldValue, fieldName);

				if(chkDate == false)
				{
					return "failed_" + vT;
				}
			}
		}

		if(a_valType[vT].indexOf("date_compare") != -1) //Datumvergleich
		{
			if(fieldValue != "" && fieldValue2 != "")
			{
				var dst_format = "yyyy-MM-dd HH:mm:ss";

				var datecompare = compareDates(fieldValue, dst_format, fieldValue2, dst_format);

				if(datecompare != 1) return "failed_" + vT;
			}
		}
	}

	return true;
}

function check_date(val, name)
{
	var my_date = trimString(val);

	if(my_date != "")
	{
		var regex = /^([0-9.]*)$/;

		if(my_date.search(regex) == -1)
		{
			return false;
		}
		else
		{
			var date_split = my_date.split(".");

			switch(date_split.length)
			{
				case 1:	var src_format = "d"; break;
				case 2:	
				
				if(date_split[1] == "")
				{
					var src_format = "d";
					my_date = date_split[0];
				}
				else
				{
					var src_format = "d.M";
				}
								
				break;
				
				case 3:	var src_format = date_split[2] == "" ? "d.M." : "d.M.y"; break;
				default : return false;
			}

			var datecheck = isDate(my_date, src_format);

			if(datecheck == true)
			{
				var dst_format = "dd.MM.yyyy";

				my_date = formatDate(new Date(getDateFromFormat(my_date, src_format)), dst_format);
				
				if(typeof(doc) == "undefined")
				{
					document.getElementsByName(name)[0].value = my_date;
				}
				else
				{
					doc.getElementsByName(name)[0].value = my_date;
				}
			}
			else
			{
				if(typeof(doc) == "undefined")
				{
					document.getElementsByName(name)[0].value = '';
				}
				else
				{
					doc.getElementsByName(name)[0].value = '';
				}

				return false;
			}
		}

	}

	return true;
}

function check_time(val, name)
{
	var my_time = trimString(val);

	if(my_time != "")
	{
		var regex = /^([0-9.:]*)$/;

		if(my_time.search(regex) == -1)
		{
			return false;
		}
		else
		{
			my_time = my_time.replace(/\./, ":");

			var time_split = my_time.split(":");

			switch(time_split.length)
			{
				case 1:	var src_format = "H"; break;
				case 2:	var src_format = time_split[1] == "" ? "H" : "H:m"; break;
				default : return false;
			}

			var timecheck = isDate(my_time, src_format);

			if(timecheck == true)
			{
				var dst_format = src_format == "H" ? "HH:00" : "HH:mm";

				my_time = formatDate(new Date(getDateFromFormat(my_time, src_format)), dst_format);

				if(typeof(doc) == "undefined")
				{
					document.getElementsByName(name)[0].value = my_time;
				}
				else
				{
					doc.getElementsByName(name)[0].value = my_time;
				}
			}
			else
			{
				if(typeof(doc) == "undefined")
				{
					document.getElementsByName(name)[0].value = '';
				}
				else
				{
					doc.getElementsByName(name)[0].value = '';
				}

				return false;
			}
		}
	}

	return true;
}

function clearErrors()
{
	try
	{
		var vf = document.getElementsByName('validate_field').length;

		for(i = 0; i < vf; i++)
		{
			var isError = document.getElementById("validate_error_" + i);

			isError.parentNode.removeChild(isError);
		}
	}
	catch(e) {};
}
