$pageName,
                'post_content' => '{{calendar}}',
                'post_status' => 'publish',
                'post_type' => 'page',
            ));
            update_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
        }
    }
    public static function printCalendar($content) {
        // Der zu ersetzende String
        $original_string = '{{calendar}}';
        $calendar = new Calendar();
        // Der Ersatzstring
        $replacement_string = $calendar->show();
        // Ersetze den Originalstring durch den Ersatzstring im Seiteninhalt
        $content = str_replace($original_string, $replacement_string, $content);
        return $content;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $categories =  get_option('bdp_calendar_categories', null);
        if (null !== $categories) {
            $categories = json_decode($categories, true);
        } else {
            $categories = [
                'yellow' => 'Meute',
                'blue'  => 'Sippe',
                'red' => 'Runde',
                'green' => 'StaFü',
                'fuchsia' => '',
                'orange' => ''
            ];
        }
        foreach ($categories as $color => $keyname) {
            $this->categories[$keyname] = $color;
        }
        $calendarUrl = get_option('bdp_calendar_source_url', 'https://wiki.sachsen.pfadfinden.de/rest/calendar-services/1.0/calendar/export/subcalendar/private/ff69f5a689391ac0d7f78a70189cfde7c48cb923.ics');
        $this->ical = new \ICal('', array(
            'defaultSpan' => 2,     // Default value
            'defaultTimeZone' => '',
            'defaultWeekStart' => 'MO',  // Default value
            'disableCharacterReplacement' => false, // Default value
            'filterDaysAfter' => null,  // Default value
            'filterDaysBefore' => null,  // Default value
            'httpUserAgent' => null,  // Default value
            'skipRecurrence' => false, // Default value
        ));
        $this->ical->initUrl($calendarUrl);
        $this->ical->events();
        $this->naviHref = htmlentities($_SERVER['PHP_SELF']);
    }
    /********************* PROPERTY ********************/
    private $dayLabels = array("Mon", "Die", "Mit", "Don", "Fre", "Sam", "Son");
    private $monthLabels = ['', 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
    private $currentYear = 0;
    private $currentMonth = 0;
    private $currentDay = 0;
    private $currentDate = null;
    private $daysInMonth = 0;
    private $naviHref = null;
    /********************* PUBLIC **********************/
    /**
     * print out the calendar
     */
    public function show()
    {
        $year = null;
        $month = null;
        if (null == $year && isset($_GET['year'])) {
            $year = $_GET['year'];
        } else if (null == $year) {
            $year = date("Y", time());
        }
        if (null == $month && isset($_GET['month'])) {
            $month = $_GET['month'];
        } else if (null == $month) {
            $month = date("m", time());
        }
        $this->currentYear = $year;
        $this->currentMonth = $month;
        $this->daysInMonth = $this->_daysInMonth($month, $year);
        $content = '    
' .
            '
' .
            $this->_createNavi() .
            '
' .
            '
' .
            '
                ' . $this->_createLabels() . '
';
        $weeksInMonth = $this->_weeksInMonth($month, $year);
        // Create weeks in a month
        for ($i = 0; $i < $weeksInMonth; $i++) {
            //Create days in a week
            for ($j = 1; $j <= 7; $j++) {
                if ($j % 7 == 1) {
                    $content .= '';
                }
                $content .= $this->_showDay($i * 7 + $j);
            }
        }
        $content .= '
';
        return $content;
    }
    private function getCssClass($category)
    {
        $cssClass = 'bdp_cal_event_' . ($this->categories[$category] ?? 'grey');
        return $cssClass;
    }
    private function getEvent($date)
    {
        $eventString = '
';
        foreach ($this->ical->filterByDate($date) as $curEvent) {
            $time = $curEvent->getEventTime() ?? 'Ganztags';
            #print_r($curEvent);
            $eventString .= '' .
                $time . ':
' .
                $curEvent->summary . '';
        }
        return $eventString;
    }
    /********************* PRIVATE **********************/
    /**
     * create the li element for ul
     */
    private function _showDay($cellNumber)
    {
        if ($this->currentDay == 0) {
            $firstDayOfTheWeek = date('N', strtotime($this->currentYear . '-' . $this->currentMonth . '-01'));
            if (intval($cellNumber) == intval($firstDayOfTheWeek)) {
                $this->currentDay = 1;
            }
        }
        if (($this->currentDay != 0) && ($this->currentDay <= $this->daysInMonth)) {
            $date =
                str_pad($this->currentDay, 2, '0', STR_PAD_LEFT) . '.' .
                str_pad($this->currentMonth, 2, '0', STR_PAD_LEFT) . '.' .
                $this->currentYear;
            $this->currentDate = date('Y-m-d', strtotime($this->currentYear . '-' . $this->currentMonth . '-' . ($this->currentDay)));
            $cellContent = '
' . $this->currentDay . '' . $this->getEvent($date);
            $this->currentDay++;
        } else {
            $this->currentDate = null;
            $cellContent = null;
        }
        return '
' . $cellContent . ' | ';
    }
    /**
     * create navigation
     */
    private function _createNavi()
    {
        $nextMonth = $this->currentMonth == 12 ? 1 : intval($this->currentMonth) + 1;
        $nextYear = $this->currentMonth == 12 ? intval($this->currentYear) + 1 : $this->currentYear;
        $preMonth = $this->currentMonth == 1 ? 12 : intval($this->currentMonth) - 1;
        $preYear = $this->currentMonth == 1 ? intval($this->currentYear) - 1 : $this->currentYear;
        return
            '';
    }
    /**
     * create calendar week labels
     */
    private function _createLabels()
    {
        $content = '';
        foreach ($this->dayLabels as $index => $label) {
            $content .= '
' . $label . ' | ';
        }
        return $content;
    }
    /**
     * calculate number of weeks in a particular month
     */
    private function _weeksInMonth($month = null, $year = null)
    {
        if (null == ($year)) {
            $year = date("Y", time());
        }
        if (null == ($month)) {
            $month = date("m", time());
        }
        // find number of days in this month
        $daysInMonths = $this->_daysInMonth($month, $year);
        $numOfweeks = ($daysInMonths % 7 == 0 ? 0 : 1) + intval($daysInMonths / 7);
        $monthEndingDay = date('N', strtotime($year . '-' . $month . '-' . $daysInMonths));
        $monthStartDay = date('N', strtotime($year . '-' . $month . '-01'));
        if ($monthEndingDay < $monthStartDay) {
            $numOfweeks++;
        }
        return $numOfweeks;
    }
    /**
     * calculate number of days in a particular month
     */
    private function _daysInMonth($month = null, $year = null)
    {
        if (null == ($year))
            $year = date("Y", time());
        if (null == ($month))
            $month = date("m", time());
        return date('t', strtotime($year . '-' . $month . '-01'));
    }
}