public long redraw() {
      // Setup calendar
      Calendar cal = new GregorianCalendar();
      long now = System.currentTimeMillis();
      cal.setTimeInMillis(now);

      if (area != Area.empty) {
         int cal_hgt = area.rows >= 24 ? 10 : area.rows >= 22 ? 9 : 8;
         
         // Draw clock
         area.clear(clkbg);
         drawClock(0, 0, area.rows-cal_hgt, area.cols, cal);
         
         // Draw current month
         int midp = area.cols/2-10;
         int yy = area.rows - cal_hgt;
         drawMonth(yy, midp, cal, cal.get(Calendar.DAY_OF_MONTH));
         
         // Draw as many previous and following months as possible,
         // same number both sides
         for (int a = 1; true; a++) {
            int x1 = midp - 23 * a;
            int x2 = midp + 23 * a;
            if (x1 < 1 && x2 > area.cols - 21)
               break;

            cal.setTimeInMillis(now);
            cal.set(Calendar.DAY_OF_MONTH, 15);
            cal.add(Calendar.MONTH, -a);
            cal.getTimeInMillis();
            drawMonth(yy, x1, cal, 0);
            
            cal.setTimeInMillis(now);
            cal.set(Calendar.DAY_OF_MONTH, 15);
            cal.add(Calendar.MONTH, a);
            cal.getTimeInMillis();
            drawMonth(yy, x2, cal, 0);
         }
      }

      // Calculate delay before next redraw
      cal.setTimeInMillis(now);
      cal.set(Calendar.SECOND, 0);
      cal.add(Calendar.MINUTE, 1);
      long redraw_time = cal.getTimeInMillis();
      
      // Setup timer if not yet setup
      if (timer == null) {
         eloop.addTimer(new Timer(redraw_time) {
               public long run(long req, long now) {
                  return redraw();
               }
            });
      }
      return redraw_time;
   }