// ***********************
// Copyright by GardenaNet
// ***********************
// info@gardena.net
// ***********************
// Coded by Andreas on 15-11-2006
// last change on 25-09-2007 - now v.1.3.1
// ***********************

// Array mit Fehlerausgaben in allen 3 Sprachen
var messages4output = new Array();
messages4output['firstname'] = new Array();
messages4output['firstname']['deu'] = 'Geben Sie bitte Namen und Nachnamen ein!';
messages4output['firstname']['ita'] = 'Per cortesia inserisca il Suo nome e cognome corretto!';
messages4output['firstname']['eng'] = 'Please insert your name and surname!';
messages4output['firstname']['fra'] = 'Svp insertion votre nom!';
messages4output['surname'] = new Array();
messages4output['surname']['deu'] = 'Geben Sie bitte Ihren Nachnamen ein!';
messages4output['surname']['ita'] = 'Per cortesia inserisca il Suo cognome corretto!';
messages4output['surname']['eng'] = 'Please insert your surname!';
messages4output['surname']['fra'] = 'Svp insertion votre nom de famille!';
messages4output['street'] = new Array();
messages4output['street']['deu'] = 'Geben Sie bitte Ihre Straße ein!';
messages4output['street']['ita'] = 'Per cortesia inserisca la Suo via corretta!';
messages4output['street']['eng'] = 'Please insert your address!';
messages4output['street']['fra'] = 'Svp insertion votre rue!';
messages4output['cap'] = new Array();
messages4output['cap']['deu'] = 'Geben Sie bitte Ihre Postleitzahl ein!';
messages4output['cap']['ita'] = 'Per cortesia inserisca il Suo C.A.P. corretto!';
messages4output['cap']['eng'] = 'Please insert your post code!';
messages4output['cap']['fra'] = 'Svp insertion votre PLZ!';
messages4output['location'] = new Array();
messages4output['location']['deu'] = 'Geben Sie bitte Ihren Ort ein!';
messages4output['location']['ita'] = 'Per cortesia inserisca la Sua città corretta!';
messages4output['location']['eng'] = 'Please insert your town/city!';
messages4output['location']['fra'] = 'Svp insertion votre ville!';
messages4output['country'] = new Array();
messages4output['country']['deu'] = 'Geben Sie bitte Ihr Land ein!';
messages4output['country']['ita'] = 'Per cortesia inserisca la Sua provincia corretta!';
messages4output['country']['eng'] = 'Please insert your country!';
messages4output['country']['fra'] = 'Svp insertion votre Région!';
messages4output['email'] = new Array();
messages4output['email']['deu'] = 'Geben Sie bitte eine gültige E-Mail Adresse ein!';
messages4output['email']['ita'] = 'Per cortesia inserisca un indirizzo email valido!';
messages4output['email']['eng'] = 'Please insert a valid e-mail address!';
messages4output['email']['fra'] = "Veuillez insérer une adresse valide d'E-mail!";
messages4output['phone'] = new Array();
messages4output['phone']['deu'] = 'Geben Sie bitte eine gültige Telefonnummer ein!';
messages4output['phone']['ita'] = 'Per cortesia inserisca un recapito telefonico valido!';
messages4output['phone']['eng'] = 'Please insert a valid phone number!';
messages4output['phone']['fra'] = 'Indiquez votre nombre de téléphone!';
messages4output['fax'] = new Array();
messages4output['fax']['deu'] = 'Geben Sie bitte eine gültige Faxnummer ein!';
messages4output['fax']['ita'] = 'Per cortesia inserisca un recapito fax valido!';
messages4output['fax']['eng'] = 'Please insert a valid fax number!';
messages4output['fax']['fra'] = 'Indiquez votre nombre de fax!';
messages4output['kidsage'] = new Array();
messages4output['kidsage']['deu'] = 'Geben Sie bitte das Alter der Kinder ein!';
messages4output['kidsage']['ita'] = 'Per cortesia inserisca l\'età dei bambini!';
messages4output['kidsage']['eng'] = 'Please insert the age of children!';
messages4output['conditions'] = new Array();
messages4output['conditions']['deu'] = 'Dieser Antrag kann nicht abgesendet werden ohne Ihre Bestätigung, die Mitteilung zum Datenschutz gelesen zu haben!';
messages4output['conditions']['ita'] = 'La richiesta non può essere spedita senza la Sua conferma di aver letto e accettato l\'informativa sulla tutela della privacy!';
messages4output['conditions']['eng'] = 'This request cannot be submitted without your confirmation that you have read the information on data protection!';
messages4output['conditions']['fra'] = 'La demande ne peut pas être envoyée sans votre déclaration d´avoir lu et accepté les informations sur la tutelle de la privacy.';
messages4output['accomodation'] = new Array();
messages4output['accomodation']['deu'] = 'Geben Sie bitte Ihre Unterkunft ein!';
messages4output['accomodation']['ita'] = 'Per cortesia inserisca il nome del Suo alloggio!';
messages4output['accomodation']['eng'] = 'Please insert the name of your accomodation!';
messages4output['age'] = new Array();
messages4output['age']['deu'] = 'Geben Sie bitte Ihr Alter ein!';
messages4output['age']['ita'] = 'Per cortesia inserisca la Sua età!';
messages4output['age']['eng'] = 'Please insert your age!';
messages4output['arrival'] = new Array();
messages4output['arrival']['deu'] = 'Geben Sie bitte das Startdatum im Format TT/MM/JJ ein!';
messages4output['arrival']['ita'] = 'Per cortesia inserisca la data di inizio durata nel formato GG/MM/AA!';
messages4output['arrival']['eng'] = 'Please insert the start date in the format DD/MM/YY!';
messages4output['departure'] = new Array();
messages4output['departure']['deu'] = 'Geben Sie bitte das Enddatum im Format TT/MM/JJ ein!';
messages4output['departure']['ita'] = 'Per cortesia inserisca la data di fine durata nel formato GG/MM/AA!';
messages4output['departure']['eng'] = 'Please insert the end date in the format DD/MM/YY!';
messages4output['days'] = new Array();
messages4output['days']['deu'] = 'Geben Sie bitte die Anzahl Tage zwischen 1 und 14 ein!';
messages4output['days']['ita'] = 'Per cortesia inserisca un numero di giorni da 1 a 14!';
messages4output['days']['eng'] = 'Please insert the number of days between 1 and 14!';
messages4output['height'] = new Array();
messages4output['height']['deu'] = 'Geben Sie bitte Ihre Höhe in cm ein!';
messages4output['height']['ita'] = 'Per cortesia inserisca la Sua altezza in cm!';
messages4output['height']['eng'] = 'Please insert your height in cm!';
messages4output['weight'] = new Array();
messages4output['weight']['deu'] = 'Geben Sie bitte Ihr Gewicht in kg ein!';
messages4output['weight']['ita'] = 'Per cortesia inserisca il Suo peso in kg!';
messages4output['weight']['eng'] = 'Please insert your weight in kg!';
messages4output['shoesize'] = new Array();
messages4output['shoesize']['deu'] = 'Geben Sie bitte Ihre Schuhnummer!';
messages4output['shoesize']['ita'] = 'Per cortesia inserisca il Suo numero di piedi!';
messages4output['shoesize']['eng'] = 'Please insert your shoe size!';


// 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']	= /.+/; 
patterns['name2']	= /.+ .+/;

// 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';
	}
	for (var nr in fields2check)
	{
		if (nr.length > 2 || typeof(fields2check[nr]) != 'object')
		{
			continue;
		}
		var field = parse_field(fields2check[nr]);
		var result = true;
		for (var o = 0; o < field.name.length; o++)
		{
			var object = document.getElementsByName(field.name[o])[0];
			if (!object)
			{
				alert('A required field is not existing, form can\'t be sent!');
				return false;
			}
			var thisresult = check(object, field.type, field.specs);
			if (thisresult == false)
			{
				result = false;
			}
		}
		if (result == false)
		{
			return process(field.name.join('_'), 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] = '';
	return {name:  field[0].split(';'), type: field[1], specs: field[2]};
}

// Funktion zum prüfen einer Variable
function check(obj, type, specs)
{
	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 '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 '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)
{
	// 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';
	}
	// prüfen ob die Ausgabe definiert wurde
	if (typeof(messages4output[name]) == 'undefined')
	{
		alert('Message not defined: '+name+', '+lang);
		return false;
	}
	else if (typeof(messages4output[name][lang]) != 'undefined' && !empty(messages4output[name][lang]))
	{
		alert(messages4output[name][lang]);
	}
	else
	{
		alert(messages4output[name]);
	}
	
	name = name.split('_');
	name = name[0];
	var object = document.getElementsByName(name)[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)
{
	var formobj = document.getElementById(formobjid);
	if (!formobj || typeof(fields2check) != 'object' || empty(fields2check)) return;
	var first_call = false;
	if (!checking_fields[formobjid])
	{
		parse_title();
		checking_fields[formobjid] = new Array();
		var allobjs = formobj.getElementsByTagName('*');
		for (var i = 0; i < allobjs.length; i += 1)
		{
			var title = allobjs[i].content;
			if (allobjs[i].content && allobjs[i].tagName.toLowerCase() != 'label' && document.getElementById(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;
	}
	
	for (var nr in fields2check)
	{
		if (nr.length > 2 || typeof(fields2check[nr]) != 'object')
		{
			continue;
		}
		var field = parse_field(fields2check[nr]);
		var result = true;
		for (var o = 0; o < field.name.length; o++)
		{
			var object = document.getElementsByName(field.name[o])[0];
			if (!object)
			{
				return false;
			}
			var thisresult = check(object, field.type, field.specs);
			if (thisresult == false)
			{
				result = false;
			}
		}
		var objs = checking_fields[formobjid][field.name]
		if (!objs) continue;
		for (var i = 0; i < objs.length; i += 1)
		{
			if (result == false)
			{
				objs[i].className = 'error';
			}
			else
			{
				objs[i].className = '';
			}
		}
		
		if (first_call)
		{
			var obj = document.getElementById(field.name);
			if (obj)
			{
				if (typeof(obj.onchange) == 'function')
				{
					var objfunction = obj.onchange;
					obj.onchange = function(){objfunction();check_fields(formobjid);}
				}
				else
				{
					obj.onchange = function(){check_fields(formobjid);}
				}
			}
		}
	}
}

// Funktion zum entfernen der title-Attribute
function parse_title(objid)
{
	var formobj = document.getElementById(objid);
	if (!formobj)
	{
		var formobjs = document.getElementsByTagName('form');
	}
	else
	{
		var formobjs = new Array(formobj);
	}
	for (var i = 0; i < formobjs.length; i += 1)
	{
		var objs = formobjs[i].getElementsByTagName('*');
		for (var a = 0; a < objs.length; a += 1)
		{
			if (objs[a].title)
			{
				objs[a].content = objs[a].title;
				objs[a].title = '';
			}
		}
	}
}
