/************************************************************************************/
/* @TITLE
/*	jslib::validate
/*
/* @SYNOPSIS
/*	<script type="text/javascript" src="/jslib/validate.js">
/*
/* @DESCRIPTION
/*	In diesem JavaScript-Modul sind zahlreiche Prüffunktionen enthalten, die eine
/*	clientseitige Validierung von Formularen vor dem Versenden oder "onChange"
/*	nach Möglichkeit erleichtern sollen. Die Verwendung der HtmlElement.js
/*	wird vorausgesetzt.
/*
/* @AUTHOR
/*	Marcus Bloch
/*
/* @COPYRIGHT
/*	Copyright 2004-2005 by CHAMAELEON AG (http://www.chamaeleon.de) - Oktober 2005
/*************************************************************************************/


function checkEmailString(s) {
	/********************************************************************************
	/* @TITLE
	/*	E-Mail-Adressen syntaktisch validieren
	/*
	/* @DESCRIPTION
	/*	Diese Funktion nimmt eine syntaktische Validierung der E-Mail-Adresse vor
	/*
	/* @PARAM s
	/*	E-Mail-String
	/*
	/* @SYNOPSIS
	/*	if(!checkEmailString(s)) { alert(s + " ist nicht korrekt!"); }
	/********************************************************************************/
	return s != undefined && s.match(/^(?:[a-zA-Z0-9][\-\.\_a-zA-Z0-9]*\@\[?[\-\.a-zA-Z0-9\u0080-\uffff]+\.(?:[\-a-zA-Z0-9\u0080-\uffff]{2,}|[0-9]{1,3})\]?)?$/);
}

function validateEmail(feld){
	/********************************************************************************
	/* @TITLE
	/*	E-Mail-Adressen syntaktisch validieren
	/*
	/* @DESCRIPTION
	/*	Diese Funktion nimmt eine syntaktische Validierung der E-Mail-Adresse in dem
	/*	übergebenen Formularfeld vor.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu pr�fenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(validateEmail("email")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	if(!checkEmailString(getValue(feld))){
		alert("Die angegebene E-Mail-Adresse ist syntaktisch ung\u00FCltig!\nBitte geben Sie eine g\u00FCltige E-Mail-Adresse ein.");
		forceFocus(feld);
		return false;
	}
	return true;
}

function validateEmailList(feld, minZahl, maxZahl){
	/********************************************************************************
	/* @TITLE
	/*	E-Mail-Adressenliste syntaktisch validieren
	/*
	/* @DESCRIPTION
	/*	Diese Funktion nimmt eine syntaktische Validierung einer kommagetrennten
	/*	E-Mail-Liste in dem übergebenen Formularfeld vor.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu pr�fenden Formularelements.
	/*
	/* @PARAM minZahl
	/*	(optional) Minimal erlaubte Anzahl an E-Mail-Adressen.
	/*	Falls nicht angegeben, wird mindestens eine E-Mail-Adresse erwartet.
	/*
	/* @PARAM maxZahl
	/*	(optional) Maximal erlaubte Anzahl an E-Mail-Adressen.
	/*	Falls nicht angegeben, sind beliebig viele E-Mail-Adressen erlaubt.
	/*
	/* @SYNOPSIS
	/*	if(validateEmail("email")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	var emails = getValue(feld);
	var emailListe = emails.split(",");
	var emailZahl = emails.match(/^\s*$/) ? 0 : emailListe.length;

	if (minZahl != undefined && emailZahl < minZahl) {
		alert("Es m\u00FCssen mindestens " + minZahl + " E-Mail-Adresse(n) angegeben werden!");
		forceFocus(feld);
		return false;
	}

	if (maxZahl != undefined && emailListe.length > maxZahl) {
		alert("Es d\u00FCrfen h\u00F6chstens " + maxZahl + " E-Mail-Adresse(n) angegeben werden!");
		forceFocus(feld);
		return false;
	}

	for (var i = 0; i < emailZahl; i++) {
		if (!checkEmailString(emailListe[i].replace(/^\s+/, "").replace(/\s+$/, ""))) {
			alert("Die angegebene E-Mail-Adresse (" + emailListe[i] + ") ist syntaktisch ung\u00FCltig!\nBitte geben Sie eine g\u00FCltige E-Mail-Adresse ein.");
			forceFocus(feld);
			return false;
		}
	}

	return true;
}

function validateUri(s, direct){
	/********************************************************************************
	/* @TITLE
	/*	URI syntaktisch validieren
	/*
	/* @DESCRIPTION
	/*	Diese Funktion nimmt eine syntaktische Validierung eines URI in dem
	/*	übergebenen Formularfeld vor. GET-Parameter werden berücksichtigt.
	/*
	/* @PARAM s
	/*	ID, Name oder Referenz des zu prüfenden Formularelements oder (in Verbindung
	/*	mit @direct == true) direkt der zu prüfende String.
	/* @PARAM direct
	/*	Optionaler Parameter; falls true, wird @s als String und nicht als Formular-
	/*	feldbezeichner angenommen.
	/*
	/* @SYNOPSIS
	/*	if(validateUri("www")) { document.inputForm.submit(); }
	/********************************************************************************/
	var uri;
	if (!direct && !getElement(s)) {
		return false;
	}
	if(uri = (direct ? s : getElement(s).value)){
		if(!uri.match(/^https?\:\/\/[\-A-Za-z0-9\.]+(?:\:\d+)?(\/([\d\-\w\/\.]*(\?\S+)?)?)?$/)){
			alert("Die angegebene URL ist syntaktisch ung\u00FCltig!\nBitte geben Sie eine g\u00FCltige URL ein.");
			if(!direct){
				forceFocus(s);
			}
			return false;
		}
		return true;
	}
	return false;
}


function checkPositive(feld){
	/********************************************************************************
	/* @TITLE
	/*	Auf positive ganze Zahl prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert eine positive ganze Zahl ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu prüfenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(checkPositive("age")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	if(!getValue(feld).match(/^\d*$/)){
		alert("Sie m\u00FCssen eine positive ganze Zahl eingeben!");
		forceFocus(feld);
		return false;
	}
	return true;
}

function checkFloatPositive(feld){
	/********************************************************************************
	/* @TITLE
	/*	Auf positive reelle Zahl prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert eine positive reelle Zahl ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu prüfenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(checkFloatPositive("annualGrowth")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	if(!getValue(feld).match(/^\d*(,\d+)?$/)){
		alert("Sie m\u00FCssen eine positive Zahl eingeben!\nF\u00FCr die Eingabe reeller Zahlen verwenden Sie bitte das Komma, nicht den Punkt.");
		forceFocus(feld);
		return false;
	}
	return true;
}


function checkMoney(feld){
	/********************************************************************************
	/* @TITLE
	/*	Auf Währungswert prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert ein Währungswert (z. B. -1.253,99) ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu prüfenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(checkMoney("price")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	if(!getValue(feld).match(/^(-?\d{1,3}(\.?\d{3})*(,\d{1,2})?)?$/)){
		alert("Sie m\u00FCssen einen W\u00E4hrungswert (Format: (-)#.##0,00) eingeben!");
		forceFocus(feld);
		return false;
	}
	return true;
}


function checkMoneyPositive(feld){
	/********************************************************************************
	/* @TITLE
	/*	Auf positiven Währungswert prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert ein positiver Währungswert (z. B. 1.253,99) ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu prüfenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(checkMoneyPositive("price")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	if(!getValue(feld).match(/^(\d{1,3}(\.?\d{3})*(,\d{1,2})?)?$/)){
		alert("Sie m\u00FCssen einen positiven W\u00E4hrungswert (Format: #.##0,00) eingeben!");
		forceFocus(feld);
		return false;
	}
	return true;
}


function checkDate(feld){
	/********************************************************************************
	/* @TITLE
	/*	Datumsangabe syntaktisch und semantisch prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert ein syntaktisch und semantisch korrektes Datum ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu pr�fenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(checkDate("birthday")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	var val = getValue(feld);
	if(!val.match(/^(\d\d?\.\d\d?.\d\d\d?\d?)?$/) || !isDate(val)){
		alert("Sie m\u00FCssen ein g\u00FCltiges Datum eingeben!");
		var now = new Date();
		now = now.getDate() +"."+ (now.getMonth()+1) +"."+ (now.getYear()+1900);
		setValue(feld, now);
		forceFocus(feld);
		return false;
	}
	return true;
}

function checkDateTime(feld){
	/********************************************************************************
	/* @TITLE
	/*	Datumzeitangabe syntaktisch und semantisch prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert ein syntaktisch und semantisch korrektes Datum mit Zeit ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu prüfenden Formularelements.
	/*
	/* @SYNOPSIS
	/*	if(checkDate("currentTime")) { document.inputForm.submit(); }
	/********************************************************************************/
	if (!getElement(feld)) {
		return false;
	}
	var val = getValue(feld);
	var arrDateTime = val.split(" ");
	var strDate = arrDateTime[0] ? arrDateTime[0] : "0";
	var strTime = arrDateTime[1] ? arrDateTime[1] : "0";
	if(!strDate.match(/^(\d\d?\.\d\d?.\d\d\d?\d?)?$/) || !isDate(strDate)){
		alert("Sie m\u00FCssen ein g\u00FCltiges Datum eingeben!");
		var now = new Date();
		now = now.getDate() +"."+ (now.getMonth()+1) +"."+ (now.getYear()+1900) +" 00:00";
		setValue(feld, now);
		forceFocus(feld);
		return false;
	}
	var arrMatch = strTime.match(/^((([0-2])?[0-9]):([0-5])?[0-9](:([0-5])?[0-9]?)?)?$/);
	if(!arrMatch || arrMatch[2] > 23){
		alert("Sie m\u00FCssen eine g\u00FCltige Zeit eingeben!");
		setValue(feld, strDate + " 00:00");
		forceFocus(feld);
		return false;
	}
	return true;
}

function isDate(strDate){
	/********************************************************************************
	/* @TITLE
	/*	Datumsangabe semantisch prüfen
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert ein semantisch korrektes Datum ist.
	/*
	/* @PARAM strDate
	/*	Datum in 'checkDate'-zul�ssigen Formaten.
	/*
	/* @SYNOPSIS
	/*	if(!isDate("29.02.2006")) { alert("2006 ist kein Schaltjahr!"); }
	/********************************************************************************/
	if(strDate == "") {return true;}
	var arrDate = strDate.split(".");
	var DAY = arrDate[0] ? arrDate[0] : "0";
	var MONTH = arrDate[1] ? arrDate[1] : "0";
	var YEAR = arrDate[2] ? arrDate[2] : "0";
	if(YEAR.length != 2 && YEAR.length != 4) {return false;}
	var testDate = new Date(MONTH + "/" + DAY + "/" + YEAR);
	if(testDate.getMonth()+1 == MONTH){
		return true;
	} else {
		return false;
	}
}

function isTime(strTime){
	/********************************************************************************
	/* @TITLE
	/*	Zeitangabe semantisch prüfen (Stunden-Minuten-Angaben, keine Sekunden)
	/*
	/* @DESCRIPTION
	/*	Prüft, ob der eingegebene Wert eine semantisch korrekte Zeit ist.
	/*	Format: ^(\d\d?):(\d\d?)$
	/*
	/* @PARAM strTime
	/*	Zu pr�fender Zeitwert (ohne Formatvorgaben).
	/*
	/* @EXAMPLE
	/*	if(!isTime("24:01")) { alert("Es gibt kein 24 Uhr!"); }
	/********************************************************************************/
	if(strTime == "") {
		return true;
	}
	if(strTime.match(/^(\d\d?):(\d\d?)$/)){
		if(0<=RegExp.$1 && RegExp.$1<=23 && 0<=RegExp.$2 && RegExp.$2<=59){
			return true;
		}
	} else {
		return false;
	}
}

function validateInput(feld, format, strict, opt){
	/********************************************************************************
	/* @TITLE
	/*	Generische Eingabevalidierung mit mehreren Kombinationsfaktoren
	/*
	/* @DESCRIPTION
	/*	Diese Funktion kombiniert die Funktionalitäten der vorangegangenen
	/*	Validierungsfunktionen zu einem generischen Angebot:
	/*	Es k�nnen mehrere unterschiedliche Validierungsformate übergeben werden
	/*	sowie die Angabe, ob nur positive oder auch negative Werte zugelassen sind
	/*	und ob das Feld befüllt sein muss oder ob der leere Wert auch gültig ist.
	/*
	/* @PARAM feld
	/*	ID, Name oder Referenz des zu prüfenden Formularelements.
	/* @PARAM format
	/*	0: ganze Zahl
	/*	1: reelle Zahl
	/*	2: Währungswert
	/* @PARAM strict
	/*	true:  Nur positive Werte
	/*	false: Positive und negative Werte
	/* @PARAM opt
	/*	true:  Angabe ist optional; der leere Wert ist auch gültig.
	/*	false: Angabe ist verpflichtend; der leere Wert ist ungültig.
	/*
	/* @SYNOPSIS
	/*	if(validateInput("sallary", 2, true, false)) { document.inputForm.submit(); }
	/********************************************************************************/
	var val, ok;
	if(val = getValue(feld)){
		var filter = "^";
		strict ? filter = filter : filter += "\\-?";
		filter += "(\\d(\\.\\d{3})*)";
		filter += (opt ? "*" : "+");
		filter += ((format == 1) ? "(,\\d+)?" : ((format == 2) ? "(,\\d{1,2})?" : ""));
		filter += "$";
		ok = val.match(filter);
	} else {
		ok = opt;
	}

	if (!ok) {
		var appendix;
		var msg = "Sie m\u00FCssen eine";
		appendix = ((format == 2) ? "n" : "");
		msg += appendix;
		msg += (strict ? " positive" : " g\u00FCltige");
		msg += appendix;
		msg += ((format == 0) ? " ganze Zahl" : ((format == 1) ? " reelle Zahl" : " W\u00E4hrungswert (Format: #.##0,00)"));
		msg += " eingeben!";
		alert(msg);
		forceFocus(feld);
		return false;
	}

	return true;
}

function fieldsFilled(flds){
	/********************************************************************************
	/* @TITLE
	/*	Pflichtfeld-Pr�fung
	/*
	/* @DESCRIPTION
	/*	Die Methode prüft, ob die Formularfelder (eindeutig bezeichnet mit ID oder Name
	/*	oder (alternativ) referenziert) befüllt sind. Dies funktioniert derzeit nicht
	/*	mit SelectBoxen!.
	/*
	/* @PARAM flds
	/*	Eindimensionales Array mit IDs, eindeutigen Namen oder Objektreferenzen.
	/*
	/* @SYNOPSIS
	/*	if(fieldsFilles(Array("nachname", "vorname", "strasse", "plz", "ort")){
	/*		document.forms[0].submit();
	/*	}
	/********************************************************************************/
	var elem;
	for(var i = 0; i < flds.length; i++){
		if(elem = getElement(flds[i])){
			if(!elem.value || elem.value.match(/^\s*$/)){
				alert("Das Feld '" + flds[i] + "' ist ein Pflichtfeld und muss ausgef\u00FCllt werden!");
				forceFocus(flds[i]);
				return false;
			}
		}
	}
	return true;
}

