public iCalCalendarPanel() {

    // style this element as absolute position
    DOM.setStyleAttribute(this.getElement(), "position", "absolute");
    DOM.setStyleAttribute(this.getElement(), "top", "0px");
    DOM.setStyleAttribute(this.getElement(), "left", "0px");
    DOM.setStyleAttribute(this.getElement(), "padding", "0px");

    DOM.setStyleAttribute(DOM.getElementById("messageBox"), "display", "none");

    mainLayoutPanel.setWidth("100%");
    add(mainLayoutPanel);

    // add header
    headerPanel.setStyleName("gwt-cal-HeaderPanel");
    DOM.setInnerHTML(headerPanel.getElement(), " ");
    footerPanel.setStyleName("gwt-cal-FooterPanel");
    DOM.setInnerHTML(headerPanel.getElement(), " ");
    mainLayoutPanel.add(headerPanel, DockPanel.NORTH);
    mainLayoutPanel.add(footerPanel, DockPanel.SOUTH);

    // add left panel
    datePicker.setValue(new Date());
    dateLayoutPanel.add(datePicker, DockPanel.SOUTH);
    dateLayoutPanel.add(splitterPanel, DockPanel.SOUTH);
    splitterPanel.setStyleName("splitter");
    mainLayoutPanel.add(dateLayoutPanel, DockPanel.WEST);

    // CalendarFormat.INSTANCE.setFirstDayOfWeek(1);

    // change hour offset to false to facilitate iCal style
    settings.setOffsetHourLabels(true);
    settings.setTimeBlockClickNumber(Click.Double);
    // create day view
    calendar = new Calendar();
    calendar.setSettings(settings);
    // set style as google-cal
    calendar.setWidth("100%");
    // set today as default date
    mainLayoutPanel.add(calendar, DockPanel.CENTER);
    mainLayoutPanel.setCellVerticalAlignment(dateLayoutPanel, HasAlignment.ALIGN_BOTTOM);
    dateLayoutPanel.setCellVerticalAlignment(datePicker, HasAlignment.ALIGN_BOTTOM);
    dateLayoutPanel.setWidth("168px");

    // add today button
    todayButton.setStyleName("todayButton");
    todayButton.setText("Today");
    todayButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            datePicker.setValue(new Date(), true);
            // dayView.setDate(new Date());
          }
        });
    previousDayButton.setStyleName("previousButton");
    previousDayButton.setHTML("«");
    previousDayButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            Date d = datePicker.getValue();
            d.setDate(d.getDate() - 1);
            datePicker.setValue(d, true);
          }
        });
    nextDayButton.setStyleName("nextButton");
    nextDayButton.setHTML("»");
    nextDayButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            Date d = datePicker.getValue();
            d.setDate(d.getDate() + 1);
            datePicker.setValue(d, true);
          }
        });
    headerPanelLayout.setWidget(0, 0, todayButton);
    headerPanelLayout.setWidget(0, 1, previousDayButton);

    oneDayButton.setText("1 Day");
    oneDayButton.setStyleName("dayButton");
    threeDayButton.setText("3 Day");
    threeDayButton.setStyleName("dayButton");
    threeDayButton.addStyleName("active");
    activeDayButton = threeDayButton;
    weekDayButton.setText("Work Week");
    weekDayButton.setStyleName("dayButton");
    monthButton.setText("Month");
    monthButton.setStyleName("dayButton");
    headerPanelLayout.setWidget(0, 2, oneDayButton);
    headerPanelLayout.setWidget(0, 3, threeDayButton);
    headerPanelLayout.setWidget(0, 4, weekDayButton);
    headerPanelLayout.setWidget(0, 5, monthButton);
    headerPanelLayout.setWidget(0, 6, nextDayButton);
    headerPanelLayout.setHTML(0, 7, " ");

    headerPanelLayout.getCellFormatter().setWidth(0, 0, "50%");
    headerPanelLayout.getCellFormatter().setWidth(0, 7, "50%");

    headerPanelLayout.setWidth("100%");
    headerPanelLayout.setCellPadding(0);
    headerPanelLayout.setCellSpacing(0);
    headerPanel.add(headerPanelLayout);

    footerPanel.add(
        new HTML(
            "<a href='http://code.google.com/p/gwt-cal'>gwt-cal</a> widget for Google Web Toolkit, GPLv3, by <a href='http://www.google.com/profiles/Brad.Rydzewski'>Brad Rydzewski</a>"));

    oneDayButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            activeDayButton.removeStyleName("active");
            activeDayButton = oneDayButton;
            activeDayButton.addStyleName("active");
            calendar.setView(CalendarViews.DAY, 1);
            // calendar.scrollToHour(6);
          }
        });
    threeDayButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            activeDayButton.removeStyleName("active");
            activeDayButton = threeDayButton;
            activeDayButton.addStyleName("active");
            calendar.setView(CalendarViews.DAY, 3);
            // calendar.scrollToHour(6);
          }
        });
    weekDayButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            activeDayButton.removeStyleName("active");
            activeDayButton = weekDayButton;
            activeDayButton.addStyleName("active");
            calendar.setView(CalendarViews.DAY, 5);
            // calendar.scrollToHour(6);
          }
        });
    monthButton.addClickHandler(
        new ClickHandler() {
          public void onClick(ClickEvent event) {
            activeDayButton.removeStyleName("active");
            activeDayButton = monthButton;
            activeDayButton.addStyleName("active");
            calendar.setView(CalendarViews.MONTH);
          }
        });

    datePicker.addValueChangeHandler(
        new ValueChangeHandler<Date>() {
          public void onValueChange(ValueChangeEvent<Date> event) {
            calendar.setDate(event.getValue());
          }
        });
    calendar.addDeleteHandler(
        new DeleteHandler<Appointment>() {
          public void onDelete(DeleteEvent<Appointment> event) {
            boolean commit =
                Window.confirm(
                    "Are you sure you want to delete appointment \""
                        + event.getTarget().getTitle()
                        + "\"");
            if (commit == false) {
              event.setCancelled(true);
              System.out.println("cancelled appointment deletion");
            }
          }
        });
    calendar.addOpenHandler(
        new OpenHandler<Appointment>() {
          public void onOpen(OpenEvent<Appointment> event) {
            Window.alert("You double-clicked appointment \"" + event.getTarget().getTitle() + "\"");
          }
        });

    calendar.addSelectionHandler(
        new SelectionHandler<Appointment>() {
          public void onSelection(SelectionEvent<Appointment> event) {
            System.out.println("selected " + event.getSelectedItem().getTitle());
          }
        });

    calendar.addTimeBlockClickHandler(
        new TimeBlockClickHandler<Date>() {
          public void onTimeBlockClick(TimeBlockClickEvent<Date> event) {
            Window.alert("you clicked time block " + event.getTarget());
          }
        });

    /* Generate random appointments */
    AppointmentBuilder.appointmentsPerDay = 5;
    AppointmentBuilder.HOURS = new Integer[] {7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19};
    AppointmentBuilder.MINUTES = new Integer[] {0, 30};
    AppointmentBuilder.DURATIONS = new Integer[] {60, 90, 120, 180, 240, 600};
    AppointmentBuilder.DESCRIPTIONS[1] = "Best show on TV!";

    ArrayList<Appointment> appointments = AppointmentBuilder.build(AppointmentBuilder.ICAL_STYLES);
    /* Add appointments to day view */
    calendar.suspendLayout();
    calendar.addAppointments(appointments);

    calendar.resumeLayout();

    // window events to handle resizing
    Window.enableScrolling(false);
    Window.addResizeHandler(
        new ResizeHandler() {
          public void onResize(ResizeEvent event) {
            int h = event.getHeight();
            calendar.setHeight(
                h - headerPanel.getOffsetHeight() - footerPanel.getOffsetHeight() + "px");
          }
        });
    Scheduler.get()
        .scheduleDeferred(
            new ScheduledCommand() {
              public void execute() {
                calendar.setHeight(
                    Window.getClientHeight()
                        - headerPanel.getOffsetHeight()
                        - footerPanel.getOffsetHeight()
                        + "px");
                calendar.scrollToHour(6);
              }
            });
  }
  @SuppressWarnings("deprecation")
  private void configureCalendar() {

    // change hour offset to false to facilitate google style
    settings.setOffsetHourLabels(false);
    //        settings.setTimeBlockClickNumber(CalendarSettings.Click.Single);
    settings.setEnableDragDrop(true);

    calendar = new Calendar();
    calendar.setSettings(settings);
    calendar.setView(CalendarViews.MONTH);
    calendar.setWidth("100%");

    // TODO: Preparar estes dois handlers para a SCHEDULED TASK
    calendar.addDeleteHandler(
        new DeleteHandler<Appointment>() {
          public void onDelete(DeleteEvent<Appointment> event) {
            boolean commit =
                Window.confirm(
                    HarvesterUI.CONSTANTS.deleteScheduledTaskConfirmMessage()
                        + " "
                        + event.getTarget().getTitle());
            if (!commit) {
              event.setCancelled(true);
            }
          }
        });
    calendar.addUpdateHandler(
        new UpdateHandler<Appointment>() {
          public void onUpdate(UpdateEvent<Appointment> event) {
            if (event.getTarget() != null) {
              CalendarAppointment appt = (CalendarAppointment) event.getTarget();
              if (appt.getHarvestTask() instanceof OldTaskUI) {
                HarvesterUI.UTIL_MANAGER.getErrorBox(
                    HarvesterUI.CONSTANTS.moveOldTasks(), HarvesterUI.CONSTANTS.moveOldTaskError());
                History.fireCurrentHistoryState();
              } else {
                if (appt.getStart().after(new Date())) {
                  if (appt.getHarvestTask() instanceof ScheduledTaskUI) {
                    final ScheduledTaskUI scheduledTaskUI = (ScheduledTaskUI) appt.getHarvestTask();
                    final Date date = appt.getStart();
                    scheduledTaskUI.setDate(date);

                    AsyncCallback<Boolean> callback =
                        new AsyncCallback<Boolean>() {
                          public void onFailure(Throwable caught) {
                            new ServerExceptionDialog(
                                    "Failed to get response from server", caught.getMessage())
                                .show();
                          }

                          public void onSuccess(Boolean result) {
                            if (!result) {
                              HarvesterUI.UTIL_MANAGER.getErrorBox(
                                  HarvesterUI.CONSTANTS.moveScheduledTask(),
                                  HarvesterUI.CONSTANTS.moveScheduledTaskError());
                              return;
                            }
                            DateTimeFormat fmt = DateTimeFormat.getFormat("dd/MM/yyyy");
                            scheduledTaskUI.createDateString(scheduledTaskUI.getScheduleType());
                            HarvesterUI.UTIL_MANAGER.getSaveBox(
                                HarvesterUI.CONSTANTS.moveScheduledTask(),
                                HarvesterUI.CONSTANTS.scheduleTaskMoved() + " " + fmt.format(date));
                          }
                        };
                    HarvestOperationsServiceAsync service =
                        (HarvestOperationsServiceAsync)
                            Registry.get(HarvesterUI.HARVEST_OPERATIONS_SERVICE);
                    service.updateScheduledTask(scheduledTaskUI, callback);
                  }
                } else {
                  HarvesterUI.UTIL_MANAGER.getErrorBox(
                      HarvesterUI.CONSTANTS.moveScheduledTask(),
                      HarvesterUI.CONSTANTS.moveScheduledTaskPrevDateError());
                }
                History.fireCurrentHistoryState();
              }
            }
          }
        });
    calendar.addOpenHandler(
        new OpenHandler<Appointment>() {
          public void onOpen(OpenEvent<Appointment> event) {
            if (event != null) {
              Appointment appt = event.getTarget();
              if (appt instanceof CalendarAppointment) {
                if (((CalendarAppointment) appt).getHarvestTask() instanceof OldTaskUI)
                  showPastScheduleDialog(((CalendarAppointment) appt).getHarvestTask());
                else if (((CalendarAppointment) appt).getHarvestTask() instanceof ScheduledTaskUI) {
                  ScheduledTaskUI scheduledTaskUI =
                      (ScheduledTaskUI) ((CalendarAppointment) appt).getHarvestTask();
                  if (scheduledTaskUI.getRecordsPerFile() == null) showScheduleDialog(appt);
                  else showScheduleExportDialog(appt);
                }
              }
            }
          }
        });

    //        calendar.addSelectionHandler(new SelectionHandler<Appointment>(){
    //            public void onSelection(SelectionEvent<Appointment> event) {
    //                if (event != null) {
    //                    Appointment appt = event.getSelectedItem();
    //                    if(appt instanceof CalendarAppointment)
    //                    {
    //                        Date now = new Date();
    //                        // TODO: hora do dia tambem
    //                        if(appt.getEnd().before(now))
    //                        {
    //                            showPastScheduleDialog(((CalendarAppointment)
    // appt).getHarvestTask());
    //                        }
    //                        else
    //                            showScheduleDialog(appt);
    //                    }
    //                    calendar.resetSelectedAppointment();
    //                }
    //            }
    //        });

    // Handler to show + items for a day
    calendar.addDateRequestHandler(
        new DateRequestHandler<Date>() {
          public void onDateRequested(DateRequestEvent<Date> event) {
            calendar.setDate(event.getTarget());
            calendar.setView(CalendarViews.DAY, 1);
          }
        });
  }