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.clearValidation = clear_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 clear_validation(itemname) {
  if(!this.formobj)
   {
     alert("BUG: clear_validation,the form object is not set properly ("+itemname+")");
      return;
   }//if
   var itemobj = this.formobj[itemname];
  if(!itemobj)
   {
     alert("BUG: Couldnot get the input object named: "+itemname);
      return;
   }
   if(itemobj.validationset)
   {
     //if (itemname=="richting")
     //   alert("clear_validation ("+itemname+")");
     itemobj.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 form_submit(form)
{
   for(var itr=0;itr < form.elements.length;itr++)
   {
      if(form.elements[itr].validationset &&
      !form.elements[itr].validationset.validate())
      {
        return false;
      }
   }
   //SaveCookie(form.name,30); 
   return true;
}


function add_validation(itemname,descriptor,errstr)
{
  if(!this.formobj)
   {
     alert("BUG: add_validation,the form object is not set properly ("+itemname+")");
      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);
   //if (itemname=="richting")
   //  alert("add_validation ("+itemname+")");
}


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.type != "hidden")
       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 validateTelephone(telnr)
{
   if(!telnr.match(/(^0[0-9-]{9,10})/))
   {
     return false;
   } else {
   }
   return true 
}

function validateIBGnr(ibgnr) {
   return (ibgnr.match(/(^[0-9]{4}[-]{0,1}[0-9]{5}[-]{0,1}[0-9][-]{0,1}[0-9]{2}$)/));
}

function validateDate(date)
{
   var splitted= date.match("([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})");
   //alert (splitted[1]);
   if(!date.match(/([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})/))
   {
     return false;
   } else {
     day = parseFloat(splitted[1])
     //alert(day); 
     month = parseFloat(splitted[2]) - 1
     year = parseFloat(splitted[3])
     //alert("-"+day+"-"+month+"-"+year)
     d = new Date();
     d.setFullYear(year)
     d.setDate(day)
     d.setMonth(month)
     d.setDate(day)
     //alert("sdsad");
     //alert(d.toString());
     //alert(d.getDate())
     //alert(parseFloat(d.getMonth()))
     //alert(month)
     //alert(d.getFullYear())
     //alert(parseFloat(" "+d.getDate())+"-"+parseFloat(d.getMonth())+"-"+parseFloat(d.getFullYear()))
     
     if (parseFloat(d.getDate()) != day || parseFloat(d.getMonth()) != month || parseFloat(d.getFullYear()) != year) {
        return false;
     }
   }
   return true 
}

function GetYearFromDate(date) { 
   var splitted= date.match("([0-9]{1,2})-([0-9]{1,2})-([0-9]{4})");
   if(splitted != null) {
     // alert(splitted.length); 
      if (splitted.length == 4) {
      // alert(splitted[3]);
         return splitted[3];
      }
   }
   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":
         {
         //alert(objValue.id +", "+strError)
           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 "telephone":
         {
            if(objValue.value.length > 0)
            {
               if(!validateTelephone(objValue.value)) 
               {
                 if(!strError || strError.length ==0)
                 {
                   strError = objValue.name+": Invalid telephone number found ";
                 }//if
                 alert(strError);
                 return false;
               }
            }
            break; 
         }
        case "date":
         {
            if(objValue.value.length > 0)
            {
               if(!validateDate(objValue.value)) 
               {
                 if(!strError || strError.length ==0)
                 {
                   strError = objValue.name+": Invalid date found ";
                 }//if
                 alert(strError);
                 return false;
               }
            }
            break; 
         }
        case "ibgnr":
            // Als een leerling, scholier of student (nog) geen sofi-nummer heeft, wordt er een alternatief nummer toegekend 
            // door de IB-Groep.
            //
            if(objValue.value.length >0) {
               if(!validateIBGnr(objValue.value)) {
                 if(!strError || strError.length ==0) {
                   strError = objValue.name+": Invalid IBGnr found ";
                 }
                 alert(strError);
                 return false;
               }
            }
            break; 
        case "agelt":
         {
            if(objValue.value.length > 0)
            {
               year = GetYearFromDate(objValue.value)
               if (year) {
                  d = new Date();

                  if(d.getFullYear() - parseInt(year) >=  eval(cmdvalue))
                  {
                     //alert(year); 
                     if(!strError || strError.length ==0)
                     {
                       strError = objValue.name + " : value should be less than "+ cmdvalue;
                     }//if
                     alert(strError);
                     return false;
                  }//if
               } //if year
            }
            break;
         }//case agelt
        case "agegt":
         {
            if(objValue.value.length > 0)
            {
               year = GetYearFromDate(objValue.value)
               if (year) {
                  d = new Date();

                  if(d.getFullYear() - parseInt(year) <=  eval(cmdvalue))
                  {
                     //alert(year); 
                     if(!strError || strError.length ==0)
                     {
                       strError = objValue.name + " : value should be less than "+ cmdvalue;
                     }//if
                     alert(strError);
                     return false;
                  }//if
               } //if year
            }
            break;
         }//case agegt
        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 "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 select
        case "select":
          {
            if(objValue.selectedIndex == null)
            {
              alert("BUG: dontselect command for non-select Item");
              return false;
            }
            if (cmdvalue == "")
               cmdvalue = 0; 
            if(objValue.selectedIndex < eval(cmdvalue))
            {
                if(!strError || strError.length ==0)
                 {
                    strError = objValue.name+": Please Select one option ";
                 }//if
                 alert(strError);
                 return false;
             }
             break;select
         }//case dontselect
    }//switch
    return true;
}

