]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/Event/lib/eventlistitem.php
Initial move towards microformats2
[quix0rs-gnu-social.git] / plugins / Event / lib / eventlistitem.php
1 <?php
2 /**
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2011, StatusNet, Inc.
5  *
6  * Notice-list representation of an event
7  *
8  * PHP version 5
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Affero General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Affero General Public License for more details.
19  *
20  * You should have received a copy of the GNU Affero General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  * @category  Event
24  * @package   StatusNet
25  * @author    Evan Prodromou <evan@status.net>
26  * @copyright 2011 StatusNet, Inc.
27  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
28  * @link      http://status.net/
29  */
30
31 if (!defined('STATUSNET')) {
32     // This check helps protect against security problems;
33     // your code file can't be executed directly from the web.
34     exit(1);
35 }
36
37 /**
38  * Notice-list representation of an event
39  *
40  * @category  General
41  * @package   StatusNet
42  * @author    Evan Prodromou <evan@status.net>
43  * @copyright 2011 StatusNet, Inc.
44  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
45  * @link      http://status.net/
46  */
47 class EventListItem extends NoticeListItemAdapter
48 {
49     function showNotice()
50     {
51         $this->nli->showAuthor();
52         $this->showContent();
53     }
54
55     function showContent()
56     {
57         $notice = $this->nli->notice;
58         $out    = $this->nli->out;
59
60         $profile = $notice->getProfile();
61         $event   = Happening::fromNotice($notice);
62
63         if (empty($event)) {
64             // TRANS: Content for a deleted RSVP list item (RSVP stands for "please respond").
65             $out->element('p', null, _m('Deleted.'));
66             return;
67         }
68
69         $out->elementStart('div', 'vevent event e-content'); // VEVENT IN
70
71         $out->elementStart('h3', 'summary');  // VEVENT/H3 IN
72
73         if (!empty($event->url)) {
74             $out->element('a',
75                           array('href' => $event->url,
76                                 'class' => 'event-title entry-title summary'),
77                           $event->title);
78         } else {
79             $out->text($event->title);
80         }
81
82         $out->elementEnd('h3'); // VEVENT/H3 OUT
83
84         $now       = new DateTime();
85         $startDate = new DateTime($event->start_time);
86         $endDate   = new DateTime($event->end_time);
87         $userTz    = new DateTimeZone(common_timezone());
88
89         // Localize the time for the observer
90         $now->setTimeZone($userTz);
91         $startDate->setTimezone($userTz);
92         $endDate->setTimezone($userTz);
93
94         $thisYear  = $now->format('Y');
95         $startYear = $startDate->format('Y');
96         $endYear   = $endDate->format('Y');
97
98         $dateFmt = 'D, F j, '; // e.g.: Mon, Aug 31
99
100         if ($startYear != $thisYear || $endYear != $thisYear) {
101             $dateFmt .= 'Y,'; // append year if we need to think about years
102         }
103
104         $startDateStr = $startDate->format($dateFmt);
105         $endDateStr = $endDate->format($dateFmt);
106
107         $timeFmt = 'g:ia';
108
109         $startTimeStr = $startDate->format($timeFmt);
110         $endTimeStr = $endDate->format("{$timeFmt} (T)");
111
112         $out->elementStart('div', 'event-times'); // VEVENT/EVENT-TIMES IN
113
114         // TRANS: Field label for event description.
115         $out->element('strong', null, _m('Time:'));
116
117         $out->element('abbr', array('class' => 'dtstart',
118                                     'title' => common_date_iso8601($event->start_time)),
119                       $startDateStr . ' ' . $startTimeStr);
120         $out->text(' – ');
121         if ($startDateStr == $endDateStr) {
122             $out->element('span', array('class' => 'dtend',
123                                         'title' => common_date_iso8601($event->end_time)),
124                           $endTimeStr);
125         } else {
126             $out->element('span', array('class' => 'dtend',
127                                         'title' => common_date_iso8601($event->end_time)),
128                           $endDateStr . ' ' . $endTimeStr);
129         }
130
131         $out->elementEnd('div'); // VEVENT/EVENT-TIMES OUT
132
133         if (!empty($event->location)) {
134             $out->elementStart('div', 'event-location');
135             // TRANS: Field label for event description.
136             $out->element('strong', null, _m('Location:'));
137             $out->element('span', 'location', $event->location);
138             $out->elementEnd('div');
139         }
140
141         if (!empty($event->description)) {
142             $out->elementStart('div', 'event-description');
143             // TRANS: Field label for event description.
144             $out->element('strong', null, _m('Description:'));
145             $out->element('span', 'description', $event->description);
146             $out->elementEnd('div');
147         }
148
149         $rsvps = $event->getRSVPs();
150
151         $out->elementStart('div', 'event-rsvps');
152         // TRANS: Field label for event description.
153
154         $out->text(_('Attending:'));
155         $out->elementStart('ul', 'attending-list');
156
157         foreach ($rsvps as $verb => $responses) {
158             $out->elementStart('li', 'rsvp-list');
159             switch ($verb)
160             {
161             case RSVP::POSITIVE:
162                 $out->text(_('Yes:'));
163                 break;
164             case RSVP::NEGATIVE:
165                 $out->text(_('No:'));
166                 break;
167             case RSVP::POSSIBLE:
168                 $out->text(_('Maybe:'));
169                 break;
170             }
171             $ids = array();
172             foreach ($responses as $response) {
173                 $ids[] = $response->profile_id;
174             }
175             $ids = array_slice($ids, 0, ProfileMiniList::MAX_PROFILES + 1);
176             $profiles = Profile::pivotGet('id', $ids);
177             $profile  = new ArrayWrapper(array_values($profiles));
178             $minilist = new ProfileMiniList($profile, $out);
179             $minilist->show();
180
181             $out->elementEnd('li');
182         }
183
184         $out->elementEnd('ul');
185         $out->elementEnd('div');
186
187         $user = common_current_user();
188
189         if (!empty($user)) {
190             $rsvp = $event->getRSVP($user->getProfile());
191
192             if (empty($rsvp)) {
193                 $form = new RSVPForm($event, $out);
194             } else {
195                 $form = new CancelRSVPForm($rsvp, $out);
196             }
197
198             $form->show();
199         }
200
201         $out->elementEnd('div'); // vevent out
202     }
203 }