function Validator(frmname/*,btn*/){
	this.formobj=document.forms[frmname];
	
	if(!this.formobj){
	  alert("BUG: couldnot get Form object "+frmname);
		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;
	//this.my_form_submit=form_submit_handler;
}

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;
	}
	//afto itan TRUE
	
	//if (synchronous) {
//		return true;
//	} else {
//		return false;
//	}
	
	return true;
}

function add_validation(itemname,descriptor,errstr){
  if(!this.formobj){
	  alert("BUG: the form object is not set properly");
		return;
	}
	
	var itemobj = this.formobj[itemname];
  if(!itemobj){
	  alert("BUG: Could not get the input object named: "+itemname);
		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){
	//emailRegExp=new RegExp('^[A-Z0-9a-z\\!\\#\\$\\%\\&\\\'\\*\\+\\-\\/\\=\\?\\\^\\_\\`\\.\\{\\|\\}\\~]{1,64}@([A-Za-z0-9-]{1,63}\\.){1,}[A-Za-z0-9]{2,6}$/');

  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 "maxlength": 
        case "maxlen":{ 
             if(eval(objValue.value.length) >  eval(cmdvalue)){ 
               if(!strError || strError.length ==0){ 
                 strError = objValue.name + " : "+cmdvalue+" characters maximum "; 
               }
               alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
               return false; 
             }
             break; 
          }
        case "minlength": 
        case "minlen":{ 
						 if(objValue.value.length > 0){
									 if(eval(objValue.value.length) <  eval(cmdvalue)){ 
										 if(!strError || strError.length ==0){ 
											 strError = objValue.name + " : " + cmdvalue + " characters minimum  "; 
										 }              
										 alert(strError); 
										 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+": Only alpha-numeric characters allowed "; 
                }
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }
              break; 
           }
        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+": Only digits allowed "; 
                	}              
                	alert(strError); 
                	return false; 
              	}
              break;               
           }
				case "allnum": 
        case "allnumber":{
							if(objValue.value.length > 0){
									var myregexp = new RegExp("[-+]?\\b(?:[0-9]*\\.)?[0-9]+\\b");
									var match = myregexp.test(objValue.value.toString());
									if(match == false){
										strError = objValue.name+": Only digits allowed ";
										alert(strError); 
										return false; 
									}
							}
              break;               
           } 
        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+": Only alphabetic characters allowed "; 
                }                           
                alert(strError + "\n [Error character position " + 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+": characters allowed are A-Z,a-z,0-9,- and _"; 
								}                           
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }			
							break;
						}
        case "email":{ 
               if(!validateEmailv2(objValue.value)){ 
                 if(!strError || strError.length ==0){ 
                    strError = objValue.name+": Enter a valid Email address "; 
                 }                                              
                 alert(strError); 
                 return false; 
               }
           		break; 
          	}
        case "lt": 
        case "lessthan":{ 
            if(isNaN(objValue.value)){ 
              alert(objValue.name+": Should be a number "); 
              return false; 
            }
            if(eval(objValue.value) >=  eval(cmdvalue)){ 
              if(!strError || strError.length ==0){ 
                strError = objValue.name + " : value should be less than "+ cmdvalue; 
              }              
              alert(strError); 
              return false;                 
            }            
            break; 
         	}
        case "gt": 
        case "greaterthan":{ 
							if(isNaN(objValue.value)){ 
								alert(objValue.name+": Should be a number "); 
								return false; 
							}
							 if(eval(objValue.value) <=  eval(cmdvalue)){ 
								 if(!strError || strError.length ==0){ 
									 strError = objValue.name + " : value should be greater than "+ cmdvalue; 
								 }               
								 alert(strError); 
								 return false;                 
							 }            
							break; 
					 }
				case "eq": 
        case "equal":{ 
            if(isNaN(objValue.value)){ 
              alert(objValue.name+": Should be a number "); 
              return false; 
            } 
            if(eval(objValue.value) ==  eval(cmdvalue)){ 
               if(!strError || strError.length ==0){ 
                 strError = objValue.name + " : value should be equal than "+ cmdvalue; 
               }              
               alert(strError); 
               return false;                 
            }            
            break; 
         }
        case "regexp":{ 
							if(objValue.value.length > 0){
								if(!objValue.value.match(cmdvalue)){ 
									if(!strError || strError.length ==0){ 
										strError = objValue.name+": Invalid characters found "; 
									}                                                              
									alert(strError); 
									return false;                   
								} 
							}
						 break; 
					 }
        case "dontselect":{ 
							if(objValue.selectedIndex == null){ 
								alert("BUG: 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 "havenot": { 
						if(objValue.value.toString()==cmdvalue.toString()){; 
							if(!strError || strError.length ==0){ 
								strError = objValue.name+": Invalid string "+objValue.value+" "; 
							}
							alert(strError);
							return false;
						} 
						break;
					}
		}
	return true; 
}