/**
 * int(year) [1-12](mo) [1-31](dy) -> int
 * 
 * Returns number of days since the given date.  Returns a negative
 * number if the date it in the future
 */
function dayssince(yr, mo, dy) {

  function total(stop) {
    var days = 0;
    var start=0;
    for (var i=start; i<stop; i++) {
      days += 365;
      if (isLeapYear(i)) days++;
    }
    return days;
  }
  
  function isLeapYear(intYear) {
    if ((intYear % 100 == 0) && (intYear % 400 == 0)) {
      return true;
    } else {
      if ((intYear % 4) == 0) return true;
      return false;
    }
  }
  
  var moFlag = 0;
  var dyFlag = 0;
  
  var nDate = new Date();
  var nowTime = nDate.getTime();
  var thenTime = Date.UTC(yr, mo-1, dy);
  var thisYear = nDate.getFullYear();
  var whYrs = -12;
  var thisMonth = nDate.getMonth();
  var thisDay = nDate.getDate();
  if (isNaN(dy) || isNaN(mo) || isNaN(yr)) {
    window.alert("That is not a valid date. Numbers only, please.");
    frm.day.focus();
    return false
      }
  if (dy<1 || dy>31) {
    window.alert("Day "+dy+" of Month "+mo+" is not a valid date");
    frm.day.focus();
    return false
      } else {
    dyFlag=1;
  }
  if (dy>30 && (mo == 2 || mo==4 || mo==6 || mo==9 || mo==11)) {
    window.alert("Day "+dy+" of Month "+mo+" is not a valid date");
    frm.day.focus();
    return false
      } else {
    dyFlag=1;
  }
  if (dy>29 && mo==2) {
    window.alert("Day "+dy+" of Month "+mo+" is not a valid date");
    frm.day.focus();
    return false
      } else {
    dyFlag=1;
  }
  if ((mo == 2 && dy == 29) && ((yr%4 != 0) || (yr%100 == 0 && yr%400 != 0))) {
    window.alert("29th of February is not a valid date in "+yr);
    frm.day.focus();
    return false
      } else {
    dyFlag=1;
  }
  if (mo<1 || mo>12) {
    window.alert("Day "+dy+" of Month "+mo+" is not a valid date");
    frm.month.focus();
    return false
      } else {
    moFlag=1;
  }
  if (dyFlag==1 && moFlag==1) {
    if (nowTime >= thenTime) { //-----------------Past or present time
      if ((thisMonth > mo-1) || ((thisMonth == mo-1) && (thisDay >= dy))) {
        whYrs = thisYear - yr;
        spareDys = parseInt((nowTime - Date.UTC(thisYear,mo-1,dy))/(3600000*24));
        if ((mo == 2 && dy == 29) && ((thisYear%4 != 0) || (thisYear%100 == 0 &&
                                                            thisYear%400 != 0))) {spareDys = spareDys + 1}
      } else {
        whYrs = thisYear - yr - 1;
        spareDys = parseInt((nowTime - Date.UTC(thisYear-1,mo-1,dy))/(3600000*24));
        if ((mo == 2 && dy == 29) && (((thisYear-1)%4 != 0) || ((thisYear-1)%100 ==
                                                                0 && (thisYear-1)%400 != 0))) {spareDys = spareDys + 1}
      }
    } else { //----------------------------Future time
      if ((thisMonth < mo-1) || ((thisMonth == mo-1)&& (thisDay <= dy))) {
        whYrs = yr - thisYear;
        spareDys = parseInt((thenTime - Date.UTC(yr,thisMonth,thisDay))/(3600000*24));
        if ((thisMonth == 1 && thisDay == 29) && ((yr%4 != 0) || (yr%100 == 0 && yr%
                                                                  400 != 0))) {spareDys = spareDys - 1}
      } else {
        whYrs = yr - thisYear - 1;
        spareDys = parseInt((thenTime - Date.UTC(yr-1,thisMonth,thisDay)) /
                            (3600000*24));
        if ((thisMonth == 1 && thisDay == 29) && (((yr-1)%4 != 0) || 
                                                  ((yr-1)%100 ==
                                                   0 && (yr-1)%400 != 0))) {spareDys = spareDys - 1};
      }
    }
  }
  var days = total(whYrs) + spareDys;
  if (nowTime < thenTime) days *= -1;
  return days;
}

/**
 * int(year) [1-12](mo) [1-31](dy) -> int
 *
 * Returns a nice string talking about how many days since (or until)
 * the given date.
 */
function howLong(yr, mo, dy) {
  var days = dayssince(yr, mo, dy);
  var s;
  if (days == 0) {
    s = "That is today!";
  } else if (days >= 0) {
    s = "It is <b>" + days + "</b>" + (days == 1 ? " day " : " days ") + "since then.";
  } else {
    days *= -1;
    s = "It is <b>"+days + "</b>" + (days == 1 ? " day " : " days ") + "until then.";
  }
  return s;
}
