/*

---------------------------------------------------------------------------------------------------- 
call: required / req
desc: The field should not be empty 
---------------------------------------------------------------------------------------------------- 
call: maxlen=??? / maxlength=???
desc: checks the length entered data to the maximum. For example, if the maximum size permitted is 25, give the validation descriptor as "maxlen=25"  
----------------------------------------------------------------------------------------------------
call: minlen=??? / minlength=???
desc: checks the length of the entered string to the required minimum. example "minlen=5"  
----------------------------------------------------------------------------------------------------
call: alphanumeric / alnum
desc: Check the data if it contains any other characters other than alphabetic or numeric characters  
----------------------------------------------------------------------------------------------------
call: num / numeric
desc: Check numeric data  
----------------------------------------------------------------------------------------------------
call: alpha / alphabetic
desc: Check alphabetic data.  
----------------------------------------------------------------------------------------------------
call: email
desc: The field is an email field and verify the validity of the data.  
----------------------------------------------------------------------------------------------------
call: url
desc: The field is an url field and verify the validity of the data.  
----------------------------------------------------------------------------------------------------
call: phone
desc: The field is an phone field and verify the validity of the data.
----------------------------------------------------------------------------------------------------
call: postal
desc: The field is an postal code field and verify the validity of the data.
example:  [44240], [44240-5555], [T2P 3C7]
----------------------------------------------------------------------------------------------------
call: lt=??? / lessthan=???
desc: Verify the data to be less than the value passed. Valid only for numeric fields. 
example: if the value should be less than 1000 give validation description as "lt=1000"  
----------------------------------------------------------------------------------------------------
call: gt=??? / greaterthan=???
desc: Verify the data to be greater than the value passed. Valid only for numeric fields. 
example: if the value should be greater than 10 give validation description as "gt=10"  
----------------------------------------------------------------------------------------------------
call: regexp=???
desc: Check with a regular expression the value should match the regular expression.
example: "regexp=^[A-Za-z]{1,20}$" allow up to 20 alphabetic characters.  
----------------------------------------------------------------------------------------------------
call: dontselect=??
desc: This validation descriptor is valid only for select input items (lists) Normally, the select list boxes will have one item saying 'Select One' or some thing like that. The user should select an option other than this option. If the index of this option is 0, the validation description should be "dontselect=0"  
----------------------------------------------------------------------------------------------------

*/
function textCounter(field, countfield, maxlimit) {
  if (field.value.length > maxlimit){
    field.value = field.value.substring(0, maxlimit);
  }else{
    countfield.value = maxlimit - field.value.length;
  }
}

function validator(frmname) {
  this.formobj=document.forms[frmname];
	if(!this.formobj) {
	  alert("BUG: couldnot find the form object ["+frmname +"]");
		return;
	}
	
	if(!this.formobj.validator)
	{
	  this.formobj.validator = this;
	}
	
	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.add = add_validation;
	this.clear = clear_all_validations;
	this.before = null;
	this.after = null;
}
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() {
	if (this.validator.before) {
		if (!this.validator.before(this)) {
		  return false;	
		}
	}
	for(var itr=0;itr < this.elements.length;itr++) {
		if(this.elements[itr].validationset &&
	   !this.elements[itr].validationset.validate()) {
		  return false;
		}
	}
	if (this.validator.after) {
		if (!this.validator.after(this)) {
		  return false;	
		}
	}
	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)
	{
	  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)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
    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;
      }// if
      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"; 
              }//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 "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 "; 
                }//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 = objValue.name+": Only digits allowed "; 
                }//if               
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              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+": Only alphabetic characters allowed "; 
                }//if                             
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 
              break; 
           }//alpha 
		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 _"; 
                }//if                             
                alert(strError + "\n [Error character position " + eval(charpos+1)+"]"); 
                return false; 
              }//if 			
			break;
			}
        case "credit": 
           { 
            if(objValue.value.length > 0) {
            
            try {
              var tmp = eval(cmdvalue);
            }catch(e){
              var tmp = cmdvalue;
            }
            tmp = tmp.toLowerCase();
            
            if (tmp == "mc") {
               // Mastercard: length 16, prefix 51-55, dashes optional.
               var re = /^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/;
            } else if (tmp == "disc") {
               // Discover: length 16, prefix 6011, dashes optional.
               var re = /^6011-?\d{4}-?\d{4}-?\d{4}$/;
            } else if (tmp == "amex") {
               // American Express: length 15, prefix 34 or 37.
               var re = /^3[4,7]\d{13}$/;
            } else if (tmp == "diners") {
               // Diners: length 14, prefix 30, 36, or 38.
               var re = /^3[0,6,8]\d{12}$/;
            } else { //visa
               // Visa: length 16, prefix 4, dashes optional.
               var re = /^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/;
            }
            
              if(!objValue.value.match(re ))
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Enter a valid Credit Card "; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
             }
             break; 
            }//case credit 
        case "url": 
          { 
            if(objValue.value.length > 0) {
              if(!objValue.value.match(/^(http:\/\/)?\w+(\.\w+)+(\:\d+)?((\/\w+)+(\?\w+[\w&=.%\-]*)?)?$/i))
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Enter a valid URL "; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
             }
           break; 
          }//case url
        case "phone": 
          { 
            if(objValue.value.length > 0) {
              //if(!objValue.value.match('((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}'))
              if(!objValue.value.match(/^(\(?\d\d\d\)?)?( |-|\.)?\d\d\d( |-|\.)?\d{4,4}(( |-|\.)?[ext\.]+ ?\d+)?$/))
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Enter a valid Phone Number "; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
             }
           break; 
          }//case phone
        case "postal": 
          { 
            if(objValue.value.length > 0) {
              if(!objValue.value.match(/^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$/))
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Enter a valid Postal Code "; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
             }
           break; 
          }//case postal
        case "email": 
          { 
               if(!validateEmailv2(objValue.value)) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+": Enter a valid Email address "; 
                 }//if                                               
                 alert(strError); 
                 return false; 
               }//if 
           break; 
          }//case email
        case "custom": 
          { 
               if (cmdvalue) {
                 var func = eval(cmdvalue);
                 if (func) {
                   if(func(objValue.form)) {
                     return true;
                   }
                 }
               }
               if(!strError || strError.length ==0)  { 
                  strError = objValue.name+": Failed validation"; 
               }//if                                               
               alert(strError); 
               return false; 
           break; 
          }//case custom
        case "lt": 
        case "lessthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert(objValue.name+": 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 "gt": 
        case "greaterthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              alert(objValue.name+": 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 "regexp": 
         { 
		 	if(objValue.value.length > 0)
			{
	            if(!objValue.value.match(cmdvalue)) 
	            { 
	              if(!strError || strError.length ==0) 
	              { 
	                strError = objValue.name+": 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 = objValue.name+": Please Select one option "; 
              }//if                                                               
              alert(strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect 
    }//switch 
    return true; 
}