// ***********************
// 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 Ihren Namen ein!';
messages4output['firstname']['ita'] = 'Per cortesia inserisca il Suo nome corretto!';
messages4output['firstname']['eng'] = 'Please insert your name!';
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['address'] = new Array();
messages4output['address']['deu'] = 'Geben Sie bitte Ihre Straße ein!';
messages4output['address']['ita'] = 'Per cortesia inserisca la Suo via corretta!';
messages4output['address']['eng'] = 'Please insert your address!';
messages4output['address']['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['city'] = new Array();
messages4output['city']['deu'] = 'Geben Sie bitte Ihren Ort ein!';
messages4output['city']['ita'] = 'Per cortesia inserisca la Sua città corretta!';
messages4output['city']['eng'] = 'Please insert your town/city!';
messages4output['city']['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['betrag'] = new Array();
messages4output['betrag']['deu'] = 'Geben Sie einen Betrag in Euro an!';
messages4output['betrag']['ita'] = 'Indicate per favore l\'importo del buono!';
messages4output['betrag']['eng'] = 'Please insert the amount of the gift voucher!';
messages4output['birthdate'] = new Array();
messages4output['birthdate']['deu'] = 'Geben Sie bitte Ihr Geburtsdatum ein!';
messages4output['birthdate']['ita'] = 'Per cortesia inserisca la Sua data di nascita!';
messages4output['birthdate']['eng'] = 'Please insert your date of birth!';

// 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]+/;

// 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)
{
	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 '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':
			if (obj.tagName.toLowerCase() == 'input' && obj.name && document.getElementById(obj.name))
			{
				var obj = document.getElementById(obj.name);
			}
			var objs = obj.getElementsByTagName('input');
			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';
	}
	// prüfen ob die Ausgabe definiert wurde
	if (typeof(messages4output[name]) == 'undefined')
	{
		name = name.replace(/\d+/, '');
	}
	if (typeof(messages4output[name]) == 'undefined')
	{
		alert('Please enter a value in field '+name);
	}
	else if (typeof(messages4output[name][lang]) != 'undefined' && !empty(messages4output[name][lang]))
	{
		alert(messages4output[name][lang]);
	}
	else
	{
		alert(messages4output[name]);
	}
	
	nativename = nativename.split('_');
	nativename = nativename[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))
			{
				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;
			}
			if (fields2check[nr][0] == current_obj.name)
			{
				fields_to_check[0] = fields2check[nr];
			}
		}
	}
	for (var nr in fields_to_check)
	{
		if (typeof(fields_to_check[nr]) != 'object')
		{
			continue;
		}
		var field = parse_field(fields_to_check[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]
		for (var i in objs)
		{
			if (result == false)
			{
				objs[i].className = 'error';
			}
			else
			{
				objs[i].className = '';
			}
		}
		
		if (first_call)
		{
			var obj = document.getElementById(field.name);
			if (obj.tagName.toLowerCase() == 'input')
			{
				var objs = new Array(obj);
			}
			else
			{
				var objs = obj.getElementsByTagName('input');
			}
			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);}
			}
		}
	}
}
