// Copyright by GardenaNet

// Array, in dem die Werte beschrieben werden, die geprüft werden sollen
var fields2check = new Array();

// Muster zum Vergleich definieren
var patterns = new Object();
patterns['name']	= /[A-Za-z0-9äöüÄÖÜß]+/; 
patterns['name2']	= /.+ .+/;
patterns['number']	= /[0-9]+/;

var errorClassName = 'error';

// Funktion zum auswerten von Formularen anhand des Arrays fields2check
function validate()
{
	// prüfen ob das Definitions-Array exisitert
	if (typeof(fields2check) == 'undefined' || empty(fields2check))
	{
		alert('The array of definitions is not defined!');
		return false;
	}
	
	// prüfen ob die Sprache definiert ist
	if (typeof(lang) == 'undefined' || empty(lang))
	{
		lang = 'eng';
	}
	var tocheck = true;
	var result = true;
	errorClassName = 'forceerror';
	for (var i = 0; i < fields2check.length; i += 1)
	{
		if (typeof(fields2check[i]) != 'object' || !fields2check[i].length)
		{
			continue;
		}
		var field = parse_field(fields2check[i]);
		var thisresult = false;
		for (var o = 0; o < field.name.length; o++)
		{
			var object = document.getElementById(field.name[o]);
			if (!object)
			{
				var object = document.getElementsByName(field.name[o])[0];
			}
			if (!object)
			{
				alert("A required field is not existing, form can't be sent!");
				return false;
			}
			if (check(object, field.type, field.specs)) thisresult = true;
		}
		if (!thisresult)
		{
			object.parentNode.parentNode.className = errorClassName;
			if (tocheck)
			{
				result = false;
				tocheck = false;
				var field_name = field.name.join('_');
			}
		}
		else
		{
			object.parentNode.parentNode.className = '';
		}
	}
	if (result == false)
	{
		return process(field_name, lang);
	}
	return true;
}

// Funktion zum parsen eines fields2check Feldes
function parse_field(field)
{
	if (typeof(field) != 'object')
	{
		return false;
	}
	if (typeof(field[2]) == 'undefined') field[2] = '';
	var names = field[0].split(';');
	if (names.length == 1 && !document.getElementById(names[0]))
	{
		var name = names[0];
		names = new Array();
		for (var i = 1; document.getElementById(name+i); i += 1)
		{
			names[names.length] = name+i;
		}
	}
	return {name:  names, type: field[1], specs: field[2]};
}

// Funktion zum prüfen einer Variable
function check(obj, type, specs)
{
	if (obj.value == undefined)
	{
		alert('Error: object.id is not a form element!');
		return false;
	}
	var string = obj.value;
	switch (type)
	{
		case 'string':
			if (string == '')
			{
				return false;
			}
			if (specs != '')
			{
				specs = specs.split(';');
				if (string.length < specs[0])
				{
					return false;
				}
				if (typeof(specs[1]) != 'undefined' && !empty(specs[1]))
				{
					var number = parseInt(specs[1]);
					if (isFinite(number))
					{
						if (string.length > number)
						{
							return false;
						}
					}
					else
					{
						var pattern = specs[1];
						if (typeof(patterns[pattern]) != 'undefined' && !empty(patterns[pattern]))
						{
							var expression = patterns[pattern]; 
							if (!expression.test(string))
							{
								return false;
							}
						}
					}
				}
			}
			break;
		case 'date':
			if (string == '')
			{
				return false;
			}
			string = string.split('.');
			if (string.length != 3) return false;
			if (string[0].substr(0, 1) == '0') string[0] = string[0].substr(1);
			string[0] = parseInt(string[0]);
			if (string[1].substr(0, 1) == '0') string[1] = string[1].substr(1);
			string[1] = parseInt(string[1]);
			string[2] = parseInt(string[2]);
			var now = new Date();
			if (isNaN(string[0]) || string[0] < 1 || string[0] > 31 ||
				isNaN(string[1]) || string[1] < 1 || string[1] > 12 ||
				isNaN(string[2]) || string[2] < 1900 || string[2] > now.getFullYear())
			{
				// eventutell auch Format überprüfen (Jahr kann auch nur 2 Stellen haben)
				return false;
			}
			break;
		case 'email':
			if (!checkemail(string))
			{
				return false;
			}
			break;
		
		case 'enum':
			if (specs != '')
			{
				specs = specs.split(';');
				var found = false;
				for (var i = 0; i < specs.length; i += 1)
				{
					if (string == spec[i])
					{
						found = true;
					}
				}
				if (found == false)
				{
					return false;
				}
			}
			break;
			
		case 'checkbox':
			if (!obj.checked)
			{
				return false;
			}
			break;
		
		case 'radio':
			var objs = document.getElementsByName(obj.name);
			var result = false;
			for (var i = 0; i < objs.length; i += 1)
			{
				if (objs[i].checked) result = true;
			}
			return result;
			break;
		
		case 'number':
			string = string.replace(/[,]/gi, '.');
			var number = parseFloat(string);
			if (!isFinite(number))
			{
				return false;
			}
			if (specs != '')
			{
				specs = specs.split(';');
				if (number > parseFloat(specs[0]))
				{
					return false;
				}
				if (typeof(specs[1]) != 'undefined' && !empty(specs[1]))
				{
					if (number < parseFloat(specs[1]))
					{
						return false;
					}
				}
			}
			break;
		
		case 'integer':
			var number = parseInt(string);
			if (!isFinite(number))
			{
				return false;
			}
			if (specs != '')
			{
				specs = specs.split(';');
				if (number > parseInt(specs[0]))
				{
					return false;
				}
				if (typeof(specs[1]) != 'undefined' && !empty(specs[1]))
				{
					if (number < parseInt(specs[1]))
					{
						return false;
					}
				}
			}
			break;
			
		case 'date':
			if (!check_date(string, specs, true))
			{
				return false;
			}
			break;
			
		default:
			alert('Type for check function not known!');
			return false;
	}
	return true;
}

// Funktion die ausgeführt wird wenn das Formular nicht verschickt werden darf
function process(name, lang)
{
	var nativename = name;
	// prüfen ob das Definitions-Array exisitert
	if (typeof(fields2check) == 'undefined' || empty(fields2check))
	{
		alert('The array of definitions is not defined!');
		return false;
	}
	// prüfen der übergebenen Werte
	if (typeof(name) == 'undefined' || empty(name))
	{
		alert('Empty names can\' be processed!');
		return false;	
	}
	if (typeof(lang) == 'undefined' || empty(lang))
	{
		lang = 'eng';
	}
	nativename = nativename.split('_')[0];
	var object = document.getElementsByName(nativename)[0];
	if (object)
	{
		object.focus();
	}
	return false;
}

// Funktion zum überprüfen ob eine Variable leer ist
function empty(value, name)
{
	if (typeof(value) === 'undefined' ||
		value === null ||
		value === 0 ||
		value === '' ||
		(typeof(value) === 'object' && value.length == 0))
	{
		return true;
	}
	return false;
}

// überprüfen ob es sich um eine gültige e-mail Adresse handelt
function checkemail(email)
{
	var expression = /^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9äöüÄÖÜ]+)(([\.\-]?[a-zA-Z0-9äöüÄÖÜ]+)*)\.([A-Za-z]{2,})$/; 
	return expression.test(email); 
}

// Funktion zum prüfen des unterschieds eines Datums mit jetzt
function check_date(date, difference, strict)
{
	if (!date)
	{
		return false;
	}
	date = date.split('/');
	if (date.length != 3)
	{
		return false;
	}
	date[0] = parseInt(date[0]);
	date[1] = parseInt(date[1]);
	date[2] = parseInt(date[2]);
	if (isNaN(date[0]) || !isFinite(date[0]) || date[0] < 1 || date[0] > 31)
	{
		return false;
	}
	if (isNaN(date[1]) || !isFinite(date[1]) || date[1] < 1 || date[1] > 12)
	{
		return false;
	}
	if (date[2] > 100)
	{
		if (date[2] < 1970 || date[2] > 2100)
		{
			return false;
		}
	}
	else
	{
		if (isNaN(date[2]) || !isFinite(date[2]) || date[2] < 0 || date[2] > 99)
		{
			return false;
		}
	}
	return true;
}

// Funktion zum parsen einer Datumsangabe aus einem string
function get_date_from_string(datestring)
{
	if (typeof datestring != 'string' || datestring == '')
	{
		return false;
	}
	var value = datestring.split('/');
	if (value.length != 3)
	{
		return false;
	}
	if (value[0].substr(0,1) == '0')
	{
		var day = parseInt(value[0].substr(1, 1));
	}
	else
	{
		var day = parseInt(value[0]);
	}
	if (!isFinite(day) || day < 1 || day > 31)
	{
		return false;
	}
	if (value[1].substr(0, 1) == '0')
	{
		var month = parseInt(value[1].substr(1, 1)) - 1;
	}
	else
	{
		var month = parseInt(value[1]) - 1;
	}
	if (!isFinite(month) || month < 0 || month > 11)
	{
		return false;
	}
	var year = parseInt(value[2]);
	if (year < 1900 || year > 3000)
	{
		return false;
	}
	return new Date(year, month, day);
}

// Funktion zum ändern der required Felder bei Formularen
function set_isrequired(field, type, isrequired)
{
	var found = false;
	for (var nr in fields2check)
	{
		if (typeof(fields2check[nr]) == 'object' && fields2check[nr][0] == field)
		{
			if (isrequired == false)
			{
				fields2check[nr] = '';
				break;
			}
			else
			{
				found = true;
			}
		}
	}
	if (isrequired == true && found == false)
	{
		for (var nr = 0; typeof(fields2check[nr]) == 'object'; nr = nr + 1) {}
		fields2check[nr] = new Array(field, type);
	}
	var labels = document.getElementsByTagName('LABEL');
	for (var nr in labels)
	{
		var label = document.getElementsByTagName('LABEL')[nr];
		if (label.content == field)
		{
			var label_content = label.innerHTML.replace(/<strong>/i, "")
			label_content = label_content.replace(/<\/strong>/i, "")
			if (isrequired == true)
			{
				label.innerHTML = '<strong>'+label_content+'</strong>';
			}
			else
			{
				label.innerHTML = label_content;
			}
		}
	}
}

// Funktion zum setzen der Fehler-Prüfung direkt bei der Eingabe
var checking_fields = new Array();
function check_fields(formobjid, current_obj)
{
	var formobj = document.getElementById(formobjid);
	if (!formobj || typeof(fields2check) != 'object' || empty(fields2check)) return;
	var first_call = false;
	if (!checking_fields[formobjid])
	{
		checking_fields[formobjid] = new Array();
		var allobjs = formobj.getElementsByTagName('*');
		for (var i = 0; i < allobjs.length; i += 1)
		{
			var title = allobjs[i].title;
			if (allobjs[i].title && allobjs[i].tagName.toLowerCase() != 'label' && (document.getElementById(title) || document.getElementsByName(title)))
			{
				if (!checking_fields[formobjid][title])
				{
					checking_fields[formobjid][title] = new Array();
				}
				var length = checking_fields[formobjid][title].length;
				checking_fields[formobjid][title][length] = allobjs[i];
			}
		}
		first_call = true;
	}
	if (current_obj == undefined)
	{
		var fields_to_check = fields2check;
	}
	else
	{
		var fields_to_check = new Array();
		for (var nr in fields2check)
		{
			if (typeof(fields2check[nr]) != 'object')
			{
				continue;
			}
			var fields = fields2check[nr][0].split(';');
			for (var i in fields)
			{
				if (fields[i] == current_obj.name || fields[i] == current_obj.id)
				{
					fields_to_check[0] = fields2check[nr];
				}
			}
		}
	}
	for (var nr in fields_to_check)
	{
		if (typeof(fields_to_check[nr]) != 'object' || !fields_to_check[nr].length)
		{
			continue;
		}
		var field = parse_field(fields_to_check[nr]);
		var result = false;
		for (var o = 0; o < field.name.length; o++)
		{
			var object = document.getElementById(field.name[o]);
			if (!object)
			{
				var object = document.getElementsByName(field.name[o])[0];
			}
			var object = document.getElementsByName(field.name[o])[0];
			if (!object)
			{
				return false;
			}
			var thisresult = check(object, field.type, field.specs);
			if (thisresult)
			{
				result = true;
			}
		}
		var objs = checking_fields[formobjid][field.name[0]];
		for (var i in objs)
		{
			if (result == false)
			{
				if (objs[i] && objs[i].parentNode && typeof(objs[i].parentNode) == 'object')
				{
					objs[i].parentNode.className = errorClassName;
				}
				else
				{
					objs[i].className = errorClassName;
				}
			}
			else
			{
				if (objs[i] && objs[i].parentNode && typeof(objs[i].parentNode) == 'object')
				{
					objs[i].parentNode.className = '';
				}
				else
				{
					objs[i].className = '';
				}
			}
		}
		
		if (first_call)
		{
			for (var j in field.name)
			{
				var obj = document.getElementById(field.name[j]);
				if (!obj)
				{
					var obj = document.getElementsByName(field.name[j])[0];
				}
				if (!obj)
				{
					continue;
				}
				if (obj.tagName.toLowerCase() == 'input')
				{
					var objs = new Array(obj);
				}
				else
				{
					var objs = obj.getElementsByName(field.name[j]);
				}
				for (var i = 0; i < objs.length; i += 1)
				{
					var obj = objs[i];
					if (typeof(obj.onclick) == 'function')
					{
						if (!objfunction) var objfunction = new Array();
						objfunction[obj.id] = obj.onclick;
						obj.onclick = function(){objfunction[this.id]();check_fields(formobjid, this);}
					}
					else
					{
						obj.onclick = function(){check_fields(formobjid, this);}
					}
					obj.onkeyup = function(){check_fields(formobjid, this);}
				}
			}
		}
	}
}
