function Validator(frmname) //creates new form object
{
  this.formobj=document.forms[frmname];
	if(!this.formobj)
	{
	  alert("BUG: couldnot get Form object "+frmname);
		return;
	}
	this.formobj.onsubmit=form_submit_handler; //calls the handler
	this.addValidation = add_validation; //adds a validation
}

function form_submit_handler() //checks all the elements for validation
{
	for(var itr=0;itr < this.elements.length;itr++)
	{
		if(this.elements[itr].validationset &&
	   !this.elements[itr].validationset.validate())
		{
		  return false;
		}
	}
	return true;
}

function add_validation(itemname,descriptor,errstr) //adds the validation
{
	var itemobj = this.formobj[itemname]; //new item object, with the item name itemname
	if(!itemobj.validationset)
	{
	  itemobj.validationset = new ValidationSet(itemobj); //validationset created for the item object
	}
  itemobj.validationset.add(descriptor,errstr); //the descriptor and the error string added to the item object validation
}

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

function vdesc_validate()
{
 if(!V2validateData(this.desc,this.itemobj,this.error)) //go to the validate function, and if false returned, focus the wrong item object
 {
    this.itemobj.focus();
		return false;
 }
 return true;
}

function ValidationSet(inputitem)
{
    this.vSet=new Array();
	this.add= add_validationdesc; //add the data needed to the validation
	this.validate= vset_validate; //validate all the needed descriptions
	this.itemobj = inputitem; //identify each object with its name
}

function add_validationdesc(desc,error)
{
  this.vSet[this.vSet.length]= 
	  new ValidationDesc(this.itemobj,desc,error);
}

function vset_validate() //validate all the needed descriptions
{
   for(var itr=0;itr<this.vSet.length;itr++)
	 {
	   if(!this.vSet[itr].validate())
		 {
		   return false;
		 }
	 }
	 return true;
}

function validateEmailv2(email) //function used to validate the emails
{
    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)  //function used to validate all the descriptions
{ 
    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": 
         { 
           if(eval(objValue.value.length) == 0) 
           { 
              if(!strError || strError.length ==0) 
              { 
                strError = objValue.name + " : Required Field"; 
              }
              alert(strError); 
              return false; 
           }
           break;             
         } 
        case "maxlen": 
          { 
             if(eval(objValue.value.length) >  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : "+cmdvalue+" characters maximum "; 
               }
               alert(strError); 
               return false; 
             }
             break; 
          }
        case "minlen": 
           { 
             if(eval(objValue.value.length) <  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : " + cmdvalue + " characters minimum  "; 
               }            
               alert(strError); 
               return false;                 
             }
             break; 
            }
        case "numeric": 
           { 
              var charpos = objValue.value.search("[^0-9 \\/-]"); 
              if(objValue.value.length > 0 && charpos >= 0 )
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+": Allowed characters: Space, - , / , \\ and digits "; 
                }            
                alert(strError); 
                return false; 
              }
			  
              break;               
           }
        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 "; 
                }                     
                alert(strError); 
                return false; 
              }
              break; 
           }
		
        case "email": 
          { 
               if(!validateEmailv2(objValue.value)) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = "Enter a valid Email address "; 
                 }                                               
                 alert(strError); 
                 return false; 
               }
           break; 
          } 
        case "lt": 
         { 
            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": 
         { 
            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 "dontselect": 
         { 
            if(objValue.selectedIndex == eval(cmdvalue)) 
            { 
             if(!strError || strError.length ==0) 
              { 
              strError = objValue.name+": Please Select one option "; 
              }                                                             
              alert(strError); 
              return false;                                   
             } 
             break; 
         }
    }
    return true; 
}
