/**
 * Fetch the events for a specific calendar and date range
 *
 * @param int The calendar ID
 * @param int Start time stamp
 * @param int End time stmap
 * @param int 1 to fetch unapproved events too
 * @param int The user ID to fetch private events for (0 fetches none)
 * @return array Array of events
 */
function get_events($calendar, $start, $end, $unapproved = 0, $private = 1)
{
    global $db, $mybb;
    // We take in to account timezones here - we add/subtract 12 hours from our GMT time ranges
    $start -= 12 * 3600;
    $end += 12 * 3600;
    $visible_where = '';
    if ($unapproved != 1) {
        $visible_where = " AND e.visible='1'";
    }
    $events_cache = array();
    $query = $db->query("\n\t\tSELECT u.*, e.*\n\t\tFROM " . TABLE_PREFIX . "events e\n\t\tLEFT JOIN " . TABLE_PREFIX . "users u ON (u.uid=e.uid)\n\t\tWHERE e.cid='{$calendar['cid']}' {$visible_where} AND ((e.endtime>={$start} AND e.starttime<={$end}) OR (e.endtime=0 AND e.starttime>={$start} AND e.starttime<={$end})) AND ((e.uid='{$mybb->user['uid']}' AND private='1') OR private!='1')\n\t\tORDER BY endtime DESC\n\t");
    while ($event = $db->fetch_array($query)) {
        if ($event['ignoretimezone'] == 0) {
            $offset = $event['timezone'];
        } else {
            $offset = $mybb->user['timezone'];
        }
        $event['starttime_user'] = $event['starttime'] + $offset * 3600;
        // Single day event
        if ($event['endtime'] == 0) {
            $event_date = gmdate("j-n-Y", $event['starttime_user']);
            $events_cache[$event_date][] = $event;
        } else {
            $event_date = explode("-", gmdate("j-n-Y", $event['starttime_user']));
            $event['endtime_user'] = $event['endtime'] + $offset * 3600;
            $event['weekday_start'] = $calendar['startofweek'];
            $start_day = gmmktime(0, 0, 0, $event_date[1], $event_date[0], $event_date[2]);
            $event['repeats'] = my_unserialize($event['repeats']);
            // Event does not repeat - just goes over a few days
            if ($event['repeats']['repeats'] == 0) {
                if ($start_day < $start) {
                    $range_start = gmmktime(0, 0, 0, gmdate("n", $start), gmdate("j", $start), gmdate("Y", $start));
                } else {
                    $range_start = $start_day;
                }
            } else {
                $range_start = fetch_next_occurance($event, array("start" => $start, "end" => $end), $start_day, true);
            }
            $first = "";
            $event_date = explode("-", gmdate("j-n-Y", $range_start));
            // Get rid of hour/minutes because sometimes they cause the events to stretch into the next day
            $range_end = gmmktime(23, 59, 59, gmdate("n", $event['endtime_user']), gmdate("j", $event['endtime_user']), gmdate("Y", $event['endtime_user']));
            while ($range_start < $range_end) {
                // Outside the dates we care about, break! (No unnecessary looping here!)
                if ($range_start > $end || !$range_start) {
                    break;
                }
                if ($range_start >= $start) {
                    $day_date = gmdate("j-n-Y", $range_start);
                    if ($first && $day_date != "{$first}") {
                        $events_cache[$day_date][] =& $events_cache["{$first}"][$count];
                    } else {
                        if (!$first) {
                            if (!isset($events_cache[$day_date])) {
                                $events_cache[$day_date] = array();
                            }
                            $count = count($events_cache[$day_date]);
                            $first = $day_date;
                            $events_cache[$day_date][] = $event;
                        }
                    }
                }
                if ($event['repeats']['repeats'] == 0) {
                    $range_start += 86400;
                } else {
                    $range_start = fetch_next_occurance($event, array("start" => $start, "end" => $end), $range_start);
                }
            }
        }
    }
    return $events_cache;
}
Example #2
0
 /**
  * @return bool
  */
 function verify_repeats()
 {
     $event =& $this->data;
     if (!is_array($event['repeats']) || !$event['repeats']['repeats']) {
         return true;
     }
     if (!$event['endtime']) {
         $this->set_error("only_ranged_events_repeat");
         return false;
     }
     switch ($event['repeats']['repeats']) {
         case 1:
             $event['repeats']['days'] = (int) $event['repeats']['days'];
             if ($event['repeats']['days'] <= 0) {
                 $this->set_error("invalid_repeat_day_interval");
                 return false;
             }
         case 2:
             break;
         case 3:
             $event['repeats']['weeks'] = (int) $event['repeats']['weeks'];
             if ($event['repeats']['weeks'] <= 0) {
                 $this->set_error("invalid_repeat_week_interval");
                 return false;
             }
             if (count($event['repeats']['days']) == 0) {
                 $this->set_error("invalid_repeat_weekly_days");
                 return false;
             }
             asort($event['repeats']['days']);
             break;
         case 4:
             if ($event['repeats']['day']) {
                 $event['repeats']['day'] = (int) $event['repeats']['day'];
                 if ($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31) {
                     $this->set_error("invalid_repeat_day_interval");
                     return false;
                 }
             } else {
                 if ($event['repeats']['occurance'] != "last") {
                     $event['repeats']['occurance'] = (int) $event['repeats']['occurance'];
                 }
                 $event['repeats']['weekday'] = (int) $event['repeats']['weekday'];
             }
             $event['repeats']['months'] = (int) $event['repeats']['months'];
             if ($event['repeats']['months'] <= 0 || $event['repeats']['months'] > 12) {
                 $this->set_error("invalid_repeat_month_interval");
                 return false;
             }
             break;
         case 5:
             if ($event['repeats']['day']) {
                 $event['repeats']['day'] = (int) $event['repeats']['day'];
                 if ($event['repeats']['day'] <= 0 || $event['repeats']['day'] > 31) {
                     $this->set_error("invalid_repeat_day_interval");
                     return false;
                 }
             } else {
                 if ($event['repeats']['occurance'] != "last") {
                     $event['repeats']['occurance'] = (int) $event['repeats']['occurance'];
                 }
                 $event['repeats']['weekday'] = (int) $event['repeats']['weekday'];
             }
             $event['repeats']['month'] = (int) $event['repeats']['month'];
             if ($event['repeats']['month'] <= 0 || $event['repeats']['month'] > 12) {
                 $this->set_error("invalid_repeat_month_interval");
                 return false;
             }
             $event['repeats']['years'] = (int) $event['repeats']['years'];
             if ($event['repeats']['years'] <= 0 || $event['repeats']['years'] > 4) {
                 $this->set_error("invalid_repeat_year_interval");
                 return false;
             }
             break;
         default:
             $event['repeats'] = array();
     }
     require_once MYBB_ROOT . "inc/functions_calendar.php";
     $event['starttime_user'] = $event['starttime'];
     $event['endtime_user'] = $event['endtime'];
     $next_occurance = fetch_next_occurance($event, array('start' => $event['starttime'], 'end' => $event['endtime']), $event['starttime'], true);
     if ($next_occurance > $event['endtime']) {
         $this->set_error("event_wont_occur");
         return false;
     }
     return true;
 }