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){var v=v.replace(/^0*/g,""); if(v=="")return 0; else return parseInt(v);}

function fmtValDate(v,strFmt)
{
  var d=new Array(3); d[0]=1; d[1]=1; d[2]=0;
  var dt;
  var splitted=v.match("^([0-9]+)[/.-]([0-9]+)([/.-]([0-9]+))?$");
  if(splitted==null) return "";
  
  d[dtFmtNo(strFmt.charAt(0))]=pInt(splitted[1]);
  d[dtFmtNo(strFmt.charAt(2))]=pInt(splitted[2]);

  if (strFmt.length<5) { if (splitted[4]!="") return ""; }
  else
  {
    if (splitted[4]=="") return "";
    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 "";
  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))]);

  return s;
}

function fmtValTime(v,strFmt)
{
  var d=new Array(3); d[0]=0; d[1]=0; d[2]=0;
  var splitted=v.match("^([0-9]+)[:.]([0-9]+)([:.]([0-9]+))?$");
  if(splitted==null) return "";
  
  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 "";
  
  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))]);

  return s;
}

function validateDate(objValue,strFmt)
{
  if (objValue.value=="") return true;
  var s=fmtValDate(objValue.value,strFmt);
  if(s=="") return false;
  objValue.value=s;
  return true;
}

function validateTime(objValue,strFmt)
{
  if (objValue.value=="") return true;
  var s=fmtValTime(objValue.value,strFmt);
  if(s=="") return false;
  objValue.value=s;
  return true;
}

function validateDateTime(objValue,fmtDat)
{
  var aFmt=fmtDat.split(";");
  if(aFmt.length!=3) return false;
  if (objValue.value=="") return true;
  var aDT=objValue.value.split(" ");
  if(aDT.length>2) return false;
  var sDate=fmtValDate(aDT[0],aFmt[0]);
  if(sDate=="") return false;
  if(aDT.length<=1||aDT[1]=="") aDT[1]=aFmt[2];
  var sTime=fmtValTime(aDT[1],aFmt[1]);
  if(sTime=="") return false;
  objValue.value=sDate+" "+sTime;
  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," : Обязательное поле"); return false; }
      break;
    }
    case "maxlen": case "maxlength":
    {
      if(eval(objValue.value.length)>eval(cmdvalue)) { validateError(objValue,strDescr," : не более "+cmdvalue+" символов\n[Текущая длина = " + objValue.value.length + " ]"); return false; }
      break;
    }
    case "minlen": case "minlength":
    {
      if(eval(objValue.value.length) < eval(cmdvalue)) { validateError(objValue,strDescr," : не менее " + cmdvalue + " символов\n[Текущая длина = " + 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," : Допускаются только цифры и буквы\n [Ошибка в символе " + 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," : Допускаются только цифры\n [Ошибка в символе " + eval(charpos+1)+"]"); return false; }
      break;
    }
    case "int": case "integer":
    {
      if(!objValue.value.match("^-?[0-9]*$")) { validateError(objValue,strDescr," : Требуется целочисленное значение"); return false; }
      break;
    }
    case "float":
    {
      if(!objValue.value.match("^-?[0-9]*[.]?[0-9]*$")) { validateError(objValue,strDescr," : Требуется вещественное значение"); 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," : Допускаются только буквы\n [Ошибка в символе " + 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," : Пробельные символы не допускаются\n [Ошибка в символе " + eval(charpos+1)+"]"); return false; }
      break;
    }
    case "email":
    {
      if(!validateEmail(objValue.value)) { validateError(objValue,strDescr," : Введите действующий адрес e-Mail"); return false; }
      break;
    }
    case "date":
    {
      if(!validateDate(objValue,cmdvalue)) { validateError(objValue,strDescr," : Неверный формат даты"); return false; }
      break;
    }
    case "time":
    {
      if(!validateTime(objValue,cmdvalue)) { validateError(objValue,strDescr," : Неверный формат времени"); return false; }
      break;
    }
    case "datetime":
    {
      if(!validateDateTime(objValue,cmdvalue)) { validateError(objValue,strDescr," : Неверный формат даты или времени"); return false; }
      break;
    }
    case "lt": case "lessthan":
    {
      if(isNaN(objValue.value)) { validateError(objValue,strDescr," : Требуется число"); return false; }
      if(eval(objValue.value)>eval(cmdvalue)) { validateError(objValue,strDescr," : Должно быть меньше чем "+ cmdvalue); return false; }
      break;
    }
    case "gt": case "greaterthan":
    {
      if(isNaN(objValue.value)) { validateError(objValue,strDescr," : Требуется число"); return false; }
      if(eval(objValue.value)<eval(cmdvalue)) { validateError(objValue,strDescr," : Должно быть больше чем "+ cmdvalue); return false; }
      break;
    }
    case "le": case "lessequal":
    {
      if(isNaN(objValue.value)) { validateError(objValue,strDescr," : Требуется число"); return false; }
      if(eval(objValue.value)>=eval(cmdvalue)) { validateError(objValue,strDescr," : Должно быть не больше чем "+ cmdvalue); return false; }
      break;
    }
    case "ge": case "greaterequal":
    {
      if(isNaN(objValue.value)) { validateError(objValue,strDescr," : Требуется число"); return false; }
      if(eval(objValue.value)<=eval(cmdvalue)) { validateError(objValue,strDescr," : Должно быть не меньше чем "+ cmdvalue); return false; }
      break;
    }
    case "regexp":
    {
      if(!objValue.value.match(cmdvalue)) { validateError(objValue,strDescr," : Неправильное содержимое"); 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," : Выберите вариант"); 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)
    {
      if(objFrm[itrobj].style.display=="none") continue;
      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;
}

function getItm(id) { return (document.getElementById)?document.getElementById(id):document.all[id]; }

