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