Fix 24:00 crop
[tine20] / tine20 / Calendar / Preference.php
1 <?php
2 /**
3  * Tine 2.0
4  * 
5  * @package     Calendar
6  * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
7  * @author      Cornelius Weiss <c.weiss@metaways.de>
8  * @copyright   Copyright (c) 2009-2014 Metaways Infosystems GmbH (http://www.metaways.de)
9  */
10
11
12 /**
13  * backend for Calendar preferences
14  *
15  * @package     Calendar
16  */
17 class Calendar_Preference extends Tinebase_Preference_Abstract
18 {
19     /**
20      * where daysview should be scrolled to
21      */
22     const DAYSVIEW_STARTTIME = 'daysviewstarttime';
23     
24     /**
25      * where daysvoew should be scrolled maximum up to
26      */
27     const DAYSVIEW_ENDTIME = 'daysviewendtime';
28
29     /**
30      * default calendar all newly created/invited events are placed in
31      */
32     const DEFAULTCALENDAR = 'defaultCalendar';
33
34     /**
35      * have name of default favorite an a central palce
36      * _("All my events")
37      */
38     const DEFAULTPERSISTENTFILTER_NAME = "All my events";
39     
40     /**
41      * general notification level
42      */
43     const NOTIFICATION_LEVEL = 'notificationLevel';
44     
45     /**
46      * send notifications of own updates
47      */
48     const SEND_NOTIFICATION_OF_OWN_ACTIONS = 'sendnotificationsofownactions';
49     
50     /**
51      * enable default alarm 
52      */
53     const DEFAULTALARM_ENABLED = 'defaultalarmenabled';
54     
55     /**
56      * default alarm time in minutes before
57      */
58     const DEFAULTALARM_MINUTESBEFORE = 'defaultalarmminutesbefore';
59     
60     /**
61      * default alarm time in minutes before
62      */
63     const DEFAULTATTENDEE_STRATEGY = 'defaultAttendeeStrategy';
64     
65     /**
66      * @var string application
67      */
68     protected $_application = 'Calendar';
69         
70     /**
71      * get all possible application prefs
72      *
73      * @return  array   all application prefs
74      */
75     public function getAllApplicationPreferences()
76     {
77         $allPrefs = array(
78             self::DAYSVIEW_STARTTIME,
79             self::DAYSVIEW_ENDTIME,
80             self::DEFAULTCALENDAR,
81             self::DEFAULTPERSISTENTFILTER,
82             self::NOTIFICATION_LEVEL,
83             self::SEND_NOTIFICATION_OF_OWN_ACTIONS,
84             self::DEFAULTALARM_ENABLED,
85             self::DEFAULTALARM_MINUTESBEFORE,
86             self::DEFAULTATTENDEE_STRATEGY
87         );
88             
89         return $allPrefs;
90     }
91     
92     /**
93      * get translated right descriptions
94      * 
95      * @return  array with translated descriptions for this applications preferences
96      */
97     public function getTranslatedPreferences()
98     {
99         $translate = Tinebase_Translation::getTranslation($this->_application);
100
101         $prefDescriptions = array(
102             self::DAYSVIEW_STARTTIME => array(
103                 'label'         => $translate->_('Start Time'),
104                 'description'   => $translate->_('Position on the left time axis, day and week view should start with'),
105             ),
106             self::DAYSVIEW_ENDTIME => array(
107                 'label'         => $translate->_('End Time'),
108                 'description'   => $translate->_('Position on the left time axis, day and week view should end with'),
109             ),
110             self::DEFAULTCALENDAR  => array(
111                 'label'         => $translate->_('Default Calendar'),
112                 'description'   => $translate->_('The default calendar for invitations and new events'),
113             ),
114             self::DEFAULTPERSISTENTFILTER  => array(
115                 'label'         => $translate->_('Default Favorite'),
116                 'description'   => $translate->_('The default favorite which is loaded on calendar startup'),
117             ),
118             self::NOTIFICATION_LEVEL => array(
119                 'label'         => $translate->_('Get Notification Emails'),
120                 'description'   => $translate->_('The level of actions you want to be notified about. Please note that organizers will get notifications for all updates including attendee answers unless this preference is set to "Never"'),
121             ),
122             self::SEND_NOTIFICATION_OF_OWN_ACTIONS => array(
123                 'label'         => $translate->_('Send Notifications Emails of own Actions'),
124                 'description'   => $translate->_('Get notifications emails for actions you did yourself'),
125             ),
126             self::DEFAULTALARM_ENABLED => array(
127                 'label'         => $translate->_('Enable Standard Alarm'),
128                 'description'   => $translate->_('New events get a standard alarm as defined below'),
129             ),
130             self::DEFAULTALARM_MINUTESBEFORE => array(
131                 'label'         => $translate->_('Standard Alarm Time'),
132                 'description'   => $translate->_('Minutes before the event starts'),
133             ),
134             self::DEFAULTATTENDEE_STRATEGY => array(
135                     'label'         => $translate->_('Default Attendee Strategy'),
136                     'description'   => $translate->_('Default Attendee Strategy for new events'),
137             ),
138         );
139         
140         return $prefDescriptions;
141     }
142     
143     /**
144      * Creates XML Data for a combobox
145      *
146      * Hours: 0 to 24
147      *
148      * @param string $default
149      * @return string
150      */
151     protected function _createTimespanDataXML($start=0, $end=24)
152     {
153         $doc = new DomDocument('1.0');
154         $options = $doc->createElement('options');
155         $doc->appendChild($options);
156         
157         $time = new Tinebase_DateTime('@0');
158         for ($i=$start; $i<=$end; $i++) {
159             $time->setHour($i);
160             $timeString = $time->format('H:i');
161             if ($i == $end && $timeString == '00:00') {
162                 $timeString = '24:00';
163             }
164             $value  = $doc->createElement('value');
165             $value->appendChild($doc->createTextNode($timeString));
166             $label  = $doc->createElement('label');
167             $label->appendChild($doc->createTextNode($timeString)); // @todo l10n
168             
169             $option = $doc->createElement('option');
170             $option->appendChild($value);
171             $option->appendChild($label);
172             $options->appendChild($option);
173         }
174         
175         return $doc->saveXML();
176     }
177
178     /**
179      * get preference defaults if no default is found in the database
180      *
181      * @param string $_preferenceName
182      * @param string|Tinebase_Model_User $_accountId
183      * @param string $_accountType
184      * @return Tinebase_Model_Preference
185      */
186     public function getApplicationPreferenceDefaults($_preferenceName, $_accountId = NULL, $_accountType = Tinebase_Acl_Rights::ACCOUNT_TYPE_USER)
187     {
188         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
189             . ' Get default value for ' . $_preferenceName . ' of account id '. $_accountId);
190         
191         $preference = $this->_getDefaultBasePreference($_preferenceName);
192         
193         switch ($_preferenceName) {
194             case self::DAYSVIEW_STARTTIME:
195                 $preference->value      = '08:00';
196                 $preference->options = $this->_createTimespanDataXML(0, 23);
197                 break;
198             case self::DAYSVIEW_ENDTIME:
199                 $preference->value      = '18:00';
200                 $preference->options = $this->_createTimespanDataXML(1, 24);
201                 break;
202             case self::DEFAULTCALENDAR:
203                 $this->_getDefaultContainerPreferenceDefaults($preference, $_accountId);
204                 break;
205             case self::DEFAULTPERSISTENTFILTER:
206                 $preference->value          = Tinebase_PersistentFilter::getPreferenceValues('Calendar', $_accountId, "All my events");
207                 break;
208             case self::NOTIFICATION_LEVEL:
209                 $translate = Tinebase_Translation::getTranslation($this->_application);
210                 // need to put the translations strings here because they were not found in the xml below :/
211                 // _('Never') _('On invitation and cancellation only') _('On time changes') _('On all updates but attendee responses') _('On attendee responses too')
212                 $preference->value      = Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_EVENT_RESCHEDULE;
213                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
214                     <options>
215                         <option>
216                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_NONE . '</value>
217                             <label>'. $translate->_('Never') . '</label>
218                         </option>
219                         <option>
220                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_INVITE_CANCEL . '</value>
221                             <label>'. $translate->_('On invitation and cancellation only') . '</label>
222                         </option>
223                         <option>
224                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_EVENT_RESCHEDULE . '</value>
225                             <label>'. $translate->_('On time changes') . '</label>
226                         </option>
227                         <option>
228                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_EVENT_UPDATE . '</value>
229                             <label>'. $translate->_('On all updates but attendee responses') . '</label>
230                         </option>
231                         <option>
232                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_ATTENDEE_STATUS_UPDATE . '</value>
233                             <label>'. $translate->_('On attendee responses too') . '</label>
234                         </option>
235                     </options>';
236                 break;
237             case self::SEND_NOTIFICATION_OF_OWN_ACTIONS:
238                 $preference->value      = 0;
239                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
240                     <options>
241                         <special>' . Tinebase_Preference_Abstract::YES_NO_OPTIONS . '</special>
242                     </options>';
243                 break;
244             case self::DEFAULTALARM_ENABLED:
245                 $preference->value      = 0;
246                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
247                     <options>
248                         <special>' . Tinebase_Preference_Abstract::YES_NO_OPTIONS . '</special>
249                     </options>';
250                 break;
251             case self::DEFAULTALARM_MINUTESBEFORE:
252                 $preference->value      = 15;
253                 $preference->options    = '';
254                 break;
255             case self::DEFAULTATTENDEE_STRATEGY:
256                 $preference->value      = 'me';
257                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
258                     <options>
259                         <option>
260                             <label>Me</label>
261                             <value>me</value>
262                         </option>
263                         <option>
264                             <label>Intelligent</label>
265                             <value>intelligent</value>
266                         </option>
267                         <option>
268                             <label>Calendar owner</label>
269                             <value>calendarOwner</value>
270                         </option>
271                         <option>
272                             <label>Filtered attendee</label>
273                             <value>filteredAttendee</value>
274                         </option>
275                     </options>';
276                 break;
277             default:
278                 throw new Tinebase_Exception_NotFound('Default preference with name ' . $_preferenceName . ' not found.');
279         }
280         
281         return $preference;
282     }
283 }