'Text', 'StartDate' => 'Date', 'StartTime' => 'Time', 'EndDate' => 'Date', 'EndTime' => 'Time', 'Content' => 'HTMLText', 'is_all_day' => 'Boolean', 'is_single' => 'Boolean' ); static $has_one = array ( 'Event' => 'CalendarEvent', 'Calendar' => 'Calendar' ); static $offset; static $date_delimiter; static $date_format = "mdy"; static $time_format = "24"; static $dayofweek_format_character; static $dayofweek_header_format_character; static $month_format_character = "%b"; static $day_format_character = "%e"; static $year_format_character = "%Y"; static $month_header_format_character = "%B"; static $day_header_format_character = "%e"; static $year_header_format_character = "%Y"; protected $event_class = null; protected $event_object = null; // Will take a DOSet if there are multiple times associated with the event. public $Times; public $Feed = false; public static function set_param($param, $value) { self::$$param = $value; } public static function get_param($param) { return self::$$param; } public static function dmy() { return self::get_param('date_format') == "dmy"; } public static function mdy() { return self::get_param('date_format') == "mdy"; } public static function set_date_format($f) { if(!in_array($f, array('dmy','mdy'))) die("CalendarDateTime::set_date_format():"._t('CalendarDateTime.INVALIDFORMAT','Invalid date format. Must be either "dmy" or "mdy"')); self::set_param('date_format',$f); } public static function set_time_format($f) { if(!in_array($f, array('24','12'))) die("CalendarDateTime::set_time_format():"._t('CalendarDateTime.INVALIDTIME','Invalid time format. Must be either "24" or "12"')); self::set_param('time_format',$f); } public function getEventClass() { if($this->event_class !== null) return $this->event_class; $class = get_class($this); $has_ones = Object::combined_static($class, 'has_one'); if(is_array($has_ones)) { foreach($has_ones as $c) { if($c == 'CalendarEvent' || is_subclass_of($c, 'CalendarEvent')) { $this->event_class = $c; return $this->event_class; } } } } public function getEventObject() { if($this->event_object !== null) return $this->event_object; $class = $this->getEventClass(); $this->event_object = new $class; return $this->event_object; } public function getAnnouncementPopup() { $f = new FieldSet(); $f->push(new TextField('Title',_t('CalendarDateTime.TITLE','Title'))); $f->push(new DatePickerField('StartDate',_t('CalendarDateTime.STARTDATE','Start Date'))); $f->push(new TimeField('StartTime',_t('CalendarDateTime.STARTTIME','Start Time'))); $f->push(new DatePickerField('EndDate',_t('CalendarDateTime.ENDDATE','EndDate'))); $f->push(new TimeField('EndTime',_t('CalendarDateTime.ENDTIME','End Time'))); $f->push(new CheckboxField('is_all_day',_t('CalendarDateTime.ALLDAY','All Day'))); $f->push(new TextareaField('Content',_t('CalendarDateTime.CONTENT','Content'))); return $f; } public function getDateTimePopup() { $f = new FieldSet(); if(isset($this->table_fields['StartDate'])) $f->push(new DatePickerField('StartDate',_t('CalendarDateTime.STARTDATE','Start Date'))); if(isset($this->table_fields['StartTime'])) $f->push(new TimeField('StartTime',_t('CalendarDateTime.STARTTIME','Start Time'))); if(isset($this->table_fields['EndDate'])) $f->push(new DatePickerField('EndDate',_t('CalendarDateTime.ENDDATE','EndDate'))); if(isset($this->table_fields['EndTime'])) $f->push(new TimeField('EndTime',_t('CalendarDateTime.ENDTIME','End Time'))); if(isset($this->table_fields['is_all_day'])) $f->push(new CheckboxField('is_all_day',_t('CalendarDateTime.ALLDAY','All Day'))); return $f; } protected $table_fields = array( 'StartDate' => 'DatePickerField', 'EndDate' => 'DatePickerField', 'StartTime' => 'TimeField', 'EndTime' => 'TimeField', 'is_all_day' => 'CheckboxField' ); protected $table_titles = array ( 'FormattedStartDate' => 'Start Date', 'FormattedEndDate' => 'End Date', 'FormattedStartTime' => 'Start Time', 'FormattedEndTime' => 'End Time', 'FormattedAllDay' => 'All day' ); protected $announcement_titles = array( 'Title' => 'Title', 'FormattedStartDate' => 'Start Date', 'FormattedStartTime' => 'Start Time', 'EndTime' => 'End Time' ); // This gets populated with objects, which is not allowed by default. // We'll use initPopupFields() to saturate this when needed. protected $popup_table_fields = null; protected $announcement_table_fields = null; protected $complex = true; // Meant to be overloaded by subclasses. function extendTable() {return;} function extendAnnouncement() {return;} public function getDateTimeTable($eventID) { $this->initPopupFields(); $this->extendTable(); $name = 'DateTimes'; $titles = $this->getTableTitles(); $filter = "`CalendarDateTime`.EventID = {$eventID}"; $fields = $this->getPopupFields(); $fields->push(new HiddenField('EventID','',$eventID)); $table = new DataObjectManager($this->getEventObject(), $name, get_class($this), $titles, $fields, $filter); $table->setAddTitle(_t("CalendarDateTime.ADATE","a Date")); return $table; } public function getAnnouncementTable($calendarID) { $this->extendAnnouncement(); $table = new DataObjectManager( $this->getEventObject()->Parent(), 'Announcements', $this->class, $this->getAnnouncementTitles(), $this->getAnnouncementFields() ); $table->setAddTitle("Announcement"); $table->setParentClass("Calendar"); return $table; } public function addTableField($name, $type) { $this->table_fields[$name] = $type; } protected function initPopupFields() { $this->popup_table_fields = array( new DatePickerField('StartDate',_t('CalendarEvent.STARTDATE','Start Date')), new DatePickerField('EndDate', _t('CalendarEvent.ENDDATE','End Date')), new TimeField('StartTime',_t('CalendarEvent.STARTTIME','Start Time')), new TimeField('EndTime', _t('CalendarEvent.ENDTIME','End Time (blank if none)')), new CheckboxField('is_all_day',_t('CalendarEvent.ALLDAY','All Day')) ); } private function initAnnouncementFields() { $this->announcement_table_fields = array( new TextField('Title'), new DatePickerField('StartDate',_t('CalendarEvent.STARTDATE','Start Date')), new TimeField('StartTime',_t('CalendarEvent.STARTTIME','Start Time')), new DatePickerField('EndDate',_t('CalendarEvent.ENDDATE','EndDate')), new TimeField('EndTime',_t('CalendarEvent.ENDTIME','End Time')), new CheckboxField('is_all_day',_t('CalendarEvent.ALLDAY','All Day')), new TextareaField('Content',_t('CalendarEvent.CONTENT','Content')), ); } protected function getPopupFields() { if($this->popup_table_fields === null) $this->initPopupFields(); $fields = new FieldSet(); foreach($this->popup_table_fields as $field) $fields->push($field); $customized = true; $this->extend('updateCMSFields', $fields, $customized); return $fields; } protected function getAnnouncementFields() { if($this->announcement_table_fields === null) $this->initAnnouncementFields(); $this->extendAnnouncement(); $fields = new FieldSet(); foreach($this->announcement_table_fields as $field) { $fields->push($field); } $customized = true; $this->extend('updateCMSFields', $fields, $customized); return $fields; } public function addPopupField($field) { if($this->popup_table_fields === null) $this->initPopupFields(); if(!$this->isComplex()) $this->setComplex(true); $this->popup_table_fields[] = $field; } public function addAnnouncementField($field) { if($this->announcement_table_fields === null) $this->initAnnouncementFields(); if(!$this->isComplex()) $this->setComplex(true); $this->announcement_table_fields[] = $field; } public function removePopupField($name) { for($i = 0; $i < sizeof($this->popup_table_fields); $i++) { $fieldObj = $this->popup_table_fields[$i]; if($fieldObj instanceof FormField) { if($fieldObj->Name() == $name) { unset($this->popup_table_fields[$i]); break; } } } } public function removeAnnouncementField($name) { for($i = 0; $i < sizeof($this->announcement_table_fields); $i++) { $fieldObj = $this->announcement_table_fields[$i]; if($fieldObj instanceof Field) { if($fieldObj->Name == $name) { unset($this->announcement_table_fields[$i]); break; } } } } public function addTableFields($fields) { if(is_array($fields)) { foreach($fields as $k => $v) $this->addTableField($k,$v); } } public function addPopupFields($fields) { if(is_array($fields)) { foreach($fields as $field) $this->addPopupField($field); } } public function addAnnouncementFields($fields) { if(is_array($fields)) { foreach($fields as $field) $this->addAnnouncementField($field); } } public function addTableTitle($name, $title) { $this->table_titles[$name] = $title; } public function addAnnouncementTitle($name, $title) { $this->announcement_titles[$name] = $title; } public function addAnnouncementTitles($titles) { if(is_array($titles)) { foreach($titles as $k => $v) $this->addAnnouncementTitle($k,$v); } } public function addTableTitles($titles) { if(is_array($titles)) { foreach($titles as $k => $v) $this->addTableTitle($k,$v); } } public function getFormattedStartDate() { if(!$this->StartDate) return "none"; return self::mdy() ? $this->obj('StartDate')->Format('m-d-Y') : $this->obj('StartDate')->Format('d-m-Y'); } public function getFormattedEndDate() { if(!$this->EndDate) return "none"; return self::mdy() ? $this->obj('EndDate')->Format('m-d-Y') : $this->obj('EndDate')->Format('d-m-Y'); } public function getFormattedStartTime() { if(!$this->StartTime) return "none"; return self::get_param('time_format') == "12" ? $this->obj('StartTime')->Nice() : $this->obj('StartTime')->Nice24(); } public function getFormattedEndTime() { if(!$this->EndTime) return "none"; return self::get_param('time_format') == "12" ? $this->obj('EndTime')->Nice() : $this->obj('EndTime')->Nice24(); } public function getFormattedAllDay() { return $this->is_all_day == 1 ? _t('YES','Yes') : _t('NO','No'); } public function removeTableField($name) { unset($this->table_fields[$name]); } public function removeTableTitle($name) { unset($this->table_titles[$name]); } public function removeAnnouncementTitle($name) { unset($this->announcement_titles[$name]); } protected function setComplex($bool) { $this->complex = $bool; } protected function isComplex() { return $this->complex; } public function getTableFields() { return $this->table_fields; } public function getTableTitles() { return $this->table_titles; } public function getAnnouncementTitles() { return $this->announcement_titles; } public function Announcement() { return $this->CalendarID > 0; } public function MultipleTimes() { return isset($this->Times) && $this->Times->Count() > 1; } public function Times() { return $this->Event()->Recursion ? $this : $this->Times; } public function AllDay() { return $this->is_all_day == 1; } /** * For the RSS feed */ public function Link() { if($this->Announcement()) return $this->Calendar()->Link(); else { $date = date('Y-m-d',strtotime($this->StartDate)); $filters = Calendar::buildFilterString(); $params = Controller::curr()->urlParams; if(isset($params['ID'])) { $calendar_params = "CalendarStart=" . $params['ID']; if(isset($params['OtherID'])) $calendar_params .= "&CalendarEnd=" . $params['OtherID']; } else { $calendar_params = null; } if($filters || $calendar_params) $query_string = !empty($filters) ? "?" . $filters . "&" . $calendar_params : "?" . $calendar_params; else $query_string = ""; return $this->Event()->Link('view/'.$date.$query_string); } } public function NestedLink() { if($this->Announcement()) { return $this->Calendar()->Link(); } return Controller::curr()->Link('showevent/'.$this->Event()->URLSegment)."?d=".date('Y-m-d',strtotime($this->StartDate)); } public function AbsoluteLink() { return Director::absoluteURL($this->Link()); } public function AbsoluteNestedLink() { return Director::absoluteURL($this->NestedLink()); } public function EventTitle() { return $this->Announcement() ? $this->Title : $this->Event()->Title; } public function EventContent() { return $this->Announcement() ? $this->Content : $this->Event()->Content; } public function ICSLink() { if($this->Feed) $ret = $this->Calendar()->Link() . "ics/" . $this->ID . "/" . $this->MicroformatStart(false) . "-" . $this->MicroformatEnd(false) . "?title=".urlencode($this->Title); else if($this->Announcement()) $ret = $this->Calendar()->Link() . "ics/announcement-" . $this->ID . "/" . $this->MicroformatStart(false) . "-" . $this->MicroformatEnd(false); else $ret = $this->Event()->Parent()->Link() . "ics/" . $this->Event()->ID . "/" . $this->MicroformatStart(false) . "-" . $this->MicroformatEnd(false); return $ret; } public function OtherDates() { if($this->Announcement()) return false; if($this->Event()->Recursion == 1) { return $this->Event()->Parent()->getNextRecurringEvents($this->Event(), $this); } return DataObject::get( get_class($this), "EventID = {$this->EventID} AND StartDate != '{$this->StartDate}'", "StartDate ASC", "", $this->Event()->Calendar()->DefaultEventDisplay ); } protected function MicroformatStart($offset = true) { if(!$this->StartDate) return ""; $date = $this->StartDate; if($this->AllDay()) $time = "00:00:00"; else $time = $this->StartTime ? $this->StartTime : "00:00:00"; return CalendarUtil::Microformat($date, $time, $offset); } protected function MicroformatEnd($offset = true) { if($this->AllDay() && $this->StartDate) { $time = "00:00:00"; $end = new sfDate($this->StartDate); $date = $end->tomorrow()->date(); unset($end); } else { $date = $this->EndDate ? $this->EndDate : $this->StartDate; $time = $this->EndTime && $this->StartTime ? $this->EndTime : (!$this->EndTime && $this->StartTime ? $this->StartTime : "00:00:00"); } return CalendarUtil::Microformat($date, $time, $offset); } public function _Dates() { list($strStartDate,$strEndDate) = CalendarUtil::getDateString($this->StartDate,$this->EndDate); $html = "" . $strStartDate . ""; $html .= ($strEndDate != "") ? self::$date_delimiter : ""; $html .= ""; $html .= ($strEndDate != "") ? $strEndDate : ""; $html .= ""; return $html; } public function _Times() { $func = self::get_param('time_format') == "24" ? "Nice24" : "Nice"; $ret = $this->obj('StartTime')->$func(); $ret .= $this->EndTime ? " — " . $this->obj('EndTime')->$func() : ""; return $ret; } } ?>