1<?php
2/**
3 * Copyright 2004-2007 Code Fusion  <http://www.codefusion.co.za/>
4 * Copyright 2004-2007 Stuart Binge <s.binge@codefusion.co.za>
5 *
6 * See the enclosed file COPYING for license information (GPL). If you
7 * did not receive this file, see http://www.horde.org/licenses/gpl.
8 */
9
10require_once __DIR__ . '/lib/Application.php';
11Horde_Registry::appInit('kronolith');
12
13if (Kronolith::showAjaxView()) {
14    Horde::url('', true)->redirect();
15}
16
17// Get the current attendees array from the session cache.
18$attendees = $session->get('kronolith', 'attendees', Horde_Session::TYPE_ARRAY);
19$resources = $session->get('kronolith', 'resources', Horde_Session::TYPE_ARRAY);
20$editAttendee = null;
21
22// Get the action ID and value. This specifies what action the user initiated.
23$actionID = Horde_Util::getFormData('actionID');
24if (Horde_Util::getFormData('clearAll')) {
25    $actionID =  'clear';
26}
27$actionValue = Horde_Util::getFormData('actionValue');
28// Perform the specified action, if there is one.
29switch ($actionID) {
30case 'add':
31    // Add new attendees and/or resources. Multiple attendees can be seperated
32    // on a single line by whitespace and/or commas. Resources are added one
33    // at a time (at least for now).
34    $newAttendees = trim(Horde_Util::getFormData('newAttendees'));
35    $newResource = trim(Horde_Util::getFormData('resourceselect'));
36
37    $newAttendees = Kronolith::parseAttendees($newAttendees);
38    if ($newAttendees) {
39        $session->set('kronolith', 'attendees', $attendees + $newAttendees);
40    }
41
42    // Any new resources?
43    if (!empty($newResource)) {
44        /* Get the requested resource */
45        $resource = Kronolith::getDriver('Resource')->getResource($newResource);
46
47        /* Do our best to see what the response will be. Note that this
48         * response is only guarenteed once the event is saved. */
49        $event = Kronolith::getDriver()->getEvent();
50        $event->start = new Horde_Date(Horde_Util::getFormData('startdate'));
51        $event->end = new Horde_Date(Horde_Util::getFormData('enddate'));
52        $event->start->setTimezone(date_default_timezone_get());
53        $event->end->setTimezone(date_default_timezone_get());
54        $response = $resource->getResponse($event);
55        $resources[$resource->getId()] = array(
56            'attendance' => Kronolith::PART_REQUIRED,
57            'response'   => $response,
58            'name'       => $resource->get('name'),
59        );
60
61        $session->set('kronolith', 'resources', $resources);
62    }
63
64    if (Horde_Util::getFormData('addNewClose')) {
65        echo Horde::wrapInlineScript(array('window.close();'));
66        exit;
67    }
68    break;
69
70case 'edit':
71    // Edit the specified attendee.
72    $actionValue = Horde_String::lower($actionValue);
73    if (isset($attendees[$actionValue])) {
74        if (empty($attendees[$actionValue]['name'])) {
75            $editAttendee = $actionValue;
76        } elseif (strpos($actionValue, '@') === false) {
77            $editAttendee = $attendees[$actionValue]['name'];
78        } else {
79            $tmp = new Horde_Mail_Rfc822_Address($actionValue);
80            $tmp->personal = $attendees[$actionValue]['name'];
81            $editAttendee = strval($tmp);
82        }
83        unset($attendees[$actionValue]);
84        $session->set('kronolith', 'attendees', $attendees);
85    }
86    break;
87
88case 'remove':
89    // Remove the specified attendee.
90    $actionValue = Horde_String::lower($actionValue);
91    if (isset($attendees[$actionValue])) {
92        unset($attendees[$actionValue]);
93        $session->set('kronolith', 'attendees', $attendees);
94    }
95    break;
96
97case 'removeResource':
98    // Remove the specified resource
99    if (isset($resources[$actionValue])) {
100        unset($resources[$actionValue]);
101        $session->set('kronolith', 'resources', $resources);
102    }
103    break;
104
105case 'changeResourceResp':
106    //@TODO: What else to do here? Disallow if responsetype is auto?
107    list($partval, $partname) = explode(' ', $actionValue, 2);
108    if (isset($resources[$partname])) {
109        $resources[$partname]['response'] = $partval;
110        $session->set('kronolith', 'resources', $resources);
111    }
112    break;
113
114case 'changeatt':
115    // Change the attendance status of an attendee
116    list($partval, $partname) = explode(' ', $actionValue, 2);
117    $partname = Horde_String::lower($partname);
118    if (isset($attendees[$partname])) {
119        $attendees[$partname]['attendance'] = $partval;
120        $session->set('kronolith', 'attendees', $attendees);
121    }
122    break;
123
124case 'changeResourceAtt':
125    // Change attendance status of a resource
126    list($partval, $partname) = explode(' ', $actionValue, 2);
127    $partname = Horde_String::lower($partname);
128    if (isset($resources[$partname])) {
129        $resources[$partname]['attendance'] = $partval;
130        $session->set('kronolith', 'resources', $resources);
131    }
132    break;
133
134case 'changeresp':
135    // Change the response status of an attendee
136    list($partval, $partname) = explode(' ', $actionValue, 2);
137    $partname = Horde_String::lower($partname);
138    if (isset($attendees[$partname])) {
139        $attendees[$partname]['response'] = $partval;
140        $session->set('kronolith', 'attendees', $attendees);
141    }
142    break;
143
144case 'dismiss':
145    // Close the attendee window.
146    if ($browser->hasFeature('javascript')) {
147        echo Horde::wrapInlineScript(array('window.close();'));
148        exit;
149    }
150
151    if ($url = Horde::verifySignedUrl(Horde_Util::getFormData('url'))) {
152        $url = new Horde_Url($url, true);
153    } else {
154        $date = new Horde_Date(Horde_Util::getFormData('startdate'));
155        $url = Horde::url($prefs->getValue('defaultview') . '.php', true)
156            ->add('date', $date->dateString());
157    }
158
159    // Make sure URL is unique.
160    $url->unique()->redirect();
161
162case 'clear':
163    // Remove all the attendees and resources.
164    $session->remove('kronolith', 'attendees');
165    $session->remove('kronolith', 'resources');
166    break;
167}
168
169/* Get list of resources for select list, and remove those we already added */
170if (!empty($conf['resource']['driver'])) {
171    $allResources = Kronolith::getDriver('Resource')->listResources(Horde_Perms::READ, array(), 'name');
172    foreach (array_keys($resources) as $id) {
173        unset($allResources[$id]);
174    }
175} else {
176    $allResources = array();
177}
178
179// Get the current Free/Busy view; default to the 'day' view if none specified.
180$view = Horde_Util::getFormData('view', 'Day');
181
182// Pre-format our delete image/link.
183$delimg = Horde::img('delete.png', _("Remove Attendee"));
184
185$ident = $injector->getInstance('Horde_Core_Factory_Identity')->create();
186$identities = $ident->getAll('id');
187$vars = Horde_Variables::getDefaultVariables();
188$tabs = new Horde_Core_Ui_Tabs(null, $vars);
189$tabs->addTab(_("Day"), new Horde_Url('javascript:switchView(\'Day\')'), 'Day');
190$tabs->addTab(_("Work Week"), new Horde_Url('javascript:switchView(\'Workweek\')'), 'Workweek');
191$tabs->addTab(_("Week"), new Horde_Url('javascript:switchView(\'Week\')'), 'Week');
192$tabs->addTab(_("Month"), new Horde_Url('javascript:switchView(\'Month\')'), 'Month');
193
194$attendee_view = &Kronolith_FreeBusy_View::singleton($view);
195
196// Add the creator as a required attendee in the Free/Busy display
197$cal = @unserialize($prefs->getValue('fb_cals'));
198if (!is_array($cal)) {
199    $cal = null;
200}
201
202// If the free/busy calendars preference is empty, default to the user's
203// default_share preference, and if that's empty, to their username.
204if (!$cal) {
205    $cal = 'internal_' . $prefs->getValue('default_share');
206    if (!$cal) {
207        $cal = 'internal_' . $GLOBALS['registry']->getAuth();
208    }
209    $cal = array($cal);
210}
211try {
212    $vfb = Kronolith_FreeBusy::generate($cal, null, null, true, $GLOBALS['registry']->getAuth());
213    $attendee_view->addRequiredMember($vfb);
214} catch (Exception $e) {
215    $notification->push(sprintf(_("Error retrieving your free/busy information: %s"), $e->getMessage()));
216}
217
218// Add the Free/Busy information for each attendee.
219foreach ($session->get('kronolith', 'attendees', Horde_Session::TYPE_ARRAY) as $email => $status) {
220    if (strpos($email, '@') !== false &&
221        ($status['attendance'] == Kronolith::PART_REQUIRED ||
222         $status['attendance'] == Kronolith::PART_OPTIONAL)) {
223        try {
224            $vfb = Kronolith_FreeBusy::get($email);
225            $organizer = $vfb->getAttribute('ORGANIZER');
226            if (empty($organizer)) {
227                $vfb->setAttribute('ORGANIZER', 'mailto:' . $email, array(),
228                                   false);
229            }
230            if ($status['attendance'] == Kronolith::PART_REQUIRED) {
231                $attendee_view->addRequiredMember($vfb);
232            } else {
233                $attendee_view->addOptionalMember($vfb);
234            }
235        } catch (Exception $e) {
236            $notification->push(
237                sprintf(_("Error retrieving free/busy information for %s: %s"),
238                        $email, $e->getMessage()));
239        }
240    }
241}
242
243// Add Free/Busy for resources
244if (count($resources)) {
245    $driver = Kronolith::getDriver('Resource');
246    foreach ($resources as $r_id => $resource) {
247        try {
248            $r = $driver->getResource($r_id);
249        } catch (Horde_Exception_NotFound $e) {
250            continue;
251        }
252        try {
253            $vfb = $r->getFreeBusy(null, null, true);
254            if ($resource['attendance'] == Kronolith::PART_REQUIRED) {
255                $attendee_view->addRequiredResourceMember($vfb);
256            } else {
257                $attendee_view->addOptionalResourceMember($vfb);
258            }
259        } catch (Horde_Exception $e) {
260            $notification->push(
261                sprintf(_("Error retrieving free/busy information for %s: %s"),
262                    $r_id, $e->getMessage()));
263        }
264    }
265}
266
267$date = new Horde_Date(Horde_Util::getFormData('startdate', date('Ymd') . '000000'));
268$end =  new Horde_Date(Horde_Util::getFormData('enddate', date('Ymd') . '000000'));
269
270$vfb_html = $attendee_view->render($date);
271
272$injector->getInstance('Horde_Core_Factory_Imple')->create('Kronolith_Ajax_Imple_ContactAutoCompleter', array(
273    'id' => 'newAttendees'
274));
275
276$title = _("Edit attendees");
277$page_output->sidebar = $page_output->topbar = false;
278$page_output->header(array(
279    'title' => $title
280));
281require KRONOLITH_TEMPLATES . '/javascript_defs.php';
282$notification->notify(array('listeners' => 'status'));
283require KRONOLITH_TEMPLATES . '/attendees/attendees.inc';
284$page_output->footer();
285