function validateEmail(email)
{
  if (email=="") 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,6}$/;
    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 trim(s){return s.replace(/^\s*/g,"").replace(/\s*$/g,"");}
function dtFmtNo(s){s=s.toLowerCase(); if(s=='d'||s=='h')return 0; if(s=='m')return 1; if(s=='y'||s=='s')return 2; return 0;}
function dtFmt(v){return (v<10&&v>=0?"0":"")+v;}
function pInt(v){return parseInt(v.replace(/^0*/g,""));}

function validateDate(objValue,strFmt)
{
  if (objValue.value=="") return true;
  var d=new Array(3); d[0]=1; d[1]=1; d[2]=0;
  var dt;
  var splitted=objValue.value.match("^([0-9]+)[/.-]([0-9]+)([/.-]([0-9]+))?$");
  if(splitted==null) return false;
  
  d[dtFmtNo(strFmt.charAt(0))]=pInt(splitted[1]);
  d[dtFmtNo(strFmt.charAt(2))]=pInt(splitted[2]);

  if (strFmt.length<5) { if (splitted[4]!="") return false; }
  else
  {
    if (splitted[4]=="") return false;
    d[dtFmtNo(strFmt.charAt(4))]=pInt(splitted[4]);
  }
  if (d[2]<100){if(d[2]>50)d[2]=1900+d[2];else d[2]=2000+d[2];}
  if (d[0]<=0||d[0]>31||d[1]<=0||d[1]>12) return false;
  d[1]-=1;
  dt = new Date(d[2],d[1],d[0]);

  c=strFmt.charAt(1);
  d[0]=dt.getDate();
  d[1]=dt.getMonth()+1;
  d[2]=dt.getYear();
  if (d[2]<100){if(d[2]>50)d[2]=1900+d[2];else d[2]=2000+d[2];}
  s=dtFmt(d[dtFmtNo(strFmt.charAt(0))])+c+dtFmt(d[dtFmtNo(strFmt.charAt(2))]);
  if (strFmt.length>=5) s+=c+dtFmt(d[dtFmtNo(strFmt.charAt(4))]);
  objValue.value=s;

  return true;
}

function validateTime(objValue,strFmt)
{
  if (objValue.value=="") return true;
  var d=new Array(3); d[0]=0; d[1]=0; d[2]=0;
  var splitted=objValue.value.match("^([0-9]+)[:.]([0-9]+)([:.]([0-9]+))?$");
  if(splitted==null) return false;
  
  d[dtFmtNo(strFmt.charAt(0))]=pInt(splitted[1]);
  d[dtFmtNo(strFmt.charAt(2))]=pInt(splitted[2]);
  if (splitted[4]!="") d[dtFmtNo(strFmt.charAt(4))]=pInt(splitted[4]);

  if (d[0]<0||d[0]>=24||d[1]<0||d[1]>=60||d[2]<0||d[2]>=60) return false;
  
  c=strFmt.charAt(1);
  s=dtFmt(d[dtFmtNo(strFmt.charAt(0))])+c+dtFmt(d[dtFmtNo(strFmt.charAt(2))]);
  if (strFmt.length>=5) s+=c+dtFmt(d[dtFmtNo(strFmt.charAt(4))]);
  objValue.value=s;

  return true;
}

function validateFoc(o){if(!o.disabled&&o.type!="hidden")o.focus();}
function validateError(objValue,strDescr,msg)
{
  if(!strDescr||strDescr.length==0) strDescr=objValue.name;
  alert(strDescr+msg);
  validateFoc(objValue);
}

function validateData(strCheckRule,objValue,strDescr)
{
  var epos=strCheckRule.search("=");
  var command="";
  var cmdvalue="";
  if(epos>=0){ command=strCheckRule.substring(0,epos); cmdvalue=strCheckRule.substr(epos+1); }
  else { command = strCheckRule; }

  switch(command)
  {
    case "req": case "required":
    {
      if(eval(objValue.value.length)==0) { validateError(objValue,strDescr," : Required Field"); return false; }
      break;
    }
    case "maxlen": case "maxlength":
    {
      if(eval(objValue.value.length)>eval(cmdvalue)) { validateError(objValue,strDescr," : "+cmdvalue+" characters maximum\n[Current length = " + objValue.value.length + " ]"); return false; }
      break;
    }
    case "minlen": case "minlength":
    {
      if(eval(objValue.value.length) < eval(cmdvalue)) { validateError(objValue,strDescr," : " + cmdvalue + " characters minimum\n[Current length = " + objValue.value.length + " ]"); return false; }
      break;
    }
    case "alnum": case "alphanumeric":
    {
      var rg=/[^A-Za-z0-9]/;
      switch(cmdvalue)
      {
        case "rus": rg=/[^A-Za-z0-9À-ßà-ÿ]/; break; 
        case "word": rg=/[^A-Za-z0-9_]/; break; 
        case "wordrus": rg=/[^A-Za-z0-9_À-ßà-ÿ]/; break; 
      }
      var charpos=objValue.value.search(rg);
      if(objValue.value.length>0 && charpos>=0) { validateError(objValue,strDescr," : Only alpha-numeric characters allowed\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) { validateError(objValue,strDescr," : Only digits allowed\n [Error character position " + eval(charpos+1)+"]"); return false; }
      break;
    }
    case "int": case "integer":
    {
      if(!objValue.value.match("^-?[0-9]*$")) { validateError(objValue,strDescr," : Need integer value"); return false; }
      break;
    }
    case "float":
    {
      if(!objValue.value.match("^-?[0-9]*[.]?[0-9]*$")) { validateError(objValue,strDescr," : Need float value"); return false; }
      break;
    }
    case "alpha": case "alphabetic":
    {
      var rg=/[^A-Za-z]/;
      switch(cmdvalue)
      {
        case "rus": rg=/[^A-Za-zÀ-ßà-ÿ]/; break; 
        case "word": rg=/[^A-Za-z_]/; break; 
        case "wordrus": rg=/[^A-Za-z_À-ßà-ÿ]/; break; 
      }
      var charpos=objValue.value.search(rg);
      if(objValue.value.length>0 && charpos>=0) { validateError(objValue,strDescr," : Only alphabetic characters allowed\n [Error character position " + eval(charpos+1)+"]"); return false; }
      break;
    }
    case "trim":
    {
      objValue.value=trim(objValue.value);
      break;
    }
    case "nosp":
    {
      var charpos=objValue.value.search(/\s/);
      if(objValue.value.length>0 && charpos>=0) { validateError(objValue,strDescr," : Any space characters not allowed\n [Error character position " + eval(charpos+1)+"]"); return false; }
      break;
    }
    case "email":
    {
      if(!validateEmail(objValue.value)) { validateError(objValue,strDescr," : Enter a valid Email address"); return false; }
      break;
    }
    case "date":
    {
      if(!validateDate(objValue,cmdvalue)) { validateError(objValue,strDescr," : Enter a valid Date"); return false; }
      break;
    }
    case "time":
    {
      if(!validateTime(objValue,cmdvalue)) { validateError(objValue,strDescr," : Enter a valid Time"); return false; }
      break;
    }
    case "lt": case "lessthan":
    {
      if(isNaN(objValue.value)) { validateError(objValue,strDescr," : Should be a number"); return false; }
      if(eval(objValue.value)>=eval(cmdvalue)) { validateError(objValue,strDescr," : value should be less than "+ cmdvalue); return false; }
      break;
    }
    case "gt": case "greaterthan":
    {
      if(isNaN(objValue.value)) { validateError(objValue,strDescr," : Should be a number"); return false; }
      if(eval(objValue.value)<=eval(cmdvalue)) { validateError(objValue,strDescr," : value should be greater than "+ cmdvalue); return false; }
      break;
    }
    case "regexp":
    {
      if(!objValue.value.match(cmdvalue)) { validateError(objValue,strDescr," : Invalid characters found"); return false; }
      break;
    }
    case "dontselect":
    {
      if(objValue.selectedIndex==null) { alert("BUG: dontselect command for non-select Item"); return false; }
      if(objValue.selectedIndex==eval(cmdvalue)) { validateError(objValue,strDescr," : Please Select one option"); return false; }
      break;
    }
  }
  return true;
}

function validateForm(objFrm)
{
  for(var itrobj=0; itrobj<objFrm.length; itrobj++)
  {
    strCheckRules=objFrm[itrobj].alt;
    strDescription=objFrm[itrobj].title;
    if (strCheckRules)
    {
      arrValidateArr=new Array();
      arrValidateArr=strCheckRules.split(",");
      for(var i=0;i<arrValidateArr.length;i++)
      {
        if(validateData(arrValidateArr[i],objFrm[itrobj],strDescription)==false)
        {
          validateFoc(objFrm[itrobj]);
          return false;
        }
      }
    }
  } return true;
}
