var error_class = "db-err";     // CLASS FOR SHOWING ERRORS
var norm_class = "db-hil";      // NORMAL INPUT CONTROL CLASS
var selTnImg;                   // CURRENTLY SELECTED THUMBNAIL IMAGE

/****************************************
**  ISEMPTY - CHECK FOR EMPTY CONTROL  **
****************************************/
function isempty(pCtlName) {
  if (document.getElementsByName(pCtlName)[0].value.replace(/ /g, "") == "") {
    return true;
    }
  else {
    return false;
    }
  }

/**********************************
**  OK - CHECK FOR OK OR CANCEL  **
**********************************/
function OK(pMsg) {
  if (! confirm(pMsg)) return false; else return true;
  }

/***************************************
**  CHECKDATE - VALIDATE DATE STRING  **
***************************************/
function checkdate(pctl, preq) {
  if (pctl.value == "") {
    if (preq) {
      pctl.title = "Required Date Field";
      pctl.className = error_class;
      return false;
      }
    else {
      pctl.title = "";
      pctl.className = norm_class;
      return true;
      }
    }
  var mmo = -1;
  var mdy = -1;
  var myr = -1;
  var merr = false;
  var mdt;
  var mdate = "";
  var mseps = new Array("/", "-", " ", ".");
  var mdate = pctl.value;
  /** PARSE FOR SEPARATORS **/
  for (i = 0; i < mseps.length && ! merr; i++) {
    if (mdate.indexOf(mseps[i]) != -1) {
      mdt = mdate.split(mseps[i]);
      if (mdt.length != 3) {
        merr = true;
        }
      else {
        mmo = mdt[0];
        mdy = mdt[1];
        myr = mdt[2];
        }
      }
    }
  /** PARSE FOR NO SEPARATORS **/
  if (! merr) {
    if (mmo == -1) {
      if (mdate.length == 4) {
        mmo = mdate.substr(0, 1);
        mdy = mdate.substr(1, 1);
        myr = mdate.substr(2);
        }
      else if (mdate.length == 5) {
        mmo = mdate.substr(0, 1);
        mdy = mdate.substr(1, 2);
        myr = mdate.substr(3);
        }
      else if (mdate.length > 5) {
        mmo = mdate.substr(0, 2);
        mdy = mdate.substr(2, 2);
        myr = mdate.substr(4);
        }
      else {
        merr = true;
        }
      }
    }
  /** VALIDATE MDY **/
  if (! merr) {
    if (isNaN(mmo) || isNaN(mdy) || isNaN(myr)) merr = true;
    mmo = parseInt(mmo, 10);
    mdy = parseInt(mdy, 10);
    myr = parseInt(myr, 10);
    }
  if (mmo < 1 || mmo > 12) merr = true;
  if (mdy < 1) merr = true;
  if (mmo == 1 || mmo == 3 || mmo == 5 || mmo == 7 || mmo == 8 || mmo == 10 || mmo == 12) {
    if (mdy > 31) merr = true;
    }
  else if (mdy > 30) merr = true;
  if (mmo == 2 && mdy > 29) merr = true;
  if (myr > 99 && myr < 1900) merr = true;
  /** FORMAT **/
  if (merr) {
    pctl.title = "Invalid Date";
    pctl.className = error_class;
    return false;
    }
  else {
    if (mmo < 10) mmo = "0" + mmo;
    if (mdy < 10) mdy = "0" + mdy;
    if (myr < 10) myr = "0" + myr;
    pctl.className = norm_class;
    pctl.title = "";
    pctl.value = mmo + "/" + mdy + "/" + myr;
    return true;
    }
  }

/************************************
**  CHECKTIME - CHECK TIME FORMAT  **
************************************/
function checktime(pctl, preq) {
  if (pctl.value == "") {
    if (preq) {
      pctl.title = "Required Time Field";
      pctl.className = error_class;
      return false;
      }
    else {
      pctl.title = "";
      pctl.className = norm_class;
      return true;
      }
    }
  var merr = false;
  var mpm = "";
  var mhrs = -1;
  var mmins = -1;
  var mtime;
  mtime = pctl.value;
  /** GET THE PM FLAG **/
  mpm = mtime.substr(mtime.length - 1);
  if (mpm == "m" || mpm == "M") mpm = mtime.substr(mtime.length - 2, 1);
  if (mpm == "p" || mpm == "P") {
    mpm = "PM";
    }
  else if (mpm == "a" || mpm == "A") {
    mpm = "AM";
    }
  else {
    mpm = "";
    }
  for (i = mtime.length - 1; i > -1 && isNaN(mtime.substr(i, 1)); i--) {
    mtime = mtime.substr(0, i);
    }
  /** PARSE HOURS AND MINUTES **/
  if (mtime.indexOf(":") != -1) {
    mhrs = mtime.substr(0, mtime.indexOf(":"));
    mmins = mtime.substr(mtime.indexOf(":") + 1);
    }
  else if (mtime.length == 3 || mtime.length == 4) {
    mhrs = mtime.substr(0, mtime.length - 2);
    mmins = mtime.substr(mtime.length - 2);
    }
  else {
    merr = true;
    }
  /** CONVERT AND CHECK HRS AND MINS **/
  if (! merr) {
    mhrs = parseInt(mhrs, 10);
    mmins = parseInt(mmins, 10);
    if (mhrs < 0 || mhrs > 23) merr = true;
    if (mmins < 0 || mmins > 59) merr = true;
    }
  /** FORMAT THE OUTPUT **/
  if (! merr) {
    /** CORRECT 0 HOUR **/
    if (mhrs == 0) {
      mhrs = 12;
      mpm = "AM";
      }
    /** CORRECT FOR 24-HOUR FORMAT **/
    if (mhrs > 12) {
      mhrs = mhrs - 12;
      mpm = "PM";
      }
    /** SET AM/PM FLAG **/
    if (mpm == "") if (mhrs > 11 || mhrs < 6) mpm = "PM"; else mpm = "AM";
    if (mhrs < 10) mhrs = "0" + mhrs;
    if (mmins < 10) mmins = "0" + mmins;
    pctl.className = norm_class;
    pctl.title = "";
    pctl.value = mhrs + ":" + mmins + " " + mpm;
    return true;
    }
  else {
    pctl.className = error_class;
    pctl.title = "Invalid Time";
    return false;
    }
  }


/****************************************
**  CHECKNUMBER - CHECK NUMBER FORMAT  **
****************************************/
function checknumber(pctl, preq) {
  if (pctl.value == "") {
    if (preq) {
      pctl.title = "Required Number Field";
      pctl.className = error_class;
      return false;
      }
    else {
      pctl.title = "";
      pctl.className = norm_class;
      return true;
      }
    }
  if (isNaN(pctl.value)) {
    pctl.title = "Invalid Number";
    pctl.className = error_class;
    return false;
    }
  else {
    pctl.title = "";
    pctl.className = norm_class;
    return true;
    }
  }

/*********************************************
**  CHECKPHONE - CHECK PHONE NUMBER FORMAT  **
*********************************************/
function checkphone(pctl, preq) {
  var mnum = "";
  var mdig = "";
  pctl.title = "";
  pctl.className = norm_class;
  if (pctl.value == "") {
    if (preq) {
      pctl.title = "Required Phone Field";
      pctl.className = error_class;
      return false;
      }
    else {
      return true;
      }
    }  for (i = 0; i < pctl.value.length; i++) {
    mdig = pctl.value.substr(i, 1);
    if (! isNaN(mdig) && mdig != " ") mnum = mnum + mdig;
    }
  if (mnum.length == 7) {
    pctl.value = mnum.substr(0, 3) + "-" + mnum.substr(3);
    return true;
    }
  else if (mnum.length == 10) {
    pctl.value = mnum.substr(0, 3) + "-" + mnum.substr(3, 3) + "-" + mnum.substr(6);
    return true;
    }
  else {
    pctl.title = "Invalid Phone Number";
    pctl.className = error_class;
    return false;
    }
  }

/********************************************
**  CHECKTEXT - CHECK FREEFORM TEXT FIELD  **
********************************************/
function checktext(pctl, preq) {
  if (pctl.value.replace(/ /g, "") == "" && preq) {
    pctl.title = "Required Text Field";
    pctl.className = error_class;
    return false;
    }
  else {
    pctl.title = "";
    pctl.className = norm_class;
    return true;
    }
  }

/********************************
**  LOOKUP - CALL LOOKUP FORM  **
********************************/
function lookup(pUrl) {
  x = (screen.width / 2) - 300;
  y = (screen.height / 2) - 200;
  mWin = open(pUrl, '',
              'left=' + x + ', top=' + y +
              ', width=600, height=450, toolbars=no, scrollbars=yes, resizable=yes, location=no');
  if (mWin.opener == null) mWin.opener = self;
  }

/**************************************************
**  LOOKUPWIN - LOOKUP IN SPECIFIED WINDOW SIZE  **
**************************************************/
function lookupwin(pUrl, pWid, pHgt) {
  if (pWid == 0) pWid = 600;
  if (pHgt == 0) pHgt = 450;
  x = (screen.width / 2) - (pWid / 2);
  y = (screen.height / 2) - (pHgt / 2);
  mWin = open(pUrl, '',
              'left=' + x + ', top=' + y +
              ', width=' + pWid + ', height=' + pHgt + ', location=no, toolbars=no, scrollbars=yes, resizable=yes');
  if (mWin.opener == null) mWin.opener = self;
  }


/***********************************************************
**  KEYDOWN - CHECK FOR CR AND ARROW KEYS FOR NAVIGATION  **
***********************************************************/
function keyDown(pEvent) {
  var mCtl;
  if (! pEvent) event = window.event;
  var target = pEvent.target ? pEvent.target : pEvent.srcElement;
  if (target.type == "textarea") return true;
  if (pEvent.keyCode == 37 && target.type == "select-one") {
    if (target.selectedIndex > 0) target.selectedIndex--;
    return false;
    }
  else if (pEvent.keyCode == 39 && target.type == "select-one") {
    if (target.selectedIndex < target.options.length - 1) target.selectedIndex++;
    return false;
    }
  else if (pEvent.keyCode == 13) {
    if (target.type != "button" && target.type != "submit") {
      if (mCtl = getNextCtl(target)) setCtl(mCtl.id);
      if (pEvent.preventDefault) pEvent.preventDefault();
      if (pEvent.stopPropagation) pEvent.stopPropagation();
      pEvent.cancelBubble = true;
      return false;
      }
    }
  else if (pEvent.keyCode == 40) {
    if (mCtl = getNextCtl(target)) setCtl(mCtl.id);
    return false;
    }
  else if (pEvent.keyCode == 38) {
    if (mCtl = getPrevCtl(target)) setCtl(mCtl.id);
    return false;
    }
  return true;
  }

/*************************************************
**  GETNEXTCTL - FIND THE NEXT LOGICAL CONTROL  **
*************************************************/
function getNextCtl(pCtl) {
  var nextCtl;
  var nextIdx = 99999;
  var index = pCtl.tabIndex;
  var form = pCtl.form;
  var i;
  if (! form)  return false;
  for (i = 0; i < form.elements.length; i++) {
    if (form.elements[i].tabIndex) if
      (form.elements[i].tabIndex > pCtl.tabIndex && form.elements[i].tabIndex < nextIdx) {
      nextCtl = form.elements[i];
      nextIdx = form.elements[i].tabIndex;
      }
    }
  return nextCtl;
  }

/*************************************************
**  GETPREVCTL - FIND THE NEXT LOGICAL CONTROL  **
*************************************************/
function getPrevCtl(pCtl) {
  var nextCtl;
  var nextIdx = -1;
  var index = pCtl.tabIndex;
  var form = pCtl.form;
  var i;
  if (! form) return false;
  for (i = 0; i < form.elements.length; i++) {
    if (form.elements[i].tabIndex < pCtl.tabIndex && form.elements[i].tabIndex > nextIdx) {
      nextCtl = form.elements[i];
      nextIdx = form.elements[i].tabIndex;
      }
    }
  return nextCtl;
  }

/*************************************************
**  SETCTL - SET FOCUS TO THE SPECIFIED CONTROL **
*************************************************/
function setCtl(pId) {
  if (! pId || pId == "undefined") return false;
  var ctl = document.getElementById(pId);
  if (! ctl) return true;
  if (ctl.type == "text") {
    ctl.select();
    }
  ctl.focus();
  return true;
  }

/************************************
**  SETIMG - SET THE IMAGE SOURCE  **
************************************/
function setImg(pCtl, pImgId, pSrc, pLoadId) {
  var img = document.getElementById(pImgId);
  var ld;
  if (pLoadId) ld = document.getElementById(pLoadId);
  if (img) {
    var str = "";
    if (ld) document.getElementById(pLoadId).style.display = '';
    str += "document.getElementById('" + img.id + "').src = '" + pSrc + "';";
    str += "document.getElementById('" + img.id + "').style.display = '";
    if (pSrc) str += "';"; else str += "none';";
    if (ld) str += "document.getElementById('" + pLoadId + "').style.display = 'none';";
    setTimeout(str, 0);
    }
  setTn(pCtl);
  }

/*************************************************************
**  SELIMG - SELECT NEXT OR PREVIOUS IMAGE FROM IMAGE LIST  **
*************************************************************/
function selImg(pDir) {
  /** GET THE SELECTED THUMBNAIL ID **/
  var imgId = "tn0";
  if (selTnImg) imgId = selTnImg.id;
  if (imgId.substr(0, 2) != "tn") return false;
  /** GET THE IMAGE SEQUENCE **/
  var seq = Number(imgId.substr(2)) + pDir;
  if (seq < 0 || pDir == -999) seq = 0;
  if (pDir == 999) seq = 999;
  var ctl = document.getElementById("tn" + seq);
  while (! ctl && seq > 0) {
    seq--;
    ctl = document.getElementById("tn" + seq);
    }
  if (! ctl) return false;
  imgId = ctl.id;
  var cmd = "";
  cmd = "" + ctl.onclick;
  var i = cmd.indexOf("setImg(");
  if (i < 0) i = cmd.indexOf("setHTML(");
  if (i < 0) i = cmd.indexOf("setText(");
  if (i > 0) {
    cmd = cmd.substr(i);
    i = cmd.indexOf(";");
    if (i) cmd = cmd.substr(0, i + 1);
    }
  cmd = cmd.replace(" ", "");
  cmd = cmd.replace("this,", "document.getElementById('" + imgId + "'),");
  setTimeout(cmd, 0);
  }

function setHTML(pCtl, pId, pText) {
  document.getElementById(pId).innerHTML = pText;
  setTn(pCtl);
  }


function setTn(pCtl) {
  if (selTnImg) if (selTnImg.className.indexOf("-") > 0) selTnImg.className = selTnImg.className.substr(0, 2);
  selTnImg = pCtl;
  selTnImg.className = selTnImg.className + "-sel";
  /**  SET THE SCROLL POSITION **/
  var prnt = pCtl.parentNode.parentNode;
  var orient = "horizontal";
  if (prnt.offsetWidth < prnt.offsetHeight) orient = "vertical";
  var tnNo = Number(pCtl.id.substr(2)) + 1;
  var bord = Number(pCtl.style.borderWidth.substr(0, 1));
  var tnleft = Number(pCtl.style.left.substr(0, pCtl.style.left.length - 2));
  var tntop = Number(pCtl.style.top.substr(0, pCtl.style.top.length - 2));
  if (orient == "horizontal") {
    /** HORIZONTAL BOX **/
    var prntwid = Number(prnt.style.maxWidth.substr(0, prnt.style.maxWidth.length - 2));
    var tnwid = Number(pCtl.style.width.substr(0, pCtl.style.width.length - 2));
    /** SCROLL RIGHT IF NECESSARY **/
    var pos = tnleft + tnwid + (bord * 2);
    if (pos > prntwid + prnt.scrollLeft) prnt.scrollLeft = pos - prntwid;
    /** SCROLL LEFT IF NECESSARY **/
    pos = tnleft;
    if (pos < prnt.scrollLeft) prnt.scrollLeft = pos;
    }
  else {
    /** VERTICAL BOX **/
    prnt = prnt.parentNode;
    var prnthgt = Number(prnt.style.maxHeight.substr(0, prnt.style.maxHeight.length - 2));
    var tnhgt = Number(pCtl.style.height.substr(0, pCtl.style.height.length - 2));
    /** SCROLL DOWN IF NECESSARY **/
    var pos = tntop + tnhgt + (bord * 2);
    if (pos > prnthgt + prnt.scrollTop) prnt.scrollTop = pos - prnthgt;
    /** SCROLL UP IF NECESSARY **/
    pos = tntop;
    if (pos < prnt.scrollTop) prnt.scrollTop = pos;
    }
  }