   // jsdate.js
   // D.Millan: 13-FEB-2003
   // D.Millan: 20-FEB-2003 - Add datediff() and dayofwk() functions.
   //
   var wwtab  = new Array( "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
   var mmtab  = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
   var mm3tab = new Array("JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC");

   function datediff( indate1, indate2 ) {
   // indates should be in MM-DD-YYYY format
      return ( jsjulnum(indate2, 'MM-DD-YYYY')-jsjulnum(indate1,'MM-DD-YYYY') );
   }

   function dayofwk( indate1 ) {
      return ( jsjulnum( indate1, 'MM-DD-YYYY', 'DAY' ));
   }

   function jsjulnum(indate, fmt, opt) {
      // given a date, return number of days elapsed.
      var adj   = 1;
      var days  = 0;
      var tmpdt = indate;
      //supported format for indate so far: DD-MON-YYYY and MON-DD-YYYY
      if (fmt == null)
         fmt="DD-MON-YYYY"; // default if no format passed.

      if (fmt != "MM-DD-YYYY")
         tmpdt = chgdate(indate, fmt,'MM-DD-YYYY'); // change to operationg format.
      // mm-dd-yyyy is the operating format. don't ask why.
      if (tmpdt.indexOf('-')) {
         var mm = tmpdt.substr(0,2);
         if ( mm.substr(0,1)=="0" )
            mm = mm.substr(1,1);
         mm = parseInt(mm);

         var dd = tmpdt.substr(3,2);
         if (dd.substr(0,1)=="0")
            dd = dd.substr(1,1);
         dd = parseInt(dd);

         var yy = tmpdt.substr(6);
         yy = parseInt(yy);

         if (yy > 1950 & yy <= 1980) {
            adj  = 1951;
            days = 712222;
         }
         else
         if (yy > 1980 & yy <= 1994) {
            adj  = 1981;
            days = 723180;
         }
         else
         if (yy > 1994 & yy <= 1999) {
            adj  = 1995;
            days = 728293;
         }
         else
         if (yy > 1999 && yy <= 2001) {
            adj  = 2000;
            days = 730119;
         }
         else if (yy > 2001 && yy <= 2002) {
            adj  = 2002;
            days = 730850;
         }
         else if (yy > 2002) {
            adj  = 2003;
            days = 731215;
         }
         else {
            adj  = 1;
            days = 0;
         }

         for ( var i=adj; i<yy; i++) {
            days = days + 365;
            if (i > 3 && isleap(i))
               days = days + 1;
         }

         for (var i=1; i<mm; i++) {
            days = days + mmtab[(i-1)];
            if (i == 2 && isleap(yy))
               days = days + 1;
         }

         // count the boundary day as a complete day
         days = days + dd;

         if (opt=="DAY")
            return wwtab[(days%7)];
         else
            return days.toString(10);
      }
      return "ERROR";
   } // end jsjulnum function

   function bumpdate( indate, delta_days, fmt) {
      // indate must be "MM-DD-YYYY"
      // Given a date and a number to add/subtract, return new date.
      // alert("indate="+indate+" delta="+delta_days);
      var tmpdt = indate;
      if (fmt == null)
         fmt="DD-MON-YYYY"; // default if no format passed.
      //alert("fmt="+fmt);
      if (fmt != "MM-DD-YYYY")
         tmpdt = chgdate(indate, fmt,'MM-DD-YYYY'); // change to operating format.

      if (tmpdt.indexOf('-')) {

         var mm = tmpdt.substr(0,2);
         if ( mm.substr(0,1)=="0" )
            mm = mm.substr(1,1);
         mm = parseInt(mm);

         var dd = tmpdt.substr(3,2);
         if (dd.substr(0,1)=="0")
            dd = dd.substr(1,1);
         dd = parseInt(dd);

         var yy = tmpdt.substr(6);
         yy = parseInt(yy);
         var xflg = 0;

         if (delta_days > 0) {
            while ( xflg == 0 ) {
               if (mm == 2 && isleap(yy) )
                  mmtab[1] = 29;
               else
                  mmtab[1] = 28;

               if ((dd+delta_days) > mmtab[(mm-1)]) {
                  delta_days = delta_days - (mmtab[(mm-1)]-dd);
                  mm = mm + 1;
                  if (mm > 12) {
                     yy = yy + 1;
                     mm = 1;
                  }
                  dd = 0;
               }
               else {
                  dd = dd + delta_days;
                  xflg = 1;
               }
            }
         }
         else if (delta_days < 0 ) {
            delta_days = delta_days * -1;
            xflg = 0;
            while (xflg == 0) {
               if ((dd-delta_days) < 1) {
                  delta_days = delta_days-dd;
                  mm = mm-1;
                  if (mm < 1 ) {
                     yy = yy - 1;
                     mm = 12;
                  }
                  if ( mm == 2 && isleap(yy) )
                     mmtab[1] = 29;
                  else
                     mmtab[1] = 28;
                  dd = mmtab[(mm-1)];
               }
               else {
                  dd   = dd-delta_days;
                  xflg = 1;
               }
            }
         }

         var vdd = dd.toString(10);
         var vmm = mm.toString(10);
         var vyy = yy.toString(10);

         if ( vdd.length == 1)
            vdd = "0"+ vdd;
         if ( vmm.length == 1)
            vmm = "0"+ vmm;

         tmpdt = vmm+"-"+vdd+"-"+vyy;
         if (fmt != "MM-DD-YYYY")
            tmpdt = chgdate(tmpdt, 'MM-DD-YYYY', fmt);
         return tmpdt;
      }
      return "ERROR";
   }

   function chgdate( indate, fmt1, fmt2 ) {
      // returns date string from fmt1 to fmt2.
      // supported formats so far:
      //    input: DD-MON-YYYY,MON-DD-YYYY
      //   output: DD-MM-YYYY,MM-DD-YYYY
      var mm_ptr = 0;
      var mm2    = "01";
      var mm3    = "JAN";
      //alert("in chgdate, fmt1="+fmt1);
      if (fmt1.toUpperCase() == "DD-MON-YYYY") {
         var dd  = indate.substr(0,2);
         var yy  = indate.substr(7);
         mm3     = indate.substr(3,3);
         mm3     = mm3.toUpperCase();
      }
      else if (fmt1.toUpperCase() == "MON-DD-YYYY") {
         var dd = indate.substr(4,2);
         var yy = indate.substr(7);
         mm3    = indate.substr(0,3);
      }
      else if (fmt1.toUpperCase() == "MM-DD-YYYY") {
         var mm2 = indate.substr(0,2);
         var dd  = indate.substr(3,2);
         var yy  = indate.substr(6);
      }
      else if (fmt1.toUpperCase() == "DD-MM-YYYY") {
         var dd  = indate.substr(0,2);
         var mm2 = indate.substr(3,2);
         var yy  = indate.substr(6);
      }
      else
         return "ERROR1";

      if ((fmt1.toUpperCase() == "DD-MON-YYYY") ||
          (fmt1.toUpperCase() == "MON-DD-YYYY")) {
         mm3 = mm3.toUpperCase();

         if ((fmt2.toUpperCase() == "DD-MM-YYYY") ||
             (fmt2.toUpperCase() == "MM-DD-YYYY")) {
            for (var i=1; i<=12; i++) {
               mm_ptr = i-1;
               if (mm3==mm3tab[mm_ptr]) {
                  if ( i < 10 )
                     mm2 = "0"+i.toString(10);
                  else
                     mm2 = i.toString(10);
                  i = 13; //get out
               }
            }
            if (fmt2.toUpperCase() == "MM-DD-YYYY")
               return mm2+"-"+dd+"-"+yy;
            else if (fmt2.toUpperCase() == "DD-MM-YYYY")
               return dd+"-"+mm2+"-"+yy;
            return "ERROR2";
         }
      }
      else if (((fmt1.toUpperCase()=="DD-MM-YYYY")||(fmt1.toUpperCase()=="MM-DD-YYYY")) &&
         ((fmt2.toUpperCase()=="DD-MON-YYYY")||(fmt2.toUpperCase()=="MON-DD-YYYY"))) {
         if (mm2.substr(0,1)=='0')
            mm2=mm2.substr(1,1);
         mm3 = mm3tab[(parseInt(mm2)-1)];
         if (fmt2.toUpperCase()=="DD-MON-YYYY")
            return dd+"-"+mm3+"-"+yy;
         else if (fmt2.toUpperCase()=="MON-DD-YYYY")
            return mm3+"-"+dd+"-"+yy;
         else return ERROR3;
      }
      return "ERROR4";
   } // end chgdate

   function isleap(y) {
      return ((( y%4==0) && !(y%100==0)) || (y%400==0));
   }
