// Testet Formular vor Abeschicken.
// Verwendung per onSubmit="" im Form Tag
// Aufruf: validateForm('[Formularname],'[Feldname],[Feldbezeichner],[Muss gefüllt sein: 1/0],[Art des Tests, wenn gefüllt],...
//             ','Alle Daten sind vorhanden','Es fehlen Daten');
// Art der Tests:
// isvalue
// isnum, Testet ob Eingabe numerisch
// isdate, Testet ob Eingabe gültiges Datum
// len:x, Testet ob Eingabe genau Länge x
// lenmin:x, Testet ob Eingabe mindestens Länge x
// lenmax:x, Testet ob Eingabe maximal Länge x



function validateForm(theFormname,theFieldlist,badMess)	{
	if (document[theFormname] && theFieldlist)	{
		var index=1;
		var theField = split(theFieldlist, ",", index);
		var msg="";
		while (theField) {
			// Erstes Feld ist Feldname, 2. Beschreibung und 3. der durchzuführende Test, dann wieder Feldnamen usw...
			index++;
			theLabel = unescape(split(theFieldlist, ",", index));
			index++;
			theFlag =  unescape(split(theFieldlist, ",", index));
			index++;
			theTest =  unescape(split(theFieldlist, ",", index));
			if(!theTest) {
			  theTest = "isvalue";	
			}
			
			theField = unescape(theField);
			
			
			if (document[theFormname][theField])	{
				var fObj = document[theFormname][theField];
				var type=fObj.type;
				if (!fObj.type)	{
					type="radio";
				}
				var value="";
				switch(type)	{
					case "text":
					case "textarea":
						value = fObj.value;
					break;
					case "select-one":
						if (fObj.selectedIndex>=0)	{
							value = fObj.options[fObj.selectedIndex].value;
						}
					break;
					case "select":
						if (fObj.selectedIndex>=0)	{
							value = fObj.options[fObj.selectedIndex].value;
						}
					break;
					case "select-multiple":
						var l=fObj.length;
						for (a=0;a<l;a++)	{
							if (fObj.options[a].selected)	{
								 value+= fObj.options[a].value;
							}
						}
					break;
					case "radio":
						var l=fObj.length;
						for (a=0; a<l;a++)	{
							if (fObj[a].checked)	{
								value = fObj[a].value;
							}
						}
					break;
					// Checkbox
					case "checkbox":
					  if(fObj.checked){
						value = true;  
					  }else{
						value = false;
					  }
					break;
					default:
						value=1;
				}
				// Tests
				
				if(theFlag == 1 && !value){
				  msg+="\n"+theLabel+" fehlt";	
				}else if(value){
					if(theTest == "isnumeric"){									
					  if (!is_numeric(value))	{
						msg+="\n"+theLabel+" ist nicht numerisch";
					  }else{
						// Umwandlung von Komma in Punk
						// todo...						
					  }
					}else if(theTest == "isdate"){
					  if(!testDate(value)){
						msg+="\n"+theLabel+" ist kein Datum."; 
					  }					
					}else if(theTest == "isval"){
					  if(value == 0 || value.length == 0){
						msg+="\n"+theLabel+" fehlt."; 
					  }		
					
					}else if(theTest.substr(0,3) == "len"){
		
						var subTest = split(theTest,":",1);
						var subLen  = split(theTest,":",2);
						  if(subTest == "len" ){
							if(value.length != subLen){
							  msg+="\n"+theLabel+" hat die falsche Länge";	
							}
						  }else if(subTest == "lenmax"){
							if(value.length > subLen){
							  msg+="\n"+theLabel+" ist zu lang";		
							}						
						  }else if(subTest == "lenmin"){
							if(value.length < subLen){
							  msg+="\n"+theLabel+" ist zu kurz";								
							}	
						  }						
					}
				}
			}
			index++;
			theField = split(theFieldlist, ",", index);
		}
		if (msg)	{
			var theBadMess = unescape(badMess);
			if (!theBadMess)	{
				theBadMess = "You must fill in these fields:";
			}
			theBadMess+="\n";
			alert(theBadMess+msg);
			return false;
		} else {			
			return true;
		}
	}
}
function split(theStr1, delim, index) {
	var theStr = ''+theStr1;
	var lengthOfDelim = delim.length;
	sPos = -lengthOfDelim;
	if (index<1) {index=1;}
	for (a=1; a<index; a++)	{
		sPos = theStr.indexOf(delim, sPos+lengthOfDelim);
		if (sPos==-1)	{return null;}
	}
	ePos = theStr.indexOf(delim, sPos+lengthOfDelim);
	if(ePos == -1)	{ePos = theStr.length;}	
	return (theStr.substring(sPos+lengthOfDelim,ePos));
}

// Funktion zum Testen von Datums
function testDate(date){
        var d = split(date,".",1);
		var m = split(date,".",2);
		var y = split(date,".",3);
		
        // Numerische eingaben
        if( isNaN(parseInt(d)) ||  isNaN(parseInt(m)) || isNaN(parseInt(y)) ){
          return false;
        }
        if (d.length==0 || m.length==0 || (y.length!=2 && y.length!=4) ){
          return false;
        }
        
        m = parseInt(m) - 1;
        
        var datum = new Date(y, m, d);
		// Date() berechnet automatisch das richtige Datum, bei ungültigen eingaben.
		// 32.01.1999 ergibt 01.02.1999, ist der Tag vorher und nachher verschieden,
		// war das Datum falsch.
		if(d != datum.getDate()){
		  return false;
		}
		if(m != datum.getMonth()){
		  return false;
		}

		// Alle Prüfungen erfolgreich.
		return true;
}

function is_numeric(num){
		var exp = new RegExp("^[0-9-.,]*$","g");
		return exp.test(num);
}
