  var aryMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
  var aryDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];

  function Nz (val, valIfNull)
  {
    var strVal = new String (val);

    if ((strVal == 'null') || (strVal == 'undefined'))
    {
      strVal = new String (valIfNull);
      if ((strVal == 'null') || (strVal == 'undefined'))
        return '';
      else
        return valIfNull;
    }
    else
      return val;
  }

  function NzHTML (val)
  {
    return Nz (val, '&nbsp;');
  }

  function formatTime (datTime)
  {
    var hr, min;
    var strAMPM, strResult;
    
    if (datTime && (datTime.constructor == Date))
      datTime = datTime.getTime ();
    else
      datTime = Date.parse (datTime);

    if (isNaN (datTime))
      return '';
    else
    {
      datTime = new Date (datTime);

      hr = datTime.getHours ();
      min = datTime.getMinutes ();
        
      if (hr >= 12)
      {
        strAMPM = " PM";
        hr -= 12;
      }
      else
        strAMPM = " AM";
        
      if (hr == 0) hr = 12;
        
      if (hr < 10) 
        strResult = " " + hr + ":";
      else
        strResult = hr + ":";

      if (min < 10)
        strResult += "0" + min;
      else
        strResult += min;

      strResult += strAMPM;
        
      return strResult;
    }
  }

  function formatMilitaryTime (datTime)
  {
    var hr, min;
    var strResult;
    
    if (datTime && (datTime.constructor == Date))
      datTime = datTime.getTime ();
    else
      datTime = Date.parse (datTime);

    if (isNaN (datTime))
      return '';
    else
    {
      datTime = new Date (datTime);

      hr = datTime.getHours ();
      min = datTime.getMinutes ();        
        
      if (hr < 10) 
        strResult = "0" + hr + ":";
      else
        strResult = hr + ":";

      if (min < 10)
        strResult += "0" + min;
      else
        strResult += min;
        
      return strResult;
    }
  }

  function formatDate (datDate)
  {
    var dy, mo, yr;
    var strResult;

    if (datDate && (datDate.constructor == Date))
      datDate = datDate.getTime ();
    else
      datDate = Date.parse (datDate);
    
    if (isNaN (datDate))
      return '';
    else
    {
      datDate = new Date (datDate);

      if ((yr = datDate.getYear ()) < 70)
        datDate.setFullYear (2000 + yr);
      
      dy = datDate.getDate ();
      mo = datDate.getMonth () + 1;
      yr = datDate.getFullYear ();
      
      strResult = "";
      if (mo < 10)
        strResult += "0"
      strResult += mo + "/";
      if (dy < 10)
        strResult += "0";
      strResult += dy + "/" + yr;
      
      return strResult;
    }
  }

  function formatCurrency (cur, strCurrencySymbol)
  {
    var strResult;
    var strEnd = "";
    strCurrencySymbol = strCurrencySymbol || '$';
    
    cur = parseFloat (cur);
    if (isNaN (cur))
      return '';
    else
    {
      cur = Math.round (cur * 100);
      if ((cur % 100) == 0) 
        strEnd = ".00";
      else
        if ((cur % 10) == 0) strEnd = "0";
      cur = cur / 100;
      strResult = strCurrencySymbol + cur + strEnd;
      
      return strResult;
    }
  }


  function checkTime (ctrl)
  {
    var hr = 0, min = 0;
    var datTime;
    var str = ctrl.value, chr;
    var i = 0;

    if (str)
    {
      while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
        i ++;
      if (i < str.length)
      {
        hr = i;
        while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
          i ++;
        hr = parseInt (str.substring (hr, i), 10);
        if (hr > 23)
          hr = -1;

        while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
          i ++;
        
        if (i < str.length) 
        {
          min = i;
          while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
            i ++;
          min = parseInt (str.substring (min, i), 10);
          if (min > 59)
            min = -1;
        }
        else
          min = 0;

        if ((hr >= 0) && (hr <= 12))
        {
          str = str.toUpperCase ();
          if (str.indexOf ('AM') == -1)
          {
            if (((str.indexOf ('PM') != -1) || (hr < 7)) && (hr != 12))
              hr += 12;
          }
          else
          {
            if (hr == 12)
              hr = 0;
          }
        }
      }
      else
      {
        hr = -1;
        min = -1;
      }

      datTime = Date.parse ('January 1 1970 ' + hr + ':' + (min < 10 ? '0' : '') + min + ':00');

      if (isNaN (datTime))
      {
        alert ("You must enter a valid time");
        ctrl.focus ();
        return false;
      }
      else
      {
        ctrl.value = formatTime (new Date (datTime));
        return true;
      }
    }
    else
      return true;
  }

  function checkMilitaryTime (ctrl)
  {
    var hr = 0, min = 0;
    var datTime;
    var str = ctrl.value, chr;
    var i = 0;

    if (str)
    {
      while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
        i ++;
      if (i < str.length)
      {
        hr = i;
        while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
          i ++;
        hr = parseInt (str.substring (hr, i), 10);

        if (hr > 100)
        {
          min = hr % 100;
          hr = parseInt (hr / 100, 10);
        }
        else
        {
          while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
            i ++;
          
          if (i < str.length) 
          {
            min = i;
            while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
              i ++;
            min = parseInt (str.substring (min, i), 10);
            if (min > 59)
              min = -1;
          }
          else
            min = 0;
        }
      }
      else
      {
        hr = -1;
        min = -1;
      }

      datTime = Date.parse ('1/1/1970 ' + hr + ':' + min);

      if (isNaN (datTime))
      {
        alert ("You must enter a valid time");
        ctrl.focus ();
        return false;
      }
      else
      {
        ctrl.value = formatMilitaryTime (new Date (datTime));
        return true;
      }
    }
    else
      return true;
  }

  function checkDate (ctrl, datDefault)
  {
    var dat = datDefault || new Date ().valueOf ();
    var datDate = new Date (dat);
    var str = ctrl.value;
    var i = 0, temp;
    var mo = NaN, dy = NaN, yr = NaN;

    if (str)
    {
      while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
        i ++;
      if (i < str.length)
      {
        temp = i;
        while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
          i ++;
        temp = str.substring (temp, i);
        mo = parseInt (temp, 10) - 1;
        if (mo < 12)
        {
          while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
            i ++;
          
          if (i < str.length) 
          {
            temp = i;
            while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
              i ++;
            dy = parseInt (str.substring (temp, i), 10);
            if (dy <= 31)
            {
              while ((i < str.length) && (((chr = str.charAt (i)) < '0') || (chr > '9')))
                i ++;

              if (i < str.length) 
              {
                temp = i;
                while ((i < str.length) && ((chr = str.charAt (i)) >= '0') && (chr <= '9'))
                  i ++;
                yr = parseInt (str.substring (temp, i), 10);
              }
              else
                yr = datDate.getFullYear ();
            }
            else
              dy = NaN;
          }
          else
          {
            dy = datDate.getDate ();
            yr = datDate.getFullYear ();
          }
        }
        else
        {
          str = temp;
          if ((str.length == 4) || (str.length == 6) || (str.length == 8))
          {
            mo = parseInt (str.substr (0, 2), 10) - 1;
            dy = parseInt (str.substr (2, 2), 10);
            if ((str.length == 6) || (str.length == 8))
              yr = parseInt (str.substr (4), 10);
            else
              yr = datDate.getFullYear ();
          }
          else
            mo = NaN;
        }
      }
      if (! isNaN (yr))
      {
        if (yr < 70) yr += 2000;
        if (yr < 100) yr += 1900;
      }

      datDate = new Date (yr, mo, dy);
      if ((datDate.getDate () != dy) || (datDate.getMonth () != mo) || (datDate.getFullYear () != yr))
        datDate = NaN;

      if (isNaN (datDate) || (yr < 1900) || (yr > 2100))
      {
        alert ("You must enter a valid date");
        ctrl.value = formatDate (new Date (dat));
        ctrl.focus ();
        return false;
      }
      else
      {
        ctrl.value = formatDate (new Date (datDate));
        return true;
      }
    }
    else
      return true;
  }

  function checkNumber (ctrl)
  {
    var num = ctrl.value;
    
    if (num != '')
    {
      num = parseFloat (num);

      if (isNaN (num))
      {
        alert ("You must enter a valid number");
        ctrl.value = '';
        ctrl.focus ();
        return false;
      }
      else
        return true;
    }
    else
      return true;
  }

  function checkInt (ctrl)
  {
    var num = ctrl.value;
    
    if (num != '')
    {
      num = parseInt (num);

      if (isNaN (num))
      {
        alert ("You must enter a valid integer");
        ctrl.value = '';
        ctrl.focus ();
        return false;
      }
      else
        return true;
    }
    else
      return true;
  }


  function checkCurrency (ctrl)
  {
    var cur = ctrl.value;
    
    if (cur.charAt (0) == "$")
      cur = parseFloat (cur.substr (1));
    else
      cur = parseFloat (cur);

    if (isNaN (cur))
    {
      alert ("You must enter a valid amount");
      ctrl.focus ();
      return false;
    }
    else
    {
      ctrl.value = FormatCurrency (cur);
      return true;
    }
  }

  function checkDelete (TypeOfThing)
  {
    return confirm ("Are you sure you want to delete this " + TypeOfThing + "?");
  }

  function checkRequiredFields (form, aryRequiredFields)
  {
    var i;
    var boolValid = true;
    var el, isBad;
    
    for (i = 0; (i < aryRequiredFields.length) && boolValid; i += 2)
    {
      el = form.elements [aryRequiredFields [i]];
      if ((el.type == 'select') || (el.type == 'select-one'))
        isBad = (parseInt (el.options [el.selectedIndex].value, 10) == 0);
      else
        isBad = (el.value == '');

      if (isBad)
      {
        alert (aryRequiredFields [i + 1] + " is a required field.");
        boolValid = false;
      }
    }
    return boolValid;
  }

  function validate_element (element, msg, boolNoAlert)
  {
    var boolIsOkay = false;
    var i;
    var elAlert, strAlert;

    if (! element.type)
    {
      for (i = 0; !boolIsOkay && (i < element.length); i ++)
      {
        boolIsOkay = validate_element (element [i], null, true);
      }
      elAlert = element [0];
    }
    else
    {
      switch (element.type)
      {
        case 'checkbox':
        case 'radio':
          boolIsOkay = element.checked;
          break;
        case 'select':
        case 'select-one':
        case 'select-many':
          boolIsOkay = element.selectedIndex > -1;
          break;
        default:
          boolIsOkay = element.value != '';
      }

      elAlert = element;
    }

    if (boolIsOkay)
      return true;
    else
    {
      if (! boolNoAlert)
      {
        if (msg)
          alert (msg);
        else
        {
          strAlert = elAlert.name;
          if (oFieldNames && oFieldNames [strAlert])
            strAlert = oFieldNames [strAlert];
          alert (strAlert + ' is a required field.');
        }
        elAlert.focus ();
      }
      return false;
    }
  }

  function validate_required_elements (elements, aryRequiredFields)
  {
    var i;
    var boolIsOkay = true;

    for (i = 0; boolIsOkay && (i < aryRequiredFields.length); i ++)
      boolIsOkay = validate_element (elements [aryRequiredFields [i]]);

    return boolIsOkay;
  }