eefb37796aa69e22e24e37fc89f3b3e7ff1d7faa
[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-2010 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      * @var string application
62      */
63     protected $_application = 'Calendar';
64         
65     /**
66      * get all possible application prefs
67      *
68      * @return  array   all application prefs
69      */
70     public function getAllApplicationPreferences()
71     {
72         $allPrefs = array(
73             self::DAYSVIEW_STARTTIME,
74             self::DAYSVIEW_ENDTIME,
75             self::DEFAULTCALENDAR,
76             self::DEFAULTPERSISTENTFILTER,
77             self::NOTIFICATION_LEVEL,
78             self::SEND_NOTIFICATION_OF_OWN_ACTIONS,
79             self::DEFAULTALARM_ENABLED,
80             self::DEFAULTALARM_MINUTESBEFORE,
81         );
82             
83         return $allPrefs;
84     }
85     
86     /**
87      * get translated right descriptions
88      * 
89      * @return  array with translated descriptions for this applications preferences
90      */
91     public function getTranslatedPreferences()
92     {
93         $translate = Tinebase_Translation::getTranslation($this->_application);
94
95         $prefDescriptions = array(
96             self::DAYSVIEW_STARTTIME => array(
97                 'label'         => $translate->_('Start Time'),
98                 'description'   => $translate->_('Position on the left time axis, day and week view should start with'),
99             ),
100             self::DAYSVIEW_ENDTIME => array(
101                 'label'         => $translate->_('End Time'),
102                 'description'   => $translate->_('Position on the left time axis, day and week view should end with'),
103             ),
104             self::DEFAULTCALENDAR  => array(
105                 'label'         => $translate->_('Default Calendar'),
106                 'description'   => $translate->_('The default calendar for invitations and new events'),
107             ),
108             self::DEFAULTPERSISTENTFILTER  => array(
109                 'label'         => $translate->_('Default Favorite'),
110                 'description'   => $translate->_('The default favorite which is loaded on calendar startup'),
111             ),
112             self::NOTIFICATION_LEVEL => array(
113                 'label'         => $translate->_('Get Notification Emails'),
114                 '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"'),
115             ),
116             self::SEND_NOTIFICATION_OF_OWN_ACTIONS => array(
117                 'label'         => $translate->_('Send Notifications Emails of own Actions'),
118                 'description'   => $translate->_('Get notifications emails for actions you did yourself'),
119             ),
120             self::DEFAULTALARM_ENABLED => array(
121                 'label'         => $translate->_('Enable Standard Alarm'),
122                 'description'   => $translate->_('New events get a standard alarm as defined below'),
123             ),
124             self::DEFAULTALARM_MINUTESBEFORE => array(
125                 'label'         => $translate->_('Standard Alarm Time'),
126                 'description'   => $translate->_('Minutes before the event starts'),
127             ),
128         );
129         
130         return $prefDescriptions;
131     }
132     
133     /**
134      * Creates XML Data for a combobox
135      *
136      * Hours: 0 to 24
137      *
138      * @param string $default
139      * @return string
140      */
141     private function createTimespanDataXML($default)
142     {
143         $doc = new DomDocument('1.0');
144         $options = $doc->createElement('options');
145         $doc->appendChild($options);
146         
147         $time = new Tinebase_DateTime('@0');
148         for ($i=0; $i<48; $i++) {
149             $time->addMinute($i ? 30 : 0);
150             $timeString = $time->format('H:i');
151             
152             $value  = $doc->createElement('value');
153             $value->appendChild($doc->createTextNode($timeString));
154             $label  = $doc->createElement('label');
155             $label->appendChild($doc->createTextNode($timeString)); // @todo l10n
156             
157             $option = $doc->createElement('option');
158             $option->appendChild($value);
159             $option->appendChild($label);
160             $options->appendChild($option);
161         }
162         
163         return $doc->saveXML();
164     }
165
166     /**
167      * get preference defaults if no default is found in the database
168      *
169      * @param string $_preferenceName
170      * @param string|Tinebase_Model_User $_accountId
171      * @param string $_accountType
172      * @return Tinebase_Model_Preference
173      */
174     public function getApplicationPreferenceDefaults($_preferenceName, $_accountId = NULL, $_accountType = Tinebase_Acl_Rights::ACCOUNT_TYPE_USER)
175     {
176         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ 
177             . ' Get default value for ' . $_preferenceName . ' of account id '. $_accountId);
178         
179         $preference = $this->_getDefaultBasePreference($_preferenceName);
180         
181         switch ($_preferenceName) {
182             case self::DAYSVIEW_STARTTIME:
183                 $preference->value      = '08:00';
184                 $preference->options = $this->createTimespanDataXML($preference->value);
185                 break;
186             case self::DAYSVIEW_ENDTIME:
187                 $preference->value      = '18:00';
188                 $preference->options = $this->createTimespanDataXML($preference->value);
189                 break;
190             case self::DEFAULTCALENDAR:
191                 $this->_getDefaultContainerPreferenceDefaults($preference, $_accountId);
192                 break;
193             case self::DEFAULTPERSISTENTFILTER:
194                 $preference->value          = Tinebase_PersistentFilter::getPreferenceValues('Calendar', $_accountId, "All my events");
195                 break;
196             case self::NOTIFICATION_LEVEL:
197                 $translate = Tinebase_Translation::getTranslation($this->_application);
198                 // need to put the translations strings here because they were not found in the xml below :/
199                 // _('Never') _('On invitation and cancellation only') _('On time changes') _('On all updates but attendee responses') _('On attendee responses too')
200                 $preference->value      = Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_EVENT_RESCHEDULE;
201                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
202                     <options>
203                         <option>
204                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_NONE . '</value>
205                             <label>'. $translate->_('Never') . '</label>
206                         </option>
207                         <option>
208                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_INVITE_CANCEL . '</value>
209                             <label>'. $translate->_('On invitation and cancellation only') . '</label>
210                         </option>
211                         <option>
212                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_EVENT_RESCHEDULE . '</value>
213                             <label>'. $translate->_('On time changes') . '</label>
214                         </option>
215                         <option>
216                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_EVENT_UPDATE . '</value>
217                             <label>'. $translate->_('On all updates but attendee responses') . '</label>
218                         </option>
219                         <option>
220                             <value>'. Calendar_Controller_EventNotifications::NOTIFICATION_LEVEL_ATTENDEE_STATUS_UPDATE . '</value>
221                             <label>'. $translate->_('On attendee responses too') . '</label>
222                         </option>
223                     </options>';
224                 break;
225             case self::SEND_NOTIFICATION_OF_OWN_ACTIONS:
226                 $preference->value      = 0;
227                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
228                     <options>
229                         <special>' . Tinebase_Preference_Abstract::YES_NO_OPTIONS . '</special>
230                     </options>';
231                 break;
232             case self::DEFAULTALARM_ENABLED:
233                 $preference->value      = 0;
234                 $preference->options    = '<?xml version="1.0" encoding="UTF-8"?>
235                     <options>
236                         <special>' . Tinebase_Preference_Abstract::YES_NO_OPTIONS . '</special>
237                     </options>';
238                 break;
239             case self::DEFAULTALARM_MINUTESBEFORE:
240                 $preference->value      = 15;
241                 $preference->options    = '';
242                 break;
243             default:
244                 throw new Tinebase_Exception_NotFound('Default preference with name ' . $_preferenceName . ' not found.');
245         }
246         
247         return $preference;
248     }
249 }