// aus SelfHTML: überprüfen der Eingaben in Form-Feldern
// http://selfaktuell.teamone.de/tippstricks/javascript/formkontrolle/index.htm
// ############################################################################
// Einbindung mit  <script type="text/JavaScript" src="js/pruefen.js"></script>
// Aufgerufen werden kann es mit zwei oder drei Parametern: und Aufruf der Funktion
// <form name="form_name" id="form_name" onSubmit="return validate(this,var_1)">
// this ist das entsprechende FORM, var_1. das Prüfarray der ART
// var_1[0] = new Array('name_1','check_1','fehlermeldung_1',/regexp_1/);
// 1) name_1 der NAME des Formelements
// 2) check_1 was wird geprüft
// 3) fehlermeldung_1 gewünschte Ausgabe der Fehlermeldung
// 4) der vorgegebene RegExp. ggf bleibt leer
// <form name="form_name" id="form_name" onSubmit="return validate(this,var_1,msg_1)">
// ###################################################################################
/* check_n aus folgender Auswahl
	e	empty das Element darf nicht leer sein 
	n	number das Element muss eine Zahl sein 
	m	mail eine Emailadresse muss formal richtig sein 
	r	regexp der Wert soll ein bestimmtes Muster haben 
	p	price der Wert soll in der Form "10,00" sein (mit Komma) 
	p.	price_dot der Wert soll in der Form "10.00" sein (mit Punkt) 
	c	capitalize Namen sollen korrigiert werden 
*/
// das folgende Array steht zwckmäßigerweise im HTML-Dokument
var msg_1 = 'Fehler:';

var var_1 = new Array()
var_1[0] = new Array('ort','e','Sie haben keinen Wohnort angegeben',''); //ORT
var_1[1] = new Array('email','m','ist keine gültige Emailadresse',''); //EMAIL
var_1[2] = new Array('anzahl','n','ist keine Zahl',''); //ZAHL
var_1[3] = new Array('anzahl','e','Sie haben keine Anzahl angegeben',''); //ANZAHL
var_1[4] = new Array('einzelpreis','p','ist kein gültiger Preis',''); //PREIS
var_1[5] = new Array('benutzer','r','Der Benutzername muss aus 8 Zeichen bestehen',/\w{8}/); //USERNAME
var_1[6] = new Array('benutzer','c','',''); //
// eventuell sind die Ausgaben zu ändern

function validate(sender,myarray,err_hd) {
// die Fehlermeldungen initialisierent
var err_msg = !err_hd?new Array('Folgende Fehler sind aufgetreten:\n'):new Array(err_hd+'\n');
var error = false;
// alle Werte prüfen = Länge des Array
for (i=0;i<myarray.length;i++) {
	field = document.forms[sender.name].elements[myarray[i][0]];


/* Block 1 überprüft Felder, die ausgefüllt sein müssen */
	if (myarray[i][1].indexOf('e')>-1) 
		{
			if (!field.value) // ob ein Element überhaupt einen Wert enthält
			{
			error = true;
			err_msg.push(myarray[i][2]);
			}
		}

/* 
		Block 2 überprüft, ob die Emailadresse formal richtig ist 
		s.: http://selfaktuell.teamone.de/tippstricks/programmiertechnik/email/index.html 
		HIER auch PHP und Perl
		
*/
	else if (myarray[i][1].indexOf('m')>-1) 
	{
	if (field.value) 
		{
		var usr = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
		var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
		var regex = "^"+usr+"\@"+domain+"$";
		var myrxp = new RegExp(regex);
		var check = (myrxp.test(field.value));
		if (check!=true) 
			{
			error=true;
			err_msg.push(field.value+" "+myarray[i][2]);
			}
		}
	}

/* Block 3 überprüft Felder, deren Wert eine Zahl sein muss gegenüber isNaN wird hier korrigiert! */
	else if (myarray[i][1].indexOf('n')>-1) 
	{
	var num_error = false;
	if(field.value) 
		{
		var myvalue = field.value;
		var num = myvalue.match(/[^0-9,\.]/gi)
		var dot = myvalue.match(/\./g);
		var com = myvalue.match(/,/g);
		if (num!=null) 
			{
			num_error = true;
			}
		else if ((dot!=null)&&(dot.length>1)) {num_error = true;}
		else if ((com!=null)&&(com.length>1)) {num_error = true;}
		else if ((com!=null)&&(dot!=null)) {num_error = true;}
		}
	if (num_error==true) 
		{
		error = true;
		err_msg.push(myvalue+" "+myarray[i][2]);
		}
	}

/* Block 4 überprüft Wert anhand eines regulären Audrucks auf bestimmte Muster 
	SUCHMUSTER vorgeben*/
	else if (myarray[i][1].indexOf('r')>-1) 
	{
	var regexp = myarray[i][3];
	if (field.value) 
		{
		if (!regexp.test(field.value)) 
			{
			error = true;
			err_msg.push(field.value+" "+myarray[i][2]);
			}
		}
	}

/* Block 5 überprüft Felder, die als Preis formatiert sein müssen, ändert die Formatierung eventuell */
	else if (myarray[i][1].indexOf('p')>-1) 
	{
	var myvalue = field.value;
	var reg = /,-{1,}|\.-{1,}/;
	var nantest_value = myvalue.replace(reg,"");  // Teilstring für NaN-Test falls 23,-- € etc.
	var num = nantest_value.match(/[^0-9,\.]/gi)
	sep = myarray[i][1].substr(1,1)?myarray[i][1].substr(1,1):',';
	if (field.value) 
		{
		var myvalue = field.value.replace(/\./,',');
		if (myvalue.indexOf(',')==-1) {field.value = myvalue+sep+'00';}
		else if (myvalue.indexOf(",--")>-1) {field.value = myvalue.replace(/,--/,sep+'00');}
		else if (myvalue.indexOf(",-")>-1) {field.value = myvalue.replace(/,-/,sep+'00');}
		else if (!myvalue.substring(myvalue.indexOf(',') + 2)) 
			{
			error=true;
			err_msg.push(field.value+" "+myarray[i][2]);
			}
		else if (myvalue.substring(myvalue.indexOf(',') + 3)!='') 
			{
			error=true;
			err_msg.push(field.value+" "+myarray[i][2]);
			}
		else if (num!=null) 
			{
			error=true;
			err_msg.push(field.value+" "+myarray[i][2]);
			}
		}
	}

/* Block 6 überprüft Namensfelder, und korrigiert evtl. die Groß-/Kleinschreibung */
	else if (myarray[i][1].indexOf('c')>-1) 
	{
	var noble = new Array("de","von","van","der","d","la","da","of");
	var newvalue='';
	var myvalue = field.value.split(/\b/);
	for (k=0;k<myvalue.length;k++) 
		{
		newvalue+= myvalue[k].substr(0,1).toUpperCase()+myvalue[k].substring(1);
		}
	for(k=0;k<noble.length;k++)
		{
		var reg = new RegExp ("\\b"+noble[k]+"\\b","gi");
		newvalue = newvalue.replace(reg,noble[k]);
		}
	field.value = newvalue;
	}
}

/* im Fehlerfall werden hier die gesammelten Fehlermeldungen verarbeitet und angezeigt. 
Wenn das Formular ohne Beanstandung ist, wird es übertragen */
	if (error) 
		{
		err_msg = err_msg.join('\n\xB7 ');
		alert(err_msg);
		return false;
		}
	else {return true;}
}

/* Zuverlässigkeit
Das Script wurde getestet unter Debian Linux testing mit 
	Mozilla 1.2.1, Konqueror 3.1, Opera 6.11 und Netscape 4.77. 
ok: Mozilla, Netscape und Konqueror 
Opera kam mit der Namenskorrektur nicht zurecht und verwandelte alle Buchstaben bis auf die Adelstitel in Großbuchstaben. 

Unter Windows XP professionell ohne Service Pack 1 wurde getestet mit 
	Mozilla 1.2.1, Internet Explorer 6.0, Netscape 4.08, Opera 6.04 und Opera 7 beta. 
ok: Mozilla, Netscape und Internet Explorer. 
Opera 7 verhielt sich wie im Test wie unter Linux, 
Opera 6.04 ersetzte bei der Namenskorrektur nur den ersten Buchstaben im String.
*/

function checkEmail(email) // eine andere Variante direkt für emails
	{
	var proto  = "(mailto:)?";
	var usr    = "([a-zA-Z0-9][a-zA-Z0-9_.-]*|\"([^\\\\\x80-\xff\015\012\"]|\\\\[^\x80-\xff])+\")";
	var domain = "([a-zA-Z0-9][a-zA-Z0-9._-]*\\.)*[a-zA-Z0-9][a-zA-Z0-9._-]*\\.[a-zA-Z]{2,5}";
	var regex  = "^" + proto + "?" + usr + "\@" + domain + "$";
	var rgx    = new RegExp(regex);
	return rgx.exec(email) ? true : false;
	}



