/**
   * This is the constructor which initializes the instance variables and the components. Also at
   * last it will display the initial screen.
   *
   * @param m is the model and HAS-A relationship gets constructed here.
   */
  public MonthlyView(Model m) {
    // CHANGING THE FONT AND SIZE
    java.io.InputStream is = DailyView.class.getResourceAsStream("Raleway-Regular.ttf");
    try {
      Font font = Font.createFont(Font.TRUETYPE_FONT, is);
      railWay = font.deriveFont(Font.PLAIN, 12);
      railWayMed = font.deriveFont(Font.PLAIN, 20);
      railWayBigBold = font.deriveFont(Font.BOLD, 26);
      railWayHuge = font.deriveFont(Font.PLAIN, 100);

    } catch (FontFormatException e1) {
      e1.printStackTrace();
    } catch (IOException e1) {
      e1.printStackTrace();
    }

    // MAIN MONTH VIEW PANEL
    // --------------------------------------------------------------------
    this.setLayout(new FlowLayout());
    monthViewPanel = new JPanel();
    monthViewPanel.setBackground(Color.WHITE);
    model = m;

    ghettoCurrDate =
        new int[] {
          MONTHS.valueOf(model.getCurrentMonth() + "").ordinal(),
          model.getCurrentDay(),
          model.getCurrentYear()
        }; // {month, day,
    // year}
    // (Derick)

    currDate = model.getCurrentDate();
    temp = new GregorianCalendar();
    temp.set(currDate.get(Calendar.YEAR), currDate.get(Calendar.MONTH), 1);
    firstdayoftheweek = temp.get(Calendar.DAY_OF_WEEK);
    daysInMonth = currDate.getActualMaximum(Calendar.DATE);
    dayButton = new JButton[31];

    // UPPER HALF PANEL
    // --------------------------------------------------------------------------
    JPanel upperPanel = new JPanel();
    upperPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    upperPanel.setBackground(Color.WHITE);

    // CURRENT MONTH & YEAR PANEL

    dateLabelOfMonthPanel.setBackground(Color.WHITE);
    // JLabel dateLabelOfMonth = new JLabel("");
    // JLabel dateLabelOfYear = new JLabel("");
    dateLabelOfMonth.setText(model.getCurrentMonth() + " ");
    dateLabelOfYear.setText(Integer.toString(model.getCurrentYear()));
    dateLabelOfMonth.setFont(railWayHuge);
    dateLabelOfYear.setFont(railWayHuge);
    dateLabelOfMonth.setForeground(Color.BLACK);
    dateLabelOfYear.setForeground(babyTeal);
    dateLabelOfMonthPanel.add(dateLabelOfMonth);
    dateLabelOfMonthPanel.add(dateLabelOfYear);

    upperPanel.add(dateLabelOfMonthPanel, BorderLayout.CENTER);

    // PREVIOUS & NEXT BUTTON PANEL
    // JPanel previousNextButtonPanel = new JPanel(new GridLayout(1, 2));
    // JPanel previousButtonLeftPanel = new JPanel();
    // JButton previousButton = new JButton();
    // try
    // {
    // Image img = ImageIO.read(getClass().getResource("pre1.png"));
    // previousButton.setIcon(new ImageIcon(img));
    // Image newimg = img.getScaledInstance(50, 50,
    // java.awt.Image.SCALE_SMOOTH);
    // previousButton.setIcon(new ImageIcon(newimg));
    // } catch (IOException ex)
    // {
    // }
    // previousButton.setOpaque(false);
    // previousButton.setBorderPainted(false);
    // previousButton.addActionListener(new ActionListener()
    // {
    // public void actionPerformed(ActionEvent e)
    // {
    // model.prevMonth();;
    // }
    // });
    // dateLabelOfMonthPanel.add(previousButton);
    // previousButtonLeftPanel.add(previousButton);
    // previousNextButtonPanel.add(previousButtonLeftPanel, new
    // FlowLayout(FlowLayout.LEFT));
    // upperPanel.add(previousNextButtonPanel);
    //
    // // Creates the next button
    // JButton nextButton = new JButton();
    // try
    // {
    // Image img = ImageIO.read(getClass().getResource("next1.png"));
    // Image newimg = img.getScaledInstance(50, 50,
    // java.awt.Image.SCALE_SMOOTH);
    // nextButton.setIcon(new ImageIcon(newimg));
    // } catch (IOException ex)
    // {
    // }
    // nextButton.setOpaque(false);
    // nextButton.setBorderPainted(false);
    // nextButton.setPreferredSize(new Dimension(50, 50));
    // nextButton.addActionListener(new ActionListener()
    // {
    // public void actionPerformed(ActionEvent e)
    // {
    // model.nextDay();
    // }
    // });

    // JPanel daysOftheWeekPanel = new JPanel();
    JLabel daysOftheWeek = new JLabel("");
    daysOftheWeekPanel.setLayout(new GridLayout());
    daysOftheWeekPanel.setBackground(babyTeal);

    String[] days = {"SUNDAY", "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY"};
    for (int i = 0; i < days.length; i++) {
      final String label = days[i];
      JLabel dayLabel = new JLabel(label);
      dayLabel.setForeground(Color.BLACK);
      dayLabel.setBackground(lightBlue);
      dayLabel.setHorizontalAlignment(SwingConstants.CENTER);
      daysOftheWeekPanel.add(dayLabel);

      dayLabel.setFont(railWayMed);
      daysOftheWeekPanel.add(dayLabel);
    }
    dayDayPanel.setLayout(new GridLayout(0, 7));
    for (int i = 1; i < firstdayoftheweek; i++) {
      JLabel dayLabell = new JLabel("");
      dayDayPanel.add(dayLabell);
    }
    for (int i = 0; i < dayButton.length; i++) {
      final int counter = i + 1;

      GregorianCalendar foo = new GregorianCalendar();
      foo.set(model.getCurrentYear(), model.getCurrentDate().get(Calendar.MONTH), i + 1);
      String star = "";
      if (model.findEvent(foo) == true) star = " *";
      dayButton[i] = new JButton(Integer.toString(i + 1) + star);
      dayButton[i].setOpaque(true);
      dayButton[i].setBorder(dayBorder);
      dayButton[i].setBackground(lightBlue);
      dayButton[i].setPreferredSize(new Dimension(205, 90));
      dayButton[i].addActionListener(
          new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              daynumber = counter;
              model.changeDay(daynumber);
              DailyView.createAndShowDailyViewGUI(model);
            }
          });
    }
    for (int i = 0; i <= daysInMonth; i++) {
      dayDayPanel.add(dayButton[i]);
      dayButton[i].setPreferredSize(new Dimension(205, 90));
      dayButton[i].setBackground(Color.WHITE);
      dayButton[i].setHorizontalAlignment(SwingConstants.LEFT);
      dayButton[i].setVerticalAlignment(SwingConstants.NORTH);
      // set the current date to a certain color
      if (i + 1 == model.getCurrentDay()) {
        dayButton[i].setBackground(lightBlue);
      }
    }
    dayViewPanel = new JPanel();
    dayViewPanel.setLayout(new BorderLayout());
    dayLabel = new JLabel();
    dayViewPanel.setBackground(Color.WHITE);

    dayLabel.setText(
        model.getCurrentDayoftheWeek()
            + " "
            + (model.getCurrentDate().get(Calendar.MONTH) + 1)
            + "/"
            + model.getCurrentDay());
    // JTextArea dayViewArea = new JTextArea(20,50);

    ArrayList<Event> listofE = new ArrayList<Event>();
    listofE = model.getEventsOfToday();
    if (listofE != null) {
      Collections.sort(listofE);
    }
    String s = "";

    for (int i = 0; i <= 24; i++) {
      if (i < 10) {
        s += ("0" + i);
        s += ("-------\n");

        if (listofE != null) {
          for (Event ev : listofE) {
            if (ev.getStartingTime().get(GregorianCalendar.HOUR_OF_DAY) == i) {
              s += ev.getTitle();
              s += " at " + ev.getStartingTime().get(Calendar.HOUR) + ":";
              if (ev.getStartingTime().get(Calendar.MINUTE) < 10) {
                s += "0" + ev.getStartingTime().get(Calendar.MINUTE);
              } else s += ev.getStartingTime().get(Calendar.MINUTE);
              if (ev.getStartingTime().get(Calendar.AM_PM) == 0) {
                s += "AM";
              } else s += "PM";

              s += " to " + ev.getEndingTime().get(Calendar.HOUR) + ":";
              if (ev.getEndingTime().get(Calendar.MINUTE) < 10) {
                s += "0" + ev.getEndingTime().get(Calendar.MINUTE);
              } else s += ev.getEndingTime().get(Calendar.MINUTE);
              if (ev.getEndingTime().get(Calendar.AM_PM) == 0) {
                s += "AM";
              } else s += "PM";
            }
          }
        }

        s += "\n\n";
      } else {
        s += i;
        s += ("-------\n");

        if (listofE != null) {
          for (Event ev : listofE) {
            if (ev.getStartingTime().get(GregorianCalendar.HOUR_OF_DAY) == i) {
              s += ev.getTitle();
              s += " at " + ev.getStartingTime().get(Calendar.HOUR) + ":";
              if (ev.getStartingTime().get(Calendar.MINUTE) < 10) {
                s += "0" + ev.getStartingTime().get(Calendar.MINUTE);
              } else s += ev.getStartingTime().get(Calendar.MINUTE);
              if (ev.getStartingTime().get(Calendar.AM_PM) == 0) {
                s += "AM";
              } else s += "PM";

              s += " to " + ev.getEndingTime().get(Calendar.HOUR) + ":";
              if (ev.getEndingTime().get(Calendar.MINUTE) < 10) {
                s += "0" + ev.getEndingTime().get(Calendar.MINUTE);
              } else s += ev.getEndingTime().get(Calendar.MINUTE);
              if (ev.getEndingTime().get(Calendar.AM_PM) == 0) {
                s += "AM";
              } else s += "PM";
            }
          }
        }
        s += "\n\n";
      }
    }
    /*
     * dayViewArea.setText(s); dayViewScrollPane = new
     * JScrollPane(dayViewArea); dayViewPanel.add(dayLabel,
     * BorderLayout.NORTH); dayViewPanel.add(dayViewScrollPane,
     * BorderLayout.CENTER);
     */

    monthViewPanel.setLayout(new BoxLayout(monthViewPanel, BoxLayout.Y_AXIS));
    monthViewPanel.add(dateLabelOfMonthPanel);
    monthViewPanel.add(daysOftheWeekPanel);
    monthViewPanel.add(dayDayPanel);
    monthViewPanel.setAlignmentX(Component.CENTER_ALIGNMENT);
    dayDayPanel.setBackground(Color.WHITE);

    add(monthViewPanel);
  }