// ***********************
// 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['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['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.';

// 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']	= /.+ .+/;

// 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 (typeof(fields2check[nr]) != 'object')
		{
			continue;
		}
		var name  = fields2check[nr][0];
		var type  = fields2check[nr][1];
		var specs = '';
		if (typeof fields2check[nr][2] != 'undefined')
		{
			specs = fields2check[nr][2];
		}
		
		name = name.split(';');
		result = true;
		for (var o = 0; o < name.length; o++)
		{
			var object = document.getElementsByName(name[o])[0];
			if (!object)
			{
				alert('A required field is not existing, form can\'t be sent!');
				return false;
			}
			var thisresult = check(object, type, specs);
			if (thisresult == false)
			{
				result = false;
			}
		}
		if (result == false)
		{
			return process(name.join('_'), lang);
		}
	}
	return true;
}

// 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 (typeof date != 'object')
	{
		date = get_date_from_string(date);
	}
	if (!date)
	{
		return false;
	}
	difference = parseInt(difference);
	if (!isFinite(difference))
	{
		return false;
	}
	if (typeof(strict) == 'undefined')
	{
		strict = false;
	}
	date = date.getTime();
	var now = new Date();
	now = now.getTime();
	if (strict)
	{
		var realdifference = (date - now) / 1000;
	}
	else
	{
		var realdifference = Math.abs((date - now) / 1000);
	}
	if (realdifference > difference)
	{
		return false;
	}
	else
	{
		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);
}