
(() => {
  var days_left;
  var clearCode;

  function getDaysLeft(day) {
    let year = day.getMonth() == 11 ? day.getFullYear() + 1 : day.getFullYear(); // rollover if december.
    next_month = new Date(year, (day.getMonth() + 1) % 12, 1, 0, 0, 0);
    let days_left = Math.floor((next_month - day) / 86400000); // ms left in month divided by ms in a day
    return days_left;
  }

  function getTimeTilMidnight(now) {
    let midnight = new Date(now.getTime());
    midnight.setHours(23);
    midnight.setMinutes(59);
    midnight.setSeconds(59);
    midnight.setMilliseconds(999);
    return (midnight - now) + 1;
  }

  function update() {
    let now = new Date();
    days_left = getDaysLeft(now);
    let ms_til_midnight = getTimeTilMidnight(now);
    clearCode = setTimeout(update, ms_til_midnight);
  }

  function draw() {
    g.reset();
    g.setFont("4x6", 3);
    if(!clearCode) update(); // On first run calculate days left and setup interval to update state.
    g.drawString(days_left < 10 ? "0" + days_left : days_left.toString(), this.x + 2, this.y + 4);
  }

  // add your widget
  WIDGETS.widmonthcountdown={
    area:"tl", // tl (top left), tr (top right), bl (bottom left), br (bottom right)
    width: 24,
    draw:draw
  };
})();