<!--
//
//(c) RSK Communication GmbH rsk@rsk.com
//
fv_kr = new Array()
fv_form = null
var fv_trim

function Kriterium(fehlerMeldung) {
	if(fehlerMeldung) {
		this.fehlerMeldung = fehlerMeldung
	}
	this.isValid = function() {	
		return false
	}
	this.args = false
	this.getFehlerMeldung = function () {
		var out_getFehlerMeldung = this.fehlerMeldung
		if(!this.isValid()) {
			out_getFehlerMeldung = false
		}	
		return out_getFehlerMeldung
	}
}

function EinfachKriterium(fehlerMeldung, wert, tr, prufungType, args) {
	if(tr) {
		if (isArray(wert)) {
			for(i = 0; i < wert.length; i++) {
				wert[i] = trim(wert[i])
			}
			this.wert = new Array()
		}else{
			wert = trim(wert)
		}
		
	}
	this.wert = wert
	this.inheritFrom = Kriterium
	this.inheritFrom(fehlerMeldung)
	this.negative = false
	this.args = args
	var Erg = prufungType.search(/isNot/);
	if(Erg != -1) {
		prufungType = prufungType.replace(/isNot/,"is");	
		this.negative = true
	}
	var Ergebnis = prufungType.search(/^hasValue_/);
	if(Ergebnis != -1) {
		prufungType = prufungType.replace(/^hasValue_/,"");	
	}
  
	eval("r = window.fv_" + prufungType)
	if (r) {
 		if(Ergebnis != -1) {
			if(isArray(wert)){
				eval("this.helpfunc = fv_" + prufungType)
				this.isValid = function () {
					var out2 = false
					ar_temp = this.wert
					for(var ip = 0; ip < ar_temp.length; ip++) {
						this.wert = ar_temp[ip]
						if (this.helpfunc() ^ this.negative) {
//							alert(ip)
							out2 = true
							break
						}			
					}
					return out2
				}
			}else{
				alert("You try to find a element in not Array")
				this.isValid = function() {
					alert("You try to find a element in not Array")
					return this.negative
				}
			}
		}else{	
				eval("this.helpfunc = fv_" + prufungType);
				this.isValid = function(){
					return (this.helpfunc() ^ this.negative)
				}
		}
	}else{
		alert("Function fv_" + prufungType + " is undefined")
	}
}

function fv_regExpres (re) {
	var out_isValid = false
	eval("var pruf = " + this.args )
	if ( pruf.test(this.wert) ) {
		out_isValid = true
	}
	return out_isValid
}

function fv_NotregExpres (re) {
	var out_isValid = true
	eval("var pruf = " + this.args )
	if ( pruf.test(this.wert) ) {
		out_isValid = false
	}
	return out_isValid
}

/*
function fv_regExpres () {
	var charpos = this.wert.search(this.args); 
        return !(this.wert.length > 0 &&  charpos >= 0);
}
*/

function getFieldValue(field)
{
   switch(field.type)
   {
      case "text" :
      case "textarea" :
      case "password" :
      case "hidden" :
         	return field.value

      case "select-one" :
         	var i = field.selectedIndex
         	if (i == -1) {
		 		return ""
			}else{
				if ( field.options[i].value == "" ) {
					return field.options[i].text
				}else{
					field.options[i].value
				}
			}

      case "select-multiple" :
         var allChecked = new Array()
         for(i = 0; i < field.options.length; i++)
            if(field.options[i].selected)
               if (field.options[i].value == "") {
			   		allChecked[allChecked.length] = field.options[i].text
			   }else{
			   		allChecked[allChecked.length] = field.options[i].value
			   }
         return allChecked

      case "button" :
      case "reset" :
      case "submit" :
         return ""

      case "radio" :
      case "checkbox" :
        if (field.checked) { 
		 		return field.value 
		} else { 
			return "" 
		}
      default :
         if(field[0].type == "radio") {
            for (i = 0; i < field.length; i++) {
               	if (field[i].checked) {
                	return field[i].value
				}
			}
            return "";
         }else if(field[0].type == "checkbox"){
         	var allChecked = new Array()
            for(i = 0; i < field.length; i++) {
               	if(field[i].checked) {
                  	allChecked[allChecked.length] = field[i].value
				}
			}
            return allChecked;
         }else{
            var str = ""
          	for (x in field) { 
				str += x + "\n" 
			}
            alert("I couldn't figure out what type this field is...\n\n" + field.name + ": ???\n\n\n" + str + "\n\nlength = " + field.length);
         }
		 break;
   }
   return "";
}



function LogicKriterium(fehlerMeldung, type, kriterium1, kriterium2) {
	this.type = type
	this.kriterium1 = kriterium1
	this.kriterium2 = kriterium2
	this.inheritFrom = Kriterium
	this.inheritFrom(fehlerMeldung)
	if (type == "AND" || type == "OR" || type == "NOT") {
		eval("this.isValid = isValid" + type)
	}else{
		alert("Type of logical Kriterium is not correct")
	}
}

function isValidNOT() {
	if 	(this.kriterium1 != null) {
		return !(this.kriterium1.isValid());
	}else{
		alert("Error by logikal operator NOT")
		return false
	}
}

function isValidAND() {
	if 	(this.kriterium1 != null && this.kriterium2 != null) {
		return (this.kriterium1.isValid() && this.kriterium2.isValid());
	}else{
		alert("Error by logikal operator AND")
		return false
	}
}

function isValidOR() {
	if 	(this.kriterium1 != null && this.kriterium2 != null) {
		return (this.kriterium1.isValid() || this.kriterium2.isValid());
	}else{
		alert("Error by logikal operator OR")
		return false
	}
}

function trim(inputString) {
	var retValue = inputString;
   	var ch = retValue.substring(0, 1);
   	while (ch == " ") { 
      	retValue = retValue.substring(1, retValue.length);
      	ch = retValue.substring(0, 1);
   	}
   	ch = retValue.substring(retValue.length-1, retValue.length);
   	while (ch == " ") { 
      	retValue = retValue.substring(0, retValue.length-1);
      	ch = retValue.substring(retValue.length-1, retValue.length);
   	}
   while (retValue.indexOf("  ") != -1) { 
   		retValue = retValue.substring(0, retValue.indexOf("  ")) + retValue.substring(retValue.indexOf("  ")+1, retValue.length);
   }
   return retValue;
}

function fv_hasValue() {
	for(j = 0; j < this.wert.length; j++) {
		if (this.wert[j] == this.args) {
			return true
		}
	}
	return false
}

function fv_isEmpty() {
		return (this.wert.length == 0);	
}

function fv_isLonger() {
	return (this.wert.length > this.args);
}

function fv_isShorter() {
	return (this.wert.length < this.args);
}

function fv_isBigger() {
	return (this.wert > this.args);
}

function fv_isLess() {
	return (this.wert < this.args);
}


function fv_isEmail() {
	var str = this.wert
	if( !str ) {
		str = "";
	}
	//var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
	var filter = /^(.+)@(.+)\.(.+)/i;
	return ( filter.test( str ) );
}

function fv_isInteger() {
   var anum=/(^\-{0,1}[1-9]\d*$)/	
   return (anum.test(this.wert));
}


function fv_isNumber() {
   	var anum=/(^\-{0,1}\d+$)/
	var	bnum=/(^\-{0,1}\d*[,|.]\d+$)/	
	return (bnum.test(this.wert) || anum.test(this.wert));
}

function fv_isNumeric() {
	var charpos = this.wert.search("[^0-9]"); 
	return !(this.wert.length > 0 &&  charpos >= 0);
}

function fv_isAlphabetic() {
	var charpos = this.wert.search("[^A-Za-zφόδΦάΔί]"); 
    	return !(this.wert.length > 0 &&  charpos >= 0);
}

function fv_isAlphanumeric() {
	var charpos = this.wert.search("[^A-Za-z0-9_]"); 
        return !(this.wert.length > 0 &&  charpos >= 0);
}

function fv_isPLZ() {
	var str = this.wert
	var filter=/^\d{5,5}$/
	return (filter.test(str));
}


function fv_isEqual(val) {
	return (this.wert == this.args);
} 

function fv_isEquali (val) {
	return (this.wert.toLowerCase() == this.args.toLowerCase());
}


// Start Date Validation  ************************************************************************

function daysInFebruary (year){
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}

function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function fv_isDateBefore() {
	
	var day 	= parseInt(this.wert.substring(0,2),10)
	var month 	= parseInt(this.wert.substring(3,5),10);
	var year 	= parseInt(this.wert.substring(6),10)
	var wert = new Date(year, month-1, day)
	var arg  = this.args
	return (wert.getTime() < arg.getTime());
}


function fv_isDate(){
	
	var dtCh= "."
	var minYear=1900
	var maxYear=2100
	
	var daysInMonth = DaysArray(12)
	var pos1=this.wert.indexOf(dtCh)
	var pos2=this.wert.indexOf(dtCh,pos1+1)
	var strDay=this.wert.substring(0,pos1)
	var strMonth=this.wert.substring(pos1+1,pos2)
	var strYear=this.wert.substring(pos2+1)
	
/*	
	if (strYear.length == 2) {
		if (parseInt(strYear) < 30) {
			strYear = "20" + strYear
		}else{
			strYear = "19" + strYear
		}
	}
*/
	
	strYr=strYear
	
// Das Datum soll genau in diesem Format sein TT.MM.JJJJ	
	
	if( strDay.length != 2) {
		return false
	}
	
	if( strMonth.length != 2) {
		return false
	}


	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)

	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		return false
	}

	if (month<1 || month>12 || isNaN(month)){
		return false
	}
	if (isNaN(day) || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		return false
	}

	if (isNaN(year) || strYear.length != 4 || year == 0 || year < minYear || year > maxYear){
		return false
	}
/*
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		return false
	}
*/	
	return true
}

// End Date Validation ***********************************************************************

function fv_define(fehler, field, funct, args) {
	var notRequired = false
	if(funct.charAt(0) == "*") {
		notRequired = true
		funct = funct.replace(/^\*/,"");
	}
	var atemp =null
 	var Ergebnis = funct.search(/^hasNoValue/);
 	if(Ergebnis != -1) {
		funct = funct.replace(/^hasNoValue/,"hasValue");
		atemp = new LogicKriterium(fehler, "NOT", fv_define(false, field, funct, args))
	}else{
		var value = false
		if (isArray(field)) {
			value = getMultiValue(field)
//			for(var i = 0; i < value.length; i++){
//				alert(value[i])
//			}
		}else{
			eval("var fld = fv_form." + field)
/*
			if (!fld) {
				alert("Feld " + field + " is undefined")
				return
			}		
*/
			value = getFieldValue(fld)
		}
		atemp = new EinfachKriterium(fehler, value, fv_trim, funct, args)
	}
	if (fehler) {
		if (notRequired) {
			tzu = fv_define(false, field, "isNotEmpty")
			fv_logik(fehler, "AND", atemp, tzu)
		}else{
			fv_kr[fv_kr.length] = atemp
		}
	}else{
		return atemp
	}
} 

function getMultiValue(ar) {
	var out3 = new Array()
	for(var i = 0; i < ar.length; i++) {
			var field = ar[i]
			eval("var fld = fv_form." + field)
			if (!fld) {
				alert("Feld " + field + " is undefined")
			}		
			var value = getFieldValue(fld)		
			if(isArray(value)) {
				out3 = out3.concat[value]
			}else{
				out3[out3.length] = value
			}
	}
	return out3
}

function fv_logik(fehler, type, krit1, krit2) {
	
	var atemp = new LogicKriterium(fehler, type, krit1, krit2)
	if (fehler) {
		fv_kr[fv_kr.length] = atemp
	}else{
		return atemp
	}
} 

function fv_checkAll (add_fehler) {
	size = fv_kr.length
	er = false
//	alert(fv_kr.length)
	out = ""
	if (add_fehler) out = add_fehler + "\n"
	for(i = 0; i < fv_kr.length; i++) {
		fh = fv_kr[i].getFehlerMeldung()
		if (fh) {
			er = true
			out = out + "\n # " + fh
			if (!add_fehler) {
				break
			}
		}
	}
	if (er) alert(out)
	return !er
}

function isArray() {
	if (typeof arguments[0] == 'object') {
		var criterion = arguments[0].constructor.toString().match(/array/i);
		return (criterion != null);
	}
	return false;
}
//-->