/**
  * Get all events of a certain period
  * @param array
  * @param integer
  * @param integer
  * @return array
  */
 protected function getAllEvents($arrCalendars, $intStart, $intEnd, $arrFilter = array(), $arrFilterOptions = array(), $arrFilterConfig = array())
 {
     if (!is_array($arrCalendars)) {
         return array();
     }
     $this->arrEvents = array();
     // set end date from filter
     if ($arrFilter['startDate'] && $arrFilter['startDate'] > $intStart) {
         $intStart = $arrFilter['startDate'];
     }
     // set end date from filter
     if ($arrFilter['endDate'] && $arrFilter['endDate'] <= $intEnd) {
         $intEnd = strtotime(date('d.m.Y', $arrFilter['endDate']) . ' 23:59:59');
         // until last second of the day
     }
     foreach ($arrCalendars as $id) {
         $strUrl = $this->strUrl;
         $objCalendar = \CalendarModel::findByPk($id);
         // Get the current "jumpTo" page
         if ($objCalendar !== null && $objCalendar->jumpTo && ($objTarget = $objCalendar->getRelated('jumpTo')) !== null) {
             $strUrl = $this->generateFrontendUrl($objTarget->row(), \Config::get('useAutoItem') && !\Config::get('disableAlias') ? '/%s' : '/events/%s');
             $arrFilterConfig['jumpTo'] = array($objTarget->id);
         }
         // Get the events of the current period
         $objEvents = CalendarPlusEventsModel::findCurrentByPidAndFilter($id, $intStart, $intEnd, $arrFilter, $arrFilterOptions, $arrFilterConfig);
         if ($objEvents === null) {
             continue;
         }
         while ($objEvents->next()) {
             $this->addEvent($objEvents, $objEvents->startTime, $objEvents->endTime, $strUrl, $intStart, $intEnd, $id);
             // Recurring events
             if ($objEvents->recurring) {
                 $arrRepeat = deserialize($objEvents->repeatEach);
                 if ($arrRepeat['value'] < 1) {
                     continue;
                 }
                 $count = 0;
                 $intStartTime = $objEvents->startTime;
                 $intEndTime = $objEvents->endTime;
                 $strtotime = '+ ' . $arrRepeat['value'] . ' ' . $arrRepeat['unit'];
                 while ($intEndTime < $intEnd) {
                     if ($objEvents->recurrences > 0 && $count++ >= $objEvents->recurrences) {
                         break;
                     }
                     $intStartTime = strtotime($strtotime, $intStartTime);
                     $intEndTime = strtotime($strtotime, $intEndTime);
                     // Skip events outside the scope
                     if ($intEndTime < $intStart || $intStartTime > $intEnd) {
                         continue;
                     }
                     $this->addEvent($objEvents, $intStartTime, $intEndTime, $strUrl, $intStart, $intEnd, $id);
                 }
             }
         }
     }
     // Sort the array
     foreach (array_keys($this->arrEvents) as $key) {
         ksort($this->arrEvents[$key]);
     }
     // HOOK: modify the result set
     if (isset($GLOBALS['TL_HOOKS']['getAllEvents']) && is_array($GLOBALS['TL_HOOKS']['getAllEvents'])) {
         foreach ($GLOBALS['TL_HOOKS']['getAllEvents'] as $callback) {
             $this->import($callback[0]);
             $this->arrEvents = $this->{$callback}[0]->{$callback}[1]($this->arrEvents, $arrCalendars, $intStart, $intEnd, $this);
         }
     }
     $arrIds = array();
     foreach ($this->arrEvents as $intKey => $arrDays) {
         foreach ($arrDays as $intStart => $arrEvents) {
             foreach ($arrEvents as $arrEvent) {
                 // do not add childevents to prev/next nav
                 if (!$this->cal_ungroupSubevents && $arrEvent['parentEvent'] > 0) {
                     continue;
                 }
                 $arrIds[] = $arrEvent['id'];
             }
         }
     }
     // store events ids in session
     $session = \Session::getInstance()->getData();
     $session[CALENDARPLUS_SESSION_EVENT_IDS] = array();
     $session[CALENDARPLUS_SESSION_EVENT_IDS] = $arrIds;
     \Session::getInstance()->setData($session);
     return $this->arrEvents;
 }