﻿var radio_name;

var radio_name="n0xvzrsasd";
var errormsg=new Array(20);
var checkMap=new Array(20);
var cc=0;

for(cc=0;cc<checkMap.length;cc++)
{
	checkMap[cc]=new Array(2);
}

//Die Fehlerdefinitionen: %id,%n
errormsg[0]="Bitte nur max. %n Zeichen in das Feld %id eingeben.";
errormsg[1]="Bitte min. %n Zeichen in das Feld %id eingeben.";
errormsg[2]="Bitte geben Sie im Feld %id eine gültige eMail Adresse ein.\nErlaubte Zeichen für eine eMail-Adresse sind:\n==================================\n - Buchtstaben\n - Zahlen\n - Die Zeichen: @ . - _";
errormsg[3]="Bitte eine gültige eMail Adresse im Feld %id angeben.";
errormsg[4]="Eine eMail Adresse kann nur ein @ enthalten.";
errormsg[5]="Bitte das Feld %id ausfüllen.";
errormsg[6]="Bitte in das Feld %id nur Buchstaben, Ziffern und Satzzeichen eingeben.";
errormsg[7]="Bitte in das Feld %id nur Zahlen eingeben.";
errormsg[8]="Bitte in das Feld %id nur Zahlen eingeben.";
errormsg[9]="Bitte in das Feld %id ein gültiges Datum eingeben.";
errormsg[10]="Im Feld %id sind nur folgende Zeichen erlaubt:\n%n";
errormsg[11]="Im Feld %id sind nur Buchstaben, Zahlen und der Unterstrich erlaubt.";
errormsg[12]="Bitte eine Option von %id auswählen.";
errormsg[13]="Die Zahl im Feld %id liegt ausserhalb des gültigen Zahlenraums Z(%n).";
errormsg[14]="Bitte geben Sie im Feld %id eine ganzzahlige Zahl ein.";

function showError(nr,id,n)
{
	msg=errormsg[nr];
	if(id){msg=msg.replace("%id",id);}
	if(n){msg=msg.replace("%n",n);}	
	alert(msg);
}

function filterle(txt)
{
	//Das kleine Filterle ist zum Filten der eMail-Zeichen, falls zeichen fehlen, einfach in
	//den CheckOK-String einfügen.
	var checkOK = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_.@\n";
	var i;
	
	for(i=0;i<txt.length;i++)
	{
		if (checkOK.indexOf(txt.charAt(i))<0)
		{
			return false;	
		}
	}
	
	return true;	
}

function filterplusi(txt,zeichen)
{
	//Checkt, ob im Text txt nur die erlaubten Zeichen zeichen vorkommen; ignoriert linefeed
	var i;
	for(i=0;i<txt.length;i++)
	{
		if (zeichen.indexOf(txt.charAt(i))<0&&txt.charCodeAt(i)!=10&&txt.charCodeAt(i)!=13)
		{
			return false;
		}
	}
	return true;
}

function filterplus(txt,zeichen)
{
	//Checkt, ob im Text txt nur die erlaubten Zeichen zeichen vorkommen
	var i;
	for(i=0;i<txt.length;i++)
	{
		if (zeichen.indexOf(txt.charAt(i))<0)
		{
			return false;	
		}
	}
	return true;
}

function zeichenBegrenzung(name,txt)
{
	//Begrenzung?		
	if((p=name.indexOf("_max"))>-1)	
	{
		sub=name.substring(p+4,name.length);
		za=parseInt(sub);
		if (txt.length>za)
		{
			return za;
		}
	}

	if((p=name.indexOf("_min"))>-1)	
	{
		sub=name.substring(p+4,name.length);
		pp=sub.indexOf("_");
		if (pp>-1)
		{
			sub=sub.substring(0,pp);
		}
		
		za=parseInt(sub);
		if (txt.length<za)
		{
			return za*(-1);
		}
	}
	return 0;
}


function MinMaxOK(FormObj,id)
{
	n=zeichenBegrenzung(FormObj.name,FormObj.value)
	if(n>0)
	{		
		showError(0,id,n);
		FormObj.focus();
		return false;
	}
	else if(n<0)
	{
		showError(1,id,-n);
		FormObj.focus();
		return false;		
	}
	return true;
}


function validateEmail(FormObj,id)
{
	//Nur gülige Zeichen akzeptieren
	if(!filterle(FormObj.value))
	{
		showError(2,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	
	//1. Schnellcheck
	if((FormObj.value.indexOf('@')<=0) | (FormObj.value.indexOf('.')<=0))
	{
		showError(3,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	//2. Genauerer Check

	//@ kann nicht hinter dem letzten Punkt kommen, bzw. kann nicht das Zeichen direkt vor dem Punkt sein
	if(FormObj.value.indexOf('@')>(FormObj.value.lastIndexOf('.')-1))
	{
		showError(3,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	
	//letztes Zeichen . ist verboten außerdem zwei Zeichen Kennung nach dem .
	if(FormObj.value.lastIndexOf('.')>=(FormObj.value.length-2))
	{
		showError(3,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	
	//mehrere Klammeraffen sind nicht so ganz möglich
	if(FormObj.value.indexOf('@')<FormObj.value.lastIndexOf('@'))
	{
		showError(4,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}		

	return true;	
}

function validateText(FormObj,id)
{
	var checkOK = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzäöüÄÖÜ0123456789- /().,?ß!_:~;";
	var i;
	
	if(FormObj.value.length==0)
	{
		showError(5,id);
		FormObj.focus();		
		return false;
	}

	if(!filterplusi(FormObj.value,checkOK))
	{
		showError(6,id);
		FormObj.value="";
		FormObj.focus();
		return false;			
	}
	return true;
}

function validateZahl(FormObj,id)
{
	var za=parseInt(FormObj.value);
	if(FormObj.value.length==0)
	{
		showError(5,id);FormObj.focus();return false;
	}
	if(isNaN(za))
	{
		showError(7,id);FormObj.value="";FormObj.focus();return false;		
	}
	else
	{
		//FormObj.value=za;
		return true;
	}
}

function validateInt(FormObj,id)
{
	var za=parseInt(FormObj.value);
	if(FormObj.value.length==0)
	{
		showError(5,id);FormObj.focus();return false;
	}
	if(isNaN(za))
	{
		showError(7,id);FormObj.value="";FormObj.focus();return false;		
	}
	else
	{
		FormObj.value=za;
		return true;
	}
}

function validateFloat(FormObj,id)
{
	var za=parseFloat(FormObj.value);
	if(FormObj.value.length==0)
	{
		showError(5,id);FormObj.focus();return false;
	}
	if(isNaN(za))
	{
		showError(7,id);FormObj.value="";FormObj.focus();return false;		
	}
	else
	{
		FormObj.value=za;
		return true;
	}
}

function validateZahlenraum(FormObj,id)
{
	//feld_req_zahlenraum[-50,123]
	//->id=zahlenraum[-50,123]
	//Grenzen extrahieren	
	var i;
	var p,pp;
	var tmpstr="";		
	var min,max;

	p=FormObj.name.indexOf("[");
	if(p>-1)
	{
		tmpstr=FormObj.name.substring(p+1,FormObj.name.length);
		pp=tmpstr.indexOf(",");
		if(pp>-1)
		{
			min=tmpstr.substring(0,pp);
			p=tmpstr.indexOf("]");
			max=tmpstr.substring(pp+1,p);
		}		
	}

	//alert("Min: "+min+" Max: "+max);
	min=parseInt(min);
	max=parseInt(max);

	if((za=parseInt(FormObj.value))==NaN)
	{
		showError(7,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	else
	{
		if(min!=NaN&&max!=NaN)
		{
			if(za<min || za>max)
			{
				showError(13,id,min+","+max);
				FormObj.value="";
				FormObj.focus();
				return false;
			}			
		}
	}
	
	return true;	
}

function validateDatum(FormObj,id)
{
	var checkOK = "0123456789.";
	var i;

	if(FormObj.value.length==0)
	{
		showError(5,id);
		FormObj.focus();		
		return false;
	}

	if(!filterplus(FormObj.value,checkOK))
	{
		showError(9,id);
		FormObj.value="";
		FormObj.focus();
		return false;		
	}
	return true;	
}


function validateTel(FormObj,id)
{
	var checkOK = "0123456789 -/";
	var i;

	if(FormObj.value.length==0)
	{
		showError(5,id);
		FormObj.focus();		
		return false;
	}

	if(!filterplus(FormObj.value,checkOK))
	{
		showError(10,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	return true;	
}


function validateQuery(FormObj,id)
{
	var checkOK = "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZöäüÖÄÜ";
	var i;

	if(FormObj.value.length==0)
	{
		showError(5,id);
		FormObj.focus();		
		return false;
	}

	if(!filterplus(FormObj.value,checkOK))
	{
		showError(11,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	return true;	
}



function validatePLZ(FormObj,id)
{
	var checkOK = "0123456789 ";
	var i;
	
	if(FormObj.value.length==0)
	{
		showError(5,id);
		FormObj.focus();		
		return false;
	}
	
	if(!filterplus(FormObj.value,checkOK))
	{
		showError(7,id);
		FormObj.value="";
		FormObj.focus();
		return false;
	}
	
	if (FormObj.value.length<4)
	{
		showError(1,id,"4");
		FormObj.value="";
		FormObj.focus();
		return false;
	}

	if (FormObj.value.length>6)
	{
		showError(1,id,"6");
		FormObj.value="";
		FormObj.focus();
		return false;
	}

	return true;	
}

function OnlyReq(FormObj,id)
{
	if(FormObj.value.length==0)
	{
		showError(5,id);
		FormObj.focus();
		return false;
	}
	return true;
}


function validatePulldown(FormObj,id)
{
	if(FormObj.selectedIndex<1)
	{
		showError(12,id);
		FormObj.focus();
		return false;
	}

	return true;
}

function validateRadio(FormObj,id,theForm)
{
	rName=FormObj.name;
	if (rName==radio_name)
	{
		return true;
	}
	radio_name=rName;
	
	for(i==0;i<theForm.length;i++)
	{
		if((theForm.elements[i].type=="radio")&(theForm.elements[i].name==rName))
		{
			if (theForm.elements[i].checked==true)
			{
				return true;break;
			}
		}
	}		
	showError(12,id);
	FormObj.focus();	
	return false;
}

function validateCheckbox(FormObj,id,theForm)
{
	rName=FormObj.name;
	if (rName==radio_name)
	{
		return true;
	}
	radio_name=rName;
	
	for(i==0;i<theForm.length;i++)
	{
		if((theForm.elements[i].type=="checkbox")&(theForm.elements[i].name==rName))
		{
			if (theForm.elements[i].checked==true)
			{
				return true;break;
			}
		}
	}		
	showError(12,id);
	FormObj.focus();	
	return false;
}

//checkMap definieren
checkMap[0][0]="_email";checkMap[0][1]=validateEmail;
checkMap[1][0]="_text";checkMap[1][1]=validateText;
checkMap[2][0]="_zahl";checkMap[2][1]=validateZahl;
checkMap[3][0]="_datum";checkMap[3][1]=validateDatum;
checkMap[4][0]="_plz";checkMap[4][1]=validatePLZ;
checkMap[5][0]="_tel";checkMap[5][1]=validateTel;
checkMap[6][0]="_query";checkMap[6][1]=validateQuery;
checkMap[7][0]="_le";checkMap[7][1]=MinMaxOK;
checkMap[8][0]="_zahlenraum";checkMap[8][1]=validateZahlenraum;
checkMap[9][0]="_float";checkMap[9][1]=validateFloat;
checkMap[10][0]="_int";checkMap[10][1]=validateInt;
checkMap[11][0]=-1; //letzte Eintragung

function CheckForm(myForm)
{
	var cmc;
	x=myForm.Radio_req;
	i=0;
	flag=0;
	
	radio_name="n0xvzrsasd"; //immer wieder auf diesen Wert setzen

	while(flag==0)
	{
		if(!myForm.elements[i])
		{
			flag=1;
			break;
		}
		else
		{
			tmpName=myForm.elements[i].name;
			pp=tmpName.indexOf("_req"); //vorderer Teil
			pa=tmpName.indexOf(";"); //Sucht nach alias
			if(pa>-1)
			{
				shortName=tmpName.substring(pa+1,tmpName.length);
			}
			else
			{
				shortName=tmpName.substring(0,pp);
			}


			//Jetzt folgt der Scan, ob das Feld required ist ("_req") und wonach gecheckt werden soll
			if(tmpName.indexOf("_req")>-1)
			{
				//Hres erst mal auf unmöglichen wert setzen
				hres=1444;				

				if(!MinMaxOK(myForm.elements[i],shortName))
				{
					myForm.elements[i].value="";
					return false;
				}
				
				cmc=0;
				while(checkMap[cmc][0]!=-1)
				{
					if(tmpName.indexOf(checkMap[cmc][0])>-1)
					{
						hres=checkMap[cmc][1](myForm.elements[i],shortName);
						if (!hres) return hres;
					}
					cmc++;
				}

				if(myForm.elements[i].type=="select-one")
				{
					//PullDown - Es darf nicht das erste ausgewählt sein
					hres=validatePulldown(myForm.elements[i],shortName);
					if(!hres) return hres;
				}
				
				if(myForm.elements[i].type=="radio")
				{
					//Eins muss ausgewählt werden					
					hres=validateRadio(myForm.elements[i],shortName,myForm);
					if(!hres) return hres;
				}

				if(myForm.elements[i].type=="checkbox")
				{
					//Eins muss ausgewählt werden					
					hres=validateCheckbox(myForm.elements[i],shortName,myForm);
					if(!hres) return hres;
				}
				

				if(hres==1444)
				{
					//Hierher kommt die Routine nur, wenn bis jetzt nix gepasst hat..., d.h. z.B. Textfeld mit nur _req				
					hres=OnlyReq(myForm.elements[i],shortName)
					if(!hres) return hres;		
				}
			}

			if((tmpName.indexOf("_opt")>-1)&&(myForm.elements[i].value!=""))
			{
				//Hres erst mal auf unmöglichen wert setzen
				hres=1444;				

				pp=tmpName.indexOf("_opt"); //vorderer Teil
				pa=tmpName.indexOf(";"); //Sucht nach alias
				if(pa>-1)
				{
					shortName=tmpName.substring(pa+1,tmpName.length);
				}
				else
				{
					shortName=tmpName.substring(0,pp);
				}

				if(!MinMaxOK(myForm.elements[i],shortName))
				{
					myForm.elements[i].value="";
					return false;
				}

				//Das Feld ist optional. Jetzt wird überprüft, welche Werte das Feld haben darf
				cmc=0;
				while(checkMap[cmc][0]!=-1)
				{
					if(tmpName.indexOf(checkMap[cmc][0])>-1)
					{
						hres=checkMap[cmc][1](myForm.elements[i],shortName);
						if (!hres) return hres;
					}
					cmc++;
				}
				
			}
		}
		i++;
	}

	//letzter Schritt: Die Namen auf "normal" zusammenkürzen
	cutNames(myForm);
	return true;
}

function cutNames(myForm)
{
	var i=0;
	for(i=myForm.elements.length-1;i>-1;i--)
	{
		cutName(myForm.elements[i]);
	}
}


function cutName(FormObj)
{
	p=FormObj.name.indexOf("_req");
	if(p>-1) 
	{
		FormObj.name=FormObj.name.substring(0,p);
	}
	else
	{
		p=FormObj.name.indexOf("_opt");
		if(p>-1){FormObj.name=FormObj.name.substring(0,p);}
	}
}

