var sMessageSelectRequired	= "Bitte wählen Sie einen Eintrag aus dem Feld feldname aus.";
var sMessageRadioRequired	= "Bitte wählen Sie einen Eintrag aus dem Feld feldname aus.";
var sMessageCheckRequired = "Bitte aktivieren Sie den Haken im Feld feldname.";
var sMessageRadioValid		= "Bitte wählen Sie einen gültigen Eintrag aus dem Feld feldname aus.";
var sMessageRadioAmount		= "Bitte wählen Sie min bis max Einträge aus dem Feld feldname aus.";
var sMessageInputRequired	= "Bitte füllen Sie das Feld feldname aus.";
var sMessageDate			= "Bitte geben Sie ein gültiges Datum ins Feld feldname ein.";
var sMessageNumber			= "Bitte geben Sie eine Zahl ins Feld feldname ein.";
var sMessageEmail			= "Bitte geben Sie eine gültige eMail-Adresse ins Feld feldname ein.";
var sMessageZip				= "Bitte geben Sie eine gültige Postleitzahl ins Feld feldname ein";
var sMessagePhone			= "Bitte geben Sie eine gültige Rufnummer ins Feld feldname ein.";
var sMessageMinMax			= "Bitte geben Sie einen gültigen Wert";

var fRule = new Array();
var arrRundungsfelder = new Array();

function showError(feld,msg){
	alert(msg.replace(/feldname/,"\""+fRule[feld.name][1]+"\""));
	if(feld.type!="hidden"){
		feld.focus();
		feld.select();
	}
	return false;
}

function getCheckedValue(feld){
	var val = "";
	var numberOfChecks = 0;
	aFeld = fObj.elements[feld.name];
	for(j=0;j<aFeld.length;j++){
		if(aFeld[j].checked){
			val += (val=="")?aFeld[j].value:","+aFeld[j].value;
			numberOfChecks++;
		}
	}
	return (new Array(val,numberOfChecks));
}

function isProcessedByUser(feld){
	if(!fRule[feld.name][0])return true;
	isEmpty = true;
	if((feld.type=="text"||feld.type=="password"||feld.type=="textarea"||feld.type=="hidden")){
		for(j=0;j<feld.value.length;j++)isEmpty=(feld.value.charAt(j)!=" ")?false:isEmpty;
		if(isEmpty||feld.value==""){
			feld.value = "";
			return showError(feld,sMessageInputRequired);
		}
	}
	if(feld.type=="select-one"&&feld.selectedIndex==0)return showError(feld,sMessageSelectRequired);
	if((feld.type=="radio"||feld.type=="checkbox")){
		arrTmp = getCheckedValue(feld);
		if(fRule[feld.name].length==2 && arrTmp[1]==0){
			return showError(feld,sMessageRadioRequired);
		}else if(fRule[feld.name][2]=="contains" && arrTmp[0].indexOf(fRule[feld.name][3])==-1){
			return showError(feld,sMessageRadioValid);
		}else if(arrTmp[1]<fRule[feld.name][2]||arrTmp[1]>fRule[feld.name][3]){
			return showError(feld,sMessageRadioAmount.replace(/min/,fRule[feld.name][2]).replace(/max/,fRule[feld.name][3]));
		}else if(fRule[feld.name].length==5 && (!feld.checked)){
			return showError(feld,sMessageCheckRequired);
		}
	}
	return true;
}

function isLeapYear(wh){
	return (((wh%4)==0)&&((wh%100)!=0)||((wh%400)==0))?true:false;
}

function isLeapYear(wh){
	return (((wh%4)==0)&&((wh%100)!=0)||((wh%400)==0))?true:false;
}

function getDateInt(wh){
	var digits = wh.length;
	wh="1"+wh;
	wh=parseInt(wh);
	wh-=eval("1E"+digits);
	return wh;
}

function getNumber(){
	var wh = String(arguments[0]);
	while(wh.indexOf(".")!=-1)wh = wh.replace(/\./,"");
	wh = wh.replace(/,/,".");
	return (isNaN(Number(wh)))?null:Number(wh);
}

function splitDateString(datestring){
	arrDate = new Array();
	arr = datestring.split(".");
	if(arr.length!=3||arr[0].length>2||arr[1].length>2||(arr[2].length!=2&&arr[2].length!=4))return null;
	for(a in arr){
		if(isNaN(arr[a])){
			return null;
		}
	}
	arrDate["day"]=getDateInt(arr[0]);
	arrDate["month"]=getDateInt(arr[1]);
	arrDate["year"]=getDateInt(arr[2]);
	arrDate["year"]=(arrDate["year"]<100)?arrDate["year"]+2000:arrDate["year"];
	return arrDate;
}

function isValid(feld){
	if(fRule==null||fRule[feld.name].length<3||feld.value==""||!isNaN(fRule[feld.name][2]))return true;
	tmp = feld.value;
	if(fRule[feld.name][2]=="email"){
		posAt = tmp.indexOf("@");
		posLastDot = tmp.lastIndexOf(".");
		tLength = tmp.length;
		if(tLength<7||posAt==-1||posAt!=tmp.lastIndexOf("@")||tmp.indexOf(",")!=-1||tmp.substring(posAt+3,tLength).indexOf(".")==-1||(tmp.substring(posAt+3,tLength).length-1)-tmp.substring(posAt+3,tLength).lastIndexOf(".")<2||tmp.charAt(posLastDot-1)=="@"||tmp.charAt(posLastDot-2)=="@"||tmp.charAt(posLastDot-1)=="."||tmp.charAt(posLastDot-2)==".")return showError(feld,sMessageEmail);
	}
	if(fRule[feld.name][2]=="plz"){
		if (tmp.length!=5 || isNaN(tmp))return showError(feld,sMessageZip);
	}
	if(fRule[feld.name][2]=="telno"){
		validChars = " /+-()";
		for(j=0;j<tmp.length;j++){
			if (validChars.indexOf(tmp.charAt(j))==-1&&isNaN(tmp.charAt(j)))return showError(feld,sMessagePhone);
		}
	}
	if(fRule[feld.name][2].indexOf("date")!=-1){
		var userDate, minDate, maxDate, actDate;
		var tDate = new Date();
		var sDate = tDate.getDate()+"."+(tDate.getMonth()+1)+"."+((tDate.getYear()<1900)?(tDate.getYear()+1900):tDate.getYear());
		userDate = splitDateString(tmp);

		if(userDate==null)return showError(feld,sMessageDate);
		actDate = splitDateString(sDate);
		minDate = (fRule[feld.name].length==5)?splitDateString(fRule[feld.name][3]):null;
		maxDate = (fRule[feld.name].length==5)?splitDateString(fRule[feld.name][4]):null;

		switch (fRule[feld.name][2]){
			case "datefut":
				minDate = actDate;
				break;
			case "datepast":
				maxDate = actDate;
				break;
			case "daterange":
				break;
			default:
				minDate = userDate;
				maxDate = userDate;
				break;
		}
		
		arrDays=new Array(31,(isLeapYear(userDate["year"]))?29:28,31,30,31,30,31,31,30,31,30,31);
		if(userDate["month"]<1||userDate["month"]>12||userDate["day"]>arrDays[userDate["month"]-1]||userDate["day"]<1||userDate["year"]<1)return showError(feld,sMessageDate);
		if(minDate!=null&&(userDate["year"]*10000+userDate["month"]*100+userDate["day"])<(minDate["year"]*10000+minDate["month"]*100+minDate["day"]))return showError(feld,sMessageDate);
		if(maxDate!=null&&(userDate["year"]*10000+userDate["month"]*100+userDate["day"])>(maxDate["year"]*10000+maxDate["month"]*100+maxDate["day"]))return showError(feld,sMessageDate);
	}
	
	if(fRule[feld.name][2]=="minmax"){
		var minVal = (fRule[feld.name].length==5)?getNumber(fRule[feld.name][3]):null;
		var maxVal = (fRule[feld.name].length==5)?getNumber(fRule[feld.name][4]):null;
		tmp = getNumber(tmp,feld);
		if(tmp==null||(tmp!=null&&((minVal!=null&&minVal>tmp)||(maxVal!=null&&maxVal<tmp)))){
			if(minVal==null){
				return showError(feld,sMessageMinMax + " unter " + maxVal + " ins Feld feldname ein.");
			}else if(maxVal==null){
				return showError(feld,sMessageMinMax + " über " + minVal + " ins Feld feldname ein.");
			}else{
				return showError(feld,sMessageMinMax + " zwischen " + minVal + " und " + maxVal + " ins Feld feldname ein.");
			}
		}
	}

	if(fRule[feld.name][2]=="number"&&getNumber(tmp,feld)==null)return showError(feld,sMessageNumber);

	/*BAV Rundung*/
	if(fRule[feld.name][2]=="minmax"||fRule[feld.name][2]=="number"){
		for(j=0;j<arrRundungsfelder.length;j++){
			if(arrRundungsfelder[j]==feld.name){
				tmp = String(getNumber(feld.value));
				dot = tmp.indexOf(".");
				if(dot==-1){
					tmp+=".00";
				}else{
					var nachkomma = tmp.length-dot-1;
					if(nachkomma>2)tmp = tmp.substring(0,tmp.length-nachkomma+2);
					for(j=nachkomma;j<2;j++)tmp+="0";
				}
				//feld.value = tmp.substring(0,tmp.length-2) + Math.round(Number(tmp.charAt(tmp.length-2)+"."+tmp.charAt(tmp.length-1)))+"0";
				feld.value = tmp.substring(0,tmp.length-3)+","+tmp.charAt(tmp.length-2)+"0";
				break;
			}
		}
	}
	/*Ende: BAV Rundung*/
	
	return true;
}

function setFRule(wh){
	var startFeld = null;
	oldX = (window.pageXOffset!=null)?window.pageXOffset:document.body.scrollLeft;
	oldY = (window.pageYOffset!=null)?window.pageYOffset:document.body.scrollTop;
	fObj = document.forms[wh];
	for(i=0;i<fObj.length;i++){
		feld=fObj.elements[i];
		if(feld.type!="hidden"&&(feld.disabled == null || (feld.disabled!=null&&!feld.disabled))){
			startFeld = (startFeld == null)?feld:startFeld;
			if(window.captureEvents){
				tmpFunc = feld.onfocus;
				if(tmpFunc!=null)tmpFunc();
			}else{
				feld.focus();
				feld.blur();
			}
		}
	}
	if(startFeld!=null){
		startFeld.focus();
	}
	window.scrollTo(oldX,oldY);
}

function submitForm(wh){
	//return true;
	fObj = document.forms[wh];
	for(i=0;i<fObj.length;i++){
		feld=fObj.elements[i];
		if(typeof fRule[feld.name]!="undefined"&&(!isProcessedByUser(feld)||!isValid(feld))){
			return false;
		}
	}
	return true;
}
