	function Validator(frmname) {
	 this.formobj=document.forms[frmname];
		if(!this.formobj) {
		 alert("FEHLER: Finde das Formular-Objekt '"+frmname+"' nicht !");
			return;
		}
		if(this.formobj.onsubmit) {
			this.formobj.old_onsubmit = this.formobj.onsubmit;
			this.formobj.onsubmit=null;
		}
		else {
			this.formobj.old_onsubmit = null;
		}
		this.formobj.onsubmit=form_submit_handler;
		this.addValidation = add_validation;
		this.setAddnlValidationFunction=set_addnl_vfunction;
		this.clearAllValidations = clear_all_validations;
	}
	
	function set_addnl_vfunction(functionname) {
	 this.formobj.addnlvalidation = functionname;
	}
	
	function clear_all_validations() {
		for(var itr=0;itr < this.formobj.elements.length;itr++) {
			this.formobj.elements[itr].validationset = null;
		}
	}
	
	function form_submit_handler() {
		for(var itr=0;itr < this.elements.length;itr++) {
			if(this.elements[itr].validationset &&
		 !this.elements[itr].validationset.validate()) {
			 return false;
			}
		}
		if(this.addnlvalidation) {
		 str =" var ret = "+this.addnlvalidation+"()";
		 eval(str);
	 if(!ret)
	 	return ret;
		}
		return true;
	}
	
	function add_validation_submit_button(itemname) {
	 	if(!this.formobj)
		{
			alert("FEHLER: Das Form-Objekt ist nich korrekt konfiguriert.");
			return;
		}
	}
	
	function add_validation(itemname,descriptor,errstr) {
		if(!this.formobj)
		{
			alert("FEHLER: Das Form-Objekt ist nich korrekt konfiguriert.");
			return;
		}
		var itemobj = this.formobj[itemname];
		if(!itemobj)
		{
			alert("FEHLER: Finde das Input-Objekt mit dem Namen '"+itemname+"' nicht !");
			return;
		}
		if(!itemobj.validationset)
		{
			itemobj.validationset = new ValidationSet(itemobj);
		}
		itemobj.validationset.add(descriptor,errstr);
	}

	function ValidationDesc(inputitem,desc,error) {
		this.desc=desc;
		this.error=error;
		this.itemobj = inputitem;
		this.validate=vdesc_validate;
	}

	function vdesc_validate() {
	 if(!V2validateData(this.desc,this.itemobj,this.error)) {
	 	this.itemobj.focus();
		return false;
	 }
	 return true;
	}

	function ValidationSet(inputitem) {
		this.vSet=new Array();
		this.add= add_validationdesc;
		this.validate= vset_validate;
		this.itemobj = inputitem;
	}

	function add_validationdesc(desc,error) {
	 this.vSet[this.vSet.length]=
		 new ValidationDesc(this.itemobj,desc,error);
	}
	function vset_validate() {
	 for(var itr=0;itr<this.vSet.length;itr++) {
		 if(!this.vSet[itr].validate()) {
			 return false;
			 }
		 }
		 return true;
	}

	function validateEmailv2(email) {
 if(email.length <= 0) {
		 return true;
		}
		var splitted = email.match("^(.+)@(.+)$");
		if(splitted == null)
			return false;
		if(splitted[1] != null ) {
			var regexp_user=/^\"?[\w-_\.]*\"?$/;
			if(splitted[1].match(regexp_user) == null)
				return false;
		}
		if(splitted[2] != null) {
			var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
			if(splitted[2].match(regexp_domain) == null) {
				var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
				if(splitted[2].match(regexp_ip) == null)
					return false;
			}
			return true;
		}
		return false;
	}

	function V2validateData(strValidateStr,objValue,strError) {
		var epos = strValidateStr.search("=");
		var command = "";
		var cmdvalue = "";

		if(epos >= 0) {
			command = strValidateStr.substring(0,epos);
			cmdvalue = strValidateStr.substr(epos+1);
		}
		else {
			command = strValidateStr;
		}

		switch(command) {

			case "req":
			case "required": {
				if(eval(objValue.value.length) == 0) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : Required Field";
					}
					alert(strError);
					return false;
				}
				break; 
			}//case required

			case "maxlength":
			case "maxlen": {
				if(eval(objValue.value.length) > eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : "+cmdvalue+" Zeichen maximum ";
					}
					alert(strError + "\n[Aktuelle Länge = " + objValue.value.length + " ]");
					return false;
				}
				break;
			}//case maxlen

			case "nreqmaxlength":
			case "nreqmaxlen": {
				if(eval(objValue.value.length) == 0) {
					break;
				}
				if(eval(objValue.value.length) > eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : "+cmdvalue+" Zeichen maximum ";
					}
					alert(strError + "\n[Aktuelle Länge = " + objValue.value.length + " ]");
					return false;
				}
				break;
			}//case maxlen
			
			case "minlength":
			case "minlen": {
				if(eval(objValue.value.length) < eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : " + cmdvalue + " Zeichen minimum ";
					}
					alert(strError + "\n[Aktuelle Länge = " + objValue.value.length + " ]");
					return false; 
				}
				break;
			}//case minlen

			case "nreqminlength":
			case "nreqminlen": {
				if(eval(objValue.value.length) == 0) {
					break;
				}
				if(eval(objValue.value.length) < eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : " + cmdvalue + " Zeichen minimum ";
					}
					alert(strError + "\n[Aktuelle Länge = " + objValue.value.length + " ]");
					return false; 
				}
				break;
			}//case minlen

			case "alnum":
			case "alphanumeric": {
				var charpos = objValue.value.search("[^A-Za-z0-9]");
				if(objValue.value.length > 0 && charpos >= 0) {
					if(!strError || strError.length ==0) {
						strError = objValue.name+": Nur Alphanumerische Zeichen erlaubt ";
					}
					alert(strError + "\n [Position des ersten fehlerhaften Zeichens " + eval(charpos+1)+"]");
					return false;
				}
				break;
			}//case alphanumeric

			case "num":
			case "numeric": {
				var charpos = objValue.value.search("[^0-9]");
				if(objValue.value.length > 0 && charpos >= 0) {
					if(!strError || strError.length ==0) {
						strError = objValue.name+": Nur Numerische Zeichen erlaubt ";
					}
					alert(strError + "\n [Position des ersten fehlerhaften Zeichens " + eval(charpos+1)+"]");
					return false;
				}
				break; 
			}//numeric

			case "alphabetic":
			case "alpha": {
				var charpos = objValue.value.search("[^A-Za-z]");
				if(objValue.value.length > 0 && charpos >= 0) {
					if(!strError || strError.length ==0) {
						strError = objValue.name+": Nur Alphabetische Zeichen erlaubt ";
					}
					alert(strError + "\n [Position des ersten fehlerhaften Zeichens " + eval(charpos+1)+"]");
					return false;
				}
				break;
			}

			case "alnumhyphen": {
				var charpos = objValue.value.search("[^A-Za-z0-9\-_]");
				if(objValue.value.length > 0 && charpos >= 0) {
					if(!strError || strError.length ==0) {
						strError = objValue.name+": Erlaubte Zeichen sind A-Z,a-z,0-9,- und _";
					}
					alert(strError + "\n [Position des ersten fehlerhaften Zeichens " + eval(charpos+1)+"]");
					return false;
				}			
				break;
			}

			case "email": {
				if(!validateEmailv2(objValue.value)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name+": Bitte geben Sie eine korrekte E-Mail-Adresse ein. ";
					}
					alert(strError);
					return false;
				}
				break;
			}//case email

			case "lt":
			case "lessthan": {
				if(isNaN(objValue.value)) {
					alert(objValue.name+": Nur Zahlen erlaubt");
					return false;
				}
				if(eval(objValue.value) >= eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : Die Zahl muss kleiner als "+ cmdvalue +" sein";
					}
					alert(strError);
					return false;
				}
				break;
			}//case lessthan

			case "gt":
			case "greaterthan": {
				if(isNaN(objValue.value)) {
					alert(objValue.name+": Nur Zahlen erlaubt");
					return false;
				}
				if(eval(objValue.value) <= eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name + " : Die Zahl muss groesser als "+ cmdvalue +" sein";
					}
					alert(strError);
					return false; 
				}
				break;
			}//case greaterthan

			case "regexp": {
				if(objValue.value.length > 0) {
					if(!objValue.value.match(cmdvalue)) {
						if(!strError || strError.length ==0) {
							strError = objValue.name+": Fehlerhafte Zeichen gefunden ";
						}
						alert(strError);
						return false; 
					}
				}
				break;
			}//case regexp

			case "dontselect": {
				if(objValue.selectedIndex == null) {
					alert("FEHLER: dontselect command for non-select Item");
					return false;
				}
				if(objValue.selectedIndex == eval(cmdvalue)) {
					if(!strError || strError.length ==0) {
						strError = objValue.name+": Please Select one option ";
					}
					alert(strError);
					return false; 
				}
				break;
			}//case dontselect

		}//switch

		return true;
	}


