function Validator(frmname)
{
  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.validateAll=all_validation;
}
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].length && !this.elements[itr].options){
			for(i=0;i<this.elements[itr].length;i++){
				if(this.elements[itr][i].validationset && !this.elements[itr][i].validationset.validate())
				{
					return false;
				}
			}
		}else{
			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 all_validation(frm)
{
	for(var itr=0;itr < frm.elements.length;itr++)
	{
		if(frm.elements[itr].length && !frm.elements[itr].options){
			for(i=0;i<frm.elements[itr].length;i++){
				if(frm.elements[itr][i].validationset && !frm.elements[itr][i].validationset.validate())
				{
					return false;
				}
			}
		}else{
			if(frm.elements[itr].validationset && !frm.elements[itr].validationset.validate())
			{
				return false;
			}
		}
	}
	if(frm.addnlvalidation)
	{
	  str =" var ret = "+frm.addnlvalidation+"()";
	  eval(str);
    if(!ret) return ret;
	}
	return true;
}

function add_validation(itemname,descriptor,errstr)
{
  if(!this.formobj)
	{
	  alert("BUG: the form object is not set properly");
		return;
	}//if
	var itemobj = this.formobj[itemname];
  if(!itemobj)
	{
	  alert("BUG: Couldnot get the input object named: "+itemname);
		return;
	}
	if(!itemobj.validationset)
	{
		if(itemobj.length && !itemobj.options){
			for(i=0;i<itemobj.length;i++) itemobj[i].validationset = new ValidationSet(itemobj[i]);
		}else{
			itemobj.validationset = new ValidationSet(itemobj);
		}
	}
	if(itemobj.length && !itemobj.options){
		for(i=0;i<itemobj.length;i++) itemobj[i].validationset.add(descriptor,errstr);
	}else{
		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))
 {
    if(this.itemobj.focus) 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)
{
	//email validation checking. 
	if(email.length <= 0)
	{
		return true;
	}
	var splitted = email.match("^(.+)@(.+)$");
	if(splitted == null) return false;
	//alert(splitted[1]+" "+splitted[2]);
	if(splitted[1] != null )
	{
		var regexp_user=/^[A-Za-z][\w\-_\.]*$/;
//	var regexp_user=/^[_a-z0-9-]+(\.[_a-z0-9-]+)*/;
		if(splitted[1].match(regexp_user) == null){
			//alert("user did not match");
			return false;
		}
	}
	if(splitted[2] != null)
	{
		var regexp_domain=/^[\w\-]+(\.([A-Za-z]){2,4}){1,2}$/;
//		var regexp_domain=/[a-z0-9-]+(\.[a-z0-9-]+)+$/;
		if(splitted[2].match(regexp_domain) == null)
		{
			//alert("domain did not match");
			var regexp_ip ="^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$";
			if(splitted[2].match(regexp_ip) == null){
				//alert("IP did not match");
				return false;
			}
		}// if
		return true;
	}
	return false;
}

function validateEmailv3(cemail)
{
	if(cemail.length <= 0){return true;}
	var emails = cemail.split(",");
	for(i=0;i<emails.length;i++){
		if(!validateEmailv2(emails[i])) return false;
	}
	return true;
}

function validateEmailv5(email)
{
	//email validation checking. 
	if(email.length <= 0)
	{
		alert("Email Id missing between two commas");
		return false;
	}

	var strError1;

	var charpos = email.search("[^A-Za-z0-9\-_.@]"); 
	if(email.length > 0 &&  charpos >= 0) 
	{ 
		if(!strError1 || strError1.length ==0) 
		{ 
			strError1="Invalid EMail Id.\n Characters allowed are A-Z,a-z,0-9,.,@,- and _"; 
    }
		alert(strError1 + "\n" + email+": [Error character position " + eval(charpos+1)+"]"); 
    return false;
	}

	return true;
}

function validateEmailv4(cemail)
{
	if(cemail.length <= 0){return true;}
	var emails = cemail.split(",");
	for(i=0;i<emails.length;i++){
		if(!validateEmailv2(emails[i])){
			return false;
		}
	}
	return true;
}

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; 
    }
		if(objValue.options){
			var nam=objValue.name;
			objValue=objValue.options[objValue.selectedIndex];
			objValue.name=nam;
		}
    switch(command) 
    { 
        case "req": 
        case "required": 
         { 
           if(eval(objValue.value.length) == 0) 
           { 
              if(!strError || strError.length ==0) 
              {
                strError = objValue.name + " : Required Field"; 
              }//if 
              alert(strError); 
              return false;
           }//if 
           break;             
         }//case required 
        case "maxlength": 
        case "maxlen": 
          { 
             if(eval(objValue.value.length) >  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : "+cmdvalue+" characters maximum "; 
               }//if 
               alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
               return false; 
             }//if 
             break; 
          }//case maxlen 
        case "minlength": 
        case "minlen": 
           { 
             if(eval(objValue.value.length) <  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : " + cmdvalue + " characters minimum  "; 
               }//if               
               alert(strError + "\n[Current length = " + objValue.value.length + " ]"); 
               return false;                 
             }//if 
             break; 
            }//case minlen 

        case "ipadd": 
        case "ipAddress": 
           {
							var ipAddrPat = new RegExp("^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$");
              var charpos = ipAddrPat.test(objValue.value);
							if(objValue.value.length > 0 &&  !charpos) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = "is not a valid IP address format";
                }//if 
                alert(strError); 
                return false; 
              }
              break; 
           }
				case "1d":
					{
						var oneDecimalPat = new RegExp("^\\d+(?:\\.\\d)?$|^\\.\\d$");
						var doesMatch = oneDecimalPat.test(objValue.value);
						if(objValue.value.length > 0 && !doesMatch){
							if(!strError || strError.length ==0) 
							{ 
								strError = "should be +ve number without sign.\nAnd must have this format(Ex 0.0)";
							}//if 
							alert(strError); 
							return false; 
						}
						break;
					}
				case "2d":
					{
						var twoDecimalPat = new RegExp("^\\d+(?:\\.\\d{1,2})?$|^\\.\\d{1,2}$");
						var doesMatch = twoDecimalPat.test(objValue.value);
						if(objValue.value.length > 0 && !doesMatch){
							if(!strError || strError.length ==0) 
							{ 
								strError = "should be +ve number without sign.\nAnd must have this format(Ex 0.00)";
							}//if 
							alert(strError); 
							return false; 
						}
						break;
					}
         case "4d":
					{
						var twoDecimalPat = new RegExp("^\\d+(?:\\.\\d{1,4})?$|^\\.\\d{1,4}$");
						var doesMatch = twoDecimalPat.test(objValue.value);
						if(objValue.value.length > 0 && !doesMatch){
							if(!strError || strError.length ==0) 
							{ 
								strError = "should be +ve number without sign.\nAnd must have this format(Ex 0.0000)";
							}//if 
							alert(strError); 
							return false; 
						}
						break;
					}
				case "1m2d":
					{
						var twoDecimalPat = new RegExp("^\\d{1}(?:\\.\\d{2})?$|^\\.\\d{2}$");
						var doesMatch = twoDecimalPat.test(objValue.value);
						if(objValue.value.length > 0 && !doesMatch){
							if(!strError || strError.length ==0) 
							{ 
								strError = "should be +ve number without sign.\nAnd must have following format 0.00";
							}//if 
							alert(strError); 
							return false; 
						}
						break;
					}

//**********************************************
        case "nowild": 
        case "nowildchar": 
           { 
              var charpos = objValue.value.search("[^A-Za-z0-9?*_/]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = "Special Character Not allowed Except  * ? _ / ";
                }//if 
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }//case alphanumeric 


        case "nowildchar1": 
           { 
              var charpos = objValue.value.search("[^A-Za-z0-9_]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = "Special Character Not allowed Except _ ";
                }//if 
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }//case alphanumeric 

   case "nowildn": 
        case "nowildnum": 
           { 
              var charpos = objValue.value.search("[^0-9?*]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = "Only Numbers,  * and ?  are allowed  ";
                }//if 
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }     
        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 = "Only alpha-numeric characters allowed ";
                }//if 
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }//case alphanumeric 
        case "name": 
           { 
              var charpos = objValue.value.search("[^A-Za-z .]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = "Only alphabetic characters allowed";
                }//if 
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              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 = "Only Numbers allowed ";
                }else{
                  strError = strError+": Only Numbers allowed "; 
                }

                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
				//alert(strError); 
                return false; 
              }//if 
              break;               
           }//numeric 
		   case "tim": 
           case "timval": 
           { 
              var charpos = objValue.value.search("[^0-9:]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = "Only Numbers/Colon allowed ";
                }//if               
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
				//alert(strError); 
                return false; 
              }//if 
			
			 break;               
           }

			case "timeCh":
			case "timeCheck":
			{
				var hours;
				var minutes;		
				var strError;	 		
				
				if(objValue.value.indexOf(":") == -1) {
					switch(objValue.value.length){
					case 1: 
					case 2:objValue.value=objValue.value+":00"; break;
					case 3:objValue.value=objValue.value.substring(0,2)+":"+objValue.value.substring(2,4)+"0"; break;
					case 4:objValue.value=objValue.value.substring(0,2)+":"+objValue.value.substring(2,4); break;
					case 5:objValue.value=objValue.value.substring(0,2)+":"+objValue.value.substring(2,4); break;
					}
				}
				
				
				hours = objValue.value.substring(0,2);
				if(hours > 23 || hours < 0)
				{
				strError = "Please enter correct hours ";
				alert(strError + "\n [Error character position " + eval(1)+"]");
				return false;
				}

				
				minutes = objValue.value.substring(3,5);
				if(minutes > 59 || minutes < 0)
				{
				strError = "Please enter correct minutes ";
				alert(strError + "\n [Error character position " + eval(4)+"]");
				return false;
				}
				break;	
			}
		   //******************
		   case "DecNum": 
        case "DecimalNumber": 
           { 
              var charpos = objValue.value.search("[^0-9.]"); 
              if(objValue.value.length >= 0 &&  charpos >= 0) 
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = "Only digits/Decimal Number allowed ";
                }//if               
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
				//alert(strError); 
                return false; 
              }//if 
              break;               
           }//Decimal Number
		   //*******************
        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 = "Only alphabetic characters allowed ";
                }//if                             
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
				
                return false; 
              }//if 
              break; 
           }//alpha 
		case "timeFinal": 
           { 
                    //var timePat = /^(\d{1,2}):(\d{2})$/;
                      var timePat = /^(\d{2}):(\d{2})$/;
                    var matchArray = objValue.value.match(timePat);
                    if(objValue.value.length > 0){
                            if (matchArray == null) {
                                    alert("Time is not in a valid format.\nAllowed format is HH:MM.");
                                    return false;
                            }
                            hour = matchArray[1];
                            minute = matchArray[2];
                            if (hour < 0  || hour > 23) {
                                    alert("Hour must be between 0 and 23");
                                    return false;
                            }
                            if (minute<0 || minute > 59) {
                                    alert ("Minute must be between 0 and 59.");
                                    return false;
                            }
                    }
                    break;
        }
		case "asnhq":
			{
              //var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
			  var charpos = objValue.value.search("[^A-Za-z0-9 \-\?,]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                  if(!strError || strError.length ==0) 
                { 
                  strError = "Only A-Z,a-z,0-9,-, ,? are allowed characters.";
                }//if                             
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 			
			break;
			}
		case "alnumhy":
		case "alnumhyphen":
			{
              //var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
			  var charpos = objValue.value.search("[^A-Za-z0-9\-_.:!,@\#]"); 
              if(objValue.value.length > 0 &&  charpos >= 0) 
              { 
                  if(!strError || strError.length ==0) 
                { 
                  strError = "Only A-Z,a-z,0-9,-,_,.,:,! are allowed characters.";
                }//if                             
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 			
			break;
			}
        case "email": 
          { 
               if(!validateEmailv2(objValue.value)) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = "Enter a valid Email address ";
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
           break; 
          }//case email 

        case "emailcommasep": 
          { 
               if(!validateEmailv3(objValue.value))
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = "Enter a valid Email address ";
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
           break; 
          }//case email           

        case "emailcommasepnewlist": 
          { 
               if(!validateEmailv4(objValue.value))
               { 
                 //if(!strError || strError.length ==0) 
                 //{ 
                    //strError = "Enter a valid Email address ";
                 //}//if                                               
                 //alert(strError); 
                 return false; 
               }//if 
           break; 
          }//case email           
         
        case "emailsemicsep": 
          { 
               if(!validateEmailv4(objValue.value))
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = "Enter a valid Email address ";
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if
           break; 
          }//case email           

        case "lt": 
        case "lessthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert("Should be a number ");
              return false; 
            }//if 
            if(eval(objValue.value) >=  eval(cmdvalue)) 
            { 
              if(!strError || strError.length ==0) 
              { 
                strError = objValue.name + " : value should be less than "+ cmdvalue; 
              }//if               
              alert(strError); 
              return false;                 
             }//if             
            break; 
         }//case lessthan 
        case "le": 
        case "lessorequal": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert("Should be a number ");
              return false; 
            }//if 
            if(eval(objValue.value) >  eval(cmdvalue)) 
            { 
              if(!strError || strError.length ==0) 
              { 
                strError = objValue.name + " : value should be less than or equal to "+ cmdvalue; 
              }//if               
              alert(strError); 
              return false;                 
             }//if             
            break; 
         }//case lessthan 
        case "gt": 
        case "greaterthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert("Should be a number ");
              return false; 
            }//if 
             if(eval(objValue.value) <=  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : value should be greater than "+ cmdvalue; 
               }//if               
               alert(strError); 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 
        case "ge": 
        case "greaterorequal": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert("Should be a number ");
              return false; 
            }//if 
             if(eval(objValue.value) <  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : value should be greater than or equal to "+ cmdvalue; 
               }//if               
               alert(strError); 
               return false;                 
             }//if             
            break; 
         }//case greaterthan 
				case "regexp": 
				{	 
					if(objValue.value.length > 0)
					{
	            if(!objValue.value.match(cmdvalue)) 
	            { 
	              if(!strError || strError.length ==0) 
	              { 
	                strError = "Invalid characters found ";
	              }//if                                                               
	              alert(strError); 
	              return false;                   
	            }//if 
					}
					break; 
        }//case regexp 
        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 = "Please Select one option ";
              }//if                                                               
              alert(strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect 
    }//switch 
    return true; 
}
