//----------------------------------------------------------------------
// formValidation - Web form validation change detection
// Copyright  © Coraider Services 2001, 2002
// V2.0 Added UpdatedFields function.
// V2.1 Added IP address validation
// V2.2 Added Datetime validation
// based on FormDataStore and Validation routines
function SaveValues()
{
  var i;
  for(i=0;i<this.Form.elements.length;i++) {
    this.Form.elements(i).originalValue=this.Form.elements(i).value;
    this.Form.elements(i).updated=false
  }
}
//------------------------------------//
function UpdatedFields() {
  var i, upd;
  
  upd=false;
  for(i=0;i<this.Form.elements.length;i++) {
    if (this.Form.elements(i).orignalValue!=this.Form.elements(i).value) {
      this.Form.elements(i).updated=true;
      upd=true;
    } 
  }
  return upd;
}
//------------------------------------//
function CheckUpdate()
{
  
  buf=this.UpdatedFields();
  if (buf=="") {
    alert("No changes have been made");
    return false;
  } else
    return true;
}
//------------------------------------//
function formRestore()
{
  var i;
  for(i=0;i<this.Form.elements.length;i++) {
    this.Form.elements(i).value=this.From.elements(i).originalValue;
  }
}
//----------------------------------------------------------------------
function IPAddress(field) {
  var prts, i, no;
  
  prts=field.value.split('.');
  if (prts.length!=4) {
    alert("Illegal TCP/IP Address, address should be of form 1.2.3.4");
    field.focus();
    return true;
  }
  for(i=0;i++;i<4) {
    no=parseInt(prts[i]);
    if (isNaN(no)) {
      alert("Illegal TCP/IP Address, non numeric value");
      field.focus();
      return true;
    }
    if (no<0 || no>255) {
      alert("Illegal TCP/IP Address, numeric value >255 or <0");
      field.focus();
      return true;
    }
  }
  return false;   
}
//----------------------------------------------------------------------
function CheckBlankPrompt(field, prmpt) {
// Copyright © Coraider Services 1997,1999
// CheckBlank V1.1-00 (common.js)
  if (field.value.search('[^ \f\n\r\t\v]')==-1) {
    alert("Value must be given for "+prmpt);
    if (field.type!='hidden') field.focus();
    return true;
  } else
    return false;
}
//------------------------------------//
function DisplayPrompt(fld) {
   alert(fld.prompt);
   if (fld.type!="hidden") fld.focus();
}
//------------------------------------//
function SetIndex(slct, val) {
// Copyright © Coraider Services 1997,1999
// SetIndex V1.1-00 (combo.js)
  var i;

  for(i=0; i<slct.length; i++) {
    if (slct.options(i).value==val) {
      slct.selectedIndex=i;
      return;
    }
  }    
  slct.selectedIndex=0;
}
//------------------------------------//
function SplitDate(dt) {
  var prts=new Array();
  var i=0, cnt=0, buf="";
  var sep=" :-/\."
  buf="";
  for(i=0;i<dt.length;i++) {
    if (sep.indexOf(dt.charAt(i))!=-1) {
      if (buf!="") prts[cnt++]=buf;
      buf="";
    } else
      buf+=dt.charAt(i);
  }
  if (buf!="") prts[cnt++]=buf;
  return prts;
}
//------------------------------------//
function MonthToInt(mon)
// Routine Copyright © Coraider Services 1997
// MonthToInt V1.0-00 (DateSub.js)
{
  var mm, mnth;

  mnth="|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec|";
  mm=mnth.indexOf("|"+mon.toLowerCase()+"|");
  with (Math) if (mm>0) mm=floor((mm/4));
  return mm;
}
//------------------------------------//
function ProcessDateParts(prts)
{
  var mon, wrk;
  var now=new Date();
  if (prts.length<2) return false;
  mon=parseInt(prts[1],10);
  if (isNaN(mon)) 
    mon=MonthToInt(prts[1]);
  else
    mon--;    
  prts[1]=mon;
  if (prts.length<3) {
    prts[2]=now.GetYear;
  } else {
    wrk=parseInt(prts[2],10);
    if (isNaN(wrk)) return false;
    if (wrk<100) {
      if (wrk>20) 
        wrk+=1900;
      else
        wrk+=2000;
    }
    prts[2]=wrk;
  }
  return true;
}
//------------------------------------//
function DaysInMonth(mm, yy)
// Routine Copyright © Coraider Services 1997
// DaysInMonth V1.0-00 (DateSub.js)
{
  var days, dd;

  days="31,28,31,30,31,30,31,31,30,31,30,31"
  dd=days.substring(mm*3,mm*3+2);
  if (mm==1) with (Math) if (floor(yy/4)*4==yy) dd++;
  return dd;
}
//------------------------------------//
function ValidateDate(prts) {
  var i;
  for(i=0; i<prts.length;i++) {
    prts[i]=parseInt(prts[i],10);
    if (isNaN(prts[i])) return false;
  }
  if (prts[0]<1 || prts[0]>31) return false;
  if (prts[1]<0 || prts[1]>11) return false;
  if (prts[0]>DaysInMonth(prts[1],prts[2])) return false;
  if (prts.length<4) return true;
  if (prts[3]<0 || prts[3]>23) return false;
  if (prts.length<5) return true;
  if (prts[4]<0 || prts[4]>59) return false;
  if (prts.length<6) return true;
  if (prts[5]<0 || prts[5]>59) return false;
  if (prts.length<7) return true;
  if (prts[6]<0 || prts[6]>999) return false;
  if (prts.length<8) return true;
  return false;
}
//------------------------------------//
function CheckDate(dt) {
  if (dt=="") return "";
  var prts=SplitDate(dt);
  if (ProcessDateParts(prts)) {
    if (ValidateDate(prts)) {
      wrk=new Date(prts[2], prts[1], prts[0])
      return FormatDate(wrk);  
    } else
      return "";
  } else
    return "";
}
//------------------------------------//
function CheckDateTime(dt) {
  var i, wrk;
  var prts=SplitDate(dt);
  if (ProcessDateParts(prts)) {
    if (ValidateDate(prts)) {
      for(i=prts.length;i<7;i++) prts[i]=0;
      wrk=new Date(prts[2], prts[1], prts[0], prts[3], prts[4], prts[5], prts[6]);
      return FormatDateTime(wrk);
    } else {
      return "";
    }
  } else
     return "";
}
//------------------------------------//
function CheckTime(txt) 
{
// Routine Copyright © Coraider Services 1999
// CheckTime V1.0-000 (DateSub.js)
  var hr, mn, prts
  
  if (txt.indexOf(":")!=-1) {
    prts=txt.split(":");
    hr=parseInt(prts[0],10);
    if (isNaN(hr)) return "";
    mn=parseInt(prts[1],10);
    if (isNaN(mn)) return "";
  } else if (txt.indexOf(".")!=-1) {
    mn=parseFloat(txt)
    if (isNaN(mn)) return "";
    hr=Math.floor(mn);
    mn=60*mn % 60;
  } else {
    mn=parseInt(txt,10)
    if (isNaN(mn)) return "";
    hr=Math.floor(mn/60);
    mn=mn % 60;
  }
  if (mn<10) return hr + ":0" + mn;
  return hr + ":" + mn; 
}

//------------------------------------//
function FormatDate(dt) {
  var mnth="JanFebMarAprMayJunJulAugSepOctNovDec";
  var buf, mon;
  
  buf=dt.getDate() + "-";
  mon=dt.getMonth();
  buf+=mnth.substr(mon*3,3);
  buf+="-" + dt.getFullYear();
  return buf;
}
//------------------------------------//
function FormatDateTime(dt) {
  var buf=FormatDate(dt);
  buf+=" " + ZeroFill(dt.getHours(),2) + ":" + ZeroFill(dt.getMinutes(),2);
  return buf;
}
//------------------------------------//
function ZeroFill(num, ln)
{
  var txt="X", i;
  for(i=0;i<ln;i++) txt+="0";
  txt+=num
  return txt.substring(txt.length-ln, txt.length);
}
//------------------------------------//
function ProcessField(fld) {
  var typ, chks, i;

  typ=fld.validate+"";
  typ=typ.toLowerCase();
  chks=typ.split(",");
  for(i=0;i<chks.length;i++) {
    switch (chks[i]) {
      case 'undefined':
        break;
      case 'required':
        break;
      case 'undefined':
        break;
      case 'datetime':
        fld.value=CheckDateTime(fld.value);
        break;
      case 'date':
        fld.value=CheckDate(fld.value);
        break;
      case 'time':
        fld.value=CheckTime(fld.value);
        break;
      default:
        alert('Unknown validation ' + chks[i]);
    }
  }
}
//------------------------------------//   
function ValidateForm(frm) {
  var i, typ, chks, j, frm, wrk;
  
  frm=this.Form;
  for(i=0;i<frm.elements.length;i++) {
    typ=frm.elements(i).validate+'';
    typ=typ.toLowerCase();
    chks=typ.split(",");
    for(j=0;j<chks.length;j++) {
      switch (chks[j]) {
        case 'undefined':
          break;
        case 'datetime':
          frm.elements(i).value=CheckDateTime(frm.elements(i).value);
          break;          
        case 'date':
          frm.elements(i).value=CheckDate(frm.elements(i).value);
          break;
        case 'required':
          if (CheckBlankPrompt(frm.elements(i), frm.elements(i).prompt)) return false;
          break;
        case 'time':
          frm.elements(i).value=CheckTime(frm.elements(i).value);
        case 'numeric':
          wrk=parseInt(frm.elements(i).value,10);
          if (isNaN(wrk)) {
            alert(frm.elements(i).prompt + ' must be numeric');
            return false;
          }
          break;
        case 'gt0':
          wrk=parseInt(frm.elements(i).value,10);
          if (isNaN(wrk)) {
            alert(frm.elements(i).prompt + ' must be numeric');
            return false;
          }
          if (wrk<=0) {
            alert(frm.elements(i).prompt + ' must be greater than 0');          
            return false;
          }
          break;
        case 'not0':
          if (frm.elements(i).value==0) {
            DisplayPrompt(frm.elements(i));
            return false;
          }
          break;
        case 'not-1':
          if (frm.elements(i).value==-1) {
            DisplayPrompt(frm.elements(i));
            return false;
          }
          break;
        case 'ipaddress':
          if (IPAddress(frm.elements(i))) return false;
          break;
        default:
          alert('Unknown validation ' + chks[j] + " on " + frm.elements(i).name);
      }
    }
  }
  return true;
}
//------------------------------------//
function formValidate(frm) {
  this.Restore=formRestore;
  this.Form=frm;
  this.SaveValues=SaveValues;
  this.UpdatedFields=UpdatedFields;
  this.Validate=ValidateForm;
  this.CheckUpdate=CheckUpdate;
  this.SaveValues();
}
//------------------------------------//
